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/12] 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 babe7c3e..b6fe0d94 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/12] 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 328d7749..a7f152eb 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 78893b59..c788e87e 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/12] 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 b6b31dad..d9e41981 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/12] Feature/upgrade Nx to version 20.8.1 (#4601) * Upgrade Nx to version 20.8.1 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 741 ++++++++++++++++++++++++++++------------------ package.json | 24 +- 3 files changed, 466 insertions(+), 300 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7f152eb..5e3e6843 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 a45d5d87..4dfb2eb5 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==", + "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.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", + "@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 64fc87aa..ca6c0e92 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/12] 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 5e3e6843..f8f9ebbb 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 4dfb2eb5..91b726ef 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 ca6c0e92..a1a4add0 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/12] 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 f8f9ebbb..db9ccf9b 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 4cd4abcd..e7290270 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 6ba8f181..bfa6d550 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 d7267248..953f94e2 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/12] 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 456e1579..9e5f2b39 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 10f26cdd..766c171a 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 8ba70472..9064b626 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 c788e87e..c5ab8ac6 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 c8c1a086..4af6fdfa 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 7c5066ad..8731a8a8 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 4970c3d5..4b0db8aa 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 84a3a006..1a827b54 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 97457c7a..3f3e7d35 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 dae66111..612b8fec 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 d8a7b552..053766e5 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 6305867a..5902d171 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/12] 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 d9e41981..cf55b886 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 d98c5471..201a6392 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 b9b96f9a..92d9da83 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/12] 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 db9ccf9b..580489cd 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 b343a6e0..38a14708 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 ac1628a3..e51aee9a 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/12] 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 9e5f2b39..94b8635b 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 766c171a..afdcb125 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 9064b626..6e6f6d3f 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 c5ab8ac6..c4536731 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 4af6fdfa..e8b29147 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 8731a8a8..3ea7934a 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 4b0db8aa..99418ceb 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 1a827b54..f83a0c9c 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 3f3e7d35..7b8f9fcf 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 612b8fec..8b887cfe 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 053766e5..aa91e90d 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 5902d171..6a18716d 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/12] 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 580489cd..9cace5a3 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 2c9f7b6f..db80652c 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 850b5811..99aeb42f 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 00000000..2c5b9005 --- /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 00000000..96205fd7 --- /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 8fc17987..4c1962c1 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 fab25ae2..4b4b8f00 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 6d0cde40..87b2bc9d 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/12] 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 9cace5a3..918876f6 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 91b726ef..4557a6c6 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 a1a4add0..11123254 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",