From 7fb0f9b6e8da4b8e7362704fa6640d820a5a191b Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 26 Apr 2025 07:02:31 +0200 Subject: [PATCH 01/91] Feature/refactor import service (#4599) * Refactoring --- apps/api/src/app/import/import.service.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index babe7c3e3..b6fe0d949 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -167,9 +167,9 @@ export class ImportService { for (const account of accountsDto) { // Check if there is any existing account with the same ID - const accountWithSameId = existingAccounts.find( - (existingAccount) => existingAccount.id === account.id - ); + const accountWithSameId = existingAccounts.find((existingAccount) => { + return existingAccount.id === account.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) { From e86801dfe9e53f0c3a036e1ab3b429b0f3bcc9a7 Mon Sep 17 00:00:00 2001 From: Vinodh Zamboulingame <48854069+vzamboulingame@users.noreply.github.com> Date: Sat, 26 Apr 2025 17:36:49 +0200 Subject: [PATCH 02/91] Feature/improve language localization for FR 20250426 (#4603) * Improve french translation * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.fr.xlf | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 328d7749e..a7f152eb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the error message of the currency code validation - Tightened the currency code validation by requiring uppercase letters +- Improved the language localization for Français (`fr`) ### Fixed diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 78893b590..c788e87e1 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -7883,7 +7883,7 @@ with API access for - with API access for + avec accès API pour apps/client/src/app/pages/pricing/pricing-page.html 266 @@ -7891,7 +7891,7 @@ Gather Recent Historical Market Data - Gather Recent Historical Market Data + Collecter les données récentes du marché historique apps/client/src/app/components/admin-market-data/admin-market-data.html 225 @@ -7899,7 +7899,7 @@ Gather All Historical Market Data - Gather All Historical Market Data + Collecter toutes les données du marché historique apps/client/src/app/components/admin-market-data/admin-market-data.html 230 @@ -7907,7 +7907,7 @@ Gather Historical Market Data - Gather Historical Market Data + Collecter les données du marché historique apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 29 @@ -7915,7 +7915,7 @@ Data Gathering is off - Data Gathering is off + La collecte de données est désactivée apps/client/src/app/components/admin-market-data/admin-market-data.html 38 @@ -7923,7 +7923,7 @@ Performance Calculation - Performance Calculation + Calcul de performance apps/client/src/app/components/user-account-settings/user-account-settings.html 31 From d2452791ccab552474bb4d9f224660074868b265 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 26 Apr 2025 21:47:03 +0200 Subject: [PATCH 03/91] Feature/update create watchlist item permission (#4608) * Remove createWatchlistItem permission --- apps/api/src/app/user/user.service.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index b6b31dada..d9e419812 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -380,6 +380,7 @@ export class UserService { permissions.createAccess, permissions.createMarketDataOfOwnAssetProfile, permissions.createOwnTag, + permissions.createWatchlistItem, permissions.readAiPrompt, permissions.readMarketDataOfOwnAssetProfile, permissions.updateMarketDataOfOwnAssetProfile From 68fb5c8b660cecc428b9ab4c60e2edd877a24718 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 26 Apr 2025 21:47:31 +0200 Subject: [PATCH 04/91] Feature/upgrade Nx to version 20.8.1 (#4601) * Upgrade Nx to version 20.8.1 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 747 ++++++++++++++++++++++++++++------------------ package.json | 24 +- 3 files changed, 469 insertions(+), 303 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7f152eb8..5e3e68430 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the error message of the currency code validation - Tightened the currency code validation by requiring uppercase letters - Improved the language localization for Français (`fr`) +- Upgraded `Nx` from version `20.8.0` to `20.8.1` ### Fixed diff --git a/package-lock.json b/package-lock.json index a45d5d875..4dfb2eb53 100644 --- a/package-lock.json +++ b/package-lock.json @@ -109,17 +109,17 @@ "@eslint/js": "9.24.0", "@nestjs/schematics": "10.2.3", "@nestjs/testing": "10.4.15", - "@nx/angular": "20.8.0", - "@nx/cypress": "20.8.0", - "@nx/eslint-plugin": "20.8.0", - "@nx/jest": "20.8.0", - "@nx/js": "20.8.0", - "@nx/module-federation": "20.8.0", - "@nx/nest": "20.8.0", - "@nx/node": "20.8.0", - "@nx/storybook": "20.8.0", - "@nx/web": "20.8.0", - "@nx/workspace": "20.8.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", "@schematics/angular": "19.2.1", "@storybook/addon-essentials": "8.6.12", "@storybook/addon-interactions": "8.6.12", @@ -147,7 +147,7 @@ "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", "jest-preset-angular": "14.4.2", - "nx": "20.8.0", + "nx": "20.8.1", "prettier": "3.5.3", "prettier-plugin-organize-attributes": "1.0.0", "prisma": "6.6.0", @@ -3202,20 +3202,20 @@ } }, "node_modules/@emnapi/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.1.tgz", - "integrity": "sha512-4JFstCTaToCFrPqrGzgkF8N2NHjtsaY4uRh6brZQ5L9e4wbMieX8oDT8N7qfVFTQecHFEtkj4ve49VIZ3mKVqw==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", + "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", "dev": true, "license": "MIT", "dependencies": { - "@emnapi/wasi-threads": "1.0.1", + "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.1.tgz", - "integrity": "sha512-LMshMVP0ZhACNjQNYXiU1iZJ6QCcv0lUdPDPugqGvCGXt5xtRVBPdtA0qU12pEXZzpWAhWlZYptfdAFq10DOVQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3223,9 +3223,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", - "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", + "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", "dev": true, "license": "MIT", "dependencies": { @@ -5578,15 +5578,15 @@ } }, "node_modules/@module-federation/cli": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.11.4.tgz", - "integrity": "sha512-ARl++lw29Ne12P2WFNRpD4dwnZW0aodMDay3/tTOE9Nx4BdBVfHf5HyCZIph589STy+dIy/ih/ebHbue1glL3Q==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.13.0.tgz", + "integrity": "sha512-5n7fjeTNq0O+0M4j1Behp/kfNqTpmib0CwcETNov3Bw7J4ohiyrGS76CRB0OrkE7WlE6psFlyCPAiPI9YsDldg==", "dev": true, "license": "MIT", "dependencies": { "@modern-js/node-bundle-require": "2.65.1", - "@module-federation/dts-plugin": "0.11.4", - "@module-federation/sdk": "0.11.4", + "@module-federation/dts-plugin": "0.13.0", + "@module-federation/sdk": "0.13.0", "chalk": "3.0.0", "commander": "11.1.0" }, @@ -5598,23 +5598,23 @@ } }, "node_modules/@module-federation/cli/node_modules/@module-federation/dts-plugin": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.11.4.tgz", - "integrity": "sha512-QkHbW/ZOyqNI2Oz7ZqAAiTWc3vTejoimS3nfRy947rvX3xaFEavmgJNJLBEJntos2eAF3gw5TCEuKL08zVI7BQ==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.11.4", - "@module-federation/managers": "0.11.4", - "@module-federation/sdk": "0.11.4", - "@module-federation/third-party-dts-extractor": "0.11.4", + "@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", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", "axios": "^1.8.2", "chalk": "3.0.0", "fs-extra": "9.1.0", "isomorphic-ws": "5.0.0", - "koa": "2.15.4", + "koa": "2.16.1", "lodash.clonedeepwith": "4.5.0", "log4js": "6.9.1", "node-schedule": "2.1.1", @@ -5632,35 +5632,35 @@ } }, "node_modules/@module-federation/cli/node_modules/@module-federation/error-codes": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.11.4.tgz", - "integrity": "sha512-WugZdcNbNVTKuxuArGfnRW1R+siNgMBhad451HniyCG+SjlS0HEO9zIDuVP12l3xJsiTHgLqyutYEvunQ5O1aQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.13.0.tgz", + "integrity": "sha512-4soAMLr7qcVWuvCsyRmBbiBfuhxmnDeyl+qzjMx8VurQgL+XQDQJapM9RXngNGT4g8FoCq9o7rM5YWNgFFNUiw==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/cli/node_modules/@module-federation/managers": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.11.4.tgz", - "integrity": "sha512-BCoIKCo7QBvqBgwXjMUPlUKYIPXieHDvQhXp24oQIQk4WhEcaMw3BByTPKOje9V6GKZqkmzQwO00e3Ca2lnHxQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.13.0.tgz", + "integrity": "sha512-dpfRjIE4UR4QRP20rENQJs9HfnuWzzsA9W6Eu+r+G+obZnzNIxbONUzg5bCMmhbDsR3krxU6LRrwU1zXnA6bxw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.11.4", + "@module-federation/sdk": "0.13.0", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/cli/node_modules/@module-federation/sdk": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.11.4.tgz", - "integrity": "sha512-23Poajva/+wye8+66NvEiL/dJDUahOjEgxljLvzmxQXi9x5hdrfJvBDIwLtzyewZ+vA5Nzpwz35sSzEOyPJUqg==", + "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/cli/node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.11.4.tgz", - "integrity": "sha512-hgqi7K1BTBAxW2NAqguwFvQfbQrEAHfb7CBwx+w9jKm77koKrS3+uHoAHD1mh34eWnkK2kVBktcbBPoxA0df3Q==", + "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==", "dev": true, "license": "MIT", "dependencies": { @@ -5693,6 +5693,78 @@ "node": ">=16" } }, + "node_modules/@module-federation/cli/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@module-federation/cli/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@module-federation/cli/node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@module-federation/cli/node_modules/koa": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.1.tgz", + "integrity": "sha512-umfX9d3iuSxTQP4pnzLOz0HKnPg0FaUUIKcye2lOiz3KPu1Y3M3xlz76dISdFPQs37P9eJz1wUpcTS6KDPn9fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.9.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, "node_modules/@module-federation/cli/node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -5711,6 +5783,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/@module-federation/cli/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/@module-federation/data-prefetch": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.9.1.tgz", @@ -5870,16 +5952,16 @@ } }, "node_modules/@module-federation/node": { - "version": "2.6.33", - "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.6.33.tgz", - "integrity": "sha512-wuoh3bQ95aBzEXkRHOvuDd1kd5RPAck84SUYRnN+xsJAYe3syGtY2zUx6/XPYhEjCvBDVNVv2jznn4qILSerNQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.1.tgz", + "integrity": "sha512-CKFoCq0R6k01Wt+qfWqWnF7XSHNDdIq4reVGvx1/TtAcv3U1opfI1Fgn2zWci9b8E0xQKteCVD5lI3Ws3dJt6w==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/enhanced": "0.11.4", - "@module-federation/runtime": "0.11.4", - "@module-federation/sdk": "0.11.4", - "@module-federation/utilities": "3.1.51", + "@module-federation/enhanced": "0.13.0", + "@module-federation/runtime": "0.13.0", + "@module-federation/sdk": "0.13.0", + "@module-federation/utilities": "3.1.53", "btoa": "1.2.1", "encoding": "^0.1.13", "node-fetch": "2.7.0" @@ -5902,26 +5984,26 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.11.4.tgz", - "integrity": "sha512-oagMRwPuMBOJ+0fggNlwgp/5LxxKyWmXBjfJmJGlJQtADxcWp3odlGXTZuAxDO2sh0S8toDnJFNt5bqruSszwg==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.11.4", + "@module-federation/sdk": "0.13.0", "@types/semver": "7.5.8", "semver": "7.6.3" } }, "node_modules/@module-federation/node/node_modules/@module-federation/data-prefetch": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.11.4.tgz", - "integrity": "sha512-wRUJ8E4QJBwMp/vejH5M1rR0EbuxrwQyHUHW0Ec5C5NQludqDbXJVf+f01fdPnJI+hVt5hL4GPltZwwuUWzdIw==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.13.0.tgz", + "integrity": "sha512-mimi7eqKySOmKrXDCo3Lk4KZq1i0PZDwSmP9Es5RWK8senaCRu10WwFLhAVJ/yIH2Wt7HFy23ZyYNukrLikedQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.11.4", - "@module-federation/sdk": "0.11.4", + "@module-federation/runtime": "0.13.0", + "@module-federation/sdk": "0.13.0", "fs-extra": "9.1.0" }, "peerDependencies": { @@ -5930,23 +6012,23 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/dts-plugin": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.11.4.tgz", - "integrity": "sha512-QkHbW/ZOyqNI2Oz7ZqAAiTWc3vTejoimS3nfRy947rvX3xaFEavmgJNJLBEJntos2eAF3gw5TCEuKL08zVI7BQ==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.11.4", - "@module-federation/managers": "0.11.4", - "@module-federation/sdk": "0.11.4", - "@module-federation/third-party-dts-extractor": "0.11.4", + "@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", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", "axios": "^1.8.2", "chalk": "3.0.0", "fs-extra": "9.1.0", "isomorphic-ws": "5.0.0", - "koa": "2.15.4", + "koa": "2.16.1", "lodash.clonedeepwith": "4.5.0", "log4js": "6.9.1", "node-schedule": "2.1.1", @@ -5964,24 +6046,25 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/enhanced": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.11.4.tgz", - "integrity": "sha512-WFmJsTMUSdXxNEBPhvVJRszFecHPnTbNg/LhwT1i631v7AqzLE8R/lE/CsAoMaxuuPtQqEmZgU9wwjRLW80DfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.11.4", - "@module-federation/cli": "0.11.4", - "@module-federation/data-prefetch": "0.11.4", - "@module-federation/dts-plugin": "0.11.4", - "@module-federation/error-codes": "0.11.4", - "@module-federation/inject-external-runtime-core-plugin": "0.11.4", - "@module-federation/managers": "0.11.4", - "@module-federation/manifest": "0.11.4", - "@module-federation/rspack": "0.11.4", - "@module-federation/runtime-tools": "0.11.4", - "@module-federation/sdk": "0.11.4", + "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", "btoa": "^1.2.1", + "schema-utils": "^4.3.0", "upath": "2.0.1" }, "bin": { @@ -6005,62 +6088,62 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/error-codes": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.11.4.tgz", - "integrity": "sha512-WugZdcNbNVTKuxuArGfnRW1R+siNgMBhad451HniyCG+SjlS0HEO9zIDuVP12l3xJsiTHgLqyutYEvunQ5O1aQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.13.0.tgz", + "integrity": "sha512-4soAMLr7qcVWuvCsyRmBbiBfuhxmnDeyl+qzjMx8VurQgL+XQDQJapM9RXngNGT4g8FoCq9o7rM5YWNgFFNUiw==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/node/node_modules/@module-federation/inject-external-runtime-core-plugin": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.11.4.tgz", - "integrity": "sha512-VHPD8NpAZ9m+EgvojX/1+CDp0eR4Jx/SbWsCVJm1qijh9BU5JSrVnRe+pVJPHHkNfkN70mzqWRexr4oC7qMC4Q==", + "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==", "dev": true, "license": "MIT", "peerDependencies": { - "@module-federation/runtime-tools": "0.11.4" + "@module-federation/runtime-tools": "0.13.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/managers": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.11.4.tgz", - "integrity": "sha512-BCoIKCo7QBvqBgwXjMUPlUKYIPXieHDvQhXp24oQIQk4WhEcaMw3BByTPKOje9V6GKZqkmzQwO00e3Ca2lnHxQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.13.0.tgz", + "integrity": "sha512-dpfRjIE4UR4QRP20rENQJs9HfnuWzzsA9W6Eu+r+G+obZnzNIxbONUzg5bCMmhbDsR3krxU6LRrwU1zXnA6bxw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.11.4", + "@module-federation/sdk": "0.13.0", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/manifest": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.11.4.tgz", - "integrity": "sha512-5dLyQNezlSfZeWtpDcKs6TnSr7JaJXcLggFAk0WhFan4WXdi+aEQtDMVCBdbdQ3hpEq3OYz9T1Ez4q6CVimZZA==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.13.0.tgz", + "integrity": "sha512-YHJW4qavvfqfpUusz+BlT9snPmbXmiiS5bO5nReFPjfWXT3/9xFA1TvcwpRc+EXNDNKnf5bPF5E/rsaGxSlp7A==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/dts-plugin": "0.11.4", - "@module-federation/managers": "0.11.4", - "@module-federation/sdk": "0.11.4", + "@module-federation/dts-plugin": "0.13.0", + "@module-federation/managers": "0.13.0", + "@module-federation/sdk": "0.13.0", "chalk": "3.0.0", "find-pkg": "2.0.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/rspack": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.11.4.tgz", - "integrity": "sha512-NbNPvzbnlSoNf2BsRywX6jnKLCzMA7cHGqn7m9+xyCjLrUVt3+AAUhxSW4+HdiHgfm/T2e4G1By9OtwVdX0L1Q==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.13.0.tgz", + "integrity": "sha512-hb60x8EdiOXfzJGQLlbv1MDJVjEpQ3ppH0ONIra8CAkGRPGjB+eTwg9nLB6wkcI3xdMjgax509DwbSG+BDmCqw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.11.4", - "@module-federation/dts-plugin": "0.11.4", - "@module-federation/inject-external-runtime-core-plugin": "0.11.4", - "@module-federation/managers": "0.11.4", - "@module-federation/manifest": "0.11.4", - "@module-federation/runtime-tools": "0.11.4", - "@module-federation/sdk": "0.11.4", + "@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", "btoa": "1.2.1" }, "peerDependencies": { @@ -6078,50 +6161,50 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.11.4.tgz", - "integrity": "sha512-pUfhsa3iYoXBV3CsUfBJN04Cvckj9gBbs8+sLsYiWxxU+cJYNiJpco0iKxRX1/60O+RAH8fAaNq5ilz2qc204A==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.11.4", - "@module-federation/runtime-core": "0.11.4", - "@module-federation/sdk": "0.11.4" + "@module-federation/error-codes": "0.13.0", + "@module-federation/runtime-core": "0.13.0", + "@module-federation/sdk": "0.13.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime-core": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.11.4.tgz", - "integrity": "sha512-+n2fWUPj6cCeHXmChZ35RFyNONfBEcNgQ3o7KEmxOBJ6bRh1vr3AO2OPRPYr5WHcvAyjny+l/xhi+sZPNV3uOQ==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.11.4", - "@module-federation/sdk": "0.11.4" + "@module-federation/error-codes": "0.13.0", + "@module-federation/sdk": "0.13.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime-tools": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.11.4.tgz", - "integrity": "sha512-rNtaY1Eo9PJ9kn6Z9wp+OsPOA6dbJa4zyDVC1Bo+dnKkjoJ+YwGYpBw88vb0btwCtc5gJkK14ZvnYtDyPVrPWQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.13.0.tgz", + "integrity": "sha512-6ECWX18yGrQKcmkrQoNPd5VEpxZP1SMaB/Bp55xlpEhsrpn4zHnriQluxDw6xldjSOLl1qbokfxwCwjS2OaEbg==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.11.4", - "@module-federation/webpack-bundler-runtime": "0.11.4" + "@module-federation/runtime": "0.13.0", + "@module-federation/webpack-bundler-runtime": "0.13.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/sdk": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.11.4.tgz", - "integrity": "sha512-23Poajva/+wye8+66NvEiL/dJDUahOjEgxljLvzmxQXi9x5hdrfJvBDIwLtzyewZ+vA5Nzpwz35sSzEOyPJUqg==", + "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/node/node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.11.4.tgz", - "integrity": "sha512-hgqi7K1BTBAxW2NAqguwFvQfbQrEAHfb7CBwx+w9jKm77koKrS3+uHoAHD1mh34eWnkK2kVBktcbBPoxA0df3Q==", + "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==", "dev": true, "license": "MIT", "dependencies": { @@ -6131,14 +6214,14 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.11.4.tgz", - "integrity": "sha512-lhY0RGkirPTC5AIdXjyCe4uNYtKQA7A2Oo08sa0XIAhzZUeBzVIAes1jWGS3nvPV5/SZ+ldzoMmTvlrEpgz5vQ==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.11.4", - "@module-federation/sdk": "0.11.4" + "@module-federation/runtime": "0.13.0", + "@module-federation/sdk": "0.13.0" } }, "node_modules/@module-federation/node/node_modules/chalk": { @@ -6155,6 +6238,78 @@ "node": ">=8" } }, + "node_modules/@module-federation/node/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@module-federation/node/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@module-federation/node/node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@module-federation/node/node_modules/koa": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.1.tgz", + "integrity": "sha512-umfX9d3iuSxTQP4pnzLOz0HKnPg0FaUUIKcye2lOiz3KPu1Y3M3xlz76dISdFPQs37P9eJz1wUpcTS6KDPn9fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.9.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, "node_modules/@module-federation/node/node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -6186,6 +6341,16 @@ "node": ">=10" } }, + "node_modules/@module-federation/node/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/@module-federation/rspack": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.9.1.tgz", @@ -6287,13 +6452,13 @@ } }, "node_modules/@module-federation/utilities": { - "version": "3.1.51", - "resolved": "https://registry.npmjs.org/@module-federation/utilities/-/utilities-3.1.51.tgz", - "integrity": "sha512-TccjlRDiNMg/VsAoiUqvqvzKkAsFwj3mtbjnbZ+fLvlmr1BhouzYIjyBFxvSZBrXdEKkzLKDKGRABWF8D79AOg==", + "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.11.4" + "@module-federation/sdk": "0.13.0" }, "peerDependencies": { "react": "^16 || ^17 || ^18", @@ -6313,9 +6478,9 @@ } }, "node_modules/@module-federation/utilities/node_modules/@module-federation/sdk": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.11.4.tgz", - "integrity": "sha512-23Poajva/+wye8+66NvEiL/dJDUahOjEgxljLvzmxQXi9x5hdrfJvBDIwLtzyewZ+vA5Nzpwz35sSzEOyPJUqg==", + "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" }, @@ -7546,20 +7711,20 @@ } }, "node_modules/@nx/angular": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-20.8.0.tgz", - "integrity": "sha512-v69G+3v+ZdwN/d0cBNqwx+QTa0WH+2hvLL7QAfE1g3gpUjVFCzwuvPmsrMq67OC5MGhaWknNUL0jN+pCKekhIA==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-20.8.1.tgz", + "integrity": "sha512-BT6kc2CMwC1RpzdJdl1jbaZa7yCp5sN4BCHj8w+MOCnX6630EcrN6lCi+u5xSVvY2DmemP5I1ZHybSYkYilLLg==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.0", - "@nx/eslint": "20.8.0", - "@nx/js": "20.8.0", - "@nx/module-federation": "20.8.0", - "@nx/rspack": "20.8.0", - "@nx/web": "20.8.0", - "@nx/webpack": "20.8.0", - "@nx/workspace": "20.8.0", + "@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", "@phenomnomnominal/tsquery": "~5.0.1", "@typescript-eslint/type-utils": "^8.0.0", "enquirer": "~2.3.6", @@ -7595,15 +7760,15 @@ } }, "node_modules/@nx/cypress": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-20.8.0.tgz", - "integrity": "sha512-tiS9R3X//9ZVeNU9d5uV5voDmrp0Sh+B25EuZoeFtah7RNgQcnNXqc488dmCYhCK5Tl58K44eDNyyXvIwOlyCw==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-20.8.1.tgz", + "integrity": "sha512-eVPBZ4R0qgkRxaKPg46OXhA/xQdgVO4zjKoRjKkNX7dDRmq8o2xXHBoU+ZnuNITeFV1fmJ9Cr1qpGMWrHXb2Ew==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.0", - "@nx/eslint": "20.8.0", - "@nx/js": "20.8.0", + "@nx/devkit": "20.8.1", + "@nx/eslint": "20.8.1", + "@nx/js": "20.8.1", "@phenomnomnominal/tsquery": "~5.0.1", "detect-port": "^1.5.1", "semver": "^7.6.3", @@ -7619,9 +7784,9 @@ } }, "node_modules/@nx/devkit": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.8.0.tgz", - "integrity": "sha512-0616zW0Krwb5frNZ7C0HUItonCDiAHY9UYSTyJm6hnal0Xc6XkJuEAFNjbx2sEOopO85CEAMNeYEHkRyWsSxCQ==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.8.1.tgz", + "integrity": "sha512-N3nwIg/7RIZeB76iuVo29q+l9WyTtvuBSgDFM2msiIK6Q928ilzoeNPZ/p7w/TE3Gqs5XVhq9ExMvDAOTxdmXA==", "dev": true, "license": "MIT", "dependencies": { @@ -7665,14 +7830,14 @@ } }, "node_modules/@nx/eslint": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-20.8.0.tgz", - "integrity": "sha512-FPpw/RHgg08gkhntf/d7xh8GtNKOjTzLrwh7/YUO5UTi26lCjglM0nsFJJEQS988STElgjBEeDh78wcMuXeQ7g==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-20.8.1.tgz", + "integrity": "sha512-eIfNZ4bGdCKAeq7c8dhJ31wW3D422UJaAGl3hT3mJoxW2qbaKDZhgUr5EJqiMAO78vycpnYaLrN1KPEKeFrQZg==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.0", - "@nx/js": "20.8.0", + "@nx/devkit": "20.8.1", + "@nx/js": "20.8.1", "semver": "^7.5.3", "tslib": "^2.3.0", "typescript": "~5.7.2" @@ -7688,14 +7853,14 @@ } }, "node_modules/@nx/eslint-plugin": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-20.8.0.tgz", - "integrity": "sha512-qcwvSI8MKdEinJ0XX01SIlVkTo2+Vi2ZvDbGccIdrej287hjaipphTvfesPnvnb7TSGZf0JG64P/yukmSFLxEw==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.0", - "@nx/js": "20.8.0", + "@nx/devkit": "20.8.1", + "@nx/js": "20.8.1", "@typescript-eslint/type-utils": "^8.0.0", "@typescript-eslint/utils": "^8.0.0", "chalk": "^4.1.0", @@ -7729,16 +7894,16 @@ } }, "node_modules/@nx/jest": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-20.8.0.tgz", - "integrity": "sha512-Nrch28OhUnofnIrT+V5+uHWdNVFDHc0G9yF83dPLMipne8NJ9731xxAglL9H7lw73AMTeHaxin2I4UE0Vf1/HA==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-20.8.1.tgz", + "integrity": "sha512-Cx2cOOWprB2HiggCRg72vl3/evg2fcoANShhnrb+VCTJLHcq87hkwdrAcHwlbENpXwTd4bjlqYJdP1HobdH3FA==", "dev": true, "license": "MIT", "dependencies": { "@jest/reporters": "^29.4.1", "@jest/test-result": "^29.4.1", - "@nx/devkit": "20.8.0", - "@nx/js": "20.8.0", + "@nx/devkit": "20.8.1", + "@nx/js": "20.8.1", "@phenomnomnominal/tsquery": "~5.0.1", "identity-obj-proxy": "3.0.0", "jest-config": "^29.4.1", @@ -7779,9 +7944,9 @@ } }, "node_modules/@nx/js": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.8.0.tgz", - "integrity": "sha512-JqQ94l0njkoCCIeqRzFsajMoSV5WodfGGG3giipBe9+cmqsMCZJxh7DiSTGCZ2vnUo3zoX8hodumlk8r+HtMZQ==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.8.1.tgz", + "integrity": "sha512-D3T84PuZggEdraS41S2Frzef2FhebWAHzXcs0IE1ZLInUtwek5P5aTN2d3i/JwYB3mcOyvx8XN3HVADap4KRpg==", "dev": true, "license": "MIT", "dependencies": { @@ -7792,8 +7957,8 @@ "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.22.5", "@babel/runtime": "^7.22.6", - "@nx/devkit": "20.8.0", - "@nx/workspace": "20.8.0", + "@nx/devkit": "20.8.1", + "@nx/workspace": "20.8.1", "@zkochan/js-yaml": "0.0.7", "babel-plugin-const-enum": "^1.0.1", "babel-plugin-macros": "^3.1.0", @@ -7966,18 +8131,18 @@ } }, "node_modules/@nx/module-federation": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-20.8.0.tgz", - "integrity": "sha512-dybk1+2svR+mV3V/d4F9ZUMHhE0q7t1Go8qHC98sRVrRX0xQMDt51s5WETJlBbN230euKfcYBkPNL+l5AdIlLg==", + "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==", "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.0", - "@nx/js": "20.8.0", - "@nx/web": "20.8.0", + "@nx/devkit": "20.8.1", + "@nx/js": "20.8.1", + "@nx/web": "20.8.1", "@rspack/core": "^1.1.5", "express": "^4.21.2", "http-proxy-middleware": "^3.0.3", @@ -7987,17 +8152,17 @@ } }, "node_modules/@nx/nest": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-20.8.0.tgz", - "integrity": "sha512-24XTwHlb/Ur+AHRAabsUHgC0cjOIQrz4Ec4IArv0y66nq+8MjTTJYWMmUMHCiYojyoL+W7EshTyViBedFPOJCg==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-20.8.1.tgz", + "integrity": "sha512-B7DBXrIXw/NBqhLltZpZ6An3P/W3x61aw/fZgvugkwLwZx3rlX+XnWCmyNx37U2jna0tYaUkf6tnzebiQOtbMQ==", "dev": true, "license": "MIT", "dependencies": { "@nestjs/schematics": "^9.1.0", - "@nx/devkit": "20.8.0", - "@nx/eslint": "20.8.0", - "@nx/js": "20.8.0", - "@nx/node": "20.8.0", + "@nx/devkit": "20.8.1", + "@nx/eslint": "20.8.1", + "@nx/js": "20.8.1", + "@nx/node": "20.8.1", "tslib": "^2.3.0" } }, @@ -8191,23 +8356,23 @@ } }, "node_modules/@nx/node": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/node/-/node-20.8.0.tgz", - "integrity": "sha512-lvywGoWAx2yV7Y4QHzl1petGumUrGvpk9pZYW+xaXPi3Arv5thMeycZCC2Oj28kws5Kf9wbaq90jyu4JSI3xgA==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/node/-/node-20.8.1.tgz", + "integrity": "sha512-ffZ8ePEWj2g2OTZWalX1xZBgvTHhoirs5NEkcYxgUya3/DohG4Css3FV9gzVFfKkQdP++bUMkG8GJ2LrtqzUxA==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.0", - "@nx/eslint": "20.8.0", - "@nx/jest": "20.8.0", - "@nx/js": "20.8.0", + "@nx/devkit": "20.8.1", + "@nx/eslint": "20.8.1", + "@nx/jest": "20.8.1", + "@nx/js": "20.8.1", "tslib": "^2.3.0" } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.8.0.tgz", - "integrity": "sha512-A6Te2KlINtcOo/depXJzPyjbk9E0cmgbom/sm/49XdQ8G94aDfyIIY1RIdwmDCK5NVd74KFG3JIByTk5+VnAhA==", + "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==", "cpu": [ "arm64" ], @@ -8222,9 +8387,9 @@ } }, "node_modules/@nx/nx-darwin-x64": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.8.0.tgz", - "integrity": "sha512-UpqayUjgalArXaDvOoshqSelTrEp42cGDsZGy0sqpxwBpm3oPQ8wE1d7oBAmRo208rAxOuFP0LZRFUqRrwGvLA==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.8.1.tgz", + "integrity": "sha512-TB9mZk7neGFKgBr2wSBgY6c4kFF9vvChNSp3TrEeXR3FppFcYG5eK4AaKfzWCpYb0wMtseAm7NMX1Lu74utClQ==", "cpu": [ "x64" ], @@ -8239,9 +8404,9 @@ } }, "node_modules/@nx/nx-freebsd-x64": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.8.0.tgz", - "integrity": "sha512-dUR2fsLyKZYMHByvjy2zvmdMbsdXAiP+6uTlIAuu8eHMZ2FPQCAtt7lPYLwOFUxUXChbek2AJ+uCI0gRAgK/eg==", + "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==", "cpu": [ "x64" ], @@ -8256,9 +8421,9 @@ } }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.8.0.tgz", - "integrity": "sha512-GuZ7t0SzSX5ksLYva7koKZovQ5h/Kr1pFbOsQcBf3VLREBqFPSz6t7CVYpsIsMhiu/I3EKq6FZI3wDOJbee5uw==", + "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==", "cpu": [ "arm" ], @@ -8273,9 +8438,9 @@ } }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.8.0.tgz", - "integrity": "sha512-CiI955Q+XZmBBZ7cQqQg0MhGEFwZIgSpJnjPfWBt3iOYP8aE6nZpNOkmD7O8XcN/nEwwyeCOF8euXqEStwsk8w==", + "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==", "cpu": [ "arm64" ], @@ -8290,9 +8455,9 @@ } }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.8.0.tgz", - "integrity": "sha512-Iy9DpvVisxsfNh4gOinmMQ4cLWdBlgvt1wmry1UwvcXg479p1oJQ1Kp1wksUZoWYqrAG8VPZUmkE0f7gjyHTGg==", + "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==", "cpu": [ "arm64" ], @@ -8307,9 +8472,9 @@ } }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.8.0.tgz", - "integrity": "sha512-kZrrXXzVSbqwmdTmQ9xL4Jhi0/FSLrePSxYCL9oOM3Rsj0lmo/aC9kz4NBv1ZzuqT7fumpBOnhqiL1QyhOWOeQ==", + "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==", "cpu": [ "x64" ], @@ -8324,9 +8489,9 @@ } }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.8.0.tgz", - "integrity": "sha512-0l9jEMN8NhULKYCFiDF7QVpMMNG40duya+OF8dH0OzFj52N0zTsvsgLY72TIhslCB/cC74oAzsmWEIiFslscnA==", + "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==", "cpu": [ "x64" ], @@ -8341,9 +8506,9 @@ } }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.8.0.tgz", - "integrity": "sha512-5miZJmRSwx1jybBsiB3NGocXL9TxGdT2D+dOqR2fsLklpGz0ItEWm8+i8lhDjgOdAr2nFcuQUfQMY57f9FOHrA==", + "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==", "cpu": [ "arm64" ], @@ -8358,9 +8523,9 @@ } }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.8.0.tgz", - "integrity": "sha512-0P5r+bDuSNvoWys+6C1/KqGpYlqwSHpigCcyRzR62iZpT3OooZv+nWO06RlURkxMR8LNvYXTSSLvoLkjxqM8uQ==", + "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==", "cpu": [ "x64" ], @@ -8375,16 +8540,16 @@ } }, "node_modules/@nx/rspack": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-20.8.0.tgz", - "integrity": "sha512-lxascsF4XygCICchwcGWP1RQkKxEZAPqiLGLYJMxTj6ewXv9RsjJMIJftd3PO4UVhRU+BhvDZD5W9OX+NX23jQ==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-20.8.1.tgz", + "integrity": "sha512-R7+tkwLD+4KYn22r+c4grKfnB4ghxyH2lXUYgmxu7lg/pJsxiy0/Xn7rTHnzI4izTeap2LK9m1F5ZLC3oeJQ6Q==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.0", - "@nx/js": "20.8.0", - "@nx/module-federation": "20.8.0", - "@nx/web": "20.8.0", + "@nx/devkit": "20.8.1", + "@nx/js": "20.8.1", + "@nx/module-federation": "20.8.1", + "@nx/web": "20.8.1", "@phenomnomnominal/tsquery": "~5.0.1", "@rspack/core": "^1.1.5", "@rspack/dev-server": "^1.0.9", @@ -8500,30 +8665,30 @@ } }, "node_modules/@nx/storybook": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-20.8.0.tgz", - "integrity": "sha512-czGPlYdukeR4ThhwuUSWQI889aVJrW/bxhAY7BInBJGK56UFnBt1Galnw2um2TzQErN21eS2pRELwyyFeP6/OA==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-20.8.1.tgz", + "integrity": "sha512-SlneVKhePyoG30s3LHFIWU1ZjoeekCQFZ9IktseElHwOxb83wcXXV/61tKCphur3htZEZ7EL226RzMXQYPIknA==", "dev": true, "license": "MIT", "dependencies": { - "@nx/cypress": "20.8.0", - "@nx/devkit": "20.8.0", - "@nx/eslint": "20.8.0", - "@nx/js": "20.8.0", + "@nx/cypress": "20.8.1", + "@nx/devkit": "20.8.1", + "@nx/eslint": "20.8.1", + "@nx/js": "20.8.1", "@phenomnomnominal/tsquery": "~5.0.1", "semver": "^7.5.3", "tslib": "^2.3.0" } }, "node_modules/@nx/web": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-20.8.0.tgz", - "integrity": "sha512-jbK3+ZrVygYHMGCbp7NO1/G+ejH6Z74PcWwEKSZDPm7io6fxieO9j+GSzucvUWrY4cfJNC+S//X4tENwVj0g2w==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/web/-/web-20.8.1.tgz", + "integrity": "sha512-sZjL5vLkL3IDBGJwPlZG9PP7hDe/PjnQkVji0VmaFRRhiEQqxyfbNy6k9f5BWvc3tj3IITDofLcVvmTFMSHisw==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.0", - "@nx/js": "20.8.0", + "@nx/devkit": "20.8.1", + "@nx/js": "20.8.1", "detect-port": "^1.5.1", "http-server": "^14.1.0", "picocolors": "^1.1.0", @@ -8531,15 +8696,15 @@ } }, "node_modules/@nx/webpack": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-20.8.0.tgz", - "integrity": "sha512-zqboigPhlPNMzOIFECkLzkCOfpvOR1BnE7zu2Vyzok18s3dhb1UErar6MuSb6Dh5Mwfe2HELa8iD60bM8PBSQg==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-20.8.1.tgz", + "integrity": "sha512-Xz1badU23VvRl6ij20D5eTndBsPGxOUC67h7gQfmLqnsUxf9R6NgOnMxt2Y42QWRx5jXxuQf1AbJ/0N+z2fi8A==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.23.2", - "@nx/devkit": "20.8.0", - "@nx/js": "20.8.0", + "@nx/devkit": "20.8.1", + "@nx/js": "20.8.1", "@phenomnomnominal/tsquery": "~5.0.1", "ajv": "^8.12.0", "autoprefixer": "^10.4.9", @@ -9014,17 +9179,17 @@ } }, "node_modules/@nx/workspace": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.8.0.tgz", - "integrity": "sha512-FdaHA5ISHSN+RyHswAAx+2A9HC77kWeFgeucdX2NSBs2QK2Lzg2Et639RzR1sYk2gYTP6tOkQXHHGKcg3jmiYQ==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.8.1.tgz", + "integrity": "sha512-Y6HlERFJbLHn1J9JHMsPDSRK5iBSH4hbw9TkqwkINeHBDX8bIilnO3tK6VVMIPTzTHJldxI+zQ1IrzVisZpJsA==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.0", + "@nx/devkit": "20.8.1", "@zkochan/js-yaml": "0.0.7", "chalk": "^4.1.0", "enquirer": "~2.3.6", - "nx": "20.8.0", + "nx": "20.8.1", "picomatch": "4.0.2", "tslib": "^2.3.0", "yargs-parser": "21.1.1" @@ -10199,9 +10364,9 @@ } }, "node_modules/@rspack/plugin-react-refresh": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.2.0.tgz", - "integrity": "sha512-DTsbtggCfsiXE5QQtYMS8rKfEF8GIjwPDbgIT6Kg8BlAjpJY4jT5IisyhfIi7YOT3d5RIvu60iFB6Kr9sSMsnA==", + "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==", "dev": true, "license": "MIT", "dependencies": { @@ -13613,9 +13778,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", "dev": true, "license": "MIT", "dependencies": { @@ -26244,9 +26409,9 @@ "license": "MIT" }, "node_modules/nx": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/nx/-/nx-20.8.0.tgz", - "integrity": "sha512-+BN5B5DFBB5WswD8flDDTnr4/bf1VTySXOv60aUAllHqR+KS6deT0p70TTMZF4/A2n/L2UCWDaDro37MGaYozA==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-20.8.1.tgz", + "integrity": "sha512-73Uw8YXpsjeLqHSl7NMCmGdCs+8ynPzoNJFWAqVanPETEY9zPd5wevVQmeyzYtNNQU35uj6Os4iUzYunmwnFaA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -26291,16 +26456,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "20.8.0", - "@nx/nx-darwin-x64": "20.8.0", - "@nx/nx-freebsd-x64": "20.8.0", - "@nx/nx-linux-arm-gnueabihf": "20.8.0", - "@nx/nx-linux-arm64-gnu": "20.8.0", - "@nx/nx-linux-arm64-musl": "20.8.0", - "@nx/nx-linux-x64-gnu": "20.8.0", - "@nx/nx-linux-x64-musl": "20.8.0", - "@nx/nx-win32-arm64-msvc": "20.8.0", - "@nx/nx-win32-x64-msvc": "20.8.0" + "@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" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -27523,9 +27688,9 @@ } }, "node_modules/portfinder": { - "version": "1.0.35", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.35.tgz", - "integrity": "sha512-73JaFg4NwYNAufDtS5FsFu/PdM49ahJrO1i44aCRsDWju1z5wuGDaqyFUQWR6aJoK2JPDWlaYYAGFNIGTSUHSw==", + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.36.tgz", + "integrity": "sha512-gMKUzCoP+feA7t45moaSx7UniU7PgGN3hA8acAB+3Qn7/js0/lJ07fYZlxt9riE9S3myyxDCyAFzSrLlta0c9g==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 64fc87aa0..ca6c0e923 100644 --- a/package.json +++ b/package.json @@ -155,17 +155,17 @@ "@eslint/js": "9.24.0", "@nestjs/schematics": "10.2.3", "@nestjs/testing": "10.4.15", - "@nx/angular": "20.8.0", - "@nx/cypress": "20.8.0", - "@nx/eslint-plugin": "20.8.0", - "@nx/jest": "20.8.0", - "@nx/js": "20.8.0", - "@nx/module-federation": "20.8.0", - "@nx/nest": "20.8.0", - "@nx/node": "20.8.0", - "@nx/storybook": "20.8.0", - "@nx/web": "20.8.0", - "@nx/workspace": "20.8.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", "@schematics/angular": "19.2.1", "@storybook/addon-essentials": "8.6.12", "@storybook/addon-interactions": "8.6.12", @@ -193,7 +193,7 @@ "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", "jest-preset-angular": "14.4.2", - "nx": "20.8.0", + "nx": "20.8.1", "prettier": "3.5.3", "prettier-plugin-organize-attributes": "1.0.0", "prisma": "6.6.0", From 07fa34545702ee856cb7cc072c95ba8697302d81 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 27 Apr 2025 09:44:58 +0200 Subject: [PATCH 05/91] Feature/upgrade ngx-skeleton-loader to version 11.0.0 (#4602) * Upgrade ngx-skeleton-loader to version 11.0.0 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e3e68430..f8f9ebbb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the error message of the currency code validation - Tightened the currency code validation by requiring uppercase letters - Improved the language localization for Français (`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` ### Fixed diff --git a/package-lock.json b/package-lock.json index 4dfb2eb53..91b726ef7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -76,7 +76,7 @@ "ng-extract-i18n-merge": "2.14.3", "ngx-device-detector": "9.0.0", "ngx-markdown": "19.0.0", - "ngx-skeleton-loader": "10.0.0", + "ngx-skeleton-loader": "11.0.0", "ngx-stripe": "19.0.0", "open-color": "1.9.1", "papaparse": "5.3.1", @@ -25927,16 +25927,16 @@ } }, "node_modules/ngx-skeleton-loader": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/ngx-skeleton-loader/-/ngx-skeleton-loader-10.0.0.tgz", - "integrity": "sha512-TYrWLrdRtzoZoPzurNDUJdAbdyplqgyDztCefEi+clHl5MSumwG4NrGxZC1OVxz7RitomhnF7wTM8T/j+tdwXw==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/ngx-skeleton-loader/-/ngx-skeleton-loader-11.0.0.tgz", + "integrity": "sha512-SVWgrePXqIX0ToLf/G0Ce+aE6qXCKl/c+9arV61eiFlrqXXaMlXCkVAYT/wpK+4xgVMHXvQha1mnG9YcKVHQ1A==", "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { - "@angular/common": ">=18.0.0", - "@angular/core": ">=18.0.0" + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0" } }, "node_modules/ngx-stripe": { diff --git a/package.json b/package.json index ca6c0e923..a1a4add08 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "ng-extract-i18n-merge": "2.14.3", "ngx-device-detector": "9.0.0", "ngx-markdown": "19.0.0", - "ngx-skeleton-loader": "10.0.0", + "ngx-skeleton-loader": "11.0.0", "ngx-stripe": "19.0.0", "open-color": "1.9.1", "papaparse": "5.3.1", From 862de91e7b21b07d0fb05143c5bab31fdbe829bb Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 27 Apr 2025 09:46:25 +0200 Subject: [PATCH 06/91] Feature/respect watcher count in delete asset profile checkbox (#4609) * Respect watchedByCount in delete asset profile checkbox * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/admin/admin.service.ts | 12 +++++++++--- .../admin-market-data/admin-market-data.html | 3 ++- .../admin-market-data/admin-market-data.service.ts | 11 ++++++++--- .../lib/interfaces/admin-market-data.interface.ts | 1 + 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8f9ebbb7..db9ccf9bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the 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`) - Upgraded `ngx-skeleton-loader` from version `10.0.0` to `11.0.0` - Upgraded `Nx` from version `20.8.0` to `20.8.1` diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 4cd4abcdb..e72902704 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -238,7 +238,10 @@ export class AdminService { where, select: { _count: { - select: { Order: true } + select: { + Order: true, + watchedBy: true + } }, assetClass: true, assetSubClass: true, @@ -375,7 +378,9 @@ export class AdminService { sectorsCount, activitiesCount: _count.Order, date: Order?.[0]?.date, - isUsedByUsersWithSubscription: await isUsedByUsersWithSubscription + isUsedByUsersWithSubscription: + await isUsedByUsersWithSubscription, + watchedByCount: _count.watchedBy }; } ) @@ -752,7 +757,8 @@ export class AdminService { id: undefined, isActive: true, name: symbol, - sectorsCount: 0 + sectorsCount: 0, + watchedByCount: 0 }; } ); diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.html b/apps/client/src/app/components/admin-market-data/admin-market-data.html index 6ba8f1810..bfa6d550e 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.html +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -55,7 +55,8 @@ adminMarketDataService.hasPermissionToDeleteAssetProfile({ activitiesCount: element.activitiesCount, isBenchmark: element.isBenchmark, - symbol: element.symbol + symbol: element.symbol, + watchedByCount: element.watchedByCount }) ) { ) { + symbol, + watchedByCount + }: Pick< + AdminMarketDataItem, + 'activitiesCount' | 'isBenchmark' | 'symbol' | 'watchedByCount' + >) { return ( activitiesCount === 0 && !isBenchmark && !isDerivedCurrency(getCurrencyFromSymbol(symbol)) && !isRootCurrency(getCurrencyFromSymbol(symbol)) && - !symbol.startsWith(ghostfolioScraperApiSymbolPrefix) + !symbol.startsWith(ghostfolioScraperApiSymbolPrefix) && + watchedByCount === 0 ); } } diff --git a/libs/common/src/lib/interfaces/admin-market-data.interface.ts b/libs/common/src/lib/interfaces/admin-market-data.interface.ts index d72672489..953f94e26 100644 --- a/libs/common/src/lib/interfaces/admin-market-data.interface.ts +++ b/libs/common/src/lib/interfaces/admin-market-data.interface.ts @@ -22,4 +22,5 @@ export interface AdminMarketDataItem { name: string; sectorsCount: number; symbol: string; + watchedByCount: number; } From 2774dd7b2e0aef909632956d120c42a7d8cee4f6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 27 Apr 2025 09:50:24 +0200 Subject: [PATCH 07/91] Feature/update locales (#4611) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 34 ++++++++++++------------- apps/client/src/locales/messages.de.xlf | 34 ++++++++++++------------- apps/client/src/locales/messages.es.xlf | 34 ++++++++++++------------- apps/client/src/locales/messages.fr.xlf | 34 ++++++++++++------------- apps/client/src/locales/messages.it.xlf | 34 ++++++++++++------------- apps/client/src/locales/messages.nl.xlf | 34 ++++++++++++------------- apps/client/src/locales/messages.pl.xlf | 34 ++++++++++++------------- apps/client/src/locales/messages.pt.xlf | 34 ++++++++++++------------- apps/client/src/locales/messages.tr.xlf | 34 ++++++++++++------------- apps/client/src/locales/messages.uk.xlf | 34 ++++++++++++------------- apps/client/src/locales/messages.xlf | 34 ++++++++++++------------- apps/client/src/locales/messages.zh.xlf | 34 ++++++++++++------------- 12 files changed, 204 insertions(+), 204 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 456e15790..9e5f2b39b 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -1035,7 +1035,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 88 + 89 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1183,7 +1183,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 268 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1207,7 +1207,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 290 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1291,7 +1291,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 74 + 75 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1315,7 +1315,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 105 + 106 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1439,7 +1439,7 @@ Preu de Mercat apps/client/src/app/components/admin-market-data/admin-market-data.html - 132 + 133 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1583,7 +1583,7 @@ Classe d’Actiu apps/client/src/app/components/admin-market-data/admin-market-data.html - 114 + 115 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1611,7 +1611,7 @@ Subclasse d’Actiu apps/client/src/app/components/admin-market-data/admin-market-data.html - 123 + 124 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1635,7 +1635,7 @@ Primera Activitat apps/client/src/app/components/admin-market-data/admin-market-data.html - 147 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1655,7 +1655,7 @@ Nombre d’Activitats apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 + 157 @@ -1663,7 +1663,7 @@ Dades Històriques apps/client/src/app/components/admin-market-data/admin-market-data.html - 165 + 166 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -1675,7 +1675,7 @@ Nombre de Sectors apps/client/src/app/components/admin-market-data/admin-market-data.html - 174 + 175 @@ -1683,7 +1683,7 @@ Nombre de Països apps/client/src/app/components/admin-market-data/admin-market-data.html - 183 + 184 @@ -1691,7 +1691,7 @@ Recopilar Dades del Perfil apps/client/src/app/components/admin-market-data/admin-market-data.html - 234 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1703,7 +1703,7 @@ Eliminar Perfils apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 + 243 @@ -7894,7 +7894,7 @@ Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 225 + 226 @@ -7902,7 +7902,7 @@ Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 230 + 231 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 10f26cddb..766c171a8 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -130,7 +130,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 88 + 89 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -246,7 +246,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 268 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -270,7 +270,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 290 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -322,7 +322,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 74 + 75 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -346,7 +346,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 105 + 106 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -466,7 +466,7 @@ Marktpreis apps/client/src/app/components/admin-market-data/admin-market-data.html - 132 + 133 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -570,7 +570,7 @@ Erste Aktivität apps/client/src/app/components/admin-market-data/admin-market-data.html - 147 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -598,7 +598,7 @@ Historische Daten apps/client/src/app/components/admin-market-data/admin-market-data.html - 165 + 166 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -650,7 +650,7 @@ Letzte historische Marktdaten synchronisieren apps/client/src/app/components/admin-market-data/admin-market-data.html - 225 + 226 @@ -658,7 +658,7 @@ Alle historischen Marktdaten synchronisieren apps/client/src/app/components/admin-market-data/admin-market-data.html - 230 + 231 @@ -666,7 +666,7 @@ Profildaten synchronisieren apps/client/src/app/components/admin-market-data/admin-market-data.html - 234 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -2294,7 +2294,7 @@ Anlageklasse apps/client/src/app/components/admin-market-data/admin-market-data.html - 114 + 115 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -2650,7 +2650,7 @@ Anlageunterklasse apps/client/src/app/components/admin-market-data/admin-market-data.html - 123 + 124 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -2782,7 +2782,7 @@ Anzahl Länder apps/client/src/app/components/admin-market-data/admin-market-data.html - 183 + 184 @@ -2790,7 +2790,7 @@ Anzahl Sektoren apps/client/src/app/components/admin-market-data/admin-market-data.html - 174 + 175 @@ -3234,7 +3234,7 @@ Anzahl Aktivitäten apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 + 157 @@ -6663,7 +6663,7 @@ Profile löschen apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 + 243 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 8ba704729..9064b626d 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -131,7 +131,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 88 + 89 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -247,7 +247,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 268 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -271,7 +271,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 290 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -323,7 +323,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 74 + 75 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -347,7 +347,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 105 + 106 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -467,7 +467,7 @@ Precio de mercado apps/client/src/app/components/admin-market-data/admin-market-data.html - 132 + 133 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -571,7 +571,7 @@ Primera actividad apps/client/src/app/components/admin-market-data/admin-market-data.html - 147 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -599,7 +599,7 @@ Datos históricos apps/client/src/app/components/admin-market-data/admin-market-data.html - 165 + 166 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -651,7 +651,7 @@ Recoger los datos del perfil apps/client/src/app/components/admin-market-data/admin-market-data.html - 234 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -2279,7 +2279,7 @@ Tipo de activo apps/client/src/app/components/admin-market-data/admin-market-data.html - 114 + 115 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -2623,7 +2623,7 @@ Subtipo de activo apps/client/src/app/components/admin-market-data/admin-market-data.html - 123 + 124 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -2767,7 +2767,7 @@ Número de sectores apps/client/src/app/components/admin-market-data/admin-market-data.html - 174 + 175 @@ -2775,7 +2775,7 @@ Número de países apps/client/src/app/components/admin-market-data/admin-market-data.html - 183 + 184 @@ -3219,7 +3219,7 @@ Recuento de actividades apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 + 157 @@ -6640,7 +6640,7 @@ Borrar Perfiles apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 + 243 @@ -7895,7 +7895,7 @@ Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 225 + 226 @@ -7903,7 +7903,7 @@ Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 230 + 231 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index c788e87e1..c5ab8ac69 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -138,7 +138,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 88 + 89 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -302,7 +302,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 268 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -326,7 +326,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 290 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -370,7 +370,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 74 + 75 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -394,7 +394,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 105 + 106 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -522,7 +522,7 @@ Prix du Marché apps/client/src/app/components/admin-market-data/admin-market-data.html - 132 + 133 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -634,7 +634,7 @@ Classe d’Actifs apps/client/src/app/components/admin-market-data/admin-market-data.html - 114 + 115 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -662,7 +662,7 @@ Sous-classe d’Actifs apps/client/src/app/components/admin-market-data/admin-market-data.html - 123 + 124 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -686,7 +686,7 @@ Première Activité apps/client/src/app/components/admin-market-data/admin-market-data.html - 147 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -706,7 +706,7 @@ Nombre d’Activités apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 + 157 @@ -714,7 +714,7 @@ Données Historiques apps/client/src/app/components/admin-market-data/admin-market-data.html - 165 + 166 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -726,7 +726,7 @@ Nombre de Secteurs apps/client/src/app/components/admin-market-data/admin-market-data.html - 174 + 175 @@ -734,7 +734,7 @@ Nombre de Pays apps/client/src/app/components/admin-market-data/admin-market-data.html - 183 + 184 @@ -742,7 +742,7 @@ Obtenir les Données du Profil apps/client/src/app/components/admin-market-data/admin-market-data.html - 234 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -6639,7 +6639,7 @@ Supprimer des Profils apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 + 243 @@ -7894,7 +7894,7 @@ Collecter les données récentes du marché historique apps/client/src/app/components/admin-market-data/admin-market-data.html - 225 + 226 @@ -7902,7 +7902,7 @@ Collecter toutes les données du marché historique apps/client/src/app/components/admin-market-data/admin-market-data.html - 230 + 231 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index c8c1a086d..4af6fdfad 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -131,7 +131,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 88 + 89 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -247,7 +247,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 268 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -271,7 +271,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 290 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -323,7 +323,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 74 + 75 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -347,7 +347,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 105 + 106 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -467,7 +467,7 @@ Prezzo di mercato apps/client/src/app/components/admin-market-data/admin-market-data.html - 132 + 133 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -571,7 +571,7 @@ Prima attività apps/client/src/app/components/admin-market-data/admin-market-data.html - 147 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -599,7 +599,7 @@ Dati storici apps/client/src/app/components/admin-market-data/admin-market-data.html - 165 + 166 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -651,7 +651,7 @@ Raccogli i dati del profilo apps/client/src/app/components/admin-market-data/admin-market-data.html - 234 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -2279,7 +2279,7 @@ Classe asset apps/client/src/app/components/admin-market-data/admin-market-data.html - 114 + 115 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -2623,7 +2623,7 @@ Sottoclasse asset apps/client/src/app/components/admin-market-data/admin-market-data.html - 123 + 124 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -2767,7 +2767,7 @@ Numero di settori apps/client/src/app/components/admin-market-data/admin-market-data.html - 174 + 175 @@ -2775,7 +2775,7 @@ Numero di paesi apps/client/src/app/components/admin-market-data/admin-market-data.html - 183 + 184 @@ -3219,7 +3219,7 @@ Conteggio attività apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 + 157 @@ -6640,7 +6640,7 @@ Elimina i profili apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 + 243 @@ -7895,7 +7895,7 @@ Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 225 + 226 @@ -7903,7 +7903,7 @@ Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 230 + 231 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 7c5066ad6..8731a8a82 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -130,7 +130,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 88 + 89 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -246,7 +246,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 268 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -270,7 +270,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 290 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -322,7 +322,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 74 + 75 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -346,7 +346,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 105 + 106 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -466,7 +466,7 @@ Marktprijs apps/client/src/app/components/admin-market-data/admin-market-data.html - 132 + 133 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -570,7 +570,7 @@ Eerste activiteit apps/client/src/app/components/admin-market-data/admin-market-data.html - 147 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -598,7 +598,7 @@ Historische gegevens apps/client/src/app/components/admin-market-data/admin-market-data.html - 165 + 166 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -650,7 +650,7 @@ Verzamel profielgegevens apps/client/src/app/components/admin-market-data/admin-market-data.html - 234 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -2278,7 +2278,7 @@ Asset klasse apps/client/src/app/components/admin-market-data/admin-market-data.html - 114 + 115 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -2622,7 +2622,7 @@ Asset subklasse apps/client/src/app/components/admin-market-data/admin-market-data.html - 123 + 124 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -2766,7 +2766,7 @@ Aantal sectoren apps/client/src/app/components/admin-market-data/admin-market-data.html - 174 + 175 @@ -2774,7 +2774,7 @@ Aantal landen apps/client/src/app/components/admin-market-data/admin-market-data.html - 183 + 184 @@ -3218,7 +3218,7 @@ Aantal activiteiten apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 + 157 @@ -6639,7 +6639,7 @@ Delete Profiles apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 + 243 @@ -7894,7 +7894,7 @@ Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 225 + 226 @@ -7902,7 +7902,7 @@ Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 230 + 231 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 4970c3d53..4b0db8aa1 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -963,7 +963,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 88 + 89 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1111,7 +1111,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 268 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1135,7 +1135,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 290 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1199,7 +1199,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 74 + 75 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1223,7 +1223,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 105 + 106 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1331,7 +1331,7 @@ Cena Rynkowa apps/client/src/app/components/admin-market-data/admin-market-data.html - 132 + 133 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1475,7 +1475,7 @@ Klasa Aktywów apps/client/src/app/components/admin-market-data/admin-market-data.html - 114 + 115 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1503,7 +1503,7 @@ Podklasa Aktywów apps/client/src/app/components/admin-market-data/admin-market-data.html - 123 + 124 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1527,7 +1527,7 @@ Pierwsza Aktywność apps/client/src/app/components/admin-market-data/admin-market-data.html - 147 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1547,7 +1547,7 @@ Liczba Aktywności apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 + 157 @@ -1555,7 +1555,7 @@ Dane Historyczne apps/client/src/app/components/admin-market-data/admin-market-data.html - 165 + 166 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -1567,7 +1567,7 @@ Liczba Sektorów apps/client/src/app/components/admin-market-data/admin-market-data.html - 174 + 175 @@ -1575,7 +1575,7 @@ Liczba Krajów apps/client/src/app/components/admin-market-data/admin-market-data.html - 183 + 184 @@ -1583,7 +1583,7 @@ Zbierz Dane Profilu apps/client/src/app/components/admin-market-data/admin-market-data.html - 234 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -6639,7 +6639,7 @@ Usuń Profile apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 + 243 @@ -7894,7 +7894,7 @@ Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 225 + 226 @@ -7902,7 +7902,7 @@ Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 230 + 231 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 84a3a0061..1a827b541 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -138,7 +138,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 88 + 89 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -302,7 +302,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 268 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -326,7 +326,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 290 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -370,7 +370,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 74 + 75 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -394,7 +394,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 105 + 106 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -522,7 +522,7 @@ Preço de Mercado apps/client/src/app/components/admin-market-data/admin-market-data.html - 132 + 133 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -634,7 +634,7 @@ Classe do Ativo apps/client/src/app/components/admin-market-data/admin-market-data.html - 114 + 115 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -662,7 +662,7 @@ Subclasse do ativo apps/client/src/app/components/admin-market-data/admin-market-data.html - 123 + 124 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -686,7 +686,7 @@ Primeira Atividade apps/client/src/app/components/admin-market-data/admin-market-data.html - 147 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -714,7 +714,7 @@ Dados Históricos apps/client/src/app/components/admin-market-data/admin-market-data.html - 165 + 166 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -726,7 +726,7 @@ Contagem de Países apps/client/src/app/components/admin-market-data/admin-market-data.html - 183 + 184 @@ -734,7 +734,7 @@ Contagem de Setores apps/client/src/app/components/admin-market-data/admin-market-data.html - 174 + 175 @@ -742,7 +742,7 @@ Recolher Dados de Perfíl apps/client/src/app/components/admin-market-data/admin-market-data.html - 234 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -3178,7 +3178,7 @@ Nº de Atividades apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 + 157 @@ -6639,7 +6639,7 @@ Delete Profiles apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 + 243 @@ -7894,7 +7894,7 @@ Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 225 + 226 @@ -7902,7 +7902,7 @@ Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 230 + 231 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 97457c7a0..3f3e7d351 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -923,7 +923,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 88 + 89 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1071,7 +1071,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 268 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1095,7 +1095,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 290 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1139,7 +1139,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 74 + 75 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1163,7 +1163,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 105 + 106 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1291,7 +1291,7 @@ Piyasa Fiyatı apps/client/src/app/components/admin-market-data/admin-market-data.html - 132 + 133 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1427,7 +1427,7 @@ Varlık Sınıfı apps/client/src/app/components/admin-market-data/admin-market-data.html - 114 + 115 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1455,7 +1455,7 @@ Varlık Alt Sınıfı apps/client/src/app/components/admin-market-data/admin-market-data.html - 123 + 124 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1479,7 +1479,7 @@ İlk İşlem apps/client/src/app/components/admin-market-data/admin-market-data.html - 147 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1499,7 +1499,7 @@ İşlem Sayısı apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 + 157 @@ -1507,7 +1507,7 @@ Tarihsel Veri apps/client/src/app/components/admin-market-data/admin-market-data.html - 165 + 166 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -1519,7 +1519,7 @@ Sektör Sayısı apps/client/src/app/components/admin-market-data/admin-market-data.html - 174 + 175 @@ -1527,7 +1527,7 @@ Ülke Sayısı apps/client/src/app/components/admin-market-data/admin-market-data.html - 183 + 184 @@ -1535,7 +1535,7 @@ Profil Verisini Getir apps/client/src/app/components/admin-market-data/admin-market-data.html - 234 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -6639,7 +6639,7 @@ Delete Profiles apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 + 243 @@ -7894,7 +7894,7 @@ Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 225 + 226 @@ -7902,7 +7902,7 @@ Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 230 + 231 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index dae661112..612b8fecb 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -1051,7 +1051,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 88 + 89 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1199,7 +1199,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 268 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1223,7 +1223,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 290 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1315,7 +1315,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 74 + 75 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1339,7 +1339,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 105 + 106 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1475,7 +1475,7 @@ Клас активу apps/client/src/app/components/admin-market-data/admin-market-data.html - 114 + 115 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1503,7 +1503,7 @@ Підклас активу apps/client/src/app/components/admin-market-data/admin-market-data.html - 123 + 124 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1527,7 +1527,7 @@ Ринкова ціна apps/client/src/app/components/admin-market-data/admin-market-data.html - 132 + 133 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1543,7 +1543,7 @@ Перша активність apps/client/src/app/components/admin-market-data/admin-market-data.html - 147 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1563,7 +1563,7 @@ Кількість активностей apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 + 157 @@ -1571,7 +1571,7 @@ Історичні дані apps/client/src/app/components/admin-market-data/admin-market-data.html - 165 + 166 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -1583,7 +1583,7 @@ Кількість секторів apps/client/src/app/components/admin-market-data/admin-market-data.html - 174 + 175 @@ -1591,7 +1591,7 @@ Кількість країн apps/client/src/app/components/admin-market-data/admin-market-data.html - 183 + 184 @@ -1599,7 +1599,7 @@ Зібрати дані профілю apps/client/src/app/components/admin-market-data/admin-market-data.html - 234 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1611,7 +1611,7 @@ Видалити профілі apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 + 243 @@ -7894,7 +7894,7 @@ Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 225 + 226 @@ -7902,7 +7902,7 @@ Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 230 + 231 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index d8a7b552c..053766e58 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -935,7 +935,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 88 + 89 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1079,7 +1079,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 268 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1102,7 +1102,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 290 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1162,7 +1162,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 74 + 75 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1185,7 +1185,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 105 + 106 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1282,7 +1282,7 @@ Market Price apps/client/src/app/components/admin-market-data/admin-market-data.html - 132 + 133 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1418,7 +1418,7 @@ Asset Class apps/client/src/app/components/admin-market-data/admin-market-data.html - 114 + 115 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1445,7 +1445,7 @@ Asset Sub Class apps/client/src/app/components/admin-market-data/admin-market-data.html - 123 + 124 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1468,7 +1468,7 @@ First Activity apps/client/src/app/components/admin-market-data/admin-market-data.html - 147 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1487,14 +1487,14 @@ Activities Count apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 + 157 Historical Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 165 + 166 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -1505,35 +1505,35 @@ Sectors Count apps/client/src/app/components/admin-market-data/admin-market-data.html - 174 + 175 Countries Count apps/client/src/app/components/admin-market-data/admin-market-data.html - 183 + 184 Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 225 + 226 Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 230 + 231 Gather Profile Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 234 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -6055,7 +6055,7 @@ Delete Profiles apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 + 243 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 6305867a3..5902d171b 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -972,7 +972,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 88 + 89 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1120,7 +1120,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 268 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1144,7 +1144,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 290 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1208,7 +1208,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 74 + 75 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1232,7 +1232,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 105 + 106 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1340,7 +1340,7 @@ 市场价 apps/client/src/app/components/admin-market-data/admin-market-data.html - 132 + 133 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1484,7 +1484,7 @@ 资产类别 apps/client/src/app/components/admin-market-data/admin-market-data.html - 114 + 115 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1512,7 +1512,7 @@ 资产子类别 apps/client/src/app/components/admin-market-data/admin-market-data.html - 123 + 124 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1536,7 +1536,7 @@ 第一个活动 apps/client/src/app/components/admin-market-data/admin-market-data.html - 147 + 148 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1556,7 +1556,7 @@ 活动计数 apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 + 157 @@ -1564,7 +1564,7 @@ 历史数据 apps/client/src/app/components/admin-market-data/admin-market-data.html - 165 + 166 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -1576,7 +1576,7 @@ 行业数 apps/client/src/app/components/admin-market-data/admin-market-data.html - 174 + 175 @@ -1584,7 +1584,7 @@ 国家数 apps/client/src/app/components/admin-market-data/admin-market-data.html - 183 + 184 @@ -1592,7 +1592,7 @@ 收集个人资料数据 apps/client/src/app/components/admin-market-data/admin-market-data.html - 234 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -6640,7 +6640,7 @@ Delete Profiles apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 + 243 @@ -7895,7 +7895,7 @@ Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 225 + 226 @@ -7903,7 +7903,7 @@ Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 230 + 231 From b2dcb1e7ac576709ceba9a4fb66c515e3defe56e Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 27 Apr 2025 14:10:57 +0200 Subject: [PATCH 08/91] Feature/improve subscription interstitial (#4612) * Improve algorithm * Set up skip button delay --- apps/api/src/app/user/user.service.ts | 10 +++-- ...scription-interstitial-dialog.component.ts | 44 +++++++++++++++++-- .../subscription-interstitial-dialog.html | 23 ++++++++-- .../src/app/services/user/user.service.ts | 1 + 4 files changed, 67 insertions(+), 11 deletions(-) diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index d9e419812..cf55b8862 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -356,18 +356,20 @@ export class UserService { new Date(), user.createdAt ); - let frequency = 10; + let frequency = 7; - if (daysSinceRegistration > 365) { + if (daysSinceRegistration > 720) { + frequency = 1; + } else if (daysSinceRegistration > 360) { frequency = 2; } else if (daysSinceRegistration > 180) { frequency = 3; } else if (daysSinceRegistration > 60) { frequency = 4; } else if (daysSinceRegistration > 30) { - frequency = 6; + frequency = 5; } else if (daysSinceRegistration > 15) { - frequency = 8; + frequency = 6; } if (Analytics?.activityCount % frequency === 1) { 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 d98c54719..201a63927 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,5 +1,14 @@ -import { ChangeDetectionStrategy, Component, Inject } from '@angular/core'; +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + Inject, + OnInit +} from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import ms from 'ms'; +import { interval, Subject } from 'rxjs'; +import { take, takeUntil, tap } from 'rxjs/operators'; import { SubscriptionInterstitialDialogParams } from './interfaces/interfaces'; @@ -11,20 +20,47 @@ import { SubscriptionInterstitialDialogParams } from './interfaces/interfaces'; templateUrl: 'subscription-interstitial-dialog.html', standalone: false }) -export class SubscriptionInterstitialDialog { - private readonly VARIANTS_COUNT = 2; +export class SubscriptionInterstitialDialog implements OnInit { + private static readonly SKIP_BUTTON_DELAY_IN_SECONDS = 5; + private static readonly VARIANTS_COUNT = 2; + public remainingSkipButtonDelay = + SubscriptionInterstitialDialog.SKIP_BUTTON_DELAY_IN_SECONDS; public routerLinkPricing = ['/' + $localize`:snake-case:pricing`]; public variantIndex: number; + private unsubscribeSubject = new Subject(); + public constructor( + private changeDetectorRef: ChangeDetectorRef, @Inject(MAT_DIALOG_DATA) public data: SubscriptionInterstitialDialogParams, public dialogRef: MatDialogRef ) { - this.variantIndex = Math.floor(Math.random() * this.VARIANTS_COUNT); + this.variantIndex = Math.floor( + Math.random() * SubscriptionInterstitialDialog.VARIANTS_COUNT + ); + } + + public ngOnInit() { + interval(ms('1 second')) + .pipe( + take(SubscriptionInterstitialDialog.SKIP_BUTTON_DELAY_IN_SECONDS), + tap(() => { + this.remainingSkipButtonDelay--; + + this.changeDetectorRef.markForCheck(); + }), + takeUntil(this.unsubscribeSubject) + ) + .subscribe(); } public closeDialog() { this.dialogRef.close({}); } + + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } } diff --git a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html index b9b96f9a8..92d9da835 100644 --- a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html +++ b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -51,7 +51,16 @@
- +
- { data: { user } as SubscriptionInterstitialDialogParams, + disableClose: true, height: this.deviceType === 'mobile' ? '98vh' : '80vh', width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); From a5e13d30aeba8643d3dda86b5f0147091993125f Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 27 Apr 2025 14:11:37 +0200 Subject: [PATCH 09/91] Bugfix/fix missing localization for alias fallback on public page (#4610) * Fix missing localization * Update changelog --- CHANGELOG.md | 1 + apps/client/src/app/pages/public/public-page.component.ts | 1 + apps/client/src/app/pages/public/public-page.html | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db9ccf9bf..580489cd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Improved the file selector of the activities import functionality to accept case-insensitive file extensions (`.CSV` and `.JSON`) +- Fixed the missing localization for "someone" on the public page ## 2.155.0 - 2025-04-23 diff --git a/apps/client/src/app/pages/public/public-page.component.ts b/apps/client/src/app/pages/public/public-page.component.ts index b343a6e01..38a147081 100644 --- a/apps/client/src/app/pages/public/public-page.component.ts +++ b/apps/client/src/app/pages/public/public-page.component.ts @@ -30,6 +30,7 @@ export class PublicPageComponent implements OnInit { public countries: { [code: string]: { name: string; value: number }; }; + public defaultAlias = $localize`someone`; public deviceType: string; public holdings: PublicPortfolioResponse['holdings'][string][]; public markets: { diff --git a/apps/client/src/app/pages/public/public-page.html b/apps/client/src/app/pages/public/public-page.html index ac1628a3a..e51aee9a7 100644 --- a/apps/client/src/app/pages/public/public-page.html +++ b/apps/client/src/app/pages/public/public-page.html @@ -2,7 +2,7 @@

- Hello, {{ publicPortfolioDetails?.alias ?? 'someone' }} has shared a + Hello, {{ publicPortfolioDetails?.alias ?? defaultAlias }} has shared a Portfolio with you!

From c34996fdd66fa004d9c02e143bb755ccd7774091 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 27 Apr 2025 14:22:52 +0200 Subject: [PATCH 10/91] Feature/update locales (#4613) * Update locales * Update translations --------- Co-authored-by: github-actions[bot] Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- apps/client/src/locales/messages.ca.xlf | 34 ++++++++++++++----------- apps/client/src/locales/messages.de.xlf | 34 ++++++++++++++----------- apps/client/src/locales/messages.es.xlf | 34 ++++++++++++++----------- apps/client/src/locales/messages.fr.xlf | 34 ++++++++++++++----------- apps/client/src/locales/messages.it.xlf | 34 ++++++++++++++----------- apps/client/src/locales/messages.nl.xlf | 34 ++++++++++++++----------- apps/client/src/locales/messages.pl.xlf | 34 ++++++++++++++----------- apps/client/src/locales/messages.pt.xlf | 34 ++++++++++++++----------- apps/client/src/locales/messages.tr.xlf | 34 ++++++++++++++----------- apps/client/src/locales/messages.uk.xlf | 28 +++++++++++--------- apps/client/src/locales/messages.xlf | 30 ++++++++++++---------- apps/client/src/locales/messages.zh.xlf | 34 ++++++++++++++----------- 12 files changed, 223 insertions(+), 175 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 9e5f2b39b..94b8635b5 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -665,7 +665,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts - 17 + 29 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -2371,7 +2371,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 61 + 70 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3151,7 +3151,11 @@ Skip apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 54 + 59 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 98 @@ -5386,9 +5390,9 @@ 345 - - Hello, has shared a Portfolio with you! - Hello, has shared a Portfolio with you! + + Hello, has shared a Portfolio with you! + Hello, has shared a Portfolio with you! apps/client/src/app/pages/public/public-page.html 4 @@ -7282,20 +7286,12 @@ 95 - - Skip - Skip - - apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 83 - - Join now Join now apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 93 + 110 @@ -7929,6 +7925,14 @@ 31 + + someone + someone + + apps/client/src/app/pages/public/public-page.component.ts + 33 + + diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 766c171a8..afdcb1253 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -2837,9 +2837,9 @@ 11 - - Hello, has shared a Portfolio with you! - Hallo, hat ein Portfolio mit dir geteilt! + + Hello, has shared a Portfolio with you! + Hallo, hat ein Portfolio mit dir geteilt! apps/client/src/app/pages/public/public-page.html 4 @@ -3546,7 +3546,11 @@ Überspringen apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 54 + 59 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 98 @@ -3558,7 +3562,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 61 + 70 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -5449,7 +5453,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts - 17 + 29 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7306,20 +7310,12 @@ 95 - - Skip - Überspringen - - apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 83 - - Join now Jetzt teilnehmen apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 93 + 110 @@ -7929,6 +7925,14 @@ 31 + + someone + jemand + + apps/client/src/app/pages/public/public-page.component.ts + 33 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 9064b626d..6e6f6d3f1 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -2810,9 +2810,9 @@ 330 - - Hello, has shared a Portfolio with you! - Hola, ha compartido una Cartera contigo! + + Hello, has shared a Portfolio with you! + Hola, ha compartido una Cartera contigo! apps/client/src/app/pages/public/public-page.html 4 @@ -3531,7 +3531,11 @@ Saltar apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 54 + 59 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 98 @@ -3543,7 +3547,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 61 + 70 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -5426,7 +5430,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts - 17 + 29 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7283,20 +7287,12 @@ 95 - - Skip - Skip - - apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 83 - - Join now Join now apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 93 + 110 @@ -7930,6 +7926,14 @@ 31 + + someone + someone + + apps/client/src/app/pages/public/public-page.component.ts + 33 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index c5ab8ac69..c4536731e 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -2809,9 +2809,9 @@ 13 - - Hello, has shared a Portfolio with you! - Bonjour, a partagé un Portefeuille avec vous ! + + Hello, has shared a Portfolio with you! + Bonjour, a partagé un Portefeuille avec vous ! apps/client/src/app/pages/public/public-page.html 4 @@ -3530,7 +3530,11 @@ Passer apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 54 + 59 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 98 @@ -3542,7 +3546,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 61 + 70 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -5425,7 +5429,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts - 17 + 29 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7282,20 +7286,12 @@ 95 - - Skip - Passer - - apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 83 - - Join now Rejoindre maintenant apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 93 + 110 @@ -7929,6 +7925,14 @@ 31 + + someone + quelqu’un + + apps/client/src/app/pages/public/public-page.component.ts + 33 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 4af6fdfad..e8b29147f 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -2810,9 +2810,9 @@ 330 - - Hello, has shared a Portfolio with you! - Salve, ha condiviso un Portafoglio con te! + + Hello, has shared a Portfolio with you! + Salve, ha condiviso un Portafoglio con te! apps/client/src/app/pages/public/public-page.html 4 @@ -3531,7 +3531,11 @@ Salta apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 54 + 59 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 98 @@ -3543,7 +3547,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 61 + 70 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -5426,7 +5430,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts - 17 + 29 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7283,20 +7287,12 @@ 95 - - Skip - Salta - - apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 83 - - Join now Iscriviti adesso apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 93 + 110 @@ -7930,6 +7926,14 @@ 31 + + someone + someone + + apps/client/src/app/pages/public/public-page.component.ts + 33 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 8731a8a82..3ea7934ae 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -2809,9 +2809,9 @@ 330 - - Hello, has shared a Portfolio with you! - Hallo, heeft een portefeuille met je gedeeld! + + Hello, has shared a Portfolio with you! + Hallo, heeft een portefeuille met je gedeeld! apps/client/src/app/pages/public/public-page.html 4 @@ -3530,7 +3530,11 @@ Overslaan apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 54 + 59 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 98 @@ -3542,7 +3546,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 61 + 70 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -5425,7 +5429,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts - 17 + 29 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7282,20 +7286,12 @@ 95 - - Skip - Skip - - apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 83 - - Join now Join now apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 93 + 110 @@ -7929,6 +7925,14 @@ 31 + + someone + iemand + + apps/client/src/app/pages/public/public-page.component.ts + 33 + + diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 4b0db8aa1..99418ceb0 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -284,7 +284,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts - 17 + 29 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -2887,7 +2887,11 @@ Pomiń apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 54 + 59 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 98 @@ -2899,7 +2903,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 61 + 70 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4962,9 +4966,9 @@ 345 - - Hello, has shared a Portfolio with you! - Witaj, udostępnił Ci Portfel + + Hello, has shared a Portfolio with you! + Witaj, udostępnił Ci Portfel apps/client/src/app/pages/public/public-page.html 4 @@ -7282,20 +7286,12 @@ 95 - - Skip - Pomiń - - apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 83 - - Join now Dołącz teraz apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 93 + 110 @@ -7929,6 +7925,14 @@ 31 + + someone + someone + + apps/client/src/app/pages/public/public-page.component.ts + 33 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 1a827b541..f83a0c9c8 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -2705,9 +2705,9 @@ 13 - - Hello, has shared a Portfolio with you! - Olá, partilhou um Portefólio consigo! + + Hello, has shared a Portfolio with you! + Olá, partilhou um Portefólio consigo! apps/client/src/app/pages/public/public-page.html 4 @@ -3530,7 +3530,11 @@ Saltar apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 54 + 59 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 98 @@ -3542,7 +3546,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 61 + 70 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -5425,7 +5429,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts - 17 + 29 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7282,20 +7286,12 @@ 95 - - Skip - Skip - - apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 83 - - Join now Join now apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 93 + 110 @@ -7929,6 +7925,14 @@ 31 + + someone + someone + + apps/client/src/app/pages/public/public-page.component.ts + 33 + + diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 3f3e7d351..7b8f9fcf3 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -284,7 +284,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts - 17 + 29 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -2727,7 +2727,11 @@ Geç apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 54 + 59 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 98 @@ -2739,7 +2743,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 61 + 70 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4434,9 +4438,9 @@ 345 - - Hello, has shared a Portfolio with you! - Merhaba, size bir Portföy paylaştı! + + Hello, has shared a Portfolio with you! + Merhaba, size bir Portföy paylaştı! apps/client/src/app/pages/public/public-page.html 4 @@ -7282,20 +7286,12 @@ 95 - - Skip - Skip - - apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 83 - - Join now Join now apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 93 + 110 @@ -7929,6 +7925,14 @@ 31 + + someone + someone + + apps/client/src/app/pages/public/public-page.component.ts + 33 + + diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 612b8fecb..8b887cfec 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -665,7 +665,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts - 17 + 29 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -2503,7 +2503,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 61 + 70 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3311,15 +3311,11 @@ Пропустити apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 54 + 59 - - - Skip - Пропустити apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 83 + 98 @@ -3327,7 +3323,7 @@ Приєднуйтесь apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 93 + 110 @@ -5710,9 +5706,9 @@ 345 - - Hello, has shared a Portfolio with you! - Привіт, поділився з вами Портфелем! + + Hello, has shared a Portfolio with you! + Привіт, поділився з вами Портфелем! apps/client/src/app/pages/public/public-page.html 4 @@ -7929,6 +7925,14 @@ 31 + + someone + someone + + apps/client/src/app/pages/public/public-page.component.ts + 33 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 053766e58..aa91e90d0 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -279,7 +279,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts - 17 + 29 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -2717,7 +2717,11 @@ Skip apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 54 + 59 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 98 @@ -2728,7 +2732,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 61 + 70 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4574,8 +4578,8 @@ 345 - - Hello, has shared a Portfolio with you! + + Hello, has shared a Portfolio with you! apps/client/src/app/pages/public/public-page.html 4 @@ -6622,7 +6626,7 @@ Join now apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 93 + 110 @@ -6671,13 +6675,6 @@ 28 - - Skip - - apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 83 - - Threshold range @@ -7168,6 +7165,13 @@ 31 + + someone + + apps/client/src/app/pages/public/public-page.component.ts + 33 + + diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 5902d171b..6a18716da 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -285,7 +285,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts - 17 + 29 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -2896,7 +2896,11 @@ 跳过 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 54 + 59 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 98 @@ -2908,7 +2912,7 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 61 + 70 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4971,9 +4975,9 @@ 345 - - Hello, has shared a Portfolio with you! - 你好,分享了一个文件夹与你! + + Hello, has shared a Portfolio with you! + 你好,分享了一个文件夹与你! apps/client/src/app/pages/public/public-page.html 4 @@ -7283,20 +7287,12 @@ 95 - - Skip - Skip - - apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 83 - - Join now Join now apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html - 93 + 110 @@ -7930,6 +7926,14 @@ 31 + + someone + someone + + apps/client/src/app/pages/public/public-page.component.ts + 33 + + From f209519d958cad60381db5dedae4f0227c5f2dfb Mon Sep 17 00:00:00 2001 From: csehatt741 <77381875+csehatt741@users.noreply.github.com> Date: Sun, 27 Apr 2025 14:26:14 +0200 Subject: [PATCH 11/91] Bugfix/investment calculation for activities in custom currency (#4597) * Investment calculation for activities in custom currency * Update changelog --- CHANGELOG.md | 1 + .../portfolio-calculator-test-utils.ts | 2 + .../calculator/portfolio-calculator.ts | 2 +- .../roai/portfolio-calculator-btceur.spec.ts | 238 ++++++++++++++++++ .../roai/portfolio-calculator-btcusd.spec.ts | 238 ++++++++++++++++++ ...-calculator-msft-buy-with-dividend.spec.ts | 13 - .../portfolio/current-rate.service.mock.ts | 4 + .../src/app/portfolio/portfolio.service.ts | 14 +- 8 files changed, 494 insertions(+), 18 deletions(-) create mode 100644 apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts create mode 100644 apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 580489cd2..9cace5a3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Fixed an issue with the investment calculation for activities in a custom currency - Improved the file selector of the activities import functionality to accept case-insensitive file extensions (`.CSV` and `.JSON`) - Fixed the missing localization for "someone" on the public page diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts index 2c9f7b6f3..db80652c3 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts @@ -7,10 +7,12 @@ export const activityDummyData = { createdAt: new Date(), currency: undefined, fee: undefined, + feeInAssetProfileCurrency: undefined, id: undefined, isDraft: false, symbolProfileId: undefined, unitPrice: undefined, + unitPriceInAssetProfileCurrency: undefined, updatedAt: new Date(), userId: undefined, value: undefined, diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index 850b58113..99aeb42f8 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -902,8 +902,8 @@ export abstract class PortfolioCalculator { let lastTransactionPoint: TransactionPoint = null; for (const { - fee, date, + fee, quantity, SymbolProfile, tags, diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts new file mode 100644 index 000000000..2c5b90050 --- /dev/null +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts @@ -0,0 +1,238 @@ +import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; +import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { + activityDummyData, + loadActivityExportFile, + symbolProfileDummyData, + userDummyData +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; +import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; +import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; +import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock'; +import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/app/redis-cache/redis-cache.service.mock'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; +import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; +import { parseDate } from '@ghostfolio/common/helper'; +import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; + +import { Big } from 'big.js'; +import { join } from 'path'; + +jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { + return { + // eslint-disable-next-line @typescript-eslint/naming-convention + CurrentRateService: jest.fn().mockImplementation(() => { + return CurrentRateServiceMock; + }) + }; +}); + +jest.mock( + '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', + () => { + return { + // eslint-disable-next-line @typescript-eslint/naming-convention + PortfolioSnapshotService: jest.fn().mockImplementation(() => { + return PortfolioSnapshotServiceMock; + }) + }; + } +); + +jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { + return { + // eslint-disable-next-line @typescript-eslint/naming-convention + RedisCacheService: jest.fn().mockImplementation(() => { + return RedisCacheServiceMock; + }) + }; +}); + +describe('PortfolioCalculator', () => { + let activityDtos: CreateOrderDto[]; + + let configurationService: ConfigurationService; + let currentRateService: CurrentRateService; + let exchangeRateDataService: ExchangeRateDataService; + let portfolioCalculatorFactory: PortfolioCalculatorFactory; + let portfolioSnapshotService: PortfolioSnapshotService; + let redisCacheService: RedisCacheService; + + beforeAll(() => { + activityDtos = loadActivityExportFile( + join(__dirname, '../../../../../../../test/import/ok-btceur.json') + ); + }); + + beforeEach(() => { + configurationService = new ConfigurationService(); + + currentRateService = new CurrentRateService(null, null, null, null); + + exchangeRateDataService = new ExchangeRateDataService( + null, + null, + null, + null + ); + + portfolioSnapshotService = new PortfolioSnapshotService(null); + + redisCacheService = new RedisCacheService(null, null); + + portfolioCalculatorFactory = new PortfolioCalculatorFactory( + configurationService, + currentRateService, + exchangeRateDataService, + portfolioSnapshotService, + redisCacheService + ); + }); + + describe('get current positions', () => { + it.only('with BTCUSD buy (in EUR)', async () => { + jest.useFakeTimers().setSystemTime(parseDate('2022-01-14').getTime()); + + const activities: Activity[] = activityDtos.map((activity) => ({ + ...activityDummyData, + ...activity, + date: parseDate(activity.date), + feeInAssetProfileCurrency: 4.46, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'USD', + dataSource: activity.dataSource, + name: 'Bitcoin', + symbol: activity.symbol + }, + unitPriceInAssetProfileCurrency: 44558.42 + })); + + const portfolioCalculator = portfolioCalculatorFactory.createCalculator({ + activities, + calculationType: PerformanceCalculationType.ROAI, + currency: 'USD', + userId: userDummyData.id + }); + + const portfolioSnapshot = await portfolioCalculator.computeSnapshot(); + + const investments = portfolioCalculator.getInvestments(); + + const investmentsByMonth = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'month' + }); + + expect(portfolioSnapshot.historicalData[0]).toEqual({ + date: '2021-12-11', + investmentValueWithCurrencyEffect: 0, + netPerformance: 0, + netPerformanceInPercentage: 0, + netPerformanceInPercentageWithCurrencyEffect: 0, + netPerformanceWithCurrencyEffect: 0, + netWorth: 0, + totalAccountBalance: 0, + totalInvestment: 0, + totalInvestmentValueWithCurrencyEffect: 0, + value: 0, + valueWithCurrencyEffect: 0 + }); + + expect(portfolioSnapshot.historicalData[1]).toEqual({ + date: '2021-12-12', + investmentValueWithCurrencyEffect: 44558.42, + netPerformance: -4.46, + netPerformanceInPercentage: 0, + netPerformanceInPercentageWithCurrencyEffect: 0, + netPerformanceWithCurrencyEffect: -4.46, + netWorth: 44558.42, + totalAccountBalance: 0, + totalInvestment: 44558.42, + totalInvestmentValueWithCurrencyEffect: 44558.42, + value: 44558.42, + valueWithCurrencyEffect: 44558.42 + }); + + expect( + portfolioSnapshot.historicalData[ + portfolioSnapshot.historicalData.length - 1 + ] + ).toEqual({ + date: '2022-01-14', + investmentValueWithCurrencyEffect: 0, + netPerformance: -1463.18, + netPerformanceInPercentage: -0.032837340282712, + netPerformanceInPercentageWithCurrencyEffect: -0.032837340282712, + netPerformanceWithCurrencyEffect: -1463.18, + netWorth: 43099.7, + totalAccountBalance: 0, + totalInvestment: 44558.42, + totalInvestmentValueWithCurrencyEffect: 44558.42, + value: 43099.7, + valueWithCurrencyEffect: 43099.7 + }); + + expect(portfolioSnapshot).toMatchObject({ + currentValueInBaseCurrency: new Big('43099.7'), + errors: [], + hasErrors: false, + positions: [ + { + averagePrice: new Big('44558.42'), + currency: 'USD', + dataSource: 'YAHOO', + dividend: new Big('0'), + dividendInBaseCurrency: new Big('0'), + fee: new Big('4.46'), + feeInBaseCurrency: new Big('4.46'), + firstBuyDate: '2021-12-12', + grossPerformance: new Big('-1458.72'), + grossPerformancePercentage: new Big('-0.03273724696701543726'), + grossPerformancePercentageWithCurrencyEffect: new Big( + '-0.03273724696701543726' + ), + grossPerformanceWithCurrencyEffect: new Big('-1458.72'), + investment: new Big('44558.42'), + investmentWithCurrencyEffect: new Big('44558.42'), + netPerformance: new Big('-1463.18'), + netPerformancePercentage: new Big('-0.03283734028271199921'), + netPerformancePercentageWithCurrencyEffectMap: { + max: new Big('-0.03283734028271199921') + }, + netPerformanceWithCurrencyEffectMap: { + max: new Big('-1463.18') + }, + marketPrice: 43099.7, + marketPriceInBaseCurrency: 43099.7, + quantity: new Big('1'), + symbol: 'BTCUSD', + tags: [], + timeWeightedInvestment: new Big('44558.42'), + timeWeightedInvestmentWithCurrencyEffect: new Big('44558.42'), + transactionCount: 1, + valueInBaseCurrency: new Big('43099.7') + } + ], + totalFeesWithCurrencyEffect: new Big('4.46'), + totalInterestWithCurrencyEffect: new Big('0'), + totalInvestment: new Big('44558.42'), + totalInvestmentWithCurrencyEffect: new Big('44558.42'), + totalLiabilitiesWithCurrencyEffect: new Big('0'), + totalValuablesWithCurrencyEffect: new Big('0') + }); + + expect(investments).toEqual([ + { date: '2021-12-12', investment: new Big('44558.42') } + ]); + + expect(investmentsByMonth).toEqual([ + { date: '2021-12-01', investment: 44558.42 }, + { date: '2022-01-01', investment: 0 } + ]); + }); + }); +}); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts new file mode 100644 index 000000000..96205fd77 --- /dev/null +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts @@ -0,0 +1,238 @@ +import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; +import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { + activityDummyData, + loadActivityExportFile, + symbolProfileDummyData, + userDummyData +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; +import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; +import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; +import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock'; +import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/app/redis-cache/redis-cache.service.mock'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; +import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; +import { parseDate } from '@ghostfolio/common/helper'; +import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; + +import { Big } from 'big.js'; +import { join } from 'path'; + +jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { + return { + // eslint-disable-next-line @typescript-eslint/naming-convention + CurrentRateService: jest.fn().mockImplementation(() => { + return CurrentRateServiceMock; + }) + }; +}); + +jest.mock( + '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', + () => { + return { + // eslint-disable-next-line @typescript-eslint/naming-convention + PortfolioSnapshotService: jest.fn().mockImplementation(() => { + return PortfolioSnapshotServiceMock; + }) + }; + } +); + +jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { + return { + // eslint-disable-next-line @typescript-eslint/naming-convention + RedisCacheService: jest.fn().mockImplementation(() => { + return RedisCacheServiceMock; + }) + }; +}); + +describe('PortfolioCalculator', () => { + let activityDtos: CreateOrderDto[]; + + let configurationService: ConfigurationService; + let currentRateService: CurrentRateService; + let exchangeRateDataService: ExchangeRateDataService; + let portfolioCalculatorFactory: PortfolioCalculatorFactory; + let portfolioSnapshotService: PortfolioSnapshotService; + let redisCacheService: RedisCacheService; + + beforeAll(() => { + activityDtos = loadActivityExportFile( + join(__dirname, '../../../../../../../test/import/ok-btcusd.json') + ); + }); + + beforeEach(() => { + configurationService = new ConfigurationService(); + + currentRateService = new CurrentRateService(null, null, null, null); + + exchangeRateDataService = new ExchangeRateDataService( + null, + null, + null, + null + ); + + portfolioSnapshotService = new PortfolioSnapshotService(null); + + redisCacheService = new RedisCacheService(null, null); + + portfolioCalculatorFactory = new PortfolioCalculatorFactory( + configurationService, + currentRateService, + exchangeRateDataService, + portfolioSnapshotService, + redisCacheService + ); + }); + + describe('get current positions', () => { + it.only('with BTCUSD buy (in USD)', async () => { + jest.useFakeTimers().setSystemTime(parseDate('2022-01-14').getTime()); + + const activities: Activity[] = activityDtos.map((activity) => ({ + ...activityDummyData, + ...activity, + date: parseDate(activity.date), + feeInAssetProfileCurrency: 4.46, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'USD', + dataSource: activity.dataSource, + name: 'Bitcoin', + symbol: activity.symbol + }, + unitPriceInAssetProfileCurrency: 44558.42 + })); + + const portfolioCalculator = portfolioCalculatorFactory.createCalculator({ + activities, + calculationType: PerformanceCalculationType.ROAI, + currency: 'USD', + userId: userDummyData.id + }); + + const portfolioSnapshot = await portfolioCalculator.computeSnapshot(); + + const investments = portfolioCalculator.getInvestments(); + + const investmentsByMonth = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'month' + }); + + expect(portfolioSnapshot.historicalData[0]).toEqual({ + date: '2021-12-11', + investmentValueWithCurrencyEffect: 0, + netPerformance: 0, + netPerformanceInPercentage: 0, + netPerformanceInPercentageWithCurrencyEffect: 0, + netPerformanceWithCurrencyEffect: 0, + netWorth: 0, + totalAccountBalance: 0, + totalInvestment: 0, + totalInvestmentValueWithCurrencyEffect: 0, + value: 0, + valueWithCurrencyEffect: 0 + }); + + expect(portfolioSnapshot.historicalData[1]).toEqual({ + date: '2021-12-12', + investmentValueWithCurrencyEffect: 44558.42, + netPerformance: -4.46, + netPerformanceInPercentage: 0, + netPerformanceInPercentageWithCurrencyEffect: 0, + netPerformanceWithCurrencyEffect: -4.46, + netWorth: 44558.42, + totalAccountBalance: 0, + totalInvestment: 44558.42, + totalInvestmentValueWithCurrencyEffect: 44558.42, + value: 44558.42, + valueWithCurrencyEffect: 44558.42 + }); + + expect( + portfolioSnapshot.historicalData[ + portfolioSnapshot.historicalData.length - 1 + ] + ).toEqual({ + date: '2022-01-14', + investmentValueWithCurrencyEffect: 0, + netPerformance: -1463.18, + netPerformanceInPercentage: -0.032837340282712, + netPerformanceInPercentageWithCurrencyEffect: -0.032837340282712, + netPerformanceWithCurrencyEffect: -1463.18, + netWorth: 43099.7, + totalAccountBalance: 0, + totalInvestment: 44558.42, + totalInvestmentValueWithCurrencyEffect: 44558.42, + value: 43099.7, + valueWithCurrencyEffect: 43099.7 + }); + + expect(portfolioSnapshot).toMatchObject({ + currentValueInBaseCurrency: new Big('43099.7'), + errors: [], + hasErrors: false, + positions: [ + { + averagePrice: new Big('44558.42'), + currency: 'USD', + dataSource: 'YAHOO', + dividend: new Big('0'), + dividendInBaseCurrency: new Big('0'), + fee: new Big('4.46'), + feeInBaseCurrency: new Big('4.46'), + firstBuyDate: '2021-12-12', + grossPerformance: new Big('-1458.72'), + grossPerformancePercentage: new Big('-0.03273724696701543726'), + grossPerformancePercentageWithCurrencyEffect: new Big( + '-0.03273724696701543726' + ), + grossPerformanceWithCurrencyEffect: new Big('-1458.72'), + investment: new Big('44558.42'), + investmentWithCurrencyEffect: new Big('44558.42'), + netPerformance: new Big('-1463.18'), + netPerformancePercentage: new Big('-0.03283734028271199921'), + netPerformancePercentageWithCurrencyEffectMap: { + max: new Big('-0.03283734028271199921') + }, + netPerformanceWithCurrencyEffectMap: { + max: new Big('-1463.18') + }, + marketPrice: 43099.7, + marketPriceInBaseCurrency: 43099.7, + quantity: new Big('1'), + symbol: 'BTCUSD', + tags: [], + timeWeightedInvestment: new Big('44558.42'), + timeWeightedInvestmentWithCurrencyEffect: new Big('44558.42'), + transactionCount: 1, + valueInBaseCurrency: new Big('43099.7') + } + ], + totalFeesWithCurrencyEffect: new Big('4.46'), + totalInterestWithCurrencyEffect: new Big('0'), + totalInvestment: new Big('44558.42'), + totalInvestmentWithCurrencyEffect: new Big('44558.42'), + totalLiabilitiesWithCurrencyEffect: new Big('0'), + totalValuablesWithCurrencyEffect: new Big('0') + }); + + expect(investments).toEqual([ + { date: '2021-12-12', investment: new Big('44558.42') } + ]); + + expect(investmentsByMonth).toEqual([ + { date: '2021-12-01', investment: 44558.42 }, + { date: '2022-01-01', investment: 0 } + ]); + }); + }); +}); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts index 8fc179879..4c1962c1b 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts @@ -11,7 +11,6 @@ import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.s import { RedisCacheServiceMock } from '@ghostfolio/api/app/redis-cache/redis-cache.service.mock'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; -import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service.mock'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; @@ -49,18 +48,6 @@ jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { }; }); -jest.mock( - '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service', - () => { - return { - // eslint-disable-next-line @typescript-eslint/naming-convention - ExchangeRateDataService: jest.fn().mockImplementation(() => { - return ExchangeRateDataServiceMock; - }) - }; - } -); - describe('PortfolioCalculator', () => { let configurationService: ConfigurationService; let currentRateService: CurrentRateService; diff --git a/apps/api/src/app/portfolio/current-rate.service.mock.ts b/apps/api/src/app/portfolio/current-rate.service.mock.ts index fab25ae2d..4b4b8f00e 100644 --- a/apps/api/src/app/portfolio/current-rate.service.mock.ts +++ b/apps/api/src/app/portfolio/current-rate.service.mock.ts @@ -47,6 +47,10 @@ function mockGetValue(symbol: string, date: Date) { return { marketPrice: 14156.4 }; } else if (isSameDay(parseDate('2018-01-01'), date)) { return { marketPrice: 13657.2 }; + } else if (isSameDay(parseDate('2021-12-12'), date)) { + return { marketPrice: 50098.3 }; + } else if (isSameDay(parseDate('2022-01-14'), date)) { + return { marketPrice: 43099.7 }; } return { marketPrice: 0 }; diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 6d0cde40e..87b2bc9df 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -748,8 +748,14 @@ export class PortfolioService { ); const historicalDataArray: HistoricalDataItem[] = []; - let maxPrice = Math.max(activitiesOfPosition[0].unitPrice, marketPrice); - let minPrice = Math.min(activitiesOfPosition[0].unitPrice, marketPrice); + let maxPrice = Math.max( + activitiesOfPosition[0].unitPriceInAssetProfileCurrency, + marketPrice + ); + let minPrice = Math.min( + activitiesOfPosition[0].unitPriceInAssetProfileCurrency, + marketPrice + ); if (historicalData[aSymbol]) { let j = -1; @@ -793,9 +799,9 @@ export class PortfolioService { } else { // Add historical entry for buy date, if no historical data available historicalDataArray.push({ - averagePrice: activitiesOfPosition[0].unitPrice, + averagePrice: activitiesOfPosition[0].unitPriceInAssetProfileCurrency, date: firstBuyDate, - marketPrice: activitiesOfPosition[0].unitPrice, + marketPrice: activitiesOfPosition[0].unitPriceInAssetProfileCurrency, quantity: activitiesOfPosition[0].quantity }); } From 456327d199c7e401010b1d0593b7eeefa2b6ebd8 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 27 Apr 2025 14:29:34 +0200 Subject: [PATCH 12/91] Release 2.156.0 (#4614) --- 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 9cace5a3b..918876f6c 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.156.0 - 2025-04-27 ### Changed diff --git a/package-lock.json b/package-lock.json index 91b726ef7..4557a6c61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.155.0", + "version": "2.156.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.155.0", + "version": "2.156.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index a1a4add08..111232548 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.155.0", + "version": "2.156.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From c671ea4022fe6e3d9ec12861c61ee98213df19eb Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Mon, 28 Apr 2025 22:17:35 +0700 Subject: [PATCH 13/91] Feature/add frontend for watchlist (#4604) * Add frontend for watchlist * Update changelog --------- Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- CHANGELOG.md | 6 + .../watchlist/watchlist.controller.ts | 26 ++-- ...reate-watchlist-item-dialog.component.scss | 3 + .../create-watchlist-item-dialog.component.ts | 92 +++++++++++ .../create-watchlist-item-dialog.html | 25 +++ .../interfaces/interfaces.ts | 4 + .../home-watchlist.component.ts | 145 ++++++++++++++++++ .../home-watchlist/home-watchlist.html | 33 ++++ .../home-watchlist/home-watchlist.scss | 3 + .../pages/home/home-page-routing.module.ts | 6 + .../src/app/pages/home/home-page.component.ts | 6 + .../src/app/pages/home/home-page.module.ts | 2 + apps/client/src/app/services/data.service.ts | 12 +- libs/common/src/lib/interfaces/index.ts | 2 + .../responses/watchlist-response.interface.ts | 5 + .../lib/benchmark/benchmark.component.html | 38 +++-- .../src/lib/benchmark/benchmark.component.ts | 2 + 17 files changed, 382 insertions(+), 28 deletions(-) create mode 100644 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.scss create mode 100644 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts create mode 100644 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html create mode 100644 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/interfaces/interfaces.ts create mode 100644 apps/client/src/app/components/home-watchlist/home-watchlist.component.ts create mode 100644 apps/client/src/app/components/home-watchlist/home-watchlist.html create mode 100644 apps/client/src/app/components/home-watchlist/home-watchlist.scss create mode 100644 libs/common/src/lib/interfaces/responses/watchlist-response.interface.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 918876f6c..2e9285773 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Added + +- Introduced a watchlist to follow assets (experimental) + ## 2.156.0 - 2025-04-27 ### Changed diff --git a/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts b/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts index 0d25172c8..c9e41d5d3 100644 --- a/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts +++ b/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts @@ -2,7 +2,7 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorat import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor'; -import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; +import { WatchlistResponse } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import { RequestWithUser } from '@ghostfolio/common/types'; @@ -53,13 +53,13 @@ export class WatchlistController { @Param('dataSource') dataSource: DataSource, @Param('symbol') symbol: string ) { - const watchlistItem = await this.watchlistService - .getWatchlistItems(this.request.user.id) - .then((items) => { - return items.find((item) => { - return item.dataSource === dataSource && item.symbol === symbol; - }); - }); + const watchlistItems = await this.watchlistService.getWatchlistItems( + this.request.user.id + ); + + const watchlistItem = watchlistItems.find((item) => { + return item.dataSource === dataSource && item.symbol === symbol; + }); if (!watchlistItem) { throw new HttpException( @@ -79,7 +79,13 @@ export class WatchlistController { @HasPermission(permissions.readWatchlist) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(TransformDataSourceInResponseInterceptor) - public async getWatchlistItems(): Promise { - return this.watchlistService.getWatchlistItems(this.request.user.id); + public async getWatchlistItems(): Promise { + const watchlist = await this.watchlistService.getWatchlistItems( + this.request.user.id + ); + + return { + watchlist + }; } } diff --git a/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.scss b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.scss new file mode 100644 index 000000000..5d4e87f30 --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.scss @@ -0,0 +1,3 @@ +:host { + display: block; +} diff --git a/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts new file mode 100644 index 000000000..722f680c3 --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts @@ -0,0 +1,92 @@ +import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete'; + +import { CommonModule } from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, + OnDestroy, + OnInit +} from '@angular/core'; +import { + AbstractControl, + FormBuilder, + FormControl, + FormGroup, + FormsModule, + ReactiveFormsModule, + ValidationErrors, + Validators +} from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { Subject } from 'rxjs'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + host: { class: 'h-100' }, + imports: [ + CommonModule, + FormsModule, + GfSymbolAutocompleteComponent, + MatButtonModule, + MatDialogModule, + MatFormFieldModule, + ReactiveFormsModule + ], + selector: 'gf-create-watchlist-item-dialog', + styleUrls: ['./create-watchlist-item-dialog.component.scss'], + templateUrl: 'create-watchlist-item-dialog.html' +}) +export class CreateWatchlistItemDialogComponent implements OnInit, OnDestroy { + public createWatchlistItemForm: FormGroup; + + private unsubscribeSubject = new Subject(); + + public constructor( + public readonly dialogRef: MatDialogRef, + public readonly formBuilder: FormBuilder + ) {} + + public ngOnInit() { + this.createWatchlistItemForm = this.formBuilder.group( + { + searchSymbol: new FormControl(null, [Validators.required]) + }, + { + validators: this.validator + } + ); + } + + public onCancel() { + this.dialogRef.close(); + } + + public onSubmit() { + this.dialogRef.close({ + dataSource: + this.createWatchlistItemForm.get('searchSymbol').value.dataSource, + symbol: this.createWatchlistItemForm.get('searchSymbol').value.symbol + }); + } + + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } + + private validator(control: AbstractControl): ValidationErrors { + const searchSymbolControl = control.get('searchSymbol'); + + if ( + searchSymbolControl.valid && + searchSymbolControl.value.dataSource && + searchSymbolControl.value.symbol + ) { + return { incomplete: false }; + } + + return { incomplete: true }; + } +} diff --git a/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html new file mode 100644 index 000000000..dd59a9309 --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html @@ -0,0 +1,25 @@ +
+

Add asset to watchlist

+
+ + Name, symbol or ISIN + + +
+
+ + +
+
diff --git a/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/interfaces/interfaces.ts new file mode 100644 index 000000000..c0f74d022 --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/interfaces/interfaces.ts @@ -0,0 +1,4 @@ +export interface CreateWatchlistItemDialogParams { + deviceType: string; + locale: string; +} diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts new file mode 100644 index 000000000..0198ab27a --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts @@ -0,0 +1,145 @@ +import { DataService } from '@ghostfolio/client/services/data.service'; +import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { Benchmark, User } from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark'; +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; + +import { CommonModule } from '@angular/common'; +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + CUSTOM_ELEMENTS_SCHEMA, + OnDestroy, + OnInit +} from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialog } from '@angular/material/dialog'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; +import { DeviceDetectorService } from 'ngx-device-detector'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { CreateWatchlistItemDialogComponent } from './create-watchlist-item-dialog/create-watchlist-item-dialog.component'; +import { CreateWatchlistItemDialogParams } from './create-watchlist-item-dialog/interfaces/interfaces'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + GfBenchmarkComponent, + GfPremiumIndicatorComponent, + MatButtonModule, + RouterModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + selector: 'gf-home-watchlist', + styleUrls: ['./home-watchlist.scss'], + templateUrl: './home-watchlist.html' +}) +export class HomeWatchlistComponent implements OnDestroy, OnInit { + public deviceType: string; + public hasPermissionToCreateWatchlistItem: boolean; + public user: User; + public watchlist: Benchmark[]; + + private unsubscribeSubject = new Subject(); + + public constructor( + private changeDetectorRef: ChangeDetectorRef, + private dataService: DataService, + private deviceService: DeviceDetectorService, + private dialog: MatDialog, + private route: ActivatedRoute, + private router: Router, + private userService: UserService + ) { + this.deviceType = this.deviceService.getDeviceInfo().deviceType; + + this.route.queryParams + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((params) => { + if (params['createWatchlistItemDialog']) { + this.openCreateWatchlistItemDialog(); + } + }); + + this.userService.stateChanged + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((state) => { + if (state?.user) { + this.user = state.user; + + this.hasPermissionToCreateWatchlistItem = hasPermission( + this.user.permissions, + permissions.createWatchlistItem + ); + + this.changeDetectorRef.markForCheck(); + } + }); + } + + public ngOnInit() { + this.loadWatchlistData(); + } + + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } + + private loadWatchlistData() { + this.dataService + .fetchWatchlist() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ watchlist }) => { + this.watchlist = watchlist.map(({ dataSource, symbol }) => ({ + dataSource, + symbol, + marketCondition: null, + name: symbol, + performances: null, + trend50d: 'UNKNOWN', + trend200d: 'UNKNOWN' + })); + + this.changeDetectorRef.markForCheck(); + }); + } + + private openCreateWatchlistItemDialog() { + this.userService + .get() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((user) => { + this.user = user; + + const dialogRef = this.dialog.open(CreateWatchlistItemDialogComponent, { + autoFocus: false, + data: { + deviceType: this.deviceType, + locale: this.user?.settings?.locale + } as CreateWatchlistItemDialogParams, + width: this.deviceType === 'mobile' ? '100vw' : '50rem' + }); + + dialogRef + .afterClosed() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ dataSource, symbol } = {}) => { + if (dataSource && symbol) { + this.dataService + .postWatchlistItem({ dataSource, symbol }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe({ + next: () => this.loadWatchlistData() + }); + } + + this.router.navigate(['.'], { relativeTo: this.route }); + }); + }); + } +} diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.html b/apps/client/src/app/components/home-watchlist/home-watchlist.html new file mode 100644 index 000000000..0a2e37279 --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.html @@ -0,0 +1,33 @@ +
+

+ + Watchlist + @if (user?.subscription?.type === 'Basic') { + + } + +

+
+
+ +
+
+
+@if (hasPermissionToCreateWatchlistItem) { +
+} diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.scss b/apps/client/src/app/components/home-watchlist/home-watchlist.scss new file mode 100644 index 000000000..5d4e87f30 --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.scss @@ -0,0 +1,3 @@ +:host { + display: block; +} 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 f50b55192..9a915f0b3 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 @@ -2,6 +2,7 @@ import { HomeHoldingsComponent } from '@ghostfolio/client/components/home-holdin import { HomeMarketComponent } from '@ghostfolio/client/components/home-market/home-market.component'; import { HomeOverviewComponent } from '@ghostfolio/client/components/home-overview/home-overview.component'; 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 { NgModule } from '@angular/core'; @@ -36,6 +37,11 @@ const routes: Routes = [ path: 'market', component: HomeMarketComponent, title: $localize`Markets` + }, + { + path: 'watchlist', + component: HomeWatchlistComponent, + title: $localize`Watchlist` } ], component: HomePageComponent, 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 e307884f8..70e0c34fe 100644 --- a/apps/client/src/app/pages/home/home-page.component.ts +++ b/apps/client/src/app/pages/home/home-page.component.ts @@ -52,6 +52,12 @@ export class HomePageComponent implements OnDestroy, OnInit { iconName: 'newspaper-outline', label: $localize`Markets`, path: ['/home', 'market'] + }, + { + iconName: 'star-outline', + label: $localize`Watchlist`, + path: ['/home', 'watchlist'], + showCondition: this.user?.settings?.isExperimentalFeatures } ]; this.user = state.user; diff --git a/apps/client/src/app/pages/home/home-page.module.ts b/apps/client/src/app/pages/home/home-page.module.ts index 045cfa8c0..32f031e4e 100644 --- a/apps/client/src/app/pages/home/home-page.module.ts +++ b/apps/client/src/app/pages/home/home-page.module.ts @@ -2,6 +2,7 @@ import { GfHomeHoldingsModule } from '@ghostfolio/client/components/home-holding import { GfHomeMarketModule } from '@ghostfolio/client/components/home-market/home-market.module'; import { GfHomeOverviewModule } from '@ghostfolio/client/components/home-overview/home-overview.module'; import { GfHomeSummaryModule } from '@ghostfolio/client/components/home-summary/home-summary.module'; +import { HomeWatchlistComponent } from '@ghostfolio/client/components/home-watchlist/home-watchlist.component'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -20,6 +21,7 @@ import { HomePageComponent } from './home-page.component'; GfHomeOverviewModule, GfHomeSummaryModule, HomePageRoutingModule, + HomeWatchlistComponent, MatTabsModule, RouterModule ], diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 55d76d667..526c61972 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -6,6 +6,7 @@ import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto import { UpdateBulkMarketDataDto } from '@ghostfolio/api/app/admin/update-bulk-market-data.dto'; import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto'; +import { CreateWatchlistItemDto } from '@ghostfolio/api/app/endpoints/watchlist/create-watchlist-item.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; import { Activities, @@ -44,7 +45,8 @@ import { PortfolioPerformanceResponse, PortfolioReportResponse, PublicPortfolioResponse, - User + User, + WatchlistResponse } from '@ghostfolio/common/interfaces'; import { filterGlobalPermissions } from '@ghostfolio/common/permissions'; import type { @@ -686,6 +688,10 @@ export class DataService { return this.http.get('/api/v1/tags'); } + public fetchWatchlist() { + return this.http.get('/api/v1/watchlist'); + } + public generateAccessToken(aUserId: string) { return this.http.post( `/api/v1/user/${aUserId}/access-token`, @@ -748,6 +754,10 @@ export class DataService { return this.http.post('/api/v1/user', {}); } + public postWatchlistItem(watchlistItem: CreateWatchlistItemDto) { + return this.http.post('/api/v1/watchlist', watchlistItem); + } + public putAccount(aAccount: UpdateAccountDto) { return this.http.put(`/api/v1/account/${aAccount.id}`, aAccount); } diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index c93ab2d27..b83b6d5f8 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -57,6 +57,7 @@ import type { PortfolioPerformanceResponse } from './responses/portfolio-perform import type { PortfolioReportResponse } from './responses/portfolio-report.interface'; import type { PublicPortfolioResponse } from './responses/public-portfolio-response.interface'; import type { QuotesResponse } from './responses/quotes-response.interface'; +import type { WatchlistResponse } from './responses/watchlist-response.interface'; import type { ScraperConfiguration } from './scraper-configuration.interface'; import type { Statistics } from './statistics.interface'; import type { SubscriptionOffer } from './subscription-offer.interface'; @@ -135,5 +136,6 @@ export { ToggleOption, User, UserSettings, + WatchlistResponse, XRayRulesSettings }; diff --git a/libs/common/src/lib/interfaces/responses/watchlist-response.interface.ts b/libs/common/src/lib/interfaces/responses/watchlist-response.interface.ts new file mode 100644 index 000000000..3cdc834b4 --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/watchlist-response.interface.ts @@ -0,0 +1,5 @@ +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; + +export interface WatchlistResponse { + watchlist: AssetProfileIdentifier[]; +} diff --git a/libs/ui/src/lib/benchmark/benchmark.component.html b/libs/ui/src/lib/benchmark/benchmark.component.html index 8867e1c9e..8e8a30202 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.html +++ b/libs/ui/src/lib/benchmark/benchmark.component.html @@ -66,11 +66,13 @@
- + @if (element?.performances?.allTimeHigh?.date) { + + }
@@ -83,18 +85,20 @@ from ATH - + @if (isNumber(element?.performances?.allTimeHigh?.performancePercent)) { + + } diff --git a/libs/ui/src/lib/benchmark/benchmark.component.ts b/libs/ui/src/lib/benchmark/benchmark.component.ts index cc5815a0c..0c5e8854a 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.ts +++ b/libs/ui/src/lib/benchmark/benchmark.component.ts @@ -20,6 +20,7 @@ import { import { MatDialog } from '@angular/material/dialog'; import { MatTableModule } from '@angular/material/table'; import { ActivatedRoute, Router, RouterModule } from '@angular/router'; +import { isNumber } from 'lodash'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject, takeUntil } from 'rxjs'; @@ -49,6 +50,7 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy { public displayedColumns = ['name', 'date', 'change', 'marketCondition']; public isLoading = true; + public isNumber = isNumber; public resolveMarketCondition = resolveMarketCondition; public translate = translate; From 398833a0e34e54c3513a475b4bbcd28b1acda4d1 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 28 Apr 2025 18:26:07 +0200 Subject: [PATCH 14/91] Feature/improve wording of data providers management (#4617) * Improve wording --- .../admin-settings.component.ts | 6 +-- .../ghostfolio-premium-api-dialog.html | 37 ++++++++----------- .../interfaces/interfaces.ts | 3 -- 3 files changed, 19 insertions(+), 27 deletions(-) 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 be077c0e6..d72466bb4 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 @@ -25,6 +25,7 @@ import { DeviceDetectorService } from 'ngx-device-detector'; import { catchError, filter, of, Subject, takeUntil } from 'rxjs'; import { GfGhostfolioPremiumApiDialogComponent } from './ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.component'; +import { GhostfolioPremiumApiDialogParams } from './ghostfolio-premium-api-dialog/interfaces/interfaces'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -101,9 +102,8 @@ export class AdminSettingsComponent implements OnDestroy, OnInit { autoFocus: false, data: { deviceType: this.deviceType, - pricingUrl: this.pricingUrl, - user: this.user - }, + pricingUrl: this.pricingUrl + } as GhostfolioPremiumApiDialogParams, height: this.deviceType === 'mobile' ? '98vh' : undefined, width: this.deviceType === 'mobile' ? '100vw' : '50rem' } diff --git a/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html b/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html index d3b0985fa..017133f5b 100644 --- a/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html +++ b/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html @@ -7,8 +7,8 @@ />
-

- The official +

+ Early access to the official data provider for self-hosters, offering 80’000+ tickers from over 50 exchanges, is - coming soon! -

-

- Want to stay updated? Click below to get notified as soon as it’s available. + ready now!

Notify meGet Early Access +
+ or +
+ - } + I have an API key +
diff --git a/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/interfaces/interfaces.ts index 157a6f414..0c629599e 100644 --- a/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/interfaces/interfaces.ts @@ -1,7 +1,4 @@ -import { User } from '@ghostfolio/common/interfaces'; - export interface GhostfolioPremiumApiDialogParams { deviceType: string; pricingUrl: string; - user: User; } From 7d0af340345cd6faec8f967368e307ca420ff926 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 18:26:26 +0200 Subject: [PATCH 15/91] Feature/update locales (#4619) * 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 | 4 ++ apps/client/src/locales/messages.ca.xlf | 54 +++++++++++++++++++++---- apps/client/src/locales/messages.de.xlf | 54 +++++++++++++++++++++---- apps/client/src/locales/messages.es.xlf | 54 +++++++++++++++++++++---- apps/client/src/locales/messages.fr.xlf | 54 +++++++++++++++++++++---- apps/client/src/locales/messages.it.xlf | 54 +++++++++++++++++++++---- apps/client/src/locales/messages.nl.xlf | 54 +++++++++++++++++++++---- apps/client/src/locales/messages.pl.xlf | 54 +++++++++++++++++++++---- apps/client/src/locales/messages.pt.xlf | 54 +++++++++++++++++++++---- apps/client/src/locales/messages.tr.xlf | 54 +++++++++++++++++++++---- apps/client/src/locales/messages.uk.xlf | 54 +++++++++++++++++++++---- apps/client/src/locales/messages.xlf | 51 +++++++++++++++++++---- apps/client/src/locales/messages.zh.xlf | 54 +++++++++++++++++++++---- 13 files changed, 565 insertions(+), 84 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e9285773..ad1250c87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Introduced a watchlist to follow assets (experimental) +### Changed + +- Improved the language localization for German (`de`) + ## 2.156.0 - 2025-04-27 ### Changed diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 94b8635b5..e69019384 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -1473,6 +1473,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -1517,6 +1521,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1937,6 +1945,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -4067,11 +4079,11 @@ Holdings apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -4087,7 +4099,7 @@ Summary apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -4099,7 +4111,7 @@ Markets apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -4943,7 +4955,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6115,7 +6127,7 @@ Change from All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -6123,7 +6135,7 @@ from ATH libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -7933,6 +7945,34 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index afdcb1253..893d322db 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -500,6 +500,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -544,6 +548,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1974,7 +1982,7 @@ Märkte apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -2154,11 +2162,11 @@ Positionen apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -2228,6 +2236,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -2534,7 +2546,7 @@ Änderung vom Allzeithoch libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -2542,7 +2554,7 @@ vom AZH libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -3342,7 +3354,7 @@ Zusammenfassung apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -4678,7 +4690,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7933,6 +7945,34 @@ 33 + + Add asset to watchlist + Anlage zur Beobachtungsliste hinzufügen + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Beobachtungsliste + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Beobachtungsliste + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 6e6f6d3f1..6ada98e89 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -501,6 +501,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -545,6 +549,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1959,7 +1967,7 @@ Mercados apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -2139,11 +2147,11 @@ Participaciones apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -2213,6 +2221,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -2519,7 +2531,7 @@ Variación respecto al máximo histórico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -2527,7 +2539,7 @@ desde el máximo histórico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -3327,7 +3339,7 @@ Resumen apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -4655,7 +4667,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7934,6 +7946,34 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index c4536731e..f90d72ed8 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -556,6 +556,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -600,6 +604,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -2346,11 +2354,11 @@ Positions apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -2366,7 +2374,7 @@ Résumé apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -2378,7 +2386,7 @@ Marchés apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -2448,6 +2456,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -3038,7 +3050,7 @@ Différence avec le Record Historique libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -3046,7 +3058,7 @@ par rapport au record historique libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -4654,7 +4666,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7933,6 +7945,34 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index e8b29147f..b618d9f5e 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -501,6 +501,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -545,6 +549,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1959,7 +1967,7 @@ Mercati apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -2139,11 +2147,11 @@ Partecipazioni apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -2213,6 +2221,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -2519,7 +2531,7 @@ Variazione rispetto al massimo storico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -2527,7 +2539,7 @@ dal massimo storico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -3327,7 +3339,7 @@ Summario apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -4655,7 +4667,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7934,6 +7946,34 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 3ea7934ae..18d6da558 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -500,6 +500,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -544,6 +548,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1958,7 +1966,7 @@ Markten apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -2138,11 +2146,11 @@ Posities apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -2212,6 +2220,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -2518,7 +2530,7 @@ Verandering van All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -2526,7 +2538,7 @@ van ATH libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -3326,7 +3338,7 @@ Samenvatting apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -4654,7 +4666,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7933,6 +7945,34 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 99418ceb0..a5a4f25a3 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -1365,6 +1365,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -1409,6 +1413,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1761,6 +1769,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -3695,11 +3707,11 @@ Inwestycje apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -3715,7 +3727,7 @@ Podsumowanie apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -3727,7 +3739,7 @@ Rynki apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -4555,7 +4567,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5539,7 +5551,7 @@ Zmiana od Najwyższego Punktu w Historii libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -5547,7 +5559,7 @@ od ATH libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -7933,6 +7945,34 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index f83a0c9c8..0e8af1bcf 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -556,6 +556,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -600,6 +604,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -2290,7 +2298,7 @@ Mercados apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -2360,6 +2368,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -2662,11 +2674,11 @@ Posições apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -2910,7 +2922,7 @@ Diferença desde o Máximo Histórico libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -2918,7 +2930,7 @@ a partir do ATH (All Time High) libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -3274,7 +3286,7 @@ Sumário apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -4654,7 +4666,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7933,6 +7945,34 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 7b8f9fcf3..ec6d15e93 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -1325,6 +1325,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -1369,6 +1373,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1665,6 +1673,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -3251,11 +3263,11 @@ Varlıklar apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -3271,7 +3283,7 @@ Özet apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -3283,7 +3295,7 @@ Piyasalar apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -4043,7 +4055,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5227,7 +5239,7 @@ Tüm Zamanların En Yüksek Seviyesinden (ATH) Değişim libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -5235,7 +5247,7 @@ Tüm Zamanların En Yüksek Seviyesinden libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -7933,6 +7945,34 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 8b887cfec..1991af915 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -1817,6 +1817,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -1861,6 +1865,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1925,6 +1933,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -4299,11 +4311,11 @@ Активи apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -4319,7 +4331,7 @@ Зведення apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -4331,7 +4343,7 @@ Ринки apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -5211,7 +5223,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6761,7 +6773,7 @@ Зміна від Історичного Максимуму libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -6769,7 +6781,7 @@ від ІМ libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -7933,6 +7945,34 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index aa91e90d0..6b62d6ca2 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -1315,6 +1315,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -1358,6 +1362,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1703,6 +1711,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -3442,11 +3454,11 @@ Holdings apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -3461,7 +3473,7 @@ Summary apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -3472,7 +3484,7 @@ Markets apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -4209,7 +4221,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5134,14 +5146,14 @@ Change from All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 from ATH libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -7172,6 +7184,31 @@ 33 + + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + + + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 6a18716da..2d046e2cf 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -1374,6 +1374,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -1418,6 +1422,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1770,6 +1778,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -3704,11 +3716,11 @@ 控股 apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -3724,7 +3736,7 @@ 概括 apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -3736,7 +3748,7 @@ 市场 apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -4564,7 +4576,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5596,7 +5608,7 @@ 从历史最高点开始变化 libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -5604,7 +5616,7 @@ 来自 ATH libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -7934,6 +7946,34 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + From fe1df8095a872384875313cd4168a024b136ff16 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 18:53:33 +0200 Subject: [PATCH 16/91] Feature/update locales (#4620) * Update locales * Update translations --------- Co-authored-by: github-actions[bot] Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- apps/client/src/locales/messages.ca.xlf | 34 ++++++++++--------------- apps/client/src/locales/messages.de.xlf | 34 ++++++++++--------------- apps/client/src/locales/messages.es.xlf | 34 ++++++++++--------------- apps/client/src/locales/messages.fr.xlf | 34 ++++++++++--------------- apps/client/src/locales/messages.it.xlf | 34 ++++++++++--------------- apps/client/src/locales/messages.nl.xlf | 34 ++++++++++--------------- apps/client/src/locales/messages.pl.xlf | 34 ++++++++++--------------- apps/client/src/locales/messages.pt.xlf | 34 ++++++++++--------------- apps/client/src/locales/messages.tr.xlf | 34 ++++++++++--------------- apps/client/src/locales/messages.uk.xlf | 34 ++++++++++--------------- apps/client/src/locales/messages.xlf | 31 +++++++++------------- apps/client/src/locales/messages.zh.xlf | 34 ++++++++++--------------- 12 files changed, 155 insertions(+), 250 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index e69019384..ca6e80c14 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -653,7 +653,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 75 apps/client/src/app/components/header/header.component.ts @@ -2807,7 +2807,7 @@ or apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -7274,14 +7274,6 @@ 70 - - Want to stay updated? Click below to get notified as soon as it’s available. - Want to stay updated? Click below to get notified as soon as it’s available. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 - - Get access to 80’000+ tickers from over 50 exchanges Get access to 80’000+ tickers from over 50 exchanges @@ -7409,7 +7401,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 94 @@ -7420,20 +7412,12 @@ 41 - - Notify me - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7973,6 +7957,14 @@ 58 + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 893d322db..5a38fd4a0 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -1074,7 +1074,7 @@ oder apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -5453,7 +5453,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 75 apps/client/src/app/components/header/header.component.ts @@ -7298,14 +7298,6 @@ 70 - - Want to stay updated? Click below to get notified as soon as it’s available. - Möchtest du auf dem Laufenden bleiben? Dann klicke unten, um benachrichtigt zu werden, sobald es verfügbar ist. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 - - Get access to 80’000+ tickers from over 50 exchanges Erhalte Zugang zu 80’000+ Tickern von über 50 Handelsplätzen @@ -7433,7 +7425,7 @@ Möchtest du den API-Schlüssel wirklich löschen? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 94 @@ -7444,20 +7436,12 @@ 41 - - Notify me - Benachrichtige mich - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key Ich habe einen API-Schlüssel apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7973,6 +7957,14 @@ 58 + + Get Early Access + Early Access erhalten + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 6ada98e89..a5e69957f 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -1059,7 +1059,7 @@ o apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -5430,7 +5430,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 75 apps/client/src/app/components/header/header.component.ts @@ -7275,14 +7275,6 @@ 70 - - Want to stay updated? Click below to get notified as soon as it’s available. - Want to stay updated? Click below to get notified as soon as it’s available. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 - - Get access to 80’000+ tickers from over 50 exchanges Get access to 80’000+ tickers from over 50 exchanges @@ -7410,7 +7402,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 94 @@ -7421,20 +7413,12 @@ 41 - - Notify me - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7974,6 +7958,14 @@ 58 + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index f90d72ed8..70620ba13 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -1410,7 +1410,7 @@ ou apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -5429,7 +5429,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 75 apps/client/src/app/components/header/header.component.ts @@ -7274,14 +7274,6 @@ 70 - - Want to stay updated? Click below to get notified as soon as it’s available. - Vous souhaitez rester informé ? Cliquez ci-dessous pour être informé dès qu’il sera disponible. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 - - Get access to 80’000+ tickers from over 50 exchanges Accédez à plus de 80 000 symboles financiers issus de plus de 50 marchés boursiers. @@ -7409,7 +7401,7 @@ Voulez-vous vraiment supprimer la clé API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 94 @@ -7420,20 +7412,12 @@ 41 - - Notify me - Me prévenir - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key J’ai une clé API apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7973,6 +7957,14 @@ 58 + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index b618d9f5e..b164d4cd1 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -1059,7 +1059,7 @@ oppure apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -5430,7 +5430,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 75 apps/client/src/app/components/header/header.component.ts @@ -7275,14 +7275,6 @@ 70 - - Want to stay updated? Click below to get notified as soon as it’s available. - Vuoi seguire le novità? Clicca sotto per essere notificato appena è disponibile. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 - - Get access to 80’000+ tickers from over 50 exchanges Ottieni accesso a oltre 100’000+ titoli da oltre 50 borse @@ -7410,7 +7402,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 94 @@ -7421,20 +7413,12 @@ 41 - - Notify me - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7974,6 +7958,14 @@ 58 + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 18d6da558..805cf1eff 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -1058,7 +1058,7 @@ of apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -5429,7 +5429,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 75 apps/client/src/app/components/header/header.component.ts @@ -7274,14 +7274,6 @@ 70 - - Want to stay updated? Click below to get notified as soon as it’s available. - Want to stay updated? Click below to get notified as soon as it’s available. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 - - Get access to 80’000+ tickers from over 50 exchanges Get access to 80’000+ tickers from over 50 exchanges @@ -7409,7 +7401,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 94 @@ -7420,20 +7412,12 @@ 41 - - Notify me - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7973,6 +7957,14 @@ 58 + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index a5a4f25a3..818f0e0ce 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -272,7 +272,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 75 apps/client/src/app/components/header/header.component.ts @@ -2463,7 +2463,7 @@ lub apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -7274,14 +7274,6 @@ 70 - - Want to stay updated? Click below to get notified as soon as it’s available. - Chcesz być na bieżąco? Kliknij poniżej, aby otrzymać powiadomienie, gdy tylko będzie dostępne. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 - - 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 @@ -7409,7 +7401,7 @@ Czy na pewno chcesz usunąć klucz API?? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 94 @@ -7420,20 +7412,12 @@ 41 - - Notify me - Powiadom mnie - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key Posiadam klucz API apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7973,6 +7957,14 @@ 58 + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 0e8af1bcf..f506af000 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -1290,7 +1290,7 @@ ou apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -5429,7 +5429,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 75 apps/client/src/app/components/header/header.component.ts @@ -7274,14 +7274,6 @@ 70 - - Want to stay updated? Click below to get notified as soon as it’s available. - Want to stay updated? Click below to get notified as soon as it’s available. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 - - Get access to 80’000+ tickers from over 50 exchanges Get access to 80’000+ tickers from over 50 exchanges @@ -7409,7 +7401,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 94 @@ -7420,20 +7412,12 @@ 41 - - Notify me - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7973,6 +7957,14 @@ 58 + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index ec6d15e93..2d79bc69c 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -272,7 +272,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 75 apps/client/src/app/components/header/header.component.ts @@ -2311,7 +2311,7 @@ veya apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -7274,14 +7274,6 @@ 70 - - Want to stay updated? Click below to get notified as soon as it’s available. - Want to stay updated? Click below to get notified as soon as it’s available. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 - - Get access to 80’000+ tickers from over 50 exchanges Get access to 80’000+ tickers from over 50 exchanges @@ -7409,7 +7401,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 94 @@ -7420,20 +7412,12 @@ 41 - - Notify me - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7973,6 +7957,14 @@ 58 + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 1991af915..b466fb37e 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -653,7 +653,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 75 apps/client/src/app/components/header/header.component.ts @@ -2235,7 +2235,7 @@ Ви дійсно хочете видалити ключ API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 94 @@ -2246,28 +2246,12 @@ 57 - - Want to stay updated? Click below to get notified as soon as it’s available. - Хочете залишатися в курсі? Натисніть нижче, щоб отримати сповіщення, як тільки це буде доступно. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 - - - - Notify me - Сповістіть мене - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - or або apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2294,12 +2278,12 @@ 29 - + I have an API key У мене є ключ API apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7973,6 +7957,14 @@ 58 + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 6b62d6ca2..d38d53231 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -267,7 +267,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 75 apps/client/src/app/components/header/header.component.ts @@ -2333,7 +2333,7 @@ or apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -6599,13 +6599,6 @@ 40 - - Want to stay updated? Click below to get notified as soon as it’s available. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 - - Ukraine @@ -6722,25 +6715,18 @@ 42 - - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 94 - + I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7209,6 +7195,13 @@ 4 + + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 2d046e2cf..e9dddf34b 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -273,7 +273,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 75 apps/client/src/app/components/header/header.component.ts @@ -2472,7 +2472,7 @@ apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -7275,14 +7275,6 @@ 70 - - Want to stay updated? Click below to get notified as soon as it’s available. - Want to stay updated? Click below to get notified as soon as it’s available. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 - - Get access to 80’000+ tickers from over 50 exchanges Get access to 80’000+ tickers from over 50 exchanges @@ -7410,7 +7402,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 94 @@ -7421,20 +7413,12 @@ 41 - - Notify me - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7974,6 +7958,14 @@ 58 + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + From 34f191ef7a5cde87ebdf373bc209e7c9dc097e4e Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 28 Apr 2025 18:53:55 +0200 Subject: [PATCH 17/91] Feature/change column label in benchmark component (#4616) * Generalize column label * Update changelog --- CHANGELOG.md | 1 + libs/ui/src/lib/benchmark/benchmark.component.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad1250c87..daa650aa7 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 +- Changed the column label from _Index_ to _Name_ in the benchmark component - Improved the language localization for German (`de`) ## 2.156.0 - 2025-04-27 diff --git a/libs/ui/src/lib/benchmark/benchmark.component.html b/libs/ui/src/lib/benchmark/benchmark.component.html index 8e8a30202..270690f35 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.html +++ b/libs/ui/src/lib/benchmark/benchmark.component.html @@ -1,6 +1,6 @@ - + From 1b5a65d391952797f380c3d1862134ce4da1b47f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 19:28:12 +0200 Subject: [PATCH 18/91] Feature/update locales (#4621) 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 | 11 ++++------- apps/client/src/locales/messages.zh.xlf | 12 ++++-------- 12 files changed, 48 insertions(+), 95 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index ca6e80c14..f94cd9b80 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -1069,6 +1069,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -6090,14 +6094,6 @@ 197 - - Index - Index - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - 50-Day Trend 50-Day Trend diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 5a38fd4a0..a8ddcfd0c 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -164,6 +164,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -2533,14 +2537,6 @@ 229 - - Index - Index - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Change from All Time High Änderung vom Allzeithoch diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index a5e69957f..d321f5bde 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -165,6 +165,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -2518,14 +2522,6 @@ 229 - - Index - Índice - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Change from All Time High Variación respecto al máximo histórico (ATH) diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 70620ba13..d939feb0a 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -172,6 +172,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -3037,14 +3041,6 @@ 229 - - Index - Indice - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Change from All Time High Différence avec le Record Historique diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index b164d4cd1..76de15e87 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -165,6 +165,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -2518,14 +2522,6 @@ 229 - - Index - Indice - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Change from All Time High Variazione rispetto al massimo storico (ATH) diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 805cf1eff..4a30b72ad 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -164,6 +164,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -2517,14 +2521,6 @@ 229 - - Index - Index - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Change from All Time High Verandering van All Time High diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 818f0e0ce..82d530de3 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -997,6 +997,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -5530,14 +5534,6 @@ 67 - - Index - Indeks - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Last All Time High Ostatni Najwyższy Punkt w Historii diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index f506af000..d9b68e76d 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -172,6 +172,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -2909,14 +2913,6 @@ 229 - - Index - Índice - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Change from All Time High Diferença desde o Máximo Histórico diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 2d79bc69c..75b9b407f 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -957,6 +957,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -5226,14 +5230,6 @@ 229 - - Index - Endeks - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Change from All Time High Tüm Zamanların En Yüksek Seviyesinden (ATH) Değişim diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index b466fb37e..423876a65 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -1085,6 +1085,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -6720,14 +6724,6 @@ 197 - - Index - Індекс - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - 50-Day Trend Тренд на 50 днів diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index d38d53231..d5e6126a5 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -969,6 +969,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -5114,13 +5118,6 @@ 67 - - Index - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - 50-Day Trend diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index e9dddf34b..c32a62f7d 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -1006,6 +1006,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -5571,14 +5575,6 @@ 67 - - Index - 指数 - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - 50-Day Trend 50 天趋势 From b90bfc3d6e3b62ae9740f63c6b6dfb545b22131e Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 28 Apr 2025 19:42:39 +0200 Subject: [PATCH 19/91] Feature/extend data providers management of admin control panel (#4615) * Extend data providers management * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/admin/admin.controller.ts | 2 +- apps/api/src/app/admin/admin.service.ts | 11 +- .../ghostfolio/ghostfolio.service.ts | 10 +- .../alpha-vantage/alpha-vantage.service.ts | 1 + .../coingecko/coingecko.service.ts | 1 + .../data-provider/data-provider.service.ts | 5 +- .../eod-historical-data.service.ts | 1 + .../financial-modeling-prep.service.ts | 1 + .../ghostfolio/ghostfolio.service.ts | 3 +- .../google-sheets/google-sheets.service.ts | 1 + .../data-provider/manual/manual.service.ts | 1 + .../rapid-api/rapid-api.service.ts | 1 + .../yahoo-finance/yahoo-finance.service.ts | 1 + .../admin-settings.component.html | 152 ++++++++++-------- .../admin-settings.component.ts | 49 ++++-- .../admin-settings/admin-settings.module.ts | 2 + apps/client/src/app/services/admin.service.ts | 26 ++- .../lib/interfaces/admin-data.interface.ts | 3 + .../data-provider-info.interface.ts | 3 + 20 files changed, 172 insertions(+), 103 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index daa650aa7..87f700f30 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 - Changed the column label from _Index_ to _Name_ in the benchmark component +- Extended the data providers management of the admin control panel - Improved the language localization for German (`de`) ## 2.156.0 - 2025-04-27 diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index e9952ea08..d8507bbb0 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -68,7 +68,7 @@ export class AdminController { @HasPermission(permissions.accessAdminControl) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getAdminData(): Promise { - return this.adminService.get(); + return this.adminService.get({ user: this.request.user }); } @HasPermission(permissions.accessAdminControl) diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index e72902704..ce8adaf65 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -29,7 +29,7 @@ import { Filter } from '@ghostfolio/common/interfaces'; import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; -import { MarketDataPreset } from '@ghostfolio/common/types'; +import { MarketDataPreset, UserWithSettings } from '@ghostfolio/common/types'; import { BadRequestException, @@ -134,7 +134,9 @@ export class AdminService { } } - public async get(): Promise { + public async get({ user }: { user: UserWithSettings }): Promise { + const dataSources = await this.dataProviderService.getDataSources({ user }); + const [settings, transactionCount, userCount] = await Promise.all([ this.propertyService.get(), this.prismaService.order.count(), @@ -145,6 +147,11 @@ export class AdminService { settings, transactionCount, userCount, + dataProviders: dataSources.map((dataSource) => { + return this.dataProviderService + .getDataProvider(dataSource) + .getDataProviderInfo(); + }), version: environment.version }; } diff --git a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts index 7281697bd..bdaecf718 100644 --- a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts @@ -1,5 +1,6 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; +import { GhostfolioService as GhostfolioDataProviderService } from '@ghostfolio/api/services/data-provider/ghostfolio/ghostfolio.service'; import { GetAssetProfileParams, GetDividendsParams, @@ -327,10 +328,15 @@ export class GhostfolioService { } private getDataProviderInfo(): DataProviderInfo { + const ghostfolioDataProviderService = new GhostfolioDataProviderService( + this.configurationService, + this.propertyService + ); + return { + ...ghostfolioDataProviderService.getDataProviderInfo(), isPremium: false, - name: 'Ghostfolio Premium', - url: 'https://ghostfol.io' + name: 'Ghostfolio Premium' }; } diff --git a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts index f9593f0d0..1e8f7eefa 100644 --- a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts +++ b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts @@ -52,6 +52,7 @@ export class AlphaVantageService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.ALPHA_VANTAGE, isPremium: false, name: 'Alpha Vantage', url: 'https://www.alphavantage.co' diff --git a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts index d53355b9c..7776ff46c 100644 --- a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts +++ b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts @@ -92,6 +92,7 @@ export class CoinGeckoService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.COINGECKO, isPremium: false, name: 'CoinGecko', url: 'https://coingecko.com' diff --git a/apps/api/src/services/data-provider/data-provider.service.ts b/apps/api/src/services/data-provider/data-provider.service.ts index a4edd5bfa..3d8f2e553 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -26,6 +26,7 @@ import { LookupItem, LookupResponse } from '@ghostfolio/common/interfaces'; +import { hasRole } from '@ghostfolio/common/permissions'; import type { Granularity, UserWithSettings } from '@ghostfolio/common/types'; import { Inject, Injectable, Logger } from '@nestjs/common'; @@ -169,6 +170,7 @@ export class DataProviderService { let dataSourcesKey: 'DATA_SOURCES' | 'DATA_SOURCES_LEGACY' = 'DATA_SOURCES'; if ( + !hasRole(user, 'ADMIN') && isBefore(user.createdAt, new Date('2025-03-23')) && this.configurationService.get('DATA_SOURCES_LEGACY')?.length > 0 ) { @@ -185,7 +187,7 @@ export class DataProviderService { PROPERTY_API_KEY_GHOSTFOLIO )) as string; - if (ghostfolioApiKey) { + if (ghostfolioApiKey || hasRole(user, 'ADMIN')) { dataSources.push('GHOSTFOLIO'); } @@ -670,6 +672,7 @@ export class DataProviderService { lookupItem.dataProviderInfo.isPremium = false; } + lookupItem.dataProviderInfo.dataSource = undefined; lookupItem.dataProviderInfo.name = undefined; lookupItem.dataProviderInfo.url = undefined; } else { diff --git a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts index 376b8f159..ddb94bb1a 100644 --- a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts +++ b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts @@ -68,6 +68,7 @@ export class EodHistoricalDataService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.EOD_HISTORICAL_DATA, isPremium: true, name: 'EOD Historical Data', url: 'https://eodhd.com' diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts index 4e42201d0..d0e674c4d 100644 --- a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts +++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts @@ -223,6 +223,7 @@ export class FinancialModelingPrepService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.FINANCIAL_MODELING_PREP, isPremium: true, name: 'Financial Modeling Prep', url: 'https://financialmodelingprep.com/developer/docs' diff --git a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts index 097464e2f..90354ace5 100644 --- a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts @@ -92,9 +92,10 @@ export class GhostfolioService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.GHOSTFOLIO, isPremium: true, name: 'Ghostfolio', - url: 'https://ghostfo.io' + url: 'https://ghostfol.io' }; } diff --git a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts index 0c466972d..f067f042c 100644 --- a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts +++ b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts @@ -47,6 +47,7 @@ export class GoogleSheetsService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.GOOGLE_SHEETS, isPremium: false, name: 'Google Sheets', url: 'https://docs.google.com/spreadsheets' diff --git a/apps/api/src/services/data-provider/manual/manual.service.ts b/apps/api/src/services/data-provider/manual/manual.service.ts index 331806098..66e625e47 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -64,6 +64,7 @@ export class ManualService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.MANUAL, isPremium: false }; } diff --git a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts index 7762be426..05f1c0e5d 100644 --- a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts +++ b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts @@ -43,6 +43,7 @@ export class RapidApiService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.RAPID_API, isPremium: false, name: 'Rapid API', url: 'https://rapidapi.com' diff --git a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts index 6b42c9283..b9be5553e 100644 --- a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts @@ -51,6 +51,7 @@ export class YahooFinanceService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.YAHOO, isPremium: false, name: 'Yahoo Finance', url: 'https://finance.yahoo.com' 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 305d6ce49..977c8a372 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 @@ -4,74 +4,100 @@

Data Providers

-
-
- - @if (isGhostfolioApiKeyValid === false) { - Early Access - } - Ghostfolio Premium - - - @if (isGhostfolioApiKeyValid === true) { -
- - Valid until - {{ - ghostfolioApiStatus?.subscription?.expiresAt - | date: defaultDateFormat - }} -
- } -
-
- @if (isGhostfolioApiKeyValid === true) { -
-
- {{ ghostfolioApiStatus.dailyRequests }} - of - {{ ghostfolioApiStatus.dailyRequestsMax }} - daily requests + @for (dataProvider of dataProviders; track dataProvider.name) { +
+ @if (dataProvider.name === 'Ghostfolio') { +
+
+ +
+ + Ghostfolio Premium + + @if (isGhostfolioApiKeyValid === false) { + Early Access + } + + @if (isGhostfolioApiKeyValid === true) { +
+ + Valid until + {{ + ghostfolioApiStatus?.subscription?.expiresAt + | date: defaultDateFormat + }} +
+ } +
- - -
+
+ @if (isGhostfolioApiKeyValid === true) { +
+
+ {{ ghostfolioApiStatus.dailyRequests }} + of + {{ ghostfolioApiStatus.dailyRequestsMax }} + daily requests +
+ + + + +
+ } @else if (isGhostfolioApiKeyValid === false) { + - + } +
+ } @else { +
+
+ + {{ dataProvider.name }} +
- } @else if (isGhostfolioApiKeyValid === false) { - +
}
-
+ }
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 d72466bb4..68c196962 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,6 +10,7 @@ import { import { getDateFormatString } from '@ghostfolio/common/helper'; import { DataProviderGhostfolioStatusResponse, + DataProviderInfo, User } from '@ghostfolio/common/interfaces'; @@ -35,6 +36,7 @@ import { GhostfolioPremiumApiDialogParams } from './ghostfolio-premium-api-dialo standalone: false }) export class AdminSettingsComponent implements OnDestroy, OnInit { + public dataProviders: DataProviderInfo[]; public defaultDateFormat: string; public ghostfolioApiStatus: DataProviderGhostfolioStatusResponse; public isGhostfolioApiKeyValid: boolean; @@ -124,23 +126,36 @@ export class AdminSettingsComponent implements OnDestroy, OnInit { private initialize() { this.adminService - .fetchGhostfolioDataProviderStatus() - .pipe( - catchError(() => { - this.isGhostfolioApiKeyValid = false; - - this.changeDetectorRef.markForCheck(); - - return of(null); - }), - filter((status) => { - return status !== null; - }), - takeUntil(this.unsubscribeSubject) - ) - .subscribe((status) => { - this.ghostfolioApiStatus = status; - this.isGhostfolioApiKeyValid = true; + .fetchAdminData() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ dataProviders, settings }) => { + this.dataProviders = dataProviders.filter(({ dataSource }) => { + return dataSource !== 'MANUAL'; + }); + + this.adminService + .fetchGhostfolioDataProviderStatus( + settings[PROPERTY_API_KEY_GHOSTFOLIO] as string + ) + .pipe( + catchError(() => { + this.isGhostfolioApiKeyValid = false; + + this.changeDetectorRef.markForCheck(); + + return of(null); + }), + filter((status) => { + return status !== null; + }), + takeUntil(this.unsubscribeSubject) + ) + .subscribe((status) => { + this.ghostfolioApiStatus = status; + this.isGhostfolioApiKeyValid = true; + + this.changeDetectorRef.markForCheck(); + }); this.changeDetectorRef.markForCheck(); }); 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 5a5c39cde..79b269a62 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,5 +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 { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; @@ -17,6 +18,7 @@ import { AdminSettingsComponent } from './admin-settings.component'; CommonModule, GfAdminPlatformModule, GfAdminTagModule, + GfAssetProfileIconComponent, GfPremiumIndicatorComponent, MatButtonModule, MatCardModule, diff --git a/apps/client/src/app/services/admin.service.ts b/apps/client/src/app/services/admin.service.ts index 89769122d..cb72fb9fd 100644 --- a/apps/client/src/app/services/admin.service.ts +++ b/apps/client/src/app/services/admin.service.ts @@ -4,8 +4,7 @@ import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform. import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { HEADER_KEY_SKIP_INTERCEPTOR, - HEADER_KEY_TOKEN, - PROPERTY_API_KEY_GHOSTFOLIO + HEADER_KEY_TOKEN } from '@ghostfolio/common/config'; import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { @@ -24,7 +23,6 @@ import { Injectable } from '@angular/core'; import { SortDirection } from '@angular/material/sort'; import { DataSource, MarketData, Platform } from '@prisma/client'; import { JobStatus } from 'bull'; -import { switchMap } from 'rxjs'; import { environment } from '../../environments/environment'; import { DataService } from './data.service'; @@ -115,19 +113,15 @@ export class AdminService { }); } - public fetchGhostfolioDataProviderStatus() { - return this.fetchAdminData().pipe( - switchMap(({ settings }) => { - const headers = new HttpHeaders({ - [HEADER_KEY_SKIP_INTERCEPTOR]: 'true', - [HEADER_KEY_TOKEN]: `Api-Key ${settings[PROPERTY_API_KEY_GHOSTFOLIO]}` - }); - - return this.http.get( - `${environment.production ? 'https://ghostfol.io' : ''}/api/v2/data-providers/ghostfolio/status`, - { headers } - ); - }) + public fetchGhostfolioDataProviderStatus(aApiKey: string) { + const headers = new HttpHeaders({ + [HEADER_KEY_SKIP_INTERCEPTOR]: 'true', + [HEADER_KEY_TOKEN]: `Api-Key ${aApiKey}` + }); + + return this.http.get( + `${environment.production ? 'https://ghostfol.io' : ''}/api/v2/data-providers/ghostfolio/status`, + { headers } ); } diff --git a/libs/common/src/lib/interfaces/admin-data.interface.ts b/libs/common/src/lib/interfaces/admin-data.interface.ts index e14429493..dba85d3ef 100644 --- a/libs/common/src/lib/interfaces/admin-data.interface.ts +++ b/libs/common/src/lib/interfaces/admin-data.interface.ts @@ -1,4 +1,7 @@ +import { DataProviderInfo } from './data-provider-info.interface'; + export interface AdminData { + dataProviders: DataProviderInfo[]; settings: { [key: string]: boolean | object | string | string[] }; transactionCount: number; userCount: number; diff --git a/libs/common/src/lib/interfaces/data-provider-info.interface.ts b/libs/common/src/lib/interfaces/data-provider-info.interface.ts index 79d7d6940..9fba0e62d 100644 --- a/libs/common/src/lib/interfaces/data-provider-info.interface.ts +++ b/libs/common/src/lib/interfaces/data-provider-info.interface.ts @@ -1,4 +1,7 @@ +import { DataSource } from '@prisma/client'; + export interface DataProviderInfo { + dataSource?: DataSource; isPremium: boolean; name?: string; url?: string; From 82cf4afd7d99c425aa223116234a11b9d4c4f9f9 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 28 Apr 2025 19:44:44 +0200 Subject: [PATCH 20/91] Release 2.157.0 (#4622) --- 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 87f700f30..bacfac1c5 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.157.0 - 2025-04-28 ### Added diff --git a/package-lock.json b/package-lock.json index 4557a6c61..023184042 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.156.0", + "version": "2.157.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.156.0", + "version": "2.157.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 111232548..7acb5e8f5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.156.0", + "version": "2.157.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From a5fe259761f39a1db1f41f3ce8f76e9c30e8ea4f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 29 Apr 2025 20:31:53 +0200 Subject: [PATCH 21/91] Feature/update locales (#4623) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 20 ++++++++++---------- apps/client/src/locales/messages.de.xlf | 20 ++++++++++---------- apps/client/src/locales/messages.es.xlf | 20 ++++++++++---------- apps/client/src/locales/messages.fr.xlf | 20 ++++++++++---------- apps/client/src/locales/messages.it.xlf | 20 ++++++++++---------- apps/client/src/locales/messages.nl.xlf | 20 ++++++++++---------- apps/client/src/locales/messages.pl.xlf | 20 ++++++++++---------- apps/client/src/locales/messages.pt.xlf | 20 ++++++++++---------- apps/client/src/locales/messages.tr.xlf | 20 ++++++++++---------- apps/client/src/locales/messages.uk.xlf | 20 ++++++++++---------- apps/client/src/locales/messages.xlf | 20 ++++++++++---------- apps/client/src/locales/messages.zh.xlf | 20 ++++++++++---------- 12 files changed, 120 insertions(+), 120 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index f94cd9b80..504ea6e14 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -653,7 +653,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts @@ -2175,7 +2175,7 @@ Plataformes apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -2183,7 +2183,7 @@ Etiquetes apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -6659,7 +6659,7 @@ Valid until apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -7267,7 +7267,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 + 83 @@ -7373,7 +7373,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7381,7 +7381,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7389,7 +7389,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7397,7 +7397,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 94 + 96 @@ -7557,7 +7557,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index a8ddcfd0c..8612e948d 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -1326,7 +1326,7 @@ Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3398,7 +3398,7 @@ Gültig bis apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3958,7 +3958,7 @@ Plattformen apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -5449,7 +5449,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts @@ -7291,7 +7291,7 @@ API-Schlüssel setzen apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 + 83 @@ -7397,7 +7397,7 @@ von apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7405,7 +7405,7 @@ täglichen Anfragen apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7413,7 +7413,7 @@ API-Schlüssel löschen apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7421,7 +7421,7 @@ Möchtest du den API-Schlüssel wirklich löschen? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 94 + 96 @@ -7581,7 +7581,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index d321f5bde..e297e0021 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -1311,7 +1311,7 @@ Etiquetas apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3383,7 +3383,7 @@ Válido hasta apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3935,7 +3935,7 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -5426,7 +5426,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts @@ -7268,7 +7268,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 + 83 @@ -7374,7 +7374,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7382,7 +7382,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7390,7 +7390,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7398,7 +7398,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 94 + 96 @@ -7558,7 +7558,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index d939feb0a..376a7cb30 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -918,7 +918,7 @@ Étiquettes apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3382,7 +3382,7 @@ Valide jusqu’au apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3934,7 +3934,7 @@ Platformes apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -5425,7 +5425,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts @@ -7267,7 +7267,7 @@ Définir clé API apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 + 83 @@ -7373,7 +7373,7 @@ sur apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7381,7 +7381,7 @@ requêtes journalières apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7389,7 +7389,7 @@ Retirer la clé API apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7397,7 +7397,7 @@ Voulez-vous vraiment supprimer la clé API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 94 + 96 @@ -7557,7 +7557,7 @@ Accès anticipé apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 76de15e87..52beb2cbe 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -1311,7 +1311,7 @@ Tag apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3383,7 +3383,7 @@ Valido fino a apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3935,7 +3935,7 @@ Piattaforme apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -5426,7 +5426,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts @@ -7268,7 +7268,7 @@ Imposta API Key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 + 83 @@ -7374,7 +7374,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7382,7 +7382,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7390,7 +7390,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7398,7 +7398,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 94 + 96 @@ -7558,7 +7558,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 4a30b72ad..b4c312517 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -1310,7 +1310,7 @@ Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3382,7 +3382,7 @@ Geldig tot apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3934,7 +3934,7 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -5425,7 +5425,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts @@ -7267,7 +7267,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 + 83 @@ -7373,7 +7373,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7381,7 +7381,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7389,7 +7389,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7397,7 +7397,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 94 + 96 @@ -7557,7 +7557,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 82d530de3..ef5caf612 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -272,7 +272,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts @@ -2007,7 +2007,7 @@ Platformy apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -2015,7 +2015,7 @@ Tagi apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -6059,7 +6059,7 @@ Ważność do apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -7267,7 +7267,7 @@ Skonfiguruj klucz API apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 + 83 @@ -7373,7 +7373,7 @@ z apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7381,7 +7381,7 @@ codzienne żądania apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7389,7 +7389,7 @@ Usuń klucz API apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7397,7 +7397,7 @@ Czy na pewno chcesz usunąć klucz API?? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 94 + 96 @@ -7557,7 +7557,7 @@ Wczesny dostęp apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index d9b68e76d..b4d2510be 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -1614,7 +1614,7 @@ Marcadores apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3382,7 +3382,7 @@ Válido até apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3934,7 +3934,7 @@ Plataformas apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -5425,7 +5425,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts @@ -7267,7 +7267,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 + 83 @@ -7373,7 +7373,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7381,7 +7381,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7389,7 +7389,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7397,7 +7397,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 94 + 96 @@ -7557,7 +7557,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 75b9b407f..47a489c62 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -272,7 +272,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts @@ -1747,7 +1747,7 @@ Etiketler apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1911,7 +1911,7 @@ Platformlar apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -4939,7 +4939,7 @@ Geçerli tarih apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -7267,7 +7267,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 + 83 @@ -7373,7 +7373,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7381,7 +7381,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7389,7 +7389,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7397,7 +7397,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 94 + 96 @@ -7557,7 +7557,7 @@ Erken Erişim apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 423876a65..6f5611d46 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -653,7 +653,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts @@ -2171,7 +2171,7 @@ Дійсне до apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -2183,7 +2183,7 @@ з apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -2191,7 +2191,7 @@ щоденних запитів apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -2199,7 +2199,7 @@ Вилучити ключ API apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -2207,7 +2207,7 @@ Встановити ключ API apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 + 83 @@ -2215,7 +2215,7 @@ Платформи apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -2223,7 +2223,7 @@ Теги apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2239,7 +2239,7 @@ Ви дійсно хочете видалити ключ API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 94 + 96 @@ -7557,7 +7557,7 @@ Ранній доступ apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index d5e6126a5..cc48e4081 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -267,7 +267,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts @@ -1925,14 +1925,14 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -5593,7 +5593,7 @@ Valid until apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -6607,7 +6607,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 + 83 @@ -6709,14 +6709,14 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 94 + 96 @@ -6730,14 +6730,14 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -6863,7 +6863,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index c32a62f7d..c1c7ac5fa 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -273,7 +273,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 75 + 77 apps/client/src/app/components/header/header.component.ts @@ -2016,7 +2016,7 @@ 平台 apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -2024,7 +2024,7 @@ 标签 apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -6116,7 +6116,7 @@ 有效期至 apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -7268,7 +7268,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 + 83 @@ -7374,7 +7374,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7382,7 +7382,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7390,7 +7390,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7398,7 +7398,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 94 + 96 @@ -7558,7 +7558,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 From d919622932799f8289621acc3f3f88b0bf52cdac Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 29 Apr 2025 20:56:28 +0200 Subject: [PATCH 22/91] Bugfix/fix create watchlist item for new asset profile (#4625) * Fix create watchlist item for new asset profile --- .../endpoints/watchlist/watchlist.module.ts | 6 ++++ .../endpoints/watchlist/watchlist.service.ts | 33 ++++++++++++++++--- .../src/app/pages/home/home-page.component.ts | 2 +- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/apps/api/src/app/endpoints/watchlist/watchlist.module.ts b/apps/api/src/app/endpoints/watchlist/watchlist.module.ts index 15115888b..2addd2de0 100644 --- a/apps/api/src/app/endpoints/watchlist/watchlist.module.ts +++ b/apps/api/src/app/endpoints/watchlist/watchlist.module.ts @@ -1,6 +1,9 @@ import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module'; +import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; +import { DataGatheringModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; +import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { Module } from '@nestjs/common'; @@ -10,7 +13,10 @@ import { WatchlistService } from './watchlist.service'; @Module({ controllers: [WatchlistController], imports: [ + DataGatheringModule, + DataProviderModule, PrismaModule, + SymbolProfileModule, TransformDataSourceInRequestModule, TransformDataSourceInResponseModule ], diff --git a/apps/api/src/app/endpoints/watchlist/watchlist.service.ts b/apps/api/src/app/endpoints/watchlist/watchlist.service.ts index fdb9dd97a..6ff71ec50 100644 --- a/apps/api/src/app/endpoints/watchlist/watchlist.service.ts +++ b/apps/api/src/app/endpoints/watchlist/watchlist.service.ts @@ -1,12 +1,20 @@ +import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; +import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; -import { Injectable, NotFoundException } from '@nestjs/common'; -import { DataSource } from '@prisma/client'; +import { BadRequestException, Injectable } from '@nestjs/common'; +import { DataSource, Prisma } from '@prisma/client'; @Injectable() export class WatchlistService { - public constructor(private readonly prismaService: PrismaService) {} + public constructor( + private readonly dataGatheringService: DataGatheringService, + private readonly dataProviderService: DataProviderService, + private readonly prismaService: PrismaService, + private readonly symbolProfileService: SymbolProfileService + ) {} public async createWatchlistItem({ dataSource, @@ -24,11 +32,26 @@ export class WatchlistService { }); if (!symbolProfile) { - throw new NotFoundException( - `Asset profile not found for ${symbol} (${dataSource})` + const assetProfiles = await this.dataProviderService.getAssetProfiles([ + { dataSource, symbol } + ]); + + if (!assetProfiles[symbol]?.currency) { + throw new BadRequestException( + `Asset profile not found for ${symbol} (${dataSource})` + ); + } + + await this.symbolProfileService.add( + assetProfiles[symbol] as Prisma.SymbolProfileCreateInput ); } + await this.dataGatheringService.gatherSymbol({ + dataSource, + symbol + }); + await this.prismaService.user.update({ data: { watchlist: { 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 70e0c34fe..928ad2931 100644 --- a/apps/client/src/app/pages/home/home-page.component.ts +++ b/apps/client/src/app/pages/home/home-page.component.ts @@ -54,7 +54,7 @@ export class HomePageComponent implements OnDestroy, OnInit { path: ['/home', 'market'] }, { - iconName: 'star-outline', + iconName: 'bookmark-outline', label: $localize`Watchlist`, path: ['/home', 'watchlist'], showCondition: this.user?.settings?.isExperimentalFeatures From afac9daeab56e3e4787fbe14506485c798f2e029 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 29 Apr 2025 20:58:28 +0200 Subject: [PATCH 23/91] Release 2.157.1 (#4627) --- 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 bacfac1c5..3850390e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## 2.157.0 - 2025-04-28 +## 2.157.1 - 2025-04-29 ### Added diff --git a/package-lock.json b/package-lock.json index 023184042..54ce11db7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.157.0", + "version": "2.157.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.157.0", + "version": "2.157.1", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 7acb5e8f5..42e173d4c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.157.0", + "version": "2.157.1", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 73f009e43b26ebacd8a39eaf6b880824aaaf4719 Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Wed, 30 Apr 2025 16:00:03 +0700 Subject: [PATCH 24/91] Feature/extend GUI to delete watchlist item (#4624) * Extend GUI to delete watchlist item * Update changelog --- CHANGELOG.md | 6 ++++ .../home-watchlist.component.ts | 25 ++++++++++++- .../home-watchlist/home-watchlist.html | 2 ++ apps/client/src/app/services/data.service.ts | 4 +++ .../lib/benchmark/benchmark.component.html | 33 +++++++++++++++++ .../src/lib/benchmark/benchmark.component.ts | 35 +++++++++++++++++-- 6 files changed, 101 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3850390e6..d103ff6e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Added + +- Added support to delete an asset from the watchlist (experimental) + ## 2.157.1 - 2025-04-29 ### Added diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts index 0198ab27a..daf512b34 100644 --- a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts @@ -1,6 +1,10 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { Benchmark, User } from '@ghostfolio/common/interfaces'; +import { + AssetProfileIdentifier, + Benchmark, + User +} from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; @@ -41,6 +45,7 @@ import { CreateWatchlistItemDialogParams } from './create-watchlist-item-dialog/ export class HomeWatchlistComponent implements OnDestroy, OnInit { public deviceType: string; public hasPermissionToCreateWatchlistItem: boolean; + public hasPermissionToDeleteWatchlistItem: boolean; public user: User; public watchlist: Benchmark[]; @@ -75,6 +80,10 @@ export class HomeWatchlistComponent implements OnDestroy, OnInit { this.user.permissions, permissions.createWatchlistItem ); + this.hasPermissionToDeleteWatchlistItem = hasPermission( + this.user.permissions, + permissions.deleteWatchlistItem + ); this.changeDetectorRef.markForCheck(); } @@ -85,6 +94,20 @@ export class HomeWatchlistComponent implements OnDestroy, OnInit { this.loadWatchlistData(); } + public onWatchlistItemDeleted({ + dataSource, + symbol + }: AssetProfileIdentifier) { + this.dataService + .deleteWatchlistItem({ dataSource, symbol }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe({ + next: () => { + return this.loadWatchlistData(); + } + }); + } + public ngOnDestroy() { this.unsubscribeSubject.next(); this.unsubscribeSubject.complete(); diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.html b/apps/client/src/app/components/home-watchlist/home-watchlist.html index 0a2e37279..ef073d331 100644 --- a/apps/client/src/app/components/home-watchlist/home-watchlist.html +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.html @@ -12,8 +12,10 @@
diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 526c61972..353bc4153 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -327,6 +327,10 @@ export class DataService { return this.http.delete(`/api/v1/user/${aId}`); } + public deleteWatchlistItem({ dataSource, symbol }: AssetProfileIdentifier) { + return this.http.delete(`/api/v1/watchlist/${dataSource}/${symbol}`); + } + public fetchAccesses() { return this.http.get('/api/v1/access'); } diff --git a/libs/ui/src/lib/benchmark/benchmark.component.html b/libs/ui/src/lib/benchmark/benchmark.component.html index 270690f35..14ff7f9f2 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.html +++ b/libs/ui/src/lib/benchmark/benchmark.component.html @@ -113,6 +113,39 @@ + +
+ + + (); + + public displayedColumns = [ + 'name', + 'date', + 'change', + 'marketCondition', + 'actions' + ]; public isLoading = true; public isNumber = isNumber; public resolveMarketCondition = resolveMarketCondition; @@ -58,6 +75,7 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy { public constructor( private dialog: MatDialog, + private notificationService: NotificationService, private route: ActivatedRoute, private router: Router ) { @@ -89,11 +107,22 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy { 'trend200d', 'date', 'change', - 'marketCondition' + 'marketCondition', + 'actions' ]; } } + public onDeleteItem({ dataSource, symbol }: AssetProfileIdentifier) { + this.notificationService.confirm({ + confirmFn: () => { + this.itemDeleted.emit({ dataSource, symbol }); + }, + confirmType: ConfirmationDialogType.Warn, + title: $localize`Do you really want to delete this item?` + }); + } + public onOpenBenchmarkDialog({ dataSource, symbol }: AssetProfileIdentifier) { this.router.navigate([], { queryParams: { dataSource, symbol, benchmarkDetailDialog: true } From 8df966797936b2d2681fa0169c2adf7147deca4d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 30 Apr 2025 16:59:50 +0200 Subject: [PATCH 25/91] Feature/update locales (#4629) * 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 | 4 ++++ apps/client/src/locales/messages.ca.xlf | 14 +++++++++++++- apps/client/src/locales/messages.de.xlf | 14 +++++++++++++- apps/client/src/locales/messages.es.xlf | 14 +++++++++++++- apps/client/src/locales/messages.fr.xlf | 14 +++++++++++++- apps/client/src/locales/messages.it.xlf | 14 +++++++++++++- apps/client/src/locales/messages.nl.xlf | 14 +++++++++++++- apps/client/src/locales/messages.pl.xlf | 14 +++++++++++++- apps/client/src/locales/messages.pt.xlf | 14 +++++++++++++- apps/client/src/locales/messages.tr.xlf | 14 +++++++++++++- apps/client/src/locales/messages.uk.xlf | 14 +++++++++++++- apps/client/src/locales/messages.xlf | 13 ++++++++++++- apps/client/src/locales/messages.zh.xlf | 14 +++++++++++++- 13 files changed, 159 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d103ff6e0..0e591b311 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added support to delete an asset from the watchlist (experimental) +### Changed + +- Improved the language localization for German (`de`) + ## 2.157.1 - 2025-04-29 ### Added diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 504ea6e14..5dd6bfbd2 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -1237,6 +1237,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 457 + + libs/ui/src/lib/benchmark/benchmark.component.html + 142 + Do you really want to delete this account? @@ -4959,7 +4963,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 141 + 174 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7961,6 +7965,14 @@ 29 + + Do you really want to delete this item? + Do you really want to delete this item? + + libs/ui/src/lib/benchmark/benchmark.component.ts + 122 + + diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 8612e948d..00ad01434 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -300,6 +300,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 457 + + libs/ui/src/lib/benchmark/benchmark.component.html + 142 + Do you really want to delete this account? @@ -4686,7 +4690,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 141 + 174 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7961,6 +7965,14 @@ 29 + + Do you really want to delete this item? + Möchtest du diesen Eintrag wirklich löschen? + + libs/ui/src/lib/benchmark/benchmark.component.ts + 122 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index e297e0021..46bd07d47 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -301,6 +301,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 457 + + libs/ui/src/lib/benchmark/benchmark.component.html + 142 + Do you really want to delete this account? @@ -4663,7 +4667,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 141 + 174 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7962,6 +7966,14 @@ 29 + + Do you really want to delete this item? + Do you really want to delete this item? + + libs/ui/src/lib/benchmark/benchmark.component.ts + 122 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 376a7cb30..a9b3cd048 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -356,6 +356,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 457 + + libs/ui/src/lib/benchmark/benchmark.component.html + 142 + Do you really want to delete this account? @@ -4662,7 +4666,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 141 + 174 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7961,6 +7965,14 @@ 29 + + Do you really want to delete this item? + Do you really want to delete this item? + + libs/ui/src/lib/benchmark/benchmark.component.ts + 122 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 52beb2cbe..cbc8d5792 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -301,6 +301,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 457 + + libs/ui/src/lib/benchmark/benchmark.component.html + 142 + Do you really want to delete this account? @@ -4663,7 +4667,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 141 + 174 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7962,6 +7966,14 @@ 29 + + Do you really want to delete this item? + Do you really want to delete this item? + + libs/ui/src/lib/benchmark/benchmark.component.ts + 122 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index b4c312517..d53e7845c 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -300,6 +300,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 457 + + libs/ui/src/lib/benchmark/benchmark.component.html + 142 + Do you really want to delete this account? @@ -4662,7 +4666,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 141 + 174 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7961,6 +7965,14 @@ 29 + + Do you really want to delete this item? + Do you really want to delete this item? + + libs/ui/src/lib/benchmark/benchmark.component.ts + 122 + + diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index ef5caf612..85ef03d3a 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -1165,6 +1165,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 457 + + libs/ui/src/lib/benchmark/benchmark.component.html + 142 + Do you really want to delete this account? @@ -4571,7 +4575,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 141 + 174 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7961,6 +7965,14 @@ 29 + + Do you really want to delete this item? + Do you really want to delete this item? + + libs/ui/src/lib/benchmark/benchmark.component.ts + 122 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index b4d2510be..d270243db 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -356,6 +356,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 457 + + libs/ui/src/lib/benchmark/benchmark.component.html + 142 + Do you really want to delete this account? @@ -4662,7 +4666,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 141 + 174 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7961,6 +7965,14 @@ 29 + + Do you really want to delete this item? + Do you really want to delete this item? + + libs/ui/src/lib/benchmark/benchmark.component.ts + 122 + + diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 47a489c62..9ec4a5836 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -1125,6 +1125,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 457 + + libs/ui/src/lib/benchmark/benchmark.component.html + 142 + Do you really want to delete this account? @@ -4059,7 +4063,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 141 + 174 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7961,6 +7965,14 @@ 29 + + Do you really want to delete this item? + Do you really want to delete this item? + + libs/ui/src/lib/benchmark/benchmark.component.ts + 122 + + diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 6f5611d46..17a42efbf 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -1253,6 +1253,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 457 + + libs/ui/src/lib/benchmark/benchmark.component.html + 142 + Do you really want to delete this account? @@ -5211,7 +5215,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 141 + 174 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7961,6 +7965,14 @@ 29 + + Do you really want to delete this item? + Do you really want to delete this item? + + libs/ui/src/lib/benchmark/benchmark.component.ts + 122 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index cc48e4081..5a96dd108 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -1132,6 +1132,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 457 + + libs/ui/src/lib/benchmark/benchmark.component.html + 142 + Do you really want to delete this account? @@ -4225,7 +4229,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 141 + 174 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7199,6 +7203,13 @@ 29 + + Do you really want to delete this item? + + libs/ui/src/lib/benchmark/benchmark.component.ts + 122 + + diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index c1c7ac5fa..385b4aefd 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -1174,6 +1174,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 457 + + libs/ui/src/lib/benchmark/benchmark.component.html + 142 + Do you really want to delete this account? @@ -4580,7 +4584,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 141 + 174 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7962,6 +7966,14 @@ 29 + + Do you really want to delete this item? + Do you really want to delete this item? + + libs/ui/src/lib/benchmark/benchmark.component.ts + 122 + + From 8fbdcac66c7b6671227e25ca8423b4b3fde71f49 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 30 Apr 2025 17:31:06 +0200 Subject: [PATCH 26/91] Feature/rename Order to activities in account database schema (#4577) * Rename Order to activities * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/account/account.controller.ts | 6 +++--- apps/api/src/app/account/account.service.ts | 14 +++++++------- apps/api/src/app/order/order.service.ts | 2 +- apps/api/src/app/portfolio/portfolio.service.ts | 10 +++++----- prisma/schema.prisma | 2 +- 6 files changed, 18 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e591b311..cccc700d5 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 +- Renamed `Order` to `activities` in the `Account` database schema - Improved the language localization for German (`de`) ## 2.157.1 - 2025-04-29 diff --git a/apps/api/src/app/account/account.controller.ts b/apps/api/src/app/account/account.controller.ts index c0f4dac6a..71ff8a044 100644 --- a/apps/api/src/app/account/account.controller.ts +++ b/apps/api/src/app/account/account.controller.ts @@ -57,17 +57,17 @@ export class AccountController { @HasPermission(permissions.deleteAccount) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async deleteAccount(@Param('id') id: string): Promise { - const account = await this.accountService.accountWithOrders( + const account = await this.accountService.accountWithActivities( { id_userId: { id, userId: this.request.user.id } }, - { Order: true } + { activities: true } ); - if (!account || account?.Order.length > 0) { + if (!account || account?.activities.length > 0) { throw new HttpException( getReasonPhrase(StatusCodes.FORBIDDEN), StatusCodes.FORBIDDEN diff --git a/apps/api/src/app/account/account.service.ts b/apps/api/src/app/account/account.service.ts index aab4c0766..a10eecac5 100644 --- a/apps/api/src/app/account/account.service.ts +++ b/apps/api/src/app/account/account.service.ts @@ -39,12 +39,12 @@ export class AccountService { return account; } - public async accountWithOrders( + public async accountWithActivities( accountWhereUniqueInput: Prisma.AccountWhereUniqueInput, accountInclude: Prisma.AccountInclude ): Promise< Account & { - Order?: Order[]; + activities?: Order[]; } > { return this.prismaService.account.findUnique({ @@ -62,8 +62,8 @@ export class AccountService { orderBy?: Prisma.AccountOrderByWithRelationInput; }): Promise< (Account & { + activities?: Order[]; balances?: AccountBalance[]; - Order?: Order[]; Platform?: Platform; })[] > { @@ -140,7 +140,7 @@ export class AccountService { public async getAccounts(aUserId: string): Promise { const accounts = await this.accounts({ - include: { Order: true, Platform: true }, + include: { activities: true, Platform: true }, orderBy: { name: 'asc' }, where: { userId: aUserId } }); @@ -148,15 +148,15 @@ export class AccountService { return accounts.map((account) => { let transactionCount = 0; - for (const order of account.Order) { - if (!order.isDraft) { + for (const { isDraft } of account.activities) { + if (!isDraft) { transactionCount += 1; } } const result = { ...account, transactionCount }; - delete result.Order; + delete result.activities; return result; }); diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index c2b822ac9..d1847635a 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -100,7 +100,7 @@ export class OrderService { userId: string; } ): Promise { - let Account: Prisma.AccountCreateNestedOneWithoutOrderInput; + let Account: Prisma.AccountCreateNestedOneWithoutActivitiesInput; if (data.accountId) { Account = { diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 87b2bc9df..3aa9696b5 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -139,7 +139,7 @@ export class PortfolioService { } if (filterByDataSource && filterBySymbol) { - where.Order = { + where.activities = { some: { SymbolProfile: { AND: [ @@ -154,7 +154,7 @@ export class PortfolioService { const [accounts, details] = await Promise.all([ this.accountService.accounts({ where, - include: { Order: true, Platform: true }, + include: { activities: true, Platform: true }, orderBy: { name: 'asc' } }), this.getDetails({ @@ -170,8 +170,8 @@ export class PortfolioService { return accounts.map((account) => { let transactionCount = 0; - for (const order of account.Order) { - if (!order.isDraft) { + for (const { isDraft } of account.activities) { + if (!isDraft) { transactionCount += 1; } } @@ -195,7 +195,7 @@ export class PortfolioService { ) }; - delete result.Order; + delete result.activities; return result; }); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index b88a5f9f8..c33f7d6cc 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -26,6 +26,7 @@ model Access { } model Account { + activities Order[] balance Float @default(0) balances AccountBalance[] comment String? @@ -39,7 +40,6 @@ model Account { userId String Platform Platform? @relation(fields: [platformId], references: [id]) User User @relation(fields: [userId], onDelete: Cascade, references: [id]) - Order Order[] @@id([id, userId]) @@index([currency]) From ca992db14eb00e9dc0f6d51f7fdcb914770fea66 Mon Sep 17 00:00:00 2001 From: csehatt741 <77381875+csehatt741@users.noreply.github.com> Date: Wed, 30 Apr 2025 17:51:32 +0200 Subject: [PATCH 27/91] Bugfix/save activities with type INTEREST, ITEM and LIABILITY (#4630) * Save activities with type INTEREST, ITEM and LIABILITY * Update changelog --- CHANGELOG.md | 4 ++++ ...eate-or-update-activity-dialog.component.ts | 18 +++++------------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cccc700d5..543851098 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Renamed `Order` to `activities` in the `Account` database schema - Improved the language localization for German (`de`) +### Fixed + +- Fixed an issue with the saving of activities with type `INTEREST`, `ITEM` and `LIABILITY` + ## 2.157.1 - 2025-04-29 ### Added diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts index f6ce2a81d..dce045a4a 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts @@ -238,7 +238,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { .get('dataSource') .removeValidators(Validators.required); this.activityForm.get('dataSource').updateValueAndValidity(); - this.activityForm.get('fee').reset(); + this.activityForm.get('fee').setValue(0); this.activityForm.get('name').setValidators(Validators.required); this.activityForm.get('name').updateValueAndValidity(); this.activityForm.get('quantity').setValue(1); @@ -248,11 +248,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { this.activityForm.get('searchSymbol').updateValueAndValidity(); this.activityForm.get('updateAccountBalance').disable(); this.activityForm.get('updateAccountBalance').setValue(false); - } else if ( - type === 'FEE' || - type === 'INTEREST' || - type === 'LIABILITY' - ) { + } else if (['FEE', 'INTEREST', 'LIABILITY'].includes(type)) { this.activityForm .get('accountId') .removeValidators(Validators.required); @@ -271,12 +267,8 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { .removeValidators(Validators.required); this.activityForm.get('dataSource').updateValueAndValidity(); - if ( - (type === 'FEE' && this.activityForm.get('fee').value === 0) || - type === 'INTEREST' || - type === 'LIABILITY' - ) { - this.activityForm.get('fee').reset(); + if (['INTEREST', 'LIABILITY'].includes(type)) { + this.activityForm.get('fee').setValue(0); } this.activityForm.get('name').setValidators(Validators.required); @@ -284,7 +276,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { if (type === 'FEE') { this.activityForm.get('quantity').setValue(0); - } else if (type === 'INTEREST' || type === 'LIABILITY') { + } else if (['INTEREST', 'LIABILITY'].includes(type)) { this.activityForm.get('quantity').setValue(1); } From 2306bc597b7f931a8711ba979ebe1d5f4e7eecea Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 30 Apr 2025 17:53:42 +0200 Subject: [PATCH 28/91] Release 2.158.0 (#4633) --- 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 543851098..4359aa775 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.158.0 - 2025-04-30 ### Added diff --git a/package-lock.json b/package-lock.json index 54ce11db7..27acd2820 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.157.1", + "version": "2.158.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.157.1", + "version": "2.158.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 42e173d4c..c64163886 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.157.1", + "version": "2.158.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From e314efb2e1dfb6581f40cc6e8951da449269c9c9 Mon Sep 17 00:00:00 2001 From: Vinodh Zamboulingame <48854069+vzamboulingame@users.noreply.github.com> Date: Fri, 2 May 2025 08:26:04 +0200 Subject: [PATCH 29/91] Feature/improve language localization for FR 20250501 (#4637) * Improve french translation * Update changelog --- CHANGELOG.md | 6 ++++++ apps/client/src/locales/messages.fr.xlf | 12 ++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4359aa775..d40df6fb8 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 Français (`fr`) + ## 2.158.0 - 2025-04-30 ### Added diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index a9b3cd048..e554ce9ff 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -2831,7 +2831,7 @@ Hello, has shared a Portfolio with you! - Bonjour, a partagé un Portefeuille avec vous ! + Bonjour, a partagé un Portefeuille avec vous ! apps/client/src/app/pages/public/public-page.html 4 @@ -7931,7 +7931,7 @@ Add asset to watchlist - Add asset to watchlist + Ajouter un actif à la liste de suivi apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html 7 @@ -7939,7 +7939,7 @@ Watchlist - Watchlist + Liste de suivi apps/client/src/app/components/home-watchlist/home-watchlist.html 4 @@ -7947,7 +7947,7 @@ Watchlist - Watchlist + Liste de suivi apps/client/src/app/pages/home/home-page-routing.module.ts 44 @@ -7959,7 +7959,7 @@ Get Early Access - Get Early Access + Obtenir un accès anticipé apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html 29 @@ -7967,7 +7967,7 @@ Do you really want to delete this item? - Do you really want to delete this item? + Voulez-vous vraiment supprimer cet élément? libs/ui/src/lib/benchmark/benchmark.component.ts 122 From 6bb85c4fb80ff0bf6d300cf6d662baba8ef952d5 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 2 May 2025 16:09:27 +0200 Subject: [PATCH 30/91] Bugfix/allow GBp in currency code validation (#4640) * Allow GBp in currency code validation * Update changelog --- CHANGELOG.md | 4 ++++ apps/api/src/validators/is-currency-code.ts | 16 +++++----------- libs/common/src/lib/helper.ts | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d40df6fb8..984e7b089 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the language localization for Français (`fr`) +### Fixed + +- Fixed the currency code validation by allowing `GBp` + ## 2.158.0 - 2025-04-30 ### Added diff --git a/apps/api/src/validators/is-currency-code.ts b/apps/api/src/validators/is-currency-code.ts index d04da7808..771818b05 100644 --- a/apps/api/src/validators/is-currency-code.ts +++ b/apps/api/src/validators/is-currency-code.ts @@ -1,4 +1,4 @@ -import { DERIVED_CURRENCIES } from '@ghostfolio/common/config'; +import { isDerivedCurrency } from '@ghostfolio/common/helper'; import { registerDecorator, @@ -28,17 +28,11 @@ export class IsExtendedCurrencyConstraint return '$property must be a valid ISO4217 currency code'; } - public validate(currency: any) { - // Return true if currency is a standard ISO 4217 code or a derived currency + public validate(currency: string) { + // Return true if currency is a derived currency or a standard ISO 4217 code return ( - this.isUpperCase(currency) && - (isISO4217CurrencyCode(currency) || - [ - ...DERIVED_CURRENCIES.map((derivedCurrency) => { - return derivedCurrency.currency; - }), - 'USX' - ].includes(currency)) + isDerivedCurrency(currency) || + (this.isUpperCase(currency) && isISO4217CurrencyCode(currency)) ); } diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index e5104a991..e5dc187ff 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -349,7 +349,7 @@ export function isDerivedCurrency(aCurrency: string) { return true; } - return DERIVED_CURRENCIES.find(({ currency }) => { + return DERIVED_CURRENCIES.some(({ currency }) => { return currency === aCurrency; }); } From 770b322137edff39c6e4fc2f9c3ecbce95cdaf66 Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Fri, 2 May 2025 21:11:24 +0700 Subject: [PATCH 31/91] Feature/extend watchlist endpoint by name, performances and market condition (#4634) * Extend watchlist endpoint by name, performances and market condition * Update changelog --- CHANGELOG.md | 4 ++ .../endpoints/watchlist/watchlist.module.ts | 4 ++ .../endpoints/watchlist/watchlist.service.ts | 54 +++++++++++++++++-- .../services/benchmark/benchmark.service.ts | 24 ++++----- .../home-watchlist.component.ts | 21 ++++---- .../home-watchlist/home-watchlist.html | 2 +- .../responses/watchlist-response.interface.ts | 11 +++- 7 files changed, 93 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 984e7b089..85df415b5 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 watchlist by the date of the last all time high, the current change to the all time high and the current market condition (experimental) + ### Changed - Improved the language localization for Français (`fr`) diff --git a/apps/api/src/app/endpoints/watchlist/watchlist.module.ts b/apps/api/src/app/endpoints/watchlist/watchlist.module.ts index 2addd2de0..a2d32d1d2 100644 --- a/apps/api/src/app/endpoints/watchlist/watchlist.module.ts +++ b/apps/api/src/app/endpoints/watchlist/watchlist.module.ts @@ -1,6 +1,8 @@ import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module'; +import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; +import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { DataGatheringModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; @@ -13,8 +15,10 @@ import { WatchlistService } from './watchlist.service'; @Module({ controllers: [WatchlistController], imports: [ + BenchmarkModule, DataGatheringModule, DataProviderModule, + MarketDataModule, PrismaModule, SymbolProfileModule, TransformDataSourceInRequestModule, diff --git a/apps/api/src/app/endpoints/watchlist/watchlist.service.ts b/apps/api/src/app/endpoints/watchlist/watchlist.service.ts index 6ff71ec50..36a498e1d 100644 --- a/apps/api/src/app/endpoints/watchlist/watchlist.service.ts +++ b/apps/api/src/app/endpoints/watchlist/watchlist.service.ts @@ -1,8 +1,10 @@ +import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; +import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; -import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; +import { WatchlistResponse } from '@ghostfolio/common/interfaces'; import { BadRequestException, Injectable } from '@nestjs/common'; import { DataSource, Prisma } from '@prisma/client'; @@ -10,8 +12,10 @@ import { DataSource, Prisma } from '@prisma/client'; @Injectable() export class WatchlistService { public constructor( + private readonly benchmarkService: BenchmarkService, private readonly dataGatheringService: DataGatheringService, private readonly dataProviderService: DataProviderService, + private readonly marketDataService: MarketDataService, private readonly prismaService: PrismaService, private readonly symbolProfileService: SymbolProfileService ) {} @@ -87,7 +91,7 @@ export class WatchlistService { public async getWatchlistItems( userId: string - ): Promise { + ): Promise { const user = await this.prismaService.user.findUnique({ select: { watchlist: { @@ -97,6 +101,50 @@ export class WatchlistService { where: { id: userId } }); - return user.watchlist ?? []; + const [assetProfiles, quotes] = await Promise.all([ + this.symbolProfileService.getSymbolProfiles(user.watchlist), + this.dataProviderService.getQuotes({ + items: user.watchlist.map(({ dataSource, symbol }) => { + return { dataSource, symbol }; + }) + }) + ]); + + const watchlist = await Promise.all( + user.watchlist.map(async ({ dataSource, symbol }) => { + const assetProfile = assetProfiles.find((profile) => { + return profile.dataSource === dataSource && profile.symbol === symbol; + }); + + const allTimeHigh = await this.marketDataService.getMax({ + dataSource, + symbol + }); + + const performancePercent = + this.benchmarkService.calculateChangeInPercentage( + allTimeHigh?.marketPrice, + quotes[symbol]?.marketPrice + ); + + return { + dataSource, + symbol, + marketCondition: + this.benchmarkService.getMarketCondition(performancePercent), + name: assetProfile?.name, + performances: { + allTimeHigh: { + performancePercent, + date: allTimeHigh?.date + } + } + }; + }) + ); + + return watchlist.sort((a, b) => { + return a.name.localeCompare(b.name); + }); } } diff --git a/apps/api/src/services/benchmark/benchmark.service.ts b/apps/api/src/services/benchmark/benchmark.service.ts index 95cb9e5d2..f37f26bfc 100644 --- a/apps/api/src/services/benchmark/benchmark.service.ts +++ b/apps/api/src/services/benchmark/benchmark.service.ts @@ -212,6 +212,18 @@ export class BenchmarkService { }; } + public getMarketCondition( + aPerformanceInPercent: number + ): Benchmark['marketCondition'] { + if (aPerformanceInPercent >= 0) { + return 'ALL_TIME_HIGH'; + } else if (aPerformanceInPercent <= -0.2) { + return 'BEAR_MARKET'; + } else { + return 'NEUTRAL_MARKET'; + } + } + private async calculateAndCacheBenchmarks({ enableSharing = false }): Promise { @@ -302,16 +314,4 @@ export class BenchmarkService { return benchmarks; } - - private getMarketCondition( - aPerformanceInPercent: number - ): Benchmark['marketCondition'] { - if (aPerformanceInPercent >= 0) { - return 'ALL_TIME_HIGH'; - } else if (aPerformanceInPercent <= -0.2) { - return 'BEAR_MARKET'; - } else { - return 'NEUTRAL_MARKET'; - } - } } diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts index daf512b34..efad2fef5 100644 --- a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts @@ -6,6 +6,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { BenchmarkTrend } from '@ghostfolio/common/types'; import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; @@ -118,15 +119,17 @@ export class HomeWatchlistComponent implements OnDestroy, OnInit { .fetchWatchlist() .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(({ watchlist }) => { - this.watchlist = watchlist.map(({ dataSource, symbol }) => ({ - dataSource, - symbol, - marketCondition: null, - name: symbol, - performances: null, - trend50d: 'UNKNOWN', - trend200d: 'UNKNOWN' - })); + this.watchlist = watchlist.map( + ({ dataSource, marketCondition, name, performances, symbol }) => ({ + dataSource, + marketCondition, + name, + performances, + symbol, + trend50d: 'UNKNOWN' as BenchmarkTrend, + trend200d: 'UNKNOWN' as BenchmarkTrend + }) + ); this.changeDetectorRef.markForCheck(); }); diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.html b/apps/client/src/app/components/home-watchlist/home-watchlist.html index ef073d331..d290a4a2d 100644 --- a/apps/client/src/app/components/home-watchlist/home-watchlist.html +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.html @@ -7,7 +7,7 @@ } -
+
Date: Fri, 2 May 2025 16:46:43 +0200 Subject: [PATCH 32/91] Feature/improve watchlist for impersonation mode (#4632) * Improve watchlist for impersonation mode * Update changelog --- CHANGELOG.md | 1 + .../watchlist/watchlist.controller.ts | 13 ++++++-- .../endpoints/watchlist/watchlist.module.ts | 2 ++ .../home-watchlist.component.ts | 30 ++++++++++++++----- .../home-watchlist/home-watchlist.html | 2 +- 5 files changed, 37 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85df415b5..7bbdaf434 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Extended the watchlist by the date of the last all time high, the current change to the all time high and the current market condition (experimental) +- Added support for the impersonation mode in the watchlist (experimental) ### Changed diff --git a/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts b/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts index c9e41d5d3..8d9d322a8 100644 --- a/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts +++ b/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts @@ -2,6 +2,8 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorat import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor'; +import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; +import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; import { WatchlistResponse } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import { RequestWithUser } from '@ghostfolio/common/types'; @@ -11,6 +13,7 @@ import { Controller, Delete, Get, + Headers, HttpException, Inject, Param, @@ -29,6 +32,7 @@ import { WatchlistService } from './watchlist.service'; @Controller('watchlist') export class WatchlistController { public constructor( + private readonly impersonationService: ImpersonationService, @Inject(REQUEST) private readonly request: RequestWithUser, private readonly watchlistService: WatchlistService ) {} @@ -79,9 +83,14 @@ export class WatchlistController { @HasPermission(permissions.readWatchlist) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(TransformDataSourceInResponseInterceptor) - public async getWatchlistItems(): Promise { + public async getWatchlistItems( + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string + ): Promise { + const impersonationUserId = + await this.impersonationService.validateImpersonationId(impersonationId); + const watchlist = await this.watchlistService.getWatchlistItems( - this.request.user.id + impersonationUserId || this.request.user.id ); return { diff --git a/apps/api/src/app/endpoints/watchlist/watchlist.module.ts b/apps/api/src/app/endpoints/watchlist/watchlist.module.ts index a2d32d1d2..ce9ae12bb 100644 --- a/apps/api/src/app/endpoints/watchlist/watchlist.module.ts +++ b/apps/api/src/app/endpoints/watchlist/watchlist.module.ts @@ -2,6 +2,7 @@ import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module'; import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.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'; import { DataGatheringModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; @@ -18,6 +19,7 @@ import { WatchlistService } from './watchlist.service'; BenchmarkModule, DataGatheringModule, DataProviderModule, + ImpersonationModule, MarketDataModule, PrismaModule, SymbolProfileModule, diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts index efad2fef5..5c0b3fa50 100644 --- a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts @@ -1,4 +1,5 @@ import { DataService } from '@ghostfolio/client/services/data.service'; +import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { AssetProfileIdentifier, @@ -45,6 +46,7 @@ import { CreateWatchlistItemDialogParams } from './create-watchlist-item-dialog/ }) export class HomeWatchlistComponent implements OnDestroy, OnInit { public deviceType: string; + public hasImpersonationId: boolean; public hasPermissionToCreateWatchlistItem: boolean; public hasPermissionToDeleteWatchlistItem: boolean; public user: User; @@ -57,12 +59,20 @@ export class HomeWatchlistComponent implements OnDestroy, OnInit { private dataService: DataService, private deviceService: DeviceDetectorService, private dialog: MatDialog, + private impersonationStorageService: ImpersonationStorageService, private route: ActivatedRoute, private router: Router, private userService: UserService ) { this.deviceType = this.deviceService.getDeviceInfo().deviceType; + this.impersonationStorageService + .onChangeHasImpersonation() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((impersonationId) => { + this.hasImpersonationId = !!impersonationId; + }); + this.route.queryParams .pipe(takeUntil(this.unsubscribeSubject)) .subscribe((params) => { @@ -77,14 +87,18 @@ export class HomeWatchlistComponent implements OnDestroy, OnInit { if (state?.user) { this.user = state.user; - this.hasPermissionToCreateWatchlistItem = hasPermission( - this.user.permissions, - permissions.createWatchlistItem - ); - this.hasPermissionToDeleteWatchlistItem = hasPermission( - this.user.permissions, - permissions.deleteWatchlistItem - ); + this.hasPermissionToCreateWatchlistItem = + !this.hasImpersonationId && + hasPermission( + this.user.permissions, + permissions.createWatchlistItem + ); + this.hasPermissionToDeleteWatchlistItem = + !this.hasImpersonationId && + hasPermission( + this.user.permissions, + permissions.deleteWatchlistItem + ); this.changeDetectorRef.markForCheck(); } diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.html b/apps/client/src/app/components/home-watchlist/home-watchlist.html index d290a4a2d..9149eab91 100644 --- a/apps/client/src/app/components/home-watchlist/home-watchlist.html +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.html @@ -20,7 +20,7 @@
-@if (hasPermissionToCreateWatchlistItem) { +@if (!hasImpersonationId && hasPermissionToCreateWatchlistItem) {
Date: Fri, 2 May 2025 16:47:18 +0200 Subject: [PATCH 33/91] Feature/upgrade bootstrap to version 4.6.2 (#4631) * Upgrade bootstrap to version 4.6.2 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 22 ++++++++++++++-------- package.json | 2 +- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bbdaf434..9b562a3dd 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 ### Changed - Improved the language localization for Français (`fr`) +- Upgraded `bootstrap` from version `4.6.0` to `4.6.2` ### Fixed diff --git a/package-lock.json b/package-lock.json index 27acd2820..3472e8898 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "@stripe/stripe-js": "5.4.0", "alphavantage": "2.2.0", "big.js": "6.2.2", - "bootstrap": "4.6.0", + "bootstrap": "4.6.2", "bull": "4.16.5", "cache-manager": "5.7.6", "cache-manager-redis-yet": "5.1.4", @@ -14322,14 +14322,20 @@ "license": "ISC" }, "node_modules/bootstrap": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz", - "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", + "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - }, "peerDependencies": { "jquery": "1.9.1 - 3", "popper.js": "^1.16.1" diff --git a/package.json b/package.json index c64163886..29c2a69e4 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "@stripe/stripe-js": "5.4.0", "alphavantage": "2.2.0", "big.js": "6.2.2", - "bootstrap": "4.6.0", + "bootstrap": "4.6.2", "bull": "4.16.5", "cache-manager": "5.7.6", "cache-manager-redis-yet": "5.1.4", From c3887e2f8eff06870fb15a5288bbcde9637635ee Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 2 May 2025 17:01:39 +0200 Subject: [PATCH 34/91] Release 2.159.0 (#4643) --- 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 9b562a3dd..f9f4a443e 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.159.0 - 2025-05-02 ### Added diff --git a/package-lock.json b/package-lock.json index 3472e8898..6e4e2c308 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.158.0", + "version": "2.159.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.158.0", + "version": "2.159.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 29c2a69e4..f591c9333 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.158.0", + "version": "2.159.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 3e963228d6f99ec5c4408ca5056b3f0e5844a9ae Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 2 May 2025 19:15:11 +0200 Subject: [PATCH 35/91] Feature/refactor accounts response interface (#4644) * Refactor accounts response interface --- apps/api/src/app/account/account.controller.ts | 4 ++-- apps/api/src/app/portfolio/portfolio.service.ts | 4 ++-- apps/client/src/app/services/data.service.ts | 4 ++-- libs/common/src/lib/interfaces/index.ts | 4 ++-- .../accounts-response.interface.ts} | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) rename libs/common/src/lib/interfaces/{accounts.interface.ts => responses/accounts-response.interface.ts} (84%) diff --git a/apps/api/src/app/account/account.controller.ts b/apps/api/src/app/account/account.controller.ts index 71ff8a044..8512d8409 100644 --- a/apps/api/src/app/account/account.controller.ts +++ b/apps/api/src/app/account/account.controller.ts @@ -9,7 +9,7 @@ import { ImpersonationService } from '@ghostfolio/api/services/impersonation/imp import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; import { AccountBalancesResponse, - Accounts + AccountsResponse } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import type { @@ -90,7 +90,7 @@ export class AccountController { @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId, @Query('dataSource') filterByDataSource?: string, @Query('symbol') filterBySymbol?: string - ): Promise { + ): Promise { const impersonationUserId = await this.impersonationService.validateImpersonationId(impersonationId); diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 3aa9696b5..a24809740 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -35,7 +35,7 @@ import { } from '@ghostfolio/common/config'; import { DATE_FORMAT, getSum, parseDate } from '@ghostfolio/common/helper'; import { - Accounts, + AccountsResponse, EnhancedSymbolProfile, Filter, HistoricalDataItem, @@ -209,7 +209,7 @@ export class PortfolioService { filters?: Filter[]; userId: string; withExcludedAccounts?: boolean; - }): Promise { + }): Promise { const accounts = await this.getAccounts({ filters, userId, diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 353bc4153..830543dda 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -25,7 +25,7 @@ import { Access, AccessTokenResponse, AccountBalancesResponse, - Accounts, + AccountsResponse, AiPromptResponse, ApiKeyResponse, AssetProfileIdentifier, @@ -191,7 +191,7 @@ export class DataService { public fetchAccounts({ filters }: { filters?: Filter[] } = {}) { const params = this.buildFiltersAsQueryParams({ filters }); - return this.http.get('/api/v1/account', { params }); + return this.http.get('/api/v1/account', { params }); } public fetchActivities({ diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index b83b6d5f8..3e0528fd7 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -1,6 +1,5 @@ import type { Access } from './access.interface'; import type { AccountBalance } from './account-balance.interface'; -import type { Accounts } from './accounts.interface'; import type { AdminData } from './admin-data.interface'; import type { AdminJobs } from './admin-jobs.interface'; import type { AdminMarketDataDetails } from './admin-market-data-details.interface'; @@ -40,6 +39,7 @@ import type { Position } from './position.interface'; import type { Product } from './product'; import type { AccessTokenResponse } from './responses/access-token-response.interface'; import type { AccountBalancesResponse } from './responses/account-balances-response.interface'; +import type { AccountsResponse } from './responses/accounts-response.interface'; import type { AiPromptResponse } from './responses/ai-prompt-response.interface'; import type { ApiKeyResponse } from './responses/api-key-response.interface'; import type { BenchmarkResponse } from './responses/benchmark-response.interface'; @@ -74,7 +74,7 @@ export { AccessTokenResponse, AccountBalance, AccountBalancesResponse, - Accounts, + AccountsResponse, AdminData, AdminJobs, AdminMarketData, diff --git a/libs/common/src/lib/interfaces/accounts.interface.ts b/libs/common/src/lib/interfaces/responses/accounts-response.interface.ts similarity index 84% rename from libs/common/src/lib/interfaces/accounts.interface.ts rename to libs/common/src/lib/interfaces/responses/accounts-response.interface.ts index 7100a6848..5e03ea34a 100644 --- a/libs/common/src/lib/interfaces/accounts.interface.ts +++ b/libs/common/src/lib/interfaces/responses/accounts-response.interface.ts @@ -1,6 +1,6 @@ import { AccountWithValue } from '@ghostfolio/common/types'; -export interface Accounts { +export interface AccountsResponse { accounts: AccountWithValue[]; totalBalanceInBaseCurrency: number; totalValueInBaseCurrency: number; From 1bced964609a2843ecb39449a7c1e69312738aeb Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 3 May 2025 20:47:02 +0200 Subject: [PATCH 36/91] Feature/deprecate portfolio position endpoints (#4648) * Deprecate api/v1/portfolio/position endpoints * Update changelog --- CHANGELOG.md | 7 ++ apps/api/src/app/import/import.service.ts | 2 +- .../src/app/portfolio/portfolio.controller.ts | 74 +++++++++++++++++-- .../src/app/portfolio/portfolio.service.ts | 8 +- apps/client/src/app/services/data.service.ts | 8 +- libs/common/src/lib/interfaces/index.ts | 2 + .../portfolio-holding-response.interface.ts | 2 +- 7 files changed, 88 insertions(+), 15 deletions(-) rename apps/api/src/app/portfolio/interfaces/portfolio-holding-detail.interface.ts => libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts (96%) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9f4a443e..95d1e00e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ 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 + +- Deprecated the endpoint to get a portfolio position in favor of get a holding +- Deprecated the endpoint to update portfolio position tags in favor of update holding tags + ## 2.159.0 - 2025-05-02 ### Added diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index b6fe0d949..4cb6d46c2 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -50,7 +50,7 @@ export class ImportService { }: AssetProfileIdentifier): Promise { try { const { firstBuyDate, historicalData, orders } = - await this.portfolioService.getPosition(dataSource, undefined, symbol); + await this.portfolioService.getHolding(dataSource, undefined, symbol); const [[assetProfile], dividends] = await Promise.all([ this.symbolProfileService.getSymbolProfiles([ diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index c3e46d50d..5b68f58e0 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -20,6 +20,7 @@ import { import { PortfolioDetails, PortfolioDividends, + PortfolioHoldingResponse, PortfolioHoldingsResponse, PortfolioInvestments, PortfolioPerformanceResponse, @@ -56,7 +57,6 @@ import { AssetClass, AssetSubClass, DataSource } from '@prisma/client'; import { Big } from 'big.js'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; -import { PortfolioHoldingDetail } from './interfaces/portfolio-holding-detail.interface'; import { PortfolioService } from './portfolio.service'; import { UpdateHoldingTagsDto } from './update-holding-tags.dto'; @@ -365,6 +365,32 @@ export class PortfolioController { return { dividends }; } + @Get('holding/:dataSource/:symbol') + @UseInterceptors(RedactValuesInResponseInterceptor) + @UseInterceptors(TransformDataSourceInRequestInterceptor) + @UseInterceptors(TransformDataSourceInResponseInterceptor) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async getHolding( + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, + @Param('dataSource') dataSource: DataSource, + @Param('symbol') symbol: string + ): Promise { + const holding = await this.portfolioService.getHolding( + dataSource, + impersonationId, + symbol + ); + + if (!holding) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } + + return holding; + } + @Get('holdings') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(RedactValuesInResponseInterceptor) @@ -583,6 +609,9 @@ export class PortfolioController { return performanceInformation; } + /** + * @deprecated + */ @Get('position/:dataSource/:symbol') @UseInterceptors(RedactValuesInResponseInterceptor) @UseInterceptors(TransformDataSourceInRequestInterceptor) @@ -592,8 +621,8 @@ export class PortfolioController { @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Param('dataSource') dataSource: DataSource, @Param('symbol') symbol: string - ): Promise { - const holding = await this.portfolioService.getPosition( + ): Promise { + const holding = await this.portfolioService.getHolding( dataSource, impersonationId, symbol @@ -634,7 +663,7 @@ export class PortfolioController { } @HasPermission(permissions.updateOrder) - @Put('position/:dataSource/:symbol/tags') + @Put('holding/:dataSource/:symbol/tags') @UseInterceptors(TransformDataSourceInRequestInterceptor) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async updateHoldingTags( @@ -643,7 +672,42 @@ export class PortfolioController { @Param('dataSource') dataSource: DataSource, @Param('symbol') symbol: string ): Promise { - const holding = await this.portfolioService.getPosition( + const holding = await this.portfolioService.getHolding( + dataSource, + impersonationId, + symbol + ); + + if (!holding) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } + + await this.portfolioService.updateTags({ + dataSource, + impersonationId, + symbol, + tags: data.tags, + userId: this.request.user.id + }); + } + + /** + * @deprecated + */ + @HasPermission(permissions.updateOrder) + @Put('position/:dataSource/:symbol/tags') + @UseInterceptors(TransformDataSourceInRequestInterceptor) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async updatePositionTags( + @Body() data: UpdateHoldingTagsDto, + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, + @Param('dataSource') dataSource: DataSource, + @Param('symbol') symbol: string + ): Promise { + const holding = await this.portfolioService.getHolding( dataSource, impersonationId, symbol diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index a24809740..26265e8c8 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -41,6 +41,7 @@ import { HistoricalDataItem, InvestmentItem, PortfolioDetails, + PortfolioHoldingResponse, PortfolioInvestments, PortfolioPerformanceResponse, PortfolioPosition, @@ -87,7 +88,6 @@ import { isEmpty } from 'lodash'; import { PortfolioCalculator } from './calculator/portfolio-calculator'; import { PortfolioCalculatorFactory } from './calculator/portfolio-calculator.factory'; -import { PortfolioHoldingDetail } from './interfaces/portfolio-holding-detail.interface'; import { RulesService } from './rules.service'; const asiaPacificMarkets = require('../../assets/countries/asia-pacific-markets.json'); @@ -631,11 +631,11 @@ export class PortfolioService { }; } - public async getPosition( + public async getHolding( aDataSource: DataSource, aImpersonationId: string, aSymbol: string - ): Promise { + ): Promise { const userId = await this.getUserId(aImpersonationId, this.request.user.id); const user = await this.userService.user({ id: userId }); const userCurrency = this.getUserCurrency(user); @@ -927,7 +927,7 @@ export class PortfolioService { } } - public async getPositions({ + public async getHoldings({ dateRange = 'max', filters, impersonationId diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 830543dda..41cde8c87 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -13,7 +13,6 @@ import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; -import { PortfolioHoldingDetail } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-holding-detail.interface'; import { SymbolItem } from '@ghostfolio/api/app/symbol/interfaces/symbol-item.interface'; import { DeleteOwnUserDto } from '@ghostfolio/api/app/user/delete-own-user.dto'; import { UserItem } from '@ghostfolio/api/app/user/interfaces/user-item.interface'; @@ -40,6 +39,7 @@ import { OAuthResponse, PortfolioDetails, PortfolioDividends, + PortfolioHoldingResponse, PortfolioHoldingsResponse, PortfolioInvestments, PortfolioPerformanceResponse, @@ -406,8 +406,8 @@ export class DataService { symbol: string; }) { return this.http - .get( - `/api/v1/portfolio/position/${dataSource}/${symbol}` + .get( + `/api/v1/portfolio/holding/${dataSource}/${symbol}` ) .pipe( map((data) => { @@ -776,7 +776,7 @@ export class DataService { tags }: { tags: Tag[] } & AssetProfileIdentifier) { return this.http.put( - `/api/v1/portfolio/position/${dataSource}/${symbol}/tags`, + `/api/v1/portfolio/holding/${dataSource}/${symbol}/tags`, { tags } ); } diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index 3e0528fd7..bdf982f55 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -52,6 +52,7 @@ import type { ImportResponse } from './responses/import-response.interface'; import type { LookupResponse } from './responses/lookup-response.interface'; import type { MarketDataDetailsResponse } from './responses/market-data-details-response.interface'; import type { OAuthResponse } from './responses/oauth-response.interface'; +import { PortfolioHoldingResponse } from './responses/portfolio-holding-response.interface'; import type { PortfolioHoldingsResponse } from './responses/portfolio-holdings-response.interface'; import type { PortfolioPerformanceResponse } from './responses/portfolio-performance-response.interface'; import type { PortfolioReportResponse } from './responses/portfolio-report.interface'; @@ -112,6 +113,7 @@ export { PortfolioChart, PortfolioDetails, PortfolioDividends, + PortfolioHoldingResponse, PortfolioHoldingsResponse, PortfolioInvestments, PortfolioItem, diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-holding-detail.interface.ts b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts similarity index 96% rename from apps/api/src/app/portfolio/interfaces/portfolio-holding-detail.interface.ts rename to libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts index 79e4d40dc..cfdc1611d 100644 --- a/apps/api/src/app/portfolio/interfaces/portfolio-holding-detail.interface.ts +++ b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts @@ -7,7 +7,7 @@ import { import { Tag } from '@prisma/client'; -export interface PortfolioHoldingDetail { +export interface PortfolioHoldingResponse { averagePrice: number; dataProviderInfo: DataProviderInfo; dividendInBaseCurrency: number; From 3646fb7f7769bdce495d995ee6d69c222f3e647a Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 May 2025 09:48:43 +0200 Subject: [PATCH 37/91] Feature/refactor portfolio holding response (#4649) * Refactor portfolio holding response * maxPrice -> marketPriceMax * minPrice -> marketPriceMin * orders -> activities --- apps/api/src/app/import/import.service.ts | 6 +-- .../src/app/portfolio/portfolio.service.ts | 52 +++++++++++-------- .../holding-detail-dialog.component.ts | 12 ++--- .../holding-detail-dialog.html | 12 ++--- apps/client/src/app/services/data.service.ts | 4 +- .../portfolio-holding-response.interface.ts | 6 +-- 6 files changed, 49 insertions(+), 43 deletions(-) diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 4cb6d46c2..7afb2cd72 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -49,7 +49,7 @@ export class ImportService { symbol }: AssetProfileIdentifier): Promise { try { - const { firstBuyDate, historicalData, orders } = + const { activities, firstBuyDate, historicalData } = await this.portfolioService.getHolding(dataSource, undefined, symbol); const [[assetProfile], dividends] = await Promise.all([ @@ -68,7 +68,7 @@ export class ImportService { }) ]); - const accounts = orders + const accounts = activities .filter(({ Account }) => { return !!Account; }) @@ -88,7 +88,7 @@ export class ImportService { const value = new Big(quantity).mul(marketPrice).toNumber(); const date = parseDate(dateString); - const isDuplicate = orders.some((activity) => { + const isDuplicate = activities.some((activity) => { return ( activity.accountId === Account?.id && activity.SymbolProfile.currency === assetProfile.currency && diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 26265e8c8..47c773e80 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -648,6 +648,7 @@ export class PortfolioService { if (activities.length === 0) { return { + activities: [], averagePrice: undefined, dataProviderInfo: undefined, dividendInBaseCurrency: undefined, @@ -662,13 +663,12 @@ export class PortfolioService { historicalData: [], investment: undefined, marketPrice: undefined, - maxPrice: undefined, - minPrice: undefined, + marketPriceMax: undefined, + marketPriceMin: undefined, netPerformance: undefined, netPerformancePercent: undefined, netPerformancePercentWithCurrencyEffect: undefined, netPerformanceWithCurrencyEffect: undefined, - orders: [], quantity: undefined, SymbolProfile: undefined, tags: [], @@ -714,7 +714,7 @@ export class PortfolioService { transactionCount } = position; - const activitiesOfPosition = activities.filter(({ SymbolProfile }) => { + const activitiesOfHolding = activities.filter(({ SymbolProfile }) => { return ( SymbolProfile.dataSource === dataSource && SymbolProfile.symbol === symbol @@ -748,12 +748,12 @@ export class PortfolioService { ); const historicalDataArray: HistoricalDataItem[] = []; - let maxPrice = Math.max( - activitiesOfPosition[0].unitPriceInAssetProfileCurrency, + let marketPriceMax = Math.max( + activitiesOfHolding[0].unitPriceInAssetProfileCurrency, marketPrice ); - let minPrice = Math.min( - activitiesOfPosition[0].unitPriceInAssetProfileCurrency, + let marketPriceMin = Math.min( + activitiesOfHolding[0].unitPriceInAssetProfileCurrency, marketPrice ); @@ -793,27 +793,31 @@ export class PortfolioService { quantity: currentQuantity }); - maxPrice = Math.max(marketPrice ?? 0, maxPrice); - minPrice = Math.min(marketPrice ?? Number.MAX_SAFE_INTEGER, minPrice); + marketPriceMax = Math.max(marketPrice ?? 0, marketPriceMax); + marketPriceMin = Math.min( + marketPrice ?? Number.MAX_SAFE_INTEGER, + marketPriceMin + ); } } else { // Add historical entry for buy date, if no historical data available historicalDataArray.push({ - averagePrice: activitiesOfPosition[0].unitPriceInAssetProfileCurrency, + averagePrice: activitiesOfHolding[0].unitPriceInAssetProfileCurrency, date: firstBuyDate, - marketPrice: activitiesOfPosition[0].unitPriceInAssetProfileCurrency, - quantity: activitiesOfPosition[0].quantity + marketPrice: activitiesOfHolding[0].unitPriceInAssetProfileCurrency, + quantity: activitiesOfHolding[0].quantity }); } return { firstBuyDate, marketPrice, - maxPrice, - minPrice, + marketPriceMax, + marketPriceMin, SymbolProfile, tags, transactionCount, + activities: activitiesOfHolding, averagePrice: averagePrice.toNumber(), dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0], dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), @@ -842,7 +846,6 @@ export class PortfolioService { ]?.toNumber(), netPerformanceWithCurrencyEffect: position.netPerformanceWithCurrencyEffectMap?.['max']?.toNumber(), - orders: activitiesOfPosition, quantity: quantity.toNumber(), value: this.exchangeRateDataService.toCurrency( quantity.mul(marketPrice ?? 0).toNumber(), @@ -881,8 +884,8 @@ export class PortfolioService { } const historicalDataArray: HistoricalDataItem[] = []; - let maxPrice = marketPrice; - let minPrice = marketPrice; + let marketPriceMax = marketPrice; + let marketPriceMin = marketPrice; for (const [date, { marketPrice }] of Object.entries( historicalData[aSymbol] @@ -892,15 +895,19 @@ export class PortfolioService { value: marketPrice }); - maxPrice = Math.max(marketPrice ?? 0, maxPrice); - minPrice = Math.min(marketPrice ?? Number.MAX_SAFE_INTEGER, minPrice); + marketPriceMax = Math.max(marketPrice ?? 0, marketPriceMax); + marketPriceMin = Math.min( + marketPrice ?? Number.MAX_SAFE_INTEGER, + marketPriceMin + ); } return { marketPrice, - maxPrice, - minPrice, + marketPriceMax, + marketPriceMin, SymbolProfile, + activities: [], averagePrice: 0, dataProviderInfo: undefined, dividendInBaseCurrency: 0, @@ -918,7 +925,6 @@ export class PortfolioService { netPerformancePercent: undefined, netPerformancePercentWithCurrencyEffect: undefined, netPerformanceWithCurrencyEffect: undefined, - orders: [], quantity: 0, tags: [], transactionCount: 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 25317e0c5..925a64429 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 @@ -105,8 +105,8 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { public investmentPrecision = 2; public marketDataItems: MarketData[] = []; public marketPrice: number; - public maxPrice: number; - public minPrice: number; + public marketPriceMax: number; + public marketPriceMin: number; public netPerformance: number; public netPerformancePrecision = 2; public netPerformancePercent: number; @@ -234,8 +234,8 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { historicalData, investment, marketPrice, - maxPrice, - minPrice, + marketPriceMax, + marketPriceMin, netPerformance, netPerformancePercent, netPerformancePercentWithCurrencyEffect, @@ -297,8 +297,8 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { } this.marketPrice = marketPrice; - this.maxPrice = maxPrice; - this.minPrice = minPrice; + this.marketPriceMax = marketPriceMax; + this.marketPriceMin = marketPriceMin; this.netPerformance = netPerformance; if ( 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 9e8855d71..d18dc479b 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 @@ -106,11 +106,11 @@ [locale]="data.locale" [ngClass]="{ 'text-danger': - minPrice?.toFixed(2) === marketPrice?.toFixed(2) && - maxPrice?.toFixed(2) !== minPrice?.toFixed(2) + marketPriceMin?.toFixed(2) === marketPrice?.toFixed(2) && + marketPriceMax?.toFixed(2) !== marketPriceMin?.toFixed(2) }" [unit]="SymbolProfile?.currency" - [value]="minPrice" + [value]="marketPriceMin" >Minimum Price
@@ -122,11 +122,11 @@ [locale]="data.locale" [ngClass]="{ 'text-success': - maxPrice?.toFixed(2) === marketPrice?.toFixed(2) && - maxPrice?.toFixed(2) !== minPrice?.toFixed(2) + marketPriceMax?.toFixed(2) === marketPrice?.toFixed(2) && + marketPriceMax?.toFixed(2) !== marketPriceMin?.toFixed(2) }" [unit]="SymbolProfile?.currency" - [value]="maxPrice" + [value]="marketPriceMax" >Maximum Price diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 41cde8c87..e3bd9f27b 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -411,8 +411,8 @@ export class DataService { ) .pipe( map((data) => { - if (data.orders) { - for (const order of data.orders) { + if (data.activities) { + for (const order of data.activities) { order.createdAt = parseISO(order.createdAt as unknown as string); order.date = parseISO(order.date as unknown as string); } 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 cfdc1611d..c460242af 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 @@ -8,6 +8,7 @@ import { import { Tag } from '@prisma/client'; export interface PortfolioHoldingResponse { + activities: Activity[]; averagePrice: number; dataProviderInfo: DataProviderInfo; dividendInBaseCurrency: number; @@ -22,13 +23,12 @@ export interface PortfolioHoldingResponse { historicalData: HistoricalDataItem[]; investment: number; marketPrice: number; - maxPrice: number; - minPrice: number; + marketPriceMax: number; + marketPriceMin: number; netPerformance: number; netPerformancePercent: number; netPerformancePercentWithCurrencyEffect: number; netPerformanceWithCurrencyEffect: number; - orders: Activity[]; quantity: number; SymbolProfile: EnhancedSymbolProfile; tags: Tag[]; From 308dfaa58dcd6e5af65bc73c58462e551ad76ddf Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 May 2025 11:16:32 +0200 Subject: [PATCH 38/91] Feature/upgrade prisma to version 6.7.0 (#4647) * Upgrade prisma to version 6.7.0 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 72 +++++++++++++++++++++++------------------------ package.json | 4 +-- 3 files changed, 39 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95d1e00e8..ea0e682f8 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 - Deprecated the endpoint to get a portfolio position in favor of get a holding - Deprecated the endpoint to update portfolio position tags in favor of update holding tags +- Upgraded `prisma` from version `6.6.0` to `6.7.0` ## 2.159.0 - 2025-05-02 diff --git a/package-lock.json b/package-lock.json index 6e4e2c308..cd38cff6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "@nestjs/platform-express": "10.4.15", "@nestjs/schedule": "4.1.2", "@nestjs/serve-static": "4.0.2", - "@prisma/client": "6.6.0", + "@prisma/client": "6.7.0", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", "@stripe/stripe-js": "5.4.0", @@ -150,7 +150,7 @@ "nx": "20.8.1", "prettier": "3.5.3", "prettier-plugin-organize-attributes": "1.0.0", - "prisma": "6.6.0", + "prisma": "6.7.0", "react": "18.2.0", "react-dom": "18.2.0", "replace-in-file": "8.3.0", @@ -9631,9 +9631,9 @@ "license": "MIT" }, "node_modules/@prisma/client": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.6.0.tgz", - "integrity": "sha512-vfp73YT/BHsWWOAuthKQ/1lBgESSqYqAWZEYyTdGXyFAHpmewwWL2Iz6ErIzkj4aHbuc6/cGSsE6ZY+pBO04Cg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.7.0.tgz", + "integrity": "sha512-+k61zZn1XHjbZul8q6TdQLpuI/cvyfil87zqK2zpreNIXyXtpUv3+H/oM69hcsFcZXaokHJIzPAt5Z8C8eK2QA==", "hasInstallScript": true, "license": "Apache-2.0", "engines": { @@ -9653,9 +9653,9 @@ } }, "node_modules/@prisma/config": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.6.0.tgz", - "integrity": "sha512-d8FlXRHsx72RbN8nA2QCRORNv5AcUnPXgtPvwhXmYkQSMF/j9cKaJg+9VcUzBRXGy9QBckNzEQDEJZdEOZ+ubA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.7.0.tgz", + "integrity": "sha512-di8QDdvSz7DLUi3OOcCHSwxRNeW7jtGRUD2+Z3SdNE3A+pPiNT8WgUJoUyOwJmUr5t+JA2W15P78C/N+8RXrOA==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -9664,53 +9664,53 @@ } }, "node_modules/@prisma/debug": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.6.0.tgz", - "integrity": "sha512-DL6n4IKlW5k2LEXzpN60SQ1kP/F6fqaCgU/McgaYsxSf43GZ8lwtmXLke9efS+L1uGmrhtBUP4npV/QKF8s2ZQ==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.7.0.tgz", + "integrity": "sha512-RabHn9emKoYFsv99RLxvfG2GHzWk2ZI1BuVzqYtmMSIcuGboHY5uFt3Q3boOREM9de6z5s3bQoyKeWnq8Fz22w==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.6.0.tgz", - "integrity": "sha512-nC0IV4NHh7500cozD1fBoTwTD1ydJERndreIjpZr/S3mno3P6tm8qnXmIND5SwUkibNeSJMpgl4gAnlqJ/gVlg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.7.0.tgz", + "integrity": "sha512-3wDMesnOxPrOsq++e5oKV9LmIiEazFTRFZrlULDQ8fxdub5w4NgRBoxtWbvXmj2nJVCnzuz6eFix3OhIqsZ1jw==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.6.0", - "@prisma/engines-version": "6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a", - "@prisma/fetch-engine": "6.6.0", - "@prisma/get-platform": "6.6.0" + "@prisma/debug": "6.7.0", + "@prisma/engines-version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed", + "@prisma/fetch-engine": "6.7.0", + "@prisma/get-platform": "6.7.0" } }, "node_modules/@prisma/engines-version": { - "version": "6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a.tgz", - "integrity": "sha512-JzRaQ5Em1fuEcbR3nUsMNYaIYrOT1iMheenjCvzZblJcjv/3JIuxXN7RCNT5i6lRkLodW5ojCGhR7n5yvnNKrw==", + "version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed.tgz", + "integrity": "sha512-EvpOFEWf1KkJpDsBCrih0kg3HdHuaCnXmMn7XFPObpFTzagK1N0Q0FMnYPsEhvARfANP5Ok11QyoTIRA2hgJTA==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/fetch-engine": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.6.0.tgz", - "integrity": "sha512-Ohfo8gKp05LFLZaBlPUApM0M7k43a0jmo86YY35u1/4t+vuQH9mRGU7jGwVzGFY3v+9edeb/cowb1oG4buM1yw==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.7.0.tgz", + "integrity": "sha512-zLlAGnrkmioPKJR4Yf7NfW3hftcvqeNNEHleMZK9yX7RZSkhmxacAYyfGsCcqRt47jiZ7RKdgE0Wh2fWnm7WsQ==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.6.0", - "@prisma/engines-version": "6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a", - "@prisma/get-platform": "6.6.0" + "@prisma/debug": "6.7.0", + "@prisma/engines-version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed", + "@prisma/get-platform": "6.7.0" } }, "node_modules/@prisma/get-platform": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.6.0.tgz", - "integrity": "sha512-3qCwmnT4Jh5WCGUrkWcc6VZaw0JY7eWN175/pcb5Z6FiLZZ3ygY93UX0WuV41bG51a6JN/oBH0uywJ90Y+V5eA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.7.0.tgz", + "integrity": "sha512-i9IH5lO4fQwnMLvQLYNdgVh9TK3PuWBfQd7QLk/YurnAIg+VeADcZDbmhAi4XBBDD+hDif9hrKyASu0hbjwabw==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.6.0" + "@prisma/debug": "6.7.0" } }, "node_modules/@redis/bloom": { @@ -28457,15 +28457,15 @@ } }, "node_modules/prisma": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.6.0.tgz", - "integrity": "sha512-SYCUykz+1cnl6Ugd8VUvtTQq5+j1Q7C0CtzKPjQ8JyA2ALh0EEJkMCS+KgdnvKW1lrxjtjCyJSHOOT236mENYg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.7.0.tgz", + "integrity": "sha512-vArg+4UqnQ13CVhc2WUosemwh6hr6cr6FY2uzDvCIFwH8pu8BXVv38PktoMLVjtX7sbYThxbnZF5YiR8sN2clw==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/config": "6.6.0", - "@prisma/engines": "6.6.0" + "@prisma/config": "6.7.0", + "@prisma/engines": "6.7.0" }, "bin": { "prisma": "build/index.js" diff --git a/package.json b/package.json index f591c9333..161aa5395 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "@nestjs/platform-express": "10.4.15", "@nestjs/schedule": "4.1.2", "@nestjs/serve-static": "4.0.2", - "@prisma/client": "6.6.0", + "@prisma/client": "6.7.0", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", "@stripe/stripe-js": "5.4.0", @@ -196,7 +196,7 @@ "nx": "20.8.1", "prettier": "3.5.3", "prettier-plugin-organize-attributes": "1.0.0", - "prisma": "6.6.0", + "prisma": "6.7.0", "react": "18.2.0", "react-dom": "18.2.0", "replace-in-file": "8.3.0", From 620ae023d9ac8c1f3450c8f4285a373b6b57a130 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 May 2025 11:17:15 +0200 Subject: [PATCH 39/91] Feature/move watchlist to general availability (#4653) * Add watchlist to features page * Move watchlist to general availability * Update changelog --- CHANGELOG.md | 5 +++ .../src/app/pages/features/features-page.html | 45 +++++++++++++------ .../src/app/pages/home/home-page.component.ts | 12 ++--- 3 files changed, 42 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea0e682f8..a124432f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Added the watchlist to the features page + ### Changed +- Moved the watchlist from experimental to general availability - Deprecated the endpoint to get a portfolio position in favor of get a holding - Deprecated the endpoint to update portfolio position tags in favor of update holding tags - Upgraded `prisma` from version `6.6.0` to `6.7.0` diff --git a/apps/client/src/app/pages/features/features-page.html b/apps/client/src/app/pages/features/features-page.html index aa2ae3725..30b1af29c 100644 --- a/apps/client/src/app/pages/features/features-page.html +++ b/apps/client/src/app/pages/features/features-page.html @@ -175,10 +175,15 @@
-

Dark Mode

+

+ Static Analysis + @if (hasPermissionForSubscription) { + + } +

- Ghostfolio automatically switches to a dark color theme based - on your operating system's preferences. + Identify potential risks in your portfolio with Ghostfolio + X-ray, the static portfolio analysis.

@@ -188,10 +193,14 @@
-

Zen Mode

+

+ Watchlist + @if (hasPermissionForSubscription) { + + } +

- Keep calm and activate Zen Mode if the markets are going - crazy. + Follow assets you are interested in closely on your watchlist.

@@ -221,15 +230,23 @@
-

- Static Analysis - @if (hasPermissionForSubscription) { - - } -

+

Dark Mode

- Identify potential risks in your portfolio with Ghostfolio - X-ray, the static portfolio analysis. + Ghostfolio automatically switches to a dark color theme based + on your operating system's preferences. +

+
+
+
+ +
+ + +
+

Zen Mode

+

+ Keep calm and activate Zen Mode if the markets are going + crazy.

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 928ad2931..ec49143a8 100644 --- a/apps/client/src/app/pages/home/home-page.component.ts +++ b/apps/client/src/app/pages/home/home-page.component.ts @@ -48,18 +48,18 @@ export class HomePageComponent implements OnDestroy, OnInit { label: $localize`Summary`, path: ['/home', 'summary'] }, + { + iconName: 'bookmark-outline', + label: $localize`Watchlist`, + path: ['/home', 'watchlist'] + }, { iconName: 'newspaper-outline', label: $localize`Markets`, path: ['/home', 'market'] - }, - { - iconName: 'bookmark-outline', - label: $localize`Watchlist`, - path: ['/home', 'watchlist'], - showCondition: this.user?.settings?.isExperimentalFeatures } ]; + this.user = state.user; this.changeDetectorRef.markForCheck(); From b93671c74006de66c8a3b227228fcf33a00204a8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 4 May 2025 12:03:30 +0200 Subject: [PATCH 40/91] Feature/update locales (#4654) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.de.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.es.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.fr.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.it.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.nl.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.pl.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.pt.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.tr.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.uk.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.zh.xlf | 24 ++++++++++++++---------- 12 files changed, 168 insertions(+), 120 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 5dd6bfbd2..0896d6b03 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -354,7 +354,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -3491,7 +3491,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -4035,7 +4035,7 @@ Dark Mode apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4043,7 +4043,7 @@ Market Mood apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4051,7 +4051,7 @@ Static Analysis apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4059,7 +4059,7 @@ Multi-Language apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4067,7 +4067,7 @@ Open Source Software apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -4075,7 +4075,7 @@ Get Started apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -4123,7 +4123,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 00ad01434..428e12436 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -1002,7 +1002,7 @@ Registrieren apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -1766,7 +1766,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -1994,7 +1994,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -3238,7 +3238,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -4278,7 +4278,7 @@ Dark Mode apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4286,7 +4286,7 @@ Marktstimmung apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4294,7 +4294,7 @@ Statische Analyse apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4302,7 +4302,7 @@ Mehrsprachigkeit apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4310,7 +4310,7 @@ Open Source Software apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 46bd07d47..0969f6e09 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -987,7 +987,7 @@ Empezar apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -1751,7 +1751,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -1979,7 +1979,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -3223,7 +3223,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -4255,7 +4255,7 @@ Dark Mode apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4263,7 +4263,7 @@ Market Mood apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4271,7 +4271,7 @@ Static Analysis apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4279,7 +4279,7 @@ Multi-Language apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4287,7 +4287,7 @@ Open Source Software apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -7945,6 +7945,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7955,7 +7959,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index e554ce9ff..1ec966c7c 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -2034,7 +2034,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -2098,7 +2098,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -2398,7 +2398,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -2866,7 +2866,7 @@ Démarrer apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -4254,7 +4254,7 @@ Mode Sombre apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4262,7 +4262,7 @@ Sentiment du Marché apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4270,7 +4270,7 @@ Analyse statique apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4278,7 +4278,7 @@ Multi-Langue apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4286,7 +4286,7 @@ Logiciel Open Source apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index cbc8d5792..ca395c91d 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -987,7 +987,7 @@ Inizia apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -1751,7 +1751,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -1979,7 +1979,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -3223,7 +3223,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -4255,7 +4255,7 @@ Modalità scura apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4263,7 +4263,7 @@ Umore del mercato apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4271,7 +4271,7 @@ Analisi statica apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4279,7 +4279,7 @@ Multilingue apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4287,7 +4287,7 @@ Software open source apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -7945,6 +7945,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7955,7 +7959,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index d53e7845c..c97acc600 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -986,7 +986,7 @@ Aan de slag apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -1750,7 +1750,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -1978,7 +1978,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -3222,7 +3222,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -4254,7 +4254,7 @@ Dark Mode apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4262,7 +4262,7 @@ Marktsentiment apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4270,7 +4270,7 @@ Statische Analyse apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4278,7 +4278,7 @@ Meerdere talen apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4286,7 +4286,7 @@ Open Source Software apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 85ef03d3a..5ed3b1d1d 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -787,7 +787,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -3195,7 +3195,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -3663,7 +3663,7 @@ Ciemny motyw apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -3671,7 +3671,7 @@ Nastrój rynku apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -3679,7 +3679,7 @@ Analiza statyczna apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -3687,7 +3687,7 @@ Wielo-językowość apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -3695,7 +3695,7 @@ Oprogramowanie Open Source apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -3703,7 +3703,7 @@ Rozpocznij apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -3751,7 +3751,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index d270243db..d32e34e0a 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -2010,7 +2010,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -2310,7 +2310,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -2762,7 +2762,7 @@ Começar apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -3266,7 +3266,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -4254,7 +4254,7 @@ Modo escuro apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4262,7 +4262,7 @@ Humor do mercado apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4270,7 +4270,7 @@ Análise estática apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4278,7 +4278,7 @@ Multilíngua apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4286,7 +4286,7 @@ Software de código aberto apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 9ec4a5836..cb37e4f18 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -759,7 +759,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -3207,7 +3207,7 @@ Karanlık Mod apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -3219,7 +3219,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -3227,7 +3227,7 @@ Piyasa Modu apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -3235,7 +3235,7 @@ Statik Analiz apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -3243,7 +3243,7 @@ Çoklu Dil apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -3251,7 +3251,7 @@ Açık Kaynak Yazılım apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -3259,7 +3259,7 @@ Başla apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -3307,7 +3307,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 17a42efbf..02ec03d84 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -354,7 +354,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -3715,7 +3715,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -4251,7 +4251,7 @@ Темний режим apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4259,7 +4259,7 @@ Ринковий настрій apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4267,7 +4267,7 @@ Статичний аналіз apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4275,7 +4275,7 @@ Багатомовність apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4283,7 +4283,7 @@ Програмне забезпечення з відкритим кодом apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -4291,7 +4291,7 @@ Почати apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -4339,7 +4339,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 5a96dd108..40e054665 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -765,7 +765,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -2995,7 +2995,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -3416,42 +3416,42 @@ Dark Mode apps/client/src/app/pages/features/features-page.html - 178 + 233 Market Mood apps/client/src/app/pages/features/features-page.html - 206 + 215 Static Analysis apps/client/src/app/pages/features/features-page.html - 225 + 179 Multi-Language apps/client/src/app/pages/features/features-page.html - 242 + 259 Open Source Software apps/client/src/app/pages/features/features-page.html - 279 + 296 Get Started apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -3496,7 +3496,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -7186,7 +7186,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 @@ -7195,6 +7195,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Get Early Access diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 385b4aefd..9ba7a63b4 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -788,7 +788,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -3204,7 +3204,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -3672,7 +3672,7 @@ 深色模式 apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -3680,7 +3680,7 @@ 市场情绪 apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -3688,7 +3688,7 @@ 静态分析 apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -3696,7 +3696,7 @@ 多语言 apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -3704,7 +3704,7 @@ 开源软件 apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -3712,7 +3712,7 @@ 立即开始 apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -3760,7 +3760,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -7945,6 +7945,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7955,7 +7959,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 From ecffb53f07ecc3feed23be2e31be63c061fb6f4c Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 May 2025 15:54:54 +0200 Subject: [PATCH 41/91] Feature/extend faq pages (#4655) * Extend FAQ pages * Update changelog --- CHANGELOG.md | 1 + .../overview/faq-overview-page.component.ts | 3 + .../pages/faq/overview/faq-overview-page.html | 24 ++++++-- .../faq/overview/faq-overview-page.module.ts | 9 ++- .../app/pages/faq/saas/saas-page.component.ts | 4 +- .../src/app/pages/faq/saas/saas-page.html | 59 +++++++++++++------ .../app/pages/faq/saas/saas-page.module.ts | 9 ++- .../self-hosting-page.component.ts | 4 ++ .../faq/self-hosting/self-hosting-page.html | 19 ++++++ .../self-hosting/self-hosting-page.module.ts | 9 ++- 10 files changed, 113 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a124432f3..3fb6bfeba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Added the watchlist to the features page +- Extended the content of the Frequently Asked Questions (FAQ) pages ### Changed 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 9232ca3bd..ddafa5730 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 @@ -12,6 +12,9 @@ import { Subject, takeUntil } from 'rxjs'; standalone: false }) export class FaqOverviewPageComponent implements OnDestroy { + public pricingUrl = + `https://ghostfol.io/${document.documentElement.lang}/` + + $localize`:snake-case:pricing`; public routerLinkFeatures = ['/' + $localize`:snake-case:features`]; public user: User; 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 fea3bba55..f8fd62eb0 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 @@ -59,9 +59,14 @@ world. The
source code is fully available as open source software (OSS). Thanks to our generous - Ghostfolio Premium users - and sponsors we - have the ability to run a free, limited plan for novice + Ghostfolio Premium + users and + sponsors we have + the ability to run a free, limited plan for novice investors. @@ -82,8 +87,11 @@ By offering - Ghostfolio Premium, a - subscription plan with a managed hosting service and enhanced + Ghostfolio Premium, a subscription plan with a managed hosting service and enhanced features, we fund our business while providing added value to our users. @@ -105,7 +113,11 @@ Any support for Ghostfolio is welcome. Be it with a - Ghostfolio Premium + Ghostfolio Premium subscription to finance the hosting infrastructure, a positive rating in the How do I start? - You can sign up via the “Get Started” button at the top of the page. You have multiple options to join - Ghostfolio: Create an account with a security token or - Google Sign. We will guide you to set up your portfolio. + You can sign up via the + Get Started button at the top + of the page. You have multiple options to join Ghostfolio: Create an + account with a security token or Google Sign. We will guide you + to set up your portfolio. @@ -38,8 +38,8 @@ > Yes, it is! Our - pricing page details - everything you get for free.pricing page + details everything you get for free. @@ -49,12 +49,20 @@ > Ghostfolio Premium is a fully - managed Ghostfolio cloud offering for ambitious investors. Revenue is - used to cover the costs of the hosting infrastructure and to fund - ongoing development. It is the Open Source code base with some extras - like the markets overview and - a professional data provider.Ghostfolio Premium + is a fully managed Ghostfolio cloud offering for ambitious investors. + Revenue is used to cover the costs of the hosting infrastructure and + to fund ongoing development. It is the Open Source code base with some + extras like the + markets overview and a + professional data provider. @@ -65,8 +73,15 @@ > Yes, you can try - Ghostfolio Premium by signing - up for Ghostfolio and applying for a trial (see + Ghostfolio Premium + by signing up for Ghostfolio and applying for a trial (see Membership). It is easy, free and there is no commitment. You can stop using it at any time. No, Ghostfolio Premium does - not include auto-renewal. Upon expiration, you can choose whether to - start a new subscription.No, + Ghostfolio Premium + does not include auto-renewal. Upon expiration, you can choose whether + to start a new subscription. @if (user?.subscription?.type === 'Premium') { diff --git a/apps/client/src/app/pages/faq/saas/saas-page.module.ts b/apps/client/src/app/pages/faq/saas/saas-page.module.ts index 4ddcf9d24..81cd2b524 100644 --- a/apps/client/src/app/pages/faq/saas/saas-page.module.ts +++ b/apps/client/src/app/pages/faq/saas/saas-page.module.ts @@ -1,3 +1,5 @@ +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatCardModule } from '@angular/material/card'; @@ -7,7 +9,12 @@ import { SaasPageComponent } from './saas-page.component'; @NgModule({ declarations: [SaasPageComponent], - imports: [CommonModule, MatCardModule, SaasPageRoutingModule], + imports: [ + CommonModule, + GfPremiumIndicatorComponent, + MatCardModule, + SaasPageRoutingModule + ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class SaasPageModule {} 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 387187be0..f0ff7dbc3 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 @@ -9,6 +9,10 @@ import { Subject } from 'rxjs'; standalone: false }) export class SelfHostingPageComponent implements OnDestroy { + public pricingUrl = + `https://ghostfol.io/${document.documentElement.lang}/` + + $localize`:snake-case:pricing`; + private unsubscribeSubject = new Subject(); public ngOnDestroy() { diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html index dcb48aa54..a30854156 100644 --- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html @@ -140,6 +140,25 @@ providers are considered experimental. + + + Can I get access to a professional data provider? + + Yes, access to a professional data provider is included with a + Ghostfolio Premium + subscription via an API key. + How do I set up a benchmark? diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.module.ts b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.module.ts index 65f9969a3..931f24aa6 100644 --- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.module.ts +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.module.ts @@ -1,3 +1,5 @@ +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatCardModule } from '@angular/material/card'; @@ -7,7 +9,12 @@ import { SelfHostingPageComponent } from './self-hosting-page.component'; @NgModule({ declarations: [SelfHostingPageComponent], - imports: [CommonModule, MatCardModule, SelfHostingPageRoutingModule], + imports: [ + CommonModule, + GfPremiumIndicatorComponent, + MatCardModule, + SelfHostingPageRoutingModule + ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class SelfHostingPageModule {} From d661cdc78fbc01729deaf8b48c27fe939a02de15 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 May 2025 15:55:31 +0200 Subject: [PATCH 42/91] Feature/rename account to accounts in platform database schema (#4656) * Rename Account to accounts in platform database schema * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/platform/platform.service.ts | 4 ++-- prisma/schema.prisma | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fb6bfeba..0f59ee6dd 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 - Moved the watchlist from experimental to general availability - Deprecated the endpoint to get a portfolio position in favor of get a holding - Deprecated the endpoint to update portfolio position tags in favor of update holding tags +- Renamed `Account` to `accounts` in the `Platform` database schema - Upgraded `prisma` from version `6.6.0` to `6.7.0` ## 2.159.0 - 2025-05-02 diff --git a/apps/api/src/app/platform/platform.service.ts b/apps/api/src/app/platform/platform.service.ts index db827569d..200b4de00 100644 --- a/apps/api/src/app/platform/platform.service.ts +++ b/apps/api/src/app/platform/platform.service.ts @@ -54,7 +54,7 @@ export class PlatformService { await this.prismaService.platform.findMany({ include: { _count: { - select: { Account: true } + select: { accounts: true } } } }); @@ -64,7 +64,7 @@ export class PlatformService { id, name, url, - accountCount: _count.Account + accountCount: _count.accounts }; }); } diff --git a/prisma/schema.prisma b/prisma/schema.prisma index c33f7d6cc..863c196ac 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -147,10 +147,10 @@ model Order { } model Platform { - id String @id @default(uuid()) - name String? - url String @unique - Account Account[] + accounts Account[] + id String @id @default(uuid()) + name String? + url String @unique @@index([name]) } From 5b6447b60d81abbece874bcb21770a3b397afd99 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 4 May 2025 15:58:24 +0200 Subject: [PATCH 43/91] Feature/update locales (#4658) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.de.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.es.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.fr.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.it.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.nl.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.pl.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.pt.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.tr.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.uk.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.zh.xlf | 16 ++++++++++++---- 12 files changed, 144 insertions(+), 48 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 0896d6b03..305fa508a 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -591,7 +591,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -632,7 +632,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -711,9 +711,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -746,7 +754,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 428e12436..47c1a1340 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -5256,7 +5256,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -5432,7 +5432,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -5511,9 +5511,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -5546,7 +5554,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 0969f6e09..8541df0bc 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -5233,7 +5233,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -5409,7 +5409,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -5488,9 +5488,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -5523,7 +5531,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 1ec966c7c..165a03292 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -5232,7 +5232,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -5408,7 +5408,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -5487,9 +5487,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -5522,7 +5530,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index ca395c91d..d1b32c6ce 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -5233,7 +5233,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -5409,7 +5409,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -5488,9 +5488,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -5523,7 +5531,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index c97acc600..378f1a42e 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -5232,7 +5232,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -5408,7 +5408,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -5487,9 +5487,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -5522,7 +5530,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 5ed3b1d1d..714c83bdb 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -193,7 +193,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -251,7 +251,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -330,9 +330,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -382,7 +390,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index d32e34e0a..4a9ec251c 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -5232,7 +5232,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -5408,7 +5408,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -5487,9 +5487,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -5522,7 +5530,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index cb37e4f18..717fe544a 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -193,7 +193,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -251,7 +251,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -330,9 +330,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -382,7 +390,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 02ec03d84..7945267a0 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -591,7 +591,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -632,7 +632,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -711,9 +711,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -746,7 +754,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 40e054665..33d3e2f0c 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -191,7 +191,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -247,7 +247,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -325,9 +325,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -375,7 +383,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 9ba7a63b4..2853b6138 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -194,7 +194,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -252,7 +252,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -331,9 +331,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -383,7 +391,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts From 28d2fd3877b65e26757d52a53cfe1e98c85d961c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Szyma=C5=84ski?= Date: Sun, 4 May 2025 16:14:46 +0100 Subject: [PATCH 44/91] Bugfix/restore incorrect fee currency conversion (#4645) * Restore incorrect fee currency conversion * Update changelog --- CHANGELOG.md | 4 ++ apps/api/src/app/import/import.service.ts | 4 +- .../order/interfaces/activities.interface.ts | 2 + apps/api/src/app/order/order.service.ts | 59 ++++++++++++------- .../portfolio-calculator-test-utils.ts | 1 + 5 files changed, 47 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f59ee6dd..cdb61fd00 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 - Renamed `Account` to `accounts` in the `Platform` database schema - Upgraded `prisma` from version `6.6.0` to `6.7.0` +### Fixed + +- Fixed an issue with the fee calculations related to activities in a custom currency + ## 2.159.0 - 2025-05-02 ### Added diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 7afb2cd72..28c49ca70 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -118,6 +118,7 @@ export class ImportService { createdAt: undefined, fee: 0, feeInAssetProfileCurrency: 0, + feeInBaseCurrency: 0, id: assetProfile.id, isDraft: false, SymbolProfile: assetProfile, @@ -126,7 +127,8 @@ export class ImportService { unitPrice: marketPrice, unitPriceInAssetProfileCurrency: marketPrice, updatedAt: undefined, - userId: Account?.userId + userId: Account?.userId, + valueInBaseCurrency: value }; }) ); diff --git a/apps/api/src/app/order/interfaces/activities.interface.ts b/apps/api/src/app/order/interfaces/activities.interface.ts index 0c25c8ef8..c605c4787 100644 --- a/apps/api/src/app/order/interfaces/activities.interface.ts +++ b/apps/api/src/app/order/interfaces/activities.interface.ts @@ -12,11 +12,13 @@ export interface Activity extends Order { Account?: AccountWithPlatform; error?: ActivityError; feeInAssetProfileCurrency: number; + feeInBaseCurrency: number; SymbolProfile?: EnhancedSymbolProfile; tags?: Tag[]; unitPriceInAssetProfileCurrency: number; updateAccountBalance?: boolean; value: number; + valueInBaseCurrency: number; } export interface ActivityError { diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index d1847635a..ebd257324 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -531,31 +531,46 @@ export class OrderService { const value = new Big(order.quantity).mul(order.unitPrice).toNumber(); + const [ + feeInAssetProfileCurrency, + feeInBaseCurrency, + unitPriceInAssetProfileCurrency, + valueInBaseCurrency + ] = await Promise.all([ + this.exchangeRateDataService.toCurrencyAtDate( + order.fee, + order.currency ?? order.SymbolProfile.currency, + order.SymbolProfile.currency, + order.date + ), + this.exchangeRateDataService.toCurrencyAtDate( + order.fee, + order.currency ?? order.SymbolProfile.currency, + userCurrency, + order.date + ), + this.exchangeRateDataService.toCurrencyAtDate( + order.unitPrice, + order.currency ?? order.SymbolProfile.currency, + order.SymbolProfile.currency, + order.date + ), + this.exchangeRateDataService.toCurrencyAtDate( + value, + order.currency ?? order.SymbolProfile.currency, + userCurrency, + order.date + ) + ]); + return { ...order, + feeInAssetProfileCurrency, + feeInBaseCurrency, + unitPriceInAssetProfileCurrency, value, - feeInAssetProfileCurrency: - await this.exchangeRateDataService.toCurrencyAtDate( - order.fee, - order.currency ?? order.SymbolProfile.currency, - order.SymbolProfile.currency, - order.date - ), - SymbolProfile: assetProfile, - unitPriceInAssetProfileCurrency: - await this.exchangeRateDataService.toCurrencyAtDate( - order.unitPrice, - order.currency ?? order.SymbolProfile.currency, - order.SymbolProfile.currency, - order.date - ), - valueInBaseCurrency: - await this.exchangeRateDataService.toCurrencyAtDate( - value, - order.currency ?? order.SymbolProfile.currency, - userCurrency, - order.date - ) + valueInBaseCurrency, + SymbolProfile: assetProfile }; }) ); diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts index db80652c3..6208eb7d7 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts @@ -8,6 +8,7 @@ export const activityDummyData = { currency: undefined, fee: undefined, feeInAssetProfileCurrency: undefined, + feeInBaseCurrency: undefined, id: undefined, isDraft: false, symbolProfileId: undefined, From 6e9622a2cff7781a604f233dc399b21b94facd9a Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 May 2025 17:16:41 +0200 Subject: [PATCH 45/91] Release 2.160.0 (#4659) --- 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 cdb61fd00..1e19b227e 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.160.0 - 2025-05-04 ### Added diff --git a/package-lock.json b/package-lock.json index cd38cff6a..b6afbaf6f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.159.0", + "version": "2.160.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.159.0", + "version": "2.160.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 161aa5395..b12b4c0c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.159.0", + "version": "2.160.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 307621e103109b696ca60b28752996dc1f2de3f6 Mon Sep 17 00:00:00 2001 From: Aris Hadrian Date: Tue, 6 May 2025 13:42:33 +0600 Subject: [PATCH 46/91] Feature/improve language localization for TR 20250506 (#4663) * Improve language localization for TR * Update changelog --- CHANGELOG.md | 6 + apps/client/src/locales/messages.tr.xlf | 432 ++++++++++++------------ 2 files changed, 222 insertions(+), 216 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e19b227e..8d3f035cd 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 Turkish (`tr`) + ## 2.160.0 - 2025-05-04 ### Added diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 717fe544a..020b0268a 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -632,7 +632,7 @@ Changelog - Değişiklik Günlüğü + Değişiklik Günlüğü apps/client/src/app/app.component.html 77 @@ -644,7 +644,7 @@ Features - Özellikler + Özellikler apps/client/src/app/app.component.html 79 @@ -1240,7 +1240,7 @@ Historical Market Data - Tarihsel Piyasa Verisi + Tarihsel Piyasa Verisi apps/client/src/app/components/admin-jobs/admin-jobs.html 37 @@ -2552,7 +2552,7 @@ Please set the amount of your emergency fund. - Lütfen acil durum yedeği meblağını giriniz: + Lütfen acil durum yedeği meblağını giriniz: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts 64 @@ -2924,7 +2924,7 @@ License - Lisans + Lisans apps/client/src/app/pages/about/about-page.component.ts 55 @@ -3180,7 +3180,7 @@ Wealth Items - Varlık Kalemleri + Varlık Kalemleri apps/client/src/app/pages/features/features-page.html 76 @@ -3196,7 +3196,7 @@ Multi-Accounts - Çoklu Hesaplar + Çoklu Hesaplar apps/client/src/app/pages/features/features-page.html 127 @@ -3588,7 +3588,7 @@ How does Ghostfolio work? - How does Ghostfolio work? + NasılGhostfolio çalışır? apps/client/src/app/pages/landing/landing-page.html 383 @@ -3708,7 +3708,7 @@ Do you really want to delete these activities? - Tüm işlemlerinizi silmeyi gerçekten istiyor musunuz? + Tüm işlemlerinizi silmeyi gerçekten istiyor musunuz? libs/ui/src/lib/activities-table/activities-table.component.ts 219 @@ -4468,7 +4468,7 @@ Hello, has shared a Portfolio with you! - Merhaba, size bir Portföy paylaştı! + Merhaba, size bir Portföy paylaştı! apps/client/src/app/pages/public/public-page.html 4 @@ -4604,7 +4604,7 @@ Open Source Alternative to - Open Source Alternative to + için Açık Kaynak Alternatifi apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html 42 @@ -4620,7 +4620,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. + Açık kaynaklı bir alternatif mi arıyorsunuz ? Ghostfolio güçlü bir portföy yönetim aracıdır ve bireylere yatırımlarını takip etmek, analiz etmek ve optimize etmek için kapsamlı bir platform sunar. İster deneyimli bir yatırımcı olun ister yeni başlıyor olun, Ghostfolio, bilinçli kararlar almanıza ve finansal geleceğinizi kontrol etmenize yardımcı olmak için sezgisel bir kullanıcı arayüzü ve geniş bir işlevsellik yelpazesi sunmaktadır. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 18 @@ -4788,7 +4788,7 @@ Ready to take your investments to the next level? - Ready to take your investments to the next level? + Yatırımlarınızı bir sonraki seviyeye taşımaya hazır mısınız? apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 324 @@ -4900,7 +4900,7 @@ Please enter your coupon code. - Lütfen kupon kodunuzu girin: + Lütfen kupon kodunuzu girin: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 201 @@ -5368,7 +5368,7 @@ Asset Sub Class - Asset Sub Class + AVarlık Alt Sınıfı libs/ui/src/lib/i18n.ts 7 @@ -5376,7 +5376,7 @@ Core - Core + Temel libs/ui/src/lib/i18n.ts 10 @@ -5384,7 +5384,7 @@ Switch to Ghostfolio Premium or Ghostfolio Open Source easily - Switch to Ghostfolio Premium or Ghostfolio Open Source easily + Ghostfolio Premium veya Ghostfolio Open Source'a kolayca geçin libs/ui/src/lib/i18n.ts 12 @@ -5392,7 +5392,7 @@ Switch to Ghostfolio Premium easily - Switch to Ghostfolio Premium easily + Ghostfolio Premium'a kolayca geçin libs/ui/src/lib/i18n.ts 13 @@ -5400,7 +5400,7 @@ Switch to Ghostfolio Open Source or Ghostfolio Basic easily - Switch to Ghostfolio Open Source or Ghostfolio Basic easily + Ghostfolio Açık Kaynak veya Ghostfolio Temel'e kolayca geçin. libs/ui/src/lib/i18n.ts 14 @@ -5408,7 +5408,7 @@ Emergency Fund - Emergency Fund + Acil Durum Fonu libs/ui/src/lib/i18n.ts 15 @@ -5416,7 +5416,7 @@ Grant - Grant + Hibe libs/ui/src/lib/i18n.ts 17 @@ -5424,7 +5424,7 @@ Higher Risk - Higher Risk + Daha Yüksek Risk libs/ui/src/lib/i18n.ts 18 @@ -5432,7 +5432,7 @@ This activity already exists. - This activity already exists. + Bu işlem zaten mevcut. libs/ui/src/lib/i18n.ts 19 @@ -5440,7 +5440,7 @@ Japan - Japan + Japonya libs/ui/src/lib/i18n.ts 86 @@ -5448,7 +5448,7 @@ Lower Risk - Lower Risk + Daha Düşük Risk libs/ui/src/lib/i18n.ts 20 @@ -5456,7 +5456,7 @@ Month - Month + Ay libs/ui/src/lib/i18n.ts 21 @@ -5464,7 +5464,7 @@ Months - Months + Ay libs/ui/src/lib/i18n.ts 22 @@ -5472,7 +5472,7 @@ Other - Other + Diğer libs/ui/src/lib/i18n.ts 23 @@ -5484,7 +5484,7 @@ Preset - Preset + Önceden Ayarlanmış libs/ui/src/lib/i18n.ts 25 @@ -5492,7 +5492,7 @@ Retirement Provision - Retirement Provision + Yaşlılık Provizyonu libs/ui/src/lib/i18n.ts 26 @@ -5500,7 +5500,7 @@ Satellite - Satellite + Uydu libs/ui/src/lib/i18n.ts 27 @@ -5972,7 +5972,7 @@ Asset Profile - Varlık Profili + Varlık Profili apps/client/src/app/components/admin-jobs/admin-jobs.html 35 @@ -6156,7 +6156,7 @@ If a translation is missing, kindly support us in extending it here. - If a translation is missing, kindly support us in extending it here. + Eğer bir çeviri eksikse, lütfen bunu genişletmemize yardımcı olun burada. apps/client/src/app/components/user-account-settings/user-account-settings.html 58 @@ -6164,7 +6164,7 @@ The current market price is - The current market price is + Şu anki piyasa fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 536 @@ -6172,7 +6172,7 @@ Test - Test + Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 473 @@ -6180,7 +6180,7 @@ Date Range - Date Range + Tarih Aralığı libs/ui/src/lib/assistant/assistant.html 95 @@ -6240,7 +6240,7 @@ Market data is delayed for - Market data is delayed for + Piyasa verileri gecikmeli apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts 87 @@ -6272,7 +6272,7 @@ Asset Performance - Asset Performance + Varlık Performansı apps/client/src/app/pages/portfolio/analysis/analysis-page.html 123 @@ -6280,7 +6280,7 @@ Absolute Currency Performance - Absolute Currency Performance + Mutlak Para Performansı apps/client/src/app/pages/portfolio/analysis/analysis-page.html 145 @@ -6288,7 +6288,7 @@ Currency Performance - Currency Performance + Para Performansı apps/client/src/app/pages/portfolio/analysis/analysis-page.html 169 @@ -6296,7 +6296,7 @@ Absolute Net Performance - Absolute Net Performance + Mutlak Net Performans apps/client/src/app/pages/portfolio/analysis/analysis-page.html 192 @@ -6304,7 +6304,7 @@ Net Performance - Net Performance + Net Performans apps/client/src/app/pages/portfolio/analysis/analysis-page.html 211 @@ -6312,7 +6312,7 @@ Week to date - Week to date + Hafta içi libs/ui/src/lib/assistant/assistant.component.ts 222 @@ -6320,7 +6320,7 @@ WTD - WTD + WTD libs/ui/src/lib/assistant/assistant.component.ts 222 @@ -6328,7 +6328,7 @@ Month to date - Month to date + Ay içi libs/ui/src/lib/assistant/assistant.component.ts 226 @@ -6336,7 +6336,7 @@ MTD - MTD + MTD libs/ui/src/lib/assistant/assistant.component.ts 226 @@ -6344,7 +6344,7 @@ Year to date - Year to date + Yıl içi libs/ui/src/lib/assistant/assistant.component.ts 230 @@ -6352,7 +6352,7 @@ View - View + Görünüm apps/client/src/app/components/access-table/access-table.component.html 23 @@ -6364,7 +6364,7 @@ Oops! A data provider is experiencing the hiccups. - Oops! A data provider is experiencing the hiccups. + Oops! Bir veri sağlayıcısı aksaklık yaşıyor. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html 8 @@ -6372,7 +6372,7 @@ If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a withdrawal rate of 4%. - If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a withdrawal rate of 4%. + Eğer bugün emekli olursanız, toplam tutarındaki varlıklarınız ve %4'lük bir çekilme oranına dayanarak yıllık veya aylık çekebilirsiniz. apps/client/src/app/pages/portfolio/fire/fire-page.html 67 @@ -6380,7 +6380,7 @@ Reset Filters - Reset Filters + Filtreleri Sıfırla libs/ui/src/lib/assistant/assistant.html 187 @@ -6388,7 +6388,7 @@ year - year + Yıl libs/ui/src/lib/assistant/assistant.component.ts 234 @@ -6396,7 +6396,7 @@ years - years + Yıllar libs/ui/src/lib/assistant/assistant.component.ts 256 @@ -6404,7 +6404,7 @@ Apply Filters - Apply Filters + Filtreleri Uygula libs/ui/src/lib/assistant/assistant.html 197 @@ -6412,7 +6412,7 @@ Data Gathering - Data Gathering + Veri Toplama apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 541 @@ -6424,7 +6424,7 @@ General - General + Genel apps/client/src/app/pages/faq/faq-page.component.ts 37 @@ -6432,7 +6432,7 @@ Cloud - Cloud + Bulut apps/client/src/app/pages/faq/faq-page.component.ts 42 @@ -6444,7 +6444,7 @@ Self-Hosting - Self-Hosting + Kendini Barındırma apps/client/src/app/pages/faq/faq-page.component.ts 48 @@ -6456,7 +6456,7 @@ self-hosting - self-hosting + Kendini-Barındırma apps/client/src/app/pages/faq/faq-page.component.ts 49 @@ -6464,7 +6464,7 @@ FAQ - FAQ + SSS apps/client/src/app/pages/faq/saas/saas-page-routing.module.ts 13 @@ -6476,7 +6476,7 @@ Oops! It looks like you’re making too many requests. Please slow down a bit. - Oops! It looks like you’re making too many requests. Please slow down a bit. + Oops! Görünüşe göre çok fazla istekte bulunuyorsunuz. Lütfen biraz yavaşlayın. apps/client/src/app/core/http-response.interceptor.ts 103 @@ -6484,7 +6484,7 @@ My Account - My Account + Hesabım apps/client/src/app/pages/i18n/i18n-page.html 13 @@ -6492,7 +6492,7 @@ Active - Active + Aktif apps/client/src/app/components/home-holdings/home-holdings.component.ts 36 @@ -6500,7 +6500,7 @@ Closed - Closed + Kapalı apps/client/src/app/components/home-holdings/home-holdings.component.ts 37 @@ -6508,7 +6508,7 @@ Activity - Activity + Etkinlik apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 207 @@ -6516,7 +6516,7 @@ Dividend Yield - Dividend Yield + Temettü Getiri apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 175 @@ -6524,7 +6524,7 @@ Execute Job - Execute Job + İşlemi Yürüt apps/client/src/app/components/admin-jobs/admin-jobs.html 176 @@ -6532,7 +6532,7 @@ Priority - Priority + Öncelik apps/client/src/app/components/admin-jobs/admin-jobs.html 64 @@ -6540,7 +6540,7 @@ This action is not allowed. - This action is not allowed. + Bu işlem izin verilmiyor. apps/client/src/app/core/http-response.interceptor.ts 64 @@ -6548,7 +6548,7 @@ Liquidity - Liquidity + Likidite libs/ui/src/lib/i18n.ts 48 @@ -6556,7 +6556,7 @@ {VAR_PLURAL, plural, =1 {activity} other {activities}} - {VAR_PLURAL, plural, =1 {activity} other {activities}} + {VAR_PLURAL, plural, =1 {Etkinlik} other {Etkinlikler}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 14 @@ -6564,7 +6564,7 @@ Buy and sell - Buy and sell + Satın ve satın libs/ui/src/lib/i18n.ts 8 @@ -6572,7 +6572,7 @@ Delete Activities - Delete Activities + Etkinlikleri Sil libs/ui/src/lib/activities-table/activities-table.component.html 67 @@ -6580,7 +6580,7 @@ Internationalization - Internationalization + İnternasyonalizasyon apps/client/src/app/app-routing.module.ts 88 @@ -6588,7 +6588,7 @@ Do you really want to close your Ghostfolio account? - Do you really want to close your Ghostfolio account? + Ghostfolio hesabınızı kapatmak istediğinize emin misiniz? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts 174 @@ -6596,7 +6596,7 @@ Danger Zone - Danger Zone + Tehlikeli Alan apps/client/src/app/components/user-account-settings/user-account-settings.html 274 @@ -6604,7 +6604,7 @@ Close Account - Close Account + Hesabı Kapat apps/client/src/app/components/user-account-settings/user-account-settings.html 309 @@ -6612,7 +6612,7 @@ By ETF Holding - By ETF Holding + ETF Portföyü apps/client/src/app/pages/portfolio/allocations/allocations-page.html 333 @@ -6620,7 +6620,7 @@ Approximation based on the top holdings of each ETF - Approximation based on the top holdings of each ETF + Her ETF'nin en üst tutarlarına dayalı yaklaşım apps/client/src/app/pages/portfolio/allocations/allocations-page.html 340 @@ -6636,7 +6636,7 @@ Oops! There was an error setting up biometric authentication. - Oops! There was an error setting up biometric authentication. + Oops! Biyometrik kimlik doğrulama ayarlanırken bir hata oluştu. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts 302 @@ -6644,7 +6644,7 @@ Show more - Show more + Daha fazla göster libs/ui/src/lib/top-holdings/top-holdings.component.html 174 @@ -6652,7 +6652,7 @@ Benchmarks - Benchmarks + Kıyaslamalar apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 81 @@ -6660,7 +6660,7 @@ Delete Profiles - Delete Profiles + Profilleri Sil apps/client/src/app/components/admin-market-data/admin-market-data.html 243 @@ -6668,7 +6668,7 @@ Do you really want to delete these profiles? - Do you really want to delete these profiles? + Bu profilleri silmek istediğinize emin misiniz? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 68 @@ -6676,7 +6676,7 @@ Oops! Could not delete profiles. - Oops! Could not delete profiles. + Oops! Profilleri silmek mümkün olmadı. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 56 @@ -6684,7 +6684,7 @@ Table - Table + Tablo apps/client/src/app/components/home-holdings/home-holdings.html 16 @@ -6692,7 +6692,7 @@ Chart - Chart + Grafik apps/client/src/app/components/home-holdings/home-holdings.html 19 @@ -6700,7 +6700,7 @@ Would you like to refine your personal investment strategy? - Would you like to refine your personal investment strategy? + Senin özel yatırım stratejinizi iyileştirmek ister misin? apps/client/src/app/pages/public/public-page.html 211 @@ -6708,7 +6708,7 @@ Alternative - Alternative + Alternatif apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 81 @@ -6716,7 +6716,7 @@ App - App + App apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 82 @@ -6724,7 +6724,7 @@ Budgeting - Budgeting + Bütçeleme apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 83 @@ -6732,7 +6732,7 @@ Community - Community + Topluluk apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 84 @@ -6740,7 +6740,7 @@ Family Office - Family Office + Aile Ofisi apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 85 @@ -6748,7 +6748,7 @@ Investor - Investor + Yatırımcı apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 88 @@ -6756,7 +6756,7 @@ Open Source - Open Source + Açık Kaynak apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 89 @@ -6764,7 +6764,7 @@ Personal Finance - Personal Finance + Kişisel Finans apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 91 @@ -6772,7 +6772,7 @@ Privacy - Privacy + Gizlilik apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 92 @@ -6780,7 +6780,7 @@ Software - Software + Yazılım apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 @@ -6788,7 +6788,7 @@ Tool - Tool + Araç apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 95 @@ -6796,7 +6796,7 @@ User Experience - User Experience + Kullanıcı Deneyimi apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 96 @@ -6804,7 +6804,7 @@ Wealth - Wealth + Zenginlik apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 97 @@ -6812,7 +6812,7 @@ Wealth Management - Wealth Management + Zenginlik Yönetimi apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 98 @@ -6820,7 +6820,7 @@ Australia - Australia + Avustralya libs/ui/src/lib/i18n.ts 74 @@ -6828,7 +6828,7 @@ Austria - Austria + Avusturya libs/ui/src/lib/i18n.ts 75 @@ -6836,7 +6836,7 @@ Belgium - Belgium + Belçika libs/ui/src/lib/i18n.ts 76 @@ -6844,7 +6844,7 @@ Bulgaria - Bulgaria + Bulgaristan libs/ui/src/lib/i18n.ts 78 @@ -6852,7 +6852,7 @@ Canada - Canada + Kanada libs/ui/src/lib/i18n.ts 79 @@ -6860,7 +6860,7 @@ Czech Republic - Czech Republic + Çek Cumhuriyeti libs/ui/src/lib/i18n.ts 80 @@ -6868,7 +6868,7 @@ Finland - Finland + Finlandiya libs/ui/src/lib/i18n.ts 81 @@ -6876,7 +6876,7 @@ France - France + Fransa libs/ui/src/lib/i18n.ts 82 @@ -6884,7 +6884,7 @@ Germany - Germany + Almanya libs/ui/src/lib/i18n.ts 83 @@ -6892,7 +6892,7 @@ India - India + Hindistan libs/ui/src/lib/i18n.ts 84 @@ -6900,7 +6900,7 @@ Italy - Italy + İtalya libs/ui/src/lib/i18n.ts 85 @@ -6908,7 +6908,7 @@ Netherlands - Netherlands + Hollanda libs/ui/src/lib/i18n.ts 87 @@ -6916,7 +6916,7 @@ New Zealand - New Zealand + Yeni Zelanda libs/ui/src/lib/i18n.ts 88 @@ -6924,7 +6924,7 @@ Poland - Poland + Polonya libs/ui/src/lib/i18n.ts 89 @@ -6932,7 +6932,7 @@ Romania - Romania + Romanya libs/ui/src/lib/i18n.ts 90 @@ -6940,7 +6940,7 @@ South Africa - South Africa + Güney Afrika libs/ui/src/lib/i18n.ts 92 @@ -6948,7 +6948,7 @@ Thailand - Thailand + Tayland libs/ui/src/lib/i18n.ts 94 @@ -6956,7 +6956,7 @@ United States - United States + Amerika Birleşik Devletleri libs/ui/src/lib/i18n.ts 97 @@ -6964,7 +6964,7 @@ Error - Error + Hata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 527 @@ -6972,7 +6972,7 @@ Deactivate - Deactivate + Devre Dışı Bırak apps/client/src/app/components/rule/rule.component.html 72 @@ -6980,7 +6980,7 @@ Activate - Activate + Aktif Et apps/client/src/app/components/rule/rule.component.html 74 @@ -6988,7 +6988,7 @@ Inactive - Inactive + Pasif apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 232 @@ -6996,7 +6996,7 @@ Cancel - Cancel + İptal Et libs/ui/src/lib/i18n.ts 9 @@ -7004,7 +7004,7 @@ Close - Close + Kapat libs/ui/src/lib/i18n.ts 11 @@ -7012,7 +7012,7 @@ Yes - Yes + Evet libs/ui/src/lib/i18n.ts 32 @@ -7020,7 +7020,7 @@ Copy link to clipboard - Copy link to clipboard + Bağlantıyı panoya kopyala apps/client/src/app/components/access-table/access-table.component.html 70 @@ -7028,7 +7028,7 @@ Portfolio Snapshot - Portfolio Snapshot + Portföy Anlık Görüntüsü apps/client/src/app/components/admin-jobs/admin-jobs.html 39 @@ -7036,7 +7036,7 @@ Change with currency effect Change - Change with currency effect Change + Kur farkı etkisiyle değişim Değişim apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 50 @@ -7044,7 +7044,7 @@ Performance with currency effect Performance - Performance with currency effect Performance + Kur farkı etkisiyle performans Performans apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 69 @@ -7052,7 +7052,7 @@ Threshold Min - Threshold Min + Eşik Min apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 54 @@ -7060,7 +7060,7 @@ Threshold Max - Threshold Max + Eşik Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 92 @@ -7068,7 +7068,7 @@ Close - Close + Kapat apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 129 @@ -7076,7 +7076,7 @@ Customize - Customize + Özelleştir apps/client/src/app/components/rule/rule.component.html 67 @@ -7084,7 +7084,7 @@ No auto-renewal. - No auto-renewal. + Otomatik yenileme yok. apps/client/src/app/components/user-account-membership/user-account-membership.html 70 @@ -7092,7 +7092,7 @@ Today - Today + Bugün apps/client/src/app/pages/public/public-page.html 24 @@ -7100,7 +7100,7 @@ This year - This year + Bu yıl apps/client/src/app/pages/public/public-page.html 42 @@ -7108,7 +7108,7 @@ From the beginning - From the beginning + Başlangıçtan beri apps/client/src/app/pages/public/public-page.html 60 @@ -7164,7 +7164,7 @@ can be self-hosted - can be self-hosted + kendi sunucunuzda barındırılabilir apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 178 @@ -7172,7 +7172,7 @@ cannot be self-hosted - cannot be self-hosted + kendi sunucunuzda barındırılmaz apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 185 @@ -7180,7 +7180,7 @@ can be self-hosted - can be self-hosted + kendi sunucunuzda barındırılabilir apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 195 @@ -7188,7 +7188,7 @@ cannot be self-hosted - cannot be self-hosted + kendi sunucunuzda barındırılmaz apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 202 @@ -7196,7 +7196,7 @@ can be used anonymously - can be used anonymously + gizli kullanımda kullanılabilir apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 217 @@ -7204,7 +7204,7 @@ cannot be used anonymously - cannot be used anonymously + gizli kullanımda kullanılmaz apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 224 @@ -7212,7 +7212,7 @@ can be used anonymously - can be used anonymously + gizli kullanımda kullanılabilir apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 234 @@ -7220,7 +7220,7 @@ cannot be used anonymously - cannot be used anonymously + gizli kullanımda kullanılmaz apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 241 @@ -7228,7 +7228,7 @@ offers a free plan - offers a free plan + ücretsiz plan sunar apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 256 @@ -7236,7 +7236,7 @@ does not offer a free plan - does not offer a free plan + ücretsiz plan sunmaz apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 263 @@ -7244,7 +7244,7 @@ offers a free plan - offers a free plan + ücretsiz plan sunar apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 273 @@ -7252,7 +7252,7 @@ does not offer a free plan - does not offer a free plan + ücretsiz plan sunmaz apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 280 @@ -7260,7 +7260,7 @@ Oops! Could not find any assets. - Oops! Could not find any assets. + Oops! Herhangi bir varlık bulunamadı. libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html 40 @@ -7268,7 +7268,7 @@ Data Providers - Data Providers + Veri Sağlayıcıları apps/client/src/app/components/admin-settings/admin-settings.component.html 4 @@ -7276,7 +7276,7 @@ Set API key - Set API key + API anahtarını ayarla apps/client/src/app/components/admin-settings/admin-settings.component.html 83 @@ -7284,7 +7284,7 @@ Get access to 80’000+ tickers from over 50 exchanges - Get access to 80’000+ tickers from over 50 exchanges + 80’000+ sembolden 50’den fazla borsada erişim alın libs/ui/src/lib/i18n.ts 24 @@ -7292,7 +7292,7 @@ Ukraine - Ukraine + Ukraine libs/ui/src/lib/i18n.ts 95 @@ -7300,7 +7300,7 @@ Join now - Join now + Şimdi katıl apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 110 @@ -7308,7 +7308,7 @@ Glossary - Glossary + Sözlük apps/client/src/app/pages/resources/glossary/resources-glossary-routing.module.ts 10 @@ -7320,7 +7320,7 @@ Guides - Guides + Kılavuzlar apps/client/src/app/pages/resources/guides/resources-guides-routing.module.ts 10 @@ -7332,7 +7332,7 @@ guides - guides + kılavuzlar snake-case apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -7345,7 +7345,7 @@ glossary - glossary + sözlük snake-case apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -7358,7 +7358,7 @@ Threshold range - Threshold range + Eşik aralığı apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 9 @@ -7366,7 +7366,7 @@ Ghostfolio X-ray uses static analysis to uncover potential issues and risks in your portfolio. Adjust the rules below and set custom thresholds to align with your personal investment strategy. - Ghostfolio X-ray uses static analysis to uncover potential issues and risks in your portfolio. Adjust the rules below and set custom thresholds to align with your personal investment strategy. + Ghostfolio X-ray statik analiz kullanarak portföyünüzdeki potansiyel sorunları ve riskleri keşfetmek için kullanılır. Aşağıdaki kuralları ayarlayın ve özel eşikleri ayarlayarak kişisel yatırım stratejinize uyun. apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 5 @@ -7374,7 +7374,7 @@ Economic Market Cluster Risks - Economic Market Cluster Risks + Ekonomik Piyasa Küme Riskleri apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 165 @@ -7382,7 +7382,7 @@ of - of + ın apps/client/src/app/components/admin-settings/admin-settings.component.html 52 @@ -7390,7 +7390,7 @@ daily requests - daily requests + günlük istekler apps/client/src/app/components/admin-settings/admin-settings.component.html 54 @@ -7398,7 +7398,7 @@ Remove API key - Remove API key + API anahtarını kaldır apps/client/src/app/components/admin-settings/admin-settings.component.html 71 @@ -7406,7 +7406,7 @@ Do you really want to delete the API key? - Do you really want to delete the API key? + API anahtarını silmek istediğinize emin misiniz? apps/client/src/app/components/admin-settings/admin-settings.component.ts 96 @@ -7414,7 +7414,7 @@ Please enter your Ghostfolio API key: - Please enter your Ghostfolio API key: + Ghostfolio API anahtarınızı girin: apps/client/src/app/pages/api/api-page.component.ts 41 @@ -7422,7 +7422,7 @@ I have an API key - I have an API key + Bir API anahtarım var apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html 39 @@ -7430,7 +7430,7 @@ API Requests Today - API Requests Today + API Günü İstekleri apps/client/src/app/components/admin-users/admin-users.html 178 @@ -7438,7 +7438,7 @@ Could not generate an API key - Could not generate an API key + API anahtarı oluşturulamadı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 127 @@ -7446,7 +7446,7 @@ Set this API key in your self-hosted environment: - Set this API key in your self-hosted environment: + Bu API anahtarını kendi barındırılan ortamınıza ayarlayın: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 142 @@ -7454,7 +7454,7 @@ Ghostfolio Premium Data Provider API Key - Ghostfolio Premium Data Provider API Key + Ghostfolio Premium Veri Sağlayıcı API Anahtarı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 145 @@ -7462,7 +7462,7 @@ Do you really want to generate a new API key? - Do you really want to generate a new API key? + Yeni bir API anahtarı oluşturmak istediğinize emin misiniz? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 150 @@ -7470,7 +7470,7 @@ Tag - Tag + Etiket libs/ui/src/lib/assistant/assistant.html 157 @@ -7478,7 +7478,7 @@ API Key - API Key + API Anahtarı libs/ui/src/lib/membership-card/membership-card.component.html 18 @@ -7486,7 +7486,7 @@ Generate Ghostfolio Premium Data Provider API key for self-hosted environments... - Generate Ghostfolio Premium Data Provider API key for self-hosted environments... + Kendi barındırılan ortamlar için Ghostfolio Premium Veri Sağlayıcı API anahtarı oluştur... libs/ui/src/lib/membership-card/membership-card.component.html 26 @@ -7494,7 +7494,7 @@ out of - out of + dışında apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 56 @@ -7502,7 +7502,7 @@ rules align with your portfolio. - rules align with your portfolio. + kurallar portföyünüze uyuyor. apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 58 @@ -7510,7 +7510,7 @@ Save - Save + Kaydet apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts 62 @@ -7518,7 +7518,7 @@ Asset Class Cluster Risks - Asset Class Cluster Risks + Varlık Sınıfı Küme Riskleri apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 117 @@ -7526,7 +7526,7 @@ Me - Me + Ben apps/client/src/app/components/user-account-access/user-account-access.component.ts 135 @@ -7534,7 +7534,7 @@ Received Access - Received Access + Alınan Erişim apps/client/src/app/components/user-account-access/user-account-access.html 3 @@ -7574,7 +7574,7 @@ Regional Market Cluster Risks - Regional Market Cluster Risks + Bölgesel Piyasa Küme Riskleri apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 189 @@ -7582,7 +7582,7 @@ Lazy - Lazy + Tembel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 138 @@ -7590,7 +7590,7 @@ Instant - Instant + Anında apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 142 @@ -7598,7 +7598,7 @@ Default Market Price - Default Market Price + Varsayılan Piyasa Fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 386 @@ -7606,7 +7606,7 @@ Mode - Mode + Mod apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 423 @@ -7614,7 +7614,7 @@ Selector - Selector + Seçici apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 439 @@ -7622,7 +7622,7 @@ HTTP Request Headers - HTTP Request Headers + HTTP İstek Başlıkları apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 399 @@ -7746,7 +7746,7 @@ I understand that if I lose my security token, I cannot recover my account - Güvenlik belirtecimi kaybedersem hesabımı kurtaramayacağımı anlıyorum. + Güvenlik belirtecimi kaybedersem hesabımı kurtaramayacağımı anlıyorum. apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 28 @@ -7770,7 +7770,7 @@ Security token - Security token + Güvenlik belirteci apps/client/src/app/components/admin-users/admin-users.component.ts 163 @@ -7778,7 +7778,7 @@ Do you really want to generate a new security token for this user? - Do you really want to generate a new security token for this user? + Bu kullanıcı için yeni bir güvenlik belirteci oluşturmak istediğinize emin misiniz? apps/client/src/app/components/admin-users/admin-users.component.ts 168 @@ -7786,7 +7786,7 @@ Generate Security Token - Generate Security Token + Güvenlik belirteci oluştur apps/client/src/app/components/admin-users/admin-users.html 249 @@ -7794,7 +7794,7 @@ United Kingdom - United Kingdom + Birleşik Krallık libs/ui/src/lib/i18n.ts 96 @@ -7802,7 +7802,7 @@ Terms of Service - Terms of Service + Hükümler ve Koşullar apps/client/src/app/app.component.html 112 @@ -7810,7 +7810,7 @@ terms-of-service - terms-of-service + Hizmet Koşulları snake-case apps/client/src/app/app.component.ts @@ -7831,7 +7831,7 @@ Terms of Service - Terms of Service + Hizmet Koşulları apps/client/src/app/pages/about/about-page.component.ts 71 @@ -7843,7 +7843,7 @@ Terms of Service - Terms of Service + Hizmet Koşulları apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.html 4 @@ -7851,7 +7851,7 @@ and I agree to the Terms of Service. - and I agree to the Terms of Service. + ve kabul ediyorum Hizmet Koşulları. apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 34 @@ -7859,7 +7859,7 @@ () is already in use. - () is already in use. + () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 462 @@ -7867,7 +7867,7 @@ An error occurred while updating to (). - An error occurred while updating to (). + Güncelleştirilirken bir hata oluştu (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 470 @@ -7875,7 +7875,7 @@ Apply - Apply + Uygula apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 138 @@ -7883,7 +7883,7 @@ with API access for - with API access for + API erişimi için apps/client/src/app/pages/pricing/pricing-page.html 266 @@ -7891,7 +7891,7 @@ Gather Recent Historical Market Data - Gather Recent Historical Market Data + Yakın Geçmiş Piyasa Verilerini Topla apps/client/src/app/components/admin-market-data/admin-market-data.html 226 @@ -7899,7 +7899,7 @@ Gather All Historical Market Data - Gather All Historical Market Data + Tüm Geçmiş Piyasa Verilerini Topla apps/client/src/app/components/admin-market-data/admin-market-data.html 231 @@ -7907,7 +7907,7 @@ Gather Historical Market Data - Gather Historical Market Data + Geçmiş Piyasa Verilerini Topla apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 29 @@ -7915,7 +7915,7 @@ Data Gathering is off - Data Gathering is off + Veri Toplama Kapalı apps/client/src/app/components/admin-market-data/admin-market-data.html 38 @@ -7923,7 +7923,7 @@ Performance Calculation - Performance Calculation + Performans Hesaplaması apps/client/src/app/components/user-account-settings/user-account-settings.html 31 @@ -7931,7 +7931,7 @@ someone - someone + birisi apps/client/src/app/pages/public/public-page.component.ts 33 @@ -7939,7 +7939,7 @@ Add asset to watchlist - Add asset to watchlist + Varlığı izleme listesine ekle apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html 7 @@ -7947,7 +7947,7 @@ Watchlist - Watchlist + İzleme Listesi apps/client/src/app/components/home-watchlist/home-watchlist.html 4 @@ -7959,7 +7959,7 @@ Watchlist - Watchlist + İzleme Listesi apps/client/src/app/pages/home/home-page-routing.module.ts 44 @@ -7971,7 +7971,7 @@ Get Early Access - Get Early Access + Erken Erişim apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html 29 @@ -7979,7 +7979,7 @@ Do you really want to delete this item? - Do you really want to delete this item? + Bu öğeyi silmek istediğinize emin misiniz? libs/ui/src/lib/benchmark/benchmark.component.ts 122 From 3ec2460bfea3fa10c01174f535ad2348ace67de1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 6 May 2025 17:38:21 +0200 Subject: [PATCH 47/91] Feature/update locales (#4664) * Update locales * Clean up --------- Co-authored-by: github-actions[bot] Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- apps/client/src/locales/messages.tr.xlf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 020b0268a..459db2d02 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -3588,7 +3588,7 @@ How does Ghostfolio work? - NasılGhostfolio çalışır? + NasılGhostfolio çalışır? apps/client/src/app/pages/landing/landing-page.html 383 @@ -5384,7 +5384,7 @@ Switch to Ghostfolio Premium or Ghostfolio Open Source easily - Ghostfolio Premium veya Ghostfolio Open Source'a kolayca geçin + Ghostfolio Premium veya Ghostfolio Open Source’a kolayca geçin libs/ui/src/lib/i18n.ts 12 @@ -5392,7 +5392,7 @@ Switch to Ghostfolio Premium easily - Ghostfolio Premium'a kolayca geçin + Ghostfolio Premium’a kolayca geçin libs/ui/src/lib/i18n.ts 13 @@ -5400,7 +5400,7 @@ Switch to Ghostfolio Open Source or Ghostfolio Basic easily - Ghostfolio Açık Kaynak veya Ghostfolio Temel'e kolayca geçin. + Ghostfolio Açık Kaynak veya Ghostfolio Temel’e kolayca geçin. libs/ui/src/lib/i18n.ts 14 @@ -6372,7 +6372,7 @@ If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a withdrawal rate of 4%. - Eğer bugün emekli olursanız, toplam tutarındaki varlıklarınız ve %4'lük bir çekilme oranına dayanarak yıllık veya aylık çekebilirsiniz. + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a withdrawal rate of 4%. apps/client/src/app/pages/portfolio/fire/fire-page.html 67 @@ -6620,7 +6620,7 @@ Approximation based on the top holdings of each ETF - Her ETF'nin en üst tutarlarına dayalı yaklaşım + Her ETF’nin en üst tutarlarına dayalı yaklaşım apps/client/src/app/pages/portfolio/allocations/allocations-page.html 340 From 40d3eaa023cebc932526366c79f36d115f041fe0 Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Tue, 6 May 2025 22:41:04 +0700 Subject: [PATCH 48/91] Bugfix/fix performance calculation on date of activity when unit price differs from market price (#4650) * Fix performance calculation on date of activity when unit price differs from market price * Update changelog --- CHANGELOG.md | 4 + .../portfolio-calculator-baln-buy.spec.ts | 78 +++++++++++++++++++ .../roai/portfolio-calculator-btceur.spec.ts | 17 ++-- .../roai/portfolio-calculator-btcusd.spec.ts | 17 ++-- ...folio-calculator-novn-buy-and-sell.spec.ts | 18 +++-- .../calculator/roai/portfolio-calculator.ts | 29 +++++-- 6 files changed, 134 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d3f035cd..89e9fa525 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the language localization for Turkish (`tr`) +### Fixed + +- Fixed an issue in the performance calculation on the date of an activity when the unit price differs from the market price + ## 2.160.0 - 2025-05-04 ### Added diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts index b21192db1..e7f95aea8 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts @@ -193,5 +193,83 @@ describe('PortfolioCalculator', () => { { date: '2021-12-01', investment: 0 } ]); }); + + it.only('with BALN.SW buy (with unit price lower than closing price)', async () => { + jest.useFakeTimers().setSystemTime(parseDate('2021-12-18').getTime()); + + const activities: Activity[] = [ + { + ...activityDummyData, + date: new Date('2021-11-30'), + feeInAssetProfileCurrency: 1.55, + quantity: 2, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'CHF', + dataSource: 'YAHOO', + name: 'Bâloise Holding AG', + symbol: 'BALN.SW' + }, + type: 'BUY', + unitPriceInAssetProfileCurrency: 135.0 + } + ]; + + const portfolioCalculator = portfolioCalculatorFactory.createCalculator({ + activities, + calculationType: PerformanceCalculationType.ROAI, + currency: 'CHF', + userId: userDummyData.id + }); + + const portfolioSnapshot = await portfolioCalculator.computeSnapshot(); + const snapshotOnBuyDate = portfolioSnapshot.historicalData.find( + ({ date }) => { + return date === '2021-11-30'; + } + ); + + // Closing price on 2021-11-30: 136.6 + expect(snapshotOnBuyDate?.netPerformanceWithCurrencyEffect).toEqual(1.65); // 2 * (136.6 - 135.0) - 1.55 = 1.65 + }); + + it.only('with BALN.SW buy (with unit price lower than closing price), calculated on buy date', async () => { + jest.useFakeTimers().setSystemTime(parseDate('2021-11-30').getTime()); + + const activities: Activity[] = [ + { + ...activityDummyData, + date: new Date('2021-11-30'), + feeInAssetProfileCurrency: 1.55, + quantity: 2, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'CHF', + dataSource: 'YAHOO', + name: 'Bâloise Holding AG', + symbol: 'BALN.SW' + }, + type: 'BUY', + unitPriceInAssetProfileCurrency: 135.0 + } + ]; + + const portfolioCalculator = portfolioCalculatorFactory.createCalculator({ + activities, + calculationType: PerformanceCalculationType.ROAI, + currency: 'CHF', + userId: userDummyData.id + }); + + const portfolioSnapshot = await portfolioCalculator.computeSnapshot(); + const snapshotOnBuyDate = portfolioSnapshot.historicalData.find( + ({ date }) => { + return date === '2021-11-30'; + } + ); + + // Closing price on 2021-11-30: 136.6 + expect(snapshotOnBuyDate?.netPerformanceWithCurrencyEffect).toEqual(1.65); // 2 * (136.6 - 135.0) - 1.55 = 1.65 + }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts index 2c5b90050..ba818eb40 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts @@ -142,19 +142,22 @@ describe('PortfolioCalculator', () => { valueWithCurrencyEffect: 0 }); + /** + * Closing price on 2021-12-12: 50098.3 + */ expect(portfolioSnapshot.historicalData[1]).toEqual({ date: '2021-12-12', investmentValueWithCurrencyEffect: 44558.42, - netPerformance: -4.46, - netPerformanceInPercentage: 0, - netPerformanceInPercentageWithCurrencyEffect: 0, - netPerformanceWithCurrencyEffect: -4.46, - netWorth: 44558.42, + netPerformance: 5535.42, // 1 * (50098.3 - 44558.42) - 4.46 = 5535.42 + netPerformanceInPercentage: 0.12422837255001412, // 5535.42 ÷ 44558.42 = 0.12422837255001412 + netPerformanceInPercentageWithCurrencyEffect: 0.12422837255001412, // 5535.42 ÷ 44558.42 = 0.12422837255001412 + netPerformanceWithCurrencyEffect: 5535.42, + netWorth: 50098.3, // 1 * 50098.3 = 50098.3 totalAccountBalance: 0, totalInvestment: 44558.42, totalInvestmentValueWithCurrencyEffect: 44558.42, - value: 44558.42, - valueWithCurrencyEffect: 44558.42 + value: 50098.3, // 1 * 50098.3 = 50098.3 + valueWithCurrencyEffect: 50098.3 }); expect( diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts index 96205fd77..cf07eff97 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts @@ -142,19 +142,22 @@ describe('PortfolioCalculator', () => { valueWithCurrencyEffect: 0 }); + /** + * Closing price on 2021-12-12: 50098.3 + */ expect(portfolioSnapshot.historicalData[1]).toEqual({ date: '2021-12-12', investmentValueWithCurrencyEffect: 44558.42, - netPerformance: -4.46, - netPerformanceInPercentage: 0, - netPerformanceInPercentageWithCurrencyEffect: 0, - netPerformanceWithCurrencyEffect: -4.46, - netWorth: 44558.42, + netPerformance: 5535.42, // 1 * (50098.3 - 44558.42) - 4.46 = 5535.42 + netPerformanceInPercentage: 0.12422837255001412, // 5535.42 ÷ 44558.42 = 0.12422837255001412 + netPerformanceInPercentageWithCurrencyEffect: 0.12422837255001412, // 5535.42 ÷ 44558.42 = 0.12422837255001412 + netPerformanceWithCurrencyEffect: 5535.42, // 1 * (50098.3 - 44558.42) - 4.46 = 5535.42 + netWorth: 50098.3, // 1 * 50098.3 = 50098.3 totalAccountBalance: 0, totalInvestment: 44558.42, totalInvestmentValueWithCurrencyEffect: 44558.42, - value: 44558.42, - valueWithCurrencyEffect: 44558.42 + value: 50098.3, // 1 * 50098.3 = 50098.3 + valueWithCurrencyEffect: 50098.3 }); expect( diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts index b5d7d59f8..3d4760be7 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts @@ -145,19 +145,23 @@ describe('PortfolioCalculator', () => { valueWithCurrencyEffect: 0 }); + /** + * Closing price on 2022-03-07 is unknown, + * hence it uses the last unit price (2022-04-11): 87.8 + */ expect(portfolioSnapshot.historicalData[1]).toEqual({ date: '2022-03-07', investmentValueWithCurrencyEffect: 151.6, - netPerformance: 0, - netPerformanceInPercentage: 0, - netPerformanceInPercentageWithCurrencyEffect: 0, - netPerformanceWithCurrencyEffect: 0, - netWorth: 151.6, + netPerformance: 24, // 2 * (87.8 - 75.8) = 24 + netPerformanceInPercentage: 0.158311345646438, // 24 ÷ 151.6 = 0.158311345646438 + netPerformanceInPercentageWithCurrencyEffect: 0.158311345646438, // 24 ÷ 151.6 = 0.158311345646438 + netPerformanceWithCurrencyEffect: 24, + netWorth: 175.6, // 2 * 87.8 = 175.6 totalAccountBalance: 0, totalInvestment: 151.6, totalInvestmentValueWithCurrencyEffect: 151.6, - value: 151.6, - valueWithCurrencyEffect: 151.6 + value: 175.6, // 2 * 87.8 = 175.6 + valueWithCurrencyEffect: 175.6 }); expect( diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts index c22a101bd..d9da465f9 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts @@ -456,12 +456,19 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { ); } + const marketPriceInBaseCurrency = + order.unitPriceFromMarketData?.mul(currentExchangeRate ?? 1) ?? + new Big(0); + const marketPriceInBaseCurrencyWithCurrencyEffect = + order.unitPriceFromMarketData?.mul(exchangeRateAtOrderDate ?? 1) ?? + new Big(0); + const valueOfInvestmentBeforeTransaction = totalUnits.mul( - order.unitPriceInBaseCurrency + marketPriceInBaseCurrency ); const valueOfInvestmentBeforeTransactionWithCurrencyEffect = - totalUnits.mul(order.unitPriceInBaseCurrencyWithCurrencyEffect); + totalUnits.mul(marketPriceInBaseCurrencyWithCurrencyEffect); if (!investmentAtStartDate && i >= indexOfStartOrder) { investmentAtStartDate = totalInvestment ?? new Big(0); @@ -558,10 +565,10 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { totalUnits = totalUnits.plus(order.quantity.mul(getFactor(order.type))); - const valueOfInvestment = totalUnits.mul(order.unitPriceInBaseCurrency); + const valueOfInvestment = totalUnits.mul(marketPriceInBaseCurrency); const valueOfInvestmentWithCurrencyEffect = totalUnits.mul( - order.unitPriceInBaseCurrencyWithCurrencyEffect + marketPriceInBaseCurrencyWithCurrencyEffect ); const grossPerformanceFromSell = @@ -701,17 +708,23 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { investmentValuesWithCurrencyEffect[order.date] ?? new Big(0) ).add(transactionInvestmentWithCurrencyEffect); + // If duration is effectively zero (first day), use the actual investment as the base. + // Otherwise, use the calculated time-weighted average. timeWeightedInvestmentValues[order.date] = - totalInvestmentDays > 0 + totalInvestmentDays > Number.EPSILON ? sumOfTimeWeightedInvestments.div(totalInvestmentDays) - : new Big(0); + : totalInvestment.gt(0) + ? totalInvestment + : new Big(0); timeWeightedInvestmentValuesWithCurrencyEffect[order.date] = - totalInvestmentDays > 0 + totalInvestmentDays > Number.EPSILON ? sumOfTimeWeightedInvestmentsWithCurrencyEffect.div( totalInvestmentDays ) - : new Big(0); + : totalInvestmentWithCurrencyEffect.gt(0) + ? totalInvestmentWithCurrencyEffect + : new Big(0); } if (PortfolioCalculator.ENABLE_LOGGING) { From c38dab5ab09fb5d33131dc60edfdbb69c163d72f Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Tue, 6 May 2025 22:43:03 +0700 Subject: [PATCH 49/91] Feature/extend holding endpoint by performances (#4660) * Extend holding endpoint by performances * Update changelog --- CHANGELOG.md | 4 ++ apps/api/src/app/endpoints/ai/ai.module.ts | 2 + .../src/app/endpoints/public/public.module.ts | 2 + .../api/src/app/portfolio/portfolio.module.ts | 2 + .../src/app/portfolio/portfolio.service.ts | 42 ++++++++++++++++++- .../portfolio-holding-response.interface.ts | 2 + 6 files changed, 52 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89e9fa525..177f9e825 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 endpoint to get a holding by the date of the last all time high and the current change to the all time high + ### Changed - Improved the language localization for Turkish (`tr`) diff --git a/apps/api/src/app/endpoints/ai/ai.module.ts b/apps/api/src/app/endpoints/ai/ai.module.ts index 584f29956..b6f9941ad 100644 --- a/apps/api/src/app/endpoints/ai/ai.module.ts +++ b/apps/api/src/app/endpoints/ai/ai.module.ts @@ -8,6 +8,7 @@ import { RulesService } from '@ghostfolio/api/app/portfolio/rules.service'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; 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 { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; @@ -27,6 +28,7 @@ import { AiService } from './ai.service'; controllers: [AiController], imports: [ ApiModule, + BenchmarkModule, ConfigurationModule, DataProviderModule, ExchangeRateDataModule, diff --git a/apps/api/src/app/endpoints/public/public.module.ts b/apps/api/src/app/endpoints/public/public.module.ts index 9b43522c1..cf4fd3d18 100644 --- a/apps/api/src/app/endpoints/public/public.module.ts +++ b/apps/api/src/app/endpoints/public/public.module.ts @@ -9,6 +9,7 @@ import { RulesService } from '@ghostfolio/api/app/portfolio/rules.service'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; +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 { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; @@ -25,6 +26,7 @@ import { PublicController } from './public.controller'; controllers: [PublicController], imports: [ AccessModule, + BenchmarkModule, DataProviderModule, ExchangeRateDataModule, ImpersonationModule, diff --git a/apps/api/src/app/portfolio/portfolio.module.ts b/apps/api/src/app/portfolio/portfolio.module.ts index 7ae74ee5f..0f64b2f6a 100644 --- a/apps/api/src/app/portfolio/portfolio.module.ts +++ b/apps/api/src/app/portfolio/portfolio.module.ts @@ -9,6 +9,7 @@ import { RedactValuesInResponseModule } from '@ghostfolio/api/interceptors/redac import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module'; 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 { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; @@ -33,6 +34,7 @@ import { RulesService } from './rules.service'; imports: [ AccessModule, ApiModule, + BenchmarkModule, ConfigurationModule, DataGatheringModule, DataProviderModule, diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 47c773e80..c580ce149 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -20,6 +20,7 @@ import { RegionalMarketClusterRiskEmergingMarkets } from '@ghostfolio/api/models import { RegionalMarketClusterRiskEurope } from '@ghostfolio/api/models/rules/regional-market-cluster-risk/europe'; import { RegionalMarketClusterRiskJapan } from '@ghostfolio/api/models/rules/regional-market-cluster-risk/japan'; import { RegionalMarketClusterRiskNorthAmerica } from '@ghostfolio/api/models/rules/regional-market-cluster-risk/north-america'; +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 { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; @@ -100,6 +101,7 @@ export class PortfolioService { public constructor( private readonly accountBalanceService: AccountBalanceService, private readonly accountService: AccountService, + private readonly benchmarkService: BenchmarkService, private readonly calculatorFactory: PortfolioCalculatorFactory, private readonly dataProviderService: DataProviderService, private readonly exchangeRateDataService: ExchangeRateDataService, @@ -669,6 +671,7 @@ export class PortfolioService { netPerformancePercent: undefined, netPerformancePercentWithCurrencyEffect: undefined, netPerformanceWithCurrencyEffect: undefined, + performances: undefined, quantity: undefined, SymbolProfile: undefined, tags: [], @@ -752,6 +755,10 @@ export class PortfolioService { activitiesOfHolding[0].unitPriceInAssetProfileCurrency, marketPrice ); + let marketPriceMaxDate = + marketPrice > activitiesOfHolding[0].unitPriceInAssetProfileCurrency + ? new Date() + : activitiesOfHolding[0].date; let marketPriceMin = Math.min( activitiesOfHolding[0].unitPriceInAssetProfileCurrency, marketPrice @@ -793,7 +800,10 @@ export class PortfolioService { quantity: currentQuantity }); - marketPriceMax = Math.max(marketPrice ?? 0, marketPriceMax); + if (marketPrice > marketPriceMax) { + marketPriceMax = marketPrice; + marketPriceMaxDate = parseISO(date); + } marketPriceMin = Math.min( marketPrice ?? Number.MAX_SAFE_INTEGER, marketPriceMin @@ -809,6 +819,12 @@ export class PortfolioService { }); } + const performancePercent = + this.benchmarkService.calculateChangeInPercentage( + marketPriceMax, + marketPrice + ); + return { firstBuyDate, marketPrice, @@ -846,6 +862,12 @@ export class PortfolioService { ]?.toNumber(), netPerformanceWithCurrencyEffect: position.netPerformanceWithCurrencyEffectMap?.['max']?.toNumber(), + performances: { + allTimeHigh: { + performancePercent, + date: marketPriceMaxDate + } + }, quantity: quantity.toNumber(), value: this.exchangeRateDataService.toCurrency( quantity.mul(marketPrice ?? 0).toNumber(), @@ -885,6 +907,7 @@ export class PortfolioService { const historicalDataArray: HistoricalDataItem[] = []; let marketPriceMax = marketPrice; + let marketPriceMaxDate = new Date(); let marketPriceMin = marketPrice; for (const [date, { marketPrice }] of Object.entries( @@ -895,13 +918,22 @@ export class PortfolioService { value: marketPrice }); - marketPriceMax = Math.max(marketPrice ?? 0, marketPriceMax); + if (marketPrice > marketPriceMax) { + marketPriceMax = marketPrice; + marketPriceMaxDate = parseISO(date); + } marketPriceMin = Math.min( marketPrice ?? Number.MAX_SAFE_INTEGER, marketPriceMin ); } + const performancePercent = + this.benchmarkService.calculateChangeInPercentage( + marketPriceMax, + marketPrice + ); + return { marketPrice, marketPriceMax, @@ -925,6 +957,12 @@ export class PortfolioService { netPerformancePercent: undefined, netPerformancePercentWithCurrencyEffect: undefined, netPerformanceWithCurrencyEffect: undefined, + performances: { + allTimeHigh: { + performancePercent, + date: marketPriceMaxDate + } + }, quantity: 0, tags: [], transactionCount: undefined, 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 c460242af..b330e8baa 100644 --- a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts @@ -1,5 +1,6 @@ import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { + Benchmark, DataProviderInfo, EnhancedSymbolProfile, HistoricalDataItem @@ -29,6 +30,7 @@ export interface PortfolioHoldingResponse { netPerformancePercent: number; netPerformancePercentWithCurrencyEffect: number; netPerformanceWithCurrencyEffect: number; + performances: Benchmark['performances']; quantity: number; SymbolProfile: EnhancedSymbolProfile; tags: Tag[]; From 67db1b0de40e525e7aec8d3f1888e005330a0a4f Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 6 May 2025 17:43:46 +0200 Subject: [PATCH 50/91] Feature/rename Order to activities in SymbolProfile database schema (#4661) * Rename Order to activities * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/admin/admin.service.ts | 24 +++++++++---------- .../data-gathering/data-gathering.service.ts | 8 +++---- .../symbol-profile/symbol-profile.service.ts | 24 +++++++++---------- prisma/schema.prisma | 4 ++-- 5 files changed, 31 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 177f9e825..a21641459 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 +- Renamed `Order` to `activities` in the `SymbolProfile` database schema - Improved the language localization for Turkish (`tr`) ### Fixed diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index ce8adaf65..79beedea9 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -227,7 +227,7 @@ export class AdminService { if (sortColumn === 'activitiesCount') { orderBy = { - Order: { + activities: { _count: sortDirection } }; @@ -246,10 +246,15 @@ export class AdminService { select: { _count: { select: { - Order: true, + activities: true, watchedBy: true } }, + activities: { + orderBy: [{ date: 'asc' }], + select: { date: true }, + take: 1 + }, assetClass: true, assetSubClass: true, comment: true, @@ -260,11 +265,6 @@ export class AdminService { isActive: true, isUsedByUsersWithSubscription: true, name: true, - Order: { - orderBy: [{ date: 'asc' }], - select: { date: true }, - take: 1 - }, scraperConfiguration: true, sectors: true, symbol: true, @@ -311,6 +311,7 @@ export class AdminService { assetProfiles.map( async ({ _count, + activities, assetClass, assetSubClass, comment, @@ -321,7 +322,6 @@ export class AdminService { isActive, isUsedByUsersWithSubscription, name, - Order, sectors, symbol, SymbolProfileOverrides @@ -383,8 +383,8 @@ export class AdminService { symbol, marketDataItemCount, sectorsCount, - activitiesCount: _count.Order, - date: Order?.[0]?.date, + activitiesCount: _count.activities, + date: activities?.[0]?.date, isUsedByUsersWithSubscription: await isUsedByUsersWithSubscription, watchedByCount: _count.watchedBy @@ -654,7 +654,7 @@ export class AdminService { select: { _count: { select: { - Order: { + activities: { where: { User: { subscriptions: { @@ -675,7 +675,7 @@ export class AdminService { } }); - return _count.Order > 0; + return _count.activities > 0; } } } diff --git a/apps/api/src/services/queues/data-gathering/data-gathering.service.ts b/apps/api/src/services/queues/data-gathering/data-gathering.service.ts index 90a269315..0f1537d02 100644 --- a/apps/api/src/services/queues/data-gathering/data-gathering.service.ts +++ b/apps/api/src/services/queues/data-gathering/data-gathering.service.ts @@ -433,13 +433,13 @@ export class DataGatheringService { await this.prismaService.symbolProfile.findMany({ orderBy: [{ symbol: 'asc' }], select: { - dataSource: true, - id: true, - Order: { + activities: { orderBy: [{ date: 'asc' }], select: { date: true }, take: 1 }, + dataSource: true, + id: true, scraperConfiguration: true, symbol: true }, @@ -459,7 +459,7 @@ export class DataGatheringService { ); }) .map((symbolProfile) => { - let date = symbolProfile.Order?.[0]?.date ?? startDate; + let date = symbolProfile.activities?.[0]?.date ?? startDate; if (benchmarkAssetProfileIdMap[symbolProfile.id]) { date = this.getEarliestDate(startDate); diff --git a/apps/api/src/services/symbol-profile/symbol-profile.service.ts b/apps/api/src/services/symbol-profile/symbol-profile.service.ts index a24101e80..30ad1c5fb 100644 --- a/apps/api/src/services/symbol-profile/symbol-profile.service.ts +++ b/apps/api/src/services/symbol-profile/symbol-profile.service.ts @@ -42,7 +42,7 @@ export class SymbolProfileService { }) { return this.prismaService.symbolProfile.findMany({ include: { - Order: { + activities: { include: { User: true } @@ -50,8 +50,7 @@ export class SymbolProfileService { }, orderBy: [{ symbol: 'asc' }], where: { - isActive: true, - Order: withUserSubscription + activities: withUserSubscription ? { some: { User: { @@ -65,7 +64,8 @@ export class SymbolProfileService { subscriptions: { none: { expiresAt: { gt: new Date() } } } } } - } + }, + isActive: true } }); } @@ -77,9 +77,9 @@ export class SymbolProfileService { .findMany({ include: { _count: { - select: { Order: true } + select: { activities: true } }, - Order: { + activities: { orderBy: { date: 'asc' }, @@ -109,7 +109,7 @@ export class SymbolProfileService { .findMany({ include: { _count: { - select: { Order: true } + select: { activities: true } }, SymbolProfileOverrides: true }, @@ -184,8 +184,8 @@ export class SymbolProfileService { private enhanceSymbolProfiles( symbolProfiles: (SymbolProfile & { - _count: { Order: number }; - Order?: { + _count: { activities: number }; + activities?: { date: Date; }[]; SymbolProfileOverrides: SymbolProfileOverrides; @@ -209,11 +209,11 @@ export class SymbolProfileService { symbolMapping: this.getSymbolMapping(symbolProfile) }; - item.activitiesCount = symbolProfile._count.Order; + item.activitiesCount = symbolProfile._count.activities; delete item._count; - item.dateOfFirstActivity = symbolProfile.Order?.[0]?.date; - delete item.Order; + item.dateOfFirstActivity = symbolProfile.activities?.[0]?.date; + delete item.activities; if (item.SymbolProfileOverrides) { item.assetClass = diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 863c196ac..7bf69c56a 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -131,6 +131,7 @@ model Order { isDraft Boolean @default(false) quantity Float symbolProfileId String + tags Tag[] type Type unitPrice Float updatedAt DateTime @updatedAt @@ -138,7 +139,6 @@ model Order { Account Account? @relation(fields: [accountId, accountUserId], references: [id, userId]) SymbolProfile SymbolProfile @relation(fields: [symbolProfileId], references: [id]) User User @relation(fields: [userId], onDelete: Cascade, references: [id]) - tags Tag[] @@index([accountId]) @@index([date]) @@ -168,6 +168,7 @@ model Settings { } model SymbolProfile { + activities Order[] assetClass AssetClass? assetSubClass AssetSubClass? comment String? @@ -192,7 +193,6 @@ model SymbolProfile { url String? userId String? watchedBy User[] @relation("UserWatchlist") - Order Order[] SymbolProfileOverrides SymbolProfileOverrides? User User? @relation(fields: [userId], onDelete: Cascade, references: [id]) From 19eff6e814bcb2abb14a204e5abd44a2c41a0131 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 6 May 2025 18:05:30 +0200 Subject: [PATCH 51/91] Bugfix/fix horizontal overflow in table of benchmark component (#4668) * Fix horizontal overflow * Update changelog --- CHANGELOG.md | 1 + .../lib/benchmark/benchmark.component.html | 316 +++++++++--------- 2 files changed, 166 insertions(+), 151 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a21641459..9ebb975b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed an issue in the performance calculation on the date of an activity when the unit price differs from the market price +- Fixed the horizontal overflow in the table of the benchmark component ## 2.160.0 - 2025-05-04 diff --git a/libs/ui/src/lib/benchmark/benchmark.component.html b/libs/ui/src/lib/benchmark/benchmark.component.html index 14ff7f9f2..631e5b7e1 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.html +++ b/libs/ui/src/lib/benchmark/benchmark.component.html @@ -1,164 +1,178 @@ -
IndexName {{ element?.name }} + @if (hasPermissionToDeleteItem) { + + } + + + +
- - - - +
+
Name - {{ element?.name }} -
+ + + + - - - - + + + + - - - - + + + + - - - + + + + + + - - - - - - + + - - - - + + + + - - - - + + + + - - -
Name + {{ element?.name }} + - 50-Day Trend - -
- @if (element?.trend50d !== 'UNKNOWN') { - - } -
-
+ 50-Day Trend + +
+ @if (element?.trend50d !== 'UNKNOWN') { + + } +
+
- 200-Day Trend - -
- @if (element?.trend200d !== 'UNKNOWN') { - - } -
-
+ 200-Day Trend + +
+ @if (element?.trend200d !== 'UNKNOWN') { + + } +
+
- Last All Time High - -
- @if (element?.performances?.allTimeHigh?.date) { + +
+ Last All Time High + +
+ @if (element?.performances?.allTimeHigh?.date) { + + } +
+
+ Change from All Time High + from ATH + + @if (isNumber(element?.performances?.allTimeHigh?.performancePercent)) { } - - - Change from All Time High - from ATH - - @if (isNumber(element?.performances?.allTimeHigh?.performancePercent)) { - - } - - @if (element?.marketCondition) { -
- {{ resolveMarketCondition(element.marketCondition).emoji }} -
- } -
+ @if (element?.marketCondition) { +
+ {{ resolveMarketCondition(element.marketCondition).emoji }} +
+ } +
- @if (hasPermissionToDeleteItem) { - - } - - - - + @if (hasPermissionToDeleteItem) { + + } + + + +
+ + + +
@if (isLoading) { Date: Tue, 6 May 2025 18:08:25 +0200 Subject: [PATCH 52/91] Release 2.161.0 (#4671) --- 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 9ebb975b6..bab6e86d0 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.161.0 - 2025-05-06 ### Added diff --git a/package-lock.json b/package-lock.json index b6afbaf6f..9f7d5b796 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.160.0", + "version": "2.161.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.160.0", + "version": "2.161.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index b12b4c0c7..35ac994e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.160.0", + "version": "2.161.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 03e27dd2339c696cbdd276fd17b7bbf6fcec0246 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 6 May 2025 18:45:02 +0200 Subject: [PATCH 53/91] Feature/update locales (#4670) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 16 ++++++++-------- apps/client/src/locales/messages.de.xlf | 16 ++++++++-------- apps/client/src/locales/messages.es.xlf | 16 ++++++++-------- apps/client/src/locales/messages.fr.xlf | 16 ++++++++-------- apps/client/src/locales/messages.it.xlf | 16 ++++++++-------- apps/client/src/locales/messages.nl.xlf | 16 ++++++++-------- apps/client/src/locales/messages.pl.xlf | 16 ++++++++-------- apps/client/src/locales/messages.pt.xlf | 16 ++++++++-------- apps/client/src/locales/messages.tr.xlf | 16 ++++++++-------- apps/client/src/locales/messages.uk.xlf | 16 ++++++++-------- apps/client/src/locales/messages.xlf | 16 ++++++++-------- apps/client/src/locales/messages.zh.xlf | 16 ++++++++-------- 12 files changed, 96 insertions(+), 96 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 305fa508a..2d267d24e 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -1079,7 +1079,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 3 + 4 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1247,7 +1247,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 142 + 155 @@ -4971,7 +4971,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 174 + 188 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6111,7 +6111,7 @@ 50-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 15 + 16 @@ -6119,7 +6119,7 @@ 200-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 40 + 45 @@ -6127,7 +6127,7 @@ Last All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 65 + 74 @@ -6135,7 +6135,7 @@ Change from All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 96 @@ -6143,7 +6143,7 @@ from ATH libs/ui/src/lib/benchmark/benchmark.component.html - 85 + 98 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 47c1a1340..6f8323fe6 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -166,7 +166,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 3 + 4 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -302,7 +302,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 142 + 155 @@ -2546,7 +2546,7 @@ Änderung vom Allzeithoch libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 96 @@ -2554,7 +2554,7 @@ vom AZH libs/ui/src/lib/benchmark/benchmark.component.html - 85 + 98 @@ -4690,7 +4690,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 174 + 188 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6039,7 +6039,7 @@ Letztes Allzeithoch libs/ui/src/lib/benchmark/benchmark.component.html - 65 + 74 @@ -6127,7 +6127,7 @@ 50 Tage Trend libs/ui/src/lib/benchmark/benchmark.component.html - 15 + 16 @@ -6135,7 +6135,7 @@ 200 Tage Trend libs/ui/src/lib/benchmark/benchmark.component.html - 40 + 45 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 8541df0bc..02ad6ce5a 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -167,7 +167,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 3 + 4 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -303,7 +303,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 142 + 155 @@ -2531,7 +2531,7 @@ Variación respecto al máximo histórico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 96 @@ -2539,7 +2539,7 @@ desde el máximo histórico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 85 + 98 @@ -4667,7 +4667,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 174 + 188 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6016,7 +6016,7 @@ Last All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 65 + 74 @@ -6104,7 +6104,7 @@ 50-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 15 + 16 @@ -6112,7 +6112,7 @@ 200-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 40 + 45 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 165a03292..2fbd53993 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -174,7 +174,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 3 + 4 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -358,7 +358,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 142 + 155 @@ -3050,7 +3050,7 @@ Différence avec le Record Historique libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 96 @@ -3058,7 +3058,7 @@ par rapport au record historique libs/ui/src/lib/benchmark/benchmark.component.html - 85 + 98 @@ -4666,7 +4666,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 174 + 188 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6015,7 +6015,7 @@ Dernier All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 65 + 74 @@ -6103,7 +6103,7 @@ Tendance 50 jours libs/ui/src/lib/benchmark/benchmark.component.html - 15 + 16 @@ -6111,7 +6111,7 @@ Tendance 200 jours libs/ui/src/lib/benchmark/benchmark.component.html - 40 + 45 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index d1b32c6ce..a942ebd70 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -167,7 +167,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 3 + 4 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -303,7 +303,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 142 + 155 @@ -2531,7 +2531,7 @@ Variazione rispetto al massimo storico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 96 @@ -2539,7 +2539,7 @@ dal massimo storico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 85 + 98 @@ -4667,7 +4667,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 174 + 188 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6016,7 +6016,7 @@ Ultimo massimo storico libs/ui/src/lib/benchmark/benchmark.component.html - 65 + 74 @@ -6104,7 +6104,7 @@ Trend a 50 giorni libs/ui/src/lib/benchmark/benchmark.component.html - 15 + 16 @@ -6112,7 +6112,7 @@ Trend a 200 giorni libs/ui/src/lib/benchmark/benchmark.component.html - 40 + 45 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 378f1a42e..fc79a6da1 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -166,7 +166,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 3 + 4 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -302,7 +302,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 142 + 155 @@ -2530,7 +2530,7 @@ Verandering van All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 96 @@ -2538,7 +2538,7 @@ van ATH libs/ui/src/lib/benchmark/benchmark.component.html - 85 + 98 @@ -4666,7 +4666,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 174 + 188 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6015,7 +6015,7 @@ Last All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 65 + 74 @@ -6103,7 +6103,7 @@ 50-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 15 + 16 @@ -6111,7 +6111,7 @@ 200-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 40 + 45 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 714c83bdb..50dada8a9 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -1007,7 +1007,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 3 + 4 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1175,7 +1175,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 142 + 155 @@ -4583,7 +4583,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 174 + 188 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5551,7 +5551,7 @@ Ostatni Najwyższy Punkt w Historii libs/ui/src/lib/benchmark/benchmark.component.html - 65 + 74 @@ -5559,7 +5559,7 @@ Zmiana od Najwyższego Punktu w Historii libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 96 @@ -5567,7 +5567,7 @@ od ATH libs/ui/src/lib/benchmark/benchmark.component.html - 85 + 98 @@ -6103,7 +6103,7 @@ 50-Dniowy Trend libs/ui/src/lib/benchmark/benchmark.component.html - 15 + 16 @@ -6111,7 +6111,7 @@ 200-Dniowy Trend libs/ui/src/lib/benchmark/benchmark.component.html - 40 + 45 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 4a9ec251c..c327b1015 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -174,7 +174,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 3 + 4 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -358,7 +358,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 142 + 155 @@ -2922,7 +2922,7 @@ Diferença desde o Máximo Histórico libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 96 @@ -2930,7 +2930,7 @@ a partir do ATH (All Time High) libs/ui/src/lib/benchmark/benchmark.component.html - 85 + 98 @@ -4666,7 +4666,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 174 + 188 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6015,7 +6015,7 @@ Last All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 65 + 74 @@ -6103,7 +6103,7 @@ 50-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 15 + 16 @@ -6111,7 +6111,7 @@ 200-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 40 + 45 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 459db2d02..cf182ffc1 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -967,7 +967,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 3 + 4 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1135,7 +1135,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 142 + 155 @@ -4071,7 +4071,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 174 + 188 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5247,7 +5247,7 @@ Tüm Zamanların En Yüksek Seviyesinden (ATH) Değişim libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 96 @@ -5255,7 +5255,7 @@ Tüm Zamanların En Yüksek Seviyesinden libs/ui/src/lib/benchmark/benchmark.component.html - 85 + 98 @@ -6015,7 +6015,7 @@ Son, ATH libs/ui/src/lib/benchmark/benchmark.component.html - 65 + 74 @@ -6103,7 +6103,7 @@ 50 Günlük Trend libs/ui/src/lib/benchmark/benchmark.component.html - 15 + 16 @@ -6111,7 +6111,7 @@ 200 Günlük Trend libs/ui/src/lib/benchmark/benchmark.component.html - 40 + 45 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 7945267a0..adba86b10 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -1095,7 +1095,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 3 + 4 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1263,7 +1263,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 142 + 155 @@ -5223,7 +5223,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 174 + 188 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6741,7 +6741,7 @@ Тренд на 50 днів libs/ui/src/lib/benchmark/benchmark.component.html - 15 + 16 @@ -6749,7 +6749,7 @@ Тренд на 200 днів libs/ui/src/lib/benchmark/benchmark.component.html - 40 + 45 @@ -6757,7 +6757,7 @@ Останній рекордний максимум libs/ui/src/lib/benchmark/benchmark.component.html - 65 + 74 @@ -6765,7 +6765,7 @@ Зміна від Історичного Максимуму libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 96 @@ -6773,7 +6773,7 @@ від ІМ libs/ui/src/lib/benchmark/benchmark.component.html - 85 + 98 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 33d3e2f0c..c55d4dc94 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -979,7 +979,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 3 + 4 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1142,7 +1142,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 142 + 155 @@ -4237,7 +4237,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 174 + 188 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5134,35 +5134,35 @@ 50-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 15 + 16 200-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 40 + 45 Last All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 65 + 74 Change from All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 96 from ATH libs/ui/src/lib/benchmark/benchmark.component.html - 85 + 98 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 2853b6138..6b33fa12e 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -1016,7 +1016,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 3 + 4 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1184,7 +1184,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 142 + 155 @@ -4592,7 +4592,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 174 + 188 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5592,7 +5592,7 @@ 50 天趋势 libs/ui/src/lib/benchmark/benchmark.component.html - 15 + 16 @@ -5600,7 +5600,7 @@ 200天趋势 libs/ui/src/lib/benchmark/benchmark.component.html - 40 + 45 @@ -5608,7 +5608,7 @@ 上次历史最高纪录 libs/ui/src/lib/benchmark/benchmark.component.html - 65 + 74 @@ -5616,7 +5616,7 @@ 从历史最高点开始变化 libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 96 @@ -5624,7 +5624,7 @@ 来自 ATH libs/ui/src/lib/benchmark/benchmark.component.html - 85 + 98 From 828bd5f172a03130bdb6c55cb937fbc0f3720d0e Mon Sep 17 00:00:00 2001 From: Haruka Kishida <56765603+the13-HK@users.noreply.github.com> Date: Thu, 8 May 2025 03:34:31 +0900 Subject: [PATCH 54/91] Feature/upgrade to NestJS 11 (#4270) * Upgrade to NestJS 11 * Update changelog --- CHANGELOG.md | 6 + apps/api/src/app/auth/api-key.strategy.ts | 55 +- .../src/app/redis-cache/redis-cache.module.ts | 16 +- .../app/redis-cache/redis-cache.service.ts | 50 +- package-lock.json | 2932 +++++++++++++---- package.json | 30 +- 6 files changed, 2380 insertions(+), 709 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bab6e86d0..374672e54 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 `nestjs` from version `10.4.15` to `11.0.12` + ## 2.161.0 - 2025-05-06 ### Added diff --git a/apps/api/src/app/auth/api-key.strategy.ts b/apps/api/src/app/auth/api-key.strategy.ts index ace7fb245..e1e067ab7 100644 --- a/apps/api/src/app/auth/api-key.strategy.ts +++ b/apps/api/src/app/auth/api-key.strategy.ts @@ -21,37 +21,38 @@ export class ApiKeyStrategy extends PassportStrategy( private readonly prismaService: PrismaService, private readonly userService: UserService ) { - super( - { header: HEADER_KEY_TOKEN, prefix: 'Api-Key ' }, - true, - async (apiKey: string, done: (error: any, user?: any) => void) => { - try { - const user = await this.validateApiKey(apiKey); - - if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { - if (hasRole(user, 'INACTIVE')) { - throw new HttpException( - getReasonPhrase(StatusCodes.TOO_MANY_REQUESTS), - StatusCodes.TOO_MANY_REQUESTS - ); - } + super({ header: HEADER_KEY_TOKEN, prefix: 'Api-Key ' }, true); + } - await this.prismaService.analytics.upsert({ - create: { User: { connect: { id: user.id } } }, - update: { - activityCount: { increment: 1 }, - lastRequestAt: new Date() - }, - where: { userId: user.id } - }); - } + public async validate( + apiKey: string, + done: (error: any, user?: any) => void + ) { + try { + const user = await this.validateApiKey(apiKey); - done(null, user); - } catch (error) { - done(error, null); + if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { + if (hasRole(user, 'INACTIVE')) { + throw new HttpException( + getReasonPhrase(StatusCodes.TOO_MANY_REQUESTS), + StatusCodes.TOO_MANY_REQUESTS + ); } + + await this.prismaService.analytics.upsert({ + create: { User: { connect: { id: user.id } } }, + update: { + activityCount: { increment: 1 }, + lastRequestAt: new Date() + }, + where: { userId: user.id } + }); } - ); + + done(null, user); + } catch (error) { + done(error, null); + } } private async validateApiKey(apiKey: string) { diff --git a/apps/api/src/app/redis-cache/redis-cache.module.ts b/apps/api/src/app/redis-cache/redis-cache.module.ts index 5411309bd..d0e3228b7 100644 --- a/apps/api/src/app/redis-cache/redis-cache.module.ts +++ b/apps/api/src/app/redis-cache/redis-cache.module.ts @@ -1,17 +1,16 @@ import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { createKeyv } from '@keyv/redis'; import { CacheModule } from '@nestjs/cache-manager'; import { Module } from '@nestjs/common'; -import { redisStore } from 'cache-manager-redis-yet'; -import type { RedisClientOptions } from 'redis'; import { RedisCacheService } from './redis-cache.service'; @Module({ exports: [RedisCacheService], imports: [ - CacheModule.registerAsync({ + CacheModule.registerAsync({ imports: [ConfigurationModule], inject: [ConfigurationService], useFactory: async (configurationService: ConfigurationService) => { @@ -20,10 +19,13 @@ import { RedisCacheService } from './redis-cache.service'; ); return { - store: redisStore, - ttl: configurationService.get('CACHE_TTL'), - url: `redis://${redisPassword ? `:${redisPassword}` : ''}@${configurationService.get('REDIS_HOST')}:${configurationService.get('REDIS_PORT')}/${configurationService.get('REDIS_DB')}` - } as RedisClientOptions; + stores: [ + createKeyv( + `redis://${redisPassword ? `:${redisPassword}` : ''}@${configurationService.get('REDIS_HOST')}:${configurationService.get('REDIS_PORT')}/${configurationService.get('REDIS_DB')}` + ) + ], + ttl: configurationService.get('CACHE_TTL') + }; } }), ConfigurationModule 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 51db93ec6..97d71ae61 100644 --- a/apps/api/src/app/redis-cache/redis-cache.service.ts +++ b/apps/api/src/app/redis-cache/redis-cache.service.ts @@ -2,20 +2,18 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/con import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, Filter } from '@ghostfolio/common/interfaces'; -import { CACHE_MANAGER } from '@nestjs/cache-manager'; +import { CACHE_MANAGER, Cache } from '@nestjs/cache-manager'; import { Inject, Injectable, Logger } from '@nestjs/common'; -import { Milliseconds } from 'cache-manager'; -import { RedisCache } from 'cache-manager-redis-yet'; import { createHash } from 'crypto'; import ms from 'ms'; @Injectable() export class RedisCacheService { public constructor( - @Inject(CACHE_MANAGER) private readonly cache: RedisCache, + @Inject(CACHE_MANAGER) private readonly cache: Cache, private readonly configurationService: ConfigurationService ) { - const client = cache.store.client; + const client = cache.stores[0]; client.on('error', (error) => { Logger.error(error, 'RedisCacheService'); @@ -27,13 +25,33 @@ export class RedisCacheService { } public async getKeys(aPrefix?: string): Promise { - let prefix = aPrefix; - - if (prefix) { - prefix = `${prefix}*`; + 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; + } + } + }; + + for await (const [key] of this.cache.stores[0].iterator({})) { + if ((prefix && key.startsWith(prefix)) || !prefix) { + keys.push(key); + } } - return this.cache.store.keys(prefix); + return keys; } public getPortfolioSnapshotKey({ @@ -62,10 +80,8 @@ export class RedisCacheService { public async isHealthy() { try { - const client = this.cache.store.client; - const isHealthy = await Promise.race([ - client.ping(), + this.getKeys(), new Promise((_, reject) => setTimeout( () => reject(new Error('Redis health check timeout')), @@ -93,16 +109,14 @@ export class RedisCacheService { `${this.getPortfolioSnapshotKey({ userId })}` ); - for (const key of keys) { - await this.remove(key); - } + return this.cache.mdel(keys); } public async reset() { - return this.cache.reset(); + return this.cache.clear(); } - public async set(key: string, value: string, ttl?: Milliseconds) { + public async set(key: string, value: string, ttl?: number) { return this.cache.set( key, value, diff --git a/package-lock.json b/package-lock.json index 9f7d5b796..a0a96dfd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,17 +30,18 @@ "@dfinity/principal": "0.15.7", "@dinero.js/currencies": "2.0.0-alpha.8", "@internationalized/number": "3.6.0", - "@nestjs/bull": "10.2.3", - "@nestjs/cache-manager": "2.3.0", - "@nestjs/common": "10.4.15", - "@nestjs/config": "3.3.0", - "@nestjs/core": "10.4.15", - "@nestjs/event-emitter": "2.1.1", - "@nestjs/jwt": "10.2.0", - "@nestjs/passport": "10.0.3", - "@nestjs/platform-express": "10.4.15", - "@nestjs/schedule": "4.1.2", - "@nestjs/serve-static": "4.0.2", + "@keyv/redis": "4.3.4", + "@nestjs/bull": "11.0.2", + "@nestjs/cache-manager": "3.0.1", + "@nestjs/common": "11.1.0", + "@nestjs/config": "4.0.2", + "@nestjs/core": "11.1.0", + "@nestjs/event-emitter": "3.0.1", + "@nestjs/jwt": "11.0.0", + "@nestjs/passport": "11.0.5", + "@nestjs/platform-express": "11.1.0", + "@nestjs/schedule": "6.0.0", + "@nestjs/serve-static": "5.0.3", "@prisma/client": "6.7.0", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", @@ -49,8 +50,6 @@ "big.js": "6.2.2", "bootstrap": "4.6.2", "bull": "4.16.5", - "cache-manager": "5.7.6", - "cache-manager-redis-yet": "5.1.4", "chart.js": "4.4.9", "chartjs-adapter-date-fns": "3.0.0", "chartjs-chart-treemap": "3.1.0", @@ -107,8 +106,8 @@ "@angular/pwa": "19.2.1", "@eslint/eslintrc": "3.3.1", "@eslint/js": "9.24.0", - "@nestjs/schematics": "10.2.3", - "@nestjs/testing": "10.4.15", + "@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", @@ -127,7 +126,6 @@ "@storybook/core-server": "8.6.12", "@trivago/prettier-plugin-sort-imports": "5.2.2", "@types/big.js": "6.2.2", - "@types/cache-manager": "4.0.6", "@types/google-spreadsheet": "3.1.5", "@types/jest": "29.5.13", "@types/lodash": "4.17.16", @@ -4923,6 +4921,57 @@ "tslib": "2" } }, + "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==", + "license": "MIT", + "dependencies": { + "cluster-key-slot": "^1.1.2", + "redis": "^4.7.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.3.3" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==", + "license": "MIT", + "peer": true, + "dependencies": { + "buffer": "^6.0.3" + } + }, + "node_modules/@keyv/serialize/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/@kurkle/color": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", @@ -6874,52 +6923,55 @@ } }, "node_modules/@nestjs/bull": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@nestjs/bull/-/bull-10.2.3.tgz", - "integrity": "sha512-Gy90JjFCfYhWFBeoBSidc7rEEf2BNhkJ3RfK8ym589POOldwAra2xcnFBi0ZuhhOV60GcrCJBBkdrUbAMM670w==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/bull/-/bull-11.0.2.tgz", + "integrity": "sha512-RjyP9JZUuLmMhmq1TMNIZqolkAd14az1jyXMMVki+C9dYvaMjWzBSwcZAtKs9Pk15Rm7qN1xn3R11aMV2Xv4gg==", "license": "MIT", "dependencies": { - "@nestjs/bull-shared": "^10.2.3", + "@nestjs/bull-shared": "^11.0.2", "tslib": "2.8.1" }, "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", + "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", "bull": "^3.3 || ^4.0.0" } }, "node_modules/@nestjs/bull-shared": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@nestjs/bull-shared/-/bull-shared-10.2.3.tgz", - "integrity": "sha512-XcgAjNOgq6b5DVCytxhR5BKiwWo7hsusVeyE7sfFnlXRHeEtIuC2hYWBr/ZAtvL/RH0/O0tqtq0rVl972nbhJw==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/bull-shared/-/bull-shared-11.0.2.tgz", + "integrity": "sha512-dFlttJvBqIFD6M8JVFbkrR4Feb39OTAJPJpFVILU50NOJCM4qziRw3dSNG84Q3v+7/M6xUGMFdZRRGvBBKxoSA==", "license": "MIT", "dependencies": { "tslib": "2.8.1" }, "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0" + "@nestjs/common": "^10.0.0 || ^11.0.0", + "@nestjs/core": "^10.0.0 || ^11.0.0" } }, "node_modules/@nestjs/cache-manager": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@nestjs/cache-manager/-/cache-manager-2.3.0.tgz", - "integrity": "sha512-pxeBp9w/s99HaW2+pezM1P3fLiWmUEnTUoUMLa9UYViCtjj0E0A19W/vaT5JFACCzFIeNrwH4/16jkpAhQ25Vw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/cache-manager/-/cache-manager-3.0.1.tgz", + "integrity": "sha512-4UxTnR0fsmKL5YDalU2eLFVnL+OBebWUpX+hEduKGncrVKH4PPNoiRn1kXyOCjmzb0UvWgqubpssNouc8e0MCw==", "license": "MIT", "peerDependencies": { - "@nestjs/common": "^9.0.0 || ^10.0.0", - "@nestjs/core": "^9.0.0 || ^10.0.0", - "cache-manager": "<=5", - "rxjs": "^7.0.0" + "@nestjs/common": "^9.0.0 || ^10.0.0 || ^11.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0 || ^11.0.0", + "cache-manager": ">=6", + "keyv": ">=5", + "rxjs": "^7.8.1" } }, "node_modules/@nestjs/common": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.4.15.tgz", - "integrity": "sha512-vaLg1ZgwhG29BuLDxPA9OAcIlgqzp9/N8iG0wGapyUNTf4IY4O6zAHgN6QalwLhFxq7nOI021vdRojR1oF3bqg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.0.tgz", + "integrity": "sha512-8MrajltjtIN6eW9cTpv+1IZogqz2Zsrc8YDt0LwQPUq8cSq0j50DETdQpPsNMeib+p9avkV41+NrzGk1z2o5Wg==", "license": "MIT", "dependencies": { + "file-type": "20.4.1", "iterare": "1.2.1", + "load-esm": "1.0.2", "tslib": "2.8.1", "uid": "2.0.2" }, @@ -6943,43 +6995,46 @@ } }, "node_modules/@nestjs/config": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-3.3.0.tgz", - "integrity": "sha512-pdGTp8m9d0ZCrjTpjkUbZx6gyf2IKf+7zlkrPNMsJzYZ4bFRRTpXrnj+556/5uiI6AfL5mMrJc2u7dB6bvM+VA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-4.0.2.tgz", + "integrity": "sha512-McMW6EXtpc8+CwTUwFdg6h7dYcBUpH5iUILCclAsa+MbCEvC9ZKu4dCHRlJqALuhjLw97pbQu62l4+wRwGeZqA==", "license": "MIT", "dependencies": { - "dotenv": "16.4.5", - "dotenv-expand": "10.0.0", + "dotenv": "16.4.7", + "dotenv-expand": "12.0.1", "lodash": "4.17.21" }, "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/common": "^10.0.0 || ^11.0.0", "rxjs": "^7.1.0" } }, "node_modules/@nestjs/core": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.4.15.tgz", - "integrity": "sha512-UBejmdiYwaH6fTsz2QFBlC1cJHM+3UDeLZN+CiP9I1fRv2KlBZsmozGLbV5eS1JAVWJB4T5N5yQ0gjN8ZvcS2w==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.0.tgz", + "integrity": "sha512-IeXbTRPrr6xAVbETlDE+miSkNmYf/cPhCa9GU9gFtPO6pVNuAeG/dNrjLVc23mJtUlT/ibdsoW35TlSyHLkzEA==", "hasInstallScript": true, "license": "MIT", "dependencies": { - "@nuxtjs/opencollective": "0.3.2", + "@nuxt/opencollective": "0.4.1", "fast-safe-stringify": "2.1.1", "iterare": "1.2.1", - "path-to-regexp": "3.3.0", + "path-to-regexp": "8.2.0", "tslib": "2.8.1", "uid": "2.0.2" }, + "engines": { + "node": ">= 20" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/microservices": "^10.0.0", - "@nestjs/platform-express": "^10.0.0", - "@nestjs/websockets": "^10.0.0", + "@nestjs/common": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0", + "@nestjs/websockets": "^11.0.0", "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, @@ -6995,52 +7050,61 @@ } } }, + "node_modules/@nestjs/core/node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/@nestjs/event-emitter": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@nestjs/event-emitter/-/event-emitter-2.1.1.tgz", - "integrity": "sha512-6L6fBOZTyfFlL7Ih/JDdqlCzZeCW0RjCX28wnzGyg/ncv5F/EOeT1dfopQr1loBRQ3LTgu8OWM7n4zLN4xigsg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/event-emitter/-/event-emitter-3.0.1.tgz", + "integrity": "sha512-0Ln/x+7xkU6AJFOcQI9tIhUMXVF7D5itiaQGOyJbXtlAfAIt8gzDdJm+Im7cFzKoWkiW5nCXCPh6GSvdQd/3Dw==", "license": "MIT", "dependencies": { "eventemitter2": "6.4.9" }, "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0" + "@nestjs/common": "^10.0.0 || ^11.0.0", + "@nestjs/core": "^10.0.0 || ^11.0.0" } }, "node_modules/@nestjs/jwt": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-10.2.0.tgz", - "integrity": "sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.0.tgz", + "integrity": "sha512-v7YRsW3Xi8HNTsO+jeHSEEqelX37TVWgwt+BcxtkG/OfXJEOs6GZdbdza200d6KqId1pJQZ6UPj1F0M6E+mxaA==", "license": "MIT", "dependencies": { - "@types/jsonwebtoken": "9.0.5", + "@types/jsonwebtoken": "9.0.7", "jsonwebtoken": "9.0.2" }, "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0" + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0" } }, "node_modules/@nestjs/passport": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-10.0.3.tgz", - "integrity": "sha512-znJ9Y4S8ZDVY+j4doWAJ8EuuVO7SkQN3yOBmzxbGaXbvcSwFDAdGJ+OMCg52NdzIO4tQoN4pYKx8W6M0ArfFRQ==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-11.0.5.tgz", + "integrity": "sha512-ulQX6mbjlws92PIM15Naes4F4p2JoxGnIJuUsdXQPT+Oo2sqQmENEZXM7eYuimocfHnKlcfZOuyzbA33LwUlOQ==", "license": "MIT", "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "passport": "^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0" + "@nestjs/common": "^10.0.0 || ^11.0.0", + "passport": "^0.5.0 || ^0.6.0 || ^0.7.0" } }, "node_modules/@nestjs/platform-express": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.4.15.tgz", - "integrity": "sha512-63ZZPkXHjoDyO7ahGOVcybZCRa7/Scp6mObQKjcX/fTEq1YJeU75ELvMsuQgc8U2opMGOBD7GVuc4DV0oeDHoA==", + "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==", "license": "MIT", "dependencies": { - "body-parser": "1.20.3", "cors": "2.8.5", - "express": "4.21.2", - "multer": "1.4.4-lts.1", + "express": "5.1.0", + "multer": "1.4.5-lts.2", + "path-to-regexp": "8.2.0", "tslib": "2.8.1" }, "funding": { @@ -7048,46 +7112,41 @@ "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0" + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" } }, "node_modules/@nestjs/schedule": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-4.1.2.tgz", - "integrity": "sha512-hCTQ1lNjIA5EHxeu8VvQu2Ed2DBLS1GSC6uKPYlBiQe6LL9a7zfE9iVSK+zuK8E2odsApteEBmfAQchc8Hx0Gg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-6.0.0.tgz", + "integrity": "sha512-aQySMw6tw2nhitELXd3EiRacQRgzUKD9mFcUZVOJ7jPLqIBvXOyvRWLsK9SdurGA+jjziAlMef7iB5ZEFFoQpw==", "license": "MIT", "dependencies": { - "cron": "3.2.1", - "uuid": "11.0.3" + "cron": "4.3.0" }, "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0" - } - }, - "node_modules/@nestjs/schedule/node_modules/uuid": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", - "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" + "@nestjs/common": "^10.0.0 || ^11.0.0", + "@nestjs/core": "^10.0.0 || ^11.0.0" } }, "node_modules/@nestjs/schematics": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.2.3.tgz", - "integrity": "sha512-4e8gxaCk7DhBxVUly2PjYL4xC2ifDFexCqq1/u4TtivLGXotVk0wHdYuPYe1tHTHuR1lsOkRbfOCpkdTnigLVg==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.5.tgz", + "integrity": "sha512-T50SCNyqCZ/fDssaOD7meBKLZ87ebRLaJqZTJPvJKjlib1VYhMOCwXYsr7bjMPmuPgiQHOwvppz77xN/m6GM7A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "17.3.11", - "@angular-devkit/schematics": "17.3.11", + "@angular-devkit/core": "19.2.6", + "@angular-devkit/schematics": "19.2.6", "comment-json": "4.2.5", "jsonc-parser": "3.3.1", "pluralize": "8.0.0" @@ -7097,26 +7156,26 @@ } }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { - "version": "17.3.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.11.tgz", - "integrity": "sha512-vTNDYNsLIWpYk2I969LMQFH29GTsLzxNk/0cLw5q56ARF0v5sIWfHYwGTS88jdDqIpuuettcSczbxeA7EuAmqQ==", + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.6.tgz", + "integrity": "sha512-WFgiYhrDMq83UNaGRAneIM7CYYdBozD+yYA9BjoU8AgBLKtrvn6S8ZcjKAk5heoHtY/u8pEb0mwDTz9gxFmJZQ==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.1", - "picomatch": "4.0.1", + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", "rxjs": "7.8.1", "source-map": "0.7.4" }, "engines": { - "node": "^18.13.0 || >=20.9.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "chokidar": "^3.5.2" + "chokidar": "^4.0.0" }, "peerDependenciesMeta": { "chokidar": { @@ -7124,186 +7183,39 @@ } } }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core/node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true, - "license": "MIT" - }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { - "version": "17.3.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.11.tgz", - "integrity": "sha512-I5wviiIqiFwar9Pdk30Lujk8FczEEc18i22A5c6Z9lbmhPQdTroDnEQdsfXjy404wPe8H62s0I15o4pmMGfTYQ==", + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.6.tgz", + "integrity": "sha512-YTAxNnT++5eflx19OUHmOWu597/TbTel+QARiZCv1xQw99+X8DCKKOUXtqBRd53CAHlREDI33Rn/JLY3NYgMLQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "17.3.11", - "jsonc-parser": "3.2.1", - "magic-string": "0.30.8", + "@angular-devkit/core": "19.2.6", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, "engines": { - "node": "^18.13.0 || >=20.9.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics/node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nestjs/schematics/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@nestjs/schematics/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@nestjs/schematics/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@nestjs/schematics/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@nestjs/schematics/node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@nestjs/schematics/node_modules/picomatch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", - "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@nestjs/schematics/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@nestjs/schematics/node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@nestjs/serve-static": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-4.0.2.tgz", - "integrity": "sha512-cT0vdWN5ar7jDI2NKbhf4LcwJzU4vS5sVpMkVrHuyLcltbrz6JdGi1TfIMMatP2pNiq5Ie/uUdPSFDVaZX/URQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-5.0.3.tgz", + "integrity": "sha512-0jFjTlSVSLrI+mot8lfm+h2laXtKzCvgsVStv9T1ZBZTDwS26gM5czIhIESmWAod0PfrbCDFiu9C1MglObL8VA==", "license": "MIT", "dependencies": { - "path-to-regexp": "0.2.5" + "path-to-regexp": "8.2.0" }, "peerDependencies": { - "@fastify/static": "^6.5.0 || ^7.0.0", - "@nestjs/common": "^9.0.0 || ^10.0.0", - "@nestjs/core": "^9.0.0 || ^10.0.0", - "express": "^4.18.1", - "fastify": "^4.7.0" + "@fastify/static": "^8.0.4", + "@nestjs/common": "^11.0.2", + "@nestjs/core": "^11.0.2", + "express": "^5.0.1", + "fastify": "^5.2.1" }, "peerDependenciesMeta": { "@fastify/static": { @@ -7318,15 +7230,18 @@ } }, "node_modules/@nestjs/serve-static/node_modules/path-to-regexp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.2.5.tgz", - "integrity": "sha512-l6qtdDPIkmAmzEO6egquYDfqQGPMRNGjYtrU13HAXb3YSRrt7HSb1sJY0pKp6o2bAa86tSB6iwaW2JbthPKr7Q==", - "license": "MIT" + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } }, "node_modules/@nestjs/testing": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.4.15.tgz", - "integrity": "sha512-eGlWESkACMKti+iZk1hs6FUY/UqObmMaa8HAN9JLnaYkoLf1Jeh+EuHlGnfqo/Rq77oznNLIyaA3PFjrFDlNUg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.0.tgz", + "integrity": "sha512-gQ+NGshkHbNrDNXMVaPiwduqZ8YHpXrnsQqhSsnyNYOcDNPdBbB+0FDq7XiiklluXqjdLAN8i+bS7MbGlZIhKw==", "dev": true, "license": "MIT", "dependencies": { @@ -7337,10 +7252,10 @@ "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0", - "@nestjs/microservices": "^10.0.0", - "@nestjs/platform-express": "^10.0.0" + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0" }, "peerDependenciesMeta": { "@nestjs/microservices": { @@ -7639,9 +7554,9 @@ } }, "node_modules/@npmcli/redact": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz", - "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.0.tgz", + "integrity": "sha512-NyJXHoZwJE0iUsCDTclXf1bWHJTsshtnp5xUN6F2vY+OLJv6d2cNc4Do6fKNkmPToB0GzoffxRh405ibTwG+Og==", "dev": true, "license": "ISC", "engines": { @@ -7692,22 +7607,20 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@nuxtjs/opencollective": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "node_modules/@nuxt/opencollective": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", + "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" + "consola": "^3.2.3" }, "bin": { "opencollective": "bin/opencollective.js" }, "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" + "node": "^14.18.0 || >=16.10.0", + "npm": ">=5.10.0" } }, "node_modules/@nx/angular": { @@ -8151,6 +8064,187 @@ "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", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nx/module-federation/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/@nx/module-federation/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@nx/module-federation/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/@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", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/module-federation/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/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", @@ -8582,6 +8676,13 @@ "@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", @@ -8592,6 +8693,48 @@ "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", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nx/rspack/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/@nx/rspack/node_modules/css-loader": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", @@ -8628,6 +8771,82 @@ } } }, + "node_modules/@nx/rspack/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@nx/rspack/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/@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", @@ -8664,6 +8883,62 @@ "node": ">=8.9.0" } }, + "node_modules/@nx/rspack/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/@nx/rspack/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/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==", + "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", @@ -8755,6 +9030,13 @@ "@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", @@ -8765,6 +9047,31 @@ "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", @@ -8803,6 +9110,23 @@ "node": ">= 6" } }, + "node_modules/@nx/webpack/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/@nx/webpack/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/@nx/webpack/node_modules/copy-webpack-plugin": { "version": "10.2.4", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", @@ -8864,6 +9188,82 @@ } } }, + "node_modules/@nx/webpack/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@nx/webpack/node_modules/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/@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", @@ -9009,6 +9409,16 @@ "semver": "bin/semver" } }, + "node_modules/@nx/webpack/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/@nx/webpack/node_modules/mini-css-extract-plugin": { "version": "2.4.7", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.7.tgz", @@ -9029,6 +9439,13 @@ "webpack": "^5.0.0" } }, + "node_modules/@nx/webpack/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, "node_modules/@nx/webpack/node_modules/parse5": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", @@ -9036,6 +9453,13 @@ "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", @@ -9083,6 +9507,22 @@ "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", @@ -9096,6 +9536,22 @@ "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", @@ -9624,9 +10080,9 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "dev": true, "license": "MIT" }, @@ -9640,15 +10096,11 @@ "node": ">=18.18" }, "peerDependencies": { - "prisma": "*", - "typescript": ">=5.1.0" + "prisma": "*" }, "peerDependenciesMeta": { "prisma": { "optional": true - }, - "typescript": { - "optional": true } } }, @@ -9941,6 +10393,20 @@ "linux" ] }, + "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==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, "node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.34.8", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", @@ -10179,13 +10645,9 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@rspack/tracing": "^1.x", "@swc/helpers": ">=0.5.1" }, "peerDependenciesMeta": { - "@rspack/tracing": { - "optional": true - }, "@swc/helpers": { "optional": true } @@ -10264,6 +10726,38 @@ "@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", @@ -10289,6 +10783,99 @@ "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", @@ -10327,6 +10914,30 @@ } } }, + "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", @@ -10340,6 +10951,22 @@ "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", @@ -10353,6 +10980,22 @@ "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", @@ -10451,9 +11094,9 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz", - "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.1.tgz", + "integrity": "sha512-7MJXQhIm7dWF9zo7rRtMYh8d2gSnc3+JddeQOTIg6gUN7FjcuckZ9EwGq+ReeQtbbl3Tbf5YqRrWxA1DMfIn+w==", "dev": true, "license": "Apache-2.0", "engines": { @@ -10479,13 +11122,13 @@ } }, "node_modules/@sigstore/tuf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.0.tgz", - "integrity": "sha512-suVMQEA+sKdOz5hwP9qNcEjX6B45R+hFFr4LAWzbRc5O+U2IInwvay/bpG5a4s+qR35P/JK/PiKiRGjfuLy1IA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.1.tgz", + "integrity": "sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/protobuf-specs": "^0.4.1", "tuf-js": "^3.0.1" }, "engines": { @@ -10493,15 +11136,15 @@ } }, "node_modules/@sigstore/verify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.0.tgz", - "integrity": "sha512-kAAM06ca4CzhvjIZdONAL9+MLppW3K48wOFy1TbuaWFW/OMfl8JuTgW0Bm02JB1WJGT/ET2eqav0KTEKmxqkIA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz", + "integrity": "sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==", "dev": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0" + "@sigstore/protobuf-specs": "^0.4.1" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -11426,9 +12069,9 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" @@ -11520,6 +12163,30 @@ "@testing-library/dom": ">=7.21.4" } }, + "node_modules/@tokenizer/inflate": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz", + "integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "fflate": "^0.8.2", + "token-types": "^6.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "license": "MIT" + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -11737,13 +12404,6 @@ "@types/node": "*" } }, - "node_modules/@types/cache-manager": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/cache-manager/-/cache-manager-4.0.6.tgz", - "integrity": "sha512-8qL93MF05/xrzFm/LSPtzNEOE1eQF3VwGHAcQEylgp5hDSTe41jtFwbSYAPfyYcVa28y1vYSjIt0c1fLLUiC/Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -12254,9 +12914,9 @@ "license": "MIT" }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz", - "integrity": "sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==", + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", + "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -12270,9 +12930,9 @@ "license": "MIT" }, "node_modules/@types/luxon": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", - "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.6.2.tgz", + "integrity": "sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==", "license": "MIT" }, "node_modules/@types/mdx": { @@ -12569,6 +13229,68 @@ "typescript": ">=4.8.4 <5.9.0" } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.0.tgz", + "integrity": "sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.29.0", + "@typescript-eslint/utils": "8.29.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz", + "integrity": "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.0.tgz", + "integrity": "sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.29.0", + "@typescript-eslint/types": "8.29.0", + "@typescript-eslint/typescript-estree": "8.29.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, "node_modules/@typescript-eslint/parser": { "version": "8.29.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.0.tgz", @@ -12594,6 +13316,20 @@ "typescript": ">=4.8.4 <5.9.0" } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz", + "integrity": "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.29.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.0.tgz", @@ -12612,15 +13348,29 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils": { + "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.0.tgz", - "integrity": "sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz", + "integrity": "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.0.tgz", + "integrity": "sha512-DJ1N1GdjI7IS7uRlzJuEDCgDQix3ZVYVtgeWEyhyn4iaoitpMBX6Ndd488mXSx0xah/cONAkEaYyylDyAeHMHg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.29.0", - "@typescript-eslint/utils": "8.29.0", + "@typescript-eslint/typescript-estree": "8.31.0", + "@typescript-eslint/utils": "8.31.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -12636,10 +13386,94 @@ "typescript": ">=4.8.4 <5.9.0" } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.0.tgz", + "integrity": "sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.31.0", + "@typescript-eslint/visitor-keys": "8.31.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.0.tgz", + "integrity": "sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.31.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/types": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz", - "integrity": "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==", + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.0.tgz", + "integrity": "sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==", "dev": true, "license": "MIT", "engines": { @@ -12677,6 +13511,20 @@ "typescript": ">=4.8.4 <5.9.0" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz", + "integrity": "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -12704,16 +13552,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.0.tgz", - "integrity": "sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==", + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.0.tgz", + "integrity": "sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.29.0", - "@typescript-eslint/types": "8.29.0", - "@typescript-eslint/typescript-estree": "8.29.0" + "@typescript-eslint/scope-manager": "8.31.0", + "@typescript-eslint/types": "8.31.0", + "@typescript-eslint/typescript-estree": "8.31.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -12727,6 +13575,108 @@ "typescript": ">=4.8.4 <5.9.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.0.tgz", + "integrity": "sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.31.0", + "@typescript-eslint/visitor-keys": "8.31.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.0.tgz", + "integrity": "sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.31.0", + "@typescript-eslint/visitor-keys": "8.31.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.0.tgz", + "integrity": "sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.31.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "8.29.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.0.tgz", @@ -12745,6 +13695,20 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz", + "integrity": "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", @@ -13088,9 +14052,9 @@ "license": "BSD-3-Clause" }, "node_modules/abbrev": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", - "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", "dev": true, "license": "ISC", "engines": { @@ -13472,12 +14436,6 @@ "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", @@ -14266,45 +15224,6 @@ "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/bonjour-service": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", @@ -14742,46 +15661,15 @@ } }, "node_modules/cache-manager": { - "version": "5.7.6", - "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-5.7.6.tgz", - "integrity": "sha512-wBxnBHjDxF1RXpHCBD6HGvKER003Ts7IIm0CHpggliHzN1RZditb7rXoduE1rplc2DEFYKxhLKgFuchXMJje9w==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-6.4.0.tgz", + "integrity": "sha512-eUmPyVqQYzWCt7hx1QrYzQ7oC3MGKM1etxxe8zuq1o7IB4NzdBeWcUGDSWYahaI8fkd538SEZRGadyZWQfvOzQ==", "license": "MIT", + "peer": true, "dependencies": { - "eventemitter3": "^5.0.1", - "lodash.clonedeep": "^4.5.0", - "lru-cache": "^10.2.2", - "promise-coalesce": "^1.1.2" - }, - "engines": { - "node": ">= 18" + "keyv": "^5.2.3" } }, - "node_modules/cache-manager-redis-yet": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/cache-manager-redis-yet/-/cache-manager-redis-yet-5.1.4.tgz", - "integrity": "sha512-2mXZjo+txfH2m+mSTHTITNq8c5SssU2nP7NutzrocO3Mw/SbjHcDo+mriI3ZuR63ov/oUUIaF9iF+MzDqVzMoQ==", - "deprecated": "With cache-manager v6 we now are using Keyv", - "license": "MIT", - "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", - "cache-manager": "^5.7.6", - "redis": "^4.7.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/cache-manager/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, "node_modules/cachedir": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", @@ -15830,10 +16718,13 @@ } }, "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", - "license": "MIT" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", + "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } }, "node_modules/constants-browserify": { "version": "1.0.0", @@ -15870,19 +16761,22 @@ "license": "MIT" }, "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==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } }, "node_modules/cookies": { "version": "0.9.1", @@ -16064,13 +16958,16 @@ "license": "MIT" }, "node_modules/cron": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/cron/-/cron-3.2.1.tgz", - "integrity": "sha512-w2n5l49GMmmkBFEsH9FIDhjZ1n1QgTMOCMGuQtOXs5veNiosZmso6bQGuqOJSYAXXrG84WQFVneNk+Yt0Ua9iw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/cron/-/cron-4.3.0.tgz", + "integrity": "sha512-ciiYNLfSlF9MrDqnbMdRWFiA6oizSF7kA1osPP9lRzNu0Uu+AWog1UKy7SkckiDY2irrNjeO6qLyKnXC8oxmrw==", "license": "MIT", "dependencies": { - "@types/luxon": "~3.4.0", - "luxon": "~3.5.0" + "@types/luxon": "~3.6.0", + "luxon": "~3.6.0" + }, + "engines": { + "node": ">=18.x" } }, "node_modules/cron-parser": { @@ -17439,9 +18336,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "license": "Apache-2.0", "optional": true, "engines": { @@ -17647,9 +18544,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -17659,12 +18556,18 @@ } }, "node_modules/dotenv-expand": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", - "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.1.tgz", + "integrity": "sha512-LaKRbou8gt0RNID/9RoI+J2rvXsBRPMV7p+ElHlPhcSARbCPDYcYG2s1TIzAfWv4YSgyY5taidWzzs31lNV3yQ==", "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, "node_modules/dunder-proto": { @@ -18063,9 +18966,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "license": "MIT" }, "node_modules/es-object-atoms": { @@ -18836,76 +19739,241 @@ "license": "Apache-2.0" }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "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" + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 18" + } + }, + "node_modules/express/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "engines": { + "node": ">= 0.6" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/express/node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/express/node_modules/ms": { + "node_modules/express/node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/fresh": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "node_modules/express/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/express/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/express/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/express/node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/express/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/exsolve": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.4.tgz", - "integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz", + "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", "license": "MIT", "optional": true }, @@ -19120,10 +20188,9 @@ } }, "node_modules/fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", - "dev": true, + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" @@ -19134,6 +20201,12 @@ } } }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" + }, "node_modules/figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", @@ -19171,6 +20244,24 @@ "node": ">=16.0.0" } }, + "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==", + "license": "MIT", + "dependencies": { + "@tokenizer/inflate": "^0.2.6", + "strtok3": "^10.2.0", + "token-types": "^6.0.0", + "uint8array-extras": "^1.4.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -19216,39 +20307,6 @@ "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", @@ -19331,6 +20389,16 @@ "node": ">=16" } }, + "node_modules/flat-cache/node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/flatted": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", @@ -20128,9 +21196,9 @@ } }, "node_modules/globby/node_modules/ignore": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", - "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", "license": "MIT", "engines": { "node": ">= 4" @@ -20473,9 +21541,9 @@ } }, "node_modules/hosted-git-info": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", "dev": true, "license": "ISC", "dependencies": { @@ -20768,9 +21836,9 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", - "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "license": "MIT" }, "node_modules/http-proxy": { @@ -21273,9 +22341,9 @@ } }, "node_modules/ioredis": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.0.tgz", - "integrity": "sha512-tBZlIIWbndeWBWCXWZiqtOF/yxf6yZX3tAlTJ7nfo5jhd6dctNxF7QnYlZLZ1a0o0pDoen7CgZqO+zjNaFbJAg==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz", + "integrity": "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==", "license": "MIT", "dependencies": { "@ioredis/commands": "^1.1.1", @@ -23696,9 +24764,9 @@ } }, "node_modules/katex": { - "version": "0.16.21", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.21.tgz", - "integrity": "sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==", + "version": "0.16.22", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -23736,13 +24804,13 @@ } }, "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.3.tgz", + "integrity": "sha512-Rwu4+nXI9fqcxiEHtbkvoes2X+QfkTRo1TMkPfwzipGsJlJO/z69vqB4FNl9xJ3xCpAcbkvmEabZfPzrwN3+gQ==", "license": "MIT", + "peer": true, "dependencies": { - "json-buffer": "3.0.1" + "@keyv/serialize": "^1.0.3" } }, "node_modules/khroma": { @@ -24715,6 +25783,25 @@ "@lmdb/lmdb-win32-x64": "3.2.6" } }, + "node_modules/load-esm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.2.tgz", + "integrity": "sha512-nVAvWk/jeyrWyXEAs84mpQCYccxRqgKY4OznLuJhJCa0XsPSfdOIr2zvBZEj3IHEHbX97jjscKRRV539bW0Gpw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + }, + { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/borewit" + } + ], + "license": "MIT", + "engines": { + "node": ">=13.2.0" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -24780,12 +25867,6 @@ "license": "MIT", "optional": true }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, "node_modules/lodash.clonedeepwith": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", @@ -25103,9 +26184,9 @@ "license": "ISC" }, "node_modules/luxon": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", - "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz", + "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==", "license": "MIT", "engines": { "node": ">=12" @@ -25263,10 +26344,13 @@ } }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", + "engines": { + "node": ">=18" + }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -25725,9 +26809,9 @@ } }, "node_modules/multer": { - "version": "1.4.4-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", - "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", + "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==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", @@ -26817,7 +27901,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -27198,12 +28281,12 @@ } }, "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -27260,6 +28343,18 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -27432,12 +28527,6 @@ "devOptional": true, "license": "ISC" }, - "node_modules/path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", - "license": "MIT" - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -27470,6 +28559,19 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, + "node_modules/peek-readable": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-7.0.0.tgz", + "integrity": "sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -28521,15 +29623,6 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, - "node_modules/promise-coalesce": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/promise-coalesce/-/promise-coalesce-1.1.2.tgz", - "integrity": "sha512-zLaJ9b8hnC564fnJH6NFSOGZYYdzrAJn2JUUIwzoQb32fG2QAakpDNM+CZo1km6keXkRXRM+hml1BFAPVnPkxg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=16" - } - }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -28743,20 +29836,32 @@ } }, "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", - "iconv-lite": "0.4.24", + "iconv-lite": "0.6.3", "unpipe": "1.0.0" }, "engines": { "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -29614,6 +30719,37 @@ "points-on-path": "^0.2.1" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/rslog": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/rslog/-/rslog-1.2.3.tgz", @@ -30226,9 +31362,9 @@ } }, "node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -30467,21 +31603,6 @@ "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", @@ -31459,6 +32580,23 @@ "node": ">=12.*" } }, + "node_modules/strtok3": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.2.2.tgz", + "integrity": "sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/style-loader": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", @@ -31997,13 +33135,12 @@ "optional": true }, "node_modules/tinyglobby": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", - "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", - "dev": true, + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", "license": "MIT", "dependencies": { - "fdir": "^6.4.3", + "fdir": "^6.4.4", "picomatch": "^4.0.2" }, "engines": { @@ -32071,6 +33208,23 @@ "node": ">=0.6" } }, + "node_modules/token-types": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.0.0.tgz", + "integrity": "sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -32864,9 +34018,9 @@ } }, "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", "license": "MIT", "optional": true }, @@ -32888,6 +34042,18 @@ "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==", "license": "MIT" }, + "node_modules/uint8array-extras": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.0.tgz", + "integrity": "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -33302,8 +34468,11 @@ "peer": true, "dependencies": { "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", "postcss": "^8.5.3", - "rollup": "^4.30.1" + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" @@ -33366,6 +34535,279 @@ } } }, + "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==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "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==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "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==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "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==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "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==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "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==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "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==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "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==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "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==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "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==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "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==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "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==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "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==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "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==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "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==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "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==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "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==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "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==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "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==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/vite/node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "license": "MIT", + "peer": true + }, "node_modules/vite/node_modules/postcss": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", @@ -33395,6 +34837,46 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/vite/node_modules/rollup": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", + "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "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", + "fsevents": "~2.3.2" + } + }, "node_modules/vscode-jsonrpc": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", @@ -33761,6 +35243,36 @@ } } }, + "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", @@ -33785,6 +35297,94 @@ "fsevents": "~2.3.2" } }, + "node_modules/webpack-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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-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==", + "license": "MIT" + }, + "node_modules/webpack-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==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/webpack-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==", + "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/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", @@ -33798,9 +35398,9 @@ } }, "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", @@ -33830,6 +35430,27 @@ "node": ">= 10" } }, + "node_modules/webpack-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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/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/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", @@ -33842,6 +35463,21 @@ "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", @@ -33854,6 +35490,21 @@ "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", @@ -34182,7 +35833,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true, "license": "ISC" }, "node_modules/write-file-atomic": { diff --git a/package.json b/package.json index 35ac994e0..637c7ed86 100644 --- a/package.json +++ b/package.json @@ -76,17 +76,18 @@ "@dfinity/principal": "0.15.7", "@dinero.js/currencies": "2.0.0-alpha.8", "@internationalized/number": "3.6.0", - "@nestjs/bull": "10.2.3", - "@nestjs/cache-manager": "2.3.0", - "@nestjs/common": "10.4.15", - "@nestjs/config": "3.3.0", - "@nestjs/core": "10.4.15", - "@nestjs/event-emitter": "2.1.1", - "@nestjs/jwt": "10.2.0", - "@nestjs/passport": "10.0.3", - "@nestjs/platform-express": "10.4.15", - "@nestjs/schedule": "4.1.2", - "@nestjs/serve-static": "4.0.2", + "@keyv/redis": "4.3.4", + "@nestjs/bull": "11.0.2", + "@nestjs/cache-manager": "3.0.1", + "@nestjs/common": "11.1.0", + "@nestjs/config": "4.0.2", + "@nestjs/core": "11.1.0", + "@nestjs/event-emitter": "3.0.1", + "@nestjs/jwt": "11.0.0", + "@nestjs/passport": "11.0.5", + "@nestjs/platform-express": "11.1.0", + "@nestjs/schedule": "6.0.0", + "@nestjs/serve-static": "5.0.3", "@prisma/client": "6.7.0", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", @@ -95,8 +96,6 @@ "big.js": "6.2.2", "bootstrap": "4.6.2", "bull": "4.16.5", - "cache-manager": "5.7.6", - "cache-manager-redis-yet": "5.1.4", "chart.js": "4.4.9", "chartjs-adapter-date-fns": "3.0.0", "chartjs-chart-treemap": "3.1.0", @@ -153,8 +152,8 @@ "@angular/pwa": "19.2.1", "@eslint/eslintrc": "3.3.1", "@eslint/js": "9.24.0", - "@nestjs/schematics": "10.2.3", - "@nestjs/testing": "10.4.15", + "@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", @@ -173,7 +172,6 @@ "@storybook/core-server": "8.6.12", "@trivago/prettier-plugin-sort-imports": "5.2.2", "@types/big.js": "6.2.2", - "@types/cache-manager": "4.0.6", "@types/google-spreadsheet": "3.1.5", "@types/jest": "29.5.13", "@types/lodash": "4.17.16", From 8e76bd82ebf7f9584ce6d0b7dfdb3e24f9d93b03 Mon Sep 17 00:00:00 2001 From: Hash Palak Date: Thu, 8 May 2025 12:30:44 +0600 Subject: [PATCH 55/91] Feature/improve language localization for Catalan (#4675) * Improve language localization for Catalan * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.ca.xlf | 328 ++++++++++++------------ 2 files changed, 165 insertions(+), 164 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 374672e54..f46976a8c 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 Catalan (`ca`) - Upgraded `nestjs` from version `10.4.15` to `11.0.12` ## 2.161.0 - 2025-05-06 diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 2d267d24e..6d9e77f43 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -848,7 +848,7 @@ Grantee - Grantee + Beneficiari apps/client/src/app/components/access-table/access-table.component.html 11 @@ -1400,7 +1400,7 @@ View Stacktrace - View Stacktrace + Veure Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html 173 @@ -2716,15 +2716,15 @@ Get a comprehensive financial overview by adding your bank and brokerage accounts. - Get a comprehensive financial overview by adding your bank and brokerage accounts. - + Obtingueu una visió financera completa afegint els vostres comptes bancaris i de corredoria. + apps/client/src/app/components/home-overview/home-overview.html 17 Capture your activities - Capture your activities + Captura les teves activitats apps/client/src/app/components/home-overview/home-overview.html 24 @@ -2732,15 +2732,15 @@ Record your investment activities to keep your portfolio up to date. - Record your investment activities to keep your portfolio up to date. - + Registra les teves activitats d’inversió per mantenir la teva cartera actualitzada. + apps/client/src/app/components/home-overview/home-overview.html 26 Monitor and analyze your portfolio - Monitor and analyze your portfolio + Superviseu i analitzeu la vostra cartera apps/client/src/app/components/home-overview/home-overview.html 33 @@ -2748,7 +2748,7 @@ Track your progress in real-time with comprehensive analysis and insights. - Track your progress in real-time with comprehensive analysis and insights. + Segueix el teu progrés en temps real amb anàlisis i informació exhaustiva. apps/client/src/app/components/home-overview/home-overview.html 35 @@ -2756,7 +2756,7 @@ Setup accounts - Setup accounts + Configurar comptes apps/client/src/app/components/home-overview/home-overview.html 44 @@ -2764,7 +2764,7 @@ Add activity - Add activity + Afegeix activitat apps/client/src/app/components/home-overview/home-overview.html 52 @@ -2776,7 +2776,7 @@ Summary - Summary + Resum apps/client/src/app/components/home-summary/home-summary.html 2 @@ -2784,7 +2784,7 @@ Total Amount - Total Amount + Import total apps/client/src/app/components/investment-chart/investment-chart.component.ts 141 @@ -2792,7 +2792,7 @@ Savings Rate - Savings Rate + Taxa d’estalvi apps/client/src/app/components/investment-chart/investment-chart.component.ts 200 @@ -2800,7 +2800,7 @@ Security Token - Security Token + Fitxa de seguretat apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html 11 @@ -2820,7 +2820,7 @@ or - or + o apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html 32 @@ -2852,7 +2852,7 @@ Sign in with Internet Identity - Sign in with Internet Identity + Inicieu la sessió amb la identitat d’Internet apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html 42 @@ -2860,7 +2860,7 @@ Sign in with Google - Sign in with Google + Inicieu la sessió amb Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html 52 @@ -2868,7 +2868,7 @@ Stay signed in - Stay signed in + Manteniu la sessió iniciada apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html 61 @@ -2876,7 +2876,7 @@ Oops! A data provider is experiencing the hiccups. - Oops! A data provider is experiencing the hiccups. + Ups! Un proveïdor de dades està tenint problemes. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html 8 @@ -2884,7 +2884,7 @@ Market data is delayed for - Market data is delayed for + Les dades del mercat s’han retardat apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts 87 @@ -2892,7 +2892,7 @@ Time in Market - Time in Market + Temps al mercat apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 3 @@ -2908,7 +2908,7 @@ Buy - Buy + Compra apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 31 @@ -2916,7 +2916,7 @@ Sell - Sell + Vendre apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 43 @@ -2924,7 +2924,7 @@ Absolute Gross Performance - Absolute Gross Performance + Rendiment brut absolut apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 70 @@ -2932,7 +2932,7 @@ Absolute Net Performance - Absolute Net Performance + Rendiment net absolut apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 102 @@ -2940,7 +2940,7 @@ Net Performance - Net Performance + Rendiment net apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 117 @@ -2948,7 +2948,7 @@ Total Assets - Total Assets + Actius totals apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 143 @@ -2956,7 +2956,7 @@ Valuables - Valuables + Objectes de valor apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 156 @@ -2964,7 +2964,7 @@ Emergency Fund - Emergency Fund + Fons d’emergència apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 168 @@ -2980,7 +2980,7 @@ Cash - Cash + Efectiu apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 202 @@ -2988,7 +2988,7 @@ Assets - Assets + Actius apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 215 @@ -2996,7 +2996,7 @@ Buying Power - Buying Power + Poder adquisitiu apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 228 @@ -3004,7 +3004,7 @@ Excluded from Analysis - Excluded from Analysis + Exclòs de l'anàlisi apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 240 @@ -3012,7 +3012,7 @@ Liabilities - Liabilities + Passius apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 255 @@ -3024,7 +3024,7 @@ Net Worth - Net Worth + Valor net apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 273 @@ -3032,7 +3032,7 @@ Annualized Performance - Annualized Performance + Rendiment anualitzat apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 285 @@ -3040,7 +3040,7 @@ Interest - Interest + Interès apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 307 @@ -3048,7 +3048,7 @@ Please set the amount of your emergency fund. - Please set the amount of your emergency fund. + Definiu l’import del vostre fons d’emergència. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts 64 @@ -3056,7 +3056,7 @@ Are you an ambitious investor who needs the full picture? - Are you an ambitious investor who needs the full picture? + Ets un inversor ambiciós que necessita la imatge completa? apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 14 @@ -3064,7 +3064,7 @@ Upgrade to Ghostfolio Premium today and gain access to exclusive features to enhance your investment experience: - Upgrade to Ghostfolio Premium today and gain access to exclusive features to enhance your investment experience: + Actualitza a Ghostfolio Premium avui mateix i obtén accés a funcions exclusives per millorar la teva experiència d’inversió: apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 17 @@ -3072,7 +3072,7 @@ Portfolio Summary - Portfolio Summary + Resum de la cartera apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 24 @@ -3088,7 +3088,7 @@ Portfolio Allocations - Portfolio Allocations + Assignacions de cartera apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 28 @@ -3108,7 +3108,7 @@ Performance Benchmarks - Performance Benchmarks + Punts de referència de rendiment apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 32 @@ -3124,7 +3124,7 @@ FIRE Calculator - FIRE Calculator + Calculadora de FOC apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 36 @@ -3140,7 +3140,7 @@ Professional Data Provider - Professional Data Provider + Proveïdor de dades professional apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 40 @@ -3152,7 +3152,7 @@ and more Features... - and more Features... + i més característiques... apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 44 @@ -3168,7 +3168,7 @@ Get the tools to effectively manage your finances and refine your personal investment strategy. - Get the tools to effectively manage your finances and refine your personal investment strategy. + Aconsegueix les eines per gestionar eficaçment les teves finances i refinar la teva estratègia d’inversió personal. apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 47 @@ -3176,7 +3176,7 @@ Skip - Skip + Saltar apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 59 @@ -3188,7 +3188,7 @@ Today - Today + Avui apps/client/src/app/components/toggle/toggle.component.ts 22 @@ -3212,7 +3212,7 @@ 1Y - 1Y + 1 any apps/client/src/app/components/toggle/toggle.component.ts 24 @@ -3224,7 +3224,7 @@ 5Y - 5Y + 5 anys apps/client/src/app/components/toggle/toggle.component.ts 25 @@ -3236,7 +3236,7 @@ Max - Max + Màx apps/client/src/app/components/toggle/toggle.component.ts 26 @@ -3248,7 +3248,7 @@ Oops! Could not grant access. - Oops! Could not grant access. + Vaja! No s’ha pogut concedir l’accés. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts 91 @@ -3256,7 +3256,7 @@ Grant access - Grant access + Concedeix accés apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 7 @@ -3264,7 +3264,7 @@ Private - Private + Privat apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 24 @@ -3272,7 +3272,7 @@ Public - Public + Públic apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 25 @@ -3280,7 +3280,7 @@ User ID - User ID + ID d’usuari apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 45 @@ -3292,7 +3292,7 @@ Granted Access - Granted Access + Accés concedit apps/client/src/app/components/user-account-access/user-account-access.html 7 @@ -3300,7 +3300,7 @@ Please enter your coupon code. - Please enter your coupon code. + Introduïu el vostre codi de cupó. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 201 @@ -3308,7 +3308,7 @@ Could not redeem coupon code - Could not redeem coupon code + No s’ha pogut bescanviar el codi de cupó apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 165 @@ -3316,7 +3316,7 @@ Coupon code has been redeemed - Coupon code has been redeemed + El codi del cupó s’ha bescanviat apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 178 @@ -3324,7 +3324,7 @@ Reload - Reload + Torna a carregar apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 179 @@ -3332,7 +3332,7 @@ per year - per year + per any apps/client/src/app/components/user-account-membership/user-account-membership.html 32 @@ -3344,7 +3344,7 @@ Try Premium - Try Premium + Prova Premium apps/client/src/app/components/user-account-membership/user-account-membership.html 49 @@ -3352,7 +3352,7 @@ Redeem Coupon - Redeem Coupon + Bescanviar el cupó apps/client/src/app/components/user-account-membership/user-account-membership.html 63 @@ -3360,7 +3360,7 @@ Auto - Auto + Automàtic apps/client/src/app/components/user-account-settings/user-account-settings.component.ts 39 @@ -3368,7 +3368,7 @@ Do you really want to close your Ghostfolio account? - Do you really want to close your Ghostfolio account? + De debò vols tancar el teu compte de Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts 174 @@ -3376,7 +3376,7 @@ Do you really want to remove this sign in method? - Do you really want to remove this sign in method? + De debò vols eliminar aquest mètode d’inici de sessió? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts 248 @@ -3384,7 +3384,7 @@ Oops! There was an error setting up biometric authentication. - Oops! There was an error setting up biometric authentication. + Ups! Hi ha hagut un error en configurar l’autenticació biomètrica. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts 302 @@ -3392,7 +3392,7 @@ Settings - Settings + Configuració apps/client/src/app/components/user-account-settings/user-account-settings.html 2 @@ -3400,7 +3400,7 @@ Presenter View - Presenter View + Vista del presentador apps/client/src/app/components/user-account-settings/user-account-settings.html 185 @@ -3408,7 +3408,7 @@ Protection for sensitive information like absolute performances and quantity values - Protection for sensitive information like absolute performances and quantity values + Protecció per a informació sensible com ara rendiments absoluts i valors de quantitat apps/client/src/app/components/user-account-settings/user-account-settings.html 186 @@ -3416,7 +3416,7 @@ Base Currency - Base Currency + Moneda base apps/client/src/app/components/user-account-settings/user-account-settings.html 9 @@ -3424,7 +3424,7 @@ Language - Language + Llengua apps/client/src/app/components/user-account-settings/user-account-settings.html 56 @@ -3432,7 +3432,7 @@ If a translation is missing, kindly support us in extending it here. - If a translation is missing, kindly support us in extending it here. + Si falta alguna traducció, si us plau, ajudeu-nos a ampliar-la aquí. apps/client/src/app/components/user-account-settings/user-account-settings.html 58 @@ -3440,7 +3440,7 @@ Locale - Locale + Localització apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 414 @@ -3452,7 +3452,7 @@ Date and number format - Date and number format + Format de data i número apps/client/src/app/components/user-account-settings/user-account-settings.html 137 @@ -3460,7 +3460,7 @@ Appearance - Appearance + Aparença apps/client/src/app/components/user-account-settings/user-account-settings.html 160 @@ -3468,7 +3468,7 @@ Auto - Auto + Automàtic apps/client/src/app/components/user-account-settings/user-account-settings.html 174 @@ -3476,7 +3476,7 @@ Light - Light + Llum apps/client/src/app/components/user-account-settings/user-account-settings.html 175 @@ -3484,7 +3484,7 @@ Dark - Dark + Fosc apps/client/src/app/components/user-account-settings/user-account-settings.html 176 @@ -3492,7 +3492,7 @@ Zen Mode - Zen Mode + Mode Zen apps/client/src/app/components/user-account-settings/user-account-settings.html 203 @@ -3504,7 +3504,7 @@ Distraction-free experience for turbulent times - Distraction-free experience for turbulent times + Experiència sense distraccions per a temps turbulents apps/client/src/app/components/user-account-settings/user-account-settings.html 204 @@ -3512,7 +3512,7 @@ Biometric Authentication - Biometric Authentication + Autenticació biomètrica apps/client/src/app/components/user-account-settings/user-account-settings.html 220 @@ -3520,7 +3520,7 @@ Sign in with fingerprint - Sign in with fingerprint + Inicieu la sessió amb l’empremta digital apps/client/src/app/components/user-account-settings/user-account-settings.html 221 @@ -3528,7 +3528,7 @@ Experimental Features - Experimental Features + Característiques experimentals apps/client/src/app/components/user-account-settings/user-account-settings.html 237 @@ -3536,7 +3536,7 @@ Sneak peek at upcoming functionality - Sneak peek at upcoming functionality + Doneu un cop d’ull a les properes funcionalitats apps/client/src/app/components/user-account-settings/user-account-settings.html 238 @@ -3544,7 +3544,7 @@ Export Data - Export Data + Exporta dades apps/client/src/app/components/user-account-settings/user-account-settings.html 262 @@ -3552,7 +3552,7 @@ Danger Zone - Danger Zone + Zona de perill apps/client/src/app/components/user-account-settings/user-account-settings.html 274 @@ -3560,7 +3560,7 @@ Close Account - Close Account + Tanca el compte apps/client/src/app/components/user-account-settings/user-account-settings.html 309 @@ -3568,7 +3568,7 @@ This feature is currently unavailable. - This feature is currently unavailable. + Aquesta funció no està disponible actualment. apps/client/src/app/core/http-response.interceptor.ts 54 @@ -3576,7 +3576,7 @@ Please try again later. - Please try again later. + Si us plau, torna-ho a provar més tard. apps/client/src/app/core/http-response.interceptor.ts 56 @@ -3592,7 +3592,7 @@ This action is not allowed. - This action is not allowed. + Aquesta acció no està permesa. apps/client/src/app/core/http-response.interceptor.ts 64 @@ -3600,7 +3600,7 @@ Oops! Something went wrong. - Oops! Something went wrong. + Vaja! Alguna cosa va fallar. apps/client/src/app/core/http-response.interceptor.ts 83 @@ -3612,7 +3612,7 @@ Okay - Okay + D’acord apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 140 @@ -3628,7 +3628,7 @@ Oops! It looks like you’re making too many requests. Please slow down a bit. - Oops! It looks like you’re making too many requests. Please slow down a bit. + Ups! Sembla que esteu fent massa sol·licituds. Si us plau, aneu una mica més lent. apps/client/src/app/core/http-response.interceptor.ts 103 @@ -3636,7 +3636,7 @@ About - About + Sobre apps/client/src/app/pages/about/about-page-routing.module.ts 58 @@ -3652,7 +3652,7 @@ Changelog - Changelog + Registre de canvis apps/client/src/app/pages/about/about-page.component.ts 50 @@ -3664,7 +3664,7 @@ License - License + llicència apps/client/src/app/pages/about/about-page.component.ts 55 @@ -3676,7 +3676,7 @@ Privacy Policy - Privacy Policy + Política de privadesa apps/client/src/app/pages/about/about-page.component.ts 64 @@ -3688,7 +3688,7 @@ Our - Our + El nostre apps/client/src/app/pages/about/oss-friends/oss-friends-page.html 6 @@ -3696,7 +3696,7 @@ Discover other exciting Open Source Software projects - Discover other exciting Open Source Software projects + Descobriu altres projectes de programari de codi obert emocionants apps/client/src/app/pages/about/oss-friends/oss-friends-page.html 9 @@ -3704,7 +3704,7 @@ Visit - Visit + Visita apps/client/src/app/pages/about/oss-friends/oss-friends-page.html 28 @@ -3712,7 +3712,7 @@ Accounts - Accounts + Comptes apps/client/src/app/pages/accounts/accounts-page-routing.module.ts 13 @@ -3720,7 +3720,7 @@ Oops, cash balance transfer has failed. - Oops, cash balance transfer has failed. + Vaja, la transferència del saldo en efectiu ha fallat. apps/client/src/app/pages/accounts/accounts-page.component.ts 318 @@ -3728,7 +3728,7 @@ Update account - Update account + Actualitza el compte apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 8 @@ -3736,7 +3736,7 @@ Add account - Add account + Afegeix un compte apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 10 @@ -3744,7 +3744,7 @@ Account ID - Account ID + ID del compte apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 96 @@ -3752,7 +3752,7 @@ From - From + Des de apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 11 @@ -3760,7 +3760,7 @@ To - To + A apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 32 @@ -3768,7 +3768,7 @@ Transfer - Transfer + Transferència apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 72 @@ -3776,7 +3776,7 @@ Admin Control - Admin Control + Control d’administració apps/client/src/app/pages/admin/admin-page-routing.module.ts 20 @@ -3784,7 +3784,7 @@ Job Queue - Job Queue + Cua de treball apps/client/src/app/pages/admin/admin-page-routing.module.ts 25 @@ -3796,7 +3796,7 @@ Market Data - Market Data + Dades de mercat apps/client/src/app/pages/admin/admin-page-routing.module.ts 30 @@ -3808,7 +3808,7 @@ Settings - Settings + Configuració apps/client/src/app/pages/admin/admin-page-routing.module.ts 35 @@ -3828,7 +3828,7 @@ Users - Users + Usuaris apps/client/src/app/pages/admin/admin-page-routing.module.ts 40 @@ -3840,7 +3840,7 @@ Overview - Overview + Visió general apps/client/src/app/pages/admin/admin-page.component.ts 28 @@ -3864,7 +3864,7 @@ Blog - Blog + Bloc apps/client/src/app/pages/blog/blog-page-routing.module.ts 13 @@ -3872,7 +3872,7 @@ Discover the latest Ghostfolio updates and insights on personal finance - Discover the latest Ghostfolio updates and insights on personal finance + Descobriu les últimes actualitzacions i perspectives de Ghostfolio sobre finances personals apps/client/src/app/pages/blog/blog-page.html 7 @@ -3880,7 +3880,7 @@ As you are already logged in, you cannot access the demo account. - As you are already logged in, you cannot access the demo account. + Com que ja has iniciat sessió, no pots accedir al compte de demostració. apps/client/src/app/pages/demo/demo-page.component.ts 35 @@ -3888,7 +3888,7 @@ Frequently Asked Questions (FAQ) - Frequently Asked Questions (FAQ) + Preguntes freqüents (FAQ) apps/client/src/app/pages/faq/faq-page-routing.module.ts 34 @@ -3908,7 +3908,7 @@ Cloud - Cloud + Núvol apps/client/src/app/pages/faq/faq-page.component.ts 42 @@ -3920,7 +3920,7 @@ Self-Hosting - Self-Hosting + Autoallotjament apps/client/src/app/pages/faq/faq-page.component.ts 48 @@ -3932,7 +3932,7 @@ self-hosting - self-hosting + autoallotjament apps/client/src/app/pages/faq/faq-page.component.ts 49 @@ -3940,7 +3940,7 @@ Frequently Asked Questions (FAQ) - Frequently Asked Questions (FAQ) + Preguntes freqüents (FAQ) apps/client/src/app/pages/faq/overview/faq-overview-page.html 4 @@ -3956,7 +3956,7 @@ FAQ - FAQ + FAQ apps/client/src/app/pages/faq/saas/saas-page-routing.module.ts 13 @@ -3968,7 +3968,7 @@ Check out the numerous features of Ghostfolio to manage your wealth - Check out the numerous features of Ghostfolio to manage your wealth + Fes una ullada a les nombroses funcions de Ghostfolio per gestionar el teu patrimoni apps/client/src/app/pages/features/features-page.html 6 @@ -3976,7 +3976,7 @@ Stocks - Stocks + Stocks apps/client/src/app/pages/features/features-page.html 15 @@ -3992,7 +3992,7 @@ Bonds - Bonds + Bons apps/client/src/app/pages/features/features-page.html 38 @@ -4000,7 +4000,7 @@ Cryptocurrencies - Cryptocurrencies + Criptomonedes apps/client/src/app/pages/features/features-page.html 51 @@ -4008,7 +4008,7 @@ Wealth Items - Wealth Items + Articles de riquesa apps/client/src/app/pages/features/features-page.html 76 @@ -4016,7 +4016,7 @@ Import and Export - Import and Export + Importació i exportació apps/client/src/app/pages/features/features-page.html 115 @@ -4024,7 +4024,7 @@ Multi-Accounts - Multi-Accounts + Multicomptes apps/client/src/app/pages/features/features-page.html 127 @@ -4032,7 +4032,7 @@ Portfolio Calculations - Portfolio Calculations + Càlculs de cartera apps/client/src/app/pages/features/features-page.html 141 @@ -4040,7 +4040,7 @@ Dark Mode - Dark Mode + Mode fosc apps/client/src/app/pages/features/features-page.html 233 @@ -4048,7 +4048,7 @@ Market Mood - Market Mood + Estat d’ànim del mercat apps/client/src/app/pages/features/features-page.html 215 @@ -4056,7 +4056,7 @@ Static Analysis - Static Analysis + Anàlisi estàtica apps/client/src/app/pages/features/features-page.html 179 @@ -4064,7 +4064,7 @@ Multi-Language - Multi-Language + Multi-idioma apps/client/src/app/pages/features/features-page.html 259 @@ -4072,7 +4072,7 @@ Open Source Software - Open Source Software + Programari de codi obert apps/client/src/app/pages/features/features-page.html 296 @@ -4080,7 +4080,7 @@ Get Started - Get Started + Comença apps/client/src/app/pages/features/features-page.html 321 @@ -4092,7 +4092,7 @@ Holdings - Holdings + Explotacions apps/client/src/app/pages/home/home-page-routing.module.ts 24 @@ -4112,7 +4112,7 @@ Summary - Summary + Resum apps/client/src/app/pages/home/home-page-routing.module.ts 34 @@ -4124,7 +4124,7 @@ Markets - Markets + Mercats apps/client/src/app/pages/home/home-page-routing.module.ts 39 @@ -4148,7 +4148,7 @@ Ghostfolio is a personal finance dashboard to keep track of your net worth including cash, stocks, ETFs and cryptocurrencies across multiple platforms. - Ghostfolio is a personal finance dashboard to keep track of your net worth including cash, stocks, ETFs and cryptocurrencies across multiple platforms. + Ghostfolio és un tauler de control de finances personals per fer un seguiment del teu patrimoni net, incloent-hi efectiu, accions, ETF i criptomonedes en múltiples plataformes. apps/client/src/app/pages/i18n/i18n-page.html 4 @@ -4156,7 +4156,7 @@ app, asset, cryptocurrency, dashboard, etf, finance, management, performance, portfolio, software, stock, trading, wealth, web3 - app, asset, cryptocurrency, dashboard, etf, finance, management, performance, portfolio, software, stock, trading, wealth, web3 + aplicació, actiu, criptomoneda, tauler de control, ETF, finances, gestió, rendiment, cartera, programari, acció, negociació, riquesa, web3 apps/client/src/app/pages/i18n/i18n-page.html 9 @@ -4164,7 +4164,7 @@ My Account - My Account + El meu compte apps/client/src/app/pages/i18n/i18n-page.html 13 @@ -4172,7 +4172,7 @@ Open Source Wealth Management Software - Open Source Wealth Management Software + Programari de gestió patrimonial de codi obert apps/client/src/app/pages/i18n/i18n-page.html 14 @@ -4180,7 +4180,7 @@ Manage your wealth like a boss - Manage your wealth like a boss + Gestiona la teva riquesa com un cap apps/client/src/app/pages/landing/landing-page.html 5 @@ -4188,7 +4188,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 és un tauler de control de codi obert i amb privacitat per a les teves finances personals. Analitza la distribució dels teus actius, coneix el teu patrimoni net i pren decisions d’inversió sòlides i basades en dades. apps/client/src/app/pages/landing/landing-page.html 9 @@ -4196,7 +4196,7 @@ Get Started - Get Started + Comença apps/client/src/app/pages/landing/landing-page.html 41 @@ -4208,7 +4208,7 @@ Live Demo - Live Demo + Demostració en directe apps/client/src/app/pages/landing/landing-page.html 49 @@ -4220,7 +4220,7 @@ Monthly Active Users - Monthly Active Users + Usuaris actius mensuals apps/client/src/app/pages/landing/landing-page.html 70 @@ -4228,7 +4228,7 @@ Stars on GitHub - Stars on GitHub + Estrelles a GitHub apps/client/src/app/pages/landing/landing-page.html 88 @@ -4240,7 +4240,7 @@ Pulls on Docker Hub - Pulls on Docker Hub + Activa el Docker Hub apps/client/src/app/pages/landing/landing-page.html 106 @@ -4252,7 +4252,7 @@ As seen in - As seen in + Com es veu a apps/client/src/app/pages/landing/landing-page.html 115 @@ -4260,7 +4260,7 @@ Protect your assets. Refine your personal investment strategy. - Protect your assets. Refine your personal investment strategy. + Protegeix els teus actius. Refina la teva estratègia d’inversió personal. apps/client/src/app/pages/landing/landing-page.html 225 @@ -4268,7 +4268,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 permet a la gent ocupada fer un seguiment d’accions, ETF o criptomonedes sense ser rastrejada. apps/client/src/app/pages/landing/landing-page.html 229 @@ -4276,7 +4276,7 @@ 360° View - 360° View + Vista de 360° apps/client/src/app/pages/landing/landing-page.html 240 @@ -4284,7 +4284,7 @@ Get the full picture of your personal finances across multiple platforms. - Get the full picture of your personal finances across multiple platforms. + Obtingueu la imatge completa de les vostres finances personals en múltiples plataformes. apps/client/src/app/pages/landing/landing-page.html 242 @@ -4292,7 +4292,7 @@ Web3 Ready - Web3 Ready + Web3 llest apps/client/src/app/pages/landing/landing-page.html 251 @@ -4300,7 +4300,7 @@ Use Ghostfolio anonymously and own your financial data. - Use Ghostfolio anonymously and own your financial data. + Utilitza Ghostfolio de manera anònima i sigues propietari de les teves dades financeres. apps/client/src/app/pages/landing/landing-page.html 253 @@ -4308,7 +4308,7 @@ Open Source - Open Source + codi obert apps/client/src/app/pages/landing/landing-page.html 261 @@ -4316,7 +4316,7 @@ Benefit from continuous improvements through a strong community. - Benefit from continuous improvements through a strong community. + Beneficia’t de millores contínues gràcies a una comunitat forta. apps/client/src/app/pages/landing/landing-page.html 263 From aadd9f56a041fe6d9ebf851e400b22c2cac3d95a Mon Sep 17 00:00:00 2001 From: Felix Jordan Date: Thu, 8 May 2025 21:08:19 +0600 Subject: [PATCH 56/91] Feature/extend admin endpoint by asset profile count per data provider (#4676) * Extend admin endpoint by asset profile count per data provider * Update changelog --- CHANGELOG.md | 4 +++ apps/api/src/app/admin/admin.service.ts | 25 +++++++++++++++---- .../lib/interfaces/admin-data.interface.ts | 2 +- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f46976a8c..1fd31d817 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 the asset profile count per data provider to the endpoint `GET api/v1/admin` + ### Changed - Improved the language localization for Catalan (`ca`) diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 79beedea9..e4c50c1f2 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -143,15 +143,30 @@ export class AdminService { this.countUsersWithAnalytics() ]); + const dataProviders = await Promise.all( + dataSources.map(async (dataSource) => { + const dataProviderInfo = this.dataProviderService + .getDataProvider(dataSource) + .getDataProviderInfo(); + + const assetProfileCount = await this.prismaService.symbolProfile.count({ + where: { + dataSource + } + }); + + return { + ...dataProviderInfo, + assetProfileCount + }; + }) + ); + return { + dataProviders, settings, transactionCount, userCount, - dataProviders: dataSources.map((dataSource) => { - return this.dataProviderService - .getDataProvider(dataSource) - .getDataProviderInfo(); - }), version: environment.version }; } diff --git a/libs/common/src/lib/interfaces/admin-data.interface.ts b/libs/common/src/lib/interfaces/admin-data.interface.ts index dba85d3ef..cef983902 100644 --- a/libs/common/src/lib/interfaces/admin-data.interface.ts +++ b/libs/common/src/lib/interfaces/admin-data.interface.ts @@ -1,7 +1,7 @@ import { DataProviderInfo } from './data-provider-info.interface'; export interface AdminData { - dataProviders: DataProviderInfo[]; + dataProviders: (DataProviderInfo & { assetProfileCount: number })[]; settings: { [key: string]: boolean | object | string | string[] }; transactionCount: number; userCount: number; From 1215803a40400f54a908ee6c2747e244759197b2 Mon Sep 17 00:00:00 2001 From: andiz2 Date: Fri, 9 May 2025 11:48:43 +0300 Subject: [PATCH 57/91] Bugfix/fix ApiKeyStrategy error (#4682) * Fix ApiKeyStrategy error --- apps/api/src/app/auth/api-key.strategy.ts | 45 ++++++++++------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/apps/api/src/app/auth/api-key.strategy.ts b/apps/api/src/app/auth/api-key.strategy.ts index e1e067ab7..e99d6aed7 100644 --- a/apps/api/src/app/auth/api-key.strategy.ts +++ b/apps/api/src/app/auth/api-key.strategy.ts @@ -21,38 +21,31 @@ export class ApiKeyStrategy extends PassportStrategy( private readonly prismaService: PrismaService, private readonly userService: UserService ) { - super({ header: HEADER_KEY_TOKEN, prefix: 'Api-Key ' }, true); + super({ header: HEADER_KEY_TOKEN, prefix: 'Api-Key ' }, false); } - public async validate( - apiKey: string, - done: (error: any, user?: any) => void - ) { - try { - const user = await this.validateApiKey(apiKey); + public async validate(apiKey: string) { + const user = await this.validateApiKey(apiKey); - if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { - if (hasRole(user, 'INACTIVE')) { - throw new HttpException( - getReasonPhrase(StatusCodes.TOO_MANY_REQUESTS), - StatusCodes.TOO_MANY_REQUESTS - ); - } - - await this.prismaService.analytics.upsert({ - create: { User: { connect: { id: user.id } } }, - update: { - activityCount: { increment: 1 }, - lastRequestAt: new Date() - }, - where: { userId: user.id } - }); + if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { + if (hasRole(user, 'INACTIVE')) { + throw new HttpException( + getReasonPhrase(StatusCodes.TOO_MANY_REQUESTS), + StatusCodes.TOO_MANY_REQUESTS + ); } - done(null, user); - } catch (error) { - done(error, null); + await this.prismaService.analytics.upsert({ + create: { User: { connect: { id: user.id } } }, + update: { + activityCount: { increment: 1 }, + lastRequestAt: new Date() + }, + where: { userId: user.id } + }); } + + return user; } private async validateApiKey(apiKey: string) { From c81d3ced750db394d67f46eaab1efc0388292b7a Mon Sep 17 00:00:00 2001 From: Georgine Forner Date: Fri, 9 May 2025 16:03:47 +0600 Subject: [PATCH 58/91] Feature/improve language localization for IT 20250509 (#4681) * Improve language localization for IT 20250509 * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.it.xlf | 164 ++++++++++++------------ 2 files changed, 83 insertions(+), 82 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fd31d817..5a7e9eabe 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 Catalan (`ca`) +- Improved the language localization for Italian (`it`) - Upgraded `nestjs` from version `10.4.15` to `11.0.12` ## 2.161.0 - 2025-05-06 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index a942ebd70..3b6b222c6 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -1268,7 +1268,7 @@ Please set the amount of your emergency fund. - Inserisci l’importo del tuo fondo di emergenza: + Inserisci l’importo del tuo fondo di emergenza: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts 64 @@ -1616,7 +1616,7 @@ Please enter your coupon code. - Inserisci il tuo codice del buono: + Inserisci il tuo codice del buono: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 201 @@ -2824,7 +2824,7 @@ Hello, has shared a Portfolio with you! - Salve, ha condiviso un Portafoglio con te! + Salve, ha condiviso un Portafoglio con te! apps/client/src/app/pages/public/public-page.html 4 @@ -7037,7 +7037,7 @@ Change with currency effect Change - Cambio con effetto valuta Cambia + Cambio con effetto valuta Cambia apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 50 @@ -7045,7 +7045,7 @@ Performance with currency effect Performance - Prestazioni con effetto valuta Prestazioni + Prestazioni con effetto valuta Prestazioni apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 69 @@ -7277,7 +7277,7 @@ Set API key - Imposta API Key + Imposta API Key apps/client/src/app/components/admin-settings/admin-settings.component.html 83 @@ -7285,7 +7285,7 @@ Get access to 80’000+ tickers from over 50 exchanges - Ottieni accesso a oltre 100’000+ titoli da oltre 50 borse + Ottieni accesso a oltre 80’000+ titoli da oltre 50 borse libs/ui/src/lib/i18n.ts 24 @@ -7359,7 +7359,7 @@ Threshold range - Threshold range + Range soglia apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 9 @@ -7367,7 +7367,7 @@ Ghostfolio X-ray uses static analysis to uncover potential issues and risks in your portfolio. Adjust the rules below and set custom thresholds to align with your personal investment strategy. - Ghostfolio X-ray uses static analysis to uncover potential issues and risks in your portfolio. Adjust the rules below and set custom thresholds to align with your personal investment strategy. + Ghostfolio X-ray utilizza l’analisi statica per scoprire potenziali problemi e rischi nel tuo portafoglio. Modifica le regole qui sotto e imposta soglie personalizzate per allinearti alla tua strategia di investimento personale. apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 5 @@ -7375,7 +7375,7 @@ Economic Market Cluster Risks - Economic Market Cluster Risks + Rischi del cluster di mercato economico apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 165 @@ -7383,7 +7383,7 @@ of - of + di apps/client/src/app/components/admin-settings/admin-settings.component.html 52 @@ -7391,7 +7391,7 @@ daily requests - daily requests + richieste giornaliere apps/client/src/app/components/admin-settings/admin-settings.component.html 54 @@ -7399,7 +7399,7 @@ Remove API key - Remove API key + Rimuovi API key apps/client/src/app/components/admin-settings/admin-settings.component.html 71 @@ -7407,7 +7407,7 @@ Do you really want to delete the API key? - Do you really want to delete the API key? + Vuoi davvero eliminare l’API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts 96 @@ -7415,7 +7415,7 @@ Please enter your Ghostfolio API key: - Please enter your Ghostfolio API key: + Inserisci la tua API key di Ghostfolio: apps/client/src/app/pages/api/api-page.component.ts 41 @@ -7423,7 +7423,7 @@ I have an API key - I have an API key + Ho un API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html 39 @@ -7431,7 +7431,7 @@ API Requests Today - API Requests Today + Richieste API oggi apps/client/src/app/components/admin-users/admin-users.html 178 @@ -7439,7 +7439,7 @@ Could not generate an API key - Could not generate an API key + Non è stato possibile generare un API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 127 @@ -7447,7 +7447,7 @@ Set this API key in your self-hosted environment: - Set this API key in your self-hosted environment: + Imposta questa API key nel tuo ambiente self-hosted: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 142 @@ -7455,7 +7455,7 @@ Ghostfolio Premium Data Provider API Key - Ghostfolio Premium Data Provider API Key + API Key for Ghostfolio Premium Data Provider apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 145 @@ -7463,7 +7463,7 @@ Do you really want to generate a new API key? - Do you really want to generate a new API key? + Vuoi davvero generare una nuova API key? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 150 @@ -7471,7 +7471,7 @@ Tag - Tag + Tag libs/ui/src/lib/assistant/assistant.html 157 @@ -7479,7 +7479,7 @@ API Key - API Key + API Key libs/ui/src/lib/membership-card/membership-card.component.html 18 @@ -7487,7 +7487,7 @@ Generate Ghostfolio Premium Data Provider API key for self-hosted environments... - Generate Ghostfolio Premium Data Provider API key for self-hosted environments... + Genera API key per Ghostfolio Premium Data Provider per ambienti self-hosted... libs/ui/src/lib/membership-card/membership-card.component.html 26 @@ -7495,7 +7495,7 @@ out of - out of + fuori apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 56 @@ -7503,7 +7503,7 @@ rules align with your portfolio. - rules align with your portfolio. + le regole si allineano con il tuo portafoglio. apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 58 @@ -7511,7 +7511,7 @@ Save - Save + Salva apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts 62 @@ -7519,7 +7519,7 @@ Asset Class Cluster Risks - Asset Class Cluster Risks + Rischi del cluster di classi di asset apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 117 @@ -7527,7 +7527,7 @@ Me - Me + Me apps/client/src/app/components/user-account-access/user-account-access.component.ts 135 @@ -7535,7 +7535,7 @@ Received Access - Received Access + Accesso ricevuto apps/client/src/app/components/user-account-access/user-account-access.html 3 @@ -7543,7 +7543,7 @@ Please enter your Ghostfolio API key. - Please enter your Ghostfolio API key. + Inserisci la tua API key di Ghostfolio. apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.component.ts 57 @@ -7551,7 +7551,7 @@ AI prompt has been copied to the clipboard - AI prompt has been copied to the clipboard + L’AI prompt è stato copiato negli appunti apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 173 @@ -7559,7 +7559,7 @@ Link has been copied to the clipboard - Link has been copied to the clipboard + Il link è stato copiato negli appunti apps/client/src/app/components/access-table/access-table.component.ts 65 @@ -7567,7 +7567,7 @@ Early Access - Early Access + Accesso anticipato apps/client/src/app/components/admin-settings/admin-settings.component.html 29 @@ -7575,7 +7575,7 @@ Regional Market Cluster Risks - Regional Market Cluster Risks + Rischi del cluster di mercato regionale apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 189 @@ -7583,7 +7583,7 @@ Lazy - Lazy + Pigro apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 138 @@ -7591,7 +7591,7 @@ Instant - Instant + Istantaneo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 142 @@ -7599,7 +7599,7 @@ Default Market Price - Default Market Price + Prezzo di mercato predefinito apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 386 @@ -7607,7 +7607,7 @@ Mode - Mode + Modalità apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 423 @@ -7615,7 +7615,7 @@ Selector - Selector + Selettore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 439 @@ -7623,7 +7623,7 @@ HTTP Request Headers - HTTP Request Headers + Intestazioni della richiesta HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 399 @@ -7631,7 +7631,7 @@ end of day - end of day + fine giornata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 138 @@ -7639,7 +7639,7 @@ real-time - real-time + in tempo reale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 142 @@ -7647,7 +7647,7 @@ Open Duck.ai - Open Duck.ai + Apri Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 174 @@ -7655,7 +7655,7 @@ Create - Create + Creare libs/ui/src/lib/tags-selector/tags-selector.component.html 50 @@ -7663,7 +7663,7 @@ Market Data - Market Data + Dati di mercato apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 374 @@ -7671,7 +7671,7 @@ Change - Change + Cambia libs/ui/src/lib/treemap-chart/treemap-chart.component.ts 365 @@ -7679,7 +7679,7 @@ Performance - Performance + Prestazione libs/ui/src/lib/treemap-chart/treemap-chart.component.ts 365 @@ -7691,7 +7691,7 @@ Copy portfolio data to clipboard for AI prompt - Copy portfolio data to clipboard for AI prompt + Copia i dati del portafoglio negli appunti per l’AI prompt apps/client/src/app/pages/portfolio/analysis/analysis-page.html 42 @@ -7699,7 +7699,7 @@ Copy AI prompt to clipboard for analysis - Copy AI prompt to clipboard for analysis + Copia l’AI prompt negli appunti per l’analisi apps/client/src/app/pages/portfolio/analysis/analysis-page.html 67 @@ -7707,7 +7707,7 @@ Armenia - Armenia + Armenia libs/ui/src/lib/i18n.ts 73 @@ -7715,7 +7715,7 @@ British Virgin Islands - British Virgin Islands + Isole Vergini Britanniche libs/ui/src/lib/i18n.ts 77 @@ -7723,7 +7723,7 @@ Singapore - Singapore + Singapore libs/ui/src/lib/i18n.ts 91 @@ -7731,7 +7731,7 @@ Terms and Conditions - Terms and Conditions + Termini e condizioni apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 15 @@ -7739,7 +7739,7 @@ Please keep your security token safe. If you lose it, you will not be able to recover your account. - Please keep your security token safe. If you lose it, you will not be able to recover your account. + Ti preghiamo di conservare il tuo token di sicurezza in un luogo sicuro. Se lo perdi, non sarai in grado di recuperare il tuo account. apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 18 @@ -7747,7 +7747,7 @@ I understand that if I lose my security token, I cannot recover my account - I understand that if I lose my security token, I cannot recover my account + Capisco che se perdo il mio token di sicurezza, non posso recuperare il mio account apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 28 @@ -7755,7 +7755,7 @@ Continue - Continue + Continua apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 57 @@ -7763,7 +7763,7 @@ Here is your security token. It is only visible once, please store and keep it in a safe place. - Here is your security token. It is only visible once, please store and keep it in a safe place. + Ecco il tuo token di sicurezza. È visibile solo una volta, per favore memorizzalo e conserva in un luogo sicuro. apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 67 @@ -7771,7 +7771,7 @@ Security token - Security token + Token di sicurezza apps/client/src/app/components/admin-users/admin-users.component.ts 163 @@ -7779,7 +7779,7 @@ Do you really want to generate a new security token for this user? - Do you really want to generate a new security token for this user? + Vuoi davvero generare un nuovo token di sicurezza per questo utente? apps/client/src/app/components/admin-users/admin-users.component.ts 168 @@ -7787,7 +7787,7 @@ Generate Security Token - Generate Security Token + Genera Token di Sicurezza apps/client/src/app/components/admin-users/admin-users.html 249 @@ -7795,7 +7795,7 @@ United Kingdom - United Kingdom + United Kingdom libs/ui/src/lib/i18n.ts 96 @@ -7803,7 +7803,7 @@ Terms of Service - Terms of Service + Termini e condizioni apps/client/src/app/app.component.html 112 @@ -7811,7 +7811,7 @@ terms-of-service - terms-of-service + termini-e-condizioni snake-case apps/client/src/app/app.component.ts @@ -7832,7 +7832,7 @@ Terms of Service - Terms of Service + Termini e condizioni apps/client/src/app/pages/about/about-page.component.ts 71 @@ -7844,7 +7844,7 @@ Terms of Service - Terms of Service + Termini e condizioni apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.html 4 @@ -7852,7 +7852,7 @@ and I agree to the Terms of Service. - and I agree to the Terms of Service. + e io accetto i Termini e condizioni. apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 34 @@ -7860,7 +7860,7 @@ () is already in use. - () is already in use. + () e gia in uso. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 462 @@ -7868,7 +7868,7 @@ An error occurred while updating to (). - An error occurred while updating to (). + Si è verificato un errore durante l’aggiornamento di (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 470 @@ -7876,7 +7876,7 @@ Apply - Apply + Applica apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 138 @@ -7884,7 +7884,7 @@ with API access for - with API access for + con accesso API per apps/client/src/app/pages/pricing/pricing-page.html 266 @@ -7892,7 +7892,7 @@ Gather Recent Historical Market Data - Gather Recent Historical Market Data + Raccogli dati storici di mercato recenti apps/client/src/app/components/admin-market-data/admin-market-data.html 226 @@ -7900,7 +7900,7 @@ Gather All Historical Market Data - Gather All Historical Market Data + Raccogli tutti i dati storici di mercato apps/client/src/app/components/admin-market-data/admin-market-data.html 231 @@ -7908,7 +7908,7 @@ Gather Historical Market Data - Gather Historical Market Data + Raccogli dati storici di mercato apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 29 @@ -7916,7 +7916,7 @@ Data Gathering is off - Data Gathering is off + La raccolta dei dati è disattivata apps/client/src/app/components/admin-market-data/admin-market-data.html 38 @@ -7924,7 +7924,7 @@ Performance Calculation - Performance Calculation + Calcolo delle prestazioni apps/client/src/app/components/user-account-settings/user-account-settings.html 31 @@ -7932,7 +7932,7 @@ someone - someone + qualcuno apps/client/src/app/pages/public/public-page.component.ts 33 @@ -7940,7 +7940,7 @@ Add asset to watchlist - Add asset to watchlist + Aggiungi asset alla watchlist apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html 7 @@ -7948,7 +7948,7 @@ Watchlist - Watchlist + Watchlist apps/client/src/app/components/home-watchlist/home-watchlist.html 4 @@ -7960,7 +7960,7 @@ Watchlist - Watchlist + Watchlist apps/client/src/app/pages/home/home-page-routing.module.ts 44 @@ -7972,7 +7972,7 @@ Get Early Access - Get Early Access + Ottieni accesso anticipato apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html 29 @@ -7980,7 +7980,7 @@ Do you really want to delete this item? - Do you really want to delete this item? + Vuoi davvero eliminare questo elemento? libs/ui/src/lib/benchmark/benchmark.component.ts 122 From 72ccf475267a6be32d72a9441b00aa8929b19f16 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 9 May 2025 12:32:23 +0200 Subject: [PATCH 59/91] Feature/update locales (#4678) * Update locales * Clean up --------- Co-authored-by: github-actions[bot] Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- apps/client/src/locales/messages.ca.xlf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 6d9e77f43..fd7387a0a 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -2716,8 +2716,8 @@ Get a comprehensive financial overview by adding your bank and brokerage accounts. - Obtingueu una visió financera completa afegint els vostres comptes bancaris i de corredoria. - + Obtingueu una visió financera completa afegint els vostres comptes bancaris i de corredoria. + apps/client/src/app/components/home-overview/home-overview.html 17 @@ -2732,8 +2732,8 @@ Record your investment activities to keep your portfolio up to date. - Registra les teves activitats d’inversió per mantenir la teva cartera actualitzada. - + Registra les teves activitats d’inversió per mantenir la teva cartera actualitzada. + apps/client/src/app/components/home-overview/home-overview.html 26 @@ -3004,7 +3004,7 @@ Excluded from Analysis - Exclòs de l'anàlisi + Exclòs de l’anàlisi apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 240 From 037d3b1a60bcc1729a5b60e39fc24194229157d0 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 9 May 2025 16:19:14 +0200 Subject: [PATCH 60/91] Feature/rename Order to activities in User database schema (#4669) * Rename Order to activities in User database schema * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/admin/admin.service.ts | 6 +++--- apps/client/src/app/components/admin-users/admin-users.html | 2 +- libs/common/src/lib/interfaces/admin-users.interface.ts | 2 +- prisma/schema.prisma | 2 +- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a7e9eabe..4034fd9a2 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 +- Renamed `Order` to `activities` in the `User` database schema - Improved the language localization for Catalan (`ca`) - Improved the language localization for Italian (`it`) - Upgraded `nestjs` from version `10.4.15` to `11.0.12` diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index e4c50c1f2..35b4ea73d 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -821,7 +821,7 @@ export class AdminService { where, select: { _count: { - select: { Account: true, Order: true } + select: { Account: true, activities: true } }, Analytics: { select: { @@ -869,10 +869,10 @@ export class AdminService { role, subscription, accountCount: _count.Account || 0, + activityCount: _count.activities || 0, country: Analytics?.country, dailyApiRequests: Analytics?.dataProviderGhostfolioDailyRequests || 0, - lastActivity: Analytics?.updatedAt, - transactionCount: _count.Order || 0 + lastActivity: Analytics?.updatedAt }; } ); diff --git a/apps/client/src/app/components/admin-users/admin-users.html b/apps/client/src/app/components/admin-users/admin-users.html index 56b2e0eac..1a4125d84 100644 --- a/apps/client/src/app/components/admin-users/admin-users.html +++ b/apps/client/src/app/components/admin-users/admin-users.html @@ -142,7 +142,7 @@ diff --git a/libs/common/src/lib/interfaces/admin-users.interface.ts b/libs/common/src/lib/interfaces/admin-users.interface.ts index 89e165752..79031425a 100644 --- a/libs/common/src/lib/interfaces/admin-users.interface.ts +++ b/libs/common/src/lib/interfaces/admin-users.interface.ts @@ -4,6 +4,7 @@ export interface AdminUsers { count: number; users: { accountCount: number; + activityCount: number; country: string; createdAt: Date; dailyApiRequests: number; @@ -11,6 +12,5 @@ export interface AdminUsers { id: string; lastActivity: Date; role: Role; - transactionCount: number; }[]; } diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 7bf69c56a..6182ebfe4 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -245,6 +245,7 @@ model Tag { model User { accessToken String? + activities Order[] authChallenge String? createdAt DateTime @default(now()) id String @id @default(uuid()) @@ -260,7 +261,6 @@ model User { Analytics Analytics? ApiKey ApiKey[] AuthDevice AuthDevice[] - Order Order[] Settings Settings? SymbolProfile SymbolProfile[] Tag Tag[] From 11629ffd2664c04da9450668817a7ff195392248 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 9 May 2025 16:20:02 +0200 Subject: [PATCH 61/91] Feature/clean up unused interfaces (#4685) * Clean up unused interfaces --- .../models/interfaces/portfolio.interface.ts | 23 ------------------- libs/common/src/lib/interfaces/index.ts | 4 ---- .../interfaces/portfolio-item.interface.ts | 9 -------- .../portfolio-overview.interface.ts | 8 ------- 4 files changed, 44 deletions(-) delete mode 100644 apps/api/src/models/interfaces/portfolio.interface.ts delete mode 100644 libs/common/src/lib/interfaces/portfolio-item.interface.ts delete mode 100644 libs/common/src/lib/interfaces/portfolio-overview.interface.ts diff --git a/apps/api/src/models/interfaces/portfolio.interface.ts b/apps/api/src/models/interfaces/portfolio.interface.ts deleted file mode 100644 index b369202cd..000000000 --- a/apps/api/src/models/interfaces/portfolio.interface.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { PortfolioItem, Position } from '@ghostfolio/common/interfaces'; - -import { Order } from '../order'; - -export interface PortfolioInterface { - get(aDate?: Date): PortfolioItem[]; - - getFees(): number; - - getPositions(aDate: Date): { - [symbol: string]: Position; - }; - - getSymbols(aDate?: Date): string[]; - - getTotalBuy(): number; - - getTotalSell(): number; - - getOrders(): Order[]; - - getValue(aDate?: Date): number; -} diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index bdf982f55..e401705fb 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -29,8 +29,6 @@ import type { PortfolioChart } from './portfolio-chart.interface'; import type { PortfolioDetails } from './portfolio-details.interface'; import type { PortfolioDividends } from './portfolio-dividends.interface'; import type { PortfolioInvestments } from './portfolio-investments.interface'; -import type { PortfolioItem } from './portfolio-item.interface'; -import type { PortfolioOverview } from './portfolio-overview.interface'; import type { PortfolioPerformance } from './portfolio-performance.interface'; import type { PortfolioPosition } from './portfolio-position.interface'; import type { PortfolioReportRule } from './portfolio-report-rule.interface'; @@ -116,8 +114,6 @@ export { PortfolioHoldingResponse, PortfolioHoldingsResponse, PortfolioInvestments, - PortfolioItem, - PortfolioOverview, PortfolioPerformance, PortfolioPerformanceResponse, PortfolioPosition, diff --git a/libs/common/src/lib/interfaces/portfolio-item.interface.ts b/libs/common/src/lib/interfaces/portfolio-item.interface.ts deleted file mode 100644 index a3e42a05f..000000000 --- a/libs/common/src/lib/interfaces/portfolio-item.interface.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Position } from '@ghostfolio/common/interfaces'; - -export interface PortfolioItem { - date: string; - grossPerformancePercent: number; - investment: number; - positions: { [symbol: string]: Position }; - value: number; -} diff --git a/libs/common/src/lib/interfaces/portfolio-overview.interface.ts b/libs/common/src/lib/interfaces/portfolio-overview.interface.ts deleted file mode 100644 index c9c20c28c..000000000 --- a/libs/common/src/lib/interfaces/portfolio-overview.interface.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface PortfolioOverview { - cash: number; - committedFunds: number; - fees: number; - ordersCount: number; - totalBuy: number; - totalSell: number; -} From b6e8431c53260c8bb5a6f617414a02f18facf637 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 9 May 2025 16:24:03 +0200 Subject: [PATCH 62/91] Feature/clean up unused @Input in top holdings component (#4683) * Clean up unused input --- .../ui/src/lib/top-holdings/top-holdings.component.ts | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/libs/ui/src/lib/top-holdings/top-holdings.component.ts b/libs/ui/src/lib/top-holdings/top-holdings.component.ts index 13ceb239c..41d0f1192 100644 --- a/libs/ui/src/lib/top-holdings/top-holdings.component.ts +++ b/libs/ui/src/lib/top-holdings/top-holdings.component.ts @@ -2,8 +2,7 @@ import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; import { getLocale } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, - HoldingWithParents, - PortfolioPosition + HoldingWithParents } from '@ghostfolio/common/interfaces'; import { GfValueComponent } from '@ghostfolio/ui/value'; @@ -29,7 +28,6 @@ import { import { MatButtonModule } from '@angular/material/button'; import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator'; import { MatTableDataSource, MatTableModule } from '@angular/material/table'; -import { DataSource } from '@prisma/client'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject } from 'rxjs'; @@ -64,13 +62,6 @@ export class GfTopHoldingsComponent implements OnChanges, OnDestroy { @Input() locale = getLocale(); @Input() pageSize = Number.MAX_SAFE_INTEGER; @Input() topHoldings: HoldingWithParents[]; - @Input() positions: { - [symbol: string]: Pick & { - dataSource?: DataSource; - name: string; - value: number; - }; - } = {}; @Output() holdingClicked = new EventEmitter(); From 480709c32a15c0e1a905517d5b885b45410216be Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 9 May 2025 17:30:44 +0200 Subject: [PATCH 63/91] Bugfix/add missing permission guard in create watchlist item endpoint (#4686) * Add missing permission guard * Update changelog --- CHANGELOG.md | 4 ++++ apps/api/src/app/endpoints/watchlist/watchlist.controller.ts | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4034fd9a2..551a0d075 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the language localization for Italian (`it`) - Upgraded `nestjs` from version `10.4.15` to `11.0.12` +### Fixed + +- Fixed an issue in the watchlist endpoint (`POST`) related to the `HasPermissionGuard` + ## 2.161.0 - 2025-05-06 ### Added diff --git a/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts b/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts index 8d9d322a8..2a8ea9875 100644 --- a/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts +++ b/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts @@ -39,7 +39,7 @@ export class WatchlistController { @Post() @HasPermission(permissions.createWatchlistItem) - @UseGuards(AuthGuard('jwt')) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(TransformDataSourceInRequestInterceptor) public async createWatchlistItem(@Body() data: CreateWatchlistItemDto) { return this.watchlistService.createWatchlistItem({ From d99217a434c158899661d9a927e44ada16fa6fa2 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 9 May 2025 17:31:35 +0200 Subject: [PATCH 64/91] Feature/refactor @Input in portfolio proportion chart component (#4684) * Refactor @Input in GfPortfolioProportionChartComponent --- .../asset-profile-dialog.html | 4 +- .../holding-detail-dialog.html | 4 +- .../allocations/allocations-page.html | 20 ++--- .../src/app/pages/public/public-page.html | 10 +-- ...olio-proportion-chart.component.stories.ts | 8 +- .../portfolio-proportion-chart.component.ts | 86 +++++++++---------- 6 files changed, 65 insertions(+), 67 deletions(-) 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 ab3468dcd..f10b6dc02 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 @@ -257,20 +257,20 @@
Sectors
Countries
} 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 d18dc479b..11898c44e 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 @@ -259,11 +259,11 @@
@@ -271,11 +271,11 @@
} diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html index f2dff76f3..1436f6ab4 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html @@ -48,10 +48,10 @@ @@ -70,10 +70,10 @@ @@ -92,10 +92,10 @@ @@ -113,10 +113,10 @@ cursor="pointer" [baseCurrency]="user?.settings?.baseCurrency" [colorScheme]="user?.settings?.colorScheme" + [data]="symbols" [isInPercent]="hasImpersonationId || user.settings.isRestrictedView" [keys]="['symbol']" [locale]="user?.settings?.locale" - [positions]="symbols" [showLabels]="deviceType !== 'mobile'" (proportionChartClicked)="onSymbolChartClicked($event)" /> @@ -137,11 +137,11 @@ @@ -160,10 +160,10 @@ @@ -182,9 +182,9 @@ @@ -271,11 +271,11 @@ @@ -290,10 +290,10 @@ cursor="pointer" [baseCurrency]="user?.settings?.baseCurrency" [colorScheme]="user?.settings?.colorScheme" + [data]="accounts" [isInPercent]="hasImpersonationId || user.settings.isRestrictedView" [keys]="['id']" [locale]="user?.settings?.locale" - [positions]="accounts" (proportionChartClicked)="onAccountChartClicked($event)" /> @@ -313,10 +313,10 @@ diff --git a/apps/client/src/app/pages/public/public-page.html b/apps/client/src/app/pages/public/public-page.html index e51aee9a7..b5a225c73 100644 --- a/apps/client/src/app/pages/public/public-page.html +++ b/apps/client/src/app/pages/public/public-page.html @@ -72,9 +72,9 @@ @@ -90,10 +90,10 @@ @@ -107,10 +107,10 @@ @@ -126,9 +126,9 @@ @@ -198,10 +198,10 @@
diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.stories.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.stories.ts index 90aa0cee8..37010954a 100644 --- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.stories.ts +++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.stories.ts @@ -25,15 +25,15 @@ type Story = StoryObj; export const Simple: Story = { args: { baseCurrency: 'USD', - keys: ['name'], - locale: 'en-US', - positions: { + data: { Africa: { name: 'Africa', value: 983.22461479889288 }, Asia: { name: 'Asia', value: 12074.754633964973 }, Europe: { name: 'Europe', value: 34432.837085290535 }, 'North America': { name: 'North America', value: 26539.89987780503 }, Oceania: { name: 'Oceania', value: 1402.220605072031 }, 'South America': { name: 'South America', value: 4938.25202180719859 } - } + }, + keys: ['name'], + locale: 'en-US' } }; diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts index cc3c40d32..bc15ede04 100644 --- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts +++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -60,18 +60,18 @@ export class GfPortfolioProportionChartComponent @Input() baseCurrency: string; @Input() colorScheme: ColorScheme; @Input() cursor: string; - @Input() isInPercent = false; - @Input() keys: string[] = []; - @Input() locale = getLocale(); - @Input() maxItems?: number; - @Input() showLabels = false; - @Input() positions: { + @Input() data: { [symbol: string]: Pick & { dataSource?: DataSource; name: string; value: number; }; } = {}; + @Input() isInPercent = false; + @Input() keys: string[] = []; + @Input() locale = getLocale(); + @Input() maxItems?: number; + @Input() showLabels = false; @Output() proportionChartClicked = new EventEmitter(); @@ -91,13 +91,13 @@ export class GfPortfolioProportionChartComponent } public ngAfterViewInit() { - if (this.positions) { + if (this.data) { this.initialize(); } } public ngOnChanges() { - if (this.positions) { + if (this.data) { this.initialize(); } } @@ -122,47 +122,45 @@ export class GfPortfolioProportionChartComponent }; if (this.keys.length > 0) { - Object.keys(this.positions).forEach((symbol) => { - if (this.positions[symbol][this.keys[0]]?.toUpperCase()) { - if (chartData[this.positions[symbol][this.keys[0]].toUpperCase()]) { - chartData[ - this.positions[symbol][this.keys[0]].toUpperCase() - ].value = chartData[ - this.positions[symbol][this.keys[0]].toUpperCase() - ].value.plus(this.positions[symbol].value || 0); + Object.keys(this.data).forEach((symbol) => { + if (this.data[symbol][this.keys[0]]?.toUpperCase()) { + if (chartData[this.data[symbol][this.keys[0]].toUpperCase()]) { + chartData[this.data[symbol][this.keys[0]].toUpperCase()].value = + chartData[ + this.data[symbol][this.keys[0]].toUpperCase() + ].value.plus(this.data[symbol].value || 0); if ( - chartData[this.positions[symbol][this.keys[0]].toUpperCase()] - .subCategory[this.positions[symbol][this.keys[1]]] + chartData[this.data[symbol][this.keys[0]].toUpperCase()] + .subCategory[this.data[symbol][this.keys[1]]] ) { chartData[ - this.positions[symbol][this.keys[0]].toUpperCase() - ].subCategory[this.positions[symbol][this.keys[1]]].value = - chartData[ - this.positions[symbol][this.keys[0]].toUpperCase() - ].subCategory[this.positions[symbol][this.keys[1]]].value.plus( - this.positions[symbol].value || 0 - ); + this.data[symbol][this.keys[0]].toUpperCase() + ].subCategory[this.data[symbol][this.keys[1]]].value = chartData[ + this.data[symbol][this.keys[0]].toUpperCase() + ].subCategory[this.data[symbol][this.keys[1]]].value.plus( + this.data[symbol].value || 0 + ); } else { chartData[ - this.positions[symbol][this.keys[0]].toUpperCase() - ].subCategory[ - this.positions[symbol][this.keys[1]] ?? UNKNOWN_KEY - ] = { value: new Big(this.positions[symbol].value || 0) }; + this.data[symbol][this.keys[0]].toUpperCase() + ].subCategory[this.data[symbol][this.keys[1]] ?? UNKNOWN_KEY] = { + value: new Big(this.data[symbol].value || 0) + }; } } else { - chartData[this.positions[symbol][this.keys[0]].toUpperCase()] = { - name: this.positions[symbol][this.keys[0]], + chartData[this.data[symbol][this.keys[0]].toUpperCase()] = { + name: this.data[symbol][this.keys[0]], subCategory: {}, - value: new Big(this.positions[symbol].value || 0) + value: new Big(this.data[symbol].value || 0) }; - if (this.positions[symbol][this.keys[1]]) { + if (this.data[symbol][this.keys[1]]) { chartData[ - this.positions[symbol][this.keys[0]].toUpperCase() + this.data[symbol][this.keys[0]].toUpperCase() ].subCategory = { - [this.positions[symbol][this.keys[1]]]: { - value: new Big(this.positions[symbol].value || 0) + [this.data[symbol][this.keys[1]]]: { + value: new Big(this.data[symbol].value || 0) } }; } @@ -170,24 +168,24 @@ export class GfPortfolioProportionChartComponent } else { if (chartData[UNKNOWN_KEY]) { chartData[UNKNOWN_KEY].value = chartData[UNKNOWN_KEY].value.plus( - this.positions[symbol].value || 0 + this.data[symbol].value || 0 ); } else { chartData[UNKNOWN_KEY] = { - name: this.positions[symbol].name, + name: this.data[symbol].name, subCategory: this.keys[1] ? { [this.keys[1]]: { value: new Big(0) } } : undefined, - value: new Big(this.positions[symbol].value || 0) + value: new Big(this.data[symbol].value || 0) }; } } }); } else { - Object.keys(this.positions).forEach((symbol) => { + Object.keys(this.data).forEach((symbol) => { chartData[symbol] = { - name: this.positions[symbol].name, - value: new Big(this.positions[symbol].value || 0) + name: this.data[symbol].name, + value: new Big(this.data[symbol].value || 0) }; }); } @@ -321,7 +319,7 @@ export class GfPortfolioProportionChartComponent const dataIndex = activeElements[0].index; const symbol: string = event.chart.data.labels[dataIndex]; - const dataSource = this.positions[symbol]?.dataSource; + const dataSource = this.data[symbol]?.dataSource; this.proportionChartClicked.emit({ dataSource, symbol }); } catch {} @@ -404,7 +402,7 @@ export class GfPortfolioProportionChartComponent symbol = $localize`No data available`; } - const name = translate(this.positions[symbol as string]?.name); + const name = translate(this.data[symbol as string]?.name); let sum = 0; for (const item of context.dataset.data) { From 755d85a54b9e7851e4527bb0d49696bfc4e02c50 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 9 May 2025 17:43:33 +0200 Subject: [PATCH 65/91] Feature/update locales (#4689) 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 fd7387a0a..3f35305f8 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -6383,7 +6383,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 400 @@ -6691,11 +6691,11 @@ No data available libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 404 + 402 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 417 + 415 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 6f8323fe6..e45939fd2 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -3106,7 +3106,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 400 @@ -3114,11 +3114,11 @@ Keine Daten verfügbar libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 404 + 402 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 417 + 415 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 02ad6ce5a..b2847bd29 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -3091,7 +3091,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 400 @@ -3099,11 +3099,11 @@ Sin datos disponibles libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 404 + 402 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 417 + 415 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 2fbd53993..98f345db7 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -3162,7 +3162,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 400 @@ -3338,11 +3338,11 @@ Pas de données disponibles libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 404 + 402 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 417 + 415 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 3b6b222c6..b0cd54ea0 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -3091,7 +3091,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 400 @@ -3099,11 +3099,11 @@ Nessun dato disponibile libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 404 + 402 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 417 + 415 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index fc79a6da1..267add80e 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -3090,7 +3090,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 400 @@ -3098,11 +3098,11 @@ Geen gegevens beschikbaar libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 404 + 402 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 417 + 415 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 50dada8a9..57e678fef 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -5791,7 +5791,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 400 @@ -6091,11 +6091,11 @@ Brak danych libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 404 + 402 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 417 + 415 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index c327b1015..9f8b82e04 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -3002,7 +3002,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 400 @@ -3178,11 +3178,11 @@ Sem dados disponíveis libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 404 + 402 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 417 + 415 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index cf182ffc1..1b77f6748 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -5479,7 +5479,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 400 @@ -5727,11 +5727,11 @@ Veri mevcut değil libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 404 + 402 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 417 + 415 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index adba86b10..72ffe96fc 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -7045,7 +7045,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 400 @@ -7533,11 +7533,11 @@ Дані недоступні libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 404 + 402 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 417 + 415 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index c55d4dc94..4ea9995b2 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -5360,7 +5360,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 400 @@ -5623,11 +5623,11 @@ No data available libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 404 + 402 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 417 + 415 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 6b33fa12e..fbf873ce3 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -5848,7 +5848,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 400 @@ -6148,11 +6148,11 @@ 无可用数据 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 404 + 402 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 417 + 415 From 3fe5a762eba5d46a3bd9c5490a60aca74fc7b249 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 10 May 2025 14:48:33 +0200 Subject: [PATCH 66/91] Feature/extend personal finance tools 20250510 (#4698) * Extend personal finance tools * Add Balance Pro * Add PinkLion --- libs/common/src/lib/personal-finance-tools.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/libs/common/src/lib/personal-finance-tools.ts b/libs/common/src/lib/personal-finance-tools.ts index bcbfd09ec..dd9a821b6 100644 --- a/libs/common/src/lib/personal-finance-tools.ts +++ b/libs/common/src/lib/personal-finance-tools.ts @@ -53,6 +53,16 @@ export const personalFinanceTools: Product[] = [ origin: 'United States', slogan: 'The Intelligent Family Office Suite' }, + { + founded: 2020, + hasFreePlan: true, + hasSelfHostingAbility: false, + key: 'balance-pro', + name: 'Balance Pro', + origin: 'United States', + pricingPerYear: '$47.99', + slogan: 'The Smarter Way to Track Your Finances' + }, { hasFreePlan: false, hasSelfHostingAbility: true, @@ -571,6 +581,16 @@ export const personalFinanceTools: Product[] = [ origin: 'Singapore', slogan: 'Feel in control of your money without spreadsheets or shame' }, + { + founded: 2022, + hasFreePlan: true, + hasSelfHostingAbility: false, + key: 'pinklion', + name: 'PinkLion', + origin: 'Germany', + pricingPerYear: '€50', + slogan: 'Invest smarter, not harder' + }, { founded: 2023, hasFreePlan: true, From 2932d57c1e392b8e51e762b501172cb83d01a7bd Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Sat, 10 May 2025 19:50:04 +0700 Subject: [PATCH 67/91] Feature/improve language localization for ZH 20250510 (#4701) * Improve language localization for ZH 20250510 * Update changelog --- CHANGELOG.md | 1 + apps/api/src/assets/sitemap.xml | 2 - apps/client/src/app/app.component.html | 8 +- .../user-account-settings.html | 10 +- .../src/app/pages/features/features-page.html | 5 +- apps/client/src/locales/messages.zh.xlf | 406 +++++++++--------- 6 files changed, 213 insertions(+), 219 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 551a0d075..b11f41a7d 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 `Order` to `activities` in the `User` database schema - Improved the language localization for Catalan (`ca`) +- Improved the language localization for Chinese (`zh`) - Improved the language localization for Italian (`it`) - Upgraded `nestjs` from version `10.4.15` to `11.0.12` diff --git a/apps/api/src/assets/sitemap.xml b/apps/api/src/assets/sitemap.xml index fc1e89dba..2343f6c01 100644 --- a/apps/api/src/assets/sitemap.xml +++ b/apps/api/src/assets/sitemap.xml @@ -590,11 +590,9 @@ ${currentDate}T00:00:00+00:00 --> - ${personalFinanceTools} diff --git a/apps/client/src/app/app.component.html b/apps/client/src/app/app.component.html index 6f39c824d..d5e56b517 100644 --- a/apps/client/src/app/app.component.html +++ b/apps/client/src/app/app.component.html @@ -171,6 +171,9 @@ Català --> +
  • + Chinese +
  • Deutsch
  • @@ -203,11 +206,6 @@ Українська --> -
    diff --git a/apps/client/src/app/components/user-account-settings/user-account-settings.html b/apps/client/src/app/components/user-account-settings/user-account-settings.html index 72d5aa678..e6ab544c8 100644 --- a/apps/client/src/app/components/user-account-settings/user-account-settings.html +++ b/apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -86,12 +86,10 @@ >) } - @if (user?.settings?.isExperimentalFeatures) { - Chinese (Community) - } + Chinese (Community) Español (Community) Use Ghostfolio in multiple languages: English, - - Dutch, French, German, Italian, Polish, Portuguese, Spanish - and Turkish + Chinese, Dutch, French, German, Italian, Polish, Portuguese, + Spanish and Turkish are currently supported.

    diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index fbf873ce3..e98814915 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -889,7 +889,7 @@
    Equity - 公平 + 股权 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html 58 @@ -1189,7 +1189,7 @@ Do you really want to delete this account? - 您真的要删除该帐户吗? + 您确定要删除此账户吗? apps/client/src/app/components/accounts-table/accounts-table.component.ts 107 @@ -1197,7 +1197,7 @@ Asset Profile - 资产概况 + 资产概况 apps/client/src/app/components/admin-jobs/admin-jobs.html 35 @@ -1205,7 +1205,7 @@ Historical Market Data - 历史市场数据 + 历史市场数据 apps/client/src/app/components/admin-jobs/admin-jobs.html 37 @@ -1557,7 +1557,7 @@ First Activity - 第一个活动 + 首笔交易 apps/client/src/app/components/admin-market-data/admin-market-data.html 148 @@ -2165,7 +2165,7 @@ Portfolio - 文件夹 + 投资组合 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 117 @@ -2209,7 +2209,7 @@ Portfolio - 文件夹 + 投资组合 apps/client/src/app/components/header/header.component.html 41 @@ -2737,7 +2737,7 @@ Please set the amount of your emergency fund. - 请输入您的应急基金金额: + 请输入您的应急基金金额。 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts 64 @@ -2745,7 +2745,7 @@ Change - 修改 + 涨跌 libs/ui/src/lib/holdings-table/holdings-table.component.html 119 @@ -3037,7 +3037,7 @@ Please enter your coupon code. - 请输入您的优惠券代码: + 请输入您的优惠券代码。 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 201 @@ -3869,7 +3869,7 @@ Pulls on Docker Hub - 拉动 Docker Hub + Docker Hub 拉取次数 apps/client/src/app/pages/landing/landing-page.html 106 @@ -4025,7 +4025,7 @@ saying no to spreadsheets in - 对电子表格说不 + 年对电子表格说不 apps/client/src/app/pages/landing/landing-page.html 311 @@ -4049,7 +4049,7 @@ What our users are saying - 我们的什么用户正在说 + 听听我们的用户怎么说 apps/client/src/app/pages/landing/landing-page.html 327 @@ -4065,7 +4065,7 @@ How does Ghostfolio work? - 如何幽灵作品集工作? + Ghostfolio 如何工作? apps/client/src/app/pages/landing/landing-page.html 383 @@ -4113,7 +4113,7 @@ Are you ready? - 准备好? + 准备好了吗? apps/client/src/app/pages/landing/landing-page.html 431 @@ -4213,7 +4213,7 @@ Do you really want to delete these activities? - 您真的要删除所有活动吗? + 您确定要删除这些活动吗? libs/ui/src/lib/activities-table/activities-table.component.ts 219 @@ -5005,7 +5005,7 @@ Hello, has shared a Portfolio with you! - 你好,分享了一个文件夹与你! + 你好,分享了一个投资组合给你! apps/client/src/app/pages/public/public-page.html 4 @@ -5121,7 +5121,7 @@ Open Source Alternative to - 开源替代方案 + 开源替代品 apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html 42 @@ -5329,7 +5329,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. - 请注意,Ghostfolio 与 Ghostfolio 中提供的信息比较表基于我们的独立研究和分析。该网站不隶属于或比较中提到的任何其他产品。随着个人理财工具格局的不断发展,直接从相应的产品页面验证任何具体的细节或变化至关重要。数据需要刷新吗?帮助我们维护准确的数据GitHub + 请注意,在 Ghostfolio 与的比较表中提供的信息基于我们的独立研究和分析。该网站不隶属于或比较中提到的任何其他产品。随着个人理财工具格局的不断发展,直接从相应的产品页面验证任何具体的细节或变化至关重要。数据需要刷新吗?帮助我们在GitHub 上维护准确的数据。 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 311 @@ -5337,7 +5337,7 @@ Ready to take your investments to the next level? - 准备好带走你的投资下一级 + 准备好将您的投资提升到新的高度了吗? apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 324 @@ -5613,7 +5613,7 @@ Change from All Time High - 从历史最高点开始变化 + 较历史最高纪录涨跌 libs/ui/src/lib/benchmark/benchmark.component.html 96 @@ -6029,7 +6029,7 @@ Private Equity - 私人产权 + 私募股权 libs/ui/src/lib/i18n.ts 57 @@ -6037,7 +6037,7 @@ Stock - 库存 + 股票 libs/ui/src/lib/i18n.ts 58 @@ -6493,7 +6493,7 @@ Closed - 关闭 + 已关闭 apps/client/src/app/components/home-holdings/home-holdings.component.ts 37 @@ -6501,7 +6501,7 @@ Active - 积极的 + 活跃 apps/client/src/app/components/home-holdings/home-holdings.component.ts 36 @@ -6517,7 +6517,7 @@ Dividend Yield - Dividend Yield + 股息收益率 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 175 @@ -6525,7 +6525,7 @@ Execute Job - Execute Job + 执行任务 apps/client/src/app/components/admin-jobs/admin-jobs.html 176 @@ -6533,7 +6533,7 @@ Priority - Priority + 优先级 apps/client/src/app/components/admin-jobs/admin-jobs.html 64 @@ -6541,7 +6541,7 @@ This action is not allowed. - This action is not allowed. + 不允许执行此操作。 apps/client/src/app/core/http-response.interceptor.ts 64 @@ -6549,7 +6549,7 @@ Liquidity - Liquidity + 流动性 libs/ui/src/lib/i18n.ts 48 @@ -6557,7 +6557,7 @@ {VAR_PLURAL, plural, =1 {activity} other {activities}} - {VAR_PLURAL, plural, =1 {activity} other {activities}} + {VAR_PLURAL, plural, =1 {活动} other {活动}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 14 @@ -6565,7 +6565,7 @@ Buy and sell - Buy and sell + 买入和卖出 libs/ui/src/lib/i18n.ts 8 @@ -6573,7 +6573,7 @@ Delete Activities - Delete Activities + 删除活动 libs/ui/src/lib/activities-table/activities-table.component.html 67 @@ -6581,7 +6581,7 @@ Internationalization - Internationalization + 国际化 apps/client/src/app/app-routing.module.ts 88 @@ -6589,7 +6589,7 @@ Do you really want to close your Ghostfolio account? - Do you really want to close your Ghostfolio account? + 您确定要关闭您的 Ghostfolio 账户吗? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts 174 @@ -6597,7 +6597,7 @@ Danger Zone - Danger Zone + 危险区域 apps/client/src/app/components/user-account-settings/user-account-settings.html 274 @@ -6605,7 +6605,7 @@ Close Account - Close Account + 关闭账户 apps/client/src/app/components/user-account-settings/user-account-settings.html 309 @@ -6613,7 +6613,7 @@ By ETF Holding - By ETF Holding + 按 ETF 持仓 apps/client/src/app/pages/portfolio/allocations/allocations-page.html 333 @@ -6621,7 +6621,7 @@ Approximation based on the top holdings of each ETF - Approximation based on the top holdings of each ETF + 基于每个 ETF 的主要持仓的近似值 apps/client/src/app/pages/portfolio/allocations/allocations-page.html 340 @@ -6629,7 +6629,7 @@ Join now or check out the example account - Join now or check out the example account + 立即加入 或查看示例账户 apps/client/src/app/pages/landing/landing-page.html 434 @@ -6637,7 +6637,7 @@ Oops! There was an error setting up biometric authentication. - Oops! There was an error setting up biometric authentication. + 哎呀!设置生物识别认证时发生错误。 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts 302 @@ -6645,7 +6645,7 @@ Show more - Show more + 显示更多 libs/ui/src/lib/top-holdings/top-holdings.component.html 174 @@ -6653,7 +6653,7 @@ Benchmarks - Benchmarks + 基准 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 81 @@ -6661,7 +6661,7 @@ Delete Profiles - Delete Profiles + 删除配置文件 apps/client/src/app/components/admin-market-data/admin-market-data.html 243 @@ -6669,7 +6669,7 @@ Do you really want to delete these profiles? - Do you really want to delete these profiles? + 您确定要删除这些配置文件吗? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 68 @@ -6677,7 +6677,7 @@ Oops! Could not delete profiles. - Oops! Could not delete profiles. + 哎呀!无法删除配置文件。 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 56 @@ -6685,7 +6685,7 @@ Table - Table + 表格 apps/client/src/app/components/home-holdings/home-holdings.html 16 @@ -6693,7 +6693,7 @@ Chart - Chart + 图表 apps/client/src/app/components/home-holdings/home-holdings.html 19 @@ -6701,7 +6701,7 @@ Would you like to refine your personal investment strategy? - Would you like to refine your personal investment strategy? + 您想 优化 您的 个人投资策略吗? apps/client/src/app/pages/public/public-page.html 211 @@ -6709,7 +6709,7 @@ Alternative - Alternative + 另类 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 81 @@ -6717,7 +6717,7 @@ App - App + 应用 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 82 @@ -6725,7 +6725,7 @@ Budgeting - Budgeting + 预算管理 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 83 @@ -6733,7 +6733,7 @@ Community - Community + 社区 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 84 @@ -6741,7 +6741,7 @@ Family Office - Family Office + 家族办公室 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 85 @@ -6749,7 +6749,7 @@ Investor - Investor + 投资者 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 88 @@ -6757,7 +6757,7 @@ Open Source - Open Source + 开源 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 89 @@ -6765,7 +6765,7 @@ Personal Finance - Personal Finance + 个人理财 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 91 @@ -6773,7 +6773,7 @@ Privacy - Privacy + 隐私 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 92 @@ -6781,7 +6781,7 @@ Software - Software + 软件 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 @@ -6789,7 +6789,7 @@ Tool - Tool + 工具 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 95 @@ -6797,7 +6797,7 @@ User Experience - User Experience + 用户体验 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 96 @@ -6805,7 +6805,7 @@ Wealth - Wealth + 财富 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 97 @@ -6813,7 +6813,7 @@ Wealth Management - Wealth Management + 财富管理 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 98 @@ -6821,7 +6821,7 @@ Australia - Australia + 澳大利亚 libs/ui/src/lib/i18n.ts 74 @@ -6829,7 +6829,7 @@ Austria - Austria + 奥地利 libs/ui/src/lib/i18n.ts 75 @@ -6837,7 +6837,7 @@ Belgium - Belgium + 比利时 libs/ui/src/lib/i18n.ts 76 @@ -6845,7 +6845,7 @@ Bulgaria - Bulgaria + 保加利亚 libs/ui/src/lib/i18n.ts 78 @@ -6853,7 +6853,7 @@ Canada - Canada + 加拿大 libs/ui/src/lib/i18n.ts 79 @@ -6861,7 +6861,7 @@ Czech Republic - Czech Republic + 捷克共和国 libs/ui/src/lib/i18n.ts 80 @@ -6869,7 +6869,7 @@ Finland - Finland + 芬兰 libs/ui/src/lib/i18n.ts 81 @@ -6877,7 +6877,7 @@ France - France + 法国 libs/ui/src/lib/i18n.ts 82 @@ -6885,7 +6885,7 @@ Germany - Germany + 德国 libs/ui/src/lib/i18n.ts 83 @@ -6893,7 +6893,7 @@ India - India + 印度 libs/ui/src/lib/i18n.ts 84 @@ -6901,7 +6901,7 @@ Italy - Italy + 意大利 libs/ui/src/lib/i18n.ts 85 @@ -6909,7 +6909,7 @@ Netherlands - Netherlands + 荷兰 libs/ui/src/lib/i18n.ts 87 @@ -6917,7 +6917,7 @@ New Zealand - New Zealand + 新西兰 libs/ui/src/lib/i18n.ts 88 @@ -6925,7 +6925,7 @@ Poland - Poland + 波兰 libs/ui/src/lib/i18n.ts 89 @@ -6933,7 +6933,7 @@ Romania - Romania + 罗马尼亚 libs/ui/src/lib/i18n.ts 90 @@ -6941,7 +6941,7 @@ South Africa - South Africa + 南非 libs/ui/src/lib/i18n.ts 92 @@ -6949,7 +6949,7 @@ Thailand - Thailand + 泰国 libs/ui/src/lib/i18n.ts 94 @@ -6957,7 +6957,7 @@ United States - United States + 美国 libs/ui/src/lib/i18n.ts 97 @@ -6965,7 +6965,7 @@ Error - Error + 错误 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 527 @@ -6973,7 +6973,7 @@ Deactivate - Deactivate + 停用 apps/client/src/app/components/rule/rule.component.html 72 @@ -6981,7 +6981,7 @@ Activate - Activate + 激活 apps/client/src/app/components/rule/rule.component.html 74 @@ -6989,7 +6989,7 @@ Inactive - Inactive + 非活跃 apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 232 @@ -6997,7 +6997,7 @@ Cancel - Cancel + 取消 libs/ui/src/lib/i18n.ts 9 @@ -7005,7 +7005,7 @@ Close - Close + 关闭 libs/ui/src/lib/i18n.ts 11 @@ -7013,7 +7013,7 @@ Yes - Yes + libs/ui/src/lib/i18n.ts 32 @@ -7021,7 +7021,7 @@ Copy link to clipboard - Copy link to clipboard + 复制链接到剪贴板 apps/client/src/app/components/access-table/access-table.component.html 70 @@ -7029,7 +7029,7 @@ Portfolio Snapshot - Portfolio Snapshot + 投资组合快照 apps/client/src/app/components/admin-jobs/admin-jobs.html 39 @@ -7037,7 +7037,7 @@ Change with currency effect Change - Change with currency effect Change + 含货币影响的涨跌 涨跌 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 50 @@ -7045,7 +7045,7 @@ Performance with currency effect Performance - Performance with currency effect Performance + 含货币影响的表现 表现 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 69 @@ -7053,7 +7053,7 @@ Threshold Min - Threshold Min + 最小阈值 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 54 @@ -7061,7 +7061,7 @@ Threshold Max - Threshold Max + 最大阈值 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 92 @@ -7069,7 +7069,7 @@ Close - Close + 自定义 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 129 @@ -7077,7 +7077,7 @@ Customize - Customize + 自定义 apps/client/src/app/components/rule/rule.component.html 67 @@ -7085,7 +7085,7 @@ No auto-renewal. - No auto-renewal. + 不自动续订。 apps/client/src/app/components/user-account-membership/user-account-membership.html 70 @@ -7093,7 +7093,7 @@ Today - Today + 今天 apps/client/src/app/pages/public/public-page.html 24 @@ -7101,7 +7101,7 @@ This year - This year + 今年 apps/client/src/app/pages/public/public-page.html 42 @@ -7109,7 +7109,7 @@ From the beginning - From the beginning + 从头开始 apps/client/src/app/pages/public/public-page.html 60 @@ -7117,7 +7117,7 @@ Oops! Invalid currency. - Oops! Invalid currency. + 哎呀!无效的货币。 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 49 @@ -7125,7 +7125,7 @@ This page has been archived. - This page has been archived. + 此页面已存档。 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 14 @@ -7133,7 +7133,7 @@ is Open Source Software - is Open Source Software + 是开源软件 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 139 @@ -7141,7 +7141,7 @@ is not Open Source Software - is not Open Source Software + 不是开源软件 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 146 @@ -7149,7 +7149,7 @@ is Open Source Software - is Open Source Software + 是开源软件 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 156 @@ -7157,7 +7157,7 @@ is not Open Source Software - is not Open Source Software + 不是开源软件 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 163 @@ -7165,7 +7165,7 @@ can be self-hosted - can be self-hosted + 可以自托管 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 178 @@ -7173,7 +7173,7 @@ cannot be self-hosted - cannot be self-hosted + 无法自托管 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 185 @@ -7181,7 +7181,7 @@ can be self-hosted - can be self-hosted + 可以自托管 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 195 @@ -7189,7 +7189,7 @@ cannot be self-hosted - cannot be self-hosted + 无法自托管 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 202 @@ -7197,7 +7197,7 @@ can be used anonymously - can be used anonymously + 可以匿名使用 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 217 @@ -7205,7 +7205,7 @@ cannot be used anonymously - cannot be used anonymously + 无法匿名使用 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 224 @@ -7213,7 +7213,7 @@ can be used anonymously - can be used anonymously + 可以匿名使用 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 234 @@ -7221,7 +7221,7 @@ cannot be used anonymously - cannot be used anonymously + 无法匿名使用 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 241 @@ -7229,7 +7229,7 @@ offers a free plan - offers a free plan + 提供免费计划 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 256 @@ -7237,7 +7237,7 @@ does not offer a free plan - does not offer a free plan + 不提供免费计划 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 263 @@ -7245,7 +7245,7 @@ offers a free plan - offers a free plan + 提供免费计划 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 273 @@ -7253,7 +7253,7 @@ does not offer a free plan - does not offer a free plan + 不提供免费计划 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 280 @@ -7261,7 +7261,7 @@ Oops! Could not find any assets. - Oops! Could not find any assets. + 哎呀!找不到任何资产。 libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html 40 @@ -7269,7 +7269,7 @@ Data Providers - Data Providers + 数据提供者 apps/client/src/app/components/admin-settings/admin-settings.component.html 4 @@ -7277,7 +7277,7 @@ Set API key - Set API key + 设置 API 密钥 apps/client/src/app/components/admin-settings/admin-settings.component.html 83 @@ -7285,7 +7285,7 @@ Get access to 80’000+ tickers from over 50 exchanges - Get access to 80’000+ tickers from over 50 exchanges + 获取来自 50 多个交易所的 80,000+ 股票代码访问权限 libs/ui/src/lib/i18n.ts 24 @@ -7293,7 +7293,7 @@ Ukraine - Ukraine + 乌克兰 libs/ui/src/lib/i18n.ts 95 @@ -7301,7 +7301,7 @@ Join now - Join now + 立即加入 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 110 @@ -7309,7 +7309,7 @@ Glossary - Glossary + 词汇表 apps/client/src/app/pages/resources/glossary/resources-glossary-routing.module.ts 10 @@ -7321,7 +7321,7 @@ Guides - Guides + 指南 apps/client/src/app/pages/resources/guides/resources-guides-routing.module.ts 10 @@ -7333,7 +7333,7 @@ guides - guides + 指南 snake-case apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -7346,7 +7346,7 @@ glossary - glossary + 词汇表 snake-case apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -7359,7 +7359,7 @@ Threshold range - Threshold range + 阈值范围 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 9 @@ -7367,7 +7367,7 @@ Ghostfolio X-ray uses static analysis to uncover potential issues and risks in your portfolio. Adjust the rules below and set custom thresholds to align with your personal investment strategy. - Ghostfolio X-ray uses static analysis to uncover potential issues and risks in your portfolio. Adjust the rules below and set custom thresholds to align with your personal investment strategy. + Ghostfolio X-ray 使用静态分析来发现您投资组合中的潜在问题和风险。调整以下规则并设置自定义阈值,使其与您的个人投资策略保持一致。 apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 5 @@ -7375,7 +7375,7 @@ Economic Market Cluster Risks - Economic Market Cluster Risks + 经济市场集群风险 apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 165 @@ -7383,7 +7383,7 @@ of - of + apps/client/src/app/components/admin-settings/admin-settings.component.html 52 @@ -7391,7 +7391,7 @@ daily requests - daily requests + 每日请求 apps/client/src/app/components/admin-settings/admin-settings.component.html 54 @@ -7399,7 +7399,7 @@ Remove API key - Remove API key + 移除 API 密钥 apps/client/src/app/components/admin-settings/admin-settings.component.html 71 @@ -7407,7 +7407,7 @@ Do you really want to delete the API key? - Do you really want to delete the API key? + 您确定要删除此 API 密钥吗? apps/client/src/app/components/admin-settings/admin-settings.component.ts 96 @@ -7415,7 +7415,7 @@ Please enter your Ghostfolio API key: - Please enter your Ghostfolio API key: + 请输入您的 Ghostfolio API 密钥: apps/client/src/app/pages/api/api-page.component.ts 41 @@ -7423,7 +7423,7 @@ I have an API key - I have an API key + 我有一个 API 密钥 apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html 39 @@ -7431,7 +7431,7 @@ API Requests Today - API Requests Today + 今日 API 请求数 apps/client/src/app/components/admin-users/admin-users.html 178 @@ -7439,7 +7439,7 @@ Could not generate an API key - Could not generate an API key + 无法生成 API 密钥 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 127 @@ -7447,7 +7447,7 @@ Set this API key in your self-hosted environment: - Set this API key in your self-hosted environment: + 在您的自托管环境中设置此 API 密钥: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 142 @@ -7455,7 +7455,7 @@ Ghostfolio Premium Data Provider API Key - Ghostfolio Premium Data Provider API Key + Ghostfolio Premium 数据提供者 API 密钥 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 145 @@ -7463,7 +7463,7 @@ Do you really want to generate a new API key? - Do you really want to generate a new API key? + 您确定要生成新的 API 密钥吗? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 150 @@ -7471,7 +7471,7 @@ Tag - Tag + 标签 libs/ui/src/lib/assistant/assistant.html 157 @@ -7479,7 +7479,7 @@ API Key - API Key + API 密钥 libs/ui/src/lib/membership-card/membership-card.component.html 18 @@ -7487,7 +7487,7 @@ Generate Ghostfolio Premium Data Provider API key for self-hosted environments... - Generate Ghostfolio Premium Data Provider API key for self-hosted environments... + 为自托管环境生成 Ghostfolio Premium 数据提供者 API 密钥... libs/ui/src/lib/membership-card/membership-card.component.html 26 @@ -7495,7 +7495,7 @@ out of - out of + / apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 56 @@ -7503,7 +7503,7 @@ rules align with your portfolio. - rules align with your portfolio. + 条规则与您的投资组合一致。 apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 58 @@ -7511,7 +7511,7 @@ Save - Save + 保存 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts 62 @@ -7519,7 +7519,7 @@ Asset Class Cluster Risks - Asset Class Cluster Risks + 资产类别集群风险 apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 117 @@ -7527,7 +7527,7 @@ Me - Me + apps/client/src/app/components/user-account-access/user-account-access.component.ts 135 @@ -7535,7 +7535,7 @@ Received Access - Received Access + 已获得访问权限 apps/client/src/app/components/user-account-access/user-account-access.html 3 @@ -7543,7 +7543,7 @@ Please enter your Ghostfolio API key. - Please enter your Ghostfolio API key. + 请输入您的 Ghostfolio API 密钥。 apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.component.ts 57 @@ -7551,7 +7551,7 @@ AI prompt has been copied to the clipboard - AI prompt has been copied to the clipboard + AI 提示已复制到剪贴板 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 173 @@ -7559,7 +7559,7 @@ Link has been copied to the clipboard - Link has been copied to the clipboard + 链接已复制到剪贴板 apps/client/src/app/components/access-table/access-table.component.ts 65 @@ -7567,7 +7567,7 @@ Early Access - Early Access + 抢先体验 apps/client/src/app/components/admin-settings/admin-settings.component.html 29 @@ -7575,7 +7575,7 @@ Regional Market Cluster Risks - Regional Market Cluster Risks + 区域市场集群风险 apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 189 @@ -7583,7 +7583,7 @@ Lazy - Lazy + 延迟 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 138 @@ -7591,7 +7591,7 @@ Instant - Instant + 即时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 142 @@ -7599,7 +7599,7 @@ Default Market Price - Default Market Price + 默认市场价格 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 386 @@ -7607,7 +7607,7 @@ Mode - Mode + 模式 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 423 @@ -7615,7 +7615,7 @@ Selector - Selector + 选择器 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 439 @@ -7623,7 +7623,7 @@ HTTP Request Headers - HTTP Request Headers + HTTP 请求标头 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 399 @@ -7631,7 +7631,7 @@ end of day - end of day + 收盘 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 138 @@ -7639,7 +7639,7 @@ real-time - real-time + 实时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 142 @@ -7647,7 +7647,7 @@ Open Duck.ai - Open Duck.ai + 打开 Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 174 @@ -7655,7 +7655,7 @@ Create - Create + 创建 libs/ui/src/lib/tags-selector/tags-selector.component.html 50 @@ -7663,7 +7663,7 @@ Market Data - Market Data + 市场数据 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 374 @@ -7671,7 +7671,7 @@ Change - Change + 涨跌 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts 365 @@ -7679,7 +7679,7 @@ Performance - Performance + 表现 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts 365 @@ -7691,7 +7691,7 @@ Copy portfolio data to clipboard for AI prompt - Copy portfolio data to clipboard for AI prompt + 复制投资组合数据到剪贴板以供 AI 提示使用 apps/client/src/app/pages/portfolio/analysis/analysis-page.html 42 @@ -7699,7 +7699,7 @@ Copy AI prompt to clipboard for analysis - Copy AI prompt to clipboard for analysis + 复制 AI 提示到剪贴板进行分析 apps/client/src/app/pages/portfolio/analysis/analysis-page.html 67 @@ -7707,7 +7707,7 @@ Armenia - Armenia + 亚美尼亚 libs/ui/src/lib/i18n.ts 73 @@ -7715,7 +7715,7 @@ British Virgin Islands - British Virgin Islands + 英属维尔京群岛 libs/ui/src/lib/i18n.ts 77 @@ -7723,7 +7723,7 @@ Singapore - Singapore + 新加坡 libs/ui/src/lib/i18n.ts 91 @@ -7731,7 +7731,7 @@ Terms and Conditions - Terms and Conditions + 条款和条件 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 15 @@ -7739,7 +7739,7 @@ Please keep your security token safe. If you lose it, you will not be able to recover your account. - Please keep your security token safe. If you lose it, you will not be able to recover your account. + 请妥善保管您的安全令牌。如果您丢失它,将无法恢复您的账户。 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 18 @@ -7747,7 +7747,7 @@ I understand that if I lose my security token, I cannot recover my account - I understand that if I lose my security token, I cannot recover my account + 我理解如果我丢失了安全令牌,将无法恢复我的账户 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 28 @@ -7755,7 +7755,7 @@ Continue - Continue + 继续 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 57 @@ -7763,7 +7763,7 @@ Here is your security token. It is only visible once, please store and keep it in a safe place. - Here is your security token. It is only visible once, please store and keep it in a safe place. + 这是您的安全令牌。它仅显示一次,请妥善保管。 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 67 @@ -7771,7 +7771,7 @@ Security token - Security token + 安全令牌 apps/client/src/app/components/admin-users/admin-users.component.ts 163 @@ -7779,7 +7779,7 @@ Do you really want to generate a new security token for this user? - Do you really want to generate a new security token for this user? + 您确定要为此用户生成新的安全令牌吗? apps/client/src/app/components/admin-users/admin-users.component.ts 168 @@ -7787,7 +7787,7 @@ Generate Security Token - Generate Security Token + 生成安全令牌 apps/client/src/app/components/admin-users/admin-users.html 249 @@ -7795,7 +7795,7 @@ United Kingdom - United Kingdom + 英国 libs/ui/src/lib/i18n.ts 96 @@ -7803,7 +7803,7 @@ Terms of Service - Terms of Service + 服务条款 apps/client/src/app/app.component.html 112 @@ -7811,7 +7811,7 @@ terms-of-service - terms-of-service + 服务条款 snake-case apps/client/src/app/app.component.ts @@ -7832,7 +7832,7 @@ Terms of Service - Terms of Service + 服务条款 apps/client/src/app/pages/about/about-page.component.ts 71 @@ -7844,7 +7844,7 @@ Terms of Service - Terms of Service + 服务条款 apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.html 4 @@ -7852,7 +7852,7 @@ and I agree to the Terms of Service. - and I agree to the Terms of Service. + 我同意 服务条款 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 34 @@ -7860,7 +7860,7 @@ () is already in use. - () is already in use. + () 已在使用中。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 462 @@ -7868,7 +7868,7 @@ An error occurred while updating to (). - An error occurred while updating to (). + 在更新到 () 时发生错误。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 470 @@ -7876,7 +7876,7 @@ Apply - Apply + 应用 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 138 @@ -7884,7 +7884,7 @@ with API access for - with API access for + 包含 API 访问权限,适用于 apps/client/src/app/pages/pricing/pricing-page.html 266 @@ -7892,7 +7892,7 @@ Gather Recent Historical Market Data - Gather Recent Historical Market Data + 收集近期历史市场数据 apps/client/src/app/components/admin-market-data/admin-market-data.html 226 @@ -7900,7 +7900,7 @@ Gather All Historical Market Data - Gather All Historical Market Data + 收集所有历史市场数据 apps/client/src/app/components/admin-market-data/admin-market-data.html 231 @@ -7908,7 +7908,7 @@ Gather Historical Market Data - Gather Historical Market Data + 收集历史市场数据 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 29 @@ -7916,7 +7916,7 @@ Data Gathering is off - Data Gathering is off + 数据收集已关闭 apps/client/src/app/components/admin-market-data/admin-market-data.html 38 @@ -7924,7 +7924,7 @@ Performance Calculation - Performance Calculation + 绩效计算 apps/client/src/app/components/user-account-settings/user-account-settings.html 31 @@ -7932,7 +7932,7 @@ someone - someone + 某人 apps/client/src/app/pages/public/public-page.component.ts 33 @@ -7940,7 +7940,7 @@ Add asset to watchlist - Add asset to watchlist + 添加资产到关注列表 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html 7 @@ -7948,7 +7948,7 @@ Watchlist - Watchlist + 关注列表 apps/client/src/app/components/home-watchlist/home-watchlist.html 4 @@ -7960,7 +7960,7 @@ Watchlist - Watchlist + 关注列表 apps/client/src/app/pages/home/home-page-routing.module.ts 44 @@ -7972,7 +7972,7 @@ Get Early Access - Get Early Access + 获取抢先体验 apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html 29 @@ -7980,7 +7980,7 @@ Do you really want to delete this item? - Do you really want to delete this item? + 您确定要删除此项目吗? libs/ui/src/lib/benchmark/benchmark.component.ts 122 From 7bf87352c9eacd6228818f14d67969fd66b12167 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 10 May 2025 14:53:46 +0200 Subject: [PATCH 68/91] Feature/update locales (#4703) 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, 384 insertions(+), 384 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 3f35305f8..8fac18b44 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -318,43 +318,43 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 91 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 112 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 116 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 120 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 125 + 123 apps/client/src/app/pages/features/features-page.html - 277 + 276 @@ -362,7 +362,7 @@ El risc d’assumir pèrdues en les inversions és substancial. No és recomanable invertir diners que pugui necessitar a curt termini. apps/client/src/app/app.component.html - 223 + 221 @@ -2807,7 +2807,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 281 + 279 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -3287,7 +3287,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 254 + 252 @@ -3403,7 +3403,7 @@ Vista del presentador apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 183 @@ -3411,7 +3411,7 @@ Protecció per a informació sensible com ara rendiments absoluts i valors de quantitat apps/client/src/app/components/user-account-settings/user-account-settings.html - 186 + 184 @@ -3447,7 +3447,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 133 @@ -3455,7 +3455,7 @@ Format de data i número apps/client/src/app/components/user-account-settings/user-account-settings.html - 137 + 135 @@ -3463,7 +3463,7 @@ Aparença apps/client/src/app/components/user-account-settings/user-account-settings.html - 160 + 158 @@ -3471,7 +3471,7 @@ Automàtic apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 172 @@ -3479,7 +3479,7 @@ Llum apps/client/src/app/components/user-account-settings/user-account-settings.html - 175 + 173 @@ -3487,7 +3487,7 @@ Fosc apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 174 @@ -3495,7 +3495,7 @@ Mode Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 201 apps/client/src/app/pages/features/features-page.html @@ -3507,7 +3507,7 @@ Experiència sense distraccions per a temps turbulents apps/client/src/app/components/user-account-settings/user-account-settings.html - 204 + 202 @@ -3515,7 +3515,7 @@ Autenticació biomètrica apps/client/src/app/components/user-account-settings/user-account-settings.html - 220 + 218 @@ -3523,7 +3523,7 @@ Inicieu la sessió amb l’empremta digital apps/client/src/app/components/user-account-settings/user-account-settings.html - 221 + 219 @@ -3531,7 +3531,7 @@ Característiques experimentals apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 235 @@ -3539,7 +3539,7 @@ Doneu un cop d’ull a les properes funcionalitats apps/client/src/app/components/user-account-settings/user-account-settings.html - 238 + 236 @@ -3547,7 +3547,7 @@ Exporta dades apps/client/src/app/components/user-account-settings/user-account-settings.html - 262 + 260 @@ -3555,7 +3555,7 @@ Zona de perill apps/client/src/app/components/user-account-settings/user-account-settings.html - 274 + 272 @@ -3563,7 +3563,7 @@ Tanca el compte apps/client/src/app/components/user-account-settings/user-account-settings.html - 309 + 307 @@ -4075,7 +4075,7 @@ Programari de codi obert apps/client/src/app/pages/features/features-page.html - 296 + 295 @@ -4083,7 +4083,7 @@ Comença apps/client/src/app/pages/features/features-page.html - 321 + 320 apps/client/src/app/pages/public/public-page.html diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index e45939fd2..ba5b3cd9d 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -26,7 +26,7 @@ Das Ausfallrisiko beim Börsenhandel kann erheblich sein. Es ist nicht ratsam, Geld zu investieren, welches du kurzfristig benötigst. apps/client/src/app/app.component.html - 223 + 221 @@ -1002,7 +1002,7 @@ Registrieren apps/client/src/app/pages/features/features-page.html - 321 + 320 apps/client/src/app/pages/public/public-page.html @@ -1066,7 +1066,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 281 + 279 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1726,7 +1726,7 @@ Präsentationsansicht apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 183 @@ -1746,7 +1746,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 133 @@ -1754,7 +1754,7 @@ Datums- und Zahlenformat apps/client/src/app/components/user-account-settings/user-account-settings.html - 137 + 135 @@ -1762,7 +1762,7 @@ Zen Modus apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 201 apps/client/src/app/pages/features/features-page.html @@ -1774,7 +1774,7 @@ Einloggen mit Fingerabdruck apps/client/src/app/components/user-account-settings/user-account-settings.html - 221 + 219 @@ -1786,7 +1786,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 254 + 252 @@ -2862,7 +2862,7 @@ Experimentelle Funktionen apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 235 @@ -2910,7 +2910,7 @@ Aussehen apps/client/src/app/components/user-account-settings/user-account-settings.html - 160 + 158 @@ -2918,7 +2918,7 @@ Automatisch apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 172 @@ -2926,7 +2926,7 @@ Hell apps/client/src/app/components/user-account-settings/user-account-settings.html - 175 + 173 @@ -2934,7 +2934,7 @@ Dunkel apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 174 @@ -3202,43 +3202,43 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 91 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 112 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 116 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 120 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 125 + 123 apps/client/src/app/pages/features/features-page.html - 277 + 276 @@ -3462,7 +3462,7 @@ Ausblenden von sensiblen Informationen wie absoluter Performance und Stückzahl apps/client/src/app/components/user-account-settings/user-account-settings.html - 186 + 184 @@ -3470,7 +3470,7 @@ Unbeschwertes Erlebnis für turbulente Zeiten apps/client/src/app/components/user-account-settings/user-account-settings.html - 204 + 202 @@ -3478,7 +3478,7 @@ Vorschau auf kommende Funktionalität apps/client/src/app/components/user-account-settings/user-account-settings.html - 238 + 236 @@ -4310,7 +4310,7 @@ Open Source Software apps/client/src/app/pages/features/features-page.html - 296 + 295 @@ -4718,7 +4718,7 @@ Biometrische Authentifizierung apps/client/src/app/components/user-account-settings/user-account-settings.html - 220 + 218 @@ -4802,7 +4802,7 @@ Daten exportieren apps/client/src/app/components/user-account-settings/user-account-settings.html - 262 + 260 @@ -6623,7 +6623,7 @@ Gefahrenzone apps/client/src/app/components/user-account-settings/user-account-settings.html - 274 + 272 @@ -6631,7 +6631,7 @@ Konto schliessen apps/client/src/app/components/user-account-settings/user-account-settings.html - 309 + 307 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index b2847bd29..f49aa6873 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -27,7 +27,7 @@ El riesgo de pérdida en trading puede ser sustancial. No es aconsejable invertir dinero que puedas necesitar a corto plazo. apps/client/src/app/app.component.html - 223 + 221 @@ -987,7 +987,7 @@ Empezar apps/client/src/app/pages/features/features-page.html - 321 + 320 apps/client/src/app/pages/public/public-page.html @@ -1051,7 +1051,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 281 + 279 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1711,7 +1711,7 @@ Vista del presentador apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 183 @@ -1731,7 +1731,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 133 @@ -1739,7 +1739,7 @@ Formato de fecha y número apps/client/src/app/components/user-account-settings/user-account-settings.html - 137 + 135 @@ -1747,7 +1747,7 @@ Modo Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 201 apps/client/src/app/pages/features/features-page.html @@ -1759,7 +1759,7 @@ Iniciar sesión con huella digital apps/client/src/app/components/user-account-settings/user-account-settings.html - 221 + 219 @@ -1771,7 +1771,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 254 + 252 @@ -2847,7 +2847,7 @@ Funcionalidades experimentales apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 235 @@ -2895,7 +2895,7 @@ Apariencia apps/client/src/app/components/user-account-settings/user-account-settings.html - 160 + 158 @@ -2903,7 +2903,7 @@ Automático apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 172 @@ -2911,7 +2911,7 @@ Claro apps/client/src/app/components/user-account-settings/user-account-settings.html - 175 + 173 @@ -2919,7 +2919,7 @@ Oscuro apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 174 @@ -3187,43 +3187,43 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 91 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 112 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 116 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 120 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 125 + 123 apps/client/src/app/pages/features/features-page.html - 277 + 276 @@ -3447,7 +3447,7 @@ Protección de información confidencial como rendimientos absolutos y valores cuantitativos apps/client/src/app/components/user-account-settings/user-account-settings.html - 186 + 184 @@ -3455,7 +3455,7 @@ Experiencia sin distracciones para tiempos turbulentos apps/client/src/app/components/user-account-settings/user-account-settings.html - 204 + 202 @@ -3463,7 +3463,7 @@ Un adelanto de las próximas funciones apps/client/src/app/components/user-account-settings/user-account-settings.html - 238 + 236 @@ -4287,7 +4287,7 @@ Open Source Software apps/client/src/app/pages/features/features-page.html - 296 + 295 @@ -4695,7 +4695,7 @@ Biometric Authentication apps/client/src/app/components/user-account-settings/user-account-settings.html - 220 + 218 @@ -4779,7 +4779,7 @@ Export Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 262 + 260 @@ -6600,7 +6600,7 @@ Zona peligrosa apps/client/src/app/components/user-account-settings/user-account-settings.html - 274 + 272 @@ -6608,7 +6608,7 @@ Eliminar cuenta apps/client/src/app/components/user-account-settings/user-account-settings.html - 309 + 307 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 98f345db7..45323c7c1 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -6,7 +6,7 @@ Le risque de perte en investissant peut être important. Il est déconseillé d’investir de l’argent dont vous pourriez avoir besoin à court terme. apps/client/src/app/app.component.html - 223 + 221 @@ -1402,7 +1402,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 281 + 279 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1966,7 +1966,7 @@ Vue de Présentation apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 183 @@ -1998,43 +1998,43 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 91 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 112 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 116 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 120 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 125 + 123 apps/client/src/app/pages/features/features-page.html - 277 + 276 @@ -2046,7 +2046,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 133 @@ -2054,7 +2054,7 @@ Format de date et d’heure apps/client/src/app/components/user-account-settings/user-account-settings.html - 137 + 135 @@ -2062,7 +2062,7 @@ Apparence apps/client/src/app/components/user-account-settings/user-account-settings.html - 160 + 158 @@ -2070,7 +2070,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 172 @@ -2078,7 +2078,7 @@ Clair apps/client/src/app/components/user-account-settings/user-account-settings.html - 175 + 173 @@ -2086,7 +2086,7 @@ Sombre apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 174 @@ -2094,7 +2094,7 @@ Mode Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 201 apps/client/src/app/pages/features/features-page.html @@ -2106,7 +2106,7 @@ Se connecter avec empreinte apps/client/src/app/components/user-account-settings/user-account-settings.html - 221 + 219 @@ -2114,7 +2114,7 @@ Fonctionnalités expérimentales apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 235 @@ -2126,7 +2126,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 254 + 252 @@ -2866,7 +2866,7 @@ Démarrer apps/client/src/app/pages/features/features-page.html - 321 + 320 apps/client/src/app/pages/public/public-page.html @@ -3446,7 +3446,7 @@ Protection pour les informations sensibles telles que la performance absolue et les montants apps/client/src/app/components/user-account-settings/user-account-settings.html - 186 + 184 @@ -3454,7 +3454,7 @@ Expérience sans distraction pour les périodes tumultueuses apps/client/src/app/components/user-account-settings/user-account-settings.html - 204 + 202 @@ -3462,7 +3462,7 @@ Avant-première de fonctionnalités futures apps/client/src/app/components/user-account-settings/user-account-settings.html - 238 + 236 @@ -4286,7 +4286,7 @@ Logiciel Open Source apps/client/src/app/pages/features/features-page.html - 296 + 295 @@ -4694,7 +4694,7 @@ Authentication biométrique apps/client/src/app/components/user-account-settings/user-account-settings.html - 220 + 218 @@ -4778,7 +4778,7 @@ Exporter les Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 262 + 260 @@ -6599,7 +6599,7 @@ Zone de danger apps/client/src/app/components/user-account-settings/user-account-settings.html - 274 + 272 @@ -6607,7 +6607,7 @@ Supprimer le compte apps/client/src/app/components/user-account-settings/user-account-settings.html - 309 + 307 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index b0cd54ea0..00440b52c 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -27,7 +27,7 @@ Il rischio di perdita nel trading può essere notevole. Non è consigliabile investire denaro di cui potresti avere bisogno a breve termine. apps/client/src/app/app.component.html - 223 + 221 @@ -987,7 +987,7 @@ Inizia apps/client/src/app/pages/features/features-page.html - 321 + 320 apps/client/src/app/pages/public/public-page.html @@ -1051,7 +1051,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 281 + 279 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1711,7 +1711,7 @@ Vista presentatore apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 183 @@ -1731,7 +1731,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 133 @@ -1739,7 +1739,7 @@ Formato data e numero apps/client/src/app/components/user-account-settings/user-account-settings.html - 137 + 135 @@ -1747,7 +1747,7 @@ Modalità Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 201 apps/client/src/app/pages/features/features-page.html @@ -1759,7 +1759,7 @@ Accesso con impronta digitale apps/client/src/app/components/user-account-settings/user-account-settings.html - 221 + 219 @@ -1771,7 +1771,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 254 + 252 @@ -2847,7 +2847,7 @@ Funzionalità sperimentali apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 235 @@ -2895,7 +2895,7 @@ Aspetto apps/client/src/app/components/user-account-settings/user-account-settings.html - 160 + 158 @@ -2903,7 +2903,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 172 @@ -2911,7 +2911,7 @@ Chiaro apps/client/src/app/components/user-account-settings/user-account-settings.html - 175 + 173 @@ -2919,7 +2919,7 @@ Scuro apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 174 @@ -3187,43 +3187,43 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 91 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 112 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 116 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 120 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 125 + 123 apps/client/src/app/pages/features/features-page.html - 277 + 276 @@ -3447,7 +3447,7 @@ Protezione delle informazioni sensibili come le prestazioni assolute e i valori quantitativi apps/client/src/app/components/user-account-settings/user-account-settings.html - 186 + 184 @@ -3455,7 +3455,7 @@ Esperienza priva di distrazioni per i periodi più turbolenti apps/client/src/app/components/user-account-settings/user-account-settings.html - 204 + 202 @@ -3463,7 +3463,7 @@ Un’anteprima delle funzionalità in arrivo apps/client/src/app/components/user-account-settings/user-account-settings.html - 238 + 236 @@ -4287,7 +4287,7 @@ Software open source apps/client/src/app/pages/features/features-page.html - 296 + 295 @@ -4695,7 +4695,7 @@ Autenticazione biometrica apps/client/src/app/components/user-account-settings/user-account-settings.html - 220 + 218 @@ -4779,7 +4779,7 @@ Esporta dati apps/client/src/app/components/user-account-settings/user-account-settings.html - 262 + 260 @@ -6600,7 +6600,7 @@ Zona di Pericolo apps/client/src/app/components/user-account-settings/user-account-settings.html - 274 + 272 @@ -6608,7 +6608,7 @@ Chiudi l’account apps/client/src/app/components/user-account-settings/user-account-settings.html - 309 + 307 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 267add80e..8038048ff 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -26,7 +26,7 @@ Het risico op verlies bij handelen kan aanzienlijk zijn. Het is niet aan te raden om geld te investeren dat je misschien op korte termijn nodig heeft. apps/client/src/app/app.component.html - 223 + 221 @@ -986,7 +986,7 @@ Aan de slag apps/client/src/app/pages/features/features-page.html - 321 + 320 apps/client/src/app/pages/public/public-page.html @@ -1050,7 +1050,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 281 + 279 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1710,7 +1710,7 @@ Presentatie weergave apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 183 @@ -1730,7 +1730,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 133 @@ -1738,7 +1738,7 @@ Datum- en getalnotatie apps/client/src/app/components/user-account-settings/user-account-settings.html - 137 + 135 @@ -1746,7 +1746,7 @@ Zen-modus apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 201 apps/client/src/app/pages/features/features-page.html @@ -1758,7 +1758,7 @@ Aanmelden met vingerafdruk apps/client/src/app/components/user-account-settings/user-account-settings.html - 221 + 219 @@ -1770,7 +1770,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 254 + 252 @@ -2846,7 +2846,7 @@ Experimentele functies apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 235 @@ -2894,7 +2894,7 @@ Weergave apps/client/src/app/components/user-account-settings/user-account-settings.html - 160 + 158 @@ -2902,7 +2902,7 @@ Automatisch apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 172 @@ -2910,7 +2910,7 @@ Licht apps/client/src/app/components/user-account-settings/user-account-settings.html - 175 + 173 @@ -2918,7 +2918,7 @@ Donker apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 174 @@ -3186,43 +3186,43 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 91 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 112 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 116 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 120 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 125 + 123 apps/client/src/app/pages/features/features-page.html - 277 + 276 @@ -3446,7 +3446,7 @@ Bescherming voor gevoelige informatie zoals absoluut rendement en hoeveelheden apps/client/src/app/components/user-account-settings/user-account-settings.html - 186 + 184 @@ -3454,7 +3454,7 @@ Afleidingsvrije ervaring voor roerige tijden apps/client/src/app/components/user-account-settings/user-account-settings.html - 204 + 202 @@ -3462,7 +3462,7 @@ Voorproefje van nieuwe functionaliteit apps/client/src/app/components/user-account-settings/user-account-settings.html - 238 + 236 @@ -4286,7 +4286,7 @@ Open Source Software apps/client/src/app/pages/features/features-page.html - 296 + 295 @@ -4694,7 +4694,7 @@ Biometrische authenticatie apps/client/src/app/components/user-account-settings/user-account-settings.html - 220 + 218 @@ -4778,7 +4778,7 @@ Exporteer Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 262 + 260 @@ -6599,7 +6599,7 @@ Danger Zone apps/client/src/app/components/user-account-settings/user-account-settings.html - 274 + 272 @@ -6607,7 +6607,7 @@ Close Account apps/client/src/app/components/user-account-settings/user-account-settings.html - 309 + 307 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 57e678fef..2052f9ee8 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -759,43 +759,43 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 91 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 112 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 116 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 120 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 125 + 123 apps/client/src/app/pages/features/features-page.html - 277 + 276 @@ -803,7 +803,7 @@ Ryzyko strat na rynku może być znaczne. Nie jest zalecane inwestowanie pieniędzy, które mogą być potrzebne w krótkim okresie. apps/client/src/app/app.component.html - 223 + 221 @@ -2463,7 +2463,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 281 + 279 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -3115,7 +3115,7 @@ Widok Prezentera apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 183 @@ -3123,7 +3123,7 @@ Ochrona dla wrażliwych informacji takich jak wyniki i wartości ilościowe apps/client/src/app/components/user-account-settings/user-account-settings.html - 186 + 184 @@ -3151,7 +3151,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 133 @@ -3159,7 +3159,7 @@ Format daty i liczb apps/client/src/app/components/user-account-settings/user-account-settings.html - 137 + 135 @@ -3167,7 +3167,7 @@ Wygląd (tryb) apps/client/src/app/components/user-account-settings/user-account-settings.html - 160 + 158 @@ -3175,7 +3175,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 172 @@ -3183,7 +3183,7 @@ Jasny apps/client/src/app/components/user-account-settings/user-account-settings.html - 175 + 173 @@ -3191,7 +3191,7 @@ Ciemny apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 174 @@ -3199,7 +3199,7 @@ Tryb Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 201 apps/client/src/app/pages/features/features-page.html @@ -3211,7 +3211,7 @@ Doświadczenie bez zakłóceń w niespokojnych czasach apps/client/src/app/components/user-account-settings/user-account-settings.html - 204 + 202 @@ -3219,7 +3219,7 @@ Uwierzytelnianie Biometryczne apps/client/src/app/components/user-account-settings/user-account-settings.html - 220 + 218 @@ -3227,7 +3227,7 @@ Logowanie za pomocą linii papilarnych apps/client/src/app/components/user-account-settings/user-account-settings.html - 221 + 219 @@ -3235,7 +3235,7 @@ Funkcje Eksperymentalne apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 235 @@ -3243,7 +3243,7 @@ Podgląd nadchodzących funkcjonalności apps/client/src/app/components/user-account-settings/user-account-settings.html - 238 + 236 @@ -3255,7 +3255,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 254 + 252 @@ -3263,7 +3263,7 @@ Eksportuj Dane apps/client/src/app/components/user-account-settings/user-account-settings.html - 262 + 260 @@ -3703,7 +3703,7 @@ Oprogramowanie Open Source apps/client/src/app/pages/features/features-page.html - 296 + 295 @@ -3711,7 +3711,7 @@ Rozpocznij apps/client/src/app/pages/features/features-page.html - 321 + 320 apps/client/src/app/pages/public/public-page.html @@ -6599,7 +6599,7 @@ Strefa Zagrożenia apps/client/src/app/components/user-account-settings/user-account-settings.html - 274 + 272 @@ -6607,7 +6607,7 @@ Zamknij Konto apps/client/src/app/components/user-account-settings/user-account-settings.html - 309 + 307 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 9f8b82e04..b42e592f8 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -6,7 +6,7 @@ O risco de perda em investimentos pode ser substancial. Não é aconselhável investir dinheiro que possa vir a precisar a curto prazo. apps/client/src/app/app.component.html - 223 + 221 @@ -1282,7 +1282,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 281 + 279 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1950,7 +1950,7 @@ Vista do Apresentador apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 183 @@ -1990,7 +1990,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 133 @@ -1998,7 +1998,7 @@ Formato de números e datas apps/client/src/app/components/user-account-settings/user-account-settings.html - 137 + 135 @@ -2006,7 +2006,7 @@ Modo Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 201 apps/client/src/app/pages/features/features-page.html @@ -2018,7 +2018,7 @@ Aparência apps/client/src/app/components/user-account-settings/user-account-settings.html - 160 + 158 @@ -2026,7 +2026,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 172 @@ -2034,7 +2034,7 @@ Claro apps/client/src/app/components/user-account-settings/user-account-settings.html - 175 + 173 @@ -2042,7 +2042,7 @@ Escuro apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 174 @@ -2050,7 +2050,7 @@ Iniciar sessão com impressão digital apps/client/src/app/components/user-account-settings/user-account-settings.html - 221 + 219 @@ -2058,7 +2058,7 @@ Funcionalidades Experimentais apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 235 @@ -2070,7 +2070,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 254 + 252 @@ -2762,7 +2762,7 @@ Começar apps/client/src/app/pages/features/features-page.html - 321 + 320 apps/client/src/app/pages/public/public-page.html @@ -3230,43 +3230,43 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 91 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 112 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 116 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 120 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 125 + 123 apps/client/src/app/pages/features/features-page.html - 277 + 276 @@ -3446,7 +3446,7 @@ Proteção para informações sensíveis, como desempenhos absolutos e valores quantitativos apps/client/src/app/components/user-account-settings/user-account-settings.html - 186 + 184 @@ -3454,7 +3454,7 @@ Experiência sem distrações para tempos turbulentos apps/client/src/app/components/user-account-settings/user-account-settings.html - 204 + 202 @@ -3462,7 +3462,7 @@ Acesso antecipado a funcionalidades futuras apps/client/src/app/components/user-account-settings/user-account-settings.html - 238 + 236 @@ -4286,7 +4286,7 @@ Software de código aberto apps/client/src/app/pages/features/features-page.html - 296 + 295 @@ -4694,7 +4694,7 @@ Autenticação biométrica apps/client/src/app/components/user-account-settings/user-account-settings.html - 220 + 218 @@ -4778,7 +4778,7 @@ Exportar dados apps/client/src/app/components/user-account-settings/user-account-settings.html - 262 + 260 @@ -6599,7 +6599,7 @@ Danger Zone apps/client/src/app/components/user-account-settings/user-account-settings.html - 274 + 272 @@ -6607,7 +6607,7 @@ Close Account apps/client/src/app/components/user-account-settings/user-account-settings.html - 309 + 307 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 1b77f6748..d4d2a5dda 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -731,43 +731,43 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 91 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 112 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 116 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 120 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 125 + 123 apps/client/src/app/pages/features/features-page.html - 277 + 276 @@ -775,7 +775,7 @@ Alım satımda kayıp riski büyük boyutta olabilir. Kısa vadede ihtiyaç duyabileceğiniz parayla yatırım yapmak tavsiye edilmez. apps/client/src/app/app.component.html - 223 + 221 @@ -2311,7 +2311,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 281 + 279 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -3223,7 +3223,7 @@ Zen Modu apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 201 apps/client/src/app/pages/features/features-page.html @@ -3259,7 +3259,7 @@ Açık Kaynak Yazılım apps/client/src/app/pages/features/features-page.html - 296 + 295 @@ -3267,7 +3267,7 @@ Başla apps/client/src/app/pages/features/features-page.html - 321 + 320 apps/client/src/app/pages/public/public-page.html @@ -4991,7 +4991,7 @@ Sunum Görünümü apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 183 @@ -4999,7 +4999,7 @@ Gerçek performans ve miktar değerleri gibi hassas bilgilerin saklanması için apps/client/src/app/components/user-account-settings/user-account-settings.html - 186 + 184 @@ -5027,7 +5027,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 133 @@ -5035,7 +5035,7 @@ Tarih ve Sayı Formatları apps/client/src/app/components/user-account-settings/user-account-settings.html - 137 + 135 @@ -5043,7 +5043,7 @@ Görünüm apps/client/src/app/components/user-account-settings/user-account-settings.html - 160 + 158 @@ -5051,7 +5051,7 @@ Otomatik apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 172 @@ -5059,7 +5059,7 @@ Açık apps/client/src/app/components/user-account-settings/user-account-settings.html - 175 + 173 @@ -5067,7 +5067,7 @@ Koyu apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 174 @@ -5075,7 +5075,7 @@ Çalkantılı zamanlar için dikkat dağıtmayan bir deneyim apps/client/src/app/components/user-account-settings/user-account-settings.html - 204 + 202 @@ -5083,7 +5083,7 @@ Biyometrik Kimlik Doğrulama apps/client/src/app/components/user-account-settings/user-account-settings.html - 220 + 218 @@ -5091,7 +5091,7 @@ Parmak iziyle oturum aç apps/client/src/app/components/user-account-settings/user-account-settings.html - 221 + 219 @@ -5099,7 +5099,7 @@ Deneysel Özellikler apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 235 @@ -5107,7 +5107,7 @@ Gelecek özelliklere göz atın apps/client/src/app/components/user-account-settings/user-account-settings.html - 238 + 236 @@ -5119,7 +5119,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 254 + 252 @@ -5127,7 +5127,7 @@ Verileri Dışa Aktar apps/client/src/app/components/user-account-settings/user-account-settings.html - 262 + 260 @@ -6599,7 +6599,7 @@ Tehlikeli Alan apps/client/src/app/components/user-account-settings/user-account-settings.html - 274 + 272 @@ -6607,7 +6607,7 @@ Hesabı Kapat apps/client/src/app/components/user-account-settings/user-account-settings.html - 309 + 307 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 72ffe96fc..03af83d36 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -318,43 +318,43 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 91 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 112 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 116 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 120 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 125 + 123 apps/client/src/app/pages/features/features-page.html - 277 + 276 @@ -362,7 +362,7 @@ Ризик втрат у торгівлі може бути суттєвим. Не рекомендується інвестувати гроші, які можуть знадобитися в короткостроковій перспективі. apps/client/src/app/app.component.html - 223 + 221 @@ -2919,7 +2919,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 281 + 279 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -3439,7 +3439,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 254 + 252 @@ -3627,7 +3627,7 @@ Режим доповідача apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 183 @@ -3635,7 +3635,7 @@ Захист конфіденційної інформації, такої як абсолютні показники та кількісні значення apps/client/src/app/components/user-account-settings/user-account-settings.html - 186 + 184 @@ -3671,7 +3671,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 133 @@ -3679,7 +3679,7 @@ Формат дати та чисел apps/client/src/app/components/user-account-settings/user-account-settings.html - 137 + 135 @@ -3687,7 +3687,7 @@ Зовнішній вигляд apps/client/src/app/components/user-account-settings/user-account-settings.html - 160 + 158 @@ -3695,7 +3695,7 @@ Автоматичний apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 172 @@ -3703,7 +3703,7 @@ Світлий apps/client/src/app/components/user-account-settings/user-account-settings.html - 175 + 173 @@ -3711,7 +3711,7 @@ Темний apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 174 @@ -3719,7 +3719,7 @@ Режим дзен apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 201 apps/client/src/app/pages/features/features-page.html @@ -3731,7 +3731,7 @@ Досвід без відволікань для неспокійних часів apps/client/src/app/components/user-account-settings/user-account-settings.html - 204 + 202 @@ -3739,7 +3739,7 @@ Біометрична аутентифікація apps/client/src/app/components/user-account-settings/user-account-settings.html - 220 + 218 @@ -3747,7 +3747,7 @@ Увійти з відбитком пальця apps/client/src/app/components/user-account-settings/user-account-settings.html - 221 + 219 @@ -3755,7 +3755,7 @@ Експериментальні функції apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 235 @@ -3763,7 +3763,7 @@ Попередній перегляд майбутніх функцій apps/client/src/app/components/user-account-settings/user-account-settings.html - 238 + 236 @@ -3771,7 +3771,7 @@ Експортувати дані apps/client/src/app/components/user-account-settings/user-account-settings.html - 262 + 260 @@ -3779,7 +3779,7 @@ Зона небезпеки apps/client/src/app/components/user-account-settings/user-account-settings.html - 274 + 272 @@ -3787,7 +3787,7 @@ Закрити обліковий запис apps/client/src/app/components/user-account-settings/user-account-settings.html - 309 + 307 @@ -4291,7 +4291,7 @@ Програмне забезпечення з відкритим кодом apps/client/src/app/pages/features/features-page.html - 296 + 295 @@ -4299,7 +4299,7 @@ Почати apps/client/src/app/pages/features/features-page.html - 321 + 320 apps/client/src/app/pages/public/public-page.html diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 4ea9995b2..4c481d0cc 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -737,50 +737,50 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 91 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 112 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 116 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 120 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 125 + 123 apps/client/src/app/pages/features/features-page.html - 277 + 276 The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. apps/client/src/app/app.component.html - 223 + 221 @@ -2334,7 +2334,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 281 + 279 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -2925,14 +2925,14 @@ Presenter View apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 183 Protection for sensitive information like absolute performances and quantity values apps/client/src/app/components/user-account-settings/user-account-settings.html - 186 + 184 @@ -2957,49 +2957,49 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 133 Date and number format apps/client/src/app/components/user-account-settings/user-account-settings.html - 137 + 135 Appearance apps/client/src/app/components/user-account-settings/user-account-settings.html - 160 + 158 Auto apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 172 Light apps/client/src/app/components/user-account-settings/user-account-settings.html - 175 + 173 Dark apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 174 Zen Mode apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 201 apps/client/src/app/pages/features/features-page.html @@ -3010,35 +3010,35 @@ Distraction-free experience for turbulent times apps/client/src/app/components/user-account-settings/user-account-settings.html - 204 + 202 Biometric Authentication apps/client/src/app/components/user-account-settings/user-account-settings.html - 220 + 218 Sign in with fingerprint apps/client/src/app/components/user-account-settings/user-account-settings.html - 221 + 219 Experimental Features apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 235 Sneak peek at upcoming functionality apps/client/src/app/components/user-account-settings/user-account-settings.html - 238 + 236 @@ -3049,14 +3049,14 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 254 + 252 Export Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 262 + 260 @@ -3452,14 +3452,14 @@ Open Source Software apps/client/src/app/pages/features/features-page.html - 296 + 295 Get Started apps/client/src/app/pages/features/features-page.html - 321 + 320 apps/client/src/app/pages/public/public-page.html @@ -6017,7 +6017,7 @@ Close Account apps/client/src/app/components/user-account-settings/user-account-settings.html - 309 + 307 @@ -6031,7 +6031,7 @@ Danger Zone apps/client/src/app/components/user-account-settings/user-account-settings.html - 274 + 272 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index e98814915..06d906dc7 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -760,43 +760,43 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 91 + 90 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 94 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 98 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 112 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 116 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 120 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 125 + 123 apps/client/src/app/pages/features/features-page.html - 277 + 276 @@ -804,7 +804,7 @@ 交易损失的风险可能很大。不建议将短期内可能需要的资金进行投资。 apps/client/src/app/app.component.html - 223 + 221 @@ -2472,7 +2472,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 281 + 279 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -3124,7 +3124,7 @@ 演示者视图 apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 183 @@ -3132,7 +3132,7 @@ 保护绝对性能和数量值等敏感信息 apps/client/src/app/components/user-account-settings/user-account-settings.html - 186 + 184 @@ -3160,7 +3160,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 133 @@ -3168,7 +3168,7 @@ 日期和数字格式 apps/client/src/app/components/user-account-settings/user-account-settings.html - 137 + 135 @@ -3176,7 +3176,7 @@ 外貌 apps/client/src/app/components/user-account-settings/user-account-settings.html - 160 + 158 @@ -3184,7 +3184,7 @@ 自动 apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 172 @@ -3192,7 +3192,7 @@ 明亮 apps/client/src/app/components/user-account-settings/user-account-settings.html - 175 + 173 @@ -3200,7 +3200,7 @@ 黑暗 apps/client/src/app/components/user-account-settings/user-account-settings.html - 176 + 174 @@ -3208,7 +3208,7 @@ 极简模式 apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 201 apps/client/src/app/pages/features/features-page.html @@ -3220,7 +3220,7 @@ 动荡时期的无干扰体验 apps/client/src/app/components/user-account-settings/user-account-settings.html - 204 + 202 @@ -3228,7 +3228,7 @@ 生物识别认证 apps/client/src/app/components/user-account-settings/user-account-settings.html - 220 + 218 @@ -3236,7 +3236,7 @@ 使用指纹登录 apps/client/src/app/components/user-account-settings/user-account-settings.html - 221 + 219 @@ -3244,7 +3244,7 @@ 实验性功能 apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 235 @@ -3252,7 +3252,7 @@ 预览即将推出的功能 apps/client/src/app/components/user-account-settings/user-account-settings.html - 238 + 236 @@ -3264,7 +3264,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 254 + 252 @@ -3272,7 +3272,7 @@ 导出数据 apps/client/src/app/components/user-account-settings/user-account-settings.html - 262 + 260 @@ -3712,7 +3712,7 @@ 开源软件 apps/client/src/app/pages/features/features-page.html - 296 + 295 @@ -3720,7 +3720,7 @@ 立即开始 apps/client/src/app/pages/features/features-page.html - 321 + 320 apps/client/src/app/pages/public/public-page.html @@ -6600,7 +6600,7 @@ 危险区域 apps/client/src/app/components/user-account-settings/user-account-settings.html - 274 + 272 @@ -6608,7 +6608,7 @@ 关闭账户 apps/client/src/app/components/user-account-settings/user-account-settings.html - 309 + 307 From 4adc9dc9b158d8582e0d3a6cb543d0d5cf21ffdb Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Sat, 10 May 2025 23:07:32 +0700 Subject: [PATCH 69/91] Feature/upgrade to node-yahoo-finance2 version 3 (#4695) * Upgrade node-yahoo-finance2 from version 2.11.3 to 3.3.1 * Update changelog --- CHANGELOG.md | 1 + .../yahoo-finance/yahoo-finance.service.ts | 21 +- .../yahoo-finance/yahoo-finance.service.ts | 33 ++- package-lock.json | 252 ++++++++++++++---- package.json | 2 +- 5 files changed, 231 insertions(+), 78 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b11f41a7d..6e64f546d 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 Chinese (`zh`) - Improved the language localization for Italian (`it`) - Upgraded `nestjs` from version `10.4.15` to `11.0.12` +- Upgraded `yahoo-finance2` from version `2.11.3` to `3.3.1` ### Fixed diff --git a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts index 64bbeebb5..94a466742 100644 --- a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts @@ -18,11 +18,13 @@ import { } from '@prisma/client'; import { isISIN } from 'class-validator'; import { countries } from 'countries-list'; -import yahooFinance from 'yahoo-finance2'; -import type { Price } from 'yahoo-finance2/dist/esm/src/modules/quoteSummary-iface'; +import YahooFinance from 'yahoo-finance2'; +import type { Price } from 'yahoo-finance2/esm/src/modules/quoteSummary-iface'; @Injectable() export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { + private readonly yahooFinance = new YahooFinance(); + public constructor( private readonly cryptocurrencyService: CryptocurrencyService ) {} @@ -99,8 +101,8 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { if (response.dataSource === 'YAHOO') { yahooSymbol = symbol; } else { - const { quotes } = await yahooFinance.search(response.isin); - yahooSymbol = quotes[0].symbol; + const { quotes } = await this.yahooFinance.search(response.isin); + yahooSymbol = quotes[0].symbol as string; } const { countries, sectors, url } = @@ -165,10 +167,10 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { if (isISIN(symbol)) { try { - const { quotes } = await yahooFinance.search(symbol); + const { quotes } = await this.yahooFinance.search(symbol); if (quotes?.[0]?.symbol) { - symbol = quotes[0].symbol; + symbol = quotes[0].symbol as string; } } catch {} } else if (symbol?.endsWith(`-${DEFAULT_CURRENCY}`)) { @@ -177,7 +179,7 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { symbol = this.convertToYahooFinanceSymbol(symbol); } - const assetProfile = await yahooFinance.quoteSummary(symbol, { + const assetProfile = await this.yahooFinance.quoteSummary(symbol, { modules: ['price', 'summaryProfile', 'topHoldings'] }); @@ -206,7 +208,10 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { for (const sectorWeighting of assetProfile.topHoldings ?.sectorWeightings ?? []) { for (const [sector, weight] of Object.entries(sectorWeighting)) { - response.sectors.push({ weight, name: this.parseSector(sector) }); + response.sectors.push({ + name: this.parseSector(sector), + weight: weight as number + }); } } } else if ( diff --git a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts index b9be5553e..d5a132b41 100644 --- a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts @@ -24,16 +24,19 @@ import { import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import { addDays, format, isSameDay } from 'date-fns'; -import yahooFinance from 'yahoo-finance2'; -import { ChartResultArray } from 'yahoo-finance2/dist/esm/src/modules/chart'; +import YahooFinance from 'yahoo-finance2'; +import { ChartResultArray } from 'yahoo-finance2/esm/src/modules/chart'; import { HistoricalDividendsResult, HistoricalHistoryResult -} from 'yahoo-finance2/dist/esm/src/modules/historical'; -import { Quote } from 'yahoo-finance2/dist/esm/src/modules/quote'; +} from 'yahoo-finance2/esm/src/modules/historical'; +import { Quote } from 'yahoo-finance2/esm/src/modules/quote'; +import { SearchQuoteNonYahoo } from 'yahoo-finance2/script/src/modules/search'; @Injectable() export class YahooFinanceService implements DataProviderInterface { + private readonly yahooFinance = new YahooFinance(); + public constructor( private readonly cryptocurrencyService: CryptocurrencyService, private readonly yahooFinanceDataEnhancerService: YahooFinanceDataEnhancerService @@ -70,7 +73,7 @@ export class YahooFinanceService implements DataProviderInterface { try { const historicalResult = this.convertToDividendResult( - await yahooFinance.chart( + await this.yahooFinance.chart( this.yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol( symbol ), @@ -119,7 +122,7 @@ export class YahooFinanceService implements DataProviderInterface { try { const historicalResult = this.convertToHistoricalResult( - await yahooFinance.chart( + await this.yahooFinance.chart( this.yahooFinanceDataEnhancerService.convertToYahooFinanceSymbol( symbol ), @@ -188,7 +191,7 @@ export class YahooFinanceService implements DataProviderInterface { >[] = []; try { - quotes = await yahooFinance.quote(yahooFinanceSymbols); + quotes = await this.yahooFinance.quote(yahooFinanceSymbols); } catch (error) { Logger.error(error, 'YahooFinanceService'); @@ -244,13 +247,15 @@ export class YahooFinanceService implements DataProviderInterface { quoteTypes.push('INDEX'); } - const searchResult = await yahooFinance.search(query); + const searchResult = await this.yahooFinance.search(query); const quotes = searchResult.quotes - .filter((quote) => { - // Filter out undefined symbols - return quote.symbol; - }) + .filter( + (quote): quote is Exclude => { + // Filter out undefined symbols + return !!quote.symbol; + } + ) .filter(({ quoteType, symbol }) => { return ( (quoteType === 'CRYPTOCURRENCY' && @@ -276,7 +281,7 @@ export class YahooFinanceService implements DataProviderInterface { return true; }); - const marketData = await yahooFinance.quote( + const marketData = await this.yahooFinance.quote( quotes.map(({ symbol }) => { return symbol; }) @@ -336,7 +341,7 @@ export class YahooFinanceService implements DataProviderInterface { private async getQuotesWithQuoteSummary(aYahooFinanceSymbols: string[]) { const quoteSummaryPromises = aYahooFinanceSymbols.map((symbol) => { - return yahooFinance.quoteSummary(symbol).catch(() => { + return this.yahooFinance.quoteSummary(symbol).catch(() => { Logger.error( `Could not get quote summary for ${symbol}`, 'YahooFinanceService' diff --git a/package-lock.json b/package-lock.json index a0a96dfd6..52924f839 100644 --- a/package-lock.json +++ b/package-lock.json @@ -89,7 +89,7 @@ "svgmap": "2.12.2", "twitter-api-v2": "1.14.2", "uuid": "11.1.0", - "yahoo-finance2": "2.11.3", + "yahoo-finance2": "3.3.1", "zone.js": "0.15.0" }, "devDependencies": { @@ -3117,6 +3117,46 @@ "resolved": "https://registry.npmjs.org/@date-fns/utc/-/utc-2.1.0.tgz", "integrity": "sha512-176grgAgU2U303rD2/vcOmNg0kGPbhzckuH1TEP2al7n0AQipZIy9P15usd2TKQCG1g+E1jX/ZVQSzs4sUDwgA==" }, + "node_modules/@deno/shim-deno": { + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/@deno/shim-deno/-/shim-deno-0.18.2.tgz", + "integrity": "sha512-oQ0CVmOio63wlhwQF75zA4ioolPvOwAoK0yuzcS5bDC1JUvH3y1GS8xPh8EOpcoDQRU4FTG8OQfxhpR+c6DrzA==", + "license": "MIT", + "dependencies": { + "@deno/shim-deno-test": "^0.5.0", + "which": "^4.0.0" + } + }, + "node_modules/@deno/shim-deno-test": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@deno/shim-deno-test/-/shim-deno-test-0.5.0.tgz", + "integrity": "sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w==", + "license": "MIT" + }, + "node_modules/@deno/shim-deno/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@deno/shim-deno/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, "node_modules/@dfinity/agent": { "version": "0.15.7", "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-0.15.7.tgz", @@ -13144,6 +13184,7 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "devOptional": true, "license": "MIT" }, "node_modules/@types/trusted-types": { @@ -20201,6 +20242,16 @@ } } }, + "node_modules/fetch-mock-cache": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fetch-mock-cache/-/fetch-mock-cache-2.1.3.tgz", + "integrity": "sha512-fiQO09fEhN6ZY7GMb71cs9P09B3lBgGQ9CygydJHKQWZQv95bzsyl6dJERHuy34tQyG0gsHZK1pR/6Pkj2b9Qw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "filenamify-url": "2.1.2" + } + }, "node_modules/fflate": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", @@ -20295,6 +20346,48 @@ "node": ">=10" } }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/filenamify-url": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-2.1.2.tgz", + "integrity": "sha512-3rMbAr7vDNMOGsj1aMniQFl749QjgM+lMJ/77ZRSPTIgxvolZwoQbn8dXLs7xfd+hAdli+oTnSWZNkJJLWQFEQ==", + "license": "MIT", + "dependencies": { + "filenamify": "^4.3.0", + "humanize-url": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -21978,6 +22071,18 @@ "node": ">=8.12.0" } }, + "node_modules/humanize-url": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-2.1.1.tgz", + "integrity": "sha512-V4nxsPGNE7mPjr1qDp471YfW8nhBiTRWrG/4usZlpvFU8I7gsV7Jvrrzv/snbLm5dWO3dr1ennu2YqnhTWFmYA==", + "license": "MIT", + "dependencies": { + "normalize-url": "^4.5.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/husky": { "version": "9.1.7", "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", @@ -27355,6 +27460,15 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/npm-bundled": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", @@ -29682,6 +29796,7 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "devOptional": true, "license": "MIT", "dependencies": { "punycode": "^2.3.1" @@ -29705,6 +29820,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -29781,6 +29897,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "devOptional": true, "license": "MIT" }, "node_modules/queue-microtask": { @@ -32567,6 +32684,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/stripe": { "version": "17.3.0", "resolved": "https://registry.npmjs.org/stripe/-/stripe-17.3.0.tgz", @@ -33170,6 +33308,24 @@ "node": ">=14.0.0" } }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "license": "MIT" + }, "node_modules/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", @@ -33239,6 +33395,7 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "devOptional": true, "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", @@ -33250,22 +33407,11 @@ "node": ">=6" } }, - "node_modules/tough-cookie-file-store": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tough-cookie-file-store/-/tough-cookie-file-store-2.0.3.tgz", - "integrity": "sha512-sMpZVcmFf6EYFHFFl+SYH4W1/OnXBYMGDsv2IlbQ2caHyFElW/UR/gpj/KYU1JwmP4dE9xqwv2+vWcmlXHojSw==", - "license": "MIT", - "dependencies": { - "tough-cookie": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tough-cookie/node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "devOptional": true, "license": "MIT", "engines": { "node": ">= 4.0.0" @@ -33309,6 +33455,27 @@ "tree-kill": "cli.js" } }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/ts-api-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", @@ -34272,6 +34439,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -34302,6 +34470,7 @@ "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "devOptional": true, "license": "MIT", "dependencies": { "querystringify": "^2.1.1", @@ -35922,56 +36091,29 @@ } }, "node_modules/yahoo-finance2": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-2.11.3.tgz", - "integrity": "sha512-yN4ADFNi2oNYtO79ntbEkSWdVi4KVmGYLwDJ5KV0czxILbAGj4ah6oCBYvMONeHAeDqxtS62zrG8xrHNF/2STw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.3.1.tgz", + "integrity": "sha512-hBXdhieq897OoAu2HxA4/Ca+XrYtPFLTtGzPRW5qKCd+nX1ahHID3tmvxVBBlDTeOesdp0wjO5uGJS+o4cnEMw==", "license": "MIT", "dependencies": { - "@types/tough-cookie": "^4.0.2", - "ajv": "8.10.0", - "ajv-formats": "2.1.1", - "node-fetch": "^2.6.1", - "tough-cookie": "^4.1.2", - "tough-cookie-file-store": "^2.0.3" - }, - "bin": { - "yahoo-finance": "bin/yahoo-finance.js" + "@deno/shim-deno": "~0.18.0", + "fetch-mock-cache": "npm:fetch-mock-cache@^2.1.3", + "tough-cookie": "npm:tough-cookie@^5.1.1" }, "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/yahoo-finance2/node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "node": ">=20.0.0" } }, - "node_modules/yahoo-finance2/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", + "node_modules/yahoo-finance2/node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "license": "BSD-3-Clause", "dependencies": { - "ajv": "^8.0.0" + "tldts": "^6.1.32" }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "engines": { + "node": ">=16" } }, "node_modules/yallist": { diff --git a/package.json b/package.json index 637c7ed86..51b592245 100644 --- a/package.json +++ b/package.json @@ -135,7 +135,7 @@ "svgmap": "2.12.2", "twitter-api-v2": "1.14.2", "uuid": "11.1.0", - "yahoo-finance2": "2.11.3", + "yahoo-finance2": "3.3.1", "zone.js": "0.15.0" }, "devDependencies": { From 0b7fc7a3b2f6d65e9edc9f46d6c2fd26bab26c30 Mon Sep 17 00:00:00 2001 From: andiz2 Date: Sat, 10 May 2025 21:23:06 +0300 Subject: [PATCH 70/91] Feature/migrate data providers overview to Angular Material table (#4704) * Migrate data providers overview to Angular Material table * Update changelog --- CHANGELOG.md | 1 + .../admin-settings.component.html | 182 +++++++++--------- .../admin-settings.component.ts | 19 +- .../admin-settings/admin-settings.module.ts | 6 +- 4 files changed, 115 insertions(+), 93 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e64f546d..cc3cefd97 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 +- Harmonized the data providers management style of the admin control panel - Renamed `Order` to `activities` in the `User` database schema - Improved the language localization for Catalan (`ca`) - Improved the language localization for Chinese (`zh`) 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 977c8a372..997d34aa5 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 @@ -1,105 +1,109 @@
    -
    +

    Data Providers

    - - - @for (dataProvider of dataProviders; track dataProvider.name) { -
    - @if (dataProvider.name === 'Ghostfolio') { -
    -
    - + + + Name + + +
    + +
    + @if (isGhostfolioDataProvider(element)) { + + Ghostfolio Premium + -
    - Early Access - Ghostfolio Premium - - @if (isGhostfolioApiKeyValid === false) { - Early Access - } - - @if (isGhostfolioApiKeyValid === true) { -
    - - Valid until - {{ - ghostfolioApiStatus?.subscription?.expiresAt - | date: defaultDateFormat - }} -
    - } -
    -
    -
    -
    + } + @if (isGhostfolioApiKeyValid === true) { -
    -
    +
    + + Valid until + {{ + ghostfolioApiStatus?.subscription?.expiresAt + | date: defaultDateFormat + }} + +
    +
    + {{ ghostfolioApiStatus.dailyRequests }} of {{ ghostfolioApiStatus.dailyRequestsMax }} daily requests -
    - - - - +
    - } @else if (isGhostfolioApiKeyValid === false) { - } -
    - } @else { -
    -
    - - {{ dataProvider.name }} -
    -
    -
    - } + } @else { + {{ element.name }} + } +
    - } - - + + + + + + + + @if (isGhostfolioDataProvider(element)) { + @if (isGhostfolioApiKeyValid === true) { + + + + + } @else if (isGhostfolioApiKeyValid === false) { + + } + } + + + + + + + @if (isLoading) { + + }
    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 68c196962..f18e49d10 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 @@ -22,6 +22,7 @@ import { OnInit } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatTableDataSource } from '@angular/material/table'; import { DeviceDetectorService } from 'ngx-device-detector'; import { catchError, filter, of, Subject, takeUntil } from 'rxjs'; @@ -36,10 +37,12 @@ import { GhostfolioPremiumApiDialogParams } from './ghostfolio-premium-api-dialo standalone: false }) export class AdminSettingsComponent implements OnDestroy, OnInit { - public dataProviders: DataProviderInfo[]; + public dataSource = new MatTableDataSource(); public defaultDateFormat: string; + public displayedColumns = ['name', 'actions']; public ghostfolioApiStatus: DataProviderGhostfolioStatusResponse; public isGhostfolioApiKeyValid: boolean; + public isLoading = false; public pricingUrl: string; private deviceType: string; @@ -83,6 +86,10 @@ export class AdminSettingsComponent implements OnDestroy, OnInit { this.initialize(); } + public isGhostfolioDataProvider(provider: DataProviderInfo): boolean { + return provider.dataSource === 'GHOSTFOLIO'; + } + public onRemoveGhostfolioApiKey() { this.notificationService.confirm({ confirmFn: () => { @@ -125,14 +132,20 @@ export class AdminSettingsComponent implements OnDestroy, OnInit { } private initialize() { + this.isLoading = true; + + this.dataSource = new MatTableDataSource(); + this.adminService .fetchAdminData() .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(({ dataProviders, settings }) => { - this.dataProviders = dataProviders.filter(({ dataSource }) => { + const filteredProviders = dataProviders.filter(({ dataSource }) => { return dataSource !== 'MANUAL'; }); + this.dataSource = new MatTableDataSource(filteredProviders); + this.adminService .fetchGhostfolioDataProviderStatus( settings[PROPERTY_API_KEY_GHOSTFOLIO] as string @@ -157,6 +170,8 @@ export class AdminSettingsComponent implements OnDestroy, OnInit { this.changeDetectorRef.markForCheck(); }); + this.isLoading = false; + this.changeDetectorRef.markForCheck(); }); } 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 79b269a62..c5148f681 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 @@ -6,9 +6,10 @@ import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; import { MatMenuModule } from '@angular/material/menu'; +import { MatTableModule } from '@angular/material/table'; import { RouterModule } from '@angular/router'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { AdminSettingsComponent } from './admin-settings.component'; @@ -21,8 +22,9 @@ import { AdminSettingsComponent } from './admin-settings.component'; GfAssetProfileIconComponent, GfPremiumIndicatorComponent, MatButtonModule, - MatCardModule, MatMenuModule, + MatTableModule, + NgxSkeletonLoaderModule, RouterModule ], schemas: [CUSTOM_ELEMENTS_SCHEMA] From 6c322522d9d11dcbacf4d5bab49aa8b8649f1a06 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 10 May 2025 20:54:48 +0200 Subject: [PATCH 71/91] Feature/update locales (#4706) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.de.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.es.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.fr.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.it.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.nl.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.pl.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.pt.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.tr.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.uk.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.zh.xlf | 24 ++++++++++++++---------- 12 files changed, 168 insertions(+), 120 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 8fac18b44..b2f176212 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -653,7 +653,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 77 + 80 apps/client/src/app/components/header/header.component.ts @@ -1057,6 +1057,10 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 15 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 8 + apps/client/src/app/components/admin-tag/admin-tag.component.html 30 @@ -2187,7 +2191,7 @@ Plataformes apps/client/src/app/components/admin-settings/admin-settings.component.html - 107 + 111 @@ -2195,7 +2199,7 @@ Etiquetes apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 117 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -6671,7 +6675,7 @@ Valid until apps/client/src/app/components/admin-settings/admin-settings.component.html - 36 + 34 libs/ui/src/lib/membership-card/membership-card.component.html @@ -7279,7 +7283,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 83 + 87 @@ -7385,7 +7389,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 52 + 44 @@ -7393,7 +7397,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 54 + 46 @@ -7401,7 +7405,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 71 + 76 @@ -7409,7 +7413,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 96 + 103 @@ -7569,7 +7573,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 29 + 27 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index ba5b3cd9d..ba7993a92 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -144,6 +144,10 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 15 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 8 + apps/client/src/app/components/admin-tag/admin-tag.component.html 30 @@ -1330,7 +1334,7 @@ Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 117 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3402,7 +3406,7 @@ Gültig bis apps/client/src/app/components/admin-settings/admin-settings.component.html - 36 + 34 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3962,7 +3966,7 @@ Plattformen apps/client/src/app/components/admin-settings/admin-settings.component.html - 107 + 111 @@ -5453,7 +5457,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 77 + 80 apps/client/src/app/components/header/header.component.ts @@ -7303,7 +7307,7 @@ API-Schlüssel setzen apps/client/src/app/components/admin-settings/admin-settings.component.html - 83 + 87 @@ -7409,7 +7413,7 @@ von apps/client/src/app/components/admin-settings/admin-settings.component.html - 52 + 44 @@ -7417,7 +7421,7 @@ täglichen Anfragen apps/client/src/app/components/admin-settings/admin-settings.component.html - 54 + 46 @@ -7425,7 +7429,7 @@ API-Schlüssel löschen apps/client/src/app/components/admin-settings/admin-settings.component.html - 71 + 76 @@ -7433,7 +7437,7 @@ Möchtest du den API-Schlüssel wirklich löschen? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 96 + 103 @@ -7593,7 +7597,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 29 + 27 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index f49aa6873..241d5c6e6 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -145,6 +145,10 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 15 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 8 + apps/client/src/app/components/admin-tag/admin-tag.component.html 30 @@ -1315,7 +1319,7 @@ Etiquetas apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 117 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3387,7 +3391,7 @@ Válido hasta apps/client/src/app/components/admin-settings/admin-settings.component.html - 36 + 34 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3939,7 +3943,7 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 107 + 111 @@ -5430,7 +5434,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 77 + 80 apps/client/src/app/components/header/header.component.ts @@ -7280,7 +7284,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 83 + 87 @@ -7386,7 +7390,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 52 + 44 @@ -7394,7 +7398,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 54 + 46 @@ -7402,7 +7406,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 71 + 76 @@ -7410,7 +7414,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 96 + 103 @@ -7570,7 +7574,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 29 + 27 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 45323c7c1..0ca4aefdf 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -152,6 +152,10 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 15 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 8 + apps/client/src/app/components/admin-tag/admin-tag.component.html 30 @@ -922,7 +926,7 @@ Étiquettes apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 117 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3386,7 +3390,7 @@ Valide jusqu’au apps/client/src/app/components/admin-settings/admin-settings.component.html - 36 + 34 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3938,7 +3942,7 @@ Platformes apps/client/src/app/components/admin-settings/admin-settings.component.html - 107 + 111 @@ -5429,7 +5433,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 77 + 80 apps/client/src/app/components/header/header.component.ts @@ -7279,7 +7283,7 @@ Définir clé API apps/client/src/app/components/admin-settings/admin-settings.component.html - 83 + 87 @@ -7385,7 +7389,7 @@ sur apps/client/src/app/components/admin-settings/admin-settings.component.html - 52 + 44 @@ -7393,7 +7397,7 @@ requêtes journalières apps/client/src/app/components/admin-settings/admin-settings.component.html - 54 + 46 @@ -7401,7 +7405,7 @@ Retirer la clé API apps/client/src/app/components/admin-settings/admin-settings.component.html - 71 + 76 @@ -7409,7 +7413,7 @@ Voulez-vous vraiment supprimer la clé API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 96 + 103 @@ -7569,7 +7573,7 @@ Accès anticipé apps/client/src/app/components/admin-settings/admin-settings.component.html - 29 + 27 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 00440b52c..cc28bb0e1 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -145,6 +145,10 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 15 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 8 + apps/client/src/app/components/admin-tag/admin-tag.component.html 30 @@ -1315,7 +1319,7 @@ Tag apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 117 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3387,7 +3391,7 @@ Valido fino a apps/client/src/app/components/admin-settings/admin-settings.component.html - 36 + 34 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3939,7 +3943,7 @@ Piattaforme apps/client/src/app/components/admin-settings/admin-settings.component.html - 107 + 111 @@ -5430,7 +5434,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 77 + 80 apps/client/src/app/components/header/header.component.ts @@ -7280,7 +7284,7 @@ Imposta API Key apps/client/src/app/components/admin-settings/admin-settings.component.html - 83 + 87 @@ -7386,7 +7390,7 @@ di apps/client/src/app/components/admin-settings/admin-settings.component.html - 52 + 44 @@ -7394,7 +7398,7 @@ richieste giornaliere apps/client/src/app/components/admin-settings/admin-settings.component.html - 54 + 46 @@ -7402,7 +7406,7 @@ Rimuovi API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 71 + 76 @@ -7410,7 +7414,7 @@ Vuoi davvero eliminare l’API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 96 + 103 @@ -7570,7 +7574,7 @@ Accesso anticipato apps/client/src/app/components/admin-settings/admin-settings.component.html - 29 + 27 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 8038048ff..5e7d4240f 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -144,6 +144,10 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 15 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 8 + apps/client/src/app/components/admin-tag/admin-tag.component.html 30 @@ -1314,7 +1318,7 @@ Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 117 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3386,7 +3390,7 @@ Geldig tot apps/client/src/app/components/admin-settings/admin-settings.component.html - 36 + 34 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3938,7 +3942,7 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 107 + 111 @@ -5429,7 +5433,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 77 + 80 apps/client/src/app/components/header/header.component.ts @@ -7279,7 +7283,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 83 + 87 @@ -7385,7 +7389,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 52 + 44 @@ -7393,7 +7397,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 54 + 46 @@ -7401,7 +7405,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 71 + 76 @@ -7409,7 +7413,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 96 + 103 @@ -7569,7 +7573,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 29 + 27 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 2052f9ee8..ab0fb8d48 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -272,7 +272,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 77 + 80 apps/client/src/app/components/header/header.component.ts @@ -985,6 +985,10 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 15 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 8 + apps/client/src/app/components/admin-tag/admin-tag.component.html 30 @@ -2019,7 +2023,7 @@ Platformy apps/client/src/app/components/admin-settings/admin-settings.component.html - 107 + 111 @@ -2027,7 +2031,7 @@ Tagi apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 117 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -6071,7 +6075,7 @@ Ważność do apps/client/src/app/components/admin-settings/admin-settings.component.html - 36 + 34 libs/ui/src/lib/membership-card/membership-card.component.html @@ -7279,7 +7283,7 @@ Skonfiguruj klucz API apps/client/src/app/components/admin-settings/admin-settings.component.html - 83 + 87 @@ -7385,7 +7389,7 @@ z apps/client/src/app/components/admin-settings/admin-settings.component.html - 52 + 44 @@ -7393,7 +7397,7 @@ codzienne żądania apps/client/src/app/components/admin-settings/admin-settings.component.html - 54 + 46 @@ -7401,7 +7405,7 @@ Usuń klucz API apps/client/src/app/components/admin-settings/admin-settings.component.html - 71 + 76 @@ -7409,7 +7413,7 @@ Czy na pewno chcesz usunąć klucz API?? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 96 + 103 @@ -7569,7 +7573,7 @@ Wczesny dostęp apps/client/src/app/components/admin-settings/admin-settings.component.html - 29 + 27 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index b42e592f8..25882d131 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -152,6 +152,10 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 15 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 8 + apps/client/src/app/components/admin-tag/admin-tag.component.html 30 @@ -1618,7 +1622,7 @@ Marcadores apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 117 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3386,7 +3390,7 @@ Válido até apps/client/src/app/components/admin-settings/admin-settings.component.html - 36 + 34 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3938,7 +3942,7 @@ Plataformas apps/client/src/app/components/admin-settings/admin-settings.component.html - 107 + 111 @@ -5429,7 +5433,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 77 + 80 apps/client/src/app/components/header/header.component.ts @@ -7279,7 +7283,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 83 + 87 @@ -7385,7 +7389,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 52 + 44 @@ -7393,7 +7397,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 54 + 46 @@ -7401,7 +7405,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 71 + 76 @@ -7409,7 +7413,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 96 + 103 @@ -7569,7 +7573,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 29 + 27 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index d4d2a5dda..e39043a9d 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -272,7 +272,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 77 + 80 apps/client/src/app/components/header/header.component.ts @@ -945,6 +945,10 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 15 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 8 + apps/client/src/app/components/admin-tag/admin-tag.component.html 30 @@ -1759,7 +1763,7 @@ Etiketler apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 117 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1923,7 +1927,7 @@ Platformlar apps/client/src/app/components/admin-settings/admin-settings.component.html - 107 + 111 @@ -4951,7 +4955,7 @@ Geçerli tarih apps/client/src/app/components/admin-settings/admin-settings.component.html - 36 + 34 libs/ui/src/lib/membership-card/membership-card.component.html @@ -7279,7 +7283,7 @@ API anahtarını ayarla apps/client/src/app/components/admin-settings/admin-settings.component.html - 83 + 87 @@ -7385,7 +7389,7 @@ ın apps/client/src/app/components/admin-settings/admin-settings.component.html - 52 + 44 @@ -7393,7 +7397,7 @@ günlük istekler apps/client/src/app/components/admin-settings/admin-settings.component.html - 54 + 46 @@ -7401,7 +7405,7 @@ API anahtarını kaldır apps/client/src/app/components/admin-settings/admin-settings.component.html - 71 + 76 @@ -7409,7 +7413,7 @@ API anahtarını silmek istediğinize emin misiniz? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 96 + 103 @@ -7569,7 +7573,7 @@ Erken Erişim apps/client/src/app/components/admin-settings/admin-settings.component.html - 29 + 27 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 03af83d36..d8d274f1e 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -653,7 +653,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 77 + 80 apps/client/src/app/components/header/header.component.ts @@ -1073,6 +1073,10 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 15 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 8 + apps/client/src/app/components/admin-tag/admin-tag.component.html 30 @@ -2183,7 +2187,7 @@ Дійсне до apps/client/src/app/components/admin-settings/admin-settings.component.html - 36 + 34 libs/ui/src/lib/membership-card/membership-card.component.html @@ -2195,7 +2199,7 @@ з apps/client/src/app/components/admin-settings/admin-settings.component.html - 52 + 44 @@ -2203,7 +2207,7 @@ щоденних запитів apps/client/src/app/components/admin-settings/admin-settings.component.html - 54 + 46 @@ -2211,7 +2215,7 @@ Вилучити ключ API apps/client/src/app/components/admin-settings/admin-settings.component.html - 71 + 76 @@ -2219,7 +2223,7 @@ Встановити ключ API apps/client/src/app/components/admin-settings/admin-settings.component.html - 83 + 87 @@ -2227,7 +2231,7 @@ Платформи apps/client/src/app/components/admin-settings/admin-settings.component.html - 107 + 111 @@ -2235,7 +2239,7 @@ Теги apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 117 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2251,7 +2255,7 @@ Ви дійсно хочете видалити ключ API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 96 + 103 @@ -7569,7 +7573,7 @@ Ранній доступ apps/client/src/app/components/admin-settings/admin-settings.component.html - 29 + 27 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 4c481d0cc..0593a1f06 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -267,7 +267,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 77 + 80 apps/client/src/app/components/header/header.component.ts @@ -957,6 +957,10 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 15 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 8 + apps/client/src/app/components/admin-tag/admin-tag.component.html 30 @@ -1937,14 +1941,14 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 107 + 111 Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 117 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -5605,7 +5609,7 @@ Valid until apps/client/src/app/components/admin-settings/admin-settings.component.html - 36 + 34 libs/ui/src/lib/membership-card/membership-card.component.html @@ -6619,7 +6623,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 83 + 87 @@ -6721,14 +6725,14 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 52 + 44 Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 96 + 103 @@ -6742,14 +6746,14 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 71 + 76 daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 54 + 46 @@ -6875,7 +6879,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 29 + 27 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 06d906dc7..a008b6fa7 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -273,7 +273,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 77 + 80 apps/client/src/app/components/header/header.component.ts @@ -994,6 +994,10 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 15 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 8 + apps/client/src/app/components/admin-tag/admin-tag.component.html 30 @@ -2028,7 +2032,7 @@ 平台 apps/client/src/app/components/admin-settings/admin-settings.component.html - 107 + 111 @@ -2036,7 +2040,7 @@ 标签 apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 117 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -6128,7 +6132,7 @@ 有效期至 apps/client/src/app/components/admin-settings/admin-settings.component.html - 36 + 34 libs/ui/src/lib/membership-card/membership-card.component.html @@ -7280,7 +7284,7 @@ 设置 API 密钥 apps/client/src/app/components/admin-settings/admin-settings.component.html - 83 + 87 @@ -7386,7 +7390,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html - 52 + 44 @@ -7394,7 +7398,7 @@ 每日请求 apps/client/src/app/components/admin-settings/admin-settings.component.html - 54 + 46 @@ -7402,7 +7406,7 @@ 移除 API 密钥 apps/client/src/app/components/admin-settings/admin-settings.component.html - 71 + 76 @@ -7410,7 +7414,7 @@ 您确定要删除此 API 密钥吗? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 96 + 103 @@ -7570,7 +7574,7 @@ 抢先体验 apps/client/src/app/components/admin-settings/admin-settings.component.html - 29 + 27 From 365318e6e068cb2fdc782f733f12ba3f9f5bab86 Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Mon, 12 May 2025 13:40:33 +0700 Subject: [PATCH 72/91] Feature/improve localization (#4709) * Update translations * Update changelog --------- Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- CHANGELOG.md | 1 + .../components/header/header.component.html | 2 +- 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 | 7 ++ apps/client/src/locales/messages.zh.xlf | 64 +++++++++++-------- 14 files changed, 125 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc3cefd97..408ef9e1f 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 - Renamed `Order` to `activities` in the `User` database schema - Improved the language localization for Catalan (`ca`) - Improved the language localization for Chinese (`zh`) +- Improved the language localization for German (`de`) - Improved the language localization for Italian (`it`) - Upgraded `nestjs` from version `10.4.15` to `11.0.12` - Upgraded `yahoo-finance2` from version `2.11.3` to `3.3.1` diff --git a/apps/client/src/app/components/header/header.component.html b/apps/client/src/app/components/header/header.component.html index 6cf0ca305..b14d142f4 100644 --- a/apps/client/src/app/components/header/header.component.html +++ b/apps/client/src/app/components/header/header.component.html @@ -312,7 +312,7 @@ >About Ghostfolio
    - + diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index b2f176212..78a341ad7 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -7989,6 +7989,14 @@ 122
    + + Log out + Log out + + apps/client/src/app/components/header/header.component.html + 315 + + diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index ba7993a92..c73acd8e9 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -7989,6 +7989,14 @@ 122
    + + Log out + Ausloggen + + apps/client/src/app/components/header/header.component.html + 315 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 241d5c6e6..de9f07c8d 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -7990,6 +7990,14 @@ 122
    + + Log out + Log out + + apps/client/src/app/components/header/header.component.html + 315 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 0ca4aefdf..5077a4010 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -7989,6 +7989,14 @@ 122
    + + Log out + Log out + + apps/client/src/app/components/header/header.component.html + 315 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index cc28bb0e1..57a3b7162 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -7990,6 +7990,14 @@ 122
    + + Log out + Log out + + apps/client/src/app/components/header/header.component.html + 315 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 5e7d4240f..d8de415d5 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -7989,6 +7989,14 @@ 122
    + + Log out + Log out + + apps/client/src/app/components/header/header.component.html + 315 + + diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index ab0fb8d48..c62b42f69 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -7989,6 +7989,14 @@ 122
    + + Log out + Log out + + apps/client/src/app/components/header/header.component.html + 315 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 25882d131..535aa5acf 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -7989,6 +7989,14 @@ 122
    + + Log out + Log out + + apps/client/src/app/components/header/header.component.html + 315 + + diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index e39043a9d..400bed697 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -7989,6 +7989,14 @@ 122
    + + Log out + Log out + + apps/client/src/app/components/header/header.component.html + 315 + + diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index d8d274f1e..56b5ba426 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -7989,6 +7989,14 @@ 122
    + + Log out + Log out + + apps/client/src/app/components/header/header.component.html + 315 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 0593a1f06..70458fffd 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -7226,6 +7226,13 @@ 122
    + + Log out + + apps/client/src/app/components/header/header.component.html + 315 + + diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index a008b6fa7..12cbd3ed0 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -207,7 +207,7 @@ license - 许可 + 许可证 snake-case apps/client/src/app/app.component.ts @@ -701,7 +701,7 @@ License - 许可 + 许可证 apps/client/src/app/app.component.html 89 @@ -1265,7 +1265,7 @@ Attempts - 尝试 + 尝试次数 apps/client/src/app/components/admin-jobs/admin-jobs.html 83 @@ -1281,7 +1281,7 @@ Finished - 完成的 + 完成 apps/client/src/app/components/admin-jobs/admin-jobs.html 101 @@ -1289,7 +1289,7 @@ Status - 状况 + 状态 apps/client/src/app/components/admin-jobs/admin-jobs.html 110 @@ -2445,7 +2445,7 @@ Summary - 概括 + 汇总 apps/client/src/app/components/home-summary/home-summary.html 2 @@ -2553,7 +2553,7 @@ Buy - + 买入 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 31 @@ -2561,7 +2561,7 @@ Sell - + 卖出 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 43 @@ -3361,7 +3361,7 @@ License - 许可 + 许可证 apps/client/src/app/pages/about/about-page.component.ts 55 @@ -3733,7 +3733,7 @@ Holdings - 控股 + 持仓 apps/client/src/app/pages/home/home-page-routing.module.ts 24 @@ -3753,7 +3753,7 @@ Summary - 概括 + 汇总 apps/client/src/app/pages/home/home-page-routing.module.ts 34 @@ -4333,7 +4333,7 @@ Import Activities - 导入活动 + 导入活动记录 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 47 @@ -4373,7 +4373,7 @@ Select Holding - 选择控股 + 选择持仓 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 20 @@ -4389,7 +4389,7 @@ Holding - 保持 + 持仓 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 32 @@ -4781,7 +4781,7 @@ Holdings - 控股 + 持仓 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html 79 @@ -5485,7 +5485,7 @@ Import Activities - 进口活动 + 导入活动记录 libs/ui/src/lib/activities-table/activities-table.component.html 9 @@ -5509,7 +5509,7 @@ Export Activities - 出口活动 + 导出活动记录 libs/ui/src/lib/activities-table/activities-table.component.html 41 @@ -5913,7 +5913,7 @@ Buy - + 买入 libs/ui/src/lib/i18n.ts 35 @@ -5929,7 +5929,7 @@ Valuable - 有价值的 + 贵重物品 libs/ui/src/lib/i18n.ts 39 @@ -5937,7 +5937,7 @@ Liability - 责任 + 负债 libs/ui/src/lib/i18n.ts 40 @@ -5945,7 +5945,7 @@ Sell - + 卖出 libs/ui/src/lib/i18n.ts 41 @@ -5969,7 +5969,7 @@ Equity - 公平 + 股权 libs/ui/src/lib/i18n.ts 46 @@ -5977,7 +5977,7 @@ Fixed Income - 固定收入 + 固定收益 libs/ui/src/lib/i18n.ts 47 @@ -5993,7 +5993,7 @@ Bond - 纽带 + 债券 libs/ui/src/lib/i18n.ts 52 @@ -6161,7 +6161,7 @@ If a translation is missing, kindly support us in extending it here. - 如果翻译缺失,请支持我们进行扩展这里 + 如果翻译缺失,欢迎在这里进行扩展。 apps/client/src/app/components/user-account-settings/user-account-settings.html 58 @@ -6213,7 +6213,7 @@ Permission - 允许 + 权限 apps/client/src/app/components/access-table/access-table.component.html 18 @@ -6365,7 +6365,7 @@ View - 看法 + 查看 apps/client/src/app/components/access-table/access-table.component.html 23 @@ -6529,7 +6529,7 @@ Execute Job - 执行任务 + 执行作业 apps/client/src/app/components/admin-jobs/admin-jobs.html 176 @@ -7990,6 +7990,14 @@ 122 + + Log out + 登出 + + apps/client/src/app/components/header/header.component.html + 315 + + From a8937fbf04e9bc2620d27c79a6bc8bf94da5d63f Mon Sep 17 00:00:00 2001 From: Jeffrey Bouman <17855600+JeffreyBouman@users.noreply.github.com> Date: Tue, 13 May 2025 19:49:46 +0200 Subject: [PATCH 73/91] Feature/improve language localization for NL 20250512 (#4714) * Improve language localization for NL * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.nl.xlf | 556 ++++++++++++------------ 2 files changed, 279 insertions(+), 278 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 408ef9e1f..4a60ad6fa 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 - Renamed `Order` to `activities` in the `User` database schema - 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 German (`de`) - Improved the language localization for Italian (`it`) - Upgraded `nestjs` from version `10.4.15` to `11.0.12` diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index d8de415d5..9eb4bef14 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -403,7 +403,7 @@ Asset Profiles - Asset Profiel + Activa Profiel libs/ui/src/lib/assistant/assistant.html 67 @@ -411,7 +411,7 @@ Historical Market Data - Historische marktgegevens + Historische marktgegevens apps/client/src/app/components/admin-jobs/admin-jobs.html 37 @@ -783,7 +783,7 @@ Last Request - Laatste verzoek + Laatste verzoek apps/client/src/app/components/admin-users/admin-users.html 202 @@ -1271,7 +1271,7 @@ Please set the amount of your emergency fund. - Voer het bedrag van je noodfonds in: + Voer het bedrag van je noodfonds in: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts 64 @@ -1619,7 +1619,7 @@ Please enter your coupon code. - Voer je couponcode in: + Voer je couponcode in: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 201 @@ -1759,7 +1759,7 @@ Sign in with fingerprint - Aanmelden met vingerafdruk + Aanmelden met vingerafdruk apps/client/src/app/components/user-account-settings/user-account-settings.html 219 @@ -2531,7 +2531,7 @@ Change from All Time High - Verandering van All Time High + Verandering van Recordhoogte libs/ui/src/lib/benchmark/benchmark.component.html 96 @@ -2827,7 +2827,7 @@ Hello, has shared a Portfolio with you! - Hallo, heeft een portefeuille met je gedeeld! + Hallo, heeft een portefeuille met je gedeeld! apps/client/src/app/pages/public/public-page.html 4 @@ -3447,7 +3447,7 @@ Protection for sensitive information like absolute performances and quantity values - Bescherming voor gevoelige informatie zoals absoluut rendement en hoeveelheden + Bescherming voor gevoelige informatie zoals absoluut rendement en hoeveelheden apps/client/src/app/components/user-account-settings/user-account-settings.html 184 @@ -3455,7 +3455,7 @@ Distraction-free experience for turbulent times - Afleidingsvrije ervaring voor roerige tijden + Afleidingsvrije ervaring voor roerige tijden apps/client/src/app/components/user-account-settings/user-account-settings.html 202 @@ -3463,7 +3463,7 @@ Sneak peek at upcoming functionality - Voorproefje van nieuwe functionaliteit + Voorproefje van nieuwe functionaliteit apps/client/src/app/components/user-account-settings/user-account-settings.html 236 @@ -3855,7 +3855,7 @@ Our official Ghostfolio Premium cloud offering is the easiest way to get started. Due to the time it saves, this will be the best option for most people. Revenue is used to cover the costs of the hosting infrastructure and to fund ongoing development. - Ons officiële Ghostfolio Premium cloud-aanbod is de eenvoudigste manier om te beginnen. Vanwege de tijd die het bespaart, zal dit voor de meeste mensen de beste optie zijn. De inkomsten worden gebruikt om de hostinginfrastructuur te dekken en de voortdurende ontwikkeling van Ghostfolio te financieren. + Ons officiële Ghostfolio Premium cloud-aanbod is de eenvoudigste manier om te beginnen. Vanwege de tijd die het bespaart, zal dit voor de meeste mensen de beste optie zijn. De inkomsten worden gebruikt om de hostinginfrastructuur te dekken en de voortdurende ontwikkeling van Ghostfolio te financieren. apps/client/src/app/pages/pricing/pricing-page.html 6 @@ -3863,7 +3863,7 @@ Impersonate User - Gebruiker nadoen + Gebruiker immiteren apps/client/src/app/components/admin-users/admin-users.html 239 @@ -3879,7 +3879,7 @@ Do you really want to delete these activities? - Wil je echt al je activiteiten verwijderen? + Weet je zeker dat je alle activiteiten wilt verwijderen? libs/ui/src/lib/activities-table/activities-table.component.ts 219 @@ -3979,7 +3979,7 @@ Add Platform - Platform toevoegen + Platform Toevoegen apps/client/src/app/components/admin-platform/admin-platform.component.html 11 @@ -4255,7 +4255,7 @@ Dark Mode - Dark Mode + Donker Thema apps/client/src/app/pages/features/features-page.html 233 @@ -5111,7 +5111,7 @@ Are you ready? - Ben je er klaar voor? + Ben jij er klaar voor? apps/client/src/app/pages/landing/landing-page.html 431 @@ -5119,7 +5119,7 @@ Live Demo - Live Demo + Live Demo apps/client/src/app/pages/landing/landing-page.html 49 @@ -5632,7 +5632,7 @@ Open Source Alternative to - Open Source alternatief voor + Open Source alternatief voor apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html 42 @@ -5672,7 +5672,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. - Laten we eens dieper duiken in de gedetailleerde vergelijkingstabel hieronder om een beter begrip te krijgen hoe Ghostfolio zichzelf positioneert ten opzichte van . We gaan in op verschillende aspecten zoals functies, gegevensprivacy, prijzen en meer, zodat je een weloverwogen keuze kunt maken voor jouw persoonlijke behoeften. + Laten we eens dieper duiken in de gedetailleerde vergelijkingstabel hieronder om een beter begrip te krijgen hoe Ghostfolio zichzelf positioneert ten opzichte van . We gaan in op verschillende aspecten zoals functies, gegevensprivacy, prijzen en meer, zodat je een weloverwogen keuze kunt maken voor jouw persoonlijke behoeften. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 43 @@ -5692,7 +5692,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. - Houd er rekening mee dat de verstrekte informatie gebaseerd is op ons onafhankelijk onderzoek en analyse. Deze website is niet gelieerd aan of een ander product dat in de vergelijking wordt genoemd. Aangezien het landschap van tools voor persoonlijke financiën evolueert, is het essentieel om specifieke details of wijzigingen rechtstreeks op de betreffende productpagina te controleren. Hebben je gegevens een opfrisbeurt nodig? Help ons nauwkeurige gegevens te onderhouden over GitHub. + Houd er rekening mee dat de verstrekte informatie in deze Ghostfolio vs is gebaseerd op ons onafhankelijk onderzoek en analyse. Deze website is niet gelieerd aan of een ander product dat in de vergelijking wordt genoemd. Aangezien het landschap van tools voor persoonlijke financiën evolueert, is het essentieel om specifieke details of wijzigingen rechtstreeks op de betreffende productpagina te controleren. Hebben je gegevens een opfrisbeurt nodig? Help ons de gegevens nauwkeurig te houden op GitHub. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 311 @@ -5768,7 +5768,7 @@ Choose or drop a file here - Choose or drop a file here + Kies of sleep bestand hier apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 84 @@ -5776,7 +5776,7 @@ You are using the Live Demo. - You are using the Live Demo. + U maakt gebruik van een Live Demo. apps/client/src/app/app.component.html 12 @@ -5784,7 +5784,7 @@ One-time fee, annual account fees - One-time fee, annual account fees + Eenmalige kosten, jaarlijkse account kosten apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 33 @@ -5792,7 +5792,7 @@ Distribution of corporate earnings - Distribution of corporate earnings + Distribute van bedrijfsopbrengsten apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 41 @@ -5800,7 +5800,7 @@ Fee - Fee + Kosten libs/ui/src/lib/i18n.ts 37 @@ -5808,7 +5808,7 @@ Interest - Interest + Rente apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 307 @@ -5816,7 +5816,7 @@ Revenue for lending out money - Revenue for lending out money + Opbrengsten voor het uitlenen van geld apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 49 @@ -5824,7 +5824,7 @@ Add Tag - Add Tag + Label Toevoegen apps/client/src/app/components/admin-tag/admin-tag.component.html 11 @@ -5832,7 +5832,7 @@ Do you really want to delete this tag? - Do you really want to delete this tag? + Weet u zetker dat u dit label wilt verwijderen? apps/client/src/app/components/admin-tag/admin-tag.component.ts 85 @@ -5840,7 +5840,7 @@ Update tag - Update tag + Label bijwerken apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 8 @@ -5848,7 +5848,7 @@ Add tag - Add tag + Voeg label toe apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 10 @@ -5856,7 +5856,7 @@ Currency Cluster Risks - Currency Cluster Risks + Valuta Cluster Risico’s apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 93 @@ -5864,7 +5864,7 @@ Account Cluster Risks - Account Cluster Risks + Account Cluster Risco’s apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 141 @@ -5884,7 +5884,7 @@ Benchmark - Benchmark + Maatstaf apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 346 @@ -5892,7 +5892,7 @@ Version - Version + Versie apps/client/src/app/components/admin-overview/admin-overview.html 7 @@ -5900,7 +5900,7 @@ Settings - Settings + Instellingen apps/client/src/app/components/user-account-settings/user-account-settings.html 2 @@ -5908,7 +5908,7 @@ From - From + Van apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 11 @@ -5916,7 +5916,7 @@ To - To + Naar apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 32 @@ -5924,7 +5924,7 @@ Transfer - Transfer + Overdracht apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 72 @@ -5932,7 +5932,7 @@ Membership - Membership + Lidmaatschap apps/client/src/app/pages/user-account/user-account-page-routing.module.ts 23 @@ -5944,7 +5944,7 @@ Access - Access + Toegang apps/client/src/app/pages/user-account/user-account-page-routing.module.ts 28 @@ -5956,7 +5956,7 @@ Find holding... - Find holding... + Vind bezittingen... libs/ui/src/lib/assistant/assistant.component.ts 143 @@ -5964,7 +5964,7 @@ No entries... - No entries... + Geen vermeldingen... libs/ui/src/lib/assistant/assistant.html 62 @@ -5976,7 +5976,7 @@ Asset Profile - Asset Profile + Bezittingen Profiel apps/client/src/app/components/admin-jobs/admin-jobs.html 35 @@ -5984,7 +5984,7 @@ Do you really want to delete this asset profile? - Do you really want to delete this asset profile? + Weet u zeker dat u dit bezittingen profiel wilt verwijderen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 37 @@ -5992,7 +5992,7 @@ Search - Search + Zoeken apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 16 @@ -6000,7 +6000,7 @@ Add Manually - Add Manually + Voeg Handmatig Toe apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 19 @@ -6008,7 +6008,7 @@ Ghostfolio is a personal finance dashboard to keep track of your net worth including cash, stocks, ETFs and cryptocurrencies across multiple platforms. - Ghostfolio is een persoonlijk financieel dashboard om uw activa zoals aandelen, ETF’s of cryptocurrencies over meerdere platforms bij te houden. + Ghostfolio is een persoonlijk financieel dashboard om uw activa zoals aandelen, ETF’s of cryptocurrencies van verschillende platformen bij te houden. apps/client/src/app/pages/i18n/i18n-page.html 4 @@ -6016,7 +6016,7 @@ Last All Time High - Last All Time High + Laatste Recordhoogte libs/ui/src/lib/benchmark/benchmark.component.html 74 @@ -6024,7 +6024,7 @@ User - User + Gebruiker apps/client/src/app/components/admin-users/admin-users.html 29 @@ -6032,7 +6032,7 @@ Ghostfolio vs comparison table - Ghostfolio vs comparison table + Ghostfolio vs vergelijkingstabel apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 54 @@ -6040,7 +6040,7 @@ Open Source Wealth Management Software - Open Source Wealth Management Software + Open Source Vermogensbeheer Software apps/client/src/app/pages/i18n/i18n-page.html 14 @@ -6048,7 +6048,7 @@ app, asset, cryptocurrency, dashboard, etf, finance, management, performance, portfolio, software, stock, trading, wealth, web3 - app, asset, cryptocurrency, dashboard, etf, finance, management, performance, portfolio, software, stock, trading, wealth, web3 + app, asset, cryptocurrency, dashboard, etf, financiën, management, performance, portfolio, software, aandeel, handel, vermogen, web3 apps/client/src/app/pages/i18n/i18n-page.html 9 @@ -6056,7 +6056,7 @@ Oops, cash balance transfer has failed. - Oops, cash balance transfer has failed. + Oeps, geldoverdracht is mislukt. apps/client/src/app/pages/accounts/accounts-page.component.ts 318 @@ -6064,7 +6064,7 @@ Extreme Fear - Extreme Fear + Extreme Angst libs/ui/src/lib/i18n.ts 100 @@ -6072,7 +6072,7 @@ Extreme Greed - Extreme Greed + Extreme Hebzucht libs/ui/src/lib/i18n.ts 101 @@ -6080,7 +6080,7 @@ Neutral - Neutral + Neutraal libs/ui/src/lib/i18n.ts 104 @@ -6088,7 +6088,7 @@ Oops! Could not parse historical data. - Oops! Could not parse historical data. + Oeps! Ophalen van historische data is mislukt. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts 262 @@ -6096,7 +6096,7 @@ Do you really want to delete this system message? - Do you really want to delete this system message? + Wilt u dit systeembericht echt verwijderen? apps/client/src/app/components/admin-overview/admin-overview.component.ts 147 @@ -6104,7 +6104,7 @@ 50-Day Trend - 50-Day Trend + 50-Daagse Trend libs/ui/src/lib/benchmark/benchmark.component.html 16 @@ -6112,7 +6112,7 @@ 200-Day Trend - 200-Day Trend + 200-Daagse Trend libs/ui/src/lib/benchmark/benchmark.component.html 45 @@ -6120,7 +6120,7 @@ Cash Balances - Cash Balances + Contant Saldo apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html 124 @@ -6128,7 +6128,7 @@ Starting from - Starting from + Begin vanaf apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 289 @@ -6140,7 +6140,7 @@ year - year + jaar apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 290 @@ -6152,7 +6152,7 @@ Do you really want to delete this account balance? - Do you really want to delete this account balance? + Wilt u dit rekeningsaldo echt verwijderen? libs/ui/src/lib/account-balances/account-balances.component.ts 109 @@ -6160,7 +6160,7 @@ If a translation is missing, kindly support us in extending it here. - If a translation is missing, kindly support us in extending it here. + Als er een vertaling ontbreekt, kunt u ons helpen deze here uit te breiden. apps/client/src/app/components/user-account-settings/user-account-settings.html 58 @@ -6168,7 +6168,7 @@ The current market price is - The current market price is + De huidige markt waarde is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 536 @@ -6176,7 +6176,7 @@ Test - Test + Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 473 @@ -6184,7 +6184,7 @@ Date Range - Date Range + Datumbereik libs/ui/src/lib/assistant/assistant.html 95 @@ -6192,7 +6192,7 @@ Permission - Permission + Toestemming apps/client/src/app/components/access-table/access-table.component.html 18 @@ -6204,7 +6204,7 @@ Restricted view - Restricted view + Beperkte blik apps/client/src/app/components/access-table/access-table.component.html 26 @@ -6216,7 +6216,7 @@ Oops! Could not grant access. - Oops! Could not grant access. + Oeps! Kan geen toegang verlenen. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts 91 @@ -6224,7 +6224,7 @@ Private - Private + Prive apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 24 @@ -6232,7 +6232,7 @@ Job Queue - Job Queue + Opdracht Wachtrij apps/client/src/app/pages/admin/admin-page-routing.module.ts 25 @@ -6244,7 +6244,7 @@ Market data is delayed for - Market data is delayed for + Markt data is vertraagd voor apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts 87 @@ -6252,7 +6252,7 @@ Investment - Investment + Investering apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 56 @@ -6268,7 +6268,7 @@ Absolute Asset Performance - Absolute Asset Performance + Absolute Activaprestaties apps/client/src/app/pages/portfolio/analysis/analysis-page.html 102 @@ -6276,7 +6276,7 @@ Asset Performance - Asset Performance + Activaprestaties apps/client/src/app/pages/portfolio/analysis/analysis-page.html 123 @@ -6284,7 +6284,7 @@ Absolute Currency Performance - Absolute Currency Performance + Absolute Valutaprestaties apps/client/src/app/pages/portfolio/analysis/analysis-page.html 145 @@ -6292,7 +6292,7 @@ Currency Performance - Currency Performance + Valutaprestaties apps/client/src/app/pages/portfolio/analysis/analysis-page.html 169 @@ -6300,7 +6300,7 @@ Absolute Net Performance - Absolute Net Performance + Absolute Nettoprestatie apps/client/src/app/pages/portfolio/analysis/analysis-page.html 192 @@ -6308,7 +6308,7 @@ Net Performance - Net Performance + Nettoprestatie apps/client/src/app/pages/portfolio/analysis/analysis-page.html 211 @@ -6316,7 +6316,7 @@ Week to date - Week to date + Week tot nu toe libs/ui/src/lib/assistant/assistant.component.ts 222 @@ -6332,7 +6332,7 @@ Month to date - Month to date + Maand tot nu toe libs/ui/src/lib/assistant/assistant.component.ts 226 @@ -6348,7 +6348,7 @@ Year to date - Year to date + Jaar tot nu toe libs/ui/src/lib/assistant/assistant.component.ts 230 @@ -6368,7 +6368,7 @@ Oops! A data provider is experiencing the hiccups. - Oops! A data provider is experiencing the hiccups. + Oeps! Een gegevensaanbieder ondervindt problemen. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html 8 @@ -6376,7 +6376,7 @@ If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a withdrawal rate of 4%. - If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a withdrawal rate of 4%. + Als u vandaag met pensioen zou gaan, kunt u per jaar or per maand opnemen, gebaseerd op uw totale vermogen van en een opnamepercentage van 4%. apps/client/src/app/pages/portfolio/fire/fire-page.html 67 @@ -6384,7 +6384,7 @@ Reset Filters - Reset Filters + Filters Herstellen libs/ui/src/lib/assistant/assistant.html 187 @@ -6392,7 +6392,7 @@ year - year + jaar libs/ui/src/lib/assistant/assistant.component.ts 234 @@ -6400,7 +6400,7 @@ years - years + jaren libs/ui/src/lib/assistant/assistant.component.ts 256 @@ -6408,7 +6408,7 @@ Apply Filters - Apply Filters + Filters Toepassen libs/ui/src/lib/assistant/assistant.html 197 @@ -6416,7 +6416,7 @@ Data Gathering - Data Gathering + Data Verzamelen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 541 @@ -6428,7 +6428,7 @@ General - General + Algemeen apps/client/src/app/pages/faq/faq-page.component.ts 37 @@ -6436,7 +6436,7 @@ Cloud - Cloud + Cloud apps/client/src/app/pages/faq/faq-page.component.ts 42 @@ -6448,7 +6448,7 @@ Self-Hosting - Self-Hosting + Zelf Hosten apps/client/src/app/pages/faq/faq-page.component.ts 48 @@ -6460,7 +6460,7 @@ self-hosting - self-hosting + zelf hosten apps/client/src/app/pages/faq/faq-page.component.ts 49 @@ -6468,7 +6468,7 @@ FAQ - FAQ + FAQ apps/client/src/app/pages/faq/saas/saas-page-routing.module.ts 13 @@ -6480,7 +6480,7 @@ Oops! It looks like you’re making too many requests. Please slow down a bit. - Oops! It looks like you’re making too many requests. Please slow down a bit. + Oeps! Het lijkt er op dat u te veel verzoeken indient. Doe het iets rustiger aan alstublieft. apps/client/src/app/core/http-response.interceptor.ts 103 @@ -6488,7 +6488,7 @@ My Account - My Account + Mijn Account apps/client/src/app/pages/i18n/i18n-page.html 13 @@ -6496,7 +6496,7 @@ Active - Active + Actief apps/client/src/app/components/home-holdings/home-holdings.component.ts 36 @@ -6504,7 +6504,7 @@ Closed - Closed + Gesloten apps/client/src/app/components/home-holdings/home-holdings.component.ts 37 @@ -6512,7 +6512,7 @@ Activity - Activity + Activiteit apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 207 @@ -6520,7 +6520,7 @@ Dividend Yield - Dividend Yield + Dividendrendement apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 175 @@ -6528,7 +6528,7 @@ Execute Job - Execute Job + Opdracht Uitvoeren apps/client/src/app/components/admin-jobs/admin-jobs.html 176 @@ -6536,7 +6536,7 @@ Priority - Priority + Prioriteit apps/client/src/app/components/admin-jobs/admin-jobs.html 64 @@ -6544,7 +6544,7 @@ This action is not allowed. - This action is not allowed. + Deze actie is niet toegestaan. apps/client/src/app/core/http-response.interceptor.ts 64 @@ -6552,7 +6552,7 @@ Liquidity - Liquidity + Liquiditeit libs/ui/src/lib/i18n.ts 48 @@ -6560,7 +6560,7 @@ {VAR_PLURAL, plural, =1 {activity} other {activities}} - {VAR_PLURAL, plural, =1 {activity} other {activities}} + {VAR_PLURAL, plural, =1 {activiteit} other {activiteiten}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 14 @@ -6568,7 +6568,7 @@ Buy and sell - Buy and sell + Aan- en Verkoop libs/ui/src/lib/i18n.ts 8 @@ -6576,7 +6576,7 @@ Delete Activities - Delete Activities + Verwijder Activiteiten libs/ui/src/lib/activities-table/activities-table.component.html 67 @@ -6584,7 +6584,7 @@ Internationalization - Internationalization + Internationalizering apps/client/src/app/app-routing.module.ts 88 @@ -6592,7 +6592,7 @@ Do you really want to close your Ghostfolio account? - Do you really want to close your Ghostfolio account? + Wilt u uw Ghostfolio account echt sluiten? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts 174 @@ -6600,7 +6600,7 @@ Danger Zone - Danger Zone + Gevarenzone apps/client/src/app/components/user-account-settings/user-account-settings.html 272 @@ -6608,7 +6608,7 @@ Close Account - Close Account + Account Sluiten apps/client/src/app/components/user-account-settings/user-account-settings.html 307 @@ -6616,7 +6616,7 @@ By ETF Holding - By ETF Holding + Per Aangehouden ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html 333 @@ -6624,7 +6624,7 @@ Approximation based on the top holdings of each ETF - Approximation based on the top holdings of each ETF + Benadering op basis van de grootste belegingen binnen iedere ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html 340 @@ -6632,7 +6632,7 @@ Join now or check out the example account - Join now or check out the example account + Word nu lid of bekijk het voorbeeldaccount apps/client/src/app/pages/landing/landing-page.html 434 @@ -6640,7 +6640,7 @@ Oops! There was an error setting up biometric authentication. - Oops! There was an error setting up biometric authentication. + Oeps! Er is een fout opgetreden met het instellen van de biometrische authenticatie. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts 302 @@ -6648,7 +6648,7 @@ Show more - Show more + Laat meer zien libs/ui/src/lib/top-holdings/top-holdings.component.html 174 @@ -6656,7 +6656,7 @@ Benchmarks - Benchmarks + Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 81 @@ -6664,7 +6664,7 @@ Delete Profiles - Delete Profiles + Verwijder Profielen apps/client/src/app/components/admin-market-data/admin-market-data.html 243 @@ -6672,7 +6672,7 @@ Do you really want to delete these profiles? - Do you really want to delete these profiles? + Wilt u deze profielen echt verwijderen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 68 @@ -6680,7 +6680,7 @@ Oops! Could not delete profiles. - Oops! Could not delete profiles. + Oeps! Verwijderen van de profielen is mislukt. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 56 @@ -6688,7 +6688,7 @@ Table - Table + Tabel apps/client/src/app/components/home-holdings/home-holdings.html 16 @@ -6696,7 +6696,7 @@ Chart - Chart + Grafiek apps/client/src/app/components/home-holdings/home-holdings.html 19 @@ -6704,7 +6704,7 @@ Would you like to refine your personal investment strategy? - Would you like to refine your personal investment strategy? + Wilt u uw persoonlijke belegginngsstrategie verfijnen? apps/client/src/app/pages/public/public-page.html 211 @@ -6712,7 +6712,7 @@ Alternative - Alternative + Alternatief apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 81 @@ -6720,7 +6720,7 @@ App - App + App apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 82 @@ -6728,7 +6728,7 @@ Budgeting - Budgeting + Budgetteren apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 83 @@ -6736,7 +6736,7 @@ Community - Community + Gemeenschap apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 84 @@ -6744,7 +6744,7 @@ Family Office - Family Office + Familiekantoor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 85 @@ -6752,7 +6752,7 @@ Investor - Investor + Investeerder apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 88 @@ -6760,7 +6760,7 @@ Open Source - Open Source + Open Source apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 89 @@ -6768,7 +6768,7 @@ Personal Finance - Personal Finance + Persoonlijke Financiën apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 91 @@ -6776,7 +6776,7 @@ Privacy - Privacy + Privacy apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 92 @@ -6784,7 +6784,7 @@ Software - Software + Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 @@ -6792,7 +6792,7 @@ Tool - Tool + Hulpmiddel apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 95 @@ -6800,7 +6800,7 @@ User Experience - User Experience + Gebruikers Ervaring apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 96 @@ -6808,7 +6808,7 @@ Wealth - Wealth + Vermogen apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 97 @@ -6816,7 +6816,7 @@ Wealth Management - Wealth Management + Vermogensbeheer apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 98 @@ -6824,7 +6824,7 @@ Australia - Australia + Australië libs/ui/src/lib/i18n.ts 74 @@ -6832,7 +6832,7 @@ Austria - Austria + Oostenrijk libs/ui/src/lib/i18n.ts 75 @@ -6840,7 +6840,7 @@ Belgium - Belgium + België libs/ui/src/lib/i18n.ts 76 @@ -6848,7 +6848,7 @@ Bulgaria - Bulgaria + Bulgarije libs/ui/src/lib/i18n.ts 78 @@ -6856,7 +6856,7 @@ Canada - Canada + Canada libs/ui/src/lib/i18n.ts 79 @@ -6864,7 +6864,7 @@ Czech Republic - Czech Republic + Tsjechische Republiek libs/ui/src/lib/i18n.ts 80 @@ -6872,7 +6872,7 @@ Finland - Finland + Finland libs/ui/src/lib/i18n.ts 81 @@ -6880,7 +6880,7 @@ France - France + Frankrijk libs/ui/src/lib/i18n.ts 82 @@ -6888,7 +6888,7 @@ Germany - Germany + Duitsland libs/ui/src/lib/i18n.ts 83 @@ -6896,7 +6896,7 @@ India - India + India libs/ui/src/lib/i18n.ts 84 @@ -6904,7 +6904,7 @@ Italy - Italy + Italië libs/ui/src/lib/i18n.ts 85 @@ -6912,7 +6912,7 @@ Netherlands - Netherlands + Nederland libs/ui/src/lib/i18n.ts 87 @@ -6920,7 +6920,7 @@ New Zealand - New Zealand + Nieuw-Zeeland libs/ui/src/lib/i18n.ts 88 @@ -6928,7 +6928,7 @@ Poland - Poland + Polen libs/ui/src/lib/i18n.ts 89 @@ -6936,7 +6936,7 @@ Romania - Romania + Roemenië libs/ui/src/lib/i18n.ts 90 @@ -6944,7 +6944,7 @@ South Africa - South Africa + Zuid-Afrika libs/ui/src/lib/i18n.ts 92 @@ -6952,7 +6952,7 @@ Thailand - Thailand + Thailand libs/ui/src/lib/i18n.ts 94 @@ -6960,7 +6960,7 @@ United States - United States + Verenigde Station libs/ui/src/lib/i18n.ts 97 @@ -6968,7 +6968,7 @@ Error - Error + Fout apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 527 @@ -6976,7 +6976,7 @@ Deactivate - Deactivate + Deactiveren apps/client/src/app/components/rule/rule.component.html 72 @@ -6984,7 +6984,7 @@ Activate - Activate + Activeren apps/client/src/app/components/rule/rule.component.html 74 @@ -6992,7 +6992,7 @@ Inactive - Inactive + Inactief apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 232 @@ -7000,7 +7000,7 @@ Cancel - Cancel + Annuleren libs/ui/src/lib/i18n.ts 9 @@ -7008,7 +7008,7 @@ Close - Close + Sluiten libs/ui/src/lib/i18n.ts 11 @@ -7016,7 +7016,7 @@ Yes - Yes + Ja libs/ui/src/lib/i18n.ts 32 @@ -7024,7 +7024,7 @@ Copy link to clipboard - Copy link to clipboard + Kopieer link naar klembord apps/client/src/app/components/access-table/access-table.component.html 70 @@ -7032,7 +7032,7 @@ Portfolio Snapshot - Portfolio Snapshot + Portfolio Momentopname apps/client/src/app/components/admin-jobs/admin-jobs.html 39 @@ -7040,7 +7040,7 @@ Change with currency effect Change - Change with currency effect Change + Verandering met valuta effect Verandering apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 50 @@ -7048,7 +7048,7 @@ Performance with currency effect Performance - Performance with currency effect Performance + Prestatie met valuta effect Prestatie apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 69 @@ -7056,7 +7056,7 @@ Threshold Min - Threshold Min + Drempelwaarde Min apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 54 @@ -7064,7 +7064,7 @@ Threshold Max - Threshold Max + Drempelwaarde Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 92 @@ -7072,7 +7072,7 @@ Close - Close + Sluiten apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 129 @@ -7080,7 +7080,7 @@ Customize - Customize + Aanpassen apps/client/src/app/components/rule/rule.component.html 67 @@ -7088,7 +7088,7 @@ No auto-renewal. - No auto-renewal. + Geen automatische verlenging. apps/client/src/app/components/user-account-membership/user-account-membership.html 70 @@ -7096,7 +7096,7 @@ Today - Today + Vandaag apps/client/src/app/pages/public/public-page.html 24 @@ -7104,7 +7104,7 @@ This year - This year + Dit jaar apps/client/src/app/pages/public/public-page.html 42 @@ -7112,7 +7112,7 @@ From the beginning - From the beginning + Vanaf het begin apps/client/src/app/pages/public/public-page.html 60 @@ -7120,7 +7120,7 @@ Oops! Invalid currency. - Oops! Invalid currency. + Oeps! Ongeldige valuta. apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 49 @@ -7128,7 +7128,7 @@ This page has been archived. - This page has been archived. + Deze pagina is gearchiveerd. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 14 @@ -7136,7 +7136,7 @@ is Open Source Software - is Open Source Software + is Open Source Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 139 @@ -7144,7 +7144,7 @@ is not Open Source Software - is not Open Source Software + is geen Open Source Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 146 @@ -7152,7 +7152,7 @@ is Open Source Software - is Open Source Software + is Open Source Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 156 @@ -7160,7 +7160,7 @@ is not Open Source Software - is not Open Source Software + is geen Open Source Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 163 @@ -7168,7 +7168,7 @@ can be self-hosted - can be self-hosted + kan zelf gehost worden apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 178 @@ -7176,7 +7176,7 @@ cannot be self-hosted - cannot be self-hosted + kan niet zelf gehost worden apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 185 @@ -7184,7 +7184,7 @@ can be self-hosted - can be self-hosted + kan zelf gehost worden apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 195 @@ -7192,7 +7192,7 @@ cannot be self-hosted - cannot be self-hosted + kan niet zelf gehost worden apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 202 @@ -7200,7 +7200,7 @@ can be used anonymously - can be used anonymously + kan anoniem gebruikt worden apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 217 @@ -7208,7 +7208,7 @@ cannot be used anonymously - cannot be used anonymously + kan niet anoniem gebruik worden apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 224 @@ -7216,7 +7216,7 @@ can be used anonymously - can be used anonymously + kan anoniem gebruikt worden apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 234 @@ -7224,7 +7224,7 @@ cannot be used anonymously - cannot be used anonymously + kan niet anoniem gebruikt worden apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 241 @@ -7232,7 +7232,7 @@ offers a free plan - offers a free plan + biedt een gratis abonnement aan apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 256 @@ -7240,7 +7240,7 @@ does not offer a free plan - does not offer a free plan + biedt geen gratis abonnement aan apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 263 @@ -7248,7 +7248,7 @@ offers a free plan - offers a free plan + biedt een gratis abonnement aan apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 273 @@ -7256,7 +7256,7 @@ does not offer a free plan - does not offer a free plan + biedt geen gratis abonnement aan apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 280 @@ -7264,7 +7264,7 @@ Oops! Could not find any assets. - Oops! Could not find any assets. + Oeps! Kan geen activa vinden. libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html 40 @@ -7272,7 +7272,7 @@ Data Providers - Data Providers + Gegevensleveranciers apps/client/src/app/components/admin-settings/admin-settings.component.html 4 @@ -7280,7 +7280,7 @@ Set API key - Set API key + API-sleutel instellen apps/client/src/app/components/admin-settings/admin-settings.component.html 87 @@ -7288,7 +7288,7 @@ Get access to 80’000+ tickers from over 50 exchanges - Get access to 80’000+ tickers from over 50 exchanges + Krijg toegang tot meer dan 80.000 tickers van meer dan 50 beurzen libs/ui/src/lib/i18n.ts 24 @@ -7296,7 +7296,7 @@ Ukraine - Ukraine + Oekraïne libs/ui/src/lib/i18n.ts 95 @@ -7304,7 +7304,7 @@ Join now - Join now + Word nu lid apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 110 @@ -7312,7 +7312,7 @@ Glossary - Glossary + Woordenlijst apps/client/src/app/pages/resources/glossary/resources-glossary-routing.module.ts 10 @@ -7324,7 +7324,7 @@ Guides - Guides + Gidsen apps/client/src/app/pages/resources/guides/resources-guides-routing.module.ts 10 @@ -7336,7 +7336,7 @@ guides - guides + gidsen snake-case apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -7349,7 +7349,7 @@ glossary - glossary + woordenlijst snake-case apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -7362,7 +7362,7 @@ Threshold range - Threshold range + Drempebereik apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 9 @@ -7370,7 +7370,7 @@ Ghostfolio X-ray uses static analysis to uncover potential issues and risks in your portfolio. Adjust the rules below and set custom thresholds to align with your personal investment strategy. - Ghostfolio X-ray uses static analysis to uncover potential issues and risks in your portfolio. Adjust the rules below and set custom thresholds to align with your personal investment strategy. + Ghostfolio X-ray gebruikt statische analyse om potentiële problemen en risico’s in uw portefeuille te ontdekken. Pas de onderstaande regels aan en stel aangepaste drempelwaarden in die aansluiten bij uw persoonlijke beleggingsstrategie. apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 5 @@ -7378,7 +7378,7 @@ Economic Market Cluster Risks - Economic Market Cluster Risks + Risico’s van Economische Marktclusters apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 165 @@ -7386,7 +7386,7 @@ of - of + van apps/client/src/app/components/admin-settings/admin-settings.component.html 44 @@ -7394,7 +7394,7 @@ daily requests - daily requests + dagelijkse verzoeken apps/client/src/app/components/admin-settings/admin-settings.component.html 46 @@ -7402,7 +7402,7 @@ Remove API key - Remove API key + Verwijder API-sleutel apps/client/src/app/components/admin-settings/admin-settings.component.html 76 @@ -7410,7 +7410,7 @@ Do you really want to delete the API key? - Do you really want to delete the API key? + Wilt u de API-sleutel echt verwijderen? apps/client/src/app/components/admin-settings/admin-settings.component.ts 103 @@ -7418,7 +7418,7 @@ Please enter your Ghostfolio API key: - Please enter your Ghostfolio API key: + Voer uw Ghostfolio API-sleutel in: apps/client/src/app/pages/api/api-page.component.ts 41 @@ -7426,7 +7426,7 @@ I have an API key - I have an API key + Ik heb een API-sleutel apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html 39 @@ -7434,7 +7434,7 @@ API Requests Today - API Requests Today + Aantal API-Verzoeken Vandaag apps/client/src/app/components/admin-users/admin-users.html 178 @@ -7442,7 +7442,7 @@ Could not generate an API key - Could not generate an API key + Er kon geen API-sleutel worden gegenereerd apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 127 @@ -7450,7 +7450,7 @@ Set this API key in your self-hosted environment: - Set this API key in your self-hosted environment: + Stel deze API-sleutel in uw zelf-gehoste omgeving in: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 142 @@ -7458,7 +7458,7 @@ Ghostfolio Premium Data Provider API Key - Ghostfolio Premium Data Provider API Key + Ghostfolio Premium Gegevensleverancier API-sleutel apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 145 @@ -7466,7 +7466,7 @@ Do you really want to generate a new API key? - Do you really want to generate a new API key? + Wilt u echt een nieuwe API-sleutel genereren? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts 150 @@ -7474,7 +7474,7 @@ Tag - Tag + Label libs/ui/src/lib/assistant/assistant.html 157 @@ -7482,7 +7482,7 @@ API Key - API Key + API-sleutel libs/ui/src/lib/membership-card/membership-card.component.html 18 @@ -7490,7 +7490,7 @@ Generate Ghostfolio Premium Data Provider API key for self-hosted environments... - Generate Ghostfolio Premium Data Provider API key for self-hosted environments... + Genereer een Ghostfolio Premium Gegevensleverancier API-sleutel voor zelfgehoste omgevingen... libs/ui/src/lib/membership-card/membership-card.component.html 26 @@ -7498,7 +7498,7 @@ out of - out of + van apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 56 @@ -7506,7 +7506,7 @@ rules align with your portfolio. - rules align with your portfolio. + regels die aansluiten bij uw portefeuille. apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 58 @@ -7514,7 +7514,7 @@ Save - Save + Opslaan apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts 62 @@ -7522,7 +7522,7 @@ Asset Class Cluster Risks - Asset Class Cluster Risks + Activa Klasse Cluster Risico’s apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 117 @@ -7530,7 +7530,7 @@ Me - Me + Ik apps/client/src/app/components/user-account-access/user-account-access.component.ts 135 @@ -7538,7 +7538,7 @@ Received Access - Received Access + Toegang Verkregen apps/client/src/app/components/user-account-access/user-account-access.html 3 @@ -7546,7 +7546,7 @@ Please enter your Ghostfolio API key. - Please enter your Ghostfolio API key. + Voer uw Ghostfolio API-sleutel in. apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.component.ts 57 @@ -7554,7 +7554,7 @@ AI prompt has been copied to the clipboard - AI prompt has been copied to the clipboard + AI-prompt is naar het klembord gekopieerd apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 173 @@ -7562,7 +7562,7 @@ Link has been copied to the clipboard - Link has been copied to the clipboard + Link is gekopieerd naar klemboord apps/client/src/app/components/access-table/access-table.component.ts 65 @@ -7570,7 +7570,7 @@ Early Access - Early Access + Vroege Toegang apps/client/src/app/components/admin-settings/admin-settings.component.html 27 @@ -7578,7 +7578,7 @@ Regional Market Cluster Risks - Regional Market Cluster Risks + Regionale Markt Clusterrisico’s apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 189 @@ -7602,7 +7602,7 @@ Default Market Price - Default Market Price + Standaard Marktprijs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 386 @@ -7610,7 +7610,7 @@ Mode - Mode + Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 423 @@ -7626,7 +7626,7 @@ HTTP Request Headers - HTTP Request Headers + HTTP Verzoek Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 399 @@ -7634,7 +7634,7 @@ end of day - end of day + eind van de dag apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 138 @@ -7642,7 +7642,7 @@ real-time - real-time + real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 142 @@ -7650,7 +7650,7 @@ Open Duck.ai - Open Duck.ai + Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 174 @@ -7658,7 +7658,7 @@ Create - Create + Nieuw libs/ui/src/lib/tags-selector/tags-selector.component.html 50 @@ -7666,7 +7666,7 @@ Market Data - Market Data + Markt Gegevens apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 374 @@ -7674,7 +7674,7 @@ Change - Change + Aanpassen libs/ui/src/lib/treemap-chart/treemap-chart.component.ts 365 @@ -7682,7 +7682,7 @@ Performance - Performance + Prestatie libs/ui/src/lib/treemap-chart/treemap-chart.component.ts 365 @@ -7694,7 +7694,7 @@ Copy portfolio data to clipboard for AI prompt - Copy portfolio data to clipboard for AI prompt + Kopieer portfolio gegevens naar klemboord voor AI-prompt apps/client/src/app/pages/portfolio/analysis/analysis-page.html 42 @@ -7702,7 +7702,7 @@ Copy AI prompt to clipboard for analysis - Copy AI prompt to clipboard for analysis + Kopieer AI-prompt naar klemboord voor analyse apps/client/src/app/pages/portfolio/analysis/analysis-page.html 67 @@ -7710,7 +7710,7 @@ Armenia - Armenia + Armenië libs/ui/src/lib/i18n.ts 73 @@ -7718,7 +7718,7 @@ British Virgin Islands - British Virgin Islands + Britse Maagdeneilanden libs/ui/src/lib/i18n.ts 77 @@ -7726,7 +7726,7 @@ Singapore - Singapore + Singapore libs/ui/src/lib/i18n.ts 91 @@ -7734,7 +7734,7 @@ Terms and Conditions - Terms and Conditions + Algemene Voorwaarden apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 15 @@ -7742,7 +7742,7 @@ Please keep your security token safe. If you lose it, you will not be able to recover your account. - Please keep your security token safe. If you lose it, you will not be able to recover your account. + Bewaar uw beveiligingstoken goed. Als u deze verliest, kunt u uw account niet meer herstellen. apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 18 @@ -7750,7 +7750,7 @@ I understand that if I lose my security token, I cannot recover my account - I understand that if I lose my security token, I cannot recover my account + Ik begrijp dat als ik mijn beveiligingstoken verlies, ik mijn account niet kan herstellen apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 28 @@ -7758,7 +7758,7 @@ Continue - Continue + Doorgaan apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 57 @@ -7766,7 +7766,7 @@ Here is your security token. It is only visible once, please store and keep it in a safe place. - Here is your security token. It is only visible once, please store and keep it in a safe place. + Hier is uw beveiligingstoken. Deze is slechts één keer zichtbaar, bewaar hem op een veilige plaats. apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 67 @@ -7774,7 +7774,7 @@ Security token - Security token + Beveiligingstoken apps/client/src/app/components/admin-users/admin-users.component.ts 163 @@ -7782,7 +7782,7 @@ Do you really want to generate a new security token for this user? - Do you really want to generate a new security token for this user? + Wilt u echt een nieuw beveiligingstoken voor deze gebruiker aanmaken? apps/client/src/app/components/admin-users/admin-users.component.ts 168 @@ -7790,7 +7790,7 @@ Generate Security Token - Generate Security Token + Beveiligingstoken Aanmaken apps/client/src/app/components/admin-users/admin-users.html 249 @@ -7798,7 +7798,7 @@ United Kingdom - United Kingdom + Verenigd Koninkrijk libs/ui/src/lib/i18n.ts 96 @@ -7806,7 +7806,7 @@ Terms of Service - Terms of Service + Servicevoorwaarden apps/client/src/app/app.component.html 112 @@ -7814,7 +7814,7 @@ terms-of-service - terms-of-service + servicevoorwaarden snake-case apps/client/src/app/app.component.ts @@ -7835,7 +7835,7 @@ Terms of Service - Terms of Service + Servicevoorwaarden apps/client/src/app/pages/about/about-page.component.ts 71 @@ -7847,7 +7847,7 @@ Terms of Service - Terms of Service + Servicevoorwaarden apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.html 4 @@ -7855,7 +7855,7 @@ and I agree to the Terms of Service. - and I agree to the Terms of Service. + en ik ga akkoord met de Servicevoorwaarden. apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 34 @@ -7863,7 +7863,7 @@ () is already in use. - () is already in use. + () is al in gebruik. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 462 @@ -7871,7 +7871,7 @@ An error occurred while updating to (). - An error occurred while updating to (). + Er is een fout opgetreden tijdens het updaten naar (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 470 @@ -7879,7 +7879,7 @@ Apply - Apply + Toepassen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 138 @@ -7887,7 +7887,7 @@ with API access for - with API access for + met API toegang tot apps/client/src/app/pages/pricing/pricing-page.html 266 @@ -7895,7 +7895,7 @@ Gather Recent Historical Market Data - Gather Recent Historical Market Data + Verzamel Recente Marktgegevens apps/client/src/app/components/admin-market-data/admin-market-data.html 226 @@ -7903,7 +7903,7 @@ Gather All Historical Market Data - Gather All Historical Market Data + Verzamel Alle Marktgegevens apps/client/src/app/components/admin-market-data/admin-market-data.html 231 @@ -7911,7 +7911,7 @@ Gather Historical Market Data - Gather Historical Market Data + Verzamel Historische Marktgegevens apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 29 @@ -7919,7 +7919,7 @@ Data Gathering is off - Data Gathering is off + Gegevensverzameling is uitgeschakeld apps/client/src/app/components/admin-market-data/admin-market-data.html 38 @@ -7927,7 +7927,7 @@ Performance Calculation - Performance Calculation + Prestatieberekening apps/client/src/app/components/user-account-settings/user-account-settings.html 31 @@ -7943,7 +7943,7 @@ Add asset to watchlist - Add asset to watchlist + Voeg activa toe aan de volglijst apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html 7 @@ -7951,7 +7951,7 @@ Watchlist - Watchlist + Volglijst apps/client/src/app/components/home-watchlist/home-watchlist.html 4 @@ -7963,7 +7963,7 @@ Watchlist - Watchlist + Volglijst apps/client/src/app/pages/home/home-page-routing.module.ts 44 @@ -7975,7 +7975,7 @@ Get Early Access - Get Early Access + Krijg Vroegtijdige Toegang apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html 29 @@ -7983,7 +7983,7 @@ Do you really want to delete this item? - Do you really want to delete this item? + Wilt u dit item echt verwijderen? libs/ui/src/lib/benchmark/benchmark.component.ts 122 @@ -7991,7 +7991,7 @@ Log out - Log out + Uitloggen apps/client/src/app/components/header/header.component.html 315 From e97757631b034dc7a4bb3654287bc08c50f207aa Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 14 May 2025 22:52:11 +0200 Subject: [PATCH 74/91] Feature/add missing types of impersonationId in controllers (#4691) * Add missing types --- apps/api/src/app/account/account.controller.ts | 4 ++-- apps/api/src/app/order/order.controller.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/api/src/app/account/account.controller.ts b/apps/api/src/app/account/account.controller.ts index 8512d8409..1d8f9ab27 100644 --- a/apps/api/src/app/account/account.controller.ts +++ b/apps/api/src/app/account/account.controller.ts @@ -87,7 +87,7 @@ export class AccountController { @UseInterceptors(RedactValuesInResponseInterceptor) @UseInterceptors(TransformDataSourceInRequestInterceptor) public async getAllAccounts( - @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId, + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Query('dataSource') filterByDataSource?: string, @Query('symbol') filterBySymbol?: string ): Promise { @@ -110,7 +110,7 @@ export class AccountController { @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(RedactValuesInResponseInterceptor) public async getAccountById( - @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId, + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Param('id') id: string ): Promise { const impersonationUserId = diff --git a/apps/api/src/app/order/order.controller.ts b/apps/api/src/app/order/order.controller.ts index 907335aa0..2c4a58596 100644 --- a/apps/api/src/app/order/order.controller.ts +++ b/apps/api/src/app/order/order.controller.ts @@ -97,7 +97,7 @@ export class OrderController { @UseInterceptors(TransformDataSourceInRequestInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async getAllOrders( - @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId, + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Query('accounts') filterByAccounts?: string, @Query('assetClasses') filterByAssetClasses?: string, @Query('dataSource') filterByDataSource?: string, @@ -150,7 +150,7 @@ export class OrderController { @UseInterceptors(RedactValuesInResponseInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async getOrderById( - @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId, + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Param('id') id: string ): Promise { const impersonationUserId = From 895a6214c7c85e3a25adb9209c742b1f64d49c62 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 14 May 2025 23:29:32 +0200 Subject: [PATCH 75/91] Feature/update locales (#4718) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.nl.xlf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 9eb4bef14..1099d5235 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -6376,7 +6376,7 @@ If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a withdrawal rate of 4%. - Als u vandaag met pensioen zou gaan, kunt u per jaar or per maand opnemen, gebaseerd op uw totale vermogen van en een opnamepercentage van 4%. + Als u vandaag met pensioen zou gaan, kunt u per jaar or per maand opnemen, gebaseerd op uw totale vermogen van en een opnamepercentage van 4%. apps/client/src/app/pages/portfolio/fire/fire-page.html 67 From 1697b7e1e00ce1f403e4de680a35ab2c7d66487f Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 15 May 2025 16:56:05 +0200 Subject: [PATCH 76/91] Feature/remove unused Order model (#4690) * Remove unused Order model --- apps/api/src/models/order.ts | 83 ------------------- .../api/src/services/interfaces/interfaces.ts | 21 +---- 2 files changed, 1 insertion(+), 103 deletions(-) delete mode 100644 apps/api/src/models/order.ts diff --git a/apps/api/src/models/order.ts b/apps/api/src/models/order.ts deleted file mode 100644 index 6e6762101..000000000 --- a/apps/api/src/models/order.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { IOrder } from '@ghostfolio/api/services/interfaces/interfaces'; - -import { Account, SymbolProfile, Type as ActivityType } from '@prisma/client'; -import { v4 as uuidv4 } from 'uuid'; - -export class Order { - private account: Account; - private currency: string; - private fee: number; - private date: string; - private id: string; - private isDraft: boolean; - private quantity: number; - private symbol: string; - private symbolProfile: SymbolProfile; - private total: number; - private type: ActivityType; - private unitPrice: number; - - public constructor(data: IOrder) { - this.account = data.account; - this.currency = data.currency; - this.fee = data.fee; - this.date = data.date; - this.id = data.id || uuidv4(); - this.isDraft = data.isDraft; - this.quantity = data.quantity; - this.symbol = data.symbol; - this.symbolProfile = data.symbolProfile; - this.type = data.type; - this.unitPrice = data.unitPrice; - - this.total = this.quantity * data.unitPrice; - } - - public getAccount() { - return this.account; - } - - public getCurrency() { - return this.currency; - } - - public getDate() { - return this.date; - } - - public getFee() { - return this.fee; - } - - public getId() { - return this.id; - } - - public getIsDraft() { - return this.isDraft; - } - - public getQuantity() { - return this.quantity; - } - - public getSymbol() { - return this.symbol; - } - - getSymbolProfile() { - return this.symbolProfile; - } - - public getTotal() { - return this.total; - } - - public getType() { - return this.type; - } - - public getUnitPrice() { - return this.unitPrice; - } -} diff --git a/apps/api/src/services/interfaces/interfaces.ts b/apps/api/src/services/interfaces/interfaces.ts index fa7fc4d09..0eaa149a3 100644 --- a/apps/api/src/services/interfaces/interfaces.ts +++ b/apps/api/src/services/interfaces/interfaces.ts @@ -4,26 +4,7 @@ import { } from '@ghostfolio/common/interfaces'; import { MarketState } from '@ghostfolio/common/types'; -import { - Account, - DataSource, - SymbolProfile, - Type as ActivityType -} from '@prisma/client'; - -export interface IOrder { - account: Account; - currency: string; - date: string; - fee: number; - id?: string; - isDraft: boolean; - quantity: number; - symbol: string; - symbolProfile: SymbolProfile; - type: ActivityType; - unitPrice: number; -} +import { DataSource } from '@prisma/client'; export interface IDataProviderHistoricalResponse { marketPrice: number; From ccbf958aa653e6f26be90b7b7f4333742338bc73 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 16 May 2025 20:16:24 +0200 Subject: [PATCH 77/91] Feature/upgrade countup.js to version 2.8.2 (#4708) * Upgrade countup.js to version 2.8.2 * 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 4a60ad6fa..c9b2ba32f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the language localization for Dutch (`nl`) - Improved the language localization for German (`de`) - Improved the language localization for Italian (`it`) +- Upgraded `countup.js` from version `2.8.0` to `2.8.2` - Upgraded `nestjs` from version `10.4.15` to `11.0.12` - Upgraded `yahoo-finance2` from version `2.11.3` to `3.3.1` diff --git a/package-lock.json b/package-lock.json index 52924f839..b2e0f3b9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,7 +61,7 @@ "color": "5.0.0", "countries-and-timezones": "3.7.2", "countries-list": "3.1.1", - "countup.js": "2.8.0", + "countup.js": "2.8.2", "date-fns": "4.1.0", "envalid": "8.0.0", "google-spreadsheet": "3.2.0", @@ -16965,9 +16965,9 @@ "license": "MIT" }, "node_modules/countup.js": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.8.0.tgz", - "integrity": "sha512-f7xEhX0awl4NOElHulrl4XRfKoNH3rB+qfNSZZyjSZhaAoUk6elvhH+MNxMmlmuUJ2/QNTWPSA7U4mNtIAKljQ==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.8.2.tgz", + "integrity": "sha512-UtRoPH6udaru/MOhhZhI/GZHJKAyAxuKItD2Tr7AbrqrOPBX/uejWBBJt8q86169AMqKkE9h9/24kFWbUk/Bag==", "license": "MIT" }, "node_modules/create-jest": { diff --git a/package.json b/package.json index 51b592245..a995a8a47 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "color": "5.0.0", "countries-and-timezones": "3.7.2", "countries-list": "3.1.1", - "countup.js": "2.8.0", + "countup.js": "2.8.2", "date-fns": "4.1.0", "envalid": "8.0.0", "google-spreadsheet": "3.2.0", From 698d71fb3a6e75a9b223d2e018d1f7d15227765a Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 17 May 2025 19:39:48 +0200 Subject: [PATCH 78/91] Feature/restrict permissions of demo user (#4697) * Restrict permissions of demo user * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/user/user.service.ts | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9b2ba32f..f509061ee 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 - Harmonized the data providers management style of the admin control panel +- Restricted the permissions of the demo user - Renamed `Order` to `activities` in the `User` database schema - Improved the language localization for Catalan (`ca`) - Improved the language localization for Chinese (`zh`) diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index cf55b8862..87c82fa0b 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -394,9 +394,11 @@ export class UserService { // Reset holdings view mode user.Settings.settings.holdingsViewMode = undefined; } else if (user.subscription?.type === 'Premium') { - currentPermissions.push(permissions.createApiKey); - currentPermissions.push(permissions.enableDataProviderGhostfolio); - currentPermissions.push(permissions.reportDataGlitch); + if (!hasRole(user, Role.DEMO)) { + currentPermissions.push(permissions.createApiKey); + currentPermissions.push(permissions.enableDataProviderGhostfolio); + currentPermissions.push(permissions.reportDataGlitch); + } currentPermissions = without( currentPermissions, From af79888cd6cdd3849075b9f58395cf42d79aa928 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 18 May 2025 11:54:53 +0200 Subject: [PATCH 79/91] Feature/add asset profile count to data providers management of admin control (#4707) * Extend admin settings columns * assetProfileCount * status * Update changelog --- CHANGELOG.md | 1 + .../admin-platform.component.html | 201 ++++++++---------- .../admin-settings.component.html | 42 +++- .../admin-settings.component.scss | 12 ++ .../admin-settings.component.ts | 2 +- .../admin-settings/admin-settings.module.ts | 2 + .../admin-tag/admin-tag.component.html | 187 ++++++++-------- 7 files changed, 223 insertions(+), 224 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f509061ee..e140bef44 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 - Harmonized the data providers management style of the admin control panel +- Extended the data providers management of the admin control panel by the asset profile count - Restricted the permissions of the demo user - Renamed `Order` to `activities` in the `User` database schema - Improved the language localization for Catalan (`ca`) diff --git a/apps/client/src/app/components/admin-platform/admin-platform.component.html b/apps/client/src/app/components/admin-platform/admin-platform.component.html index c71594e45..47fee3c8a 100644 --- a/apps/client/src/app/components/admin-platform/admin-platform.component.html +++ b/apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1,115 +1,94 @@ -
    -
    -
    - - - - - + +
    - Name - - @if (element.url) { - - } - {{ element.name }} -
    + + + - - - - + + + + - - - - + + + + - - - - + + + + - - -
    + Name + + @if (element.url) { + + } + {{ element.name }} + - Url - - {{ element.url }} - + Url + + {{ element.url }} + - Accounts - - {{ element.accountCount }} - + Accounts + + {{ element.accountCount }} + - - - -
    - -
    -
    + + + +
    + +
    +
    -
    -
    -
    + + + 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 997d34aa5..2dcdefdd0 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 @@ -38,14 +38,6 @@ }}
    -
    - - {{ ghostfolioApiStatus.dailyRequests }} - of - {{ ghostfolioApiStatus.dailyRequestsMax }} - daily requests - -
    } } @else { {{ element.name }} @@ -55,6 +47,40 @@ + + + Asset Profiles + + + {{ element.assetProfileCount }} + + + + + + + @if (isGhostfolioDataProvider(element)) { + @if (isGhostfolioApiKeyValid === true) { + + + {{ ghostfolioApiStatus.dailyRequests }} + of + {{ ghostfolioApiStatus.dailyRequestsMax }} + daily requests + + } + } + + + 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 5d4e87f30..c08ba95bc 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,3 +1,15 @@ :host { display: block; + + .mat-mdc-progress-bar { + --mdc-linear-progress-active-indicator-height: 0.5rem; + --mdc-linear-progress-track-height: 0.5rem; + border-radius: 0.25rem; + + ::ng-deep { + .mdc-linear-progress__buffer-bar { + background-color: rgb(var(--palette-background-unselected-chip)); + } + } + } } 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 f18e49d10..5c071c60c 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 @@ -39,7 +39,7 @@ import { GhostfolioPremiumApiDialogParams } from './ghostfolio-premium-api-dialo export class AdminSettingsComponent implements OnDestroy, OnInit { public dataSource = new MatTableDataSource(); public defaultDateFormat: string; - public displayedColumns = ['name', 'actions']; + public displayedColumns = ['name', 'assetProfileCount', 'status', 'actions']; public ghostfolioApiStatus: DataProviderGhostfolioStatusResponse; public isGhostfolioApiKeyValid: boolean; public isLoading = false; 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 c5148f681..706f20a87 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 @@ -7,6 +7,7 @@ import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; import { MatTableModule } from '@angular/material/table'; import { RouterModule } from '@angular/router'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @@ -23,6 +24,7 @@ import { AdminSettingsComponent } from './admin-settings.component'; GfPremiumIndicatorComponent, MatButtonModule, MatMenuModule, + MatProgressBarModule, MatTableModule, NgxSkeletonLoaderModule, RouterModule diff --git a/apps/client/src/app/components/admin-tag/admin-tag.component.html b/apps/client/src/app/components/admin-tag/admin-tag.component.html index f69579ab8..5979d2778 100644 --- a/apps/client/src/app/components/admin-tag/admin-tag.component.html +++ b/apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -1,108 +1,87 @@ -
    -
    -
    - - - - - - + +
    - Name - - {{ element.name }} -
    + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - -
    + Name + + {{ element.name }} + - User - - {{ element.userId }} - + User + + {{ element.userId }} + - Activities - - {{ element.activityCount }} - + Activities + + {{ element.activityCount }} + - - - -
    - -
    -
    + + + +
    + +
    +
    -
    -
    -
    + + + From 273ec923165dc4886798aa3030cb0430682e30c9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 18 May 2025 20:14:36 +0200 Subject: [PATCH 80/91] Feature/update locales (#4724) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 44 ++++++++++++++----------- apps/client/src/locales/messages.de.xlf | 44 ++++++++++++++----------- apps/client/src/locales/messages.es.xlf | 44 ++++++++++++++----------- apps/client/src/locales/messages.fr.xlf | 44 ++++++++++++++----------- apps/client/src/locales/messages.it.xlf | 44 ++++++++++++++----------- apps/client/src/locales/messages.nl.xlf | 44 ++++++++++++++----------- apps/client/src/locales/messages.pl.xlf | 44 ++++++++++++++----------- apps/client/src/locales/messages.pt.xlf | 44 ++++++++++++++----------- apps/client/src/locales/messages.tr.xlf | 44 ++++++++++++++----------- apps/client/src/locales/messages.uk.xlf | 44 ++++++++++++++----------- apps/client/src/locales/messages.xlf | 44 ++++++++++++++----------- apps/client/src/locales/messages.zh.xlf | 44 ++++++++++++++----------- 12 files changed, 288 insertions(+), 240 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 78a341ad7..d0f37ead8 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -959,7 +959,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 58 + 45 apps/client/src/app/components/admin-users/admin-users.html @@ -1051,7 +1051,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 30 + 22 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -1063,7 +1063,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 30 + 22 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1203,11 +1203,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 92 + 74 apps/client/src/app/components/admin-tag/admin-tag.component.html - 85 + 67 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1235,11 +1235,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 103 + 85 apps/client/src/app/components/admin-tag/admin-tag.component.html - 96 + 78 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1907,7 +1907,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 51 + 38 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -2126,12 +2126,12 @@ 174 - + Add Platform Afegeix Plataforma apps/client/src/app/components/admin-platform/admin-platform.component.html - 11 + 8 @@ -2139,7 +2139,7 @@ Comptes apps/client/src/app/components/admin-platform/admin-platform.component.html - 65 + 52 apps/client/src/app/components/admin-users/admin-users.html @@ -2191,7 +2191,7 @@ Plataformes apps/client/src/app/components/admin-settings/admin-settings.component.html - 111 + 137 @@ -2199,7 +2199,7 @@ Etiquetes apps/client/src/app/components/admin-settings/admin-settings.component.html - 117 + 143 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2210,12 +2210,12 @@ 16 - + Add Tag Afegir Etiqueta apps/client/src/app/components/admin-tag/admin-tag.component.html - 11 + 8 @@ -2443,7 +2443,7 @@ Usuari apps/client/src/app/components/admin-tag/admin-tag.component.html - 44 + 31 apps/client/src/app/components/header/header.component.html @@ -6081,6 +6081,10 @@ Asset Profiles Asset Profiles + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 52 + libs/ui/src/lib/assistant/assistant.html 67 @@ -7283,7 +7287,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 @@ -7389,7 +7393,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 75 @@ -7397,7 +7401,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 46 + 77 @@ -7405,7 +7409,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 76 + 102 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index c73acd8e9..7671b9e32 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -102,7 +102,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 58 + 45 apps/client/src/app/components/admin-users/admin-users.html @@ -138,7 +138,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 30 + 22 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -150,7 +150,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 30 + 22 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -258,11 +258,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 92 + 74 apps/client/src/app/components/admin-tag/admin-tag.component.html - 85 + 67 libs/ui/src/lib/activities-table/activities-table.component.html @@ -290,11 +290,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 103 + 85 apps/client/src/app/components/admin-tag/admin-tag.component.html - 96 + 78 libs/ui/src/lib/account-balances/account-balances.component.html @@ -404,6 +404,10 @@ Asset Profiles Anlageprofile + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 52 + libs/ui/src/lib/assistant/assistant.html 67 @@ -774,7 +778,7 @@ Benutzer apps/client/src/app/components/admin-tag/admin-tag.component.html - 44 + 31 apps/client/src/app/components/header/header.component.html @@ -842,7 +846,7 @@ Konten apps/client/src/app/components/admin-platform/admin-platform.component.html - 65 + 52 apps/client/src/app/components/admin-users/admin-users.html @@ -1334,7 +1338,7 @@ Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 117 + 143 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3946,7 +3950,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 51 + 38 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -3966,7 +3970,7 @@ Plattformen apps/client/src/app/components/admin-settings/admin-settings.component.html - 111 + 137 @@ -4001,12 +4005,12 @@ 47 - + Add Platform Plattform hinzufügen apps/client/src/app/components/admin-platform/admin-platform.component.html - 11 + 8 @@ -5846,12 +5850,12 @@ 49 - + Add Tag Tag hinzufügen apps/client/src/app/components/admin-tag/admin-tag.component.html - 11 + 8 @@ -7307,7 +7311,7 @@ API-Schlüssel setzen apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 @@ -7413,7 +7417,7 @@ von apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 75 @@ -7421,7 +7425,7 @@ täglichen Anfragen apps/client/src/app/components/admin-settings/admin-settings.component.html - 46 + 77 @@ -7429,7 +7433,7 @@ API-Schlüssel löschen apps/client/src/app/components/admin-settings/admin-settings.component.html - 76 + 102 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index de9f07c8d..535415181 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -103,7 +103,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 58 + 45 apps/client/src/app/components/admin-users/admin-users.html @@ -139,7 +139,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 30 + 22 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -151,7 +151,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 30 + 22 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -259,11 +259,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 92 + 74 apps/client/src/app/components/admin-tag/admin-tag.component.html - 85 + 67 libs/ui/src/lib/activities-table/activities-table.component.html @@ -291,11 +291,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 103 + 85 apps/client/src/app/components/admin-tag/admin-tag.component.html - 96 + 78 libs/ui/src/lib/account-balances/account-balances.component.html @@ -405,6 +405,10 @@ Asset Profiles Perfiles de activos. + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 52 + libs/ui/src/lib/assistant/assistant.html 67 @@ -759,7 +763,7 @@ Usuario apps/client/src/app/components/admin-tag/admin-tag.component.html - 44 + 31 apps/client/src/app/components/header/header.component.html @@ -827,7 +831,7 @@ Cuentas apps/client/src/app/components/admin-platform/admin-platform.component.html - 65 + 52 apps/client/src/app/components/admin-users/admin-users.html @@ -1319,7 +1323,7 @@ Etiquetas apps/client/src/app/components/admin-settings/admin-settings.component.html - 117 + 143 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3923,7 +3927,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 51 + 38 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -3943,7 +3947,7 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 111 + 137 @@ -3978,12 +3982,12 @@ 47 - + Add Platform Add Platform apps/client/src/app/components/admin-platform/admin-platform.component.html - 11 + 8 @@ -5823,12 +5827,12 @@ 49 - + Add Tag Add Tag apps/client/src/app/components/admin-tag/admin-tag.component.html - 11 + 8 @@ -7284,7 +7288,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 @@ -7390,7 +7394,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 75 @@ -7398,7 +7402,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 46 + 77 @@ -7406,7 +7410,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 76 + 102 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 5077a4010..becc95d5d 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -110,7 +110,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 58 + 45 apps/client/src/app/components/admin-users/admin-users.html @@ -146,7 +146,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 30 + 22 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -158,7 +158,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 30 + 22 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -314,11 +314,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 92 + 74 apps/client/src/app/components/admin-tag/admin-tag.component.html - 85 + 67 libs/ui/src/lib/activities-table/activities-table.component.html @@ -346,11 +346,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 103 + 85 apps/client/src/app/components/admin-tag/admin-tag.component.html - 96 + 78 libs/ui/src/lib/account-balances/account-balances.component.html @@ -460,6 +460,10 @@ Asset Profiles Profil d’Actifs + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 52 + libs/ui/src/lib/assistant/assistant.html 67 @@ -926,7 +930,7 @@ Étiquettes apps/client/src/app/components/admin-settings/admin-settings.component.html - 117 + 143 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1018,7 +1022,7 @@ Utilisateur apps/client/src/app/components/admin-tag/admin-tag.component.html - 44 + 31 apps/client/src/app/components/header/header.component.html @@ -1038,7 +1042,7 @@ Comptes apps/client/src/app/components/admin-platform/admin-platform.component.html - 65 + 52 apps/client/src/app/components/admin-users/admin-users.html @@ -3922,7 +3926,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 51 + 38 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -3942,7 +3946,7 @@ Platformes apps/client/src/app/components/admin-settings/admin-settings.component.html - 111 + 137 @@ -3977,12 +3981,12 @@ 47 - + Add Platform Ajoutez une Plateforme apps/client/src/app/components/admin-platform/admin-platform.component.html - 11 + 8 @@ -5822,12 +5826,12 @@ 49 - + Add Tag Ajouter un Tag apps/client/src/app/components/admin-tag/admin-tag.component.html - 11 + 8 @@ -7283,7 +7287,7 @@ Définir clé API apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 @@ -7389,7 +7393,7 @@ sur apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 75 @@ -7397,7 +7401,7 @@ requêtes journalières apps/client/src/app/components/admin-settings/admin-settings.component.html - 46 + 77 @@ -7405,7 +7409,7 @@ Retirer la clé API apps/client/src/app/components/admin-settings/admin-settings.component.html - 76 + 102 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 57a3b7162..a3605173f 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -103,7 +103,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 58 + 45 apps/client/src/app/components/admin-users/admin-users.html @@ -139,7 +139,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 30 + 22 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -151,7 +151,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 30 + 22 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -259,11 +259,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 92 + 74 apps/client/src/app/components/admin-tag/admin-tag.component.html - 85 + 67 libs/ui/src/lib/activities-table/activities-table.component.html @@ -291,11 +291,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 103 + 85 apps/client/src/app/components/admin-tag/admin-tag.component.html - 96 + 78 libs/ui/src/lib/account-balances/account-balances.component.html @@ -405,6 +405,10 @@ Asset Profiles Profilo dell’asset + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 52 + libs/ui/src/lib/assistant/assistant.html 67 @@ -759,7 +763,7 @@ Utente apps/client/src/app/components/admin-tag/admin-tag.component.html - 44 + 31 apps/client/src/app/components/header/header.component.html @@ -827,7 +831,7 @@ Account apps/client/src/app/components/admin-platform/admin-platform.component.html - 65 + 52 apps/client/src/app/components/admin-users/admin-users.html @@ -1319,7 +1323,7 @@ Tag apps/client/src/app/components/admin-settings/admin-settings.component.html - 117 + 143 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3923,7 +3927,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 51 + 38 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -3943,7 +3947,7 @@ Piattaforme apps/client/src/app/components/admin-settings/admin-settings.component.html - 111 + 137 @@ -3978,12 +3982,12 @@ 47 - + Add Platform Aggiungi la piattaforma apps/client/src/app/components/admin-platform/admin-platform.component.html - 11 + 8 @@ -5823,12 +5827,12 @@ 49 - + Add Tag Aggiungi un Tag apps/client/src/app/components/admin-tag/admin-tag.component.html - 11 + 8 @@ -7284,7 +7288,7 @@ Imposta API Key apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 @@ -7390,7 +7394,7 @@ di apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 75 @@ -7398,7 +7402,7 @@ richieste giornaliere apps/client/src/app/components/admin-settings/admin-settings.component.html - 46 + 77 @@ -7406,7 +7410,7 @@ Rimuovi API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 76 + 102 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 1099d5235..f57b34e88 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -102,7 +102,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 58 + 45 apps/client/src/app/components/admin-users/admin-users.html @@ -138,7 +138,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 30 + 22 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -150,7 +150,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 30 + 22 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -258,11 +258,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 92 + 74 apps/client/src/app/components/admin-tag/admin-tag.component.html - 85 + 67 libs/ui/src/lib/activities-table/activities-table.component.html @@ -290,11 +290,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 103 + 85 apps/client/src/app/components/admin-tag/admin-tag.component.html - 96 + 78 libs/ui/src/lib/account-balances/account-balances.component.html @@ -404,6 +404,10 @@ Asset Profiles Activa Profiel + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 52 + libs/ui/src/lib/assistant/assistant.html 67 @@ -758,7 +762,7 @@ Gebruiker apps/client/src/app/components/admin-tag/admin-tag.component.html - 44 + 31 apps/client/src/app/components/header/header.component.html @@ -826,7 +830,7 @@ Rekeningen apps/client/src/app/components/admin-platform/admin-platform.component.html - 65 + 52 apps/client/src/app/components/admin-users/admin-users.html @@ -1318,7 +1322,7 @@ Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 117 + 143 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3922,7 +3926,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 51 + 38 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -3942,7 +3946,7 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 111 + 137 @@ -3977,12 +3981,12 @@ 47 - + Add Platform Platform Toevoegen apps/client/src/app/components/admin-platform/admin-platform.component.html - 11 + 8 @@ -5822,12 +5826,12 @@ 49 - + Add Tag Label Toevoegen apps/client/src/app/components/admin-tag/admin-tag.component.html - 11 + 8 @@ -7283,7 +7287,7 @@ API-sleutel instellen apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 @@ -7389,7 +7393,7 @@ van apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 75 @@ -7397,7 +7401,7 @@ dagelijkse verzoeken apps/client/src/app/components/admin-settings/admin-settings.component.html - 46 + 77 @@ -7405,7 +7409,7 @@ Verwijder API-sleutel apps/client/src/app/components/admin-settings/admin-settings.component.html - 76 + 102 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index c62b42f69..40ca77ad9 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -915,7 +915,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 58 + 45 apps/client/src/app/components/admin-users/admin-users.html @@ -979,7 +979,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 30 + 22 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -991,7 +991,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 30 + 22 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1131,11 +1131,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 92 + 74 apps/client/src/app/components/admin-tag/admin-tag.component.html - 85 + 67 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1163,11 +1163,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 103 + 85 apps/client/src/app/components/admin-tag/admin-tag.component.html - 96 + 78 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1938,12 +1938,12 @@ 174 - + Add Platform Dodaj Platformę apps/client/src/app/components/admin-platform/admin-platform.component.html - 11 + 8 @@ -1959,7 +1959,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 51 + 38 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -1971,7 +1971,7 @@ Konta apps/client/src/app/components/admin-platform/admin-platform.component.html - 65 + 52 apps/client/src/app/components/admin-users/admin-users.html @@ -2023,7 +2023,7 @@ Platformy apps/client/src/app/components/admin-settings/admin-settings.component.html - 111 + 137 @@ -2031,7 +2031,7 @@ Tagi apps/client/src/app/components/admin-settings/admin-settings.component.html - 117 + 143 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2042,12 +2042,12 @@ 16 - + Add Tag Dodaj Tag apps/client/src/app/components/admin-tag/admin-tag.component.html - 11 + 8 @@ -2239,7 +2239,7 @@ Użytkownik apps/client/src/app/components/admin-tag/admin-tag.component.html - 44 + 31 apps/client/src/app/components/header/header.component.html @@ -5545,6 +5545,10 @@ Asset Profiles Profile aktywów + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 52 + libs/ui/src/lib/assistant/assistant.html 67 @@ -7283,7 +7287,7 @@ Skonfiguruj klucz API apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 @@ -7389,7 +7393,7 @@ z apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 75 @@ -7397,7 +7401,7 @@ codzienne żądania apps/client/src/app/components/admin-settings/admin-settings.component.html - 46 + 77 @@ -7405,7 +7409,7 @@ Usuń klucz API apps/client/src/app/components/admin-settings/admin-settings.component.html - 76 + 102 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 535aa5acf..a6a4f98e2 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -110,7 +110,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 58 + 45 apps/client/src/app/components/admin-users/admin-users.html @@ -146,7 +146,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 30 + 22 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -158,7 +158,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 30 + 22 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -314,11 +314,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 92 + 74 apps/client/src/app/components/admin-tag/admin-tag.component.html - 85 + 67 libs/ui/src/lib/activities-table/activities-table.component.html @@ -346,11 +346,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 103 + 85 apps/client/src/app/components/admin-tag/admin-tag.component.html - 96 + 78 libs/ui/src/lib/account-balances/account-balances.component.html @@ -460,6 +460,10 @@ Asset Profiles Perfil de Ativos + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 52 + libs/ui/src/lib/assistant/assistant.html 67 @@ -890,7 +894,7 @@ Utilizador apps/client/src/app/components/admin-tag/admin-tag.component.html - 44 + 31 apps/client/src/app/components/header/header.component.html @@ -910,7 +914,7 @@ Contas apps/client/src/app/components/admin-platform/admin-platform.component.html - 65 + 52 apps/client/src/app/components/admin-users/admin-users.html @@ -1622,7 +1626,7 @@ Marcadores apps/client/src/app/components/admin-settings/admin-settings.component.html - 117 + 143 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -3922,7 +3926,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 51 + 38 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -3942,7 +3946,7 @@ Plataformas apps/client/src/app/components/admin-settings/admin-settings.component.html - 111 + 137 @@ -3977,12 +3981,12 @@ 47 - + Add Platform Adicionar Plataforma apps/client/src/app/components/admin-platform/admin-platform.component.html - 11 + 8 @@ -5822,12 +5826,12 @@ 49 - + Add Tag Add Tag apps/client/src/app/components/admin-tag/admin-tag.component.html - 11 + 8 @@ -7283,7 +7287,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 @@ -7389,7 +7393,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 75 @@ -7397,7 +7401,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 46 + 77 @@ -7405,7 +7409,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 76 + 102 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 400bed697..139b727fe 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -903,7 +903,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 58 + 45 apps/client/src/app/components/admin-users/admin-users.html @@ -939,7 +939,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 30 + 22 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -951,7 +951,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 30 + 22 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1091,11 +1091,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 92 + 74 apps/client/src/app/components/admin-tag/admin-tag.component.html - 85 + 67 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1123,11 +1123,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 103 + 85 apps/client/src/app/components/admin-tag/admin-tag.component.html - 96 + 78 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1237,6 +1237,10 @@ Asset Profiles Varlık Profili + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 52 + libs/ui/src/lib/assistant/assistant.html 67 @@ -1763,7 +1767,7 @@ Etiketler apps/client/src/app/components/admin-settings/admin-settings.component.html - 117 + 143 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1842,12 +1846,12 @@ 174 - + Add Platform Platform Ekle apps/client/src/app/components/admin-platform/admin-platform.component.html - 11 + 8 @@ -1863,7 +1867,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 51 + 38 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -1875,7 +1879,7 @@ Hesaplar apps/client/src/app/components/admin-platform/admin-platform.component.html - 65 + 52 apps/client/src/app/components/admin-users/admin-users.html @@ -1927,7 +1931,7 @@ Platformlar apps/client/src/app/components/admin-settings/admin-settings.component.html - 111 + 137 @@ -1943,7 +1947,7 @@ Kullanıcı apps/client/src/app/components/admin-tag/admin-tag.component.html - 44 + 31 apps/client/src/app/components/header/header.component.html @@ -5822,12 +5826,12 @@ 37 - + Add Tag Etiket Ekleyiniz apps/client/src/app/components/admin-tag/admin-tag.component.html - 11 + 8 @@ -7283,7 +7287,7 @@ API anahtarını ayarla apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 @@ -7389,7 +7393,7 @@ ın apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 75 @@ -7397,7 +7401,7 @@ günlük istekler apps/client/src/app/components/admin-settings/admin-settings.component.html - 46 + 77 @@ -7405,7 +7409,7 @@ API anahtarını kaldır apps/client/src/app/components/admin-settings/admin-settings.component.html - 76 + 102 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 56b5ba426..b095cbbff 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -975,7 +975,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 58 + 45 apps/client/src/app/components/admin-users/admin-users.html @@ -1067,7 +1067,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 30 + 22 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -1079,7 +1079,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 30 + 22 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1219,11 +1219,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 92 + 74 apps/client/src/app/components/admin-tag/admin-tag.component.html - 85 + 67 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1251,11 +1251,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 103 + 85 apps/client/src/app/components/admin-tag/admin-tag.component.html - 96 + 78 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1791,7 +1791,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 51 + 38 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -2114,12 +2114,12 @@ 174 - + Add Platform Додати платформу apps/client/src/app/components/admin-platform/admin-platform.component.html - 11 + 8 @@ -2127,7 +2127,7 @@ Рахунки apps/client/src/app/components/admin-platform/admin-platform.component.html - 65 + 52 apps/client/src/app/components/admin-users/admin-users.html @@ -2199,7 +2199,7 @@ з apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 75 @@ -2207,7 +2207,7 @@ щоденних запитів apps/client/src/app/components/admin-settings/admin-settings.component.html - 46 + 77 @@ -2215,7 +2215,7 @@ Вилучити ключ API apps/client/src/app/components/admin-settings/admin-settings.component.html - 76 + 102 @@ -2223,7 +2223,7 @@ Встановити ключ API apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 @@ -2231,7 +2231,7 @@ Платформи apps/client/src/app/components/admin-settings/admin-settings.component.html - 111 + 137 @@ -2239,7 +2239,7 @@ Теги apps/client/src/app/components/admin-settings/admin-settings.component.html - 117 + 143 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2306,12 +2306,12 @@ 39 - + Add Tag Додати тег apps/client/src/app/components/admin-tag/admin-tag.component.html - 11 + 8 @@ -2319,7 +2319,7 @@ Користувач apps/client/src/app/components/admin-tag/admin-tag.component.html - 44 + 31 apps/client/src/app/components/header/header.component.html @@ -6703,6 +6703,10 @@ Asset Profiles Профілі активів + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 52 + libs/ui/src/lib/assistant/assistant.html 67 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 70458fffd..e769e7152 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -883,7 +883,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 58 + 45 apps/client/src/app/components/admin-users/admin-users.html @@ -951,7 +951,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 30 + 22 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -963,7 +963,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 30 + 22 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1099,11 +1099,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 92 + 74 apps/client/src/app/components/admin-tag/admin-tag.component.html - 85 + 67 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1130,11 +1130,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 103 + 85 apps/client/src/app/components/admin-tag/admin-tag.component.html - 96 + 78 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1863,11 +1863,11 @@ 174 - + Add Platform apps/client/src/app/components/admin-platform/admin-platform.component.html - 11 + 8 @@ -1882,7 +1882,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 51 + 38 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -1893,7 +1893,7 @@ Accounts apps/client/src/app/components/admin-platform/admin-platform.component.html - 65 + 52 apps/client/src/app/components/admin-users/admin-users.html @@ -1941,14 +1941,14 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 111 + 137 Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 117 + 143 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1959,11 +1959,11 @@ 16 - + Add Tag apps/client/src/app/components/admin-tag/admin-tag.component.html - 11 + 8 @@ -2134,7 +2134,7 @@ User apps/client/src/app/components/admin-tag/admin-tag.component.html - 44 + 31 apps/client/src/app/components/header/header.component.html @@ -5129,6 +5129,10 @@ Asset Profiles + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 52 + libs/ui/src/lib/assistant/assistant.html 67 @@ -6623,7 +6627,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 @@ -6725,7 +6729,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 75 @@ -6746,14 +6750,14 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 76 + 102 daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 46 + 77 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 12cbd3ed0..e57fec28f 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -916,7 +916,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 58 + 45 apps/client/src/app/components/admin-users/admin-users.html @@ -988,7 +988,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 30 + 22 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -1000,7 +1000,7 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html - 30 + 22 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1140,11 +1140,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 92 + 74 apps/client/src/app/components/admin-tag/admin-tag.component.html - 85 + 67 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1172,11 +1172,11 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 103 + 85 apps/client/src/app/components/admin-tag/admin-tag.component.html - 96 + 78 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1947,12 +1947,12 @@ 174 - + Add Platform 添加平台 apps/client/src/app/components/admin-platform/admin-platform.component.html - 11 + 8 @@ -1968,7 +1968,7 @@ apps/client/src/app/components/admin-platform/admin-platform.component.html - 51 + 38 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -1980,7 +1980,7 @@ 帐户 apps/client/src/app/components/admin-platform/admin-platform.component.html - 65 + 52 apps/client/src/app/components/admin-users/admin-users.html @@ -2032,7 +2032,7 @@ 平台 apps/client/src/app/components/admin-settings/admin-settings.component.html - 111 + 137 @@ -2040,7 +2040,7 @@ 标签 apps/client/src/app/components/admin-settings/admin-settings.component.html - 117 + 143 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2051,12 +2051,12 @@ 16 - + Add Tag 添加标签 apps/client/src/app/components/admin-tag/admin-tag.component.html - 11 + 8 @@ -2248,7 +2248,7 @@ 用户 apps/client/src/app/components/admin-tag/admin-tag.component.html - 44 + 31 apps/client/src/app/components/header/header.component.html @@ -5586,6 +5586,10 @@ Asset Profiles 资产概况 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 52 + libs/ui/src/lib/assistant/assistant.html 67 @@ -7284,7 +7288,7 @@ 设置 API 密钥 apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 @@ -7390,7 +7394,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 75 @@ -7398,7 +7402,7 @@ 每日请求 apps/client/src/app/components/admin-settings/admin-settings.component.html - 46 + 77 @@ -7406,7 +7410,7 @@ 移除 API 密钥 apps/client/src/app/components/admin-settings/admin-settings.component.html - 76 + 102 From 57c43e5815b4b26f4769a94cc480d30125d1a8c6 Mon Sep 17 00:00:00 2001 From: Gadi Cohen Date: Sun, 18 May 2025 19:45:00 +0100 Subject: [PATCH 81/91] Feature/upgrade yahoo-finance2 to version 3.3.2 (#4721) * Upgrade yahoo-finance2 to version 3.3.2 * Update changelog --- CHANGELOG.md | 2 +- package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e140bef44..87d833bf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,7 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the language localization for Italian (`it`) - Upgraded `countup.js` from version `2.8.0` to `2.8.2` - Upgraded `nestjs` from version `10.4.15` to `11.0.12` -- Upgraded `yahoo-finance2` from version `2.11.3` to `3.3.1` +- Upgraded `yahoo-finance2` from version `2.11.3` to `3.3.2` ### Fixed diff --git a/package-lock.json b/package-lock.json index b2e0f3b9f..bf48e51fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -89,7 +89,7 @@ "svgmap": "2.12.2", "twitter-api-v2": "1.14.2", "uuid": "11.1.0", - "yahoo-finance2": "3.3.1", + "yahoo-finance2": "3.3.2", "zone.js": "0.15.0" }, "devDependencies": { @@ -36091,9 +36091,9 @@ } }, "node_modules/yahoo-finance2": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.3.1.tgz", - "integrity": "sha512-hBXdhieq897OoAu2HxA4/Ca+XrYtPFLTtGzPRW5qKCd+nX1ahHID3tmvxVBBlDTeOesdp0wjO5uGJS+o4cnEMw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.3.2.tgz", + "integrity": "sha512-KJLrcEwG+PFxe7L2iXe1R9icceFChENA+2EdFo/6GYIFVJR4YJD3MrjIsAYfGuzK531EjDLyT4KSlpIkaKhhgw==", "license": "MIT", "dependencies": { "@deno/shim-deno": "~0.18.0", diff --git a/package.json b/package.json index a995a8a47..822f025b1 100644 --- a/package.json +++ b/package.json @@ -135,7 +135,7 @@ "svgmap": "2.12.2", "twitter-api-v2": "1.14.2", "uuid": "11.1.0", - "yahoo-finance2": "3.3.1", + "yahoo-finance2": "3.3.2", "zone.js": "0.15.0" }, "devDependencies": { From a0f377e8eb0886226415bf645e9f5a8b00411f80 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 19 May 2025 23:27:52 +0200 Subject: [PATCH 82/91] Feature/refactor ordersCount to activityCount (#4688) * Refactor ordersCount to activityCount --- apps/api/src/app/portfolio/portfolio.service.ts | 16 ++++++++-------- apps/api/src/helper/object.helper.spec.ts | 4 ++-- .../portfolio-summary.component.html | 6 +++--- .../interfaces/portfolio-summary.interface.ts | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index c580ce149..7e373c4cc 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1249,7 +1249,7 @@ export class PortfolioService { const rules: PortfolioReportResponse['rules'] = { accountClusterRisk: - summary.ordersCount > 0 + summary.activityCount > 0 ? await this.rulesService.evaluate( [ new AccountClusterRiskCurrentInvestment( @@ -1265,7 +1265,7 @@ export class PortfolioService { ) : undefined, assetClassClusterRisk: - summary.ordersCount > 0 + summary.activityCount > 0 ? await this.rulesService.evaluate( [ new AssetClassClusterRiskEquity( @@ -1281,7 +1281,7 @@ export class PortfolioService { ) : undefined, currencyClusterRisk: - summary.ordersCount > 0 + summary.activityCount > 0 ? await this.rulesService.evaluate( [ new CurrencyClusterRiskBaseCurrencyCurrentInvestment( @@ -1297,7 +1297,7 @@ export class PortfolioService { ) : undefined, economicMarketClusterRisk: - summary.ordersCount > 0 + summary.activityCount > 0 ? await this.rulesService.evaluate( [ new EconomicMarketClusterRiskDevelopedMarkets( @@ -1338,7 +1338,7 @@ export class PortfolioService { userSettings ), regionalMarketClusterRisk: - summary.ordersCount > 0 + summary.activityCount > 0 ? await this.rulesService.evaluate( [ new RegionalMarketClusterRiskAsiaPacific( @@ -1981,6 +1981,9 @@ export class PortfolioService { netPerformanceWithCurrencyEffect, totalBuy, totalSell, + activityCount: activities.filter(({ type }) => { + return ['BUY', 'SELL'].includes(type); + }).length, committedFunds: committedFunds.toNumber(), currentValueInBaseCurrency: currentValueInBaseCurrency.toNumber(), dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), @@ -2008,9 +2011,6 @@ export class PortfolioService { interest: interest.toNumber(), items: valuables.toNumber(), liabilities: liabilities.toNumber(), - ordersCount: activities.filter(({ type }) => { - return ['BUY', 'SELL'].includes(type); - }).length, totalInvestment: totalInvestment.toNumber(), totalValueInBaseCurrency: netWorth }; diff --git a/apps/api/src/helper/object.helper.spec.ts b/apps/api/src/helper/object.helper.spec.ts index b0370fa3f..d7caf9bc9 100644 --- a/apps/api/src/helper/object.helper.spec.ts +++ b/apps/api/src/helper/object.helper.spec.ts @@ -1515,6 +1515,7 @@ describe('redactAttributes', () => { } }, summary: { + activityCount: 29, annualizedPerformancePercent: 0.16690880197786, annualizedPerformancePercentWithCurrencyEffect: 0.1694019484552876, cash: null, @@ -1538,7 +1539,6 @@ describe('redactAttributes', () => { interest: null, items: null, liabilities: null, - ordersCount: 29, totalInvestment: null, totalValueInBaseCurrency: null, currentNetWorth: null @@ -3018,6 +3018,7 @@ describe('redactAttributes', () => { } }, summary: { + activityCount: 29, annualizedPerformancePercent: 0.16690880197786, annualizedPerformancePercentWithCurrencyEffect: 0.1694019484552876, cash: null, @@ -3041,7 +3042,6 @@ describe('redactAttributes', () => { interest: null, items: null, liabilities: null, - ordersCount: 29, totalInvestment: null, totalValueInBaseCurrency: null, currentNetWorth: null diff --git a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html index 1a52bd646..265904b88 100644 --- a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html +++ b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -7,11 +7,11 @@
    - {{ summary?.ordersCount }} - {summary?.ordersCount, plural, + {{ summary?.activityCount }} + {summary?.activityCount, plural, =1 {activity} other {activities} } diff --git a/libs/common/src/lib/interfaces/portfolio-summary.interface.ts b/libs/common/src/lib/interfaces/portfolio-summary.interface.ts index 42496b228..4030b9001 100644 --- a/libs/common/src/lib/interfaces/portfolio-summary.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-summary.interface.ts @@ -1,6 +1,7 @@ import { PortfolioPerformance } from './portfolio-performance.interface'; export interface PortfolioSummary extends PortfolioPerformance { + activityCount: number; annualizedPerformancePercent: number; annualizedPerformancePercentWithCurrencyEffect: number; cash: number; @@ -21,7 +22,6 @@ export interface PortfolioSummary extends PortfolioPerformance { interest: number; items: number; liabilities: number; - ordersCount: number; totalBuy: number; totalSell: number; totalValueInBaseCurrency?: number; From c2c628e77c2d41428a5bf5d4d9f9ca99e3975ec3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 22:46:41 +0100 Subject: [PATCH 83/91] Feature/update locales (#4726) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 2 +- apps/client/src/locales/messages.de.xlf | 2 +- apps/client/src/locales/messages.es.xlf | 2 +- apps/client/src/locales/messages.fr.xlf | 2 +- apps/client/src/locales/messages.it.xlf | 2 +- apps/client/src/locales/messages.nl.xlf | 2 +- apps/client/src/locales/messages.pl.xlf | 2 +- apps/client/src/locales/messages.pt.xlf | 2 +- apps/client/src/locales/messages.tr.xlf | 2 +- apps/client/src/locales/messages.uk.xlf | 2 +- apps/client/src/locales/messages.xlf | 2 +- apps/client/src/locales/messages.zh.xlf | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index d0f37ead8..4e4e7e62d 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -2902,7 +2902,7 @@ 3 - + {VAR_PLURAL, plural, =1 {activity} other {activities}} {VAR_PLURAL, plural, =1 {activity} other {activities}} diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 7671b9e32..f61c91c7e 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -6586,7 +6586,7 @@ 48 - + {VAR_PLURAL, plural, =1 {activity} other {activities}} {VAR_PLURAL, plural, =1 {Aktivität} other {Aktivitäten}} diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 535415181..49af34834 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -6563,7 +6563,7 @@ 48 - + {VAR_PLURAL, plural, =1 {activity} other {activities}} {VAR_PLURAL, plural, =1 {activity} other {activities}} diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index becc95d5d..946533d94 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -6562,7 +6562,7 @@ 48 - + {VAR_PLURAL, plural, =1 {activity} other {activities}} {VAR_PLURAL, plural, =1 {activity} autres {activities}} diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index a3605173f..37c66bfd8 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -6563,7 +6563,7 @@ 48 - + {VAR_PLURAL, plural, =1 {activity} other {activities}} {VAR_PLURAL, plural, =1 {attività} other {attività}} diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index f57b34e88..ca56dcc82 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -6562,7 +6562,7 @@ 48 - + {VAR_PLURAL, plural, =1 {activity} other {activities}} {VAR_PLURAL, plural, =1 {activiteit} other {activiteiten}} diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 40ca77ad9..ab45fe323 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -6562,7 +6562,7 @@ 48 - + {VAR_PLURAL, plural, =1 {activity} other {activities}} {VAR_PLURAL, plural, =1 {activity} other {activities}} diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index a6a4f98e2..3755a9248 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -6562,7 +6562,7 @@ 48 - + {VAR_PLURAL, plural, =1 {activity} other {activities}} {VAR_PLURAL, plural, =1 {activity} other {activities}} diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 139b727fe..2064777a6 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -6562,7 +6562,7 @@ 48 - + {VAR_PLURAL, plural, =1 {activity} other {activities}} {VAR_PLURAL, plural, =1 {Etkinlik} other {Etkinlikler}} diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index b095cbbff..5f768b379 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -2982,7 +2982,7 @@ 3 - + {VAR_PLURAL, plural, =1 {activity} other {activities}} {VAR_PLURAL, plural, =1 {дія} other {дій}} diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index e769e7152..472529903 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -6000,7 +6000,7 @@ 8 - + {VAR_PLURAL, plural, =1 {activity} other {activities}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index e57fec28f..1697a5197 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -6563,7 +6563,7 @@ 48 - + {VAR_PLURAL, plural, =1 {activity} other {activities}} {VAR_PLURAL, plural, =1 {活动} other {活动}} From 70a4697f54bc86958d220496647e0976e98472af Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 20 May 2025 08:22:49 +0100 Subject: [PATCH 84/91] Feature/remove deprecated endpoints in admin controller (#4687) * Remove deprecated endpoints * Update changelog --- CHANGELOG.md | 3 + apps/api/src/app/admin/admin.controller.ts | 70 ---------------------- 2 files changed, 3 insertions(+), 70 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87d833bf7..5b9c056dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Extended the data providers management of the admin control panel by the asset profile count - Restricted the permissions of the demo user - Renamed `Order` to `activities` in the `User` database schema +- Removed the deprecated endpoint `GET api/v1/admin/market-data/:dataSource/:symbol` +- Removed the deprecated endpoint `POST api/v1/admin/market-data/:dataSource/:symbol` +- Removed the deprecated endpoint `PUT api/v1/admin/market-data/:dataSource/:symbol/:dateString` - Improved the language localization for Catalan (`ca`) - Improved the language localization for Chinese (`zh`) - Improved the language localization for Dutch (`nl`) diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index d8507bbb0..736f6da33 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -3,7 +3,6 @@ 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 { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { PropertyDto } from '@ghostfolio/api/services/property/property.dto'; import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; import { @@ -16,7 +15,6 @@ import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { AdminData, AdminMarketData, - AdminMarketDataDetails, AdminUsers, EnhancedSymbolProfile } from '@ghostfolio/common/interfaces'; @@ -50,8 +48,6 @@ import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { AdminService } from './admin.service'; import { UpdateAssetProfileDto } from './update-asset-profile.dto'; -import { UpdateBulkMarketDataDto } from './update-bulk-market-data.dto'; -import { UpdateMarketDataDto } from './update-market-data.dto'; @Controller('admin') export class AdminController { @@ -60,7 +56,6 @@ export class AdminController { private readonly apiService: ApiService, private readonly dataGatheringService: DataGatheringService, private readonly manualService: ManualService, - private readonly marketDataService: MarketDataService, @Inject(REQUEST) private readonly request: RequestWithUser ) {} @@ -214,19 +209,6 @@ export class AdminController { }); } - /** - * @deprecated - */ - @Get('market-data/:dataSource/:symbol') - @HasPermission(permissions.accessAdminControl) - @UseGuards(AuthGuard('jwt'), HasPermissionGuard) - public async getMarketDataBySymbol( - @Param('dataSource') dataSource: DataSource, - @Param('symbol') symbol: string - ): Promise { - return this.adminService.getMarketDataBySymbol({ dataSource, symbol }); - } - @HasPermission(permissions.accessAdminControl) @Post('market-data/:dataSource/:symbol/test') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @@ -253,58 +235,6 @@ export class AdminController { } } - /** - * @deprecated - */ - @HasPermission(permissions.accessAdminControl) - @Post('market-data/:dataSource/:symbol') - @UseGuards(AuthGuard('jwt'), HasPermissionGuard) - public async updateMarketData( - @Body() data: UpdateBulkMarketDataDto, - @Param('dataSource') dataSource: DataSource, - @Param('symbol') symbol: string - ) { - const dataBulkUpdate: Prisma.MarketDataUpdateInput[] = data.marketData.map( - ({ date, marketPrice }) => ({ - dataSource, - marketPrice, - symbol, - date: parseISO(date), - state: 'CLOSE' - }) - ); - - return this.marketDataService.updateMany({ - data: dataBulkUpdate - }); - } - - /** - * @deprecated - */ - @HasPermission(permissions.accessAdminControl) - @Put('market-data/:dataSource/:symbol/:dateString') - @UseGuards(AuthGuard('jwt'), HasPermissionGuard) - public async update( - @Param('dataSource') dataSource: DataSource, - @Param('dateString') dateString: string, - @Param('symbol') symbol: string, - @Body() data: UpdateMarketDataDto - ) { - const date = parseISO(dateString); - - return this.marketDataService.updateMarketData({ - data: { marketPrice: data.marketPrice, state: 'CLOSE' }, - where: { - dataSource_date_symbol: { - dataSource, - date, - symbol - } - } - }); - } - @HasPermission(permissions.accessAdminControl) @Post('profile-data/:dataSource/:symbol') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) From f63ede46b0d49228613036ba5aedfdade95af31e Mon Sep 17 00:00:00 2001 From: Fabio Carlos Date: Tue, 20 May 2025 13:02:37 -0600 Subject: [PATCH 85/91] Feature/improve language localization for IT 20250513 (#4717) * Improve language localization for IT --- apps/client/src/locales/messages.it.xlf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 37c66bfd8..acc667e17 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -7996,7 +7996,7 @@ Log out - Log out + Esci apps/client/src/app/components/header/header.component.html 315 From 294a1834b6244451cf165a34f454acdd69c5a4d3 Mon Sep 17 00:00:00 2001 From: Felix Jordan Date: Wed, 21 May 2025 01:05:02 +0600 Subject: [PATCH 86/91] Feature/improve language localization for CA 20250513 (#4719) * Improve language localization for CA --- apps/client/src/locales/messages.ca.xlf | 76 ++++++++++++------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 4e4e7e62d..275f6ab40 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -4328,7 +4328,7 @@ Why Ghostfolio? - Why Ghostfolio? + Per què Ghostfolio? apps/client/src/app/pages/landing/landing-page.html 272 @@ -4336,7 +4336,7 @@ Ghostfolio is for you if you are... - Ghostfolio is for you if you are... + Ghostfolio és per a tu si ets... apps/client/src/app/pages/landing/landing-page.html 273 @@ -4344,7 +4344,7 @@ trading stocks, ETFs or cryptocurrencies on multiple platforms - trading stocks, ETFs or cryptocurrencies on multiple platforms + negociar accions, ETF o criptomonedes en múltiples plataformes apps/client/src/app/pages/landing/landing-page.html 280 @@ -4352,7 +4352,7 @@ pursuing a buy & hold strategy - pursuing a buy & hold strategy + perseguint una compra & mantenir l’estratègia apps/client/src/app/pages/landing/landing-page.html 286 @@ -4360,7 +4360,7 @@ interested in getting insights of your portfolio composition - interested in getting insights of your portfolio composition + interessat a obtenir informació sobre la composició de la vostra cartera apps/client/src/app/pages/landing/landing-page.html 291 @@ -4368,7 +4368,7 @@ valuing privacy and data ownership - valuing privacy and data ownership + valorant la privadesa i la propietat de les dades apps/client/src/app/pages/landing/landing-page.html 296 @@ -4376,7 +4376,7 @@ into minimalism - into minimalism + al minimalisme apps/client/src/app/pages/landing/landing-page.html 299 @@ -4384,7 +4384,7 @@ caring about diversifying your financial resources - caring about diversifying your financial resources + preocupant-se per diversificar els seus recursos econòmics apps/client/src/app/pages/landing/landing-page.html 303 @@ -4392,7 +4392,7 @@ interested in financial independence - interested in financial independence + interessada en la independència financera apps/client/src/app/pages/landing/landing-page.html 307 @@ -4400,7 +4400,7 @@ saying no to spreadsheets in - saying no to spreadsheets in + dir no als fulls de càlcul apps/client/src/app/pages/landing/landing-page.html 311 @@ -4408,7 +4408,7 @@ still reading this list - still reading this list + encara llegint aquesta llista apps/client/src/app/pages/landing/landing-page.html 314 @@ -4416,7 +4416,7 @@ Learn more about Ghostfolio - Learn more about Ghostfolio + Més informació sobre Ghostfolio apps/client/src/app/pages/landing/landing-page.html 319 @@ -4424,7 +4424,7 @@ What our users are saying - What our users are saying + Que nostre usuaris estan dient apps/client/src/app/pages/landing/landing-page.html 327 @@ -4432,7 +4432,7 @@ Members from around the globe are using Ghostfolio Premium - Members from around the globe are using Ghostfolio Premium + Membres de tot el món estan utilitzant Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html 366 @@ -4440,7 +4440,7 @@ How does Ghostfolio work? - How does Ghostfolio work? + Com ho fa Ghostfolio treballar? apps/client/src/app/pages/landing/landing-page.html 383 @@ -4448,7 +4448,7 @@ Get started in only 3 steps - Get started in only 3 steps + Comença en només 3 passos apps/client/src/app/pages/landing/landing-page.html 386 @@ -4456,7 +4456,7 @@ Sign up anonymously* - Sign up anonymously* + Registra’t de manera anònima* apps/client/src/app/pages/landing/landing-page.html 392 @@ -4464,7 +4464,7 @@ * no e-mail address nor credit card required - * no e-mail address nor credit card required + * no es requereix cap adreça de correu electrònic ni targeta de crèdit apps/client/src/app/pages/landing/landing-page.html 394 @@ -4472,7 +4472,7 @@ Add any of your historical transactions - Add any of your historical transactions + Afegiu qualsevol de les vostres transaccions històriques apps/client/src/app/pages/landing/landing-page.html 405 @@ -4480,7 +4480,7 @@ Get valuable insights of your portfolio composition - Get valuable insights of your portfolio composition + Obteniu informació valuosa sobre la composició de la vostra cartera apps/client/src/app/pages/landing/landing-page.html 417 @@ -4488,7 +4488,7 @@ Are you ready? - Are you ready? + Són tu llest? apps/client/src/app/pages/landing/landing-page.html 431 @@ -4496,7 +4496,7 @@ Join now or check out the example account - Join now or check out the example account + Uneix-te ara o consulteu el compte d’exemple apps/client/src/app/pages/landing/landing-page.html 434 @@ -4504,7 +4504,7 @@ Get Started - Get Started + Comença apps/client/src/app/pages/landing/landing-page.html 446 @@ -4512,7 +4512,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. + A Ghostfolio, la transparència és la base dels nostres valors. Publiquem el codi font com a programari de codi obert (OSS) sota elLlicència AGPL-3.0 i compartim obertament mètriques clau agregades de l’estat operatiu de la plataforma. apps/client/src/app/pages/open/open-page.html 6 @@ -4520,7 +4520,7 @@ (Last 24 hours) - (Last 24 hours) + (Últimes 24 hores) apps/client/src/app/pages/open/open-page.html 37 @@ -4528,7 +4528,7 @@ Active Users - Active Users + Usuaris actius apps/client/src/app/pages/open/open-page.html 40 @@ -4540,7 +4540,7 @@ (Last 30 days) - (Last 30 days) + (Últims 30 dies) apps/client/src/app/pages/open/open-page.html 48 @@ -4552,7 +4552,7 @@ New Users - New Users + Usuaris nous apps/client/src/app/pages/open/open-page.html 51 @@ -4560,7 +4560,7 @@ Users in Slack community - Users in Slack community + Usuaris de la comunitat Slack apps/client/src/app/pages/open/open-page.html 75 @@ -4568,7 +4568,7 @@ Contributors on GitHub - Contributors on GitHub + Col·laboradors a GitHub apps/client/src/app/pages/open/open-page.html 89 @@ -4576,7 +4576,7 @@ (Last 90 days) - (Last 90 days) + (Últims 90 dies) apps/client/src/app/pages/open/open-page.html 127 @@ -4584,7 +4584,7 @@ Uptime - Uptime + Temps de funcionament apps/client/src/app/pages/open/open-page.html 132 @@ -4592,7 +4592,7 @@ Activities - Activities + Activitats apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts 13 @@ -4604,7 +4604,7 @@ Update activity - Update activity + Activitat d’actualització apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 10 @@ -4612,7 +4612,7 @@ Stocks, ETFs, bonds, cryptocurrencies, commodities - Stocks, ETFs, bonds, cryptocurrencies, commodities + Accions, ETF, bons, criptomonedes, matèries primeres apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 25 @@ -4624,7 +4624,7 @@ One-time fee, annual account fees - One-time fee, annual account fees + Comissió única, comissions de compte anual apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 33 @@ -4632,7 +4632,7 @@ Distribution of corporate earnings - Distribution of corporate earnings + Distribució dels beneficis de les empreses apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 41 @@ -4640,7 +4640,7 @@ Revenue for lending out money - Revenue for lending out money + Ingressos per prestar diners apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 49 From f361ecc732b1d8e5e7377e1e394d2cae69221af5 Mon Sep 17 00:00:00 2001 From: jlebutte Date: Tue, 20 May 2025 23:48:34 +0200 Subject: [PATCH 87/91] Feature/improve language localization for FR 20250520 (#4728) * Improve language localization for FR * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.fr.xlf | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b9c056dc..1b0d60eee 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 - 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 French (`fr`) - Improved the language localization for German (`de`) - Improved the language localization for Italian (`it`) - Upgraded `countup.js` from version `2.8.0` to `2.8.2` diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 946533d94..8079a83c6 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -471,7 +471,7 @@ Historical Market Data - Données de Marché Historiques + Données historiques du marché apps/client/src/app/components/admin-jobs/admin-jobs.html 37 @@ -535,7 +535,7 @@ Market Price - Prix du Marché + Prix du marché apps/client/src/app/components/admin-market-data/admin-market-data.html 133 @@ -1127,7 +1127,7 @@ Current Market Mood - Sentiment Actuel du Marché + Sentiment actuel du marché apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html 12 @@ -1479,7 +1479,7 @@ Time in Market - Temps sur le Marché + Temps sur le marché apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 3 @@ -2203,7 +2203,7 @@ Market Data - Données de Marché + Données du marché apps/client/src/app/pages/admin/admin-page-routing.module.ts 30 @@ -2663,7 +2663,7 @@ Developed Markets - Marchés Développés + Marchés développés apps/client/src/app/pages/portfolio/allocations/allocations-page.html 222 @@ -2675,7 +2675,7 @@ Emerging Markets - Marchés Émergents + Marchés émergents apps/client/src/app/pages/portfolio/allocations/allocations-page.html 231 @@ -4171,7 +4171,7 @@ Changelog - Historique des Modifications + Historique des modifications apps/client/src/app/pages/about/about-page.component.ts 50 @@ -4267,7 +4267,7 @@ Market Mood - Sentiment du Marché + Sentiment du marché apps/client/src/app/pages/features/features-page.html 215 @@ -4583,7 +4583,7 @@ By Market - par Marchés + par marché apps/client/src/app/pages/portfolio/allocations/allocations-page.html 175 @@ -7670,7 +7670,7 @@ Market Data - Données de Marché + Données du marché apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 374 @@ -7995,7 +7995,7 @@ Log out - Log out + Se déconnecter apps/client/src/app/components/header/header.component.html 315 From f4ef91e3bea3b0e55d325b3aeeb5694be3b93671 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 20 May 2025 22:49:54 +0100 Subject: [PATCH 88/91] Feature/upgrade twitter-api-v2 to version 1.23.0 (#4693) * Upgrade twitter-api-v2 to version 1.23.0 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b0d60eee..aaa3db02e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the language localization for Italian (`it`) - Upgraded `countup.js` from version `2.8.0` to `2.8.2` - Upgraded `nestjs` from version `10.4.15` to `11.0.12` +- Upgraded `twitter-api-v2` from version `1.14.2` to `1.23.0` - Upgraded `yahoo-finance2` from version `2.11.3` to `3.3.2` ### Fixed diff --git a/package-lock.json b/package-lock.json index bf48e51fa..94851b2e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -87,7 +87,7 @@ "rxjs": "7.8.1", "stripe": "17.3.0", "svgmap": "2.12.2", - "twitter-api-v2": "1.14.2", + "twitter-api-v2": "1.23.0", "uuid": "11.1.0", "yahoo-finance2": "3.3.2", "zone.js": "0.15.0" @@ -34027,9 +34027,9 @@ "license": "Unlicense" }, "node_modules/twitter-api-v2": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/twitter-api-v2/-/twitter-api-v2-1.14.2.tgz", - "integrity": "sha512-389e/rWaN8zWkmD5z2IpKVb5+ojPxVtrexQoGBI1Xfib1mE/9M7k7zbnZ3Q/WLwthwcWkQIlB25ecT64AL8LvQ==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/twitter-api-v2/-/twitter-api-v2-1.23.0.tgz", + "integrity": "sha512-5i1agETVpTuY68Zuk9i2B3N9wHzc4JIWw0WKyG4CEaFv9mRKmU87roa+U1oYYXTChWb0HMcqfkwoBJHYmLbeDA==", "license": "Apache-2.0" }, "node_modules/type-check": { diff --git a/package.json b/package.json index 822f025b1..50abdeea7 100644 --- a/package.json +++ b/package.json @@ -133,7 +133,7 @@ "rxjs": "7.8.1", "stripe": "17.3.0", "svgmap": "2.12.2", - "twitter-api-v2": "1.14.2", + "twitter-api-v2": "1.23.0", "uuid": "11.1.0", "yahoo-finance2": "3.3.2", "zone.js": "0.15.0" From a06872b657027c8ae73bf87d48af7bbed7e76639 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 20 May 2025 22:53:32 +0100 Subject: [PATCH 89/91] Bugfix/improve show condition of button to fetch current market price (#4700) * Improve show condition of button to fetch current market price * Update changelog --- CHANGELOG.md | 1 + .../create-or-update-activity-dialog.component.ts | 12 ++++++++---- .../create-or-update-activity-dialog.html | 4 +++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aaa3db02e..a3db392da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Displayed the button to fetch the current market price only if the activity is not in a custom currency - Fixed an issue in the watchlist endpoint (`POST`) related to the `HasPermissionGuard` ## 2.161.0 - 2025-05-06 diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts index dce045a4a..5f651195a 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts @@ -39,6 +39,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { return { id: assetSubClass, label: translate(assetSubClass) }; }); public currencies: string[] = []; + public currencyOfAssetProfile: string; public currentMarketPrice = null; public defaultDateFormat: string; public isLoading = false; @@ -63,8 +64,10 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { ) {} public ngOnInit() { - this.mode = this.data.activity.id ? 'update' : 'create'; + this.currencyOfAssetProfile = this.data.activity?.SymbolProfile?.currency; this.locale = this.data.user?.settings?.locale; + this.mode = this.data.activity?.id ? 'update' : 'create'; + this.dateAdapter.setLocale(this.locale); const { currencies, platforms } = this.dataService.fetchInfo(); @@ -210,7 +213,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { this.activityForm.get('type').value ) ) { - this.updateSymbol(); + this.updateAssetProfile(); } this.changeDetectorRef.markForCheck(); @@ -397,7 +400,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { this.dialogRef.close(activity); } else { - (activity as UpdateOrderDto).id = this.data.activity.id; + (activity as UpdateOrderDto).id = this.data.activity?.id; await validateObjectForForm({ classDto: UpdateOrderDto, @@ -422,7 +425,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { this.unsubscribeSubject.complete(); } - private updateSymbol() { + private updateAssetProfile() { this.isLoading = true; this.changeDetectorRef.markForCheck(); @@ -450,6 +453,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { this.activityForm.get('dataSource').setValue(dataSource); } + this.currencyOfAssetProfile = currency; this.currentMarketPrice = marketPrice; this.isLoading = false; 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 b0521530f..08e1b5162 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 @@ -230,8 +230,10 @@
    @if ( + currencyOfAssetProfile === + activityForm.get('currencyOfUnitPrice').value && currentMarketPrice && - (data.activity.type === 'BUY' || data.activity.type === 'SELL') && + ['BUY', 'SELL'].includes(data.activity.type) && isToday(activityForm.get('date')?.value) ) {