diff --git a/.github/workflows/build-code.yml b/.github/workflows/build-code.yml index 0c3f292ba3..2a3f277143 100644 --- a/.github/workflows/build-code.yml +++ b/.github/workflows/build-code.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: node_version: - - 22.23.2 + - 22.23.4 steps: - name: Checkout code uses: actions/checkout@v4 diff --git a/CHANGELOG.md b/CHANGELOG.md index eeb316e581..926bd28651 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,11 +14,52 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Hid the performance chart on the overview page if it has less than three data points +- Added a link to the holdings tab in the holdings table on the overview tab of the home page (experimental) + +### Changed + +- Improved the market price in the benchmark detail dialog by adding the currency and reducing the precision on mobile +- Improved the style of the close button in the dialog footer component +- Improved the style of the close button in the dialog header component +- Improved the language localization for German (`de`) +- Upgraded `prettier` from version `3.9.9` to `3.9.10` + +## 3.90.0 - 2026-10-21 + +### Changed + +- Extended the variations of the interstitials for the subscription by a trial +- Deprecated the `api/v1/auth-device` endpoint in favor of the `api/v1/auth-devices` endpoint +- Deprecated the `api/v1/exchange-rate` endpoint in favor of the `api/v1/exchange-rates` endpoint +- Upgraded the `Node.js` engine from version `>=22.22.3` to `>=22.23.4` (`package.json`) +- Upgraded `@modelcontextprotocol/core` and `@modelcontextprotocol/server` from version `2.0.0` to `2.3.1` +- Upgraded `@modelcontextprotocol/node` from version `2.0.0` to `2.1.1` +- Upgraded `@rekog/mcp-nest` from version `2.0.7` to `2.0.8` +- Upgraded `undici` from version `8.11.2` to `8.12.2` + +## 3.89.0 - 2026-10-20 + +### Added + +- Added a _Storybook_ story for the file drop area component + +### Changed + +- Improved the layout of the user account settings on mobile - Improved the usability of the activities page by eliminating the reload on canceling the import activities dialog +- Improved the loading state of the file drop area component - Improved the accessibility of the _Buy me a coffee_ button on the about page - Improved the accessibility of the entity logo component +- Extracted the file drop area of the import activities dialog to a reusable component - Improved the performance of the historical market data table of the admin control panel by loading only the latest market price per asset profile - Introduced a cooldown of 12 hours for the asset profile and exchange rate gathering on activity creation by retaining the completed jobs +- Deprecated the `api/v1/platform` endpoints in favor of the `api/v1/platforms` endpoints + +### Fixed + +- Fixed the missing localization of the date picker in the _FIRE_ calculator +- Fixed the missing localization of the date picker in the asset profile details dialog of the admin control panel +- Fixed the missing tooltip of the client of the last request in the users table of the admin control panel ## 3.88.0 - 2026-10-17 diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 5b1b36afbb..0d43b42fbd 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -5,7 +5,7 @@ ### Prerequisites - [Docker](https://www.docker.com/products/docker-desktop) -- [Node.js](https://nodejs.org/en/download) (version `>=22.18.0`) +- [Node.js](https://nodejs.org/en/download) (version `>=22.23.4`) - Create a local copy of this Git repository (clone) - Copy the file `.env.dev` to `.env` and populate it with your data (`cp .env.dev .env`) diff --git a/apps/api/src/app/__snapshots__/app.module.spec.ts.snap b/apps/api/src/app/__snapshots__/app.module.spec.ts.snap new file mode 100644 index 0000000000..f5e8b793d4 --- /dev/null +++ b/apps/api/src/app/__snapshots__/app.module.spec.ts.snap @@ -0,0 +1,1227 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`AppModule should keep the security of each route 1`] = ` +{ + "DELETE /access/:id": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "deleteAccess", + }, + "DELETE /account-balance/:id": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "RedactValuesInResponseInterceptor", + ], + "permission": "deleteAccountBalance", + "scopes": [ + "account:update", + ], + }, + "DELETE /account/:id": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "RedactValuesInResponseInterceptor", + ], + "permission": "deleteAccount", + "scopes": [ + "account:delete", + ], + }, + "DELETE /activities": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + ], + "permission": "deleteActivity", + "scopes": [ + "activity:delete", + ], + }, + "DELETE /activities/:id": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "RedactValuesInResponseInterceptor", + ], + "permission": "deleteActivity", + "scopes": [ + "activity:delete", + ], + }, + "DELETE /admin/profile-data/:dataSource/:symbol": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "DELETE /admin/queue/job": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "DELETE /admin/queue/job/:id": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "DELETE /asset-profiles/:dataSource/:symbol/splits/:id": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + ], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + ], + }, + "DELETE /auth-device/:id": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "deleteAuthDevice", + }, + "DELETE /auth-devices/:id": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "deleteAuthDevice", + }, + "DELETE /benchmarks/:dataSource/:symbol": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "DELETE /platform/:id": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "deletePlatform", + }, + "DELETE /platforms/:id": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "deletePlatform", + }, + "DELETE /tags/:id": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "deleteTag", + }, + "DELETE /user": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + ], + "interceptors": [], + "permission": "deleteOwnUser", + }, + "DELETE /user/:id": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "deleteUser", + }, + "DELETE /watchlist/:dataSource/:symbol": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + ], + "permission": "deleteWatchlistItem", + "scopes": [ + "watchlist:delete", + ], + }, + "GET /access": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + }, + "GET /account": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + "RedactValuesInResponseInterceptor", + ], + "scopes": [ + "account:read", + ], + }, + "GET /account/:id": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "RedactValuesInResponseInterceptor", + ], + "scopes": [ + "account:read", + ], + }, + "GET /account/:id/balances": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "RedactValuesInResponseInterceptor", + ], + "scopes": [ + "account:read", + ], + }, + "GET /activities": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "TransformDataSourceInRequestInterceptor", + "RedactValuesInResponseInterceptor", + ], + "scopes": [ + "activity:read", + ], + }, + "GET /activities/:id": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "RedactValuesInResponseInterceptor", + ], + "scopes": [ + "activity:read", + ], + }, + "GET /admin": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "GET /admin/demo-user/sync": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "syncDemoUserAccount", + }, + "GET /admin/queue/job": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "GET /admin/queue/job/:id/execute": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "GET /admin/user": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "GET /admin/user/:id": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "GET /ai/prompt/:mode": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + ], + "permission": "readAiPrompt", + "scopes": [ + "portfolio:read", + ], + }, + "GET /asset-profiles": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "GET /asset-profiles/:dataSource/:symbol": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "TransformDataSourceInRequestInterceptor", + ], + }, + "GET /asset/:dataSource/:symbol": { + "guards": [], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "TransformDataSourceInRequestInterceptor", + ], + }, + "GET /assets/:languageCode/site.webmanifest (version neutral)": { + "guards": [], + "interceptors": [], + }, + "GET /auth/google": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('google')", + ], + "interceptors": [], + }, + "GET /auth/google/callback (version neutral)": { + "allowDuringImpersonation": true, + "guards": [ + "OAuthCallbackGuardMixin('google')", + ], + "interceptors": [], + }, + "GET /auth/oidc (version neutral)": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('oidc')", + ], + "interceptors": [], + }, + "GET /auth/oidc/callback (version neutral)": { + "allowDuringImpersonation": true, + "guards": [ + "OAuthCallbackGuardMixin('oidc')", + ], + "interceptors": [], + }, + "GET /auth/webauthn/generate-registration-options": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + }, + "GET /benchmarks": { + "allowDuringImpersonation": true, + "guards": [], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "TransformDataSourceInRequestInterceptor", + ], + }, + "GET /benchmarks/:dataSource/:symbol/:startDateString": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + ], + "scopes": [ + "portfolio:read", + ], + }, + "GET /data-providers/ghostfolio/asset-profile/:symbol": { + "guards": [ + "AuthGuard('api-key')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "enableDataProviderGhostfolio", + }, + "GET /data-providers/ghostfolio/dividends/:symbol (version 2)": { + "guards": [ + "AuthGuard('api-key')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "enableDataProviderGhostfolio", + }, + "GET /data-providers/ghostfolio/historical/:symbol (version 2)": { + "guards": [ + "AuthGuard('api-key')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "enableDataProviderGhostfolio", + }, + "GET /data-providers/ghostfolio/lookup (version 2)": { + "guards": [ + "AuthGuard('api-key')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "enableDataProviderGhostfolio", + }, + "GET /data-providers/ghostfolio/markets": { + "guards": [ + "AuthGuard('api-key')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "enableDataProviderGhostfolio", + }, + "GET /data-providers/ghostfolio/quotes (version 2)": { + "guards": [ + "AuthGuard('api-key')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "enableDataProviderGhostfolio", + }, + "GET /data-providers/ghostfolio/status (version 2)": { + "guards": [ + "AuthGuard('api-key')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "enableDataProviderGhostfolio", + }, + "GET /exchange-rate/:symbol/:dateString": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + }, + "GET /exchange-rates/:symbol/:dateString": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + }, + "GET /export": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "TransformDataSourceInRequestInterceptor", + ], + }, + "GET /health": { + "guards": [], + "interceptors": [], + }, + "GET /health/ai": { + "guards": [], + "interceptors": [], + }, + "GET /health/data-enhancer/:name": { + "guards": [], + "interceptors": [], + }, + "GET /health/data-provider/:dataSource": { + "guards": [], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + ], + }, + "GET /health/liveness": { + "guards": [], + "interceptors": [], + }, + "GET /import/dividends/:dataSource/:symbol": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "TransformDataSourceInRequestInterceptor", + ], + }, + "GET /info": { + "guards": [], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + ], + }, + "GET /logo": { + "guards": [], + "interceptors": [], + }, + "GET /logo/:dataSource/:symbol": { + "guards": [], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + ], + }, + "GET /market-data/markets": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "readMarketDataOfMarkets", + }, + "GET /platform": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "readPlatformsWithAccountCount", + }, + "GET /platforms": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "readPlatforms", + }, + "GET /portfolio/details": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "TransformDataSourceInRequestInterceptor", + "RedactValuesInResponseInterceptor", + ], + "scopes": [ + "portfolio:read", + ], + }, + "GET /portfolio/dividends": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + ], + "scopes": [ + "portfolio:read", + ], + }, + "GET /portfolio/holding/:dataSource/:symbol": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "TransformDataSourceInRequestInterceptor", + "RedactValuesInResponseInterceptor", + ], + "scopes": [ + "portfolio:read", + ], + }, + "GET /portfolio/holdings": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "TransformDataSourceInRequestInterceptor", + "RedactValuesInResponseInterceptor", + ], + "scopes": [ + "portfolio:read", + ], + }, + "GET /portfolio/investments": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + ], + "scopes": [ + "portfolio:read", + ], + }, + "GET /portfolio/performance (version 2)": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "TransformDataSourceInRequestInterceptor", + "PerformanceLoggingInterceptor", + ], + "scopes": [ + "portfolio:read", + ], + }, + "GET /portfolio/report": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [], + "scopes": [ + "portfolio:read", + ], + }, + "GET /public/:accessId/portfolio": { + "guards": [], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "RedactValuesInResponseInterceptor", + ], + }, + "GET /sitemap.xml (version neutral)": { + "guards": [], + "interceptors": [], + }, + "GET /subscription/stripe/callback": { + "allowDuringImpersonation": true, + "guards": [], + "interceptors": [], + }, + "GET /symbol/:dataSource/:symbol": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "TransformDataSourceInRequestInterceptor", + ], + }, + "GET /symbol/:dataSource/:symbol/:dateString": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + }, + "GET /symbol/lookup": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + ], + }, + "GET /tags": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "readTags", + }, + "GET /user": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "RedactValuesInResponseInterceptor", + ], + }, + "GET /watchlist": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + ], + "permission": "readWatchlist", + "scopes": [ + "watchlist:read", + ], + }, + "PATCH /admin/profile-data/:dataSource/:symbol": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "PATCH /asset-profiles/:dataSource/:symbol": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "POST /access": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "createAccess", + }, + "POST /account": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "RedactValuesInResponseInterceptor", + ], + "permission": "createAccount", + "scopes": [ + "account:create", + ], + }, + "POST /account-balance": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "RedactValuesInResponseInterceptor", + ], + "permission": "createAccountBalance", + "scopes": [ + "account:update", + ], + }, + "POST /account/transfer-balance": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [], + "permission": "updateAccount", + "scopes": [ + "account:update", + ], + }, + "POST /activities": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "TransformDataSourceInRequestInterceptor", + "RedactValuesInResponseInterceptor", + ], + "permission": "createActivity", + "scopes": [ + "activity:create", + ], + }, + "POST /admin/gather": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "POST /admin/gather/:dataSource/:symbol": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "POST /admin/gather/:dataSource/:symbol/:dateString": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "POST /admin/gather/max": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "POST /admin/gather/profile-data": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "POST /admin/gather/profile-data/:dataSource/:symbol": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "POST /admin/market-data/:dataSource/:symbol/test": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "POST /admin/profile-data/:dataSource/:symbol": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + ], + "permission": "accessAdminControl", + }, + "POST /admin/profile-data/:dataSource/:symbol/merge": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + ], + "permission": "accessAdminControl", + }, + "POST /ai/activities": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "CustomThrottlerGuard", + ], + "interceptors": [ + "MixinInterceptor", + ], + "permission": "enableGhostfolioAi", + }, + "POST /api-keys": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "createApiKey", + }, + "POST /asset-profiles/:dataSource/:symbol/splits": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + ], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + ], + }, + "POST /auth/anonymous": { + "allowDuringImpersonation": true, + "guards": [ + "CustomThrottlerGuard", + ], + "interceptors": [], + }, + "POST /auth/webauthn/generate-authentication-options": { + "allowDuringImpersonation": true, + "guards": [ + "CustomThrottlerGuard", + ], + "interceptors": [], + }, + "POST /auth/webauthn/verify-attestation": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + }, + "POST /auth/webauthn/verify-authentication": { + "allowDuringImpersonation": true, + "guards": [ + "CustomThrottlerGuard", + ], + "interceptors": [], + }, + "POST /benchmarks": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "POST /cache/flush": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "POST /import": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + "TransformDataSourceInRequestInterceptor", + ], + "permission": "createActivity", + }, + "POST /market-data/:dataSource/:symbol": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + ], + "interceptors": [], + }, + "POST /platform": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "createPlatform", + }, + "POST /platforms": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "createPlatform", + }, + "POST /subscription/redeem-coupon": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "CustomThrottlerGuard", + "HasPermissionGuard", + ], + "interceptors": [], + }, + "POST /subscription/stripe/checkout-session": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "CustomThrottlerGuard", + "HasPermissionGuard", + ], + "interceptors": [], + }, + "POST /tags": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + ], + "interceptors": [], + }, + "POST /user": { + "allowDuringImpersonation": true, + "guards": [ + "CustomThrottlerGuard", + ], + "interceptors": [], + }, + "POST /user/:id/access-token": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "POST /user/access-token": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "updateOwnAccessToken", + }, + "POST /watchlist": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + ], + "permission": "createWatchlistItem", + "scopes": [ + "watchlist:create", + ], + }, + "PUT /access/:id": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "updateAccess", + }, + "PUT /account/:id": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "RedactValuesInResponseInterceptor", + ], + "permission": "updateAccount", + "scopes": [ + "account:update", + ], + }, + "PUT /activities/:id": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + "RedactValuesInResponseInterceptor", + ], + "permission": "updateActivity", + "scopes": [ + "activity:update", + ], + }, + "PUT /admin/settings/:key": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "accessAdminControl", + }, + "PUT /platform/:id": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "updatePlatform", + }, + "PUT /platforms/:id": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "updatePlatform", + }, + "PUT /portfolio/holding/:dataSource/:symbol/tags": { + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + "ScopeGuard", + ], + "interceptors": [ + "TransformDataSourceInRequestInterceptor", + ], + "permission": "updateActivity", + "scopes": [ + "activity:update", + ], + }, + "PUT /tags/:id": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + ], + "interceptors": [], + "permission": "updateTag", + }, + "PUT /user/setting": { + "allowDuringImpersonation": true, + "guards": [ + "AuthGuard('jwt')", + "HasPermissionGuard", + "ImpersonationGuard", + ], + "interceptors": [ + "TransformDataSourceInResponseInterceptor", + ], + }, +} +`; diff --git a/apps/api/src/app/activities/activities.module.ts b/apps/api/src/app/activities/activities.module.ts index 1508917f04..6eb437af87 100644 --- a/apps/api/src/app/activities/activities.module.ts +++ b/apps/api/src/app/activities/activities.module.ts @@ -1,7 +1,5 @@ import { AccountBalanceService } from '@ghostfolio/api/app/account-balance/account-balance.service'; import { AccountService } from '@ghostfolio/api/app/account/account.service'; -import { CacheModule } from '@ghostfolio/api/app/cache/cache.module'; -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { RedactValuesInResponseModule } from '@ghostfolio/api/interceptors/redact-values-in-response/redact-values-in-response.module'; import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module'; @@ -14,6 +12,7 @@ import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impe import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { DataGatheringQueueModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; +import { RedisCacheModule } from '@ghostfolio/api/services/redis-cache/redis-cache.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { TagModule } from '@ghostfolio/api/services/tag/tag.module'; @@ -29,7 +28,6 @@ import { ActivitiesService } from './activities.service'; ApiModule, AssetProfileSplitModule, BenchmarkModule, - CacheModule, DataGatheringQueueModule, DataProviderModule, ExchangeRateDataModule, diff --git a/apps/api/src/app/app.module.spec.ts b/apps/api/src/app/app.module.spec.ts index 976e08393b..f04485ccdd 100644 --- a/apps/api/src/app/app.module.spec.ts +++ b/apps/api/src/app/app.module.spec.ts @@ -1,17 +1,26 @@ +import { ALLOW_DURING_IMPERSONATION_KEY } from '@ghostfolio/api/decorators/allow-during-impersonation.decorator'; +import { HAS_PERMISSION_KEY } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { REQUIRES_SCOPE_KEY } from '@ghostfolio/api/decorators/requires-scope.decorator'; + import { DynamicModule, ForwardReference, RequestMethod, - Type + Type, + VERSION_NEUTRAL } from '@nestjs/common'; import { GUARDS_METADATA, + INTERCEPTORS_METADATA, METHOD_METADATA, MODULE_METADATA, - PATH_METADATA + PATH_METADATA, + VERSION_METADATA } from '@nestjs/common/constants'; +import { VersionValue } from '@nestjs/common/interfaces'; import { MetadataScanner } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; +import { isUndefined, omitBy } from 'lodash-es'; import { AppModule } from './app.module'; @@ -26,6 +35,13 @@ jest.mock('ai', () => { type ModuleDefinition = DynamicModule | ForwardReference<() => Type> | Promise | Type; +/** + * The strategies of the authentication which the routes apply via + * AuthGuard(). The class of such a guard has a random name, hence the + * snapshot of the routes names it by its strategy + */ +const AUTHENTICATION_STRATEGIES = ['api-key', 'google', 'jwt', 'oidc']; + /** * The routes of the controllers which answer a request without the * authentication of a user or of an API key, sorted by the request method and @@ -98,6 +114,57 @@ async function getControllers( return [...new Set(controllers)]; } +/** + * Gives the guards or the interceptors which the decorators of the controller + * and of the route handler set, in the order in which they run + */ +function getEnhancers(key: string, controller: Type, routeHandler: object) { + return [controller, routeHandler].flatMap((target) => { + return (Reflect.getMetadata(key, target) ?? []) as Type[]; + }); +} + +/** + * Gives the metadata of the route handler or, if it has none, of the + * controller, as Reflector.getAllAndOverride() does + */ +function getMetadataOfRoute( + key: string, + controller: Type, + routeHandler: object +) { + return (Reflect.getMetadata(key, routeHandler) ?? + Reflect.getMetadata(key, controller)) as T | undefined; +} + +/** + * Gives the name of a guard or of an interceptor. The function mixin() + * replaces the name of a class by a random one, hence the name is read from + * the declaration of the class. A guard which extends AuthGuard() is named + * with its strategy + */ +function getName(enhancer: Type) { + const authenticationStrategy = AUTHENTICATION_STRATEGIES.find((strategy) => { + return AuthGuard(strategy) === enhancer; + }); + + if (authenticationStrategy) { + return `AuthGuard('${authenticationStrategy}')`; + } + + const name = /^class\s+([\w$]+)/.exec(enhancer.toString())?.[1]; + + if (!name || name === 'MixinAuthGuard') { + throw new Error('The name of a guard or of an interceptor is unknown'); + } + + const parentStrategy = AUTHENTICATION_STRATEGIES.find((strategy) => { + return Object.getPrototypeOf(enhancer) === AuthGuard(strategy); + }); + + return parentStrategy ? `${name}('${parentStrategy}')` : name; +} + /** * Gives the paths which the decorator of a controller or of a route sets */ @@ -108,14 +175,10 @@ function getPaths(target: object) { } /** - * Gives the routes of the controller which apply neither AuthGuard('api-key') - * nor AuthGuard('jwt'), each as the request method and the path + * Gives the routes of the controller, each as the request method and the path + * with its route handler */ -function getRoutesWithoutAuthentication(controller: Type) { - const authenticationGuards: unknown[] = [ - AuthGuard('api-key'), - AuthGuard('jwt') - ]; +function getRoutes(controller: Type) { const routeHandlersByName = controller.prototype as Record; return new MetadataScanner() @@ -131,19 +194,6 @@ function getRoutesWithoutAuthentication(controller: Type) { return []; } - const guards = [controller, routeHandler].flatMap((target) => { - return (Reflect.getMetadata(GUARDS_METADATA, target) ?? - []) as unknown[]; - }); - - const hasAuthentication = guards.some((guard) => { - return authenticationGuards.includes(guard); - }); - - if (hasAuthentication) { - return []; - } - return getPaths(controller).flatMap((controllerPath) => { return getPaths(routeHandler).map((routePath) => { const path = `${controllerPath}/${routePath}` @@ -151,12 +201,110 @@ function getRoutesWithoutAuthentication(controller: Type) { .filter(Boolean) .join('/'); - return `${RequestMethod[requestMethod]} /${path}`; + return { + routeHandler, + route: `${RequestMethod[requestMethod]} /${path}` + }; }); }); }); } +/** + * Gives the routes of the controller which apply neither AuthGuard('api-key') + * nor AuthGuard('jwt'), each as the request method and the path + */ +function getRoutesWithoutAuthentication(controller: Type) { + const authenticationGuards: unknown[] = [ + AuthGuard('api-key'), + AuthGuard('jwt') + ]; + + return getRoutes(controller) + .filter(({ routeHandler }) => { + const hasAuthentication = getEnhancers( + GUARDS_METADATA, + controller, + routeHandler + ).some((guard) => { + return authenticationGuards.includes(guard); + }); + + return !hasAuthentication; + }) + .map(({ route }) => { + return route; + }); +} + +/** + * Gives the routes of the controller, each as the request method, the path + * and the version with the guards and the interceptors in the order in which + * they run, the permission, the scopes and whether the route stays available + * while an impersonation is active + */ +function getRoutesWithSecurity(controller: Type) { + return getRoutes(controller).map(({ route, routeHandler }) => { + const security = omitBy( + { + allowDuringImpersonation: getMetadataOfRoute( + ALLOW_DURING_IMPERSONATION_KEY, + controller, + routeHandler + ), + guards: getEnhancers(GUARDS_METADATA, controller, routeHandler).map( + (guard) => { + return getName(guard); + } + ), + interceptors: getEnhancers( + INTERCEPTORS_METADATA, + controller, + routeHandler + ).map((interceptor) => { + return getName(interceptor); + }), + // HasPermissionGuard reads the permission of the route handler only + permission: Reflect.getMetadata(HAS_PERMISSION_KEY, routeHandler) as + string | undefined, + scopes: getMetadataOfRoute( + REQUIRES_SCOPE_KEY, + controller, + routeHandler + ) + }, + isUndefined + ); + + return [ + `${route}${getVersionSuffix(controller, routeHandler)}`, + security + ] as const; + }); +} + +/** + * Gives the version of the route as a suffix of its key, which is empty for + * the default version + */ +function getVersionSuffix(controller: Type, routeHandler: object) { + const version = getMetadataOfRoute( + VERSION_METADATA, + controller, + routeHandler + ); + + if (version === undefined) { + return ''; + } + + const versions = [version].flat().map((value) => { + return value === VERSION_NEUTRAL ? 'neutral' : value; + }); + + return ` (version ${versions.join(', ')})`; +} + describe('AppModule', () => { it('should require the authentication for each route which is not public', async () => { const controllers = await getControllers(AppModule); @@ -169,4 +317,22 @@ describe('AppModule', () => { expect(routesWithoutAuthentication).toEqual(PUBLIC_ROUTES); }); + + // An intended change of a route is confirmed by an update of the snapshot + // (--updateSnapshot), hence each change shows in the review + it('should keep the security of each route', async () => { + const controllers = await getControllers(AppModule); + + const routesWithSecurity = controllers.flatMap((controller) => { + return getRoutesWithSecurity(controller); + }); + + const routes = routesWithSecurity.map(([route]) => { + return route; + }); + + // The snapshot is an object, which would hide a route declared twice + expect(new Set(routes).size).toBe(routes.length); + expect(Object.fromEntries(routesWithSecurity)).toMatchSnapshot(); + }); }); diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 33617602d6..3d262814fe 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -14,6 +14,7 @@ import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { DataGatheringQueueModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; import { PortfolioSnapshotQueueModule } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.module'; +import { RedisCacheModule } from '@ghostfolio/api/services/redis-cache/redis-cache.module'; import { BULL_BOARD_ROUTE, THROTTLE_DEFAULT_LIMIT, @@ -39,16 +40,18 @@ import { AccountModule } from './account/account.module'; import { ActivitiesModule } from './activities/activities.module'; import { AdminModule } from './admin/admin.module'; import { AppController } from './app.controller'; -import { AssetModule } from './asset/asset.module'; -import { AuthDeviceModule } from './auth-device/auth-device.module'; import { AuthModule } from './auth/auth.module'; -import { CacheModule } from './cache/cache.module'; import { AiModule } from './endpoints/ai/ai.module'; import { ApiKeysModule } from './endpoints/api-keys/api-keys.module'; import { AssetProfilesModule } from './endpoints/asset-profiles/asset-profiles.module'; import { AssetsModule } from './endpoints/assets/assets.module'; +import { AuthDevicesModule } from './endpoints/auth-devices/auth-devices.module'; import { BenchmarksModule } from './endpoints/benchmarks/benchmarks.module'; +import { CacheModule } from './endpoints/cache/cache.module'; import { GhostfolioModule } from './endpoints/data-providers/ghostfolio/ghostfolio.module'; +import { ExchangeRatesModule } from './endpoints/exchange-rates/exchange-rates.module'; +import { InfoModule } from './endpoints/info/info.module'; +import { LogoModule } from './endpoints/logo/logo.module'; import { MarketDataModule } from './endpoints/market-data/market-data.module'; import { McpModule } from './endpoints/mcp/mcp.module'; import { PlatformsModule } from './endpoints/platforms/platforms.module'; @@ -56,15 +59,10 @@ import { PublicModule } from './endpoints/public/public.module'; import { SitemapModule } from './endpoints/sitemap/sitemap.module'; import { TagsModule } from './endpoints/tags/tags.module'; import { WatchlistModule } from './endpoints/watchlist/watchlist.module'; -import { ExchangeRateModule } from './exchange-rate/exchange-rate.module'; import { ExportModule } from './export/export.module'; import { HealthModule } from './health/health.module'; import { ImportModule } from './import/import.module'; -import { InfoModule } from './info/info.module'; -import { LogoModule } from './logo/logo.module'; -import { PlatformModule } from './platform/platform.module'; import { PortfolioModule } from './portfolio/portfolio.module'; -import { RedisCacheModule } from './redis-cache/redis-cache.module'; import { SubscriptionModule } from './subscription/subscription.module'; import { SymbolModule } from './symbol/symbol.module'; import { UserModule } from './user/user.module'; @@ -79,9 +77,8 @@ import { UserModule } from './user/user.module'; AiModule, ApiKeysModule, AssetProfilesModule, - AssetModule, AssetsModule, - AuthDeviceModule, + AuthDevicesModule, AuthModule, BenchmarksModule, BullBoardModule.forRoot({ @@ -120,8 +117,8 @@ import { UserModule } from './user/user.module'; DataProviderModule, EventEmitterModule.forRoot(), EventsModule, - ExchangeRateModule, ExchangeRateDataModule, + ExchangeRatesModule, ExportModule, GhostfolioModule, HealthModule, @@ -130,7 +127,6 @@ import { UserModule } from './user/user.module'; LogoModule, MarketDataModule, McpModule, - PlatformModule, PlatformsModule, PortfolioModule, PortfolioSnapshotQueueModule, diff --git a/apps/api/src/app/asset/asset.module.ts b/apps/api/src/app/asset/asset.module.ts deleted file mode 100644 index 311c8694f5..0000000000 --- a/apps/api/src/app/asset/asset.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { AssetProfilesModule } from '@ghostfolio/api/app/endpoints/asset-profiles/asset-profiles.module'; -import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; -import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module'; - -import { Module } from '@nestjs/common'; - -import { AssetController } from './asset.controller'; - -@Module({ - controllers: [AssetController], - imports: [ - AssetProfilesModule, - TransformDataSourceInRequestModule, - TransformDataSourceInResponseModule - ] -}) -export class AssetModule {} diff --git a/apps/api/src/app/auth-device/auth-device.module.ts b/apps/api/src/app/auth-device/auth-device.module.ts deleted file mode 100644 index 515efa155c..0000000000 --- a/apps/api/src/app/auth-device/auth-device.module.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { AuthDeviceController } from '@ghostfolio/api/app/auth-device/auth-device.controller'; -import { AuthDeviceService } from '@ghostfolio/api/app/auth-device/auth-device.service'; -import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; - -import { Module } from '@nestjs/common'; -import { JwtModule } from '@nestjs/jwt'; - -@Module({ - controllers: [AuthDeviceController], - imports: [ - JwtModule.register({ - secret: process.env.JWT_SECRET_KEY, - signOptions: { expiresIn: '180 days' } - }), - PrismaModule - ], - providers: [AuthDeviceService] -}) -export class AuthDeviceModule {} diff --git a/apps/api/src/app/auth/auth.module.ts b/apps/api/src/app/auth/auth.module.ts index 879463cc13..afeebe98d0 100644 --- a/apps/api/src/app/auth/auth.module.ts +++ b/apps/api/src/app/auth/auth.module.ts @@ -1,10 +1,9 @@ -import { AuthDeviceService } from '@ghostfolio/api/app/auth-device/auth-device.service'; import { WebAuthService } from '@ghostfolio/api/app/auth/web-auth.service'; -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { SubscriptionModule } from '@ghostfolio/api/app/subscription/subscription.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; import { ApiKeyService } from '@ghostfolio/api/services/api-key/api-key.service'; import { ApiModule } from '@ghostfolio/api/services/api/api.module'; +import { AuthDeviceModule } from '@ghostfolio/api/services/auth-device/auth-device.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { FetchModule } from '@ghostfolio/api/services/fetch/fetch.module'; @@ -12,6 +11,7 @@ import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { PortfolioSnapshotQueueModule } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.module'; +import { RedisCacheModule } from '@ghostfolio/api/services/redis-cache/redis-cache.module'; import { Logger, Module } from '@nestjs/common'; import { JwtModule } from '@nestjs/jwt'; @@ -29,6 +29,7 @@ import { OidcStrategy } from './oidc.strategy'; controllers: [AuthController], imports: [ ApiModule, + AuthDeviceModule, ConfigurationModule, FetchModule, JwtModule.register({ @@ -45,7 +46,6 @@ import { OidcStrategy } from './oidc.strategy'; providers: [ ApiKeyService, ApiKeyStrategy, - AuthDeviceService, AuthService, GoogleStrategy, JwtStrategy, diff --git a/apps/api/src/app/auth/web-auth.service.ts b/apps/api/src/app/auth/web-auth.service.ts index 40a86398a6..3bae3de88f 100644 --- a/apps/api/src/app/auth/web-auth.service.ts +++ b/apps/api/src/app/auth/web-auth.service.ts @@ -1,10 +1,10 @@ -import { AuthDeviceService } from '@ghostfolio/api/app/auth-device/auth-device.service'; import { PortfolioSnapshotValue } from '@ghostfolio/api/app/portfolio/interfaces/snapshot-value.interface'; -import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { UserService } from '@ghostfolio/api/app/user/user.service'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; +import { AuthDeviceService } from '@ghostfolio/api/services/auth-device/auth-device.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; +import { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; import { PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_LOW, PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME, diff --git a/apps/api/src/app/endpoints/asset-profiles/asset-profiles.module.ts b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.module.ts index 9df342f5f6..d065b9ab4b 100644 --- a/apps/api/src/app/endpoints/asset-profiles/asset-profiles.module.ts +++ b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.module.ts @@ -15,9 +15,10 @@ import { Module } from '@nestjs/common'; import { AssetProfilesController } from './asset-profiles.controller'; import { AssetProfilesService } from './asset-profiles.service'; +import { AssetController } from './asset.controller'; @Module({ - controllers: [AssetProfilesController], + controllers: [AssetController, AssetProfilesController], exports: [AssetProfilesService], imports: [ ActivitiesModule, diff --git a/apps/api/src/app/asset/asset.controller.ts b/apps/api/src/app/endpoints/asset-profiles/asset.controller.ts similarity index 75% rename from apps/api/src/app/asset/asset.controller.ts rename to apps/api/src/app/endpoints/asset-profiles/asset.controller.ts index 352d3e18b1..9c90691388 100644 --- a/apps/api/src/app/asset/asset.controller.ts +++ b/apps/api/src/app/endpoints/asset-profiles/asset.controller.ts @@ -1,4 +1,3 @@ -import { AssetProfilesService } from '@ghostfolio/api/app/endpoints/asset-profiles/asset-profiles.service'; import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor'; import type { AssetResponse } from '@ghostfolio/common/interfaces'; @@ -7,6 +6,8 @@ import { Controller, Get, Param, UseInterceptors } from '@nestjs/common'; import { DataSource } from '@prisma/client'; import { pick } from 'lodash-es'; +import { AssetProfilesService } from './asset-profiles.service'; + @Controller('asset') export class AssetController { public constructor( @@ -29,7 +30,12 @@ export class AssetController { return { marketData, splits, - assetProfile: pick(assetProfile, ['dataSource', 'name', 'symbol']) + assetProfile: { + ...pick(assetProfile, ['dataSource', 'name', 'symbol']), + // An index has no asset class and its value has no currency, + // thus show no currency for any asset profile without asset class + currency: assetProfile.assetClass ? assetProfile.currency : undefined + } }; } } diff --git a/apps/api/src/app/auth-device/auth-device.controller.ts b/apps/api/src/app/endpoints/auth-devices/auth-devices.controller.ts similarity index 87% rename from apps/api/src/app/auth-device/auth-device.controller.ts rename to apps/api/src/app/endpoints/auth-devices/auth-devices.controller.ts index 509746ca97..7577c16901 100644 --- a/apps/api/src/app/auth-device/auth-device.controller.ts +++ b/apps/api/src/app/endpoints/auth-devices/auth-devices.controller.ts @@ -1,7 +1,7 @@ -import { AuthDeviceService } from '@ghostfolio/api/app/auth-device/auth-device.service'; import { AllowDuringImpersonation } from '@ghostfolio/api/decorators/allow-during-impersonation.decorator'; import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { AuthDeviceService } from '@ghostfolio/api/services/auth-device/auth-device.service'; import { permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; @@ -18,8 +18,12 @@ import { AuthGuard } from '@nestjs/passport'; import { getReasonPhrase, StatusCodes } from 'http-status-codes'; @AllowDuringImpersonation() -@Controller('auth-device') -export class AuthDeviceController { +@Controller([ + 'auth-devices', + /** @deprecated */ + 'auth-device' +]) +export class AuthDevicesController { public constructor( private readonly authDeviceService: AuthDeviceService, @Inject(REQUEST) private readonly request: RequestWithUser diff --git a/apps/api/src/app/endpoints/auth-devices/auth-devices.module.ts b/apps/api/src/app/endpoints/auth-devices/auth-devices.module.ts new file mode 100644 index 0000000000..ce5042d264 --- /dev/null +++ b/apps/api/src/app/endpoints/auth-devices/auth-devices.module.ts @@ -0,0 +1,11 @@ +import { AuthDeviceModule } from '@ghostfolio/api/services/auth-device/auth-device.module'; + +import { Module } from '@nestjs/common'; + +import { AuthDevicesController } from './auth-devices.controller'; + +@Module({ + controllers: [AuthDevicesController], + imports: [AuthDeviceModule] +}) +export class AuthDevicesModule {} diff --git a/apps/api/src/app/endpoints/benchmarks/benchmarks.module.ts b/apps/api/src/app/endpoints/benchmarks/benchmarks.module.ts index 3c540c3370..29dc7190d0 100644 --- a/apps/api/src/app/endpoints/benchmarks/benchmarks.module.ts +++ b/apps/api/src/app/endpoints/benchmarks/benchmarks.module.ts @@ -5,7 +5,6 @@ import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calcul import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; import { RulesService } from '@ghostfolio/api/app/portfolio/rules.service'; -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { SymbolModule } from '@ghostfolio/api/app/symbol/symbol.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; @@ -22,6 +21,7 @@ import { MarketDataService } from '@ghostfolio/api/services/market-data/market-d import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { PortfolioSnapshotQueueModule } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.module'; +import { RedisCacheModule } from '@ghostfolio/api/services/redis-cache/redis-cache.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { TagModule } from '@ghostfolio/api/services/tag/tag.module'; diff --git a/apps/api/src/app/cache/cache.controller.ts b/apps/api/src/app/endpoints/cache/cache.controller.ts similarity index 89% rename from apps/api/src/app/cache/cache.controller.ts rename to apps/api/src/app/endpoints/cache/cache.controller.ts index 680e7e6825..1072550d64 100644 --- a/apps/api/src/app/cache/cache.controller.ts +++ b/apps/api/src/app/endpoints/cache/cache.controller.ts @@ -1,7 +1,7 @@ -import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { AllowDuringImpersonation } from '@ghostfolio/api/decorators/allow-during-impersonation.decorator'; import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; import { permissions } from '@ghostfolio/common/permissions'; import { Controller, Post, UseGuards } from '@nestjs/common'; diff --git a/apps/api/src/app/cache/cache.module.ts b/apps/api/src/app/endpoints/cache/cache.module.ts similarity index 68% rename from apps/api/src/app/cache/cache.module.ts rename to apps/api/src/app/endpoints/cache/cache.module.ts index d435c72a64..6bc9fb16c3 100644 --- a/apps/api/src/app/cache/cache.module.ts +++ b/apps/api/src/app/endpoints/cache/cache.module.ts @@ -1,4 +1,4 @@ -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; +import { RedisCacheModule } from '@ghostfolio/api/services/redis-cache/redis-cache.module'; import { Module } from '@nestjs/common'; diff --git a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.module.ts b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.module.ts index 1b8788ecb7..e77dea9eeb 100644 --- a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.module.ts +++ b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.module.ts @@ -1,4 +1,3 @@ -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { SymbolModule } from '@ghostfolio/api/app/symbol/symbol.module'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { CryptocurrencyModule } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.module'; @@ -17,6 +16,7 @@ import { FetchModule } from '@ghostfolio/api/services/fetch/fetch.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; +import { RedisCacheModule } from '@ghostfolio/api/services/redis-cache/redis-cache.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { Module } from '@nestjs/common'; diff --git a/apps/api/src/app/exchange-rate/exchange-rate.controller.ts b/apps/api/src/app/endpoints/exchange-rates/exchange-rates.controller.ts similarity index 65% rename from apps/api/src/app/exchange-rate/exchange-rate.controller.ts rename to apps/api/src/app/endpoints/exchange-rates/exchange-rates.controller.ts index 239b4b27a1..7a873b11db 100644 --- a/apps/api/src/app/exchange-rate/exchange-rate.controller.ts +++ b/apps/api/src/app/endpoints/exchange-rates/exchange-rates.controller.ts @@ -1,5 +1,5 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; -import { DataProviderHistoricalResponse } from '@ghostfolio/common/interfaces'; +import { ExchangeRateResponse } from '@ghostfolio/common/interfaces'; import { Controller, @@ -12,12 +12,16 @@ import { AuthGuard } from '@nestjs/passport'; import { parseISO } from 'date-fns'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; -import { ExchangeRateService } from './exchange-rate.service'; +import { ExchangeRatesService } from './exchange-rates.service'; -@Controller('exchange-rate') -export class ExchangeRateController { +@Controller([ + 'exchange-rates', + /** @deprecated */ + 'exchange-rate' +]) +export class ExchangeRatesController { public constructor( - private readonly exchangeRateService: ExchangeRateService + private readonly exchangeRatesService: ExchangeRatesService ) {} @Get(':symbol/:dateString') @@ -25,10 +29,10 @@ export class ExchangeRateController { public async getExchangeRate( @Param('dateString') dateString: string, @Param('symbol') symbol: string - ): Promise { + ): Promise { const date = parseISO(dateString); - const exchangeRate = await this.exchangeRateService.getExchangeRate({ + const exchangeRate = await this.exchangeRatesService.getExchangeRate({ date, symbol }); diff --git a/apps/api/src/app/endpoints/exchange-rates/exchange-rates.module.ts b/apps/api/src/app/endpoints/exchange-rates/exchange-rates.module.ts new file mode 100644 index 0000000000..c143ddc336 --- /dev/null +++ b/apps/api/src/app/endpoints/exchange-rates/exchange-rates.module.ts @@ -0,0 +1,13 @@ +import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; + +import { Module } from '@nestjs/common'; + +import { ExchangeRatesController } from './exchange-rates.controller'; +import { ExchangeRatesService } from './exchange-rates.service'; + +@Module({ + controllers: [ExchangeRatesController], + imports: [ExchangeRateDataModule], + providers: [ExchangeRatesService] +}) +export class ExchangeRatesModule {} diff --git a/apps/api/src/app/exchange-rate/exchange-rate.service.ts b/apps/api/src/app/endpoints/exchange-rates/exchange-rates.service.ts similarity index 94% rename from apps/api/src/app/exchange-rate/exchange-rate.service.ts rename to apps/api/src/app/endpoints/exchange-rates/exchange-rates.service.ts index d70fd534c0..e66cc591ae 100644 --- a/apps/api/src/app/exchange-rate/exchange-rate.service.ts +++ b/apps/api/src/app/endpoints/exchange-rates/exchange-rates.service.ts @@ -3,7 +3,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { Injectable } from '@nestjs/common'; @Injectable() -export class ExchangeRateService { +export class ExchangeRatesService { public constructor( private readonly exchangeRateDataService: ExchangeRateDataService ) {} diff --git a/apps/api/src/app/info/info.controller.ts b/apps/api/src/app/endpoints/info/info.controller.ts similarity index 100% rename from apps/api/src/app/info/info.controller.ts rename to apps/api/src/app/endpoints/info/info.controller.ts diff --git a/apps/api/src/app/info/info.module.ts b/apps/api/src/app/endpoints/info/info.module.ts similarity index 91% rename from apps/api/src/app/info/info.module.ts rename to apps/api/src/app/endpoints/info/info.module.ts index 06b7249095..7d30a7b53f 100644 --- a/apps/api/src/app/info/info.module.ts +++ b/apps/api/src/app/endpoints/info/info.module.ts @@ -1,5 +1,3 @@ -import { PlatformModule } from '@ghostfolio/api/app/platform/platform.module'; -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { SubscriptionModule } from '@ghostfolio/api/app/subscription/subscription.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module'; @@ -8,8 +6,10 @@ import { ConfigurationModule } from '@ghostfolio/api/services/configuration/conf import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; +import { PlatformModule } from '@ghostfolio/api/services/platform/platform.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { DataGatheringQueueModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; +import { RedisCacheModule } from '@ghostfolio/api/services/redis-cache/redis-cache.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { Module } from '@nestjs/common'; diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/endpoints/info/info.service.ts similarity index 98% rename from apps/api/src/app/info/info.service.ts rename to apps/api/src/app/endpoints/info/info.service.ts index 2a7382446c..ab373055bf 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/endpoints/info/info.service.ts @@ -1,4 +1,3 @@ -import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { SubscriptionService } from '@ghostfolio/api/app/subscription/subscription.service'; import { UserService } from '@ghostfolio/api/app/user/user.service'; import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.service'; @@ -7,6 +6,7 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; +import { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; import { DEFAULT_CURRENCY, ghostfolioFearAndGreedIndexSymbolStocks, diff --git a/apps/api/src/app/logo/get-logo.dto.ts b/apps/api/src/app/endpoints/logo/get-logo.dto.ts similarity index 100% rename from apps/api/src/app/logo/get-logo.dto.ts rename to apps/api/src/app/endpoints/logo/get-logo.dto.ts diff --git a/apps/api/src/app/logo/logo.controller.ts b/apps/api/src/app/endpoints/logo/logo.controller.ts similarity index 100% rename from apps/api/src/app/logo/logo.controller.ts rename to apps/api/src/app/endpoints/logo/logo.controller.ts diff --git a/apps/api/src/app/logo/logo.module.ts b/apps/api/src/app/endpoints/logo/logo.module.ts similarity index 100% rename from apps/api/src/app/logo/logo.module.ts rename to apps/api/src/app/endpoints/logo/logo.module.ts diff --git a/apps/api/src/app/logo/logo.service.ts b/apps/api/src/app/endpoints/logo/logo.service.ts similarity index 100% rename from apps/api/src/app/logo/logo.service.ts rename to apps/api/src/app/endpoints/logo/logo.service.ts diff --git a/apps/api/src/app/platform/platform.controller.ts b/apps/api/src/app/endpoints/platforms/platform.controller.ts similarity index 95% rename from apps/api/src/app/platform/platform.controller.ts rename to apps/api/src/app/endpoints/platforms/platform.controller.ts index 6c0af45158..bddc1b9aa7 100644 --- a/apps/api/src/app/platform/platform.controller.ts +++ b/apps/api/src/app/endpoints/platforms/platform.controller.ts @@ -1,6 +1,7 @@ import { AllowDuringImpersonation } from '@ghostfolio/api/decorators/allow-during-impersonation.decorator'; import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { PlatformService } from '@ghostfolio/api/services/platform/platform.service'; import { CreatePlatformDto, UpdatePlatformDto } from '@ghostfolio/common/dtos'; import { permissions } from '@ghostfolio/common/permissions'; @@ -19,8 +20,7 @@ import { AuthGuard } from '@nestjs/passport'; import { Platform } from '@prisma/client'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; -import { PlatformService } from './platform.service'; - +/** @deprecated */ @AllowDuringImpersonation() @Controller('platform') export class PlatformController { diff --git a/apps/api/src/app/endpoints/platforms/platforms.controller.ts b/apps/api/src/app/endpoints/platforms/platforms.controller.ts index 92ba772971..11d3972a81 100644 --- a/apps/api/src/app/endpoints/platforms/platforms.controller.ts +++ b/apps/api/src/app/endpoints/platforms/platforms.controller.ts @@ -1,24 +1,125 @@ -import { PlatformService } from '@ghostfolio/api/app/platform/platform.service'; +import { AllowDuringImpersonation } from '@ghostfolio/api/decorators/allow-during-impersonation.decorator'; import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; -import { PlatformsResponse } from '@ghostfolio/common/interfaces'; -import { permissions } from '@ghostfolio/common/permissions'; +import { PlatformService } from '@ghostfolio/api/services/platform/platform.service'; +import { CreatePlatformDto, UpdatePlatformDto } from '@ghostfolio/common/dtos'; +import { + PlatformResponse, + PlatformsResponse +} from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import type { RequestWithUser } from '@ghostfolio/common/types'; -import { Controller, Get, UseGuards } from '@nestjs/common'; +import { + Body, + Controller, + Delete, + Get, + HttpException, + Inject, + Param, + Post, + Put, + UseGuards +} from '@nestjs/common'; +import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; +import { StatusCodes, getReasonPhrase } from 'http-status-codes'; +import { pick } from 'lodash-es'; +@AllowDuringImpersonation() @Controller('platforms') export class PlatformsController { - public constructor(private readonly platformService: PlatformService) {} + public constructor( + private readonly platformService: PlatformService, + @Inject(REQUEST) private readonly request: RequestWithUser + ) {} + + @HasPermission(permissions.createPlatform) + @Post() + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async createPlatform( + @Body() data: CreatePlatformDto + ): Promise { + const platform = await this.platformService.createPlatform(data); + + return pick(platform, ['id', 'name', 'url']); + } + + @Delete(':id') + @HasPermission(permissions.deletePlatform) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async deletePlatform(@Param('id') id: string): Promise { + const originalPlatform = await this.platformService.getPlatform({ + id + }); + + if (!originalPlatform) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + + await this.platformService.deletePlatform({ id }); + } @Get() @HasPermission(permissions.readPlatforms) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getPlatforms(): Promise { + if ( + hasPermission( + this.request.user.permissions, + permissions.readPlatformsWithAccountCount + ) + ) { + const platformsWithAccountCount = + await this.platformService.getPlatformsWithAccountCount({ + orderBy: { name: 'asc' } + }); + + return { platforms: platformsWithAccountCount }; + } + const platforms = await this.platformService.getPlatforms({ orderBy: { name: 'asc' } }); - return { platforms }; + return { + platforms: platforms.map((platform) => { + return pick(platform, ['id', 'name', 'url']); + }) + }; + } + + @HasPermission(permissions.updatePlatform) + @Put(':id') + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async updatePlatform( + @Param('id') id: string, + @Body() data: UpdatePlatformDto + ): Promise { + const originalPlatform = await this.platformService.getPlatform({ + id + }); + + if (!originalPlatform) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + + const platform = await this.platformService.updatePlatform({ + data: { + ...data + }, + where: { + id + } + }); + + return pick(platform, ['id', 'name', 'url']); } } diff --git a/apps/api/src/app/endpoints/platforms/platforms.module.ts b/apps/api/src/app/endpoints/platforms/platforms.module.ts index 21d0edf69d..5af50fd63d 100644 --- a/apps/api/src/app/endpoints/platforms/platforms.module.ts +++ b/apps/api/src/app/endpoints/platforms/platforms.module.ts @@ -1,11 +1,12 @@ -import { PlatformModule } from '@ghostfolio/api/app/platform/platform.module'; +import { PlatformModule } from '@ghostfolio/api/services/platform/platform.module'; import { Module } from '@nestjs/common'; +import { PlatformController } from './platform.controller'; import { PlatformsController } from './platforms.controller'; @Module({ - controllers: [PlatformsController], + controllers: [PlatformController, PlatformsController], imports: [PlatformModule] }) export class PlatformsModule {} diff --git a/apps/api/src/app/endpoints/public/public.module.ts b/apps/api/src/app/endpoints/public/public.module.ts index d94f350c36..4e4c4b7c00 100644 --- a/apps/api/src/app/endpoints/public/public.module.ts +++ b/apps/api/src/app/endpoints/public/public.module.ts @@ -6,7 +6,6 @@ import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calcul import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; import { RulesService } from '@ghostfolio/api/app/portfolio/rules.service'; -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module'; @@ -17,6 +16,7 @@ import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impe import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PortfolioSnapshotQueueModule } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.module'; +import { RedisCacheModule } from '@ghostfolio/api/services/redis-cache/redis-cache.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { TagModule } from '@ghostfolio/api/services/tag/tag.module'; diff --git a/apps/api/src/app/exchange-rate/exchange-rate.module.ts b/apps/api/src/app/exchange-rate/exchange-rate.module.ts deleted file mode 100644 index e1d9d18917..0000000000 --- a/apps/api/src/app/exchange-rate/exchange-rate.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; - -import { Module } from '@nestjs/common'; - -import { ExchangeRateController } from './exchange-rate.controller'; -import { ExchangeRateService } from './exchange-rate.service'; - -@Module({ - controllers: [ExchangeRateController], - exports: [ExchangeRateService], - imports: [ExchangeRateDataModule], - providers: [ExchangeRateService] -}) -export class ExchangeRateModule {} diff --git a/apps/api/src/app/health/health.module.ts b/apps/api/src/app/health/health.module.ts index c36924121c..7b517ef013 100644 --- a/apps/api/src/app/health/health.module.ts +++ b/apps/api/src/app/health/health.module.ts @@ -1,9 +1,9 @@ import { AiModule } from '@ghostfolio/api/app/endpoints/ai/ai.module'; -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { DataEnhancerModule } from '@ghostfolio/api/services/data-provider/data-enhancer/data-enhancer.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; +import { RedisCacheModule } from '@ghostfolio/api/services/redis-cache/redis-cache.module'; import { Module } from '@nestjs/common'; diff --git a/apps/api/src/app/health/health.service.ts b/apps/api/src/app/health/health.service.ts index 42a0be61b8..6cfd5cbce3 100644 --- a/apps/api/src/app/health/health.service.ts +++ b/apps/api/src/app/health/health.service.ts @@ -1,7 +1,7 @@ -import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { DataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/data-enhancer.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; +import { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; import { PROPERTY_CURRENCIES } from '@ghostfolio/common/config'; import { Injectable } from '@nestjs/common'; diff --git a/apps/api/src/app/import/import.module.ts b/apps/api/src/app/import/import.module.ts index 1a04e7505b..00a386b6e2 100644 --- a/apps/api/src/app/import/import.module.ts +++ b/apps/api/src/app/import/import.module.ts @@ -1,9 +1,6 @@ import { AccountModule } from '@ghostfolio/api/app/account/account.module'; import { ActivitiesModule } from '@ghostfolio/api/app/activities/activities.module'; -import { CacheModule } from '@ghostfolio/api/app/cache/cache.module'; -import { PlatformModule } from '@ghostfolio/api/app/platform/platform.module'; import { PortfolioModule } from '@ghostfolio/api/app/portfolio/portfolio.module'; -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module'; import { ApiModule } from '@ghostfolio/api/services/api/api.module'; @@ -11,8 +8,10 @@ import { ConfigurationModule } from '@ghostfolio/api/services/configuration/conf import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; +import { PlatformModule } from '@ghostfolio/api/services/platform/platform.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { DataGatheringQueueModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; +import { RedisCacheModule } from '@ghostfolio/api/services/redis-cache/redis-cache.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { TagModule } from '@ghostfolio/api/services/tag/tag.module'; @@ -28,7 +27,6 @@ import { ImportService } from './import.service'; AccountModule, ActivitiesModule, ApiModule, - CacheModule, ConfigurationModule, DataGatheringQueueModule, DataProviderModule, diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 6f036479c7..2d09cb78df 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -1,6 +1,5 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service'; -import { PlatformService } from '@ghostfolio/api/app/platform/platform.service'; import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; import { getTagsWithDraftTag } from '@ghostfolio/api/helper/activity.helper'; import { getMaskedGhostfolioDataSource } from '@ghostfolio/api/helper/data-source.helper'; @@ -9,6 +8,7 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/con import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; +import { PlatformService } from '@ghostfolio/api/services/platform/platform.service'; import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { TagService } from '@ghostfolio/api/services/tag/tag.service'; diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts index 48ab8f3218..138ee1020f 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts @@ -1,8 +1,8 @@ import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; -import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; +import { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; import { SubscriptionType } from '@ghostfolio/common/enums'; import { Activity, diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index 4ef6a95841..7d0c2ddda9 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -14,13 +14,13 @@ import { PortfolioCalculatorActivity } from '@ghostfolio/api/app/portfolio/inter import { PortfolioCalculatorHolding } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator-holding.interface'; import { PortfolioSnapshotValue } from '@ghostfolio/api/app/portfolio/interfaces/snapshot-value.interface'; import { PerformancePercentages } from '@ghostfolio/api/app/portfolio/types/performance-percentages.type'; -import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { getFactor } from '@ghostfolio/api/helper/portfolio.helper'; import { LogPerformance } from '@ghostfolio/api/interceptors/performance-logging/performance-logging.interceptor'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; +import { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; import { getAnnualizedPerformancePercent, getIntervalFromDateRange diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts index 5d3cbcf320..15f61d0614 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts @@ -5,12 +5,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -35,7 +35,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts index 54f1dfcb48..9d114d8dce 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts @@ -6,12 +6,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -37,7 +37,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts index 9ee4877180..6bd391683b 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts @@ -6,12 +6,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -36,7 +36,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts index afae22c1c6..de507791c7 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts @@ -5,12 +5,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -35,7 +35,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts index 5c78f8a42b..f3f069eeae 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts @@ -7,13 +7,13 @@ import { 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 { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity, ExportResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -51,7 +51,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts index ed8841b167..219b988f5b 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts @@ -7,12 +7,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity, ExportResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -39,7 +39,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts index 507dd731e2..1ff6f55d59 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts @@ -6,13 +6,13 @@ import { 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 { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -38,7 +38,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-before-first-market-price.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-before-first-market-price.spec.ts index 6b3d9ce6d4..bd8d76948c 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-before-first-market-price.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-before-first-market-price.spec.ts @@ -6,12 +6,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -35,7 +35,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts index 356fdebd03..30201c34f7 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts @@ -5,12 +5,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -35,7 +35,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts index 0d0f6cfc3b..05ac3f5072 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts @@ -5,12 +5,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -35,7 +35,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts index b98aa9e5f2..67aa90899e 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts @@ -9,8 +9,6 @@ import { 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 { AssetProfileSplitService } from '@ghostfolio/api/services/asset-profile-split/asset-profile-split.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; @@ -18,6 +16,8 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PortfolioSnapshotHolding } from '@ghostfolio/common/models'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -57,7 +57,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts index 6e9a42e3e8..06c68f8773 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts @@ -6,12 +6,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -37,7 +37,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy-with-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy-with-dividend.spec.ts index 46dbe493bf..1a5af99daf 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy-with-dividend.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy-with-dividend.spec.ts @@ -6,13 +6,13 @@ import { 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 { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -38,7 +38,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts index e048d2df51..f375a32419 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts @@ -6,13 +6,13 @@ import { 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 { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -38,7 +38,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-fee-and-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-fee-and-dividend.spec.ts index bb6385d18d..891d4397e0 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-fee-and-dividend.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-fee-and-dividend.spec.ts @@ -7,12 +7,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -38,7 +38,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-jnug-buy-and-sell-and-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-jnug-buy-and-sell-and-buy-and-sell.spec.ts index b2e0ffab6b..2c5aec649b 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-jnug-buy-and-sell-and-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-jnug-buy-and-sell-and-buy-and-sell.spec.ts @@ -5,12 +5,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -35,7 +35,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts index 370205fc98..8e9b87bf31 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts @@ -6,12 +6,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -37,7 +37,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-before-first-market-price.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-before-first-market-price.spec.ts index 135e6f6407..47ac8df4c7 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-before-first-market-price.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-before-first-market-price.spec.ts @@ -6,12 +6,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -35,7 +35,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-with-market-price-between-chart-dates.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-with-market-price-between-chart-dates.spec.ts index 989409e77b..9658d998d0 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-with-market-price-between-chart-dates.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-with-market-price-between-chart-dates.spec.ts @@ -6,12 +6,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -37,7 +37,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts index 1db23bc6cb..2ca108430d 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts @@ -6,12 +6,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -35,7 +35,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-from-two-data-sources.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-from-two-data-sources.spec.ts index 00b3ce4af1..d420ee873b 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-from-two-data-sources.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-from-two-data-sources.spec.ts @@ -6,13 +6,13 @@ import { 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 { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -38,7 +38,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; 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 2b89ddd31b..b3e67a0793 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 @@ -6,12 +6,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -36,7 +36,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-activities.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-activities.spec.ts index f248114fe4..2326e3486f 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-activities.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-activities.spec.ts @@ -2,12 +2,12 @@ import { userDummyData } from '@ghostfolio/api/app/portfolio/calculator/portfoli 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -32,7 +32,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts index e85a053e61..1e12a6aa2c 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts @@ -5,12 +5,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -35,7 +35,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts index a0174b048e..f5c7923853 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts @@ -5,12 +5,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -35,7 +35,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-stock-split.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-stock-split.spec.ts index f45e453734..1292cbe04f 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-stock-split.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-stock-split.spec.ts @@ -6,13 +6,13 @@ import { 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 { adjustActivityBySplits } from '@ghostfolio/api/services/asset-profile-split/asset-profile-split.helper'; 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -39,7 +39,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts index 3d0ab45f85..69df7ac49b 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts @@ -6,12 +6,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -37,7 +37,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.spec.ts index c2779c2c14..9400ec20ff 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.spec.ts @@ -7,12 +7,12 @@ import { userDummyData } from '@ghostfolio/api/app/portfolio/calculator/portfoli 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper'; import { HistoricalDataItem } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -36,7 +36,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-buy-and-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-buy-and-buy.spec.ts index a7167a2de1..e2c7d1e5a8 100644 --- a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-buy-and-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-buy-and-buy.spec.ts @@ -5,12 +5,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -35,7 +35,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-buy-and-sell.spec.ts index 02300923dd..3a228349c2 100644 --- a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-buy-and-sell.spec.ts @@ -6,12 +6,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -36,7 +36,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-buy.spec.ts index c590f4503f..9bfcd12b2a 100644 --- a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-buy.spec.ts @@ -5,12 +5,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -35,7 +35,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-sell-and-buy-on-same-day.spec.ts b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-sell-and-buy-on-same-day.spec.ts index 6a66322fcb..080901f3a5 100644 --- a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-sell-and-buy-on-same-day.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-baln-sell-and-buy-on-same-day.spec.ts @@ -7,12 +7,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -38,7 +38,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts index 3d6a9e35ad..8aa8c6bb07 100644 --- a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts @@ -6,13 +6,13 @@ import { 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 { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -38,7 +38,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-cash.spec.ts b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-cash.spec.ts index 59060483ce..1f44b6ce2b 100644 --- a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-cash.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-cash.spec.ts @@ -10,8 +10,6 @@ import { 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 { AssetProfileSplitService } from '@ghostfolio/api/services/asset-profile-split/asset-profile-split.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; @@ -19,6 +17,8 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PortfolioSnapshotHolding } from '@ghostfolio/common/models'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -58,7 +58,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-msft-buy-with-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-msft-buy-with-dividend.spec.ts index 0c0e32d931..31173e4f14 100644 --- a/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-msft-buy-with-dividend.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roi/portfolio-calculator-msft-buy-with-dividend.spec.ts @@ -6,12 +6,12 @@ import { 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 { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; @@ -36,7 +36,7 @@ jest.mock( } ); -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { +jest.mock('@ghostfolio/api/services/redis-cache/redis-cache.service', () => { return { RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; diff --git a/apps/api/src/app/portfolio/portfolio.module.ts b/apps/api/src/app/portfolio/portfolio.module.ts index 7f7a894df0..82eeb5395a 100644 --- a/apps/api/src/app/portfolio/portfolio.module.ts +++ b/apps/api/src/app/portfolio/portfolio.module.ts @@ -2,7 +2,6 @@ import { AccessModule } from '@ghostfolio/api/app/access/access.module'; import { AccountBalanceService } from '@ghostfolio/api/app/account-balance/account-balance.service'; import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { ActivitiesModule } from '@ghostfolio/api/app/activities/activities.module'; -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; import { PerformanceLoggingModule } from '@ghostfolio/api/interceptors/performance-logging/performance-logging.module'; import { RedactValuesInResponseModule } from '@ghostfolio/api/interceptors/redact-values-in-response/redact-values-in-response.module'; @@ -19,6 +18,7 @@ import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-da import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { DataGatheringQueueModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; import { PortfolioSnapshotQueueModule } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.module'; +import { RedisCacheModule } from '@ghostfolio/api/services/redis-cache/redis-cache.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { TagModule } from '@ghostfolio/api/services/tag/tag.module'; diff --git a/apps/api/src/events/events.module.ts b/apps/api/src/events/events.module.ts index dabc3edb77..b04a59a00e 100644 --- a/apps/api/src/events/events.module.ts +++ b/apps/api/src/events/events.module.ts @@ -1,5 +1,4 @@ import { ActivitiesModule } from '@ghostfolio/api/app/activities/activities.module'; -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; import { ApiModule } from '@ghostfolio/api/services/api/api.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; @@ -7,6 +6,7 @@ import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data- import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { DataGatheringQueueModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; import { PortfolioSnapshotQueueModule } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.module'; +import { RedisCacheModule } from '@ghostfolio/api/services/redis-cache/redis-cache.module'; import { Module } from '@nestjs/common'; diff --git a/apps/api/src/events/portfolio-changed.listener.ts b/apps/api/src/events/portfolio-changed.listener.ts index 9397eb0e52..a081e1bbdb 100644 --- a/apps/api/src/events/portfolio-changed.listener.ts +++ b/apps/api/src/events/portfolio-changed.listener.ts @@ -1,7 +1,7 @@ -import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { UserService } from '@ghostfolio/api/app/user/user.service'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; +import { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; import { PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_LOW, PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME, diff --git a/apps/api/src/services/auth-device/auth-device.module.ts b/apps/api/src/services/auth-device/auth-device.module.ts new file mode 100644 index 0000000000..0594fccb7d --- /dev/null +++ b/apps/api/src/services/auth-device/auth-device.module.ts @@ -0,0 +1,12 @@ +import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; + +import { Module } from '@nestjs/common'; + +import { AuthDeviceService } from './auth-device.service'; + +@Module({ + exports: [AuthDeviceService], + imports: [PrismaModule], + providers: [AuthDeviceService] +}) +export class AuthDeviceModule {} diff --git a/apps/api/src/app/auth-device/auth-device.service.ts b/apps/api/src/services/auth-device/auth-device.service.ts similarity index 100% rename from apps/api/src/app/auth-device/auth-device.service.ts rename to apps/api/src/services/auth-device/auth-device.service.ts diff --git a/apps/api/src/services/benchmark/benchmark.module.ts b/apps/api/src/services/benchmark/benchmark.module.ts index 870ef244fe..561a951971 100644 --- a/apps/api/src/services/benchmark/benchmark.module.ts +++ b/apps/api/src/services/benchmark/benchmark.module.ts @@ -1,8 +1,8 @@ -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; +import { RedisCacheModule } from '@ghostfolio/api/services/redis-cache/redis-cache.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { Module } from '@nestjs/common'; diff --git a/apps/api/src/services/benchmark/benchmark.service.ts b/apps/api/src/services/benchmark/benchmark.service.ts index 3c39848401..ea7bbaec12 100644 --- a/apps/api/src/services/benchmark/benchmark.service.ts +++ b/apps/api/src/services/benchmark/benchmark.service.ts @@ -1,8 +1,8 @@ -import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; +import { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { CACHE_TTL_INFINITE, diff --git a/apps/api/src/services/data-provider/data-provider.module.ts b/apps/api/src/services/data-provider/data-provider.module.ts index 2c6e9fce18..e932d387fd 100644 --- a/apps/api/src/services/data-provider/data-provider.module.ts +++ b/apps/api/src/services/data-provider/data-provider.module.ts @@ -1,4 +1,3 @@ -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { CryptocurrencyModule } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.module'; import { AlphaVantageService } from '@ghostfolio/api/services/data-provider/alpha-vantage/alpha-vantage.service'; @@ -14,6 +13,7 @@ import { FetchModule } from '@ghostfolio/api/services/fetch/fetch.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; +import { RedisCacheModule } from '@ghostfolio/api/services/redis-cache/redis-cache.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { Module } from '@nestjs/common'; diff --git a/apps/api/src/services/data-provider/data-provider.service.spec.ts b/apps/api/src/services/data-provider/data-provider.service.spec.ts index 20f5acaadb..815ab2743e 100644 --- a/apps/api/src/services/data-provider/data-provider.service.spec.ts +++ b/apps/api/src/services/data-provider/data-provider.service.spec.ts @@ -1,9 +1,9 @@ -import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; +import { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; import { DataSource } from '@prisma/client'; diff --git a/apps/api/src/services/data-provider/data-provider.service.ts b/apps/api/src/services/data-provider/data-provider.service.ts index 3206b2442b..826e14d16a 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -1,12 +1,12 @@ import { ImportValidationError } from '@ghostfolio/api/app/import/errors/import-validation.error'; import { ImportDataDto } from '@ghostfolio/api/app/import/import-data.dto'; -import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { getMaskedGhostfolioDataSource } from '@ghostfolio/api/helper/data-source.helper'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; +import { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; import { DEFAULT_CURRENCY, DERIVED_CURRENCIES, diff --git a/apps/api/src/app/platform/platform.module.ts b/apps/api/src/services/platform/platform.module.ts similarity index 76% rename from apps/api/src/app/platform/platform.module.ts rename to apps/api/src/services/platform/platform.module.ts index 42ae9d193d..849e037eda 100644 --- a/apps/api/src/app/platform/platform.module.ts +++ b/apps/api/src/services/platform/platform.module.ts @@ -2,11 +2,9 @@ import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { Module } from '@nestjs/common'; -import { PlatformController } from './platform.controller'; import { PlatformService } from './platform.service'; @Module({ - controllers: [PlatformController], exports: [PlatformService], imports: [PrismaModule], providers: [PlatformService] diff --git a/apps/api/src/app/platform/platform.service.ts b/apps/api/src/services/platform/platform.service.ts similarity index 92% rename from apps/api/src/app/platform/platform.service.ts rename to apps/api/src/services/platform/platform.service.ts index 200b4de007..56da19b2a5 100644 --- a/apps/api/src/app/platform/platform.service.ts +++ b/apps/api/src/services/platform/platform.service.ts @@ -49,9 +49,14 @@ export class PlatformService { }); } - public async getPlatformsWithAccountCount() { + public async getPlatformsWithAccountCount({ + orderBy + }: { + orderBy?: Prisma.PlatformOrderByWithRelationInput; + } = {}) { const platformsWithAccountCount = await this.prismaService.platform.findMany({ + orderBy, include: { _count: { select: { accounts: true } diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts index 0da5298211..617bf1aae4 100644 --- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts +++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts @@ -2,12 +2,12 @@ import { AccountBalanceModule } from '@ghostfolio/api/app/account-balance/accoun import { ActivitiesModule } from '@ghostfolio/api/app/activities/activities.module'; import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; +import { RedisCacheModule } from '@ghostfolio/api/services/redis-cache/redis-cache.module'; import { DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT, PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts index adc66e6028..b9628f9447 100644 --- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts +++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts @@ -2,8 +2,8 @@ import { AccountBalanceService } from '@ghostfolio/api/app/account-balance/accou import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service'; import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; import { PortfolioSnapshotValue } from '@ghostfolio/api/app/portfolio/interfaces/snapshot-value.interface'; -import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { RedisCacheService } from '@ghostfolio/api/services/redis-cache/redis-cache.service'; import { CACHE_TTL_INFINITE, DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY, diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock.ts index fddbd01aba..11b794dfc8 100644 --- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock.ts +++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock.ts @@ -1,5 +1,5 @@ import { PortfolioSnapshotValue } from '@ghostfolio/api/app/portfolio/interfaces/snapshot-value.interface'; -import { RedisCacheServiceMock } from '@ghostfolio/api/app/redis-cache/redis-cache.service.mock'; +import { RedisCacheServiceMock } from '@ghostfolio/api/services/redis-cache/redis-cache.service.mock'; import type { Job, JobId, JobOptions } from 'bull'; import ms from 'ms'; diff --git a/apps/api/src/app/redis-cache/redis-cache.module.ts b/apps/api/src/services/redis-cache/redis-cache.module.ts similarity index 100% rename from apps/api/src/app/redis-cache/redis-cache.module.ts rename to apps/api/src/services/redis-cache/redis-cache.module.ts diff --git a/apps/api/src/app/redis-cache/redis-cache.service.mock.ts b/apps/api/src/services/redis-cache/redis-cache.service.mock.ts similarity index 100% rename from apps/api/src/app/redis-cache/redis-cache.service.mock.ts rename to apps/api/src/services/redis-cache/redis-cache.service.mock.ts diff --git a/apps/api/src/app/redis-cache/redis-cache.service.ts b/apps/api/src/services/redis-cache/redis-cache.service.ts similarity index 100% rename from apps/api/src/app/redis-cache/redis-cache.service.ts rename to apps/api/src/services/redis-cache/redis-cache.service.ts diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index c9e124723d..53d3505a1c 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -25,6 +25,7 @@ import { OnInit } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { DateAdapter } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; import { Title } from '@angular/platform-browser'; import { @@ -39,7 +40,7 @@ import { Chart } from 'chart.js'; import { addIcons } from 'ionicons'; import { openOutline } from 'ionicons/icons'; import { DeviceDetectorService } from 'ngx-device-detector'; -import { filter } from 'rxjs/operators'; +import { distinctUntilChanged, filter, map } from 'rxjs/operators'; import { GfFooterComponent } from './components/footer/footer.component'; import { GfHeaderComponent } from './components/header/header.component'; @@ -75,6 +76,7 @@ export class GfAppComponent implements OnInit { private readonly changeDetectorRef = inject(ChangeDetectorRef); private readonly dataService = inject(DataService); + private readonly dateAdapter = inject>(DateAdapter); private readonly destroyRef = inject(DestroyRef); private readonly deviceDetectorService = inject(DeviceDetectorService); private readonly dialog = inject(MatDialog); @@ -212,6 +214,20 @@ export class GfAppComponent implements OnInit { this.changeDetectorRef.markForCheck(); }); + this.userService.stateChanged + .pipe( + map(({ user }) => { + return user?.settings.locale; + }), + distinctUntilChanged(), + takeUntilDestroyed(this.destroyRef) + ) + .subscribe((locale) => { + if (locale) { + this.dateAdapter.setLocale(locale); + } + }); + this.userService.stateChanged .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((state) => { diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html index 0b9e038a02..8e6341a709 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -505,7 +505,6 @@ [locale]="data.locale" [marketData]="marketDataItems" [symbol]="data.symbol" - [user]="user" (marketDataChanged)="onMarketDataChanged($event)" /> diff --git a/apps/client/src/app/components/admin-platform/admin-platform.component.ts b/apps/client/src/app/components/admin-platform/admin-platform.component.ts index 89175c5d33..10634d5dfb 100644 --- a/apps/client/src/app/components/admin-platform/admin-platform.component.ts +++ b/apps/client/src/app/components/admin-platform/admin-platform.component.ts @@ -3,10 +3,11 @@ import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { CreatePlatformDto, UpdatePlatformDto } from '@ghostfolio/common/dtos'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { getLocale, getLowercase } from '@ghostfolio/common/helper'; +import { PlatformsResponse } from '@ghostfolio/common/interfaces'; import type { Platform } from '@ghostfolio/prisma/browser'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { NotificationService } from '@ghostfolio/ui/notifications'; -import { AdminService, DataService } from '@ghostfolio/ui/services'; +import { DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { @@ -62,7 +63,9 @@ import { CreateOrUpdatePlatformDialogParams } from './create-or-update-platform- export class GfAdminPlatformComponent implements OnInit { public readonly locale = input(getLocale()); - protected dataSource = new MatTableDataSource(); + protected dataSource = new MatTableDataSource< + PlatformsResponse['platforms'][0] + >(); protected readonly displayedColumns = [ 'icon', @@ -74,7 +77,7 @@ export class GfAdminPlatformComponent implements OnInit { protected isLoading = false; protected readonly pageSize = DEFAULT_PAGE_SIZE; - protected platforms: Platform[]; + protected platforms: PlatformsResponse['platforms']; private readonly deviceType = computed( () => this.deviceDetectorService.deviceInfo().deviceType @@ -83,7 +86,6 @@ export class GfAdminPlatformComponent implements OnInit { private readonly paginator = viewChild.required(MatPaginator); private readonly sort = viewChild.required(MatSort); - private readonly adminService = inject(AdminService); private readonly changeDetectorRef = inject(ChangeDetectorRef); private readonly dataService = inject(DataService); private readonly destroyRef = inject(DestroyRef); @@ -139,7 +141,7 @@ export class GfAdminPlatformComponent implements OnInit { } private deletePlatform(aId: string) { - this.adminService + this.dataService .deletePlatform(aId) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe({ @@ -157,10 +159,10 @@ export class GfAdminPlatformComponent implements OnInit { private fetchPlatforms() { this.isLoading = true; - this.adminService + this.dataService .fetchPlatforms() .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((platforms) => { + .subscribe(({ platforms }) => { this.platforms = platforms; this.dataSource = new MatTableDataSource(platforms); @@ -191,7 +193,7 @@ export class GfAdminPlatformComponent implements OnInit { .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((platform: CreatePlatformDto | null) => { if (platform) { - this.adminService + this.dataService .postPlatform(platform) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe({ @@ -231,7 +233,7 @@ export class GfAdminPlatformComponent implements OnInit { .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((platform: UpdatePlatformDto | null) => { if (platform) { - this.adminService + this.dataService .putPlatform(platform) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe({ diff --git a/apps/client/src/app/components/admin-users/admin-users.html b/apps/client/src/app/components/admin-users/admin-users.html index 7b49dc5f60..98056f00f7 100644 --- a/apps/client/src/app/components/admin-users/admin-users.html +++ b/apps/client/src/app/components/admin-users/admin-users.html @@ -199,7 +199,7 @@
@if (element.lastRequestClient) { diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html index efb693e59a..de56a7b003 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -437,7 +437,6 @@ [locale]="data.locale" [marketData]="marketDataItems" [symbol]="assetProfile?.symbol" - [user]="user" (marketDataChanged)="onMarketDataChanged($event)" /> diff --git a/apps/client/src/app/components/home-overview/home-overview.component.ts b/apps/client/src/app/components/home-overview/home-overview.component.ts index 05a70ac9c2..8f73a10281 100644 --- a/apps/client/src/app/components/home-overview/home-overview.component.ts +++ b/apps/client/src/app/components/home-overview/home-overview.component.ts @@ -38,6 +38,9 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; import { Router, RouterModule } from '@angular/router'; +import { IonIcon } from '@ionic/angular/standalone'; +import { addIcons } from 'ionicons'; +import { arrowForwardOutline } from 'ionicons/icons'; import { DeviceDetectorService } from 'ngx-device-detector'; import { @@ -53,6 +56,7 @@ const MINIMUM_CHART_ITEMS = 3; GfHoldingsTableComponent, GfLineChartComponent, GfPortfolioPerformanceComponent, + IonIcon, MatButtonModule, MatCardModule, RouterModule @@ -90,9 +94,15 @@ export class GfHomeOverviewComponent implements OnInit { protected readonly user = signal(null); protected readonly routerLinkAccounts = internalRoutes.accounts.routerLink; + + protected readonly routerLinkHomeHoldings = + internalRoutes.home.subRoutes.holdings.routerLink; + protected readonly routerLinkPortfolio = internalRoutes.portfolio.routerLink; + protected readonly routerLinkPortfolioActivities = internalRoutes.portfolio.subRoutes.activities.routerLink; + protected readonly routerLinkPortfolioActivitiesCreate = internalRoutes.portfolio.subRoutes.activities.subRoutes.create.routerLink; @@ -153,6 +163,8 @@ export class GfHomeOverviewComponent implements OnInit { this.update(); } }); + + addIcons({ arrowForwardOutline }); } public ngOnInit() { diff --git a/apps/client/src/app/components/home-overview/home-overview.html b/apps/client/src/app/components/home-overview/home-overview.html index 11732af0f4..24ba5fb15d 100644 --- a/apps/client/src/app/components/home-overview/home-overview.html +++ b/apps/client/src/app/components/home-overview/home-overview.html @@ -102,8 +102,20 @@ appearance="outlined" class="h-100 holdings position-absolute w-100" > - + Holdings + + + @if ((errors()?.length ?? 0) > 0 && !isLoading()) { ) { - this.variantIndex = Math.floor( - Math.random() * GfSubscriptionInterstitialDialogComponent.VARIANTS_COUNT - ); + const isEligibleForTrial = + !this.data.user?.subscription?.subscribedAt && + hasPermission( + this.data.user?.permissions, + permissions.updateUserSettings + ); + + const variantsCount = isEligibleForTrial + ? GfSubscriptionInterstitialDialogComponent.VARIANTS_COUNT + 1 + : GfSubscriptionInterstitialDialogComponent.VARIANTS_COUNT; + + this.variantIndex = Math.floor(Math.random() * variantsCount); addIcons({ arrowForwardOutline, checkmarkCircleOutline }); } 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 8280067a87..5bac0e9baa 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 @@ -195,4 +195,46 @@
} + @case (4) { +
+
+
+
+
+
+
+
+ Ghostfolio Premium + +
+
+ Request a free trial +
+

+ No credit card required. The trial ends automatically. +

+
+
+
+ + + Try Premium + + +
+ } } diff --git a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts index afb0e2cea3..17d671c9b2 100644 --- a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts +++ b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts @@ -1,5 +1,5 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { DEFAULT_LOCALE, MCP_ENDPOINT } from '@ghostfolio/common/config'; +import { MCP_ENDPOINT } from '@ghostfolio/common/config'; import { CreateAccessDto, UpdateAccessDto } from '@ghostfolio/common/dtos'; import { canApplyFiltersToAccess } from '@ghostfolio/common/helper'; import { Filter, PortfolioPosition } from '@ghostfolio/common/interfaces'; @@ -48,7 +48,6 @@ import { Validators } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; -import { DateAdapter } from '@angular/material/core'; import { MatDatepickerModule } from '@angular/material/datepicker'; import { MAT_DIALOG_DATA, @@ -108,7 +107,6 @@ export class GfCreateOrUpdateAccessDialogComponent implements OnInit { private readonly data = inject(MAT_DIALOG_DATA); - private readonly dateAdapter = inject>(DateAdapter); private readonly dataService = inject(DataService); private readonly destroyRef = inject(DestroyRef); @@ -189,8 +187,6 @@ export class GfCreateOrUpdateAccessDialogComponent implements OnInit { this.hasExperimentalFeatures = settings.isExperimentalFeatures ?? false; this.tags = getTagFilters(tags); - this.dateAdapter.setLocale(settings.locale ?? DEFAULT_LOCALE); - this.changeDetectorRef.markForCheck(); }); diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts index defe751ee8..20425d831e 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -1,5 +1,5 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { E_MAIL_LINE_BREAK } from '@ghostfolio/common/config'; +import { TRY_SUBSCRIPTION_MAIL_HREF } from '@ghostfolio/common/config'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { getDateFormatString } from '@ghostfolio/common/helper'; import { User } from '@ghostfolio/common/interfaces'; @@ -49,13 +49,7 @@ export class GfUserAccountMembershipComponent { protected hasPermissionToCreateApiKey: boolean; protected hasPermissionToUpdateUserSettings: boolean; protected price: number; - protected readonly trySubscriptionMailHref = `mailto:hi@ghostfol.io?subject=Ghostfolio Premium Trial&body=${[ - 'Hello', - '', - 'I am interested in Ghostfolio Premium. Can you please send me a coupon code to try it for some time?', - '', - 'Kind regards' - ].join(E_MAIL_LINE_BREAK)}`; + protected readonly trySubscriptionMailHref = TRY_SUBSCRIPTION_MAIL_HREF; protected user: User; private couponId: string | undefined; diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.html b/apps/client/src/app/components/user-account-membership/user-account-membership.html index f18da13ed9..336f386139 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.html +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -50,7 +50,10 @@ } }
- @if (!user?.subscription?.subscribedAt) { + @if ( + !user?.subscription?.subscribedAt && + hasPermissionToUpdateUserSettings + ) {
-
+
Base Currency
-
+
@if (user?.settings?.isExperimentalFeatures) { -
-
+
+
Performance Calculation
-
+
} -
-
+
+
Language
@if (isCommunityLanguage()) {
@@ -77,7 +78,7 @@
}
-
+
-
-
+
+
Locale
-
+
Date and number format
-
+
{{ locale }} } - +
-
-
+
+
Appearance
-
+
-
-
+
+
Presenter View
Protection for sensitive information like absolute performances and quantity values
-
+
-
-
+
+
Zen Mode
Distraction-free experience for turbulent times
-
+
-
-
+
+
Biometric Authentication
Sign in with fingerprint
-
+
-
-
+
+
Experimental Features
Sneak peek at upcoming functionality
-
+
@if (deviceType() !== 'mobile' && hasPermissionToEnableGhostfolioAi) { -
-
+
+
Ghostfolio AI
Powered by third-party AI providers
-
+
(); - - public onDragEnter(event: DragEvent) { - event.preventDefault(); - event.stopPropagation(); - } - - public onDragOver(event: DragEvent) { - event.preventDefault(); - event.stopPropagation(); - } - - public onDrop(event: DragEvent) { - event.preventDefault(); - event.stopPropagation(); - - if (event.dataTransfer) { - // Prevent the browser's default behavior for handling the file drop - event.dataTransfer.dropEffect = 'copy'; - this.filesDropped.emit(event.dataTransfer.files); - } - } - - public onPaste(event: ClipboardEvent) { - const files = event.clipboardData?.files; - - if (files?.length) { - event.preventDefault(); - this.filesDropped.emit(files); - } - } -} diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts index c041b565aa..d3bc34acee 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts @@ -6,10 +6,7 @@ import { DEFAULT_LOCALE } from '@ghostfolio/common/config'; import { CreateOrderDto, UpdateOrderDto } from '@ghostfolio/common/dtos'; -import { - getDateFormatString, - getStringOrNull -} from '@ghostfolio/common/helper'; +import { getStringOrNull } from '@ghostfolio/common/helper'; import { AssetClassSelectorOption, LookupItem @@ -41,7 +38,6 @@ import { } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatCheckboxModule } from '@angular/material/checkbox'; -import { DateAdapter, MAT_DATE_LOCALE } from '@angular/material/core'; import { MatDatepickerModule } from '@angular/material/datepicker'; import { MAT_DIALOG_DATA, @@ -102,7 +98,6 @@ export class GfCreateOrUpdateActivityDialogComponent { protected currencies: string[] = []; protected currencyOfAssetProfile: string | undefined; protected currentMarketPrice: number | null = null; - protected defaultDateFormat: string; protected defaultLookupItems: LookupItem[] = []; protected hasPermissionToCreateOwnTag: boolean; protected isLoading = false; @@ -119,7 +114,6 @@ export class GfCreateOrUpdateActivityDialogComponent { private readonly changeDetectorRef = inject(ChangeDetectorRef); private readonly dataService = inject(DataService); - private readonly dateAdapter = inject>(DateAdapter); private readonly destroyRef = inject(DestroyRef); private readonly dialogRef = inject>(MatDialogRef); @@ -127,7 +121,6 @@ export class GfCreateOrUpdateActivityDialogComponent { private readonly impersonationStorageService = inject( ImpersonationStorageService ); - private locale = inject(MAT_DATE_LOCALE); private readonly userService = inject(UserService); public constructor() { @@ -143,15 +136,11 @@ export class GfCreateOrUpdateActivityDialogComponent { !this.impersonationStorageService.getId() && hasPermission(this.data.user?.permissions, permissions.createOwnTag); - this.locale = this.data.user.settings.locale ?? DEFAULT_LOCALE; this.mode = this.data.activity?.id ? 'update' : 'create'; - this.dateAdapter.setLocale(this.locale); - const { currencies } = this.dataService.fetchInfo(); this.currencies = currencies; - this.defaultDateFormat = getDateFormatString(this.locale); this.dataService .fetchPortfolioHoldings({ diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts index 6ebcc4f2ad..21136af668 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -1,4 +1,3 @@ -import { GfFileDropDirective } from '@ghostfolio/client/directives/file-drop/file-drop.directive'; import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { @@ -23,6 +22,10 @@ import { AssetClass } from '@ghostfolio/prisma/enums'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer'; import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header'; +import { + FileFormat, + GfFileDropAreaComponent +} from '@ghostfolio/ui/file-drop-area'; import { DataService } from '@ghostfolio/ui/services'; import { @@ -67,11 +70,7 @@ import { MatTableDataSource } from '@angular/material/table'; import { MatTooltipModule } from '@angular/material/tooltip'; import { IonIcon } from '@ionic/angular/standalone'; import { addIcons } from 'ionicons'; -import { - cloudUploadOutline, - informationCircleOutline, - warningOutline -} from 'ionicons/icons'; +import { informationCircleOutline, warningOutline } from 'ionicons/icons'; import { isArray, sortBy } from 'lodash-es'; import ms from 'ms'; import { from, switchMap } from 'rxjs'; @@ -90,7 +89,7 @@ import { GfActivitiesTableComponent, GfDialogFooterComponent, GfDialogHeaderComponent, - GfFileDropDirective, + GfFileDropAreaComponent, IonIcon, MatButtonModule, MatCheckboxModule, @@ -108,14 +107,49 @@ import { templateUrl: 'import-activities-dialog.html' }) export class GfImportActivitiesDialogComponent { - private static readonly FILE_EXTENSIONS_OF_GHOSTFOLIO_AI = [ - 'csv', - 'jpeg', - 'jpg', - 'pdf', - 'png' + private static readonly FILE_FORMAT_CSV: FileFormat = { + extensions: ['csv'], + name: 'CSV', + sampleUrl: + 'https://github.com/ghostfolio/ghostfolio/blob/main/test/import/ok/sample.csv' + }; + + private static readonly FILE_FORMAT_JSON: FileFormat = { + extensions: ['json'], + name: 'JSON', + sampleUrl: + 'https://github.com/ghostfolio/ghostfolio/blob/main/test/import/ok/sample.json' + }; + + private static readonly FILE_FORMATS: FileFormat[] = [ + GfImportActivitiesDialogComponent.FILE_FORMAT_CSV, + GfImportActivitiesDialogComponent.FILE_FORMAT_JSON + ]; + + private static readonly FILE_FORMATS_OF_GHOSTFOLIO_AI: FileFormat[] = [ + GfImportActivitiesDialogComponent.FILE_FORMAT_CSV, + { extensions: ['jpeg', 'jpg'], name: 'JPG' }, + { extensions: ['pdf'], name: 'PDF' }, + { extensions: ['png'], name: 'PNG' } ]; + private static readonly FILE_EXTENSIONS_OF_GHOSTFOLIO_AI = + GfImportActivitiesDialogComponent.FILE_FORMATS_OF_GHOSTFOLIO_AI.flatMap( + ({ extensions }) => { + return extensions; + } + ); + + private static readonly FILE_FORMATS_WITH_GHOSTFOLIO_AI = sortBy( + [ + ...GfImportActivitiesDialogComponent.FILE_FORMATS_OF_GHOSTFOLIO_AI, + GfImportActivitiesDialogComponent.FILE_FORMAT_JSON + ], + ({ name }) => { + return name; + } + ); + protected readonly assetProfileForm = new FormGroup({ assetProfileIdentifier: new FormControl(null, { validators: [Validators.required] @@ -127,6 +161,7 @@ export class GfImportActivitiesDialogComponent { protected details: any[] = []; protected dialogTitle = $localize`Import Activities`; protected errorMessages: string[] = []; + protected readonly ghostfolioAiLoadingText = $localize`Ghostfolio AI is processing the file...`; protected readonly ghostfolioAiTooltip = $localize`The content of your file will be processed by third-party AI providers. Please remove any personal data before uploading.`; protected readonly hasPermissionToEnableGhostfolioAi = hasPermission( @@ -144,6 +179,7 @@ export class GfImportActivitiesDialogComponent { protected isLoading = false; protected isMaxActivitiesOfGhostfolioAiReached = false; + protected readonly language = document.documentElement.lang; protected readonly maxActivitiesOfGhostfolioAi = AI_MAX_ACTIVITIES; protected mode: 'DIVIDEND'; protected pageIndex = 0; @@ -178,7 +214,13 @@ export class GfImportActivitiesDialogComponent { private readonly userService = inject(UserService); public constructor() { - addIcons({ cloudUploadOutline, informationCircleOutline, warningOutline }); + addIcons({ informationCircleOutline, warningOutline }); + } + + protected get fileFormats() { + return this.isGhostfolioAiEnabled + ? GfImportActivitiesDialogComponent.FILE_FORMATS_WITH_GHOSTFOLIO_AI + : GfImportActivitiesDialogComponent.FILE_FORMATS; } public ngOnInit() { @@ -271,18 +313,18 @@ export class GfImportActivitiesDialogComponent { } } - protected onFilesDropped({ - files, + protected onFileSelected({ + file, stepper }: { - files: FileList; + file: File; stepper: MatStepper; }) { - if (files.length === 0 || this.importStep !== ImportStep.UPLOAD_FILE) { + if (this.importStep !== ImportStep.UPLOAD_FILE) { return; } - this.handleFile({ stepper, file: files[0] }); + this.handleFile({ file, stepper }); } protected onGhostfolioAiChange({ checked }: MatCheckboxChange) { @@ -348,33 +390,6 @@ export class GfImportActivitiesDialogComponent { aStepper.reset(); } - protected onSelectFile(stepper: MatStepper) { - const input = document.createElement('input'); - - input.accept = this.isGhostfolioAiEnabled - ? [ - 'application/JSON', - ...GfImportActivitiesDialogComponent.FILE_EXTENSIONS_OF_GHOSTFOLIO_AI.map( - (fileExtension) => { - return `.${fileExtension}`; - } - ) - ].join(', ') - : 'application/JSON, .csv'; - input.type = 'file'; - - input.onchange = (event) => { - // Getting the file reference - const file = (event.target as HTMLInputElement).files?.[0]; - - if (file) { - this.handleFile({ file, stepper }); - } - }; - - input.click(); - } - protected updateSelection(activities: Activity[]) { this.selectedActivities = activities.filter(({ error }) => { return !error; diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html index 75c3ea5458..eea156f9c2 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -74,55 +74,13 @@ } @else {
- @if (isLoading) { -
- - Ghostfolio AI is processing the file... -
- } @else { - - } -

- - The following file formats are supported: - CSV - @if (isGhostfolioAiEnabled) { - , JPG, - } @else { - or - } - JSON - @if (isGhostfolioAiEnabled) { - , PDF - or - PNG - } - -

+ @if ( data.deviceType !== 'mobile' && hasPermissionToEnableGhostfolioAi ) { diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.scss b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.scss index 1b46f06863..edf449bd69 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.scss +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.scss @@ -4,10 +4,6 @@ display: block; .mat-mdc-dialog-content { - a { - color: rgba(var(--palette-primary-500), 1); - } - mat-stepper { @include mat.stepper-overrides( ( @@ -25,35 +21,6 @@ } } - .drop-area { - background-color: rgba(var(--palette-foreground-base), 0.02); - border: 1px dashed - rgba( - var(--palette-foreground-divider), - var(--palette-foreground-divider-alpha) - ); - border-radius: 0.25rem; - - &:hover { - border-color: rgba(var(--palette-primary-500), 1) !important; - color: rgba(var(--palette-primary-500), 1); - } - - .cloud-icon { - font-size: 2.5rem; - } - - .mat-mdc-progress-spinner { - @include mat.progress-spinner-overrides( - ( - active-indicator-color: var(--gf-theme-primary-500) - ) - ); - - margin: 0.625rem 0; - } - } - .mat-mdc-form-field { .mat-mdc-progress-spinner { right: 1.5rem; @@ -80,14 +47,3 @@ } } } - -:host-context(.theme-dark) { - .mat-mdc-dialog-content { - .drop-area { - border-color: rgba( - var(--palette-foreground-divider-dark), - var(--palette-foreground-divider-dark-alpha) - ); - } - } -} diff --git a/apps/client/src/app/services/web-authn.service.ts b/apps/client/src/app/services/web-authn.service.ts index b769e8506c..37ba6ebf61 100644 --- a/apps/client/src/app/services/web-authn.service.ts +++ b/apps/client/src/app/services/web-authn.service.ts @@ -66,7 +66,7 @@ export class WebAuthnService { const deviceId = this.getDeviceId(); return this.http - .delete(`/api/v1/auth-device/${deviceId}`) + .delete(`/api/v1/auth-devices/${deviceId}`) .pipe( catchError((error) => { console.warn(`Could not deregister device ${deviceId}`, error); diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 4ac41ec22f..4903891149 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -50,7 +50,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 81 + 82 libs/common/src/lib/routes/routes.ts @@ -751,7 +751,7 @@ Ghostfolio AI has processed the maximum of activities. The file can have more activities. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 193 + 151 @@ -879,7 +879,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 518 @@ -927,11 +927,11 @@ Data apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 528 + 527 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 564 + 563 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -1054,6 +1054,14 @@ 71 + + Request a free trial + Request a free trial + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 211 + + Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. @@ -1127,7 +1135,7 @@ The file is larger than MB apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 396 + 431 @@ -1159,7 +1167,7 @@ Oooh! No s’han pogut recopilar les dades históriques. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 287 + 285 @@ -1195,11 +1203,11 @@ Importar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 231 + 189 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 268 + 226 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -1335,7 +1343,7 @@ Configuració del Proveïdor de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 631 @@ -1343,7 +1351,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 728 + 727 @@ -1355,7 +1363,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 710 + 709 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1555,7 +1563,7 @@ Recollida de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 751 + 750 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1607,7 +1615,7 @@ Afegir apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 619 + 618 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1647,7 +1655,7 @@ Està segur que vol eliminar aquesta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 131 + 133 @@ -1783,7 +1791,7 @@ No auto-renewal on membership. apps/client/src/app/components/user-account-membership/user-account-membership.html - 79 + 82 @@ -2039,7 +2047,7 @@ Informar d’un Problema amb les Dades apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 476 @@ -2074,6 +2082,14 @@ 90 + + No credit card required. The trial ends automatically. + No credit card required. The trial ends automatically. + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 214 + + Manage Activities Gestionar Activitats @@ -2087,7 +2103,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 530 + 529 @@ -2243,7 +2259,7 @@ Import total libs/ui/src/lib/investment-chart/investment-chart.component.ts - 166 + 182 @@ -2259,7 +2275,7 @@ Taxa d’estalvi libs/ui/src/lib/investment-chart/investment-chart.component.ts - 215 + 232 @@ -2279,7 +2295,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 356 + 362 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -2321,14 +2337,6 @@ apps/client/src/app/pages/landing/landing-page.html 352 - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 112 - - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 121 - apps/client/src/app/pages/pricing/pricing-page.html 336 @@ -2347,7 +2355,7 @@ Inicieu la sessió amb Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 46 + 47 @@ -2363,7 +2371,7 @@ Manteniu la sessió iniciada apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 69 @@ -2371,7 +2379,7 @@ Ups! Un proveïdor de dades està tenint problemes. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html - 8 + 9 @@ -2439,7 +2447,7 @@ Actius totals apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 195 + 202 @@ -2447,7 +2455,7 @@ Poder adquisitiu apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 335 + 342 @@ -2455,7 +2463,7 @@ Exclòs de l’anàlisi apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 367 + 374 @@ -2463,7 +2471,7 @@ Passius apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 398 + 405 apps/client/src/app/pages/features/features-page.html @@ -2475,7 +2483,7 @@ Valor net apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 418 + 425 @@ -2483,7 +2491,7 @@ Rendiment anualitzat apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 433 + 440 @@ -2633,6 +2641,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 181 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 224 + Today @@ -2715,7 +2727,7 @@ Vaja! No s’ha pogut concedir l’accés. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 320 + 316 @@ -2771,7 +2783,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 316 + 322 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2791,7 +2803,7 @@ Introduïu el vostre codi de cupó. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 203 + 197 @@ -2807,7 +2819,7 @@ No s’ha pogut bescanviar el codi de cupó apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 181 + 175 @@ -2823,7 +2835,7 @@ El codi del cupó s’ha bescanviat apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 194 + 188 @@ -2841,9 +2853,13 @@ Try Premium Prova Premium + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 235 + apps/client/src/app/components/user-account-membership/user-account-membership.html - 58 + 61 @@ -2851,7 +2867,7 @@ Bescanviar el cupó apps/client/src/app/components/user-account-membership/user-account-membership.html - 72 + 75 @@ -2863,7 +2879,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 221 @@ -2911,7 +2927,7 @@ Derived from the portfolio you are viewing apps/client/src/app/components/user-account-settings/user-account-settings.html - 27 + 28 @@ -2935,7 +2951,7 @@ Vista del presentador apps/client/src/app/components/user-account-settings/user-account-settings.html - 226 + 232 @@ -2943,7 +2959,7 @@ Protecció per a informació sensible com ara rendiments absoluts i valors de quantitat apps/client/src/app/components/user-account-settings/user-account-settings.html - 228 + 234 @@ -2951,7 +2967,7 @@ Moneda base apps/client/src/app/components/user-account-settings/user-account-settings.html - 13 + 14 @@ -2967,7 +2983,7 @@ Llengua apps/client/src/app/components/user-account-settings/user-account-settings.html - 61 + 67 @@ -2975,7 +2991,7 @@ Si falta alguna traducció, si us plau, ajudeu-nos a ampliar-la aquí. apps/client/src/app/components/user-account-settings/user-account-settings.html - 64 + 70 @@ -2983,11 +2999,11 @@ Localització apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 669 + 668 apps/client/src/app/components/user-account-settings/user-account-settings.html - 156 + 162 @@ -2995,7 +3011,7 @@ Format de data i número apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 164 @@ -3003,15 +3019,15 @@ Close Account apps/client/src/app/components/user-account-settings/user-account-settings.html - 387 + 393 apps/client/src/app/components/user-account-settings/user-account-settings.html - 397 + 403 apps/client/src/app/components/user-account-settings/user-account-settings.html - 404 + 410 @@ -3019,7 +3035,7 @@ Aparença apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 207 @@ -3035,7 +3051,7 @@ Llum apps/client/src/app/components/user-account-settings/user-account-settings.html - 216 + 222 @@ -3051,7 +3067,7 @@ Fosc apps/client/src/app/components/user-account-settings/user-account-settings.html - 217 + 223 @@ -3059,7 +3075,7 @@ Mode Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 244 + 250 apps/client/src/app/pages/features/features-page.html @@ -3071,7 +3087,7 @@ Experiència sense distraccions per a temps turbulents apps/client/src/app/components/user-account-settings/user-account-settings.html - 246 + 252 @@ -3079,7 +3095,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 257 + 264 @@ -3095,7 +3111,7 @@ Autenticació biomètrica apps/client/src/app/components/user-account-settings/user-account-settings.html - 261 + 267 @@ -3103,7 +3119,7 @@ Inicieu la sessió amb l’empremta digital apps/client/src/app/components/user-account-settings/user-account-settings.html - 263 + 269 @@ -3111,7 +3127,7 @@ Característiques experimentals apps/client/src/app/components/user-account-settings/user-account-settings.html - 280 + 286 @@ -3119,7 +3135,7 @@ Doneu un cop d’ull a les properes funcionalitats apps/client/src/app/components/user-account-settings/user-account-settings.html - 282 + 288 @@ -3127,7 +3143,7 @@ Exporta dades apps/client/src/app/components/user-account-settings/user-account-settings.html - 331 + 337 @@ -3135,7 +3151,7 @@ Zona de perill apps/client/src/app/components/user-account-settings/user-account-settings.html - 340 + 346 @@ -3143,7 +3159,7 @@ Tanca el compte apps/client/src/app/components/user-account-settings/user-account-settings.html - 416 + 422 @@ -3167,11 +3183,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 244 + 305 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 630 + 665 @@ -3195,11 +3211,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 242 + 303 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 628 + 663 @@ -3211,7 +3227,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 245 + 306 @@ -3715,7 +3731,7 @@ apps/client/src/app/pages/about/overview/about-overview-page.html - 193 + 194 apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts @@ -3796,7 +3812,7 @@ For security reasons, please delete all activities and accounts first before your Ghostfolio account can be closed. apps/client/src/app/components/user-account-settings/user-account-settings.html - 407 + 413 @@ -3948,7 +3964,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 233 apps/client/src/app/pages/public/public-page.html @@ -4287,14 +4303,6 @@ 132 - - 360° View - Vista de 360° - - apps/client/src/app/pages/landing/landing-page.html - 142 - - Get the full picture of your personal finances across multiple platforms. Obtingueu la imatge completa de les vostres finances personals en múltiples plataformes. @@ -4303,14 +4311,6 @@ 145 - - Web3 Ready - Web3 llest - - apps/client/src/app/pages/landing/landing-page.html - 153 - - Basic Materials Basic Materials @@ -4804,11 +4804,11 @@ thereof Dividend Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 178 + 185 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 306 + 313 @@ -4836,7 +4836,7 @@ Activitats d’importació apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 124 + 162 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4852,7 +4852,7 @@ Importar dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 180 + 241 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4868,7 +4868,7 @@ S’estan important dades... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 223 + 284 @@ -4876,7 +4876,7 @@ La importació s’ha completat apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 234 + 295 @@ -4892,11 +4892,11 @@ S’estan validant les dades... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 369 + 404 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 429 + 464 @@ -4939,16 +4939,16 @@ Choose or drop a file here Trieu o deixeu anar un fitxer aquí - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 95 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 20 The following file formats are supported: S’admeten els formats de fitxer següents: - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 102 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 26 @@ -4956,7 +4956,7 @@ Seleccioneu Dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 156 + 114 @@ -4964,7 +4964,7 @@ Seleccioneu Activitats apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 158 + 116 @@ -4972,7 +4972,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 587 @@ -4980,11 +4980,11 @@ Enrere apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 222 + 180 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 260 + 218 @@ -5064,7 +5064,7 @@ The CSV file has more than rows of activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 404 + 439 @@ -5296,7 +5296,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 464 + 463 @@ -5336,7 +5336,7 @@ A dalt apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 329 + 336 @@ -5344,7 +5344,7 @@ A baix apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 382 + 389 @@ -5352,7 +5352,7 @@ Evolució de la cartera apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 468 + 476 @@ -5360,7 +5360,7 @@ Cronologia de la inversió apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 496 + 504 @@ -5368,7 +5368,7 @@ Ratxa actual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 517 + 525 @@ -5376,7 +5376,7 @@ Ratxa més llarga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 526 + 534 @@ -5384,7 +5384,7 @@ Cronologia de dividends apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 554 + 562 @@ -5620,7 +5620,7 @@ Powered by third-party AI providers apps/client/src/app/components/user-account-settings/user-account-settings.html - 300 + 306 @@ -5672,7 +5672,7 @@ The content of your file will be processed by third-party AI providers. Please remove any personal data before uploading. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 126 + 165 @@ -5708,7 +5708,7 @@ Continueu amb Google apps/client/src/app/pages/register/register-page.html - 41 + 42 @@ -6157,7 +6157,7 @@ Realment voleu eliminar el saldo d’aquest compte? libs/ui/src/lib/account-balances/account-balances.component.ts - 134 + 127 @@ -6324,8 +6324,8 @@ Ghostfolio AI is processing the file... Ghostfolio AI is processing the file... - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 82 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 164 @@ -6428,6 +6428,18 @@ 290 + + Return on Investment (total return with dividends) + Return on Investment (total return with dividends) + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 165 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 270 + + Add to Watchlist Add to Watchlist @@ -6501,7 +6513,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 507 + 514 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -6561,7 +6573,7 @@ Compte apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 110 + 105 libs/common/src/lib/routes/routes.ts @@ -6681,15 +6693,15 @@ Fons d’emergència apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 272 + 279 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 350 + 357 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 452 + 459 apps/client/src/app/pages/features/features-page.html @@ -6875,6 +6887,10 @@ apps/client/src/app/components/admin-users/admin-users.html 247 + + apps/client/src/app/components/home-overview/home-overview.html + 110 + libs/ui/src/lib/accounts-table/accounts-table.component.html 339 @@ -6893,7 +6909,7 @@ Sign in with OpenID Connect apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 57 + 58 @@ -6965,7 +6981,7 @@ Efectiu apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 304 + 311 @@ -7197,47 +7213,47 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 96 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 129 apps/client/src/app/components/user-account-settings/user-account-settings.html - 128 + 134 apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 138 apps/client/src/app/components/user-account-settings/user-account-settings.html - 136 + 142 apps/client/src/app/components/user-account-settings/user-account-settings.html - 140 + 146 apps/client/src/app/components/user-account-settings/user-account-settings.html - 146 + 152 apps/client/src/app/pages/features/features-page.html @@ -7413,7 +7429,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 420 + 416 @@ -7433,7 +7449,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 756 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7489,7 +7505,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 287 + 294 @@ -7497,7 +7513,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 758 + 757 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7525,7 +7541,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 150 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -7785,7 +7801,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 601 + 600 @@ -8011,7 +8027,7 @@ Could not generate an API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 142 + 136 @@ -8019,7 +8035,7 @@ Set this API key in your self-hosted environment: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 151 @@ -8035,7 +8051,7 @@ Ghostfolio Premium Data Provider API Key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 158 + 152 @@ -8043,7 +8059,7 @@ Do you really want to generate a new API key? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 163 + 157 @@ -8067,7 +8083,7 @@ AI-assisted import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 136 + 94 @@ -8091,7 +8107,7 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 767 + 766 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -8146,6 +8162,14 @@ 210 + + All in One Place + All in One Place + + apps/client/src/app/pages/landing/landing-page.html + 142 + + Received Access Received Access @@ -8223,7 +8247,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 642 + 641 @@ -8231,7 +8255,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 678 + 677 @@ -8247,7 +8271,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 694 + 693 @@ -8255,7 +8279,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 655 + 654 @@ -8327,7 +8351,7 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 69 + 73 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -8407,7 +8431,7 @@ Performance Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 440 + 447 @@ -8572,7 +8596,7 @@ Performance Calculation apps/client/src/app/components/user-account-settings/user-account-settings.html - 36 + 37 @@ -8669,7 +8693,7 @@ {VAR_PLURAL, plural, =1 {Ghostfolio AI could not match 1 activity of the file } other {Ghostfolio AI could not match activities of the file }} apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 172 + 130 @@ -8918,6 +8942,14 @@ 307 + + Privacy First + Privacy First + + apps/client/src/app/pages/landing/landing-page.html + 153 + + Available Available @@ -9152,7 +9184,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 492 + 491 @@ -9268,11 +9300,11 @@ Return on Average Investment (total return with dividends) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 159 + 157 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 264 + 262 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 955790136f..8db3cba122 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -446,7 +446,7 @@ Ghostfolio AI hat die maximale Anzahl von Aktivitäten verarbeitet. Die Datei kann weitere Aktivitäten enthalten. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 193 + 151 @@ -474,7 +474,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 518 @@ -514,11 +514,11 @@ Datum apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 528 + 527 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 564 + 563 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -581,6 +581,14 @@ 71 + + Request a free trial + Fordere eine kostenlose Testphase an + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 211 + + Historical Data Historische Daten @@ -714,7 +722,7 @@ Hinzufügen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 619 + 618 apps/client/src/app/components/admin-overview/admin-overview.html @@ -770,7 +778,7 @@ Keine automatische Erneuerung der Mitgliedschaft. apps/client/src/app/components/user-account-membership/user-account-membership.html - 79 + 82 @@ -874,7 +882,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 81 + 82 libs/common/src/lib/routes/routes.ts @@ -897,6 +905,14 @@ 297 + + No credit card required. The trial ends automatically. + Keine Kreditkarte erforderlich. Die Testphase endet automatisch. + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 214 + + Manage Activities Aktivitäten verwalten @@ -910,7 +926,7 @@ Split-Verhältnis apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 530 + 529 @@ -954,7 +970,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 356 + 362 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -996,14 +1012,6 @@ apps/client/src/app/pages/landing/landing-page.html 352 - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 112 - - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 121 - apps/client/src/app/pages/pricing/pricing-page.html 336 @@ -1022,7 +1030,7 @@ Einloggen mit Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 46 + 47 @@ -1038,7 +1046,7 @@ Eingeloggt bleiben apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 69 @@ -1090,7 +1098,7 @@ Gesamtanlagevermögen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 195 + 202 @@ -1098,7 +1106,7 @@ Kaufkraft apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 335 + 342 @@ -1106,7 +1114,7 @@ Gesamtvermögen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 418 + 425 @@ -1114,7 +1122,7 @@ Performance pro Jahr apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 433 + 440 @@ -1182,7 +1190,7 @@ Datenfehler melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 476 @@ -1306,7 +1314,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 245 + 306 @@ -1366,7 +1374,7 @@ Bitte gebe deinen Gutscheincode ein. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 203 + 197 @@ -1382,7 +1390,7 @@ Gutscheincode konnte nicht eingelöst werden apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 181 + 175 @@ -1398,7 +1406,7 @@ Gutscheincode wurde eingelöst apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 194 + 188 @@ -1424,9 +1432,13 @@ Try Premium Premium ausprobieren + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 235 + apps/client/src/app/components/user-account-membership/user-account-membership.html - 58 + 61 @@ -1434,7 +1446,7 @@ Gutschein einlösen apps/client/src/app/components/user-account-membership/user-account-membership.html - 72 + 75 @@ -1450,7 +1462,7 @@ Präsentationsansicht apps/client/src/app/components/user-account-settings/user-account-settings.html - 226 + 232 @@ -1458,7 +1470,7 @@ Basiswährung apps/client/src/app/components/user-account-settings/user-account-settings.html - 13 + 14 @@ -1474,11 +1486,11 @@ Lokalität apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 669 + 668 apps/client/src/app/components/user-account-settings/user-account-settings.html - 156 + 162 @@ -1486,7 +1498,7 @@ Datums- und Zahlenformat apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 164 @@ -1494,7 +1506,7 @@ Zen Modus apps/client/src/app/components/user-account-settings/user-account-settings.html - 244 + 250 apps/client/src/app/pages/features/features-page.html @@ -1506,7 +1518,7 @@ Einloggen mit Fingerabdruck apps/client/src/app/components/user-account-settings/user-account-settings.html - 263 + 269 @@ -1518,7 +1530,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 316 + 322 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1878,7 +1890,7 @@ apps/client/src/app/pages/about/overview/about-overview-page.html - 193 + 194 apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts @@ -2050,7 +2062,7 @@ Die CSV-Datei hat mehr als Zeilen mit Aktivitäten apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 404 + 439 @@ -2114,7 +2126,7 @@ Zeitstrahl der Investitionen apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 496 + 504 @@ -2122,7 +2134,7 @@ Gewinner apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 329 + 336 @@ -2130,7 +2142,7 @@ Verlierer apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 382 + 389 @@ -2166,7 +2178,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 233 apps/client/src/app/pages/public/public-page.html @@ -2378,7 +2390,7 @@ Daten importieren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 223 + 284 @@ -2386,7 +2398,7 @@ Der Import wurde abgeschlossen apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 234 + 295 @@ -2494,7 +2506,7 @@ Weiter mit Google apps/client/src/app/pages/register/register-page.html - 41 + 42 @@ -2574,7 +2586,7 @@ Aktivitäten importieren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 124 + 162 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2682,7 +2694,7 @@ Sprache apps/client/src/app/components/user-account-settings/user-account-settings.html - 61 + 67 @@ -2706,11 +2718,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 244 + 305 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 630 + 665 @@ -2726,11 +2738,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 242 + 303 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 628 + 663 @@ -2874,7 +2886,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 507 + 514 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2906,7 +2918,7 @@ Die Datei ist grösser als MB apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 396 + 431 @@ -2990,7 +3002,7 @@ Experimentelle Funktionen apps/client/src/app/components/user-account-settings/user-account-settings.html - 280 + 286 @@ -3038,7 +3050,7 @@ Von der Analyse ausgenommen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 367 + 374 @@ -3050,7 +3062,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 221 @@ -3058,15 +3070,15 @@ Konto schliessen apps/client/src/app/components/user-account-settings/user-account-settings.html - 387 + 393 apps/client/src/app/components/user-account-settings/user-account-settings.html - 397 + 403 apps/client/src/app/components/user-account-settings/user-account-settings.html - 404 + 410 @@ -3074,7 +3086,7 @@ Aussehen apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 207 @@ -3090,7 +3102,7 @@ Hell apps/client/src/app/components/user-account-settings/user-account-settings.html - 216 + 222 @@ -3106,7 +3118,7 @@ Dunkel apps/client/src/app/components/user-account-settings/user-account-settings.html - 217 + 223 @@ -3114,7 +3126,7 @@ Gesamtbetrag libs/ui/src/lib/investment-chart/investment-chart.component.ts - 166 + 182 @@ -3122,7 +3134,7 @@ Portfolio Wertentwicklung apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 468 + 476 @@ -3138,7 +3150,7 @@ Sparrate libs/ui/src/lib/investment-chart/investment-chart.component.ts - 215 + 232 @@ -3146,7 +3158,7 @@ Konto apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 110 + 105 libs/common/src/lib/routes/routes.ts @@ -3246,7 +3258,7 @@ Bargeld apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 304 + 311 @@ -3278,15 +3290,15 @@ Notfallfonds apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 272 + 279 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 350 + 357 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 452 + 459 apps/client/src/app/pages/features/features-page.html @@ -3437,8 +3449,8 @@ The following file formats are supported: Folgende Dateiformate werden unterstützt: - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 102 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 26 @@ -3446,11 +3458,11 @@ Zurück apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 222 + 180 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 260 + 218 @@ -3518,7 +3530,7 @@ Zeitstrahl der Dividenden apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 554 + 562 @@ -3606,11 +3618,11 @@ Daten validieren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 369 + 404 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 429 + 464 @@ -3618,11 +3630,11 @@ Importieren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 231 + 189 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 268 + 226 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -3714,7 +3726,7 @@ Dividenden importieren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 180 + 241 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3806,7 +3818,7 @@ Ausblenden von sensiblen Informationen wie absoluter Performance und Stückzahl apps/client/src/app/components/user-account-settings/user-account-settings.html - 228 + 234 @@ -3814,7 +3826,7 @@ Unbeschwertes Erlebnis für turbulente Zeiten apps/client/src/app/components/user-account-settings/user-account-settings.html - 246 + 252 @@ -3822,7 +3834,7 @@ Investitionen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 257 + 264 @@ -3830,7 +3842,7 @@ Vorschau auf kommende Funktionalität apps/client/src/app/components/user-account-settings/user-account-settings.html - 282 + 288 @@ -3924,6 +3936,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 181 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 224 + Upgrade Plan @@ -4078,7 +4094,7 @@ Bereitgestellt durch KI-Drittanbieter apps/client/src/app/components/user-account-settings/user-account-settings.html - 300 + 306 @@ -4185,6 +4201,18 @@ 19 + + Return on Investment (total return with dividends) + Rendite auf die Investition (Gesamtrendite inklusive Dividenden) + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 165 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 270 + + Add to Watchlist Zur Beobachtungsliste hinzufügen @@ -4350,7 +4378,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 710 + 709 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4382,7 +4410,7 @@ Möchtest du diese Plattform wirklich löschen? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 131 + 133 @@ -4398,11 +4426,11 @@ davon Dividenden Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 178 + 185 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 306 + 313 @@ -4498,7 +4526,7 @@ Dividenden auswählen apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 156 + 114 @@ -4506,7 +4534,7 @@ Aktivitäten auswählen apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 158 + 116 @@ -4514,7 +4542,7 @@ Anteile nachher apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 587 @@ -4538,7 +4566,7 @@ Aktueller Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 517 + 525 @@ -4546,7 +4574,7 @@ Längster Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 526 + 534 @@ -4588,6 +4616,10 @@ apps/client/src/app/components/admin-users/admin-users.html 247 + + apps/client/src/app/components/home-overview/home-overview.html + 110 + libs/ui/src/lib/accounts-table/accounts-table.component.html 339 @@ -4598,7 +4630,7 @@ Verbindlichkeiten apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 398 + 405 apps/client/src/app/pages/features/features-page.html @@ -4650,7 +4682,7 @@ Bitte lösche aus Sicherheitsgründen zuerst alle Aktivitäten und Konten, bevor dein Ghostfolio Konto geschlossen werden kann. apps/client/src/app/components/user-account-settings/user-account-settings.html - 407 + 413 @@ -4794,7 +4826,7 @@ Scraper Konfiguration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 631 @@ -5038,7 +5070,7 @@ Einloggen mit OpenID Connect apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 57 + 58 @@ -5218,7 +5250,7 @@ Biometrische Authentifizierung apps/client/src/app/components/user-account-settings/user-account-settings.html - 261 + 267 @@ -5310,7 +5342,7 @@ Daten exportieren apps/client/src/app/components/user-account-settings/user-account-settings.html - 331 + 337 @@ -5453,22 +5485,6 @@ 132 - - 360° View - 360° Ansicht - - apps/client/src/app/pages/landing/landing-page.html - 142 - - - - Web3 Ready - Web3 ready - - apps/client/src/app/pages/landing/landing-page.html - 153 - - Basic Materials Grundstoffe @@ -6075,8 +6091,8 @@ Choose or drop a file here Wähle eine Datei aus oder ziehe sie hierhin - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 95 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 20 @@ -6500,7 +6516,7 @@ Ups! Die historischen Daten konnten nicht geparsed werden. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 287 + 285 @@ -6568,7 +6584,7 @@ Möchtest du diesen Cash-Bestand wirklich löschen? libs/ui/src/lib/account-balances/account-balances.component.ts - 134 + 127 @@ -6576,7 +6592,7 @@ Wenn eine Übersetzung fehlt, unterstütze uns bitte dabei, sie hier zu ergänzen. apps/client/src/app/components/user-account-settings/user-account-settings.html - 64 + 70 @@ -6592,7 +6608,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 728 + 727 @@ -6628,7 +6644,7 @@ Ups! Der Zugang konnte nicht gewährt werden. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 320 + 316 @@ -6680,7 +6696,7 @@ Position abschliessen apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 464 + 463 @@ -6800,7 +6816,7 @@ Ups! Ein Datenprovider-Partner hat gerade ein Problem. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html - 8 + 9 @@ -6847,8 +6863,8 @@ Ghostfolio AI is processing the file... Ghostfolio AI verarbeitet die Datei... - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 82 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 164 @@ -6864,7 +6880,7 @@ Finanzmarktdaten synchronisieren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 751 + 750 apps/client/src/app/components/admin-overview/admin-overview.html @@ -7065,7 +7081,7 @@ Gefahrenzone apps/client/src/app/components/user-account-settings/user-account-settings.html - 340 + 346 @@ -7073,7 +7089,7 @@ Konto schliessen apps/client/src/app/components/user-account-settings/user-account-settings.html - 416 + 422 @@ -7121,7 +7137,7 @@ Abgeleitet vom Portfolio, das du betrachtest apps/client/src/app/components/user-account-settings/user-account-settings.html - 27 + 28 @@ -7177,7 +7193,7 @@ Der Inhalt deiner Datei wird von KI-Drittanbietern verarbeitet. Bitte entferne vor dem Hochladen alle personenbezogenen Daten. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 126 + 165 @@ -7221,47 +7237,47 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 96 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 129 apps/client/src/app/components/user-account-settings/user-account-settings.html - 128 + 134 apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 138 apps/client/src/app/components/user-account-settings/user-account-settings.html - 136 + 142 apps/client/src/app/components/user-account-settings/user-account-settings.html - 140 + 146 apps/client/src/app/components/user-account-settings/user-account-settings.html - 146 + 152 apps/client/src/app/pages/features/features-page.html @@ -7437,7 +7453,7 @@ Ups! Der Zugang konnte nicht bearbeitet werden. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 420 + 416 @@ -7457,7 +7473,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 756 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7513,7 +7529,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 287 + 294 @@ -7521,7 +7537,7 @@ Schliessen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 758 + 757 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7549,7 +7565,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 150 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -7809,7 +7825,7 @@ Anteile vorher apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 601 + 600 @@ -8035,7 +8051,7 @@ API-Schlüssel konnte nicht erstellt werden apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 142 + 136 @@ -8043,7 +8059,7 @@ Setze diesen API-Schlüssel in deiner selbst gehosteten Umgebung: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 151 @@ -8059,7 +8075,7 @@ API-Schlüssel für den Ghostfolio Premium Datenanbieter apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 158 + 152 @@ -8067,7 +8083,7 @@ Möchtest du wirklich einen neuen API-Schlüssel erstellen? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 163 + 157 @@ -8091,7 +8107,7 @@ KI-gestützter Import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 136 + 94 @@ -8115,7 +8131,7 @@ Speichern apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 767 + 766 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -8170,6 +8186,14 @@ 210 + + All in One Place + Alles an einem Ort + + apps/client/src/app/pages/landing/landing-page.html + 142 + + Received Access Erhaltene Zugangsberechtigung @@ -8247,7 +8271,7 @@ Standardmarktpreis apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 642 + 641 @@ -8255,7 +8279,7 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 678 + 677 @@ -8271,7 +8295,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 694 + 693 @@ -8279,7 +8303,7 @@ HTTP Request-Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 655 + 654 @@ -8351,7 +8375,7 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 69 + 73 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -8431,7 +8455,7 @@ Zeitstrahl der Performance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 440 + 447 @@ -8572,7 +8596,7 @@ Performance Berechnung apps/client/src/app/components/user-account-settings/user-account-settings.html - 36 + 37 @@ -8669,7 +8693,7 @@ {VAR_PLURAL, plural, =1 {Ghostfolio AI konnte 1 Aktivität der Datei nicht zuordnen } other {Ghostfolio AI konnte Aktivitäten der Datei nicht zuordnen }} apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 172 + 130 @@ -8918,6 +8942,14 @@ 307 + + Privacy First + Fokus auf Datenschutz + + apps/client/src/app/pages/landing/landing-page.html + 153 + + Available Verfügbar @@ -9152,7 +9184,7 @@ Anlageprofil verwalten apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 492 + 491 @@ -9268,11 +9300,11 @@ Rendite auf die durchschnittliche Investition (Gesamtrendite inklusive Dividenden) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 159 + 157 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 264 + 262 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 48f615780e..75c2d46677 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -447,7 +447,7 @@ Ghostfolio AI has processed the maximum of activities. The file can have more activities. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 193 + 151 @@ -475,7 +475,7 @@ Desdoblamientos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 518 @@ -515,11 +515,11 @@ Fecha apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 528 + 527 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 564 + 563 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -582,6 +582,14 @@ 71 + + Request a free trial + Request a free trial + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 211 + + Historical Data Datos históricos @@ -699,7 +707,7 @@ Añadir apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 619 + 618 apps/client/src/app/components/admin-overview/admin-overview.html @@ -755,7 +763,7 @@ Sin renovación automática de la membresía. apps/client/src/app/components/user-account-membership/user-account-membership.html - 79 + 82 @@ -859,7 +867,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 81 + 82 libs/common/src/lib/routes/routes.ts @@ -882,6 +890,14 @@ 297 + + No credit card required. The trial ends automatically. + No credit card required. The trial ends automatically. + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 214 + + Manage Activities Gestionar operaciones @@ -895,7 +911,7 @@ Relación de desdoblamiento apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 530 + 529 @@ -939,7 +955,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 356 + 362 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -981,14 +997,6 @@ apps/client/src/app/pages/landing/landing-page.html 352 - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 112 - - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 121 - apps/client/src/app/pages/pricing/pricing-page.html 336 @@ -1007,7 +1015,7 @@ Iniciar sesión con Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 46 + 47 @@ -1023,7 +1031,7 @@ Seguir conectado apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 69 @@ -1075,7 +1083,7 @@ Total de activos apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 195 + 202 @@ -1083,7 +1091,7 @@ Poder adquisitivo apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 335 + 342 @@ -1091,7 +1099,7 @@ Patrimonio neto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 418 + 425 @@ -1099,7 +1107,7 @@ Rendimiento anualizado apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 433 + 440 @@ -1167,7 +1175,7 @@ Reportar anomalía en los datos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 476 @@ -1291,7 +1299,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 245 + 306 @@ -1351,7 +1359,7 @@ Por favor, ingresa tu código de cupón. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 203 + 197 @@ -1367,7 +1375,7 @@ No se pudo canjear el código de cupón apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 181 + 175 @@ -1383,7 +1391,7 @@ El código del cupón ha sido canjeado apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 194 + 188 @@ -1409,9 +1417,13 @@ Try Premium Probar Premium + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 235 + apps/client/src/app/components/user-account-membership/user-account-membership.html - 58 + 61 @@ -1419,7 +1431,7 @@ Canjear cupón apps/client/src/app/components/user-account-membership/user-account-membership.html - 72 + 75 @@ -1435,7 +1447,7 @@ Vista del presentador apps/client/src/app/components/user-account-settings/user-account-settings.html - 226 + 232 @@ -1443,7 +1455,7 @@ Divisa base apps/client/src/app/components/user-account-settings/user-account-settings.html - 13 + 14 @@ -1459,11 +1471,11 @@ Configuración regional apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 669 + 668 apps/client/src/app/components/user-account-settings/user-account-settings.html - 156 + 162 @@ -1471,7 +1483,7 @@ Formato de fecha y número apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 164 @@ -1479,7 +1491,7 @@ Modo Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 244 + 250 apps/client/src/app/pages/features/features-page.html @@ -1491,7 +1503,7 @@ Iniciar sesión con huella digital apps/client/src/app/components/user-account-settings/user-account-settings.html - 263 + 269 @@ -1503,7 +1515,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 316 + 322 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1863,7 +1875,7 @@ apps/client/src/app/pages/about/overview/about-overview-page.html - 193 + 194 apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts @@ -2035,7 +2047,7 @@ The CSV file has more than rows of activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 404 + 439 @@ -2099,7 +2111,7 @@ Cronología de la inversión apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 496 + 504 @@ -2107,7 +2119,7 @@ Mejores apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 329 + 336 @@ -2115,7 +2127,7 @@ Peores apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 382 + 389 @@ -2151,7 +2163,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 233 apps/client/src/app/pages/public/public-page.html @@ -2363,7 +2375,7 @@ Importando datos... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 223 + 284 @@ -2371,7 +2383,7 @@ La importación se ha completado apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 234 + 295 @@ -2479,7 +2491,7 @@ Continuar con Google apps/client/src/app/pages/register/register-page.html - 41 + 42 @@ -2559,7 +2571,7 @@ Importar operaciones apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 124 + 162 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2667,7 +2679,7 @@ Idioma apps/client/src/app/components/user-account-settings/user-account-settings.html - 61 + 67 @@ -2691,11 +2703,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 242 + 303 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 628 + 663 @@ -2711,11 +2723,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 244 + 305 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 630 + 665 @@ -2851,7 +2863,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 507 + 514 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2915,7 +2927,7 @@ The file is larger than MB apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 396 + 431 @@ -2975,7 +2987,7 @@ Funcionalidades experimentales apps/client/src/app/components/user-account-settings/user-account-settings.html - 280 + 286 @@ -3023,7 +3035,7 @@ Excluido del análisis apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 367 + 374 @@ -3035,7 +3047,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 221 @@ -3043,15 +3055,15 @@ Cerrar cuenta apps/client/src/app/components/user-account-settings/user-account-settings.html - 387 + 393 apps/client/src/app/components/user-account-settings/user-account-settings.html - 397 + 403 apps/client/src/app/components/user-account-settings/user-account-settings.html - 404 + 410 @@ -3059,7 +3071,7 @@ Apariencia apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 207 @@ -3075,7 +3087,7 @@ Claro apps/client/src/app/components/user-account-settings/user-account-settings.html - 216 + 222 @@ -3091,7 +3103,7 @@ Oscuro apps/client/src/app/components/user-account-settings/user-account-settings.html - 217 + 223 @@ -3099,7 +3111,7 @@ Importe total libs/ui/src/lib/investment-chart/investment-chart.component.ts - 166 + 182 @@ -3107,7 +3119,7 @@ Evolución de la cartera apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 468 + 476 @@ -3123,7 +3135,7 @@ Tasa de ahorro libs/ui/src/lib/investment-chart/investment-chart.component.ts - 215 + 232 @@ -3131,7 +3143,7 @@ Cuenta apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 110 + 105 libs/common/src/lib/routes/routes.ts @@ -3231,7 +3243,7 @@ Efectivo apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 304 + 311 @@ -3263,15 +3275,15 @@ Fondo de emergencia apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 272 + 279 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 350 + 357 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 452 + 459 apps/client/src/app/pages/features/features-page.html @@ -3422,8 +3434,8 @@ The following file formats are supported: Los siguientes formatos de archivo son compatibles: - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 102 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 26 @@ -3431,11 +3443,11 @@ Volver apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 222 + 180 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 260 + 218 @@ -3547,7 +3559,7 @@ Calendario de dividendos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 554 + 562 @@ -3591,11 +3603,11 @@ Validando datos... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 369 + 404 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 429 + 464 @@ -3603,11 +3615,11 @@ Importar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 231 + 189 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 268 + 226 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -3699,7 +3711,7 @@ Importar dividendos apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 180 + 241 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3791,7 +3803,7 @@ Protección de información confidencial como rendimientos absolutos y cantidades apps/client/src/app/components/user-account-settings/user-account-settings.html - 228 + 234 @@ -3799,7 +3811,7 @@ Experiencia sin distracciones para tiempos turbulentos apps/client/src/app/components/user-account-settings/user-account-settings.html - 246 + 252 @@ -3807,7 +3819,7 @@ Inversiones apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 257 + 264 @@ -3815,7 +3827,7 @@ Un adelanto de las próximas funciones apps/client/src/app/components/user-account-settings/user-account-settings.html - 282 + 288 @@ -3909,6 +3921,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 181 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 224 + Upgrade Plan @@ -4063,7 +4079,7 @@ Powered by third-party AI providers apps/client/src/app/components/user-account-settings/user-account-settings.html - 300 + 306 @@ -4170,6 +4186,18 @@ 19 + + Return on Investment (total return with dividends) + Return on Investment (total return with dividends) + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 165 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 270 + + Add to Watchlist Añadir a la lista de seguimiento @@ -4327,7 +4355,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 710 + 709 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4359,7 +4387,7 @@ ¿Seguro que quieres eliminar esta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 131 + 133 @@ -4375,11 +4403,11 @@ del cual, rendimiento de dividendos apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 178 + 185 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 306 + 313 @@ -4475,7 +4503,7 @@ Seleccionar dividendos apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 156 + 114 @@ -4483,7 +4511,7 @@ Seleccionar operaciones apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 158 + 116 @@ -4491,7 +4519,7 @@ Acciones después apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 587 @@ -4515,7 +4543,7 @@ Racha actual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 517 + 525 @@ -4523,7 +4551,7 @@ Racha más larga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 526 + 534 @@ -4565,6 +4593,10 @@ apps/client/src/app/components/admin-users/admin-users.html 247 + + apps/client/src/app/components/home-overview/home-overview.html + 110 + libs/ui/src/lib/accounts-table/accounts-table.component.html 339 @@ -4575,7 +4607,7 @@ Pasivos apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 398 + 405 apps/client/src/app/pages/features/features-page.html @@ -4627,7 +4659,7 @@ Por razones de seguridad, elimina primero todas las operaciones y cuentas antes de poder cerrar tu cuenta de Ghostfolio. apps/client/src/app/components/user-account-settings/user-account-settings.html - 407 + 413 @@ -4771,7 +4803,7 @@ Configuración del scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 631 @@ -5015,7 +5047,7 @@ Iniciar sesión con OpenID Connect apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 57 + 58 @@ -5195,7 +5227,7 @@ Autenticación biométrica apps/client/src/app/components/user-account-settings/user-account-settings.html - 261 + 267 @@ -5287,7 +5319,7 @@ Exportar datos apps/client/src/app/components/user-account-settings/user-account-settings.html - 331 + 337 @@ -5430,22 +5462,6 @@ 132 - - 360° View - Vista 360° - - apps/client/src/app/pages/landing/landing-page.html - 142 - - - - Web3 Ready - Preparado para Web3 - - apps/client/src/app/pages/landing/landing-page.html - 153 - - Basic Materials Materiales Básicos @@ -6052,8 +6068,8 @@ Choose or drop a file here Elige o suelta un archivo aquí - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 95 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 20 @@ -6477,7 +6493,7 @@ ¡Vaya! No se pudieron analizar los datos históricos. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 287 + 285 @@ -6545,7 +6561,7 @@ ¿Seguro que quieres eliminar el saldo de esta cuenta? libs/ui/src/lib/account-balances/account-balances.component.ts - 134 + 127 @@ -6553,7 +6569,7 @@ Si falta una traducción, por favor ayúdanos a completarla aquí. apps/client/src/app/components/user-account-settings/user-account-settings.html - 64 + 70 @@ -6569,7 +6585,7 @@ Prueba apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 728 + 727 @@ -6605,7 +6621,7 @@ ¡Vaya! No se pudo otorgar acceso. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 320 + 316 @@ -6657,7 +6673,7 @@ Cerrar posición apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 464 + 463 @@ -6777,7 +6793,7 @@ ¡Vaya! Un proveedor de datos está experimentando problemas. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html - 8 + 9 @@ -6824,8 +6840,8 @@ Ghostfolio AI is processing the file... Ghostfolio AI is processing the file... - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 82 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 164 @@ -6841,7 +6857,7 @@ Recopilación de datos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 751 + 750 apps/client/src/app/components/admin-overview/admin-overview.html @@ -7042,7 +7058,7 @@ Zona peligrosa apps/client/src/app/components/user-account-settings/user-account-settings.html - 340 + 346 @@ -7050,7 +7066,7 @@ Eliminar cuenta apps/client/src/app/components/user-account-settings/user-account-settings.html - 416 + 422 @@ -7098,7 +7114,7 @@ Derivado de la cartera que actualmente estas visualizando apps/client/src/app/components/user-account-settings/user-account-settings.html - 27 + 28 @@ -7154,7 +7170,7 @@ The content of your file will be processed by third-party AI providers. Please remove any personal data before uploading. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 126 + 165 @@ -7198,47 +7214,47 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 96 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 129 apps/client/src/app/components/user-account-settings/user-account-settings.html - 128 + 134 apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 138 apps/client/src/app/components/user-account-settings/user-account-settings.html - 136 + 142 apps/client/src/app/components/user-account-settings/user-account-settings.html - 140 + 146 apps/client/src/app/components/user-account-settings/user-account-settings.html - 146 + 152 apps/client/src/app/pages/features/features-page.html @@ -7414,7 +7430,7 @@ ¡Vaya! No se pudo actualizar el acceso. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 420 + 416 @@ -7434,7 +7450,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 756 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7490,7 +7506,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 287 + 294 @@ -7498,7 +7514,7 @@ Cerrar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 758 + 757 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7526,7 +7542,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 150 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -7786,7 +7802,7 @@ Acciones antes apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 601 + 600 @@ -8012,7 +8028,7 @@ No se pudo generar una clave API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 142 + 136 @@ -8020,7 +8036,7 @@ Configura esta clave API en tu entorno autoalojado: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 151 @@ -8036,7 +8052,7 @@ Clave API del proveedor de datos premium de Ghostfolio apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 158 + 152 @@ -8044,7 +8060,7 @@ ¿Seguro que quieres generar una nueva clave API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 163 + 157 @@ -8068,7 +8084,7 @@ AI-assisted import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 136 + 94 @@ -8092,7 +8108,7 @@ Guardar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 767 + 766 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -8147,6 +8163,14 @@ 210 + + All in One Place + All in One Place + + apps/client/src/app/pages/landing/landing-page.html + 142 + + Received Access Acceso recibido @@ -8224,7 +8248,7 @@ Precio de mercado por defecto apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 642 + 641 @@ -8232,7 +8256,7 @@ Modo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 678 + 677 @@ -8248,7 +8272,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 694 + 693 @@ -8256,7 +8280,7 @@ Encabezados de solicitud HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 655 + 654 @@ -8328,7 +8352,7 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 69 + 73 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -8408,7 +8432,7 @@ Performance Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 440 + 447 @@ -8573,7 +8597,7 @@ Cálculo de rendimiento apps/client/src/app/components/user-account-settings/user-account-settings.html - 36 + 37 @@ -8670,7 +8694,7 @@ {VAR_PLURAL, plural, =1 {Ghostfolio AI could not match 1 activity of the file } other {Ghostfolio AI could not match activities of the file }} apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 172 + 130 @@ -8919,6 +8943,14 @@ 307 + + Privacy First + Privacy First + + apps/client/src/app/pages/landing/landing-page.html + 153 + + Available Disponible @@ -9153,7 +9185,7 @@ Gestionar perfil de activo apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 492 + 491 @@ -9269,11 +9301,11 @@ Rentabilidad sobre la inversión media (rentabilidad total con dividendos) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 159 + 157 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 264 + 262 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 837ccd5dcf..fb31b2f5e7 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -510,7 +510,7 @@ Ghostfolio AI has processed the maximum of activities. The file can have more activities. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 193 + 151 @@ -538,7 +538,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 518 @@ -578,11 +578,11 @@ Date apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 528 + 527 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 564 + 563 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -653,6 +653,14 @@ 71 + + Request a free trial + Request a free trial + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 211 + + Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. @@ -726,7 +734,7 @@ The file is larger than MB apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 396 + 431 @@ -978,7 +986,7 @@ Ajouter apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 619 + 618 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1034,7 +1042,7 @@ Pas de renouvellement automatique de l’abonnement. apps/client/src/app/components/user-account-membership/user-account-membership.html - 79 + 82 @@ -1150,7 +1158,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 81 + 82 libs/common/src/lib/routes/routes.ts @@ -1173,6 +1181,14 @@ 297 + + No credit card required. The trial ends automatically. + No credit card required. The trial ends automatically. + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 214 + + Manage Activities Gérer les Activités @@ -1186,7 +1202,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 530 + 529 @@ -1242,7 +1258,7 @@ Montant Total libs/ui/src/lib/investment-chart/investment-chart.component.ts - 166 + 182 @@ -1258,7 +1274,7 @@ Taux d’Épargne libs/ui/src/lib/investment-chart/investment-chart.component.ts - 215 + 232 @@ -1278,7 +1294,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 356 + 362 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -1320,14 +1336,6 @@ apps/client/src/app/pages/landing/landing-page.html 352 - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 112 - - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 121 - apps/client/src/app/pages/pricing/pricing-page.html 336 @@ -1346,7 +1354,7 @@ Se connecter avec Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 46 + 47 @@ -1362,7 +1370,7 @@ Rester connecté apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 69 @@ -1414,7 +1422,7 @@ Actifs Totaux apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 195 + 202 @@ -1422,7 +1430,7 @@ Pouvoir d’Achat apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 335 + 342 @@ -1430,7 +1438,7 @@ Exclus de l’Analyse apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 367 + 374 @@ -1438,7 +1446,7 @@ Fortune apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 418 + 425 @@ -1446,7 +1454,7 @@ Performance annualisée apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 433 + 440 @@ -1502,7 +1510,7 @@ Signaler une Erreur de Données apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 476 @@ -1602,11 +1610,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 244 + 305 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 630 + 665 @@ -1622,11 +1630,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 242 + 303 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 628 + 663 @@ -1638,7 +1646,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 245 + 306 @@ -1702,7 +1710,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 221 @@ -1710,7 +1718,7 @@ Veuillez entrer votre code promotionnel. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 203 + 197 @@ -1726,7 +1734,7 @@ Le code promotionnel n’a pas pu être appliqué apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 181 + 175 @@ -1742,7 +1750,7 @@ Le code promotionnel a été appliqué apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 194 + 188 @@ -1768,9 +1776,13 @@ Try Premium Essayer Premium + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 235 + apps/client/src/app/components/user-account-membership/user-account-membership.html - 58 + 61 @@ -1778,7 +1790,7 @@ Utiliser un Code Promotionnel apps/client/src/app/components/user-account-membership/user-account-membership.html - 72 + 75 @@ -1794,7 +1806,7 @@ Vue de Présentation apps/client/src/app/components/user-account-settings/user-account-settings.html - 226 + 232 @@ -1802,7 +1814,7 @@ Devise de Base apps/client/src/app/components/user-account-settings/user-account-settings.html - 13 + 14 @@ -1818,7 +1830,7 @@ Langue apps/client/src/app/components/user-account-settings/user-account-settings.html - 61 + 67 @@ -1826,11 +1838,11 @@ Paramètres régionaux apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 669 + 668 apps/client/src/app/components/user-account-settings/user-account-settings.html - 156 + 162 @@ -1838,7 +1850,7 @@ Format de date et d’heure apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 164 @@ -1846,15 +1858,15 @@ Close Account apps/client/src/app/components/user-account-settings/user-account-settings.html - 387 + 393 apps/client/src/app/components/user-account-settings/user-account-settings.html - 397 + 403 apps/client/src/app/components/user-account-settings/user-account-settings.html - 404 + 410 @@ -1862,7 +1874,7 @@ Apparence apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 207 @@ -1878,7 +1890,7 @@ Clair apps/client/src/app/components/user-account-settings/user-account-settings.html - 216 + 222 @@ -1894,7 +1906,7 @@ Sombre apps/client/src/app/components/user-account-settings/user-account-settings.html - 217 + 223 @@ -1902,7 +1914,7 @@ Mode Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 244 + 250 apps/client/src/app/pages/features/features-page.html @@ -1914,7 +1926,7 @@ Se connecter avec empreinte apps/client/src/app/components/user-account-settings/user-account-settings.html - 263 + 269 @@ -1922,7 +1934,7 @@ Fonctionnalités expérimentales apps/client/src/app/components/user-account-settings/user-account-settings.html - 280 + 286 @@ -1934,7 +1946,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 316 + 322 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2246,7 +2258,7 @@ apps/client/src/app/pages/about/overview/about-overview-page.html - 193 + 194 apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts @@ -2302,7 +2314,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 233 apps/client/src/app/pages/public/public-page.html @@ -2534,7 +2546,7 @@ Import des données... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 223 + 284 @@ -2542,7 +2554,7 @@ L’import est terminé apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 234 + 295 @@ -2558,19 +2570,19 @@ Validation des données... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 369 + 404 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 429 + 464 The following file formats are supported: Les formats de fichier suivants sont supportés : - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 102 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 26 @@ -2578,11 +2590,11 @@ Retour apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 222 + 180 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 260 + 218 @@ -2606,11 +2618,11 @@ Importer apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 231 + 189 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 268 + 226 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -2678,7 +2690,7 @@ The CSV file has more than rows of activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 404 + 439 @@ -2854,7 +2866,7 @@ Haut apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 329 + 336 @@ -2862,7 +2874,7 @@ Bas apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 382 + 389 @@ -2870,7 +2882,7 @@ Évolution du Portefeuille apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 468 + 476 @@ -2878,7 +2890,7 @@ Historique des Investissements apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 496 + 504 @@ -2886,7 +2898,7 @@ Historique des Dividendes apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 554 + 562 @@ -3050,7 +3062,7 @@ Continuer avec Google apps/client/src/app/pages/register/register-page.html - 41 + 42 @@ -3170,7 +3182,7 @@ Importer Activités apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 124 + 162 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3290,7 +3302,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 507 + 514 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -3350,7 +3362,7 @@ Compte apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 110 + 105 libs/common/src/lib/routes/routes.ts @@ -3430,15 +3442,15 @@ Fonds d’Urgence apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 272 + 279 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 350 + 357 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 452 + 459 apps/client/src/app/pages/features/features-page.html @@ -3518,7 +3530,7 @@ Cash apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 304 + 311 @@ -3698,7 +3710,7 @@ Importer Dividendes apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 180 + 241 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3790,7 +3802,7 @@ Protection pour les informations sensibles telles que la performance absolue et les montants apps/client/src/app/components/user-account-settings/user-account-settings.html - 228 + 234 @@ -3798,7 +3810,7 @@ Expérience sans distraction pour les périodes tumultueuses apps/client/src/app/components/user-account-settings/user-account-settings.html - 246 + 252 @@ -3806,7 +3818,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 257 + 264 @@ -3814,7 +3826,7 @@ Avant-première de fonctionnalités futures apps/client/src/app/components/user-account-settings/user-account-settings.html - 282 + 288 @@ -3908,6 +3920,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 181 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 224 + Upgrade Plan @@ -4062,7 +4078,7 @@ Powered by third-party AI providers apps/client/src/app/components/user-account-settings/user-account-settings.html - 300 + 306 @@ -4169,6 +4185,18 @@ 19 + + Return on Investment (total return with dividends) + Return on Investment (total return with dividends) + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 165 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 270 + + Add to Watchlist Add to Watchlist @@ -4326,7 +4354,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 710 + 709 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4358,7 +4386,7 @@ Voulez-vous vraiment supprimer cette plateforme ? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 131 + 133 @@ -4374,11 +4402,11 @@ thereof Dividend Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 178 + 185 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 306 + 313 @@ -4474,7 +4502,7 @@ Selectionner les Dividendes apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 156 + 114 @@ -4482,7 +4510,7 @@ Selectionner les Activités apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 158 + 116 @@ -4490,7 +4518,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 587 @@ -4514,7 +4542,7 @@ Série en cours apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 517 + 525 @@ -4522,7 +4550,7 @@ Série la plus longue apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 526 + 534 @@ -4564,6 +4592,10 @@ apps/client/src/app/components/admin-users/admin-users.html 247 + + apps/client/src/app/components/home-overview/home-overview.html + 110 + libs/ui/src/lib/accounts-table/accounts-table.component.html 339 @@ -4574,7 +4606,7 @@ Dettes apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 398 + 405 apps/client/src/app/pages/features/features-page.html @@ -4626,7 +4658,7 @@ For security reasons, please delete all activities and accounts first before your Ghostfolio account can be closed. apps/client/src/app/components/user-account-settings/user-account-settings.html - 407 + 413 @@ -4770,7 +4802,7 @@ Configuration du Scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 631 @@ -5014,7 +5046,7 @@ Se connecter avec OpenID Connect apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 57 + 58 @@ -5194,7 +5226,7 @@ Authentication biométrique apps/client/src/app/components/user-account-settings/user-account-settings.html - 261 + 267 @@ -5286,7 +5318,7 @@ Exporter les Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 331 + 337 @@ -5429,22 +5461,6 @@ 132 - - 360° View - Vision 360° - - apps/client/src/app/pages/landing/landing-page.html - 142 - - - - Web3 Ready - Compatible Web3 - - apps/client/src/app/pages/landing/landing-page.html - 153 - - Basic Materials Matériaux de Base @@ -6051,8 +6067,8 @@ Choose or drop a file here Choisissez ou déposez un fichier ici - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 95 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 20 @@ -6476,7 +6492,7 @@ Oops! Echec du parsing des données historiques. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 287 + 285 @@ -6544,7 +6560,7 @@ Voulez-vous vraiment supprimer ce solde de compte ? libs/ui/src/lib/account-balances/account-balances.component.ts - 134 + 127 @@ -6552,7 +6568,7 @@ Si une traduction est manquante, veuillez nous aider à compléter la traduction here. apps/client/src/app/components/user-account-settings/user-account-settings.html - 64 + 70 @@ -6568,7 +6584,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 728 + 727 @@ -6604,7 +6620,7 @@ Oops! Impossible d’accorder l’accès. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 320 + 316 @@ -6656,7 +6672,7 @@ Clôturer la Position apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 464 + 463 @@ -6776,7 +6792,7 @@ Oops! Un fournisseur de données rencontre des difficultés. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html - 8 + 9 @@ -6823,8 +6839,8 @@ Ghostfolio AI is processing the file... Ghostfolio AI is processing the file... - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 82 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 164 @@ -6840,7 +6856,7 @@ Collecter les données apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 751 + 750 apps/client/src/app/components/admin-overview/admin-overview.html @@ -7041,7 +7057,7 @@ Zone de danger apps/client/src/app/components/user-account-settings/user-account-settings.html - 340 + 346 @@ -7049,7 +7065,7 @@ Supprimer le compte apps/client/src/app/components/user-account-settings/user-account-settings.html - 416 + 422 @@ -7097,7 +7113,7 @@ Derived from the portfolio you are viewing apps/client/src/app/components/user-account-settings/user-account-settings.html - 27 + 28 @@ -7153,7 +7169,7 @@ The content of your file will be processed by third-party AI providers. Please remove any personal data before uploading. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 126 + 165 @@ -7197,47 +7213,47 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 96 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 129 apps/client/src/app/components/user-account-settings/user-account-settings.html - 128 + 134 apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 138 apps/client/src/app/components/user-account-settings/user-account-settings.html - 136 + 142 apps/client/src/app/components/user-account-settings/user-account-settings.html - 140 + 146 apps/client/src/app/components/user-account-settings/user-account-settings.html - 146 + 152 apps/client/src/app/pages/features/features-page.html @@ -7413,7 +7429,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 420 + 416 @@ -7433,7 +7449,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 756 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7489,7 +7505,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 287 + 294 @@ -7497,7 +7513,7 @@ Fermer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 758 + 757 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7525,7 +7541,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 150 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -7785,7 +7801,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 601 + 600 @@ -8011,7 +8027,7 @@ Impossible de générer une clé API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 142 + 136 @@ -8019,7 +8035,7 @@ Définissez cette clé API dans votre environnement auto-hébergé : apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 151 @@ -8035,7 +8051,7 @@ Clé API du fournisseur de données Ghostfolio Premium apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 158 + 152 @@ -8043,7 +8059,7 @@ Voulez-vous vraiment générer une nouvelle clé API ? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 163 + 157 @@ -8067,7 +8083,7 @@ AI-assisted import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 136 + 94 @@ -8091,7 +8107,7 @@ Sauvegarder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 767 + 766 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -8146,6 +8162,14 @@ 210 + + All in One Place + All in One Place + + apps/client/src/app/pages/landing/landing-page.html + 142 + + Received Access Accès reçu @@ -8223,7 +8247,7 @@ Prix du marché par défaut apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 642 + 641 @@ -8231,7 +8255,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 678 + 677 @@ -8247,7 +8271,7 @@ Selecteur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 694 + 693 @@ -8255,7 +8279,7 @@ En-têtes de requête HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 655 + 654 @@ -8327,7 +8351,7 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 69 + 73 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -8407,7 +8431,7 @@ Performance Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 440 + 447 @@ -8572,7 +8596,7 @@ Calcul de performance apps/client/src/app/components/user-account-settings/user-account-settings.html - 36 + 37 @@ -8669,7 +8693,7 @@ {VAR_PLURAL, plural, =1 {Ghostfolio AI could not match 1 activity of the file } other {Ghostfolio AI could not match activities of the file }} apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 172 + 130 @@ -8918,6 +8942,14 @@ 307 + + Privacy First + Privacy First + + apps/client/src/app/pages/landing/landing-page.html + 153 + + Available Disponible @@ -9152,7 +9184,7 @@ Gérer le profil d’actif apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 492 + 491 @@ -9268,11 +9300,11 @@ Return on Average Investment (total return with dividends) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 159 + 157 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 264 + 262 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 769c0aa4ec..4799d8eeb3 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -447,7 +447,7 @@ Ghostfolio AI has processed the maximum of activities. The file can have more activities. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 193 + 151 @@ -475,7 +475,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 518 @@ -515,11 +515,11 @@ Data apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 528 + 527 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 564 + 563 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -582,6 +582,14 @@ 71 + + Request a free trial + Request a free trial + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 211 + + Historical Data Dati storici @@ -699,7 +707,7 @@ Aggiungi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 619 + 618 apps/client/src/app/components/admin-overview/admin-overview.html @@ -755,7 +763,7 @@ Nessun rinnovo automatico dell’abbonamento. apps/client/src/app/components/user-account-membership/user-account-membership.html - 79 + 82 @@ -859,7 +867,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 81 + 82 libs/common/src/lib/routes/routes.ts @@ -882,6 +890,14 @@ 297 + + No credit card required. The trial ends automatically. + No credit card required. The trial ends automatically. + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 214 + + Manage Activities Gestione delle attività @@ -895,7 +911,7 @@ Rapporto di frazionamento apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 530 + 529 @@ -939,7 +955,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 356 + 362 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -981,14 +997,6 @@ apps/client/src/app/pages/landing/landing-page.html 352 - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 112 - - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 121 - apps/client/src/app/pages/pricing/pricing-page.html 336 @@ -1007,7 +1015,7 @@ Accedi con Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 46 + 47 @@ -1023,7 +1031,7 @@ Rimani connesso apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 69 @@ -1075,7 +1083,7 @@ Asset totali apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 195 + 202 @@ -1083,7 +1091,7 @@ Potere d’acquisto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 335 + 342 @@ -1091,7 +1099,7 @@ Patrimonio netto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 418 + 425 @@ -1099,7 +1107,7 @@ Prestazioni annualizzate apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 433 + 440 @@ -1167,7 +1175,7 @@ Segnala un’anomalia dei dati apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 476 @@ -1291,7 +1299,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 245 + 306 @@ -1351,7 +1359,7 @@ Inserisci il tuo codice del buono: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 203 + 197 @@ -1367,7 +1375,7 @@ Impossibile riscattare il codice del buono apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 181 + 175 @@ -1383,7 +1391,7 @@ Il codice del buono è stato riscattato apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 194 + 188 @@ -1409,9 +1417,13 @@ Try Premium Prova Premium + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 235 + apps/client/src/app/components/user-account-membership/user-account-membership.html - 58 + 61 @@ -1419,7 +1431,7 @@ Riscatta il buono apps/client/src/app/components/user-account-membership/user-account-membership.html - 72 + 75 @@ -1435,7 +1447,7 @@ Vista presentatore apps/client/src/app/components/user-account-settings/user-account-settings.html - 226 + 232 @@ -1443,7 +1455,7 @@ Valuta base apps/client/src/app/components/user-account-settings/user-account-settings.html - 13 + 14 @@ -1459,11 +1471,11 @@ Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 669 + 668 apps/client/src/app/components/user-account-settings/user-account-settings.html - 156 + 162 @@ -1471,7 +1483,7 @@ Formato data e numero apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 164 @@ -1479,7 +1491,7 @@ Modalità Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 244 + 250 apps/client/src/app/pages/features/features-page.html @@ -1491,7 +1503,7 @@ Accesso con impronta digitale apps/client/src/app/components/user-account-settings/user-account-settings.html - 263 + 269 @@ -1503,7 +1515,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 316 + 322 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1863,7 +1875,7 @@ apps/client/src/app/pages/about/overview/about-overview-page.html - 193 + 194 apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts @@ -2035,7 +2047,7 @@ The CSV file has more than rows of activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 404 + 439 @@ -2099,7 +2111,7 @@ Cronologia degli investimenti apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 496 + 504 @@ -2107,7 +2119,7 @@ In alto apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 329 + 336 @@ -2115,7 +2127,7 @@ In basso apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 382 + 389 @@ -2151,7 +2163,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 233 apps/client/src/app/pages/public/public-page.html @@ -2363,7 +2375,7 @@ Importazione dei dati... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 223 + 284 @@ -2371,7 +2383,7 @@ L’importazione è stata completata apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 234 + 295 @@ -2479,7 +2491,7 @@ Continua con Google apps/client/src/app/pages/register/register-page.html - 41 + 42 @@ -2559,7 +2571,7 @@ Importa le attività apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 124 + 162 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2667,7 +2679,7 @@ Lingua apps/client/src/app/components/user-account-settings/user-account-settings.html - 61 + 67 @@ -2691,11 +2703,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 242 + 303 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 628 + 663 @@ -2711,11 +2723,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 244 + 305 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 630 + 665 @@ -2851,7 +2863,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 507 + 514 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2915,7 +2927,7 @@ The file is larger than MB apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 396 + 431 @@ -2975,7 +2987,7 @@ Funzionalità sperimentali apps/client/src/app/components/user-account-settings/user-account-settings.html - 280 + 286 @@ -3023,7 +3035,7 @@ Escluso dall’analisi apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 367 + 374 @@ -3035,7 +3047,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 221 @@ -3043,15 +3055,15 @@ Close Account apps/client/src/app/components/user-account-settings/user-account-settings.html - 387 + 393 apps/client/src/app/components/user-account-settings/user-account-settings.html - 397 + 403 apps/client/src/app/components/user-account-settings/user-account-settings.html - 404 + 410 @@ -3059,7 +3071,7 @@ Aspetto apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 207 @@ -3075,7 +3087,7 @@ Chiaro apps/client/src/app/components/user-account-settings/user-account-settings.html - 216 + 222 @@ -3091,7 +3103,7 @@ Scuro apps/client/src/app/components/user-account-settings/user-account-settings.html - 217 + 223 @@ -3099,7 +3111,7 @@ Importo totale libs/ui/src/lib/investment-chart/investment-chart.component.ts - 166 + 182 @@ -3107,7 +3119,7 @@ Evoluzione del portafoglio apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 468 + 476 @@ -3123,7 +3135,7 @@ Tasso di risparmio libs/ui/src/lib/investment-chart/investment-chart.component.ts - 215 + 232 @@ -3131,7 +3143,7 @@ Account apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 110 + 105 libs/common/src/lib/routes/routes.ts @@ -3231,7 +3243,7 @@ Contanti apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 304 + 311 @@ -3263,15 +3275,15 @@ Fondo di emergenza apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 272 + 279 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 350 + 357 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 452 + 459 apps/client/src/app/pages/features/features-page.html @@ -3422,8 +3434,8 @@ The following file formats are supported: Sono supportati i seguenti formati di file: - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 102 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 26 @@ -3431,11 +3443,11 @@ Indietro apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 222 + 180 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 260 + 218 @@ -3547,7 +3559,7 @@ Cronologia dei dividendi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 554 + 562 @@ -3591,11 +3603,11 @@ Convalida dei dati... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 369 + 404 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 429 + 464 @@ -3603,11 +3615,11 @@ Importa apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 231 + 189 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 268 + 226 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -3699,7 +3711,7 @@ Importa i dividendi apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 180 + 241 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3791,7 +3803,7 @@ Protezione delle informazioni sensibili come le prestazioni assolute e i valori quantitativi apps/client/src/app/components/user-account-settings/user-account-settings.html - 228 + 234 @@ -3799,7 +3811,7 @@ Esperienza priva di distrazioni per i periodi più turbolenti apps/client/src/app/components/user-account-settings/user-account-settings.html - 246 + 252 @@ -3807,7 +3819,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 257 + 264 @@ -3815,7 +3827,7 @@ Un’anteprima delle funzionalità in arrivo apps/client/src/app/components/user-account-settings/user-account-settings.html - 282 + 288 @@ -3909,6 +3921,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 181 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 224 + Upgrade Plan @@ -4063,7 +4079,7 @@ Powered by third-party AI providers apps/client/src/app/components/user-account-settings/user-account-settings.html - 300 + 306 @@ -4170,6 +4186,18 @@ 19 + + Return on Investment (total return with dividends) + Return on Investment (total return with dividends) + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 165 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 270 + + Add to Watchlist Add to Watchlist @@ -4327,7 +4355,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 710 + 709 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4359,7 +4387,7 @@ Vuoi davvero eliminare questa piattaforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 131 + 133 @@ -4375,11 +4403,11 @@ thereof Dividend Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 178 + 185 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 306 + 313 @@ -4475,7 +4503,7 @@ Seleziona i dividendi apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 156 + 114 @@ -4483,7 +4511,7 @@ Seleziona le attività apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 158 + 116 @@ -4491,7 +4519,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 587 @@ -4515,7 +4543,7 @@ Serie attuale apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 517 + 525 @@ -4523,7 +4551,7 @@ Serie più lunga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 526 + 534 @@ -4565,6 +4593,10 @@ apps/client/src/app/components/admin-users/admin-users.html 247 + + apps/client/src/app/components/home-overview/home-overview.html + 110 + libs/ui/src/lib/accounts-table/accounts-table.component.html 339 @@ -4575,7 +4607,7 @@ Passività apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 398 + 405 apps/client/src/app/pages/features/features-page.html @@ -4627,7 +4659,7 @@ For security reasons, please delete all activities and accounts first before your Ghostfolio account can be closed. apps/client/src/app/components/user-account-settings/user-account-settings.html - 407 + 413 @@ -4771,7 +4803,7 @@ Configurazione dello scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 631 @@ -5015,7 +5047,7 @@ Sign in with OpenID Connect apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 57 + 58 @@ -5195,7 +5227,7 @@ Autenticazione biometrica apps/client/src/app/components/user-account-settings/user-account-settings.html - 261 + 267 @@ -5287,7 +5319,7 @@ Esporta dati apps/client/src/app/components/user-account-settings/user-account-settings.html - 331 + 337 @@ -5430,22 +5462,6 @@ 132 - - 360° View - Vista a 360° - - apps/client/src/app/pages/landing/landing-page.html - 142 - - - - Web3 Ready - Pronto per il Web3 - - apps/client/src/app/pages/landing/landing-page.html - 153 - - Basic Materials Basic Materials @@ -6052,8 +6068,8 @@ Choose or drop a file here Seleziona o trascina qui un file - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 95 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 20 @@ -6477,7 +6493,7 @@ Ops! Impossibile elaborare i dati storici. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 287 + 285 @@ -6545,7 +6561,7 @@ Vuoi veramente elimnare il saldo di questo conto? libs/ui/src/lib/account-balances/account-balances.component.ts - 134 + 127 @@ -6553,7 +6569,7 @@ Se manca una traduzione, puoi aiutarci modificando questo file: here. apps/client/src/app/components/user-account-settings/user-account-settings.html - 64 + 70 @@ -6569,7 +6585,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 728 + 727 @@ -6605,7 +6621,7 @@ Ops! Impossibile abilitare l’accesso. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 320 + 316 @@ -6657,7 +6673,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 464 + 463 @@ -6777,7 +6793,7 @@ Ops! Un data provider sta riscontrando dei problemi. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html - 8 + 9 @@ -6824,8 +6840,8 @@ Ghostfolio AI is processing the file... Ghostfolio AI is processing the file... - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 82 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 164 @@ -6841,7 +6857,7 @@ Raccolta Dati apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 751 + 750 apps/client/src/app/components/admin-overview/admin-overview.html @@ -7042,7 +7058,7 @@ Zona di Pericolo apps/client/src/app/components/user-account-settings/user-account-settings.html - 340 + 346 @@ -7050,7 +7066,7 @@ Chiudi l’account apps/client/src/app/components/user-account-settings/user-account-settings.html - 416 + 422 @@ -7098,7 +7114,7 @@ Derived from the portfolio you are viewing apps/client/src/app/components/user-account-settings/user-account-settings.html - 27 + 28 @@ -7154,7 +7170,7 @@ The content of your file will be processed by third-party AI providers. Please remove any personal data before uploading. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 126 + 165 @@ -7198,47 +7214,47 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 96 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 129 apps/client/src/app/components/user-account-settings/user-account-settings.html - 128 + 134 apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 138 apps/client/src/app/components/user-account-settings/user-account-settings.html - 136 + 142 apps/client/src/app/components/user-account-settings/user-account-settings.html - 140 + 146 apps/client/src/app/components/user-account-settings/user-account-settings.html - 146 + 152 apps/client/src/app/pages/features/features-page.html @@ -7414,7 +7430,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 420 + 416 @@ -7434,7 +7450,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 756 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7490,7 +7506,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 287 + 294 @@ -7498,7 +7514,7 @@ Chiudi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 758 + 757 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7526,7 +7542,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 150 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -7786,7 +7802,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 601 + 600 @@ -8012,7 +8028,7 @@ Non è stato possibile generare un API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 142 + 136 @@ -8020,7 +8036,7 @@ Imposta questa API key nel tuo ambiente self-hosted: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 151 @@ -8036,7 +8052,7 @@ API Key for Ghostfolio Premium Data Provider apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 158 + 152 @@ -8044,7 +8060,7 @@ Vuoi davvero generare una nuova API key? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 163 + 157 @@ -8068,7 +8084,7 @@ AI-assisted import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 136 + 94 @@ -8092,7 +8108,7 @@ Salva apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 767 + 766 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -8147,6 +8163,14 @@ 210 + + All in One Place + All in One Place + + apps/client/src/app/pages/landing/landing-page.html + 142 + + Received Access Accesso ricevuto @@ -8224,7 +8248,7 @@ Prezzo di mercato predefinito apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 642 + 641 @@ -8232,7 +8256,7 @@ Modalità apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 678 + 677 @@ -8248,7 +8272,7 @@ Selettore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 694 + 693 @@ -8256,7 +8280,7 @@ Intestazioni della richiesta HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 655 + 654 @@ -8328,7 +8352,7 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 69 + 73 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -8408,7 +8432,7 @@ Performance Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 440 + 447 @@ -8573,7 +8597,7 @@ Calcolo delle prestazioni apps/client/src/app/components/user-account-settings/user-account-settings.html - 36 + 37 @@ -8670,7 +8694,7 @@ {VAR_PLURAL, plural, =1 {Ghostfolio AI could not match 1 activity of the file } other {Ghostfolio AI could not match activities of the file }} apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 172 + 130 @@ -8919,6 +8943,14 @@ 307 + + Privacy First + Privacy First + + apps/client/src/app/pages/landing/landing-page.html + 153 + + Available Disponibile @@ -9153,7 +9185,7 @@ Gestisci profilo risorsa apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 492 + 491 @@ -9269,11 +9301,11 @@ Return on Average Investment (total return with dividends) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 159 + 157 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 264 + 262 diff --git a/apps/client/src/locales/messages.ja.xlf b/apps/client/src/locales/messages.ja.xlf index 2ff2f1be36..46df6c5f56 100644 --- a/apps/client/src/locales/messages.ja.xlf +++ b/apps/client/src/locales/messages.ja.xlf @@ -652,7 +652,7 @@ Ghostfolio AI has processed the maximum of activities. The file can have more activities. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 193 + 151 @@ -772,7 +772,7 @@ 株式分割 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 518 @@ -812,11 +812,11 @@ 日付 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 528 + 527 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 564 + 563 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -943,6 +943,14 @@ 71 + + Request a free trial + Request a free trial + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 211 + + Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. @@ -1016,7 +1024,7 @@ The file is larger than MB apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 396 + 431 @@ -1052,7 +1060,7 @@ エラー。過去データを解析できませんでした。 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 287 + 285 @@ -1088,11 +1096,11 @@ インポート apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 231 + 189 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 268 + 226 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -1228,7 +1236,7 @@ スクレイパーの設定 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 631 @@ -1436,7 +1444,7 @@ 追加 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 619 + 618 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1480,7 +1488,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 710 + 709 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1512,7 +1520,7 @@ このプラットフォームを削除してもよろしいですか? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 131 + 133 @@ -1648,7 +1656,7 @@ メンバーシップの自動更新なし。 apps/client/src/app/components/user-account-membership/user-account-membership.html - 79 + 82 @@ -1780,7 +1788,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 81 + 82 libs/common/src/lib/routes/routes.ts @@ -1803,6 +1811,14 @@ 297 + + No credit card required. The trial ends automatically. + No credit card required. The trial ends automatically. + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 214 + + Manage Activities アクティビティを管理 @@ -1816,7 +1832,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 530 + 529 @@ -1972,7 +1988,7 @@ 合計金額 libs/ui/src/lib/investment-chart/investment-chart.component.ts - 166 + 182 @@ -1988,7 +2004,7 @@ 貯蓄率 libs/ui/src/lib/investment-chart/investment-chart.component.ts - 215 + 232 @@ -2008,7 +2024,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 356 + 362 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -2050,14 +2066,6 @@ apps/client/src/app/pages/landing/landing-page.html 352 - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 112 - - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 121 - apps/client/src/app/pages/pricing/pricing-page.html 336 @@ -2076,7 +2084,7 @@ Googleでサインイン apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 46 + 47 @@ -2092,7 +2100,7 @@ ログイン状態を維持する apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 69 @@ -2156,7 +2164,7 @@ 総資産 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 195 + 202 @@ -2164,7 +2172,7 @@ 購買力 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 335 + 342 @@ -2172,7 +2180,7 @@ 分析から除外 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 367 + 374 @@ -2180,7 +2188,7 @@ 負債 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 398 + 405 apps/client/src/app/pages/features/features-page.html @@ -2192,7 +2200,7 @@ 純資産(ネットワース) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 418 + 425 @@ -2200,7 +2208,7 @@ 年率換算パフォーマンス apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 433 + 440 @@ -2256,7 +2264,7 @@ データグリッチの報告 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 476 @@ -2398,6 +2406,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 181 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 224 + Upgrade Plan @@ -2552,7 +2564,7 @@ クーポンコードを入力してください。 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 203 + 197 @@ -2568,7 +2580,7 @@ クーポンコードを引き換えられませんでした apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 181 + 175 @@ -2584,7 +2596,7 @@ クーポンコードが引き換えられました apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 194 + 188 @@ -2602,9 +2614,13 @@ Try Premium Premiumを試す + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 235 + apps/client/src/app/components/user-account-membership/user-account-membership.html - 58 + 61 @@ -2612,7 +2628,7 @@ クーポンを引き換える apps/client/src/app/components/user-account-membership/user-account-membership.html - 72 + 75 @@ -2624,7 +2640,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 221 @@ -2648,7 +2664,7 @@ プレゼンタービュー apps/client/src/app/components/user-account-settings/user-account-settings.html - 226 + 232 @@ -2656,7 +2672,7 @@ 絶対パフォーマンスや数量などの機密情報の保護 apps/client/src/app/components/user-account-settings/user-account-settings.html - 228 + 234 @@ -2664,7 +2680,7 @@ 基準通貨 apps/client/src/app/components/user-account-settings/user-account-settings.html - 13 + 14 @@ -2680,7 +2696,7 @@ 言語 apps/client/src/app/components/user-account-settings/user-account-settings.html - 61 + 67 @@ -2688,11 +2704,11 @@ ロケール apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 669 + 668 apps/client/src/app/components/user-account-settings/user-account-settings.html - 156 + 162 @@ -2700,7 +2716,7 @@ 日付と数値の形式 apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 164 @@ -2708,15 +2724,15 @@ Close Account apps/client/src/app/components/user-account-settings/user-account-settings.html - 387 + 393 apps/client/src/app/components/user-account-settings/user-account-settings.html - 397 + 403 apps/client/src/app/components/user-account-settings/user-account-settings.html - 404 + 410 @@ -2724,7 +2740,7 @@ 外見 apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 207 @@ -2740,7 +2756,7 @@ ライト apps/client/src/app/components/user-account-settings/user-account-settings.html - 216 + 222 @@ -2756,7 +2772,7 @@ ダーク apps/client/src/app/components/user-account-settings/user-account-settings.html - 217 + 223 @@ -2764,7 +2780,7 @@ 禅モード apps/client/src/app/components/user-account-settings/user-account-settings.html - 244 + 250 apps/client/src/app/pages/features/features-page.html @@ -2776,7 +2792,7 @@ 激動の時代のためのディストラクションフリーな体験 apps/client/src/app/components/user-account-settings/user-account-settings.html - 246 + 252 @@ -2784,7 +2800,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 257 + 264 @@ -2800,7 +2816,7 @@ 生体認証 apps/client/src/app/components/user-account-settings/user-account-settings.html - 261 + 267 @@ -2808,7 +2824,7 @@ 指紋でサインイン apps/client/src/app/components/user-account-settings/user-account-settings.html - 263 + 269 @@ -2816,7 +2832,7 @@ 実験的機能 apps/client/src/app/components/user-account-settings/user-account-settings.html - 280 + 286 @@ -2824,7 +2840,7 @@ 近日公開予定の機能の先行プレビュー apps/client/src/app/components/user-account-settings/user-account-settings.html - 282 + 288 @@ -2836,7 +2852,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 316 + 322 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2848,7 +2864,7 @@ データをエクスポート apps/client/src/app/components/user-account-settings/user-account-settings.html - 331 + 337 @@ -2872,11 +2888,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 244 + 305 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 630 + 665 @@ -2892,11 +2908,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 242 + 303 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 628 + 663 @@ -2908,7 +2924,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 245 + 306 @@ -3384,7 +3400,7 @@ apps/client/src/app/pages/about/overview/about-overview-page.html - 193 + 194 apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts @@ -3444,7 +3460,7 @@ For security reasons, please delete all activities and accounts first before your Ghostfolio account can be closed. apps/client/src/app/components/user-account-settings/user-account-settings.html - 407 + 413 @@ -3596,7 +3612,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 233 apps/client/src/app/pages/public/public-page.html @@ -3927,14 +3943,6 @@ 132 - - 360° View - 360°ビュー - - apps/client/src/app/pages/landing/landing-page.html - 142 - - Get the full picture of your personal finances across multiple platforms. 複数のプラットフォームにわたる個人財務の全体像を把握しましょう。 @@ -3943,14 +3951,6 @@ 145 - - Web3 Ready - Web3対応 - - apps/client/src/app/pages/landing/landing-page.html - 153 - - Basic Materials 基本材料 @@ -4444,11 +4444,11 @@ thereof Dividend Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 178 + 185 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 306 + 313 @@ -4476,7 +4476,7 @@ アクティビティをインポート apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 124 + 162 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4492,7 +4492,7 @@ 配当金をインポート apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 180 + 241 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4508,7 +4508,7 @@ データをインポート中... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 223 + 284 @@ -4516,7 +4516,7 @@ インポートが完了しました apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 234 + 295 @@ -4532,11 +4532,11 @@ データを検証中... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 369 + 404 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 429 + 464 @@ -4579,16 +4579,16 @@ Choose or drop a file here ここでファイルを選択またはドロップ - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 95 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 20 The following file formats are supported: 以下のファイル形式がサポートされています: - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 102 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 26 @@ -4596,7 +4596,7 @@ 配当を選択 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 156 + 114 @@ -4604,7 +4604,7 @@ アクティビティを選択 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 158 + 116 @@ -4612,7 +4612,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 587 @@ -4620,11 +4620,11 @@ 戻る apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 222 + 180 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 260 + 218 @@ -4704,7 +4704,7 @@ The CSV file has more than rows of activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 404 + 439 @@ -4912,7 +4912,7 @@ トップ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 329 + 336 @@ -4920,7 +4920,7 @@ ボトム apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 382 + 389 @@ -4928,7 +4928,7 @@ ポートフォリオ進化 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 468 + 476 @@ -4936,7 +4936,7 @@ 投資タイムライン apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 496 + 504 @@ -4944,7 +4944,7 @@ 現在のストリーク apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 517 + 525 @@ -4952,7 +4952,7 @@ 最長のストリーク apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 526 + 534 @@ -4960,7 +4960,7 @@ 配当金タイムライン apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 554 + 562 @@ -5212,7 +5212,7 @@ Powered by third-party AI providers apps/client/src/app/components/user-account-settings/user-account-settings.html - 300 + 306 @@ -5284,7 +5284,7 @@ Googleで続ける apps/client/src/app/pages/register/register-page.html - 41 + 42 @@ -5733,7 +5733,7 @@ この口座残高を本当に削除しますか? libs/ui/src/lib/account-balances/account-balances.component.ts - 134 + 127 @@ -5876,6 +5876,18 @@ 290 + + Return on Investment (total return with dividends) + Return on Investment (total return with dividends) + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 165 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 270 + + Add to Watchlist Add to Watchlist @@ -5941,7 +5953,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 507 + 514 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -6001,7 +6013,7 @@ 口座 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 110 + 105 libs/common/src/lib/routes/routes.ts @@ -6113,15 +6125,15 @@ 緊急資金 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 272 + 279 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 350 + 357 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 452 + 459 apps/client/src/app/pages/features/features-page.html @@ -6299,6 +6311,10 @@ apps/client/src/app/components/admin-users/admin-users.html 247 + + apps/client/src/app/components/home-overview/home-overview.html + 110 + libs/ui/src/lib/accounts-table/accounts-table.component.html 339 @@ -6317,7 +6333,7 @@ OpenID Connectでサインイン apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 57 + 58 @@ -6389,7 +6405,7 @@ 現金 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 304 + 311 @@ -6577,7 +6593,7 @@ もし翻訳がない場合は、それを拡張するためにここで私たちを支援してください。 apps/client/src/app/components/user-account-settings/user-account-settings.html - 64 + 70 @@ -6601,7 +6617,7 @@ テスト apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 728 + 727 @@ -6609,7 +6625,7 @@ おっと!アクセスを許可できませんでした。 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 320 + 316 @@ -6673,7 +6689,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 464 + 463 @@ -6777,7 +6793,7 @@ Oops! A data provider is experiencing the hiccups. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html - 8 + 9 @@ -6848,8 +6864,8 @@ Ghostfolio AI is processing the file... Ghostfolio AI is processing the file... - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 82 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 164 @@ -6894,7 +6910,7 @@ データ収集 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 751 + 750 apps/client/src/app/components/admin-overview/admin-overview.html @@ -7050,7 +7066,7 @@ アカウントを閉鎖する apps/client/src/app/components/user-account-settings/user-account-settings.html - 416 + 422 @@ -7074,7 +7090,7 @@ 危険ゾーン apps/client/src/app/components/user-account-settings/user-account-settings.html - 340 + 346 @@ -7122,7 +7138,7 @@ Derived from the portfolio you are viewing apps/client/src/app/components/user-account-settings/user-account-settings.html - 27 + 28 @@ -7178,7 +7194,7 @@ The content of your file will be processed by third-party AI providers. Please remove any personal data before uploading. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 126 + 165 @@ -7198,47 +7214,47 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 96 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 129 apps/client/src/app/components/user-account-settings/user-account-settings.html - 128 + 134 apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 138 apps/client/src/app/components/user-account-settings/user-account-settings.html - 136 + 142 apps/client/src/app/components/user-account-settings/user-account-settings.html - 140 + 146 apps/client/src/app/components/user-account-settings/user-account-settings.html - 146 + 152 apps/client/src/app/pages/features/features-page.html @@ -7426,7 +7442,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 756 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7506,7 +7522,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 287 + 294 @@ -7514,7 +7530,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 758 + 757 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7542,7 +7558,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 150 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -7574,7 +7590,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 420 + 416 @@ -7810,7 +7826,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 601 + 600 @@ -8032,7 +8048,7 @@ AI-assisted import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 136 + 94 @@ -8060,7 +8076,7 @@ Could not generate an API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 142 + 136 @@ -8068,7 +8084,7 @@ Do you really want to generate a new API key? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 163 + 157 @@ -8076,7 +8092,7 @@ Ghostfolio Premium Data Provider API Key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 158 + 152 @@ -8084,7 +8100,7 @@ Set this API key in your self-hosted environment: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 151 @@ -8116,7 +8132,7 @@ 保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 767 + 766 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -8159,6 +8175,14 @@ 50 + + All in One Place + All in One Place + + apps/client/src/app/pages/landing/landing-page.html + 142 + + Received Access Received Access @@ -8232,7 +8256,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 678 + 677 @@ -8248,7 +8272,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 642 + 641 @@ -8256,7 +8280,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 694 + 693 @@ -8280,7 +8304,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 655 + 654 @@ -8352,7 +8376,7 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 69 + 73 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -8416,7 +8440,7 @@ Performance Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 440 + 447 @@ -8573,7 +8597,7 @@ Performance Calculation apps/client/src/app/components/user-account-settings/user-account-settings.html - 36 + 37 @@ -8678,7 +8702,7 @@ {VAR_PLURAL, plural, =1 {Ghostfolio AI could not match 1 activity of the file } other {Ghostfolio AI could not match activities of the file }} apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 172 + 130 @@ -8927,6 +8951,14 @@ 5 + + Privacy First + Privacy First + + apps/client/src/app/pages/landing/landing-page.html + 153 + + Available Available @@ -9153,7 +9185,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 492 + 491 @@ -9173,11 +9205,11 @@ Return on Average Investment (total return with dividends) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 159 + 157 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 264 + 262 diff --git a/apps/client/src/locales/messages.ko.xlf b/apps/client/src/locales/messages.ko.xlf index daceac74a7..db568c6fee 100644 --- a/apps/client/src/locales/messages.ko.xlf +++ b/apps/client/src/locales/messages.ko.xlf @@ -652,7 +652,7 @@ Ghostfolio AI has processed the maximum of activities. The file can have more activities. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 193 + 151 @@ -772,7 +772,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 518 @@ -812,11 +812,11 @@ 날짜 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 528 + 527 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 564 + 563 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -943,6 +943,14 @@ 71 + + Request a free trial + Request a free trial + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 211 + + Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. @@ -1016,7 +1024,7 @@ The file is larger than MB apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 396 + 431 @@ -1052,7 +1060,7 @@ 이런! 과거 데이터를 파싱할 수 없습니다. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 287 + 285 @@ -1088,11 +1096,11 @@ 가져오기 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 231 + 189 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 268 + 226 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -1228,7 +1236,7 @@ 스크래퍼 설정 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 631 @@ -1436,7 +1444,7 @@ 추가 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 619 + 618 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1480,7 +1488,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 710 + 709 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1512,7 +1520,7 @@ 정말로 이 플랫폼을 삭제하시겠습니까? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 131 + 133 @@ -1648,7 +1656,7 @@ 멤버십 자동 갱신은 없습니다. apps/client/src/app/components/user-account-membership/user-account-membership.html - 79 + 82 @@ -1780,7 +1788,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 81 + 82 libs/common/src/lib/routes/routes.ts @@ -1803,6 +1811,14 @@ 297 + + No credit card required. The trial ends automatically. + No credit card required. The trial ends automatically. + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 214 + + Manage Activities 거래 내역 관리 @@ -1816,7 +1832,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 530 + 529 @@ -1972,7 +1988,7 @@ 총액 libs/ui/src/lib/investment-chart/investment-chart.component.ts - 166 + 182 @@ -1988,7 +2004,7 @@ 저축률 libs/ui/src/lib/investment-chart/investment-chart.component.ts - 215 + 232 @@ -2008,7 +2024,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 356 + 362 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -2050,14 +2066,6 @@ apps/client/src/app/pages/landing/landing-page.html 352 - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 112 - - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 121 - apps/client/src/app/pages/pricing/pricing-page.html 336 @@ -2076,7 +2084,7 @@ 구글로 로그인 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 46 + 47 @@ -2092,7 +2100,7 @@ 로그인 상태 유지 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 69 @@ -2156,7 +2164,7 @@ 총자산 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 195 + 202 @@ -2164,7 +2172,7 @@ 매수 가능 금액 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 335 + 342 @@ -2172,7 +2180,7 @@ 분석에서 제외됨 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 367 + 374 @@ -2180,7 +2188,7 @@ 부채 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 398 + 405 apps/client/src/app/pages/features/features-page.html @@ -2192,7 +2200,7 @@ 순자산 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 418 + 425 @@ -2200,7 +2208,7 @@ 연환산 성과 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 433 + 440 @@ -2256,7 +2264,7 @@ 데이터 결함 보고 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 476 @@ -2398,6 +2406,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 181 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 224 + Upgrade Plan @@ -2552,7 +2564,7 @@ 쿠폰 코드를 입력해주세요. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 203 + 197 @@ -2568,7 +2580,7 @@ 쿠폰 코드를 사용할 수 없습니다. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 181 + 175 @@ -2584,7 +2596,7 @@ 쿠폰 코드가 사용되었습니다. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 194 + 188 @@ -2602,9 +2614,13 @@ Try Premium 프리미엄을 사용해 보세요 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 235 + apps/client/src/app/components/user-account-membership/user-account-membership.html - 58 + 61 @@ -2612,7 +2628,7 @@ 쿠폰 사용 apps/client/src/app/components/user-account-membership/user-account-membership.html - 72 + 75 @@ -2624,7 +2640,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 221 @@ -2648,7 +2664,7 @@ 발표자 보기 apps/client/src/app/components/user-account-settings/user-account-settings.html - 226 + 232 @@ -2656,7 +2672,7 @@ 절대 성과 및 수량 값과 같은 민감한 정보를 보호합니다. apps/client/src/app/components/user-account-settings/user-account-settings.html - 228 + 234 @@ -2664,7 +2680,7 @@ 기본 통화 apps/client/src/app/components/user-account-settings/user-account-settings.html - 13 + 14 @@ -2680,7 +2696,7 @@ 언어 apps/client/src/app/components/user-account-settings/user-account-settings.html - 61 + 67 @@ -2688,11 +2704,11 @@ 장소 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 669 + 668 apps/client/src/app/components/user-account-settings/user-account-settings.html - 156 + 162 @@ -2700,7 +2716,7 @@ 날짜 및 숫자 형식 apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 164 @@ -2708,15 +2724,15 @@ 계정 폐쇄 apps/client/src/app/components/user-account-settings/user-account-settings.html - 387 + 393 apps/client/src/app/components/user-account-settings/user-account-settings.html - 397 + 403 apps/client/src/app/components/user-account-settings/user-account-settings.html - 404 + 410 @@ -2724,7 +2740,7 @@ 테마 apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 207 @@ -2740,7 +2756,7 @@ 라이트 apps/client/src/app/components/user-account-settings/user-account-settings.html - 216 + 222 @@ -2756,7 +2772,7 @@ 다크 apps/client/src/app/components/user-account-settings/user-account-settings.html - 217 + 223 @@ -2764,7 +2780,7 @@ 프라이버시 모드 apps/client/src/app/components/user-account-settings/user-account-settings.html - 244 + 250 apps/client/src/app/pages/features/features-page.html @@ -2776,7 +2792,7 @@ 격동의 시대에 방해받지 않는 경험 apps/client/src/app/components/user-account-settings/user-account-settings.html - 246 + 252 @@ -2784,7 +2800,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 257 + 264 @@ -2800,7 +2816,7 @@ 생체인증 apps/client/src/app/components/user-account-settings/user-account-settings.html - 261 + 267 @@ -2808,7 +2824,7 @@ 지문으로 로그인 apps/client/src/app/components/user-account-settings/user-account-settings.html - 263 + 269 @@ -2816,7 +2832,7 @@ 실험적 기능 apps/client/src/app/components/user-account-settings/user-account-settings.html - 280 + 286 @@ -2824,7 +2840,7 @@ 곧 출시될 기능 미리보기 apps/client/src/app/components/user-account-settings/user-account-settings.html - 282 + 288 @@ -2836,7 +2852,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 316 + 322 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2848,7 +2864,7 @@ 데이터 내보내기 apps/client/src/app/components/user-account-settings/user-account-settings.html - 331 + 337 @@ -2872,11 +2888,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 244 + 305 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 630 + 665 @@ -2892,11 +2908,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 242 + 303 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 628 + 663 @@ -2908,7 +2924,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 245 + 306 @@ -3384,7 +3400,7 @@ apps/client/src/app/pages/about/overview/about-overview-page.html - 193 + 194 apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts @@ -3444,7 +3460,7 @@ 보안을 위해 Ghostfolio 계정을 폐쇄하려면 먼저 모든 거래 내역과 계좌를 삭제해 주세요. apps/client/src/app/components/user-account-settings/user-account-settings.html - 407 + 413 @@ -3596,7 +3612,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 233 apps/client/src/app/pages/public/public-page.html @@ -3927,14 +3943,6 @@ 132 - - 360° View - 360° 보기 - - apps/client/src/app/pages/landing/landing-page.html - 142 - - Get the full picture of your personal finances across multiple platforms. 여러 플랫폼에 걸쳐 개인 재정에 대한 전체 그림을 얻으세요. @@ -3943,14 +3951,6 @@ 145 - - Web3 Ready - 웹3 준비 - - apps/client/src/app/pages/landing/landing-page.html - 153 - - Basic Materials 기초소재 @@ -4436,11 +4436,11 @@ thereof Dividend Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 178 + 185 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 306 + 313 @@ -4468,7 +4468,7 @@ 거래 내역 가져오기 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 124 + 162 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4484,7 +4484,7 @@ 배당금 가져오기 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 180 + 241 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4500,7 +4500,7 @@ 데이터 가져오는 중... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 223 + 284 @@ -4508,7 +4508,7 @@ 가져오기가 완료되었습니다. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 234 + 295 @@ -4524,11 +4524,11 @@ 데이터 유효성을 검사하는 중... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 369 + 404 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 429 + 464 @@ -4571,16 +4571,16 @@ Choose or drop a file here 여기에 파일을 선택하거나 드롭하세요. - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 95 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 20 The following file formats are supported: 다음 파일 형식이 지원됩니다. - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 102 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 26 @@ -4588,7 +4588,7 @@ 배당금 선택 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 156 + 114 @@ -4596,7 +4596,7 @@ 거래 선택 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 158 + 116 @@ -4604,7 +4604,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 587 @@ -4612,11 +4612,11 @@ 뒤쪽에 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 222 + 180 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 260 + 218 @@ -4696,7 +4696,7 @@ The CSV file has more than rows of activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 404 + 439 @@ -4904,7 +4904,7 @@ 상위 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 329 + 336 @@ -4912,7 +4912,7 @@ 하위 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 382 + 389 @@ -4920,7 +4920,7 @@ 포트폴리오 진화 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 468 + 476 @@ -4928,7 +4928,7 @@ 투자 일정 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 496 + 504 @@ -4936,7 +4936,7 @@ 현재 연속 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 517 + 525 @@ -4944,7 +4944,7 @@ 최장 연속 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 526 + 534 @@ -4952,7 +4952,7 @@ 배당 일정 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 554 + 562 @@ -5204,7 +5204,7 @@ Powered by third-party AI providers apps/client/src/app/components/user-account-settings/user-account-settings.html - 300 + 306 @@ -5276,7 +5276,7 @@ 구글로 계속하기 apps/client/src/app/pages/register/register-page.html - 41 + 42 @@ -5725,7 +5725,7 @@ 정말로 이 계좌 잔액을 삭제하시겠습니까? libs/ui/src/lib/account-balances/account-balances.component.ts - 134 + 127 @@ -5868,6 +5868,18 @@ 290 + + Return on Investment (total return with dividends) + Return on Investment (total return with dividends) + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 165 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 270 + + Add to Watchlist Add to Watchlist @@ -5933,7 +5945,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 507 + 514 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5993,7 +6005,7 @@ 계좌 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 110 + 105 libs/common/src/lib/routes/routes.ts @@ -6105,15 +6117,15 @@ 비상자금 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 272 + 279 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 350 + 357 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 452 + 459 apps/client/src/app/pages/features/features-page.html @@ -6299,6 +6311,10 @@ apps/client/src/app/components/admin-users/admin-users.html 247 + + apps/client/src/app/components/home-overview/home-overview.html + 110 + libs/ui/src/lib/accounts-table/accounts-table.component.html 339 @@ -6317,7 +6333,7 @@ OpenID Connect로 로그인 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 57 + 58 @@ -6389,7 +6405,7 @@ 현금 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 304 + 311 @@ -6577,7 +6593,7 @@ 번역이 누락된 경우 여기에서 번역을 확장할 수 있도록 지원해 주시기 바랍니다. apps/client/src/app/components/user-account-settings/user-account-settings.html - 64 + 70 @@ -6601,7 +6617,7 @@ 시험 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 728 + 727 @@ -6609,7 +6625,7 @@ 이런! 액세스 권한을 부여할 수 없습니다. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 320 + 316 @@ -6673,7 +6689,7 @@ 보유 포지션 종료 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 464 + 463 @@ -6777,7 +6793,7 @@ 이런! 데이터 제공업체에 문제가 발생했습니다. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html - 8 + 9 @@ -6848,8 +6864,8 @@ Ghostfolio AI is processing the file... Ghostfolio AI is processing the file... - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 82 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 164 @@ -6894,7 +6910,7 @@ 데이터 수집 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 751 + 750 apps/client/src/app/components/admin-overview/admin-overview.html @@ -7050,7 +7066,7 @@ 계정 폐쇄 apps/client/src/app/components/user-account-settings/user-account-settings.html - 416 + 422 @@ -7074,7 +7090,7 @@ 위험지대 apps/client/src/app/components/user-account-settings/user-account-settings.html - 340 + 346 @@ -7122,7 +7138,7 @@ Derived from the portfolio you are viewing apps/client/src/app/components/user-account-settings/user-account-settings.html - 27 + 28 @@ -7178,7 +7194,7 @@ The content of your file will be processed by third-party AI providers. Please remove any personal data before uploading. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 126 + 165 @@ -7198,47 +7214,47 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 96 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 129 apps/client/src/app/components/user-account-settings/user-account-settings.html - 128 + 134 apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 138 apps/client/src/app/components/user-account-settings/user-account-settings.html - 136 + 142 apps/client/src/app/components/user-account-settings/user-account-settings.html - 140 + 146 apps/client/src/app/components/user-account-settings/user-account-settings.html - 146 + 152 apps/client/src/app/pages/features/features-page.html @@ -7426,7 +7442,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 756 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7506,7 +7522,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 287 + 294 @@ -7514,7 +7530,7 @@ 닫다 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 758 + 757 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7542,7 +7558,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 150 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -7574,7 +7590,7 @@ 이런! 액세스를 업데이트할 수 없습니다. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 420 + 416 @@ -7810,7 +7826,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 601 + 600 @@ -8032,7 +8048,7 @@ AI-assisted import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 136 + 94 @@ -8060,7 +8076,7 @@ API 키를 생성할 수 없습니다. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 142 + 136 @@ -8068,7 +8084,7 @@ 정말로 새 API 키를 생성하시겠습니까? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 163 + 157 @@ -8076,7 +8092,7 @@ Ghostfolio 프리미엄 데이터 공급자 API 키 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 158 + 152 @@ -8084,7 +8100,7 @@ 자체 호스팅 환경에서 이 API 키를 설정하세요. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 151 @@ -8116,7 +8132,7 @@ 구하다 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 767 + 766 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -8159,6 +8175,14 @@ 50 + + All in One Place + All in One Place + + apps/client/src/app/pages/landing/landing-page.html + 142 + + Received Access 수신된 액세스 @@ -8232,7 +8256,7 @@ 방법 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 678 + 677 @@ -8248,7 +8272,7 @@ 기본 시장 가격 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 642 + 641 @@ -8256,7 +8280,7 @@ 선택자 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 694 + 693 @@ -8280,7 +8304,7 @@ HTTP 요청 헤더 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 655 + 654 @@ -8352,7 +8376,7 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 69 + 73 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -8416,7 +8440,7 @@ Performance Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 440 + 447 @@ -8573,7 +8597,7 @@ 성과 계산 apps/client/src/app/components/user-account-settings/user-account-settings.html - 36 + 37 @@ -8678,7 +8702,7 @@ {VAR_PLURAL, plural, =1 {Ghostfolio AI could not match 1 activity of the file } other {Ghostfolio AI could not match activities of the file }} apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 172 + 130 @@ -8927,6 +8951,14 @@ 5 + + Privacy First + Privacy First + + apps/client/src/app/pages/landing/landing-page.html + 153 + + Available 사용 가능 @@ -9153,7 +9185,7 @@ 자산 프로필 관리 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 492 + 491 @@ -9173,11 +9205,11 @@ Return on Average Investment (total return with dividends) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 159 + 157 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 264 + 262 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 2aa8f31642..e7f1434e12 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -446,7 +446,7 @@ Ghostfolio AI has processed the maximum of activities. The file can have more activities. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 193 + 151 @@ -474,7 +474,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 518 @@ -514,11 +514,11 @@ Datum apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 528 + 527 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 564 + 563 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -581,6 +581,14 @@ 71 + + Request a free trial + Request a free trial + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 211 + + Historical Data Historische gegevens @@ -698,7 +706,7 @@ Toevoegen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 619 + 618 apps/client/src/app/components/admin-overview/admin-overview.html @@ -754,7 +762,7 @@ Het lidmaatschap wordt niet automatisch verlengd. apps/client/src/app/components/user-account-membership/user-account-membership.html - 79 + 82 @@ -858,7 +866,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 81 + 82 libs/common/src/lib/routes/routes.ts @@ -881,6 +889,14 @@ 297 + + No credit card required. The trial ends automatically. + No credit card required. The trial ends automatically. + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 214 + + Manage Activities Activiteiten beheren @@ -894,7 +910,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 530 + 529 @@ -938,7 +954,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 356 + 362 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -980,14 +996,6 @@ apps/client/src/app/pages/landing/landing-page.html 352 - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 112 - - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 121 - apps/client/src/app/pages/pricing/pricing-page.html 336 @@ -1006,7 +1014,7 @@ Aanmelden met Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 46 + 47 @@ -1022,7 +1030,7 @@ Aangemeld blijven apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 69 @@ -1074,7 +1082,7 @@ Totaal Activa apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 195 + 202 @@ -1082,7 +1090,7 @@ Koopkracht apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 335 + 342 @@ -1090,7 +1098,7 @@ Netto waarde apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 418 + 425 @@ -1098,7 +1106,7 @@ Rendement per jaar apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 433 + 440 @@ -1166,7 +1174,7 @@ Gegevensstoring melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 476 @@ -1290,7 +1298,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 245 + 306 @@ -1350,7 +1358,7 @@ Voer je couponcode in: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 203 + 197 @@ -1366,7 +1374,7 @@ Kon je kortingscode niet inwisselen apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 181 + 175 @@ -1382,7 +1390,7 @@ Je couponcode is ingewisseld apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 194 + 188 @@ -1408,9 +1416,13 @@ Try Premium Probeer Premium + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 235 + apps/client/src/app/components/user-account-membership/user-account-membership.html - 58 + 61 @@ -1418,7 +1430,7 @@ Coupon inwisselen apps/client/src/app/components/user-account-membership/user-account-membership.html - 72 + 75 @@ -1434,7 +1446,7 @@ Presentatie weergave apps/client/src/app/components/user-account-settings/user-account-settings.html - 226 + 232 @@ -1442,7 +1454,7 @@ Basisvaluta apps/client/src/app/components/user-account-settings/user-account-settings.html - 13 + 14 @@ -1458,11 +1470,11 @@ Locatie apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 669 + 668 apps/client/src/app/components/user-account-settings/user-account-settings.html - 156 + 162 @@ -1470,7 +1482,7 @@ Datum- en getalnotatie apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 164 @@ -1478,7 +1490,7 @@ Zen-modus apps/client/src/app/components/user-account-settings/user-account-settings.html - 244 + 250 apps/client/src/app/pages/features/features-page.html @@ -1490,7 +1502,7 @@ Aanmelden met vingerafdruk apps/client/src/app/components/user-account-settings/user-account-settings.html - 263 + 269 @@ -1502,7 +1514,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 316 + 322 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1862,7 +1874,7 @@ apps/client/src/app/pages/about/overview/about-overview-page.html - 193 + 194 apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts @@ -2034,7 +2046,7 @@ The CSV file has more than rows of activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 404 + 439 @@ -2098,7 +2110,7 @@ Tijdlijn investeringen apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 496 + 504 @@ -2106,7 +2118,7 @@ Winnaars apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 329 + 336 @@ -2114,7 +2126,7 @@ Verliezers apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 382 + 389 @@ -2150,7 +2162,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 233 apps/client/src/app/pages/public/public-page.html @@ -2362,7 +2374,7 @@ Gegevens importeren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 223 + 284 @@ -2370,7 +2382,7 @@ Importeren is voltooid apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 234 + 295 @@ -2478,7 +2490,7 @@ Verder met Google apps/client/src/app/pages/register/register-page.html - 41 + 42 @@ -2558,7 +2570,7 @@ Activiteiten importeren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 124 + 162 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2666,7 +2678,7 @@ Taal apps/client/src/app/components/user-account-settings/user-account-settings.html - 61 + 67 @@ -2690,11 +2702,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 242 + 303 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 628 + 663 @@ -2710,11 +2722,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 244 + 305 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 630 + 665 @@ -2850,7 +2862,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 507 + 514 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2914,7 +2926,7 @@ The file is larger than MB apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 396 + 431 @@ -2974,7 +2986,7 @@ Experimentele functies apps/client/src/app/components/user-account-settings/user-account-settings.html - 280 + 286 @@ -3022,7 +3034,7 @@ Uitgesloten van analyse apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 367 + 374 @@ -3034,7 +3046,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 221 @@ -3042,15 +3054,15 @@ Account Sluiten apps/client/src/app/components/user-account-settings/user-account-settings.html - 387 + 393 apps/client/src/app/components/user-account-settings/user-account-settings.html - 397 + 403 apps/client/src/app/components/user-account-settings/user-account-settings.html - 404 + 410 @@ -3058,7 +3070,7 @@ Weergave apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 207 @@ -3074,7 +3086,7 @@ Licht apps/client/src/app/components/user-account-settings/user-account-settings.html - 216 + 222 @@ -3090,7 +3102,7 @@ Donker apps/client/src/app/components/user-account-settings/user-account-settings.html - 217 + 223 @@ -3098,7 +3110,7 @@ Totaalbedrag libs/ui/src/lib/investment-chart/investment-chart.component.ts - 166 + 182 @@ -3106,7 +3118,7 @@ Waardeontwikkeling van portefeuille apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 468 + 476 @@ -3122,7 +3134,7 @@ Spaarrente libs/ui/src/lib/investment-chart/investment-chart.component.ts - 215 + 232 @@ -3130,7 +3142,7 @@ Account apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 110 + 105 libs/common/src/lib/routes/routes.ts @@ -3230,7 +3242,7 @@ Contant geld apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 304 + 311 @@ -3262,15 +3274,15 @@ Noodfonds apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 272 + 279 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 350 + 357 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 452 + 459 apps/client/src/app/pages/features/features-page.html @@ -3421,8 +3433,8 @@ The following file formats are supported: De volgende bestandsformaten worden ondersteund: - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 102 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 26 @@ -3430,11 +3442,11 @@ Terug apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 222 + 180 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 260 + 218 @@ -3546,7 +3558,7 @@ Tijdlijn dividend apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 554 + 562 @@ -3590,11 +3602,11 @@ Gegevens valideren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 369 + 404 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 429 + 464 @@ -3602,11 +3614,11 @@ Importeren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 231 + 189 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 268 + 226 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -3698,7 +3710,7 @@ Importeer dividenden apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 180 + 241 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3790,7 +3802,7 @@ Bescherming voor gevoelige informatie zoals absoluut rendement en hoeveelheden apps/client/src/app/components/user-account-settings/user-account-settings.html - 228 + 234 @@ -3798,7 +3810,7 @@ Afleidingsvrije ervaring voor roerige tijden apps/client/src/app/components/user-account-settings/user-account-settings.html - 246 + 252 @@ -3806,7 +3818,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 257 + 264 @@ -3814,7 +3826,7 @@ Voorproefje van nieuwe functionaliteit apps/client/src/app/components/user-account-settings/user-account-settings.html - 282 + 288 @@ -3908,6 +3920,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 181 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 224 + Upgrade Plan @@ -4062,7 +4078,7 @@ Powered by third-party AI providers apps/client/src/app/components/user-account-settings/user-account-settings.html - 300 + 306 @@ -4169,6 +4185,18 @@ 19 + + Return on Investment (total return with dividends) + Return on Investment (total return with dividends) + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 165 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 270 + + Add to Watchlist Add to Watchlist @@ -4326,7 +4354,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 710 + 709 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4358,7 +4386,7 @@ Wil je dit platform echt verwijderen? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 131 + 133 @@ -4374,11 +4402,11 @@ thereof Dividend Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 178 + 185 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 306 + 313 @@ -4474,7 +4502,7 @@ Selecteer dividenden apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 156 + 114 @@ -4482,7 +4510,7 @@ Selecteer activiteiten apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 158 + 116 @@ -4490,7 +4518,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 587 @@ -4514,7 +4542,7 @@ Huidige reeks apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 517 + 525 @@ -4522,7 +4550,7 @@ Langste reeks apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 526 + 534 @@ -4564,6 +4592,10 @@ apps/client/src/app/components/admin-users/admin-users.html 247 + + apps/client/src/app/components/home-overview/home-overview.html + 110 + libs/ui/src/lib/accounts-table/accounts-table.component.html 339 @@ -4574,7 +4606,7 @@ Verplichtingen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 398 + 405 apps/client/src/app/pages/features/features-page.html @@ -4626,7 +4658,7 @@ Verwijder om veiligheidsredenen eerst alle activiteiten en rekeningen voordat uw Ghostfolio account kan worden gesloten. apps/client/src/app/components/user-account-settings/user-account-settings.html - 407 + 413 @@ -4770,7 +4802,7 @@ Scraper instellingen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 631 @@ -5014,7 +5046,7 @@ Meld je aan met OpenID Connect apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 57 + 58 @@ -5194,7 +5226,7 @@ Biometrische authenticatie apps/client/src/app/components/user-account-settings/user-account-settings.html - 261 + 267 @@ -5286,7 +5318,7 @@ Exporteer Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 331 + 337 @@ -5429,22 +5461,6 @@ 132 - - 360° View - 360°-overzicht - - apps/client/src/app/pages/landing/landing-page.html - 142 - - - - Web3 Ready - Klaar voor Web3 - - apps/client/src/app/pages/landing/landing-page.html - 153 - - Basic Materials Basismaterialen @@ -6051,8 +6067,8 @@ Choose or drop a file here Kies of sleep bestand hier - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 95 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 20 @@ -6476,7 +6492,7 @@ Oeps! Ophalen van historische data is mislukt. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 287 + 285 @@ -6544,7 +6560,7 @@ Wilt u dit rekeningsaldo echt verwijderen? libs/ui/src/lib/account-balances/account-balances.component.ts - 134 + 127 @@ -6552,7 +6568,7 @@ Als er een vertaling ontbreekt, kunt u ons helpen deze here uit te breiden. apps/client/src/app/components/user-account-settings/user-account-settings.html - 64 + 70 @@ -6568,7 +6584,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 728 + 727 @@ -6604,7 +6620,7 @@ Oeps! Kan geen toegang verlenen. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 320 + 316 @@ -6656,7 +6672,7 @@ Sluit Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 464 + 463 @@ -6776,7 +6792,7 @@ Oeps! Een gegevensaanbieder ondervindt problemen. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html - 8 + 9 @@ -6823,8 +6839,8 @@ Ghostfolio AI is processing the file... Ghostfolio AI is processing the file... - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 82 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 164 @@ -6840,7 +6856,7 @@ Data Verzamelen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 751 + 750 apps/client/src/app/components/admin-overview/admin-overview.html @@ -7041,7 +7057,7 @@ Gevarenzone apps/client/src/app/components/user-account-settings/user-account-settings.html - 340 + 346 @@ -7049,7 +7065,7 @@ Account Sluiten apps/client/src/app/components/user-account-settings/user-account-settings.html - 416 + 422 @@ -7097,7 +7113,7 @@ Derived from the portfolio you are viewing apps/client/src/app/components/user-account-settings/user-account-settings.html - 27 + 28 @@ -7153,7 +7169,7 @@ The content of your file will be processed by third-party AI providers. Please remove any personal data before uploading. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 126 + 165 @@ -7197,47 +7213,47 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 96 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 129 apps/client/src/app/components/user-account-settings/user-account-settings.html - 128 + 134 apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 138 apps/client/src/app/components/user-account-settings/user-account-settings.html - 136 + 142 apps/client/src/app/components/user-account-settings/user-account-settings.html - 140 + 146 apps/client/src/app/components/user-account-settings/user-account-settings.html - 146 + 152 apps/client/src/app/pages/features/features-page.html @@ -7413,7 +7429,7 @@ Oops! Kan de toegang niet updaten. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 420 + 416 @@ -7433,7 +7449,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 756 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7489,7 +7505,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 287 + 294 @@ -7497,7 +7513,7 @@ Sluiten apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 758 + 757 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7525,7 +7541,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 150 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -7785,7 +7801,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 601 + 600 @@ -8011,7 +8027,7 @@ Er kon geen API-sleutel worden gegenereerd apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 142 + 136 @@ -8019,7 +8035,7 @@ Stel deze API-sleutel in uw zelf-gehoste omgeving in: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 151 @@ -8035,7 +8051,7 @@ Ghostfolio Premium Gegevensleverancier API-sleutel apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 158 + 152 @@ -8043,7 +8059,7 @@ Wilt u echt een nieuwe API-sleutel genereren? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 163 + 157 @@ -8067,7 +8083,7 @@ AI-assisted import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 136 + 94 @@ -8091,7 +8107,7 @@ Opslaan apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 767 + 766 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -8146,6 +8162,14 @@ 210 + + All in One Place + All in One Place + + apps/client/src/app/pages/landing/landing-page.html + 142 + + Received Access Toegang Verkregen @@ -8223,7 +8247,7 @@ Standaard Marktprijs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 642 + 641 @@ -8231,7 +8255,7 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 678 + 677 @@ -8247,7 +8271,7 @@ Kiezer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 694 + 693 @@ -8255,7 +8279,7 @@ HTTP Verzoek Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 655 + 654 @@ -8327,7 +8351,7 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 69 + 73 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -8407,7 +8431,7 @@ Performance Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 440 + 447 @@ -8572,7 +8596,7 @@ Prestatieberekening apps/client/src/app/components/user-account-settings/user-account-settings.html - 36 + 37 @@ -8669,7 +8693,7 @@ {VAR_PLURAL, plural, =1 {Ghostfolio AI could not match 1 activity of the file } other {Ghostfolio AI could not match activities of the file }} apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 172 + 130 @@ -8918,6 +8942,14 @@ 307 + + Privacy First + Privacy First + + apps/client/src/app/pages/landing/landing-page.html + 153 + + Available Beschikbaar @@ -9152,7 +9184,7 @@ Beheer activaprofiel apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 492 + 491 @@ -9268,11 +9300,11 @@ Return on Average Investment (total return with dividends) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 159 + 157 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 264 + 262 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 2358d0335e..d35c349d51 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -643,7 +643,7 @@ Ghostfolio AI has processed the maximum of activities. The file can have more activities. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 193 + 151 @@ -763,7 +763,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 518 @@ -803,11 +803,11 @@ Data apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 528 + 527 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 564 + 563 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -934,6 +934,14 @@ 71 + + Request a free trial + Request a free trial + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 211 + + Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. @@ -1007,7 +1015,7 @@ The file is larger than MB apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 396 + 431 @@ -1027,7 +1035,7 @@ Ups! Nie udało się sparsować danych historycznych. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 287 + 285 @@ -1055,11 +1063,11 @@ Importuj apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 231 + 189 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 268 + 226 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -1195,7 +1203,7 @@ Konfiguracja Scrapera apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 631 @@ -1403,7 +1411,7 @@ Dodaj apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 619 + 618 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1447,7 +1455,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 710 + 709 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1479,7 +1487,7 @@ Czy naprawdę chcesz usunąć tę platformę? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 131 + 133 @@ -1615,7 +1623,7 @@ Brak automatycznego odnawiania członkostwa. apps/client/src/app/components/user-account-membership/user-account-membership.html - 79 + 82 @@ -1747,7 +1755,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 81 + 82 libs/common/src/lib/routes/routes.ts @@ -1770,6 +1778,14 @@ 297 + + No credit card required. The trial ends automatically. + No credit card required. The trial ends automatically. + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 214 + + Manage Activities Zarządzaj Aktywnościami @@ -1783,7 +1799,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 530 + 529 @@ -1939,7 +1955,7 @@ Całkowita Kwota libs/ui/src/lib/investment-chart/investment-chart.component.ts - 166 + 182 @@ -1955,7 +1971,7 @@ Stopa Oszczędności libs/ui/src/lib/investment-chart/investment-chart.component.ts - 215 + 232 @@ -1975,7 +1991,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 356 + 362 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -2017,14 +2033,6 @@ apps/client/src/app/pages/landing/landing-page.html 352 - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 112 - - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 121 - apps/client/src/app/pages/pricing/pricing-page.html 336 @@ -2043,7 +2051,7 @@ Zaloguj się przez Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 46 + 47 @@ -2059,7 +2067,7 @@ Pozostań zalogowany apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 69 @@ -2123,7 +2131,7 @@ Suma Aktywów apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 195 + 202 @@ -2131,7 +2139,7 @@ Siła Nabywcza apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 335 + 342 @@ -2139,7 +2147,7 @@ Wykluczone z Analizy apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 367 + 374 @@ -2147,7 +2155,7 @@ Pasywa (Zobowiązania Finansowe) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 398 + 405 apps/client/src/app/pages/features/features-page.html @@ -2159,7 +2167,7 @@ Wartość Netto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 418 + 425 @@ -2167,7 +2175,7 @@ Osiągi w Ujęciu Rocznym apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 433 + 440 @@ -2223,7 +2231,7 @@ Zgłoś Błąd Danych apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 476 @@ -2365,6 +2373,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 181 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 224 + Upgrade Plan @@ -2519,7 +2531,7 @@ Wpisz kod kuponu: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 203 + 197 @@ -2535,7 +2547,7 @@ Nie udało się zrealizować kodu kuponu apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 181 + 175 @@ -2551,7 +2563,7 @@ Kupon został zrealizowany apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 194 + 188 @@ -2569,9 +2581,13 @@ Try Premium Wypróbuj Premium + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 235 + apps/client/src/app/components/user-account-membership/user-account-membership.html - 58 + 61 @@ -2579,7 +2595,7 @@ Wykorzystaj kupon apps/client/src/app/components/user-account-membership/user-account-membership.html - 72 + 75 @@ -2591,7 +2607,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 221 @@ -2615,7 +2631,7 @@ Widok Prezentera apps/client/src/app/components/user-account-settings/user-account-settings.html - 226 + 232 @@ -2623,7 +2639,7 @@ Ochrona dla wrażliwych informacji takich jak wyniki i wartości ilościowe apps/client/src/app/components/user-account-settings/user-account-settings.html - 228 + 234 @@ -2631,7 +2647,7 @@ Waluta Bazowa apps/client/src/app/components/user-account-settings/user-account-settings.html - 13 + 14 @@ -2647,7 +2663,7 @@ Język apps/client/src/app/components/user-account-settings/user-account-settings.html - 61 + 67 @@ -2655,11 +2671,11 @@ Ustawienia Regionalne apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 669 + 668 apps/client/src/app/components/user-account-settings/user-account-settings.html - 156 + 162 @@ -2667,7 +2683,7 @@ Format daty i liczb apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 164 @@ -2675,15 +2691,15 @@ Close Account apps/client/src/app/components/user-account-settings/user-account-settings.html - 387 + 393 apps/client/src/app/components/user-account-settings/user-account-settings.html - 397 + 403 apps/client/src/app/components/user-account-settings/user-account-settings.html - 404 + 410 @@ -2691,7 +2707,7 @@ Wygląd (tryb) apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 207 @@ -2707,7 +2723,7 @@ Jasny apps/client/src/app/components/user-account-settings/user-account-settings.html - 216 + 222 @@ -2723,7 +2739,7 @@ Ciemny apps/client/src/app/components/user-account-settings/user-account-settings.html - 217 + 223 @@ -2731,7 +2747,7 @@ Tryb Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 244 + 250 apps/client/src/app/pages/features/features-page.html @@ -2743,7 +2759,7 @@ Doświadczenie bez zakłóceń w niespokojnych czasach apps/client/src/app/components/user-account-settings/user-account-settings.html - 246 + 252 @@ -2751,7 +2767,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 257 + 264 @@ -2767,7 +2783,7 @@ Uwierzytelnianie Biometryczne apps/client/src/app/components/user-account-settings/user-account-settings.html - 261 + 267 @@ -2775,7 +2791,7 @@ Logowanie za pomocą linii papilarnych apps/client/src/app/components/user-account-settings/user-account-settings.html - 263 + 269 @@ -2783,7 +2799,7 @@ Funkcje Eksperymentalne apps/client/src/app/components/user-account-settings/user-account-settings.html - 280 + 286 @@ -2791,7 +2807,7 @@ Podgląd nadchodzących funkcjonalności apps/client/src/app/components/user-account-settings/user-account-settings.html - 282 + 288 @@ -2803,7 +2819,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 316 + 322 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2815,7 +2831,7 @@ Eksportuj Dane apps/client/src/app/components/user-account-settings/user-account-settings.html - 331 + 337 @@ -2839,11 +2855,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 244 + 305 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 630 + 665 @@ -2859,11 +2875,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 242 + 303 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 628 + 663 @@ -2875,7 +2891,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 245 + 306 @@ -3351,7 +3367,7 @@ apps/client/src/app/pages/about/overview/about-overview-page.html - 193 + 194 apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts @@ -3411,7 +3427,7 @@ For security reasons, please delete all activities and accounts first before your Ghostfolio account can be closed. apps/client/src/app/components/user-account-settings/user-account-settings.html - 407 + 413 @@ -3563,7 +3579,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 233 apps/client/src/app/pages/public/public-page.html @@ -3894,14 +3910,6 @@ 132 - - 360° View - Widok 360° - - apps/client/src/app/pages/landing/landing-page.html - 142 - - Get the full picture of your personal finances across multiple platforms. Uzyskaj pełny obraz swoich finansów osobistych na wielu różnych platformach. @@ -3910,14 +3918,6 @@ 145 - - Web3 Ready - Gotowy na Web3 - - apps/client/src/app/pages/landing/landing-page.html - 153 - - Basic Materials Basic Materials @@ -4403,11 +4403,11 @@ thereof Dividend Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 178 + 185 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 306 + 313 @@ -4435,7 +4435,7 @@ Importuj Aktywności apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 124 + 162 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4451,7 +4451,7 @@ Impotruj Dywidendy apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 180 + 241 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4467,7 +4467,7 @@ Importowanie danych... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 223 + 284 @@ -4475,7 +4475,7 @@ Importowanie zakończone apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 234 + 295 @@ -4491,11 +4491,11 @@ Weryfikacja danych... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 369 + 404 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 429 + 464 @@ -4538,16 +4538,16 @@ Choose or drop a file here Wybierz lub przeciągnij plik tutaj - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 95 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 20 The following file formats are supported: Obsługiwane są następujące formaty plików: - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 102 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 26 @@ -4555,7 +4555,7 @@ Wybierz dywidendy apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 156 + 114 @@ -4563,7 +4563,7 @@ Wybór działań apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 158 + 116 @@ -4571,7 +4571,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 587 @@ -4579,11 +4579,11 @@ Wróc apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 222 + 180 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 260 + 218 @@ -4663,7 +4663,7 @@ The CSV file has more than rows of activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 404 + 439 @@ -4871,7 +4871,7 @@ Największe wzrosty apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 329 + 336 @@ -4879,7 +4879,7 @@ Największy spadek apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 382 + 389 @@ -4887,7 +4887,7 @@ Rozwój portfela apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 468 + 476 @@ -4895,7 +4895,7 @@ Oś czasu inwestycji apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 496 + 504 @@ -4903,7 +4903,7 @@ Obecna passa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 517 + 525 @@ -4911,7 +4911,7 @@ Najdłuższa passa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 526 + 534 @@ -4919,7 +4919,7 @@ Oś czasu dywidend apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 554 + 562 @@ -5171,7 +5171,7 @@ Powered by third-party AI providers apps/client/src/app/components/user-account-settings/user-account-settings.html - 300 + 306 @@ -5243,7 +5243,7 @@ Zaloguj z Google apps/client/src/app/pages/register/register-page.html - 41 + 42 @@ -5791,6 +5791,18 @@ 290 + + Return on Investment (total return with dividends) + Return on Investment (total return with dividends) + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 165 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 270 + + Add to Watchlist Add to Watchlist @@ -5856,7 +5868,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 507 + 514 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5916,7 +5928,7 @@ Konto apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 110 + 105 libs/common/src/lib/routes/routes.ts @@ -6028,15 +6040,15 @@ Fundusz Rezerwowy apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 272 + 279 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 350 + 357 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 452 + 459 apps/client/src/app/pages/features/features-page.html @@ -6222,6 +6234,10 @@ apps/client/src/app/components/admin-users/admin-users.html 247 + + apps/client/src/app/components/home-overview/home-overview.html + 110 + libs/ui/src/lib/accounts-table/accounts-table.component.html 339 @@ -6240,7 +6256,7 @@ Zaloguj się za pomocą OpenID Connect apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 57 + 58 @@ -6312,7 +6328,7 @@ Gotówka apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 304 + 311 @@ -6544,7 +6560,7 @@ Czy na pewno chcesz usunąć saldo tego konta? libs/ui/src/lib/account-balances/account-balances.component.ts - 134 + 127 @@ -6552,7 +6568,7 @@ Jeżeli brakuje jakiegoś tłumaczenia, uprzejmie prosimy o wsparcie w jego uzupełnieniu tutaj. apps/client/src/app/components/user-account-settings/user-account-settings.html - 64 + 70 @@ -6568,7 +6584,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 728 + 727 @@ -6604,7 +6620,7 @@ Ups! Nie udało się przyznać dostępu. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 320 + 316 @@ -6656,7 +6672,7 @@ Zamknij pozycję apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 464 + 463 @@ -6776,7 +6792,7 @@ Ups! Dostawca danych zmaga się teraz z drobnymi przeszkodami. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html - 8 + 9 @@ -6823,8 +6839,8 @@ Ghostfolio AI is processing the file... Ghostfolio AI is processing the file... - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 82 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 164 @@ -6840,7 +6856,7 @@ Gromadzenie Danych apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 751 + 750 apps/client/src/app/components/admin-overview/admin-overview.html @@ -7041,7 +7057,7 @@ Strefa Zagrożenia apps/client/src/app/components/user-account-settings/user-account-settings.html - 340 + 346 @@ -7049,7 +7065,7 @@ Zamknij Konto apps/client/src/app/components/user-account-settings/user-account-settings.html - 416 + 422 @@ -7097,7 +7113,7 @@ Derived from the portfolio you are viewing apps/client/src/app/components/user-account-settings/user-account-settings.html - 27 + 28 @@ -7153,7 +7169,7 @@ The content of your file will be processed by third-party AI providers. Please remove any personal data before uploading. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 126 + 165 @@ -7197,47 +7213,47 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 96 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 129 apps/client/src/app/components/user-account-settings/user-account-settings.html - 128 + 134 apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 138 apps/client/src/app/components/user-account-settings/user-account-settings.html - 136 + 142 apps/client/src/app/components/user-account-settings/user-account-settings.html - 140 + 146 apps/client/src/app/components/user-account-settings/user-account-settings.html - 146 + 152 apps/client/src/app/pages/features/features-page.html @@ -7413,7 +7429,7 @@ Ups! Nie udało się zaktualizować dostępu. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 420 + 416 @@ -7433,7 +7449,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 756 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7489,7 +7505,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 287 + 294 @@ -7497,7 +7513,7 @@ Zamknij apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 758 + 757 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7525,7 +7541,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 150 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -7785,7 +7801,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 601 + 600 @@ -8011,7 +8027,7 @@ Nie udało się wygenerować klucza API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 142 + 136 @@ -8019,7 +8035,7 @@ Ustaw ten klucz API w samodzielnie hostowanym środowisku: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 151 @@ -8035,7 +8051,7 @@ Klucz API dostawcy danych Premium Ghostfolio apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 158 + 152 @@ -8043,7 +8059,7 @@ Czy na pewno chcesz wygenerować nowy klucz API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 163 + 157 @@ -8067,7 +8083,7 @@ AI-assisted import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 136 + 94 @@ -8091,7 +8107,7 @@ Zapisz apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 767 + 766 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -8146,6 +8162,14 @@ 210 + + All in One Place + All in One Place + + apps/client/src/app/pages/landing/landing-page.html + 142 + + Received Access Otrzymany dostęp @@ -8223,7 +8247,7 @@ Domyślna cena rynkowa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 642 + 641 @@ -8231,7 +8255,7 @@ Tryb apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 678 + 677 @@ -8247,7 +8271,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 694 + 693 @@ -8255,7 +8279,7 @@ Nagłówki żądań HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 655 + 654 @@ -8327,7 +8351,7 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 69 + 73 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -8407,7 +8431,7 @@ Performance Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 440 + 447 @@ -8572,7 +8596,7 @@ Obliczanie wydajności apps/client/src/app/components/user-account-settings/user-account-settings.html - 36 + 37 @@ -8669,7 +8693,7 @@ {VAR_PLURAL, plural, =1 {Ghostfolio AI could not match 1 activity of the file } other {Ghostfolio AI could not match activities of the file }} apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 172 + 130 @@ -8918,6 +8942,14 @@ 307 + + Privacy First + Privacy First + + apps/client/src/app/pages/landing/landing-page.html + 153 + + Available Dostępny @@ -9152,7 +9184,7 @@ Zarządzaj profilem aktywów apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 492 + 491 @@ -9268,11 +9300,11 @@ Return on Average Investment (total return with dividends) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 159 + 157 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 264 + 262 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 7622069132..47aa899385 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -510,7 +510,7 @@ Ghostfolio AI has processed the maximum of activities. The file can have more activities. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 193 + 151 @@ -538,7 +538,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 518 @@ -578,11 +578,11 @@ Data apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 528 + 527 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 564 + 563 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -653,6 +653,14 @@ 71 + + Request a free trial + Request a free trial + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 211 + + Historical Data Dados Históricos @@ -678,7 +686,7 @@ The file is larger than MB apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 396 + 431 @@ -810,7 +818,7 @@ Adicionar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 619 + 618 apps/client/src/app/components/admin-overview/admin-overview.html @@ -866,7 +874,7 @@ No auto-renewal on membership. apps/client/src/app/components/user-account-membership/user-account-membership.html - 79 + 82 @@ -982,7 +990,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 81 + 82 libs/common/src/lib/routes/routes.ts @@ -1005,6 +1013,14 @@ 297 + + No credit card required. The trial ends automatically. + No credit card required. The trial ends automatically. + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 214 + + Manage Activities Gerir Atividades @@ -1018,7 +1034,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 530 + 529 @@ -1082,7 +1098,7 @@ Valor Total libs/ui/src/lib/investment-chart/investment-chart.component.ts - 166 + 182 @@ -1098,7 +1114,7 @@ Taxa de Poupança libs/ui/src/lib/investment-chart/investment-chart.component.ts - 215 + 232 @@ -1118,7 +1134,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 356 + 362 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -1160,14 +1176,6 @@ apps/client/src/app/pages/landing/landing-page.html 352 - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 112 - - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 121 - apps/client/src/app/pages/pricing/pricing-page.html 336 @@ -1186,7 +1194,7 @@ Iniciar sessão com Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 46 + 47 @@ -1202,7 +1210,7 @@ Manter sessão iniciada apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 69 @@ -1254,7 +1262,7 @@ Ativos Totais apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 195 + 202 @@ -1262,7 +1270,7 @@ Poder de Compra apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 335 + 342 @@ -1270,7 +1278,7 @@ Excluído da Análise apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 367 + 374 @@ -1278,7 +1286,7 @@ Valor Líquido apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 418 + 425 @@ -1286,7 +1294,7 @@ Desempenho Anual apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 433 + 440 @@ -1434,7 +1442,7 @@ Dados do Relatório com Problema apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 476 @@ -1570,11 +1578,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 244 + 305 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 630 + 665 @@ -1590,11 +1598,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 242 + 303 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 628 + 663 @@ -1606,7 +1614,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 245 + 306 @@ -1670,7 +1678,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 221 @@ -1678,7 +1686,7 @@ Por favor, insira o seu código de cupão: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 203 + 197 @@ -1694,7 +1702,7 @@ Não foi possível resgatar o código de cupão apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 181 + 175 @@ -1710,7 +1718,7 @@ Código de cupão foi resgatado apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 194 + 188 @@ -1736,9 +1744,13 @@ Try Premium Experimentar Premium + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 235 + apps/client/src/app/components/user-account-membership/user-account-membership.html - 58 + 61 @@ -1746,7 +1758,7 @@ Resgatar Cupão apps/client/src/app/components/user-account-membership/user-account-membership.html - 72 + 75 @@ -1762,7 +1774,7 @@ Vista do Apresentador apps/client/src/app/components/user-account-settings/user-account-settings.html - 226 + 232 @@ -1770,7 +1782,7 @@ Moeda Base apps/client/src/app/components/user-account-settings/user-account-settings.html - 13 + 14 @@ -1786,7 +1798,7 @@ Língua apps/client/src/app/components/user-account-settings/user-account-settings.html - 61 + 67 @@ -1806,11 +1818,11 @@ Localidade apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 669 + 668 apps/client/src/app/components/user-account-settings/user-account-settings.html - 156 + 162 @@ -1818,7 +1830,7 @@ Formato de números e datas apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 164 @@ -1826,7 +1838,7 @@ Modo Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 244 + 250 apps/client/src/app/pages/features/features-page.html @@ -1838,15 +1850,15 @@ Close Account apps/client/src/app/components/user-account-settings/user-account-settings.html - 387 + 393 apps/client/src/app/components/user-account-settings/user-account-settings.html - 397 + 403 apps/client/src/app/components/user-account-settings/user-account-settings.html - 404 + 410 @@ -1854,7 +1866,7 @@ Aparência apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 207 @@ -1870,7 +1882,7 @@ Claro apps/client/src/app/components/user-account-settings/user-account-settings.html - 216 + 222 @@ -1886,7 +1898,7 @@ Escuro apps/client/src/app/components/user-account-settings/user-account-settings.html - 217 + 223 @@ -1894,7 +1906,7 @@ Iniciar sessão com impressão digital apps/client/src/app/components/user-account-settings/user-account-settings.html - 263 + 269 @@ -1902,7 +1914,7 @@ Funcionalidades Experimentais apps/client/src/app/components/user-account-settings/user-account-settings.html - 280 + 286 @@ -1914,7 +1926,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 316 + 322 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2202,7 +2214,7 @@ apps/client/src/app/pages/about/overview/about-overview-page.html - 193 + 194 apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts @@ -2490,7 +2502,7 @@ A importar dados... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 223 + 284 @@ -2498,7 +2510,7 @@ A importação foi concluída apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 234 + 295 @@ -2513,8 +2525,8 @@ The following file formats are supported: Os seguintes formatos de ficheiro são suportados: - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 102 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 26 @@ -2522,11 +2534,11 @@ Anterior apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 222 + 180 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 260 + 218 @@ -2606,7 +2618,7 @@ The CSV file has more than rows of activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 404 + 439 @@ -2730,7 +2742,7 @@ Topo apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 329 + 336 @@ -2738,7 +2750,7 @@ Fundo apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 382 + 389 @@ -2746,7 +2758,7 @@ Evolução do Portefólio apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 468 + 476 @@ -2754,7 +2766,7 @@ Cronograma de Investimento apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 496 + 504 @@ -2790,7 +2802,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 233 apps/client/src/app/pages/public/public-page.html @@ -2954,7 +2966,7 @@ Continuar com Google apps/client/src/app/pages/register/register-page.html - 41 + 42 @@ -3034,7 +3046,7 @@ Importar Atividades apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 124 + 162 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3154,7 +3166,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 507 + 514 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -3178,7 +3190,7 @@ Conta apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 110 + 105 libs/common/src/lib/routes/routes.ts @@ -3230,15 +3242,15 @@ Fundo de Emergência apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 272 + 279 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 350 + 357 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 452 + 459 apps/client/src/app/pages/features/features-page.html @@ -3318,7 +3330,7 @@ Dinheiro apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 304 + 311 @@ -3562,11 +3574,11 @@ A validar dados... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 369 + 404 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 429 + 464 @@ -3574,11 +3586,11 @@ Importar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 231 + 189 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 268 + 226 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -3634,7 +3646,7 @@ Cronograma de Dividendos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 554 + 562 @@ -3698,7 +3710,7 @@ Importar Dividendos apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 180 + 241 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3790,7 +3802,7 @@ Proteção para informações sensíveis, como desempenhos absolutos e valores quantitativos apps/client/src/app/components/user-account-settings/user-account-settings.html - 228 + 234 @@ -3798,7 +3810,7 @@ Experiência sem distrações para tempos turbulentos apps/client/src/app/components/user-account-settings/user-account-settings.html - 246 + 252 @@ -3806,7 +3818,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 257 + 264 @@ -3814,7 +3826,7 @@ Acesso antecipado a funcionalidades futuras apps/client/src/app/components/user-account-settings/user-account-settings.html - 282 + 288 @@ -3908,6 +3920,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 181 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 224 + Upgrade Plan @@ -4062,7 +4078,7 @@ Powered by third-party AI providers apps/client/src/app/components/user-account-settings/user-account-settings.html - 300 + 306 @@ -4169,6 +4185,18 @@ 19 + + Return on Investment (total return with dividends) + Return on Investment (total return with dividends) + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 165 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 270 + + Add to Watchlist Add to Watchlist @@ -4326,7 +4354,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 710 + 709 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4358,7 +4386,7 @@ Deseja mesmo eliminar esta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 131 + 133 @@ -4374,11 +4402,11 @@ thereof Dividend Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 178 + 185 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 306 + 313 @@ -4474,7 +4502,7 @@ Selecionar Dividendos apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 156 + 114 @@ -4482,7 +4510,7 @@ Selecionar Atividades apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 158 + 116 @@ -4490,7 +4518,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 587 @@ -4514,7 +4542,7 @@ Série Atual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 517 + 525 @@ -4522,7 +4550,7 @@ Série mais Longa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 526 + 534 @@ -4564,6 +4592,10 @@ apps/client/src/app/components/admin-users/admin-users.html 247 + + apps/client/src/app/components/home-overview/home-overview.html + 110 + libs/ui/src/lib/accounts-table/accounts-table.component.html 339 @@ -4574,7 +4606,7 @@ Responsabilidades apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 398 + 405 apps/client/src/app/pages/features/features-page.html @@ -4626,7 +4658,7 @@ For security reasons, please delete all activities and accounts first before your Ghostfolio account can be closed. apps/client/src/app/components/user-account-settings/user-account-settings.html - 407 + 413 @@ -4770,7 +4802,7 @@ Configuração do raspador apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 631 @@ -5014,7 +5046,7 @@ Sign in with OpenID Connect apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 57 + 58 @@ -5194,7 +5226,7 @@ Autenticação biométrica apps/client/src/app/components/user-account-settings/user-account-settings.html - 261 + 267 @@ -5286,7 +5318,7 @@ Exportar dados apps/client/src/app/components/user-account-settings/user-account-settings.html - 331 + 337 @@ -5429,22 +5461,6 @@ 132 - - 360° View - 360° visualizar - - apps/client/src/app/pages/landing/landing-page.html - 142 - - - - Web3 Ready - Web3 Preparar - - apps/client/src/app/pages/landing/landing-page.html - 153 - - Basic Materials Basic Materials @@ -6051,8 +6067,8 @@ Choose or drop a file here Selecione ou solte um arquivo aqui - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 95 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 20 @@ -6476,7 +6492,7 @@ Ops! Não foi possível analisar os dados históricos. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 287 + 285 @@ -6544,7 +6560,7 @@ Você realmente deseja excluir o saldo desta conta? libs/ui/src/lib/account-balances/account-balances.component.ts - 134 + 127 @@ -6552,7 +6568,7 @@ Se faltar uma tradução, por favor, ajude-nos a estendê-la here. apps/client/src/app/components/user-account-settings/user-account-settings.html - 64 + 70 @@ -6568,7 +6584,7 @@ Teste apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 728 + 727 @@ -6604,7 +6620,7 @@ Ops! Não foi possível conceder acesso. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 320 + 316 @@ -6656,7 +6672,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 464 + 463 @@ -6776,7 +6792,7 @@ Ops! Um provedor de dados está enfrentando problemas. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html - 8 + 9 @@ -6823,8 +6839,8 @@ Ghostfolio AI is processing the file... Ghostfolio AI is processing the file... - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 82 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 164 @@ -6840,7 +6856,7 @@ Coleta de dados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 751 + 750 apps/client/src/app/components/admin-overview/admin-overview.html @@ -7041,7 +7057,7 @@ Zona de perigo apps/client/src/app/components/user-account-settings/user-account-settings.html - 340 + 346 @@ -7049,7 +7065,7 @@ Fechar conta apps/client/src/app/components/user-account-settings/user-account-settings.html - 416 + 422 @@ -7097,7 +7113,7 @@ Derived from the portfolio you are viewing apps/client/src/app/components/user-account-settings/user-account-settings.html - 27 + 28 @@ -7153,7 +7169,7 @@ The content of your file will be processed by third-party AI providers. Please remove any personal data before uploading. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 126 + 165 @@ -7197,47 +7213,47 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 96 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 129 apps/client/src/app/components/user-account-settings/user-account-settings.html - 128 + 134 apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 138 apps/client/src/app/components/user-account-settings/user-account-settings.html - 136 + 142 apps/client/src/app/components/user-account-settings/user-account-settings.html - 140 + 146 apps/client/src/app/components/user-account-settings/user-account-settings.html - 146 + 152 apps/client/src/app/pages/features/features-page.html @@ -7413,7 +7429,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 420 + 416 @@ -7433,7 +7449,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 756 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7489,7 +7505,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 287 + 294 @@ -7497,7 +7513,7 @@ Fechar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 758 + 757 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7525,7 +7541,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 150 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -7785,7 +7801,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 601 + 600 @@ -8011,7 +8027,7 @@ Não foi possível gerar uma chave de API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 142 + 136 @@ -8019,7 +8035,7 @@ Defina esta chave de API no seu ambiente auto-hospedado: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 151 @@ -8035,7 +8051,7 @@ Chave de API do Provedor de Dados do Ghostfolio Premium apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 158 + 152 @@ -8043,7 +8059,7 @@ Você realmente deseja gerar uma nova chave de API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 163 + 157 @@ -8067,7 +8083,7 @@ AI-assisted import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 136 + 94 @@ -8091,7 +8107,7 @@ Guardar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 767 + 766 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -8146,6 +8162,14 @@ 210 + + All in One Place + All in One Place + + apps/client/src/app/pages/landing/landing-page.html + 142 + + Received Access Received Access @@ -8223,7 +8247,7 @@ Preço de mercado padrão apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 642 + 641 @@ -8231,7 +8255,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 678 + 677 @@ -8247,7 +8271,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 694 + 693 @@ -8255,7 +8279,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 655 + 654 @@ -8327,7 +8351,7 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 69 + 73 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -8407,7 +8431,7 @@ Performance Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 440 + 447 @@ -8572,7 +8596,7 @@ Performance Calculation apps/client/src/app/components/user-account-settings/user-account-settings.html - 36 + 37 @@ -8669,7 +8693,7 @@ {VAR_PLURAL, plural, =1 {Ghostfolio AI could not match 1 activity of the file } other {Ghostfolio AI could not match activities of the file }} apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 172 + 130 @@ -8918,6 +8942,14 @@ 307 + + Privacy First + Privacy First + + apps/client/src/app/pages/landing/landing-page.html + 153 + + Available Available @@ -9152,7 +9184,7 @@ Gerenciar perfil de ativos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 492 + 491 @@ -9268,11 +9300,11 @@ Return on Average Investment (total return with dividends) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 159 + 157 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 264 + 262 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index bc4d6e251b..4644006f44 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -691,7 +691,7 @@ Ghostfolio AI has processed the maximum of activities. The file can have more activities. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 193 + 151 @@ -719,7 +719,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 518 @@ -759,11 +759,11 @@ Tarih apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 528 + 527 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 564 + 563 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -878,6 +878,14 @@ 71 + + Request a free trial + Request a free trial + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 211 + + Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. @@ -951,7 +959,7 @@ The file is larger than MB apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 396 + 431 @@ -1107,7 +1115,7 @@ Veri Toplayıcı Yapılandırması apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 631 @@ -1291,7 +1299,7 @@ Ekle apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 619 + 618 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1335,7 +1343,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 710 + 709 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1367,7 +1375,7 @@ Bu platformu silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 131 + 133 @@ -1455,7 +1463,7 @@ No auto-renewal on membership. apps/client/src/app/components/user-account-membership/user-account-membership.html - 79 + 82 @@ -1587,7 +1595,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 81 + 82 libs/common/src/lib/routes/routes.ts @@ -1610,6 +1618,14 @@ 297 + + No credit card required. The trial ends automatically. + No credit card required. The trial ends automatically. + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 214 + + Manage Activities İşlemleri Yönet @@ -1623,7 +1639,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 530 + 529 @@ -1779,7 +1795,7 @@ Toplam Tutar libs/ui/src/lib/investment-chart/investment-chart.component.ts - 166 + 182 @@ -1795,7 +1811,7 @@ Tasarruf Oranı libs/ui/src/lib/investment-chart/investment-chart.component.ts - 215 + 232 @@ -1815,7 +1831,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 356 + 362 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -1857,14 +1873,6 @@ apps/client/src/app/pages/landing/landing-page.html 352 - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 112 - - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 121 - apps/client/src/app/pages/pricing/pricing-page.html 336 @@ -1883,7 +1891,7 @@ Google ile Oturum Aç apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 46 + 47 @@ -1899,7 +1907,7 @@ Oturumu açık tut apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 69 @@ -1951,7 +1959,7 @@ Toplam Varlıklar apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 195 + 202 @@ -1959,7 +1967,7 @@ Alım Limiti apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 335 + 342 @@ -1967,7 +1975,7 @@ Analize Dahil Edilmemiştir. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 367 + 374 @@ -1975,7 +1983,7 @@ Yükümlülükler apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 398 + 405 apps/client/src/app/pages/features/features-page.html @@ -1987,7 +1995,7 @@ Toplam Varlık apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 418 + 425 @@ -1995,7 +2003,7 @@ Yıllıklandırılmış Performans apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 433 + 440 @@ -2063,7 +2071,7 @@ Rapor Veri Sorunu apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 476 @@ -2205,6 +2213,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 181 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 224 + Upgrade Plan @@ -2331,11 +2343,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 244 + 305 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 630 + 665 @@ -2351,11 +2363,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 242 + 303 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 628 + 663 @@ -2367,7 +2379,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 245 + 306 @@ -2811,7 +2823,7 @@ apps/client/src/app/pages/about/overview/about-overview-page.html - 193 + 194 apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts @@ -2871,7 +2883,7 @@ For security reasons, please delete all activities and accounts first before your Ghostfolio account can be closed. apps/client/src/app/components/user-account-settings/user-account-settings.html - 407 + 413 @@ -2927,7 +2939,7 @@ Zen Modu apps/client/src/app/components/user-account-settings/user-account-settings.html - 244 + 250 apps/client/src/app/pages/features/features-page.html @@ -3035,7 +3047,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 233 apps/client/src/app/pages/public/public-page.html @@ -3206,14 +3218,6 @@ 132 - - 360° View - 360° Görünüm - - apps/client/src/app/pages/landing/landing-page.html - 142 - - Get the full picture of your personal finances across multiple platforms. Kişisel finansınızın tam resmini birden fazla platformda edinin. @@ -3222,14 +3226,6 @@ 145 - - Web3 Ready - Web3 Hazır - - apps/client/src/app/pages/landing/landing-page.html - 153 - - Basic Materials Temel Malzemeler @@ -3623,11 +3619,11 @@ thereof Dividend Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 178 + 185 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 306 + 313 @@ -3655,7 +3651,7 @@ İşlemleri İçe Aktar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 124 + 162 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3671,7 +3667,7 @@ Temettüleri İçe Aktar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 180 + 241 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3687,7 +3683,7 @@ Veri içe aktarılıyor... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 223 + 284 @@ -3695,7 +3691,7 @@ İçe aktarma tamamlandı apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 234 + 295 @@ -3711,11 +3707,11 @@ Veri doğrulanıyor... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 369 + 404 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 429 + 464 @@ -3758,8 +3754,8 @@ The following file formats are supported: Aşağıdaki dosya formatları desteklenmektedir: - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 102 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 26 @@ -3767,7 +3763,7 @@ Temettü Seç apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 156 + 114 @@ -3775,7 +3771,7 @@ İşlemleri Seç apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 158 + 116 @@ -3783,7 +3779,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 587 @@ -3791,11 +3787,11 @@ Geri apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 222 + 180 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 260 + 218 @@ -3819,11 +3815,11 @@ İçe Aktar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 231 + 189 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 268 + 226 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -3891,7 +3887,7 @@ The CSV file has more than rows of activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 404 + 439 @@ -4099,7 +4095,7 @@ Üst apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 329 + 336 @@ -4107,7 +4103,7 @@ Alt apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 382 + 389 @@ -4115,7 +4111,7 @@ Portföyün Gelişimi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 468 + 476 @@ -4123,7 +4119,7 @@ Yatırım Zaman Çizelgesi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 496 + 504 @@ -4131,7 +4127,7 @@ Güncel Seri apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 517 + 525 @@ -4139,7 +4135,7 @@ En Uzun Seri apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 526 + 534 @@ -4147,7 +4143,7 @@ Temettü Zaman Çizelgesi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 554 + 562 @@ -4399,7 +4395,7 @@ Powered by third-party AI providers apps/client/src/app/components/user-account-settings/user-account-settings.html - 300 + 306 @@ -4491,7 +4487,7 @@ Google ile Devam Et apps/client/src/app/pages/register/register-page.html - 41 + 42 @@ -4904,7 +4900,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 221 @@ -4912,7 +4908,7 @@ Lütfen kupon kodunuzu girin: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 203 + 197 @@ -4928,7 +4924,7 @@ Kupon kodu kullanılamadı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 181 + 175 @@ -4944,7 +4940,7 @@ Kupon kodu kullanıldı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 194 + 188 @@ -4982,9 +4978,13 @@ Try Premium Premium’u Deneyin + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 235 + apps/client/src/app/components/user-account-membership/user-account-membership.html - 58 + 61 @@ -4992,7 +4992,7 @@ Kupon Kullan apps/client/src/app/components/user-account-membership/user-account-membership.html - 72 + 75 @@ -5008,7 +5008,7 @@ Sunum Görünümü apps/client/src/app/components/user-account-settings/user-account-settings.html - 226 + 232 @@ -5016,7 +5016,7 @@ Gerçek performans ve miktar değerleri gibi hassas bilgilerin saklanması için apps/client/src/app/components/user-account-settings/user-account-settings.html - 228 + 234 @@ -5024,7 +5024,7 @@ Temel Para Birimi apps/client/src/app/components/user-account-settings/user-account-settings.html - 13 + 14 @@ -5040,7 +5040,7 @@ Dil apps/client/src/app/components/user-account-settings/user-account-settings.html - 61 + 67 @@ -5048,11 +5048,11 @@ Yerel Ayarlar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 669 + 668 apps/client/src/app/components/user-account-settings/user-account-settings.html - 156 + 162 @@ -5060,7 +5060,7 @@ Tarih ve Sayı Formatları apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 164 @@ -5068,15 +5068,15 @@ Close Account apps/client/src/app/components/user-account-settings/user-account-settings.html - 387 + 393 apps/client/src/app/components/user-account-settings/user-account-settings.html - 397 + 403 apps/client/src/app/components/user-account-settings/user-account-settings.html - 404 + 410 @@ -5084,7 +5084,7 @@ Görünüm apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 207 @@ -5100,7 +5100,7 @@ Açık apps/client/src/app/components/user-account-settings/user-account-settings.html - 216 + 222 @@ -5116,7 +5116,7 @@ Koyu apps/client/src/app/components/user-account-settings/user-account-settings.html - 217 + 223 @@ -5124,7 +5124,7 @@ Çalkantılı zamanlar için dikkat dağıtmayan bir deneyim apps/client/src/app/components/user-account-settings/user-account-settings.html - 246 + 252 @@ -5132,7 +5132,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 257 + 264 @@ -5148,7 +5148,7 @@ Biyometrik Kimlik Doğrulama apps/client/src/app/components/user-account-settings/user-account-settings.html - 261 + 267 @@ -5156,7 +5156,7 @@ Parmak iziyle oturum aç apps/client/src/app/components/user-account-settings/user-account-settings.html - 263 + 269 @@ -5164,7 +5164,7 @@ Deneysel Özellikler apps/client/src/app/components/user-account-settings/user-account-settings.html - 280 + 286 @@ -5172,7 +5172,7 @@ Gelecek özelliklere göz atın apps/client/src/app/components/user-account-settings/user-account-settings.html - 282 + 288 @@ -5184,7 +5184,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 316 + 322 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -5196,7 +5196,7 @@ Verileri Dışa Aktar apps/client/src/app/components/user-account-settings/user-account-settings.html - 331 + 337 @@ -5327,6 +5327,18 @@ 290 + + Return on Investment (total return with dividends) + Return on Investment (total return with dividends) + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 165 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 270 + + Add to Watchlist Add to Watchlist @@ -5392,7 +5404,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 507 + 514 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5452,7 +5464,7 @@ Hesap apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 110 + 105 libs/common/src/lib/routes/routes.ts @@ -5564,15 +5576,15 @@ Acil Durum Fonu apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 272 + 279 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 350 + 357 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 452 + 459 apps/client/src/app/pages/features/features-page.html @@ -5758,6 +5770,10 @@ apps/client/src/app/components/admin-users/admin-users.html 247 + + apps/client/src/app/components/home-overview/home-overview.html + 110 + libs/ui/src/lib/accounts-table/accounts-table.component.html 339 @@ -5776,7 +5792,7 @@ Sign in with OpenID Connect apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 57 + 58 @@ -5832,7 +5848,7 @@ Nakit apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 304 + 311 @@ -6083,8 +6099,8 @@ Choose or drop a file here Dosya seçin ya da sürükleyin - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 95 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 20 @@ -6476,7 +6492,7 @@ Hay Allah! Geçmiş veriler ayrıştırılamadı. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 287 + 285 @@ -6544,7 +6560,7 @@ Bu nakit bakiyesini silmeyi gerçekten istiyor musunuz? libs/ui/src/lib/account-balances/account-balances.component.ts - 134 + 127 @@ -6552,7 +6568,7 @@ Eğer bir çeviri eksikse, lütfen bunu genişletmemize yardımcı olun burada. apps/client/src/app/components/user-account-settings/user-account-settings.html - 64 + 70 @@ -6568,7 +6584,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 728 + 727 @@ -6604,7 +6620,7 @@ Hay Allah! Erişim izni verilemedi. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 320 + 316 @@ -6656,7 +6672,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 464 + 463 @@ -6776,7 +6792,7 @@ Oops! Bir veri sağlayıcısı aksaklık yaşıyor. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html - 8 + 9 @@ -6823,8 +6839,8 @@ Ghostfolio AI is processing the file... Ghostfolio AI is processing the file... - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 82 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 164 @@ -6840,7 +6856,7 @@ Veri Toplama apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 751 + 750 apps/client/src/app/components/admin-overview/admin-overview.html @@ -7041,7 +7057,7 @@ Tehlikeli Alan apps/client/src/app/components/user-account-settings/user-account-settings.html - 340 + 346 @@ -7049,7 +7065,7 @@ Hesabı Kapat apps/client/src/app/components/user-account-settings/user-account-settings.html - 416 + 422 @@ -7097,7 +7113,7 @@ Derived from the portfolio you are viewing apps/client/src/app/components/user-account-settings/user-account-settings.html - 27 + 28 @@ -7153,7 +7169,7 @@ The content of your file will be processed by third-party AI providers. Please remove any personal data before uploading. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 126 + 165 @@ -7197,47 +7213,47 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 96 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 129 apps/client/src/app/components/user-account-settings/user-account-settings.html - 128 + 134 apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 138 apps/client/src/app/components/user-account-settings/user-account-settings.html - 136 + 142 apps/client/src/app/components/user-account-settings/user-account-settings.html - 140 + 146 apps/client/src/app/components/user-account-settings/user-account-settings.html - 146 + 152 apps/client/src/app/pages/features/features-page.html @@ -7413,7 +7429,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 420 + 416 @@ -7433,7 +7449,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 756 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7489,7 +7505,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 287 + 294 @@ -7497,7 +7513,7 @@ Kapat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 758 + 757 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7525,7 +7541,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 150 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -7785,7 +7801,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 601 + 600 @@ -8011,7 +8027,7 @@ API anahtarı oluşturulamadı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 142 + 136 @@ -8019,7 +8035,7 @@ Bu API anahtarını kendi barındırılan ortamınıza ayarlayın: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 151 @@ -8035,7 +8051,7 @@ Ghostfolio Premium Veri Sağlayıcı API Anahtarı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 158 + 152 @@ -8043,7 +8059,7 @@ Yeni bir API anahtarı oluşturmak istediğinize emin misiniz? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 163 + 157 @@ -8067,7 +8083,7 @@ AI-assisted import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 136 + 94 @@ -8091,7 +8107,7 @@ Kaydet apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 767 + 766 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -8146,6 +8162,14 @@ 210 + + All in One Place + All in One Place + + apps/client/src/app/pages/landing/landing-page.html + 142 + + Received Access Alınan Erişim @@ -8223,7 +8247,7 @@ Varsayılan Piyasa Fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 642 + 641 @@ -8231,7 +8255,7 @@ Mod apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 678 + 677 @@ -8247,7 +8271,7 @@ Seçici apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 694 + 693 @@ -8255,7 +8279,7 @@ HTTP İstek Başlıkları apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 655 + 654 @@ -8327,7 +8351,7 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 69 + 73 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -8407,7 +8431,7 @@ Performance Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 440 + 447 @@ -8572,7 +8596,7 @@ Performans Hesaplaması apps/client/src/app/components/user-account-settings/user-account-settings.html - 36 + 37 @@ -8669,7 +8693,7 @@ {VAR_PLURAL, plural, =1 {Ghostfolio AI could not match 1 activity of the file } other {Ghostfolio AI could not match activities of the file }} apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 172 + 130 @@ -8918,6 +8942,14 @@ 307 + + Privacy First + Privacy First + + apps/client/src/app/pages/landing/landing-page.html + 153 + + Available Mevcut @@ -9152,7 +9184,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 492 + 491 @@ -9268,11 +9300,11 @@ Return on Average Investment (total return with dividends) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 159 + 157 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 264 + 262 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 2a956d5469..342eec459c 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -50,7 +50,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 81 + 82 libs/common/src/lib/routes/routes.ts @@ -775,7 +775,7 @@ Ghostfolio AI has processed the maximum of activities. The file can have more activities. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 193 + 151 @@ -911,7 +911,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 518 @@ -1042,6 +1042,14 @@ 71 + + Request a free trial + Request a free trial + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 211 + + Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. @@ -1115,7 +1123,7 @@ The file is larger than MB apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 396 + 431 @@ -1315,7 +1323,7 @@ Конфігурація скребка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 631 @@ -1323,7 +1331,7 @@ Тест apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 728 + 727 @@ -1335,7 +1343,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 710 + 709 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1543,7 +1551,7 @@ Збір даних apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 751 + 750 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1595,7 +1603,7 @@ Додати apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 619 + 618 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1635,7 +1643,7 @@ Ви дійсно хочете видалити цю платформу? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 131 + 133 @@ -1817,14 +1825,6 @@ apps/client/src/app/pages/landing/landing-page.html 352 - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 112 - - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 121 - apps/client/src/app/pages/pricing/pricing-page.html 336 @@ -1867,7 +1867,7 @@ Автоматичне поновлення підписки вимкнено. apps/client/src/app/components/user-account-membership/user-account-membership.html - 79 + 82 @@ -2191,7 +2191,7 @@ Повідомити про збій даних apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 476 @@ -2226,6 +2226,14 @@ 90 + + No credit card required. The trial ends automatically. + No credit card required. The trial ends automatically. + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 214 + + Manage Activities Керування діяльністю @@ -2239,7 +2247,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 530 + 529 @@ -2395,7 +2403,7 @@ Загальна сума libs/ui/src/lib/investment-chart/investment-chart.component.ts - 166 + 182 @@ -2411,7 +2419,7 @@ Ставка заощаджень libs/ui/src/lib/investment-chart/investment-chart.component.ts - 215 + 232 @@ -2431,7 +2439,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 356 + 362 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -2447,7 +2455,7 @@ Увійти з Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 46 + 47 @@ -2463,7 +2471,7 @@ Залишатися в системі apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 69 @@ -2471,7 +2479,7 @@ Упс! У постачальника даних виникають проблеми. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html - 8 + 9 @@ -2539,7 +2547,7 @@ Загальні активи apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 195 + 202 @@ -2547,7 +2555,7 @@ Купівельна спроможність apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 335 + 342 @@ -2555,7 +2563,7 @@ Виключено з аналізу apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 367 + 374 @@ -2563,7 +2571,7 @@ Зобов’язання apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 398 + 405 apps/client/src/app/pages/features/features-page.html @@ -2575,7 +2583,7 @@ Чиста вартість apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 418 + 425 @@ -2583,7 +2591,7 @@ Річна доходність apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 433 + 440 @@ -2591,7 +2599,7 @@ Зберегти apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 767 + 766 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2703,7 +2711,7 @@ Упс! Не вдалося оновити права доступу. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 420 + 416 @@ -2845,6 +2853,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 181 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 224 + Investment Research @@ -2943,7 +2955,7 @@ Упс! Не вдалося надати доступ. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 320 + 316 @@ -2999,7 +3011,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 316 + 322 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -3018,6 +3030,14 @@ 210 + + All in One Place + All in One Place + + apps/client/src/app/pages/landing/landing-page.html + 142 + + Received Access Отриманий доступ @@ -3047,7 +3067,7 @@ Не вдалося згенерувати ключ API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 142 + 136 @@ -3059,7 +3079,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 245 + 306 @@ -3067,7 +3087,7 @@ Встановіть цей ключ API у вашому self-hosted середовищі: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 151 @@ -3083,7 +3103,7 @@ Ключ API Ghostfolio Premium Data Provider apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 158 + 152 @@ -3091,7 +3111,7 @@ Ви дійсно хочете згенерувати новий ключ API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 163 + 157 @@ -3099,7 +3119,7 @@ Не вдалося обміняти код купона apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 181 + 175 @@ -3115,7 +3135,7 @@ Код купона був обміняний apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 194 + 188 @@ -3123,7 +3143,7 @@ Будь ласка, введіть ваш код купона. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 203 + 197 @@ -3149,9 +3169,13 @@ Try Premium Спробуйте Premium + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 235 + apps/client/src/app/components/user-account-membership/user-account-membership.html - 58 + 61 @@ -3159,7 +3183,7 @@ Обміняти купон apps/client/src/app/components/user-account-membership/user-account-membership.html - 72 + 75 @@ -3171,7 +3195,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 221 @@ -3219,7 +3243,7 @@ Derived from the portfolio you are viewing apps/client/src/app/components/user-account-settings/user-account-settings.html - 27 + 28 @@ -3243,7 +3267,7 @@ Режим доповідача apps/client/src/app/components/user-account-settings/user-account-settings.html - 226 + 232 @@ -3251,7 +3275,7 @@ Захист конфіденційної інформації, такої як абсолютні показники та кількісні значення apps/client/src/app/components/user-account-settings/user-account-settings.html - 228 + 234 @@ -3259,7 +3283,7 @@ Базова валюта apps/client/src/app/components/user-account-settings/user-account-settings.html - 13 + 14 @@ -3275,7 +3299,7 @@ Мова apps/client/src/app/components/user-account-settings/user-account-settings.html - 61 + 67 @@ -3283,7 +3307,7 @@ Якщо переклад відсутній, будь ласка, підтримайте нас у його розширенні тут. apps/client/src/app/components/user-account-settings/user-account-settings.html - 64 + 70 @@ -3291,11 +3315,11 @@ Локалізація apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 669 + 668 apps/client/src/app/components/user-account-settings/user-account-settings.html - 156 + 162 @@ -3303,7 +3327,7 @@ Формат дати та чисел apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 164 @@ -3311,15 +3335,15 @@ Close Account apps/client/src/app/components/user-account-settings/user-account-settings.html - 387 + 393 apps/client/src/app/components/user-account-settings/user-account-settings.html - 397 + 403 apps/client/src/app/components/user-account-settings/user-account-settings.html - 404 + 410 @@ -3327,7 +3351,7 @@ Зовнішній вигляд apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 207 @@ -3343,7 +3367,7 @@ Світлий apps/client/src/app/components/user-account-settings/user-account-settings.html - 216 + 222 @@ -3359,7 +3383,7 @@ Темний apps/client/src/app/components/user-account-settings/user-account-settings.html - 217 + 223 @@ -3367,7 +3391,7 @@ Режим дзен apps/client/src/app/components/user-account-settings/user-account-settings.html - 244 + 250 apps/client/src/app/pages/features/features-page.html @@ -3379,7 +3403,7 @@ Досвід без відволікань для неспокійних часів apps/client/src/app/components/user-account-settings/user-account-settings.html - 246 + 252 @@ -3387,7 +3411,7 @@ Інвестиції apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 257 + 264 @@ -3403,7 +3427,7 @@ Біометрична аутентифікація apps/client/src/app/components/user-account-settings/user-account-settings.html - 261 + 267 @@ -3411,7 +3435,7 @@ Увійти з відбитком пальця apps/client/src/app/components/user-account-settings/user-account-settings.html - 263 + 269 @@ -3419,7 +3443,7 @@ Експериментальні функції apps/client/src/app/components/user-account-settings/user-account-settings.html - 280 + 286 @@ -3427,7 +3451,7 @@ Попередній перегляд майбутніх функцій apps/client/src/app/components/user-account-settings/user-account-settings.html - 282 + 288 @@ -3435,7 +3459,7 @@ Експортувати дані apps/client/src/app/components/user-account-settings/user-account-settings.html - 331 + 337 @@ -3443,7 +3467,7 @@ Зона небезпеки apps/client/src/app/components/user-account-settings/user-account-settings.html - 340 + 346 @@ -3451,7 +3475,7 @@ Закрити обліковий запис apps/client/src/app/components/user-account-settings/user-account-settings.html - 416 + 422 @@ -3475,11 +3499,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 244 + 305 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 630 + 665 @@ -3503,11 +3527,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 242 + 303 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 628 + 663 @@ -4019,7 +4043,7 @@ apps/client/src/app/pages/about/overview/about-overview-page.html - 193 + 194 apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts @@ -4100,7 +4124,7 @@ For security reasons, please delete all activities and accounts first before your Ghostfolio account can be closed. apps/client/src/app/components/user-account-settings/user-account-settings.html - 407 + 413 @@ -4252,7 +4276,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 233 apps/client/src/app/pages/public/public-page.html @@ -4591,14 +4615,6 @@ 132 - - 360° View - 360° огляд - - apps/client/src/app/pages/landing/landing-page.html - 142 - - Get the full picture of your personal finances across multiple platforms. Отримайте повну картину ваших особистих фінансів на різних платформах. @@ -4607,14 +4623,6 @@ 145 - - Web3 Ready - Готовий до Web3 - - apps/client/src/app/pages/landing/landing-page.html - 153 - - Basic Materials Основні матеріали @@ -5108,11 +5116,11 @@ thereof Dividend Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 178 + 185 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 306 + 313 @@ -5136,11 +5144,11 @@ Дата apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 528 + 527 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 564 + 563 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -5176,7 +5184,7 @@ Імпортувати активності apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 124 + 162 libs/ui/src/lib/activities-table/activities-table.component.html @@ -5192,7 +5200,7 @@ Імпорт дивідендів apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 180 + 241 libs/ui/src/lib/activities-table/activities-table.component.html @@ -5208,7 +5216,7 @@ Імпортуються дані... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 223 + 284 @@ -5216,7 +5224,7 @@ Імпорт завершено apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 234 + 295 @@ -5232,11 +5240,11 @@ Перевірка даних... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 369 + 404 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 429 + 464 @@ -5279,16 +5287,16 @@ Choose or drop a file here Виберіть або перетягніть файл сюди - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 95 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 20 The following file formats are supported: Підтримуються наступні формати файлів: - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 102 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 26 @@ -5296,7 +5304,7 @@ Вибрати дивіденди apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 156 + 114 @@ -5304,7 +5312,7 @@ Виберіть активності apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 158 + 116 @@ -5312,7 +5320,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 587 @@ -5320,11 +5328,11 @@ Назад apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 222 + 180 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 260 + 218 @@ -5348,11 +5356,11 @@ Імпорт apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 231 + 189 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 268 + 226 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -5420,7 +5428,7 @@ The CSV file has more than rows of activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 404 + 439 @@ -5652,7 +5660,7 @@ Закрити позицію apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 464 + 463 @@ -5692,7 +5700,7 @@ Топ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 329 + 336 @@ -5700,7 +5708,7 @@ Низ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 382 + 389 @@ -5708,7 +5716,7 @@ Еволюція портфеля apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 468 + 476 @@ -5716,7 +5724,7 @@ Інвестиційний графік apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 496 + 504 @@ -5724,7 +5732,7 @@ Поточна серія apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 517 + 525 @@ -5732,7 +5740,7 @@ Найдовша серія apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 526 + 534 @@ -5740,7 +5748,7 @@ Графік дивідендів apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 554 + 562 @@ -6000,7 +6008,7 @@ Powered by third-party AI providers apps/client/src/app/components/user-account-settings/user-account-settings.html - 300 + 306 @@ -6088,7 +6096,7 @@ The content of your file will be processed by third-party AI providers. Please remove any personal data before uploading. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 126 + 165 @@ -6124,7 +6132,7 @@ Продовжити з Google apps/client/src/app/pages/register/register-page.html - 41 + 42 @@ -6315,47 +6323,47 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 96 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 129 apps/client/src/app/components/user-account-settings/user-account-settings.html - 128 + 134 apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 138 apps/client/src/app/components/user-account-settings/user-account-settings.html - 136 + 142 apps/client/src/app/components/user-account-settings/user-account-settings.html - 140 + 146 apps/client/src/app/components/user-account-settings/user-account-settings.html - 146 + 152 apps/client/src/app/pages/features/features-page.html @@ -6771,7 +6779,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 601 + 600 @@ -6991,7 +6999,7 @@ Ви дійсно хочете видалити цей рахунок? libs/ui/src/lib/account-balances/account-balances.component.ts - 134 + 127 @@ -7158,8 +7166,8 @@ Ghostfolio AI is processing the file... Ghostfolio AI is processing the file... - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 82 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 164 @@ -7262,6 +7270,18 @@ 290 + + Return on Investment (total return with dividends) + Return on Investment (total return with dividends) + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 165 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 270 + + Add to Watchlist Add to Watchlist @@ -7335,7 +7355,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 507 + 514 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -7367,7 +7387,7 @@ Упс! Не вдалося отримати історичні дані. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 287 + 285 @@ -7419,7 +7439,7 @@ Рахунок apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 110 + 105 libs/common/src/lib/routes/routes.ts @@ -7519,7 +7539,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 756 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7583,7 +7603,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 287 + 294 @@ -7591,7 +7611,7 @@ Закрити apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 758 + 757 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7619,7 +7639,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 150 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -7659,15 +7679,15 @@ Резервний фонд apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 272 + 279 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 350 + 357 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 452 + 459 apps/client/src/app/pages/features/features-page.html @@ -7861,6 +7881,10 @@ apps/client/src/app/components/admin-users/admin-users.html 247 + + apps/client/src/app/components/home-overview/home-overview.html + 110 + libs/ui/src/lib/accounts-table/accounts-table.component.html 339 @@ -7895,7 +7919,7 @@ Увійти через OpenID Connect apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 57 + 58 @@ -7967,7 +7991,7 @@ Готівка apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 304 + 311 @@ -8139,7 +8163,7 @@ AI-assisted import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 136 + 94 @@ -8223,7 +8247,7 @@ Стандартна ринкова ціна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 642 + 641 @@ -8231,7 +8255,7 @@ Режим apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 678 + 677 @@ -8247,7 +8271,7 @@ Селектор apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 694 + 693 @@ -8255,7 +8279,7 @@ Заголовки HTTP-запиту apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 655 + 654 @@ -8327,7 +8351,7 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 69 + 73 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -8407,7 +8431,7 @@ Performance Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 440 + 447 @@ -8572,7 +8596,7 @@ Розрахунок прибутковості apps/client/src/app/components/user-account-settings/user-account-settings.html - 36 + 37 @@ -8669,7 +8693,7 @@ {VAR_PLURAL, plural, =1 {Ghostfolio AI could not match 1 activity of the file } other {Ghostfolio AI could not match activities of the file }} apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 172 + 130 @@ -8918,6 +8942,14 @@ 307 + + Privacy First + Privacy First + + apps/client/src/app/pages/landing/landing-page.html + 153 + + Available Доступно @@ -9152,7 +9184,7 @@ Керувати профілем активу apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 492 + 491 @@ -9268,11 +9300,11 @@ Return on Average Investment (total return with dividends) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 159 + 157 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 264 + 262 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 51c7e93a88..b26141b552 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -615,7 +615,7 @@ Ghostfolio AI has processed the maximum of activities. The file can have more activities. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 193 + 151 @@ -723,7 +723,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 518 @@ -758,11 +758,11 @@ Date apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 528 + 527 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 564 + 563 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -879,6 +879,13 @@ 71 + + Request a free trial + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 211 + + Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. @@ -943,7 +950,7 @@ The file is larger than MB apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 396 + 431 @@ -975,7 +982,7 @@ Oops! Could not parse historical data. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 287 + 285 @@ -1007,11 +1014,11 @@ Import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 231 + 189 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 268 + 226 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -1135,7 +1142,7 @@ Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 631 @@ -1321,7 +1328,7 @@ Add apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 619 + 618 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1361,7 +1368,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 710 + 709 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1390,7 +1397,7 @@ Do you really want to delete this platform? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 131 + 133 @@ -1511,7 +1518,7 @@ No auto-renewal on membership. apps/client/src/app/components/user-account-membership/user-account-membership.html - 79 + 82 @@ -1632,7 +1639,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 81 + 82 libs/common/src/lib/routes/routes.ts @@ -1654,6 +1661,13 @@ 297 + + No credit card required. The trial ends automatically. + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 214 + + Manage Activities @@ -1665,7 +1679,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 530 + 529 @@ -1803,7 +1817,7 @@ Total Amount libs/ui/src/lib/investment-chart/investment-chart.component.ts - 166 + 182 @@ -1817,7 +1831,7 @@ Savings Rate libs/ui/src/lib/investment-chart/investment-chart.component.ts - 215 + 232 @@ -1836,7 +1850,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 356 + 362 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -1876,14 +1890,6 @@ apps/client/src/app/pages/landing/landing-page.html 352 - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 112 - - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 121 - apps/client/src/app/pages/pricing/pricing-page.html 336 @@ -1901,7 +1907,7 @@ Sign in with Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 46 + 47 @@ -1915,7 +1921,7 @@ Stay signed in apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 69 @@ -1973,28 +1979,28 @@ Total Assets apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 195 + 202 Buying Power apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 335 + 342 Excluded from Analysis apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 367 + 374 Liabilities apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 398 + 405 apps/client/src/app/pages/features/features-page.html @@ -2005,14 +2011,14 @@ Net Worth apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 418 + 425 Annualized Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 433 + 440 @@ -2063,7 +2069,7 @@ Report Data Glitch apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 476 @@ -2195,6 +2201,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 181 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 224 + Upgrade Plan @@ -2336,7 +2346,7 @@ Please enter your coupon code. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 203 + 197 @@ -2350,7 +2360,7 @@ Could not redeem coupon code apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 181 + 175 @@ -2364,7 +2374,7 @@ Coupon code has been redeemed apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 194 + 188 @@ -2380,16 +2390,20 @@ Try Premium + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 235 + apps/client/src/app/components/user-account-membership/user-account-membership.html - 58 + 61 Redeem Coupon apps/client/src/app/components/user-account-membership/user-account-membership.html - 72 + 75 @@ -2400,7 +2414,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 221 @@ -2421,21 +2435,21 @@ Presenter View apps/client/src/app/components/user-account-settings/user-account-settings.html - 226 + 232 Protection for sensitive information like absolute performances and quantity values apps/client/src/app/components/user-account-settings/user-account-settings.html - 228 + 234 Base Currency apps/client/src/app/components/user-account-settings/user-account-settings.html - 13 + 14 @@ -2449,47 +2463,47 @@ Language apps/client/src/app/components/user-account-settings/user-account-settings.html - 61 + 67 Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 669 + 668 apps/client/src/app/components/user-account-settings/user-account-settings.html - 156 + 162 Date and number format apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 164 Close Account apps/client/src/app/components/user-account-settings/user-account-settings.html - 387 + 393 apps/client/src/app/components/user-account-settings/user-account-settings.html - 397 + 403 apps/client/src/app/components/user-account-settings/user-account-settings.html - 404 + 410 Appearance apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 207 @@ -2503,7 +2517,7 @@ Light apps/client/src/app/components/user-account-settings/user-account-settings.html - 216 + 222 @@ -2517,14 +2531,14 @@ Dark apps/client/src/app/components/user-account-settings/user-account-settings.html - 217 + 223 Zen Mode apps/client/src/app/components/user-account-settings/user-account-settings.html - 244 + 250 apps/client/src/app/pages/features/features-page.html @@ -2535,14 +2549,14 @@ Distraction-free experience for turbulent times apps/client/src/app/components/user-account-settings/user-account-settings.html - 246 + 252 Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 257 + 264 @@ -2556,28 +2570,28 @@ Biometric Authentication apps/client/src/app/components/user-account-settings/user-account-settings.html - 261 + 267 Sign in with fingerprint apps/client/src/app/components/user-account-settings/user-account-settings.html - 263 + 269 Experimental Features apps/client/src/app/components/user-account-settings/user-account-settings.html - 280 + 286 Sneak peek at upcoming functionality apps/client/src/app/components/user-account-settings/user-account-settings.html - 282 + 288 @@ -2588,7 +2602,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 316 + 322 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2599,7 +2613,7 @@ Export Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 331 + 337 @@ -2621,11 +2635,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 244 + 305 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 630 + 665 @@ -2640,11 +2654,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 242 + 303 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 628 + 663 @@ -2655,7 +2669,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 245 + 306 @@ -3102,7 +3116,7 @@ apps/client/src/app/pages/about/overview/about-overview-page.html - 193 + 194 apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts @@ -3157,7 +3171,7 @@ For security reasons, please delete all activities and accounts first before your Ghostfolio account can be closed. apps/client/src/app/components/user-account-settings/user-account-settings.html - 407 + 413 @@ -3295,7 +3309,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 233 apps/client/src/app/pages/public/public-page.html @@ -3593,13 +3607,6 @@ 132 - - 360° View - - apps/client/src/app/pages/landing/landing-page.html - 142 - - Get the full picture of your personal finances across multiple platforms. @@ -3607,13 +3614,6 @@ 145 - - Web3 Ready - - apps/client/src/app/pages/landing/landing-page.html - 153 - - Basic Materials @@ -4052,11 +4052,11 @@ thereof Dividend Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 178 + 185 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 306 + 313 @@ -4081,7 +4081,7 @@ Import Activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 124 + 162 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4096,7 +4096,7 @@ Import Dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 180 + 241 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4111,14 +4111,14 @@ Importing data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 223 + 284 Import has been completed apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 234 + 295 @@ -4132,11 +4132,11 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 369 + 404 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 429 + 464 @@ -4174,47 +4174,47 @@ Choose or drop a file here - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 95 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 20 The following file formats are supported: - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 102 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 26 Select Dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 156 + 114 Select Activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 158 + 116 Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 587 Back apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 222 + 180 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 260 + 218 @@ -4285,7 +4285,7 @@ The CSV file has more than rows of activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 404 + 439 @@ -4472,49 +4472,49 @@ Top apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 329 + 336 Bottom apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 382 + 389 Portfolio Evolution apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 468 + 476 Investment Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 496 + 504 Current Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 517 + 525 Longest Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 526 + 534 Dividend Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 554 + 562 @@ -4742,7 +4742,7 @@ Powered by third-party AI providers apps/client/src/app/components/user-account-settings/user-account-settings.html - 300 + 306 @@ -4806,7 +4806,7 @@ Continue with Google apps/client/src/app/pages/register/register-page.html - 41 + 42 @@ -5212,7 +5212,7 @@ Do you really want to delete this account balance? libs/ui/src/lib/account-balances/account-balances.component.ts - 134 + 127 @@ -5340,6 +5340,17 @@ 290 + + Return on Investment (total return with dividends) + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 165 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 270 + + Add to Watchlist @@ -5397,7 +5408,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 507 + 514 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5453,7 +5464,7 @@ Account apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 110 + 105 libs/common/src/lib/routes/routes.ts @@ -5558,15 +5569,15 @@ Emergency Fund apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 272 + 279 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 350 + 357 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 452 + 459 apps/client/src/app/pages/features/features-page.html @@ -5727,6 +5738,10 @@ apps/client/src/app/components/admin-users/admin-users.html 247 + + apps/client/src/app/components/home-overview/home-overview.html + 110 + libs/ui/src/lib/accounts-table/accounts-table.component.html 339 @@ -5743,7 +5758,7 @@ Sign in with OpenID Connect apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 57 + 58 @@ -5808,7 +5823,7 @@ Cash apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 304 + 311 @@ -5977,7 +5992,7 @@ If a translation is missing, kindly support us in extending it here. apps/client/src/app/components/user-account-settings/user-account-settings.html - 64 + 70 @@ -5998,14 +6013,14 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 728 + 727 Oops! Could not grant access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 320 + 316 @@ -6062,7 +6077,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 464 + 463 @@ -6154,7 +6169,7 @@ Oops! A data provider is experiencing the hiccups. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html - 8 + 9 @@ -6218,8 +6233,8 @@ Ghostfolio AI is processing the file... - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 82 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 164 @@ -6260,7 +6275,7 @@ Data Gathering apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 751 + 750 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6398,7 +6413,7 @@ Close Account apps/client/src/app/components/user-account-settings/user-account-settings.html - 416 + 422 @@ -6419,7 +6434,7 @@ Danger Zone apps/client/src/app/components/user-account-settings/user-account-settings.html - 340 + 346 @@ -6461,7 +6476,7 @@ Derived from the portfolio you are viewing apps/client/src/app/components/user-account-settings/user-account-settings.html - 27 + 28 @@ -6510,7 +6525,7 @@ The content of your file will be processed by third-party AI providers. Please remove any personal data before uploading. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 126 + 165 @@ -6528,47 +6543,47 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 96 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 129 apps/client/src/app/components/user-account-settings/user-account-settings.html - 128 + 134 apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 138 apps/client/src/app/components/user-account-settings/user-account-settings.html - 136 + 142 apps/client/src/app/components/user-account-settings/user-account-settings.html - 140 + 146 apps/client/src/app/components/user-account-settings/user-account-settings.html - 146 + 152 apps/client/src/app/pages/features/features-page.html @@ -6736,7 +6751,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 756 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6812,14 +6827,14 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 287 + 294 Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 758 + 757 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6847,7 +6862,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 150 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -6877,7 +6892,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 420 + 416 @@ -7087,7 +7102,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 601 + 600 @@ -7286,7 +7301,7 @@ AI-assisted import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 136 + 94 @@ -7311,28 +7326,28 @@ Could not generate an API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 142 + 136 Do you really want to generate a new API key? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 163 + 157 Ghostfolio Premium Data Provider API Key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 158 + 152 Set this API key in your self-hosted environment: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 151 @@ -7360,7 +7375,7 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 767 + 766 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7403,6 +7418,13 @@ 50 + + All in One Place + + apps/client/src/app/pages/landing/landing-page.html + 142 + + Received Access @@ -7467,7 +7489,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 678 + 677 @@ -7481,14 +7503,14 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 642 + 641 Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 694 + 693 @@ -7509,7 +7531,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 655 + 654 @@ -7573,7 +7595,7 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 69 + 73 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -7631,7 +7653,7 @@ Performance Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 440 + 447 @@ -7770,7 +7792,7 @@ Performance Calculation apps/client/src/app/components/user-account-settings/user-account-settings.html - 36 + 37 @@ -7864,7 +7886,7 @@ {VAR_PLURAL, plural, =1 {Ghostfolio AI could not match 1 activity of the file } other {Ghostfolio AI could not match activities of the file }} apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 172 + 130 @@ -8086,6 +8108,13 @@ 5 + + Privacy First + + apps/client/src/app/pages/landing/landing-page.html + 153 + + Available @@ -8285,7 +8314,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 492 + 491 @@ -8303,11 +8332,11 @@ Return on Average Investment (total return with dividends) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 159 + 157 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 264 + 262 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 8902b911b7..025f95e680 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -652,7 +652,7 @@ Ghostfolio AI has processed the maximum of activities. The file can have more activities. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 193 + 151 @@ -772,7 +772,7 @@ 拆股 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 518 @@ -812,11 +812,11 @@ 日期 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 528 + 527 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 564 + 563 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -943,6 +943,14 @@ 71 + + Request a free trial + Request a free trial + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 211 + + Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. 在我们的常见问题 (FAQ) 页面中查找关于完全托管的 Ghostfolio 云服务的常见问题快速解答。 @@ -1016,7 +1024,7 @@ The file is larger than MB apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 396 + 431 @@ -1036,7 +1044,7 @@ 哎呀!无法解析历史数据。 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 287 + 285 @@ -1064,11 +1072,11 @@ 导入 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 231 + 189 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 268 + 226 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -1204,7 +1212,7 @@ 刮削配置 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 631 @@ -1412,7 +1420,7 @@ 添加 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 619 + 618 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1456,7 +1464,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 710 + 709 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1488,7 +1496,7 @@ 您真的要删除这个平台吗? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 131 + 133 @@ -1624,7 +1632,7 @@ 会员资格不自动续订。 apps/client/src/app/components/user-account-membership/user-account-membership.html - 79 + 82 @@ -1756,7 +1764,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 81 + 82 libs/common/src/lib/routes/routes.ts @@ -1779,6 +1787,14 @@ 297 + + No credit card required. The trial ends automatically. + No credit card required. The trial ends automatically. + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 214 + + Manage Activities 管理活动 @@ -1792,7 +1808,7 @@ 拆股比例 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 530 + 529 @@ -1948,7 +1964,7 @@ 总金额 libs/ui/src/lib/investment-chart/investment-chart.component.ts - 166 + 182 @@ -1964,7 +1980,7 @@ 储蓄率 libs/ui/src/lib/investment-chart/investment-chart.component.ts - 215 + 232 @@ -1984,7 +2000,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 356 + 362 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -2026,14 +2042,6 @@ apps/client/src/app/pages/landing/landing-page.html 352 - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 112 - - - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 121 - apps/client/src/app/pages/pricing/pricing-page.html 336 @@ -2052,7 +2060,7 @@ 使用 Google 登录 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 46 + 47 @@ -2068,7 +2076,7 @@ 保持登录 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 69 @@ -2132,7 +2140,7 @@ 总资产 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 195 + 202 @@ -2140,7 +2148,7 @@ 购买力 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 335 + 342 @@ -2148,7 +2156,7 @@ 从分析中排除 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 367 + 374 @@ -2156,7 +2164,7 @@ 负债 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 398 + 405 apps/client/src/app/pages/features/features-page.html @@ -2168,7 +2176,7 @@ 净值 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 418 + 425 @@ -2176,7 +2184,7 @@ 年化业绩 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 433 + 440 @@ -2232,7 +2240,7 @@ 报告数据故障 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 476 @@ -2374,6 +2382,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 181 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 224 + Upgrade Plan @@ -2528,7 +2540,7 @@ 请输入您的优惠券代码。 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 203 + 197 @@ -2544,7 +2556,7 @@ 无法兑换优惠券代码 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 181 + 175 @@ -2560,7 +2572,7 @@ 优惠券代码已被兑换 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 194 + 188 @@ -2578,9 +2590,13 @@ Try Premium 尝试高级版 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 235 + apps/client/src/app/components/user-account-membership/user-account-membership.html - 58 + 61 @@ -2588,7 +2604,7 @@ 兑换优惠券 apps/client/src/app/components/user-account-membership/user-account-membership.html - 72 + 75 @@ -2600,7 +2616,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 215 + 221 @@ -2624,7 +2640,7 @@ 演示者视图 apps/client/src/app/components/user-account-settings/user-account-settings.html - 226 + 232 @@ -2632,7 +2648,7 @@ 保护绝对业绩、金额等敏感信息 apps/client/src/app/components/user-account-settings/user-account-settings.html - 228 + 234 @@ -2640,7 +2656,7 @@ 基础货币 apps/client/src/app/components/user-account-settings/user-account-settings.html - 13 + 14 @@ -2656,7 +2672,7 @@ 语言 apps/client/src/app/components/user-account-settings/user-account-settings.html - 61 + 67 @@ -2664,11 +2680,11 @@ 语言环境 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 669 + 668 apps/client/src/app/components/user-account-settings/user-account-settings.html - 156 + 162 @@ -2676,7 +2692,7 @@ 日期和数字格式 apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 164 @@ -2684,15 +2700,15 @@ 关闭账户 apps/client/src/app/components/user-account-settings/user-account-settings.html - 387 + 393 apps/client/src/app/components/user-account-settings/user-account-settings.html - 397 + 403 apps/client/src/app/components/user-account-settings/user-account-settings.html - 404 + 410 @@ -2700,7 +2716,7 @@ 外观 apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 207 @@ -2716,7 +2732,7 @@ 明亮 apps/client/src/app/components/user-account-settings/user-account-settings.html - 216 + 222 @@ -2732,7 +2748,7 @@ 黑暗 apps/client/src/app/components/user-account-settings/user-account-settings.html - 217 + 223 @@ -2740,7 +2756,7 @@ 极简模式 apps/client/src/app/components/user-account-settings/user-account-settings.html - 244 + 250 apps/client/src/app/pages/features/features-page.html @@ -2752,7 +2768,7 @@ 动荡时期的无干扰体验 apps/client/src/app/components/user-account-settings/user-account-settings.html - 246 + 252 @@ -2760,7 +2776,7 @@ 投资 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 257 + 264 @@ -2776,7 +2792,7 @@ 生物识别认证 apps/client/src/app/components/user-account-settings/user-account-settings.html - 261 + 267 @@ -2784,7 +2800,7 @@ 使用指纹登录 apps/client/src/app/components/user-account-settings/user-account-settings.html - 263 + 269 @@ -2792,7 +2808,7 @@ 实验性功能 apps/client/src/app/components/user-account-settings/user-account-settings.html - 280 + 286 @@ -2800,7 +2816,7 @@ 预览即将推出的功能 apps/client/src/app/components/user-account-settings/user-account-settings.html - 282 + 288 @@ -2812,7 +2828,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 316 + 322 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2824,7 +2840,7 @@ 导出数据 apps/client/src/app/components/user-account-settings/user-account-settings.html - 331 + 337 @@ -2848,11 +2864,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 244 + 305 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 630 + 665 @@ -2868,11 +2884,11 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 242 + 303 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 628 + 663 @@ -2884,7 +2900,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 245 + 306 @@ -3360,7 +3376,7 @@ apps/client/src/app/pages/about/overview/about-overview-page.html - 193 + 194 apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts @@ -3420,7 +3436,7 @@ 出于安全原因,在关闭您的 Ghostfolio 账户之前,请先删除所有活动和账户。 apps/client/src/app/components/user-account-settings/user-account-settings.html - 407 + 413 @@ -3572,7 +3588,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 233 apps/client/src/app/pages/public/public-page.html @@ -3903,14 +3919,6 @@ 132 - - 360° View - 360° 视角 - - apps/client/src/app/pages/landing/landing-page.html - 142 - - Get the full picture of your personal finances across multiple platforms. 跨多个平台全面了解您的个人财务状况。 @@ -3919,14 +3927,6 @@ 145 - - Web3 Ready - Web3 就绪 - - apps/client/src/app/pages/landing/landing-page.html - 153 - - Basic Materials 基础材料 @@ -4420,11 +4420,11 @@ 其中:股息绩效 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 178 + 185 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 306 + 313 @@ -4452,7 +4452,7 @@ 导入活动记录 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 124 + 162 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4468,7 +4468,7 @@ 导入股息 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 180 + 241 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4484,7 +4484,7 @@ 正在导入数据... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 223 + 284 @@ -4492,7 +4492,7 @@ 导入已完成 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 234 + 295 @@ -4508,11 +4508,11 @@ 验证数据... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 369 + 404 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 429 + 464 @@ -4555,16 +4555,16 @@ Choose or drop a file here 在此处选择或放置文件 - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 95 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 20 The following file formats are supported: 支持以下文件格式: - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 102 + libs/ui/src/lib/file-drop-area/file-drop-area.component.html + 26 @@ -4572,7 +4572,7 @@ 选择股息 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 156 + 114 @@ -4580,7 +4580,7 @@ 选择活动 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 158 + 116 @@ -4588,7 +4588,7 @@ 拆股后股数 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 587 @@ -4596,11 +4596,11 @@ 后退 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 222 + 180 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 260 + 218 @@ -4680,7 +4680,7 @@ The CSV file has more than rows of activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 404 + 439 @@ -4888,7 +4888,7 @@ 顶部 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 329 + 336 @@ -4896,7 +4896,7 @@ 底部 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 382 + 389 @@ -4904,7 +4904,7 @@ 投资组合演变 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 468 + 476 @@ -4912,7 +4912,7 @@ 投资时间表 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 496 + 504 @@ -4920,7 +4920,7 @@ 当前连胜 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 517 + 525 @@ -4928,7 +4928,7 @@ 最长连续纪录 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 526 + 534 @@ -4936,7 +4936,7 @@ 股息时间表 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 554 + 562 @@ -5188,7 +5188,7 @@ Powered by third-party AI providers apps/client/src/app/components/user-account-settings/user-account-settings.html - 300 + 306 @@ -5260,7 +5260,7 @@ 继续使用谷歌 apps/client/src/app/pages/register/register-page.html - 41 + 42 @@ -5709,7 +5709,7 @@ 您确实要删除该帐户余额吗? libs/ui/src/lib/account-balances/account-balances.component.ts - 134 + 127 @@ -5852,6 +5852,18 @@ 290 + + Return on Investment (total return with dividends) + Return on Investment (total return with dividends) + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 165 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 270 + + Add to Watchlist 添加到关注列表 @@ -5917,7 +5929,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 507 + 514 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5977,7 +5989,7 @@ 帐户 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 110 + 105 libs/common/src/lib/routes/routes.ts @@ -6089,15 +6101,15 @@ 应急基金 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 272 + 279 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 350 + 357 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 452 + 459 apps/client/src/app/pages/features/features-page.html @@ -6275,6 +6287,10 @@ apps/client/src/app/components/admin-users/admin-users.html 247 + + apps/client/src/app/components/home-overview/home-overview.html + 110 + libs/ui/src/lib/accounts-table/accounts-table.component.html 339 @@ -6293,7 +6309,7 @@ 使用 OpenID Connect 登录 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 57 + 58 @@ -6365,7 +6381,7 @@ 现金 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 304 + 311 @@ -6553,7 +6569,7 @@ 如果翻译缺失,欢迎在这里进行扩展。 apps/client/src/app/components/user-account-settings/user-account-settings.html - 64 + 70 @@ -6577,7 +6593,7 @@ 测试 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 728 + 727 @@ -6585,7 +6601,7 @@ 哎呀!无法授予访问权限。 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 320 + 316 @@ -6649,7 +6665,7 @@ 关闭持仓 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 464 + 463 @@ -6753,7 +6769,7 @@ 哎呀!数据提供商遇到了问题。 apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html - 8 + 9 @@ -6824,8 +6840,8 @@ Ghostfolio AI is processing the file... Ghostfolio AI is processing the file... - apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 82 + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 164 @@ -6870,7 +6886,7 @@ 数据收集 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 751 + 750 apps/client/src/app/components/admin-overview/admin-overview.html @@ -7042,7 +7058,7 @@ 危险区域 apps/client/src/app/components/user-account-settings/user-account-settings.html - 340 + 346 @@ -7050,7 +7066,7 @@ 关闭账户 apps/client/src/app/components/user-account-settings/user-account-settings.html - 416 + 422 @@ -7098,7 +7114,7 @@ 源自您正在查看的投资组合 apps/client/src/app/components/user-account-settings/user-account-settings.html - 27 + 28 @@ -7154,7 +7170,7 @@ The content of your file will be processed by third-party AI providers. Please remove any personal data before uploading. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 126 + 165 @@ -7198,47 +7214,47 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 96 apps/client/src/app/components/user-account-settings/user-account-settings.html - 96 + 102 apps/client/src/app/components/user-account-settings/user-account-settings.html - 100 + 106 apps/client/src/app/components/user-account-settings/user-account-settings.html - 104 + 110 apps/client/src/app/components/user-account-settings/user-account-settings.html - 108 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 129 apps/client/src/app/components/user-account-settings/user-account-settings.html - 128 + 134 apps/client/src/app/components/user-account-settings/user-account-settings.html - 132 + 138 apps/client/src/app/components/user-account-settings/user-account-settings.html - 136 + 142 apps/client/src/app/components/user-account-settings/user-account-settings.html - 140 + 146 apps/client/src/app/components/user-account-settings/user-account-settings.html - 146 + 152 apps/client/src/app/pages/features/features-page.html @@ -7414,7 +7430,7 @@ 哎呀!无法更新访问权限。 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 420 + 416 @@ -7434,7 +7450,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 756 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7490,7 +7506,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 287 + 294 @@ -7498,7 +7514,7 @@ 关闭 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 758 + 757 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7526,7 +7542,7 @@ apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 150 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -7786,7 +7802,7 @@ 拆股前股数 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 601 + 600 @@ -8012,7 +8028,7 @@ 无法生成 API 密钥 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 142 + 136 @@ -8020,7 +8036,7 @@ 在您的自托管环境中设置此 API 密钥: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 151 @@ -8036,7 +8052,7 @@ Ghostfolio Premium 数据提供者 API 密钥 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 158 + 152 @@ -8044,7 +8060,7 @@ 您确定要生成新的 API 密钥吗? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 163 + 157 @@ -8068,7 +8084,7 @@ AI-assisted import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 136 + 94 @@ -8092,7 +8108,7 @@ 保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 767 + 766 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -8147,6 +8163,14 @@ 210 + + All in One Place + All in One Place + + apps/client/src/app/pages/landing/landing-page.html + 142 + + Received Access 已获得访问权限 @@ -8224,7 +8248,7 @@ 默认市场价格 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 642 + 641 @@ -8232,7 +8256,7 @@ 模式 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 678 + 677 @@ -8248,7 +8272,7 @@ 选择器 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 694 + 693 @@ -8256,7 +8280,7 @@ HTTP 请求标头 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 655 + 654 @@ -8328,7 +8352,7 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 69 + 73 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -8408,7 +8432,7 @@ Performance Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 440 + 447 @@ -8573,7 +8597,7 @@ 绩效计算 apps/client/src/app/components/user-account-settings/user-account-settings.html - 36 + 37 @@ -8670,7 +8694,7 @@ {VAR_PLURAL, plural, =1 {Ghostfolio AI could not match 1 activity of the file } other {Ghostfolio AI could not match activities of the file }} apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 172 + 130 @@ -8919,6 +8943,14 @@ 307 + + Privacy First + Privacy First + + apps/client/src/app/pages/landing/landing-page.html + 153 + + Available 可用 @@ -9153,7 +9185,7 @@ 管理资产概况 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 492 + 491 @@ -9269,11 +9301,11 @@ 平均投资回报率(含股息总回报) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 159 + 157 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 264 + 262 diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 61008f1fc7..31caf6d3a1 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -422,4 +422,18 @@ export const THROTTLE_DEFAULT_TTL = ms('1 minute'); export const THROTTLE_SIGNUP_LIMIT = 5; export const THROTTLE_SIGNUP_TTL = ms('1 hour'); +export const TRY_SUBSCRIPTION_MAIL_HREF = `mailto:hi@ghostfol.io?subject=${encodeURIComponent( + 'Ghostfolio Premium Trial' +)}&body=${[ + 'Hello', + '', + 'I am interested in Ghostfolio Premium. Can you please send me a coupon code to try it for some time?', + '', + 'Kind regards' +] + .map((line) => { + return encodeURIComponent(line); + }) + .join(E_MAIL_LINE_BREAK)}`; + export const UNKNOWN_KEY = 'UNKNOWN'; diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index 5f22f4734e..d17f2377b7 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -67,6 +67,7 @@ import type { } from './responses/data-provider-response.interface'; import type { DividendsResponse } from './responses/dividends-response.interface'; import type { ResponseError } from './responses/errors.interface'; +import type { ExchangeRateResponse } from './responses/exchange-rate-response.interface'; import type { ExportResponse } from './responses/export-response.interface'; import type { HistoricalResponse } from './responses/historical-response.interface'; import type { ImportResponse } from './responses/import-response.interface'; @@ -75,6 +76,7 @@ import type { LivenessHealthResponse } from './responses/liveness-health-respons import type { LookupResponse } from './responses/lookup-response.interface'; import type { MarketDataOfMarketsResponse } from './responses/market-data-of-markets-response.interface'; import type { OAuthResponse } from './responses/oauth-response.interface'; +import type { PlatformResponse } from './responses/platform-response.interface'; import type { PlatformsResponse } from './responses/platforms-response.interface'; import type { PortfolioDividendsResponse } from './responses/portfolio-dividends-response.interface'; import type { PortfolioHoldingResponse } from './responses/portfolio-holding-response.interface'; @@ -149,6 +151,7 @@ export { DataProviderResponse, DividendsResponse, EnhancedAssetProfile, + ExchangeRateResponse, ExportResponse, Filter, FilterGroup, @@ -170,6 +173,7 @@ export { MarketDataOfMarketsResponse, NullableLineChartItem, OAuthResponse, + PlatformResponse, PlatformsResponse, PortfolioChart, PortfolioDetails, diff --git a/libs/common/src/lib/interfaces/responses/exchange-rate-response.interface.ts b/libs/common/src/lib/interfaces/responses/exchange-rate-response.interface.ts new file mode 100644 index 0000000000..6991fed809 --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/exchange-rate-response.interface.ts @@ -0,0 +1,3 @@ +export interface ExchangeRateResponse { + marketPrice: number; +} diff --git a/libs/common/src/lib/interfaces/responses/platform-response.interface.ts b/libs/common/src/lib/interfaces/responses/platform-response.interface.ts new file mode 100644 index 0000000000..7c8bee930f --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/platform-response.interface.ts @@ -0,0 +1,6 @@ +import type { Platform } from '@ghostfolio/prisma/browser'; + +export interface PlatformResponse extends Pick< + Platform, + 'id' | 'name' | 'url' +> {} diff --git a/libs/common/src/lib/interfaces/responses/platforms-response.interface.ts b/libs/common/src/lib/interfaces/responses/platforms-response.interface.ts index a6bfc4326c..4f9e98054f 100644 --- a/libs/common/src/lib/interfaces/responses/platforms-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/platforms-response.interface.ts @@ -1,5 +1,5 @@ -import type { Platform } from '@ghostfolio/prisma/browser'; +import type { PlatformResponse } from './platform-response.interface'; export interface PlatformsResponse { - platforms: Platform[]; + platforms: (PlatformResponse & { accountCount?: number })[]; } diff --git a/libs/ui/src/lib/account-balances/account-balances.component.ts b/libs/ui/src/lib/account-balances/account-balances.component.ts index 678650b2cb..715b4af0ec 100644 --- a/libs/ui/src/lib/account-balances/account-balances.component.ts +++ b/libs/ui/src/lib/account-balances/account-balances.component.ts @@ -11,7 +11,6 @@ import { Component, EventEmitter, OnChanges, - OnInit, Output, effect, inject, @@ -25,7 +24,6 @@ import { ReactiveFormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; -import { DateAdapter } from '@angular/material/core'; import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; @@ -63,7 +61,7 @@ import { GfValueComponent } from '../value'; styleUrls: ['./account-balances.component.scss'], templateUrl: './account-balances.component.html' }) -export class GfAccountBalancesComponent implements OnChanges, OnInit { +export class GfAccountBalancesComponent implements OnChanges { @Output() accountBalanceCreated = new EventEmitter(); @Output() accountBalanceDeleted = new EventEmitter(); @@ -94,7 +92,6 @@ export class GfAccountBalancesComponent implements OnChanges, OnInit { >(); public maxDate = new Date(); - private dateAdapter = inject>(DateAdapter); private notificationService = inject(NotificationService); public constructor() { @@ -112,10 +109,6 @@ export class GfAccountBalancesComponent implements OnChanges, OnInit { }); } - public ngOnInit() { - this.dateAdapter.setLocale(this.locale()); - } - public ngOnChanges() { if (this.accountBalances()) { this.dataSource = new MatTableDataSource(this.accountBalances()); diff --git a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts index f46722921f..09069734a8 100644 --- a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts +++ b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts @@ -1,3 +1,4 @@ +import { NUMERICAL_PRECISION_THRESHOLD_4_FIGURES } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { AdminMarketDataDetails, @@ -47,6 +48,7 @@ export class GfBenchmarkDetailDialogComponent implements OnInit { public assetProfile?: AdminMarketDataDetails['assetProfile']; public historicalDataItems: LineChartItem[]; public isLoading = true; + public precision = 2; public value: number; public constructor( @@ -80,6 +82,13 @@ export class GfBenchmarkDetailDialogComponent implements OnInit { } ); + if ( + this.data.deviceType === 'mobile' && + this.value >= NUMERICAL_PRECISION_THRESHOLD_4_FIGURES + ) { + this.precision = 0; + } + this.isLoading = false; this.changeDetectorRef.markForCheck(); diff --git a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.html b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.html index 3ff7f03ab6..f2291e7d1d 100644 --- a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.html +++ b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.html @@ -13,16 +13,17 @@ size="large" [isLoading]="isLoading" [locale]="data.locale" - [precision]="2" + [precision]="precision" + [unit]="assetProfile?.currency" [value]="value" />
-
} diff --git a/libs/ui/src/lib/dialog-footer/dialog-footer.component.scss b/libs/ui/src/lib/dialog-footer/dialog-footer.component.scss index 5d4e87f30f..0f41fc37bc 100644 --- a/libs/ui/src/lib/dialog-footer/dialog-footer.component.scss +++ b/libs/ui/src/lib/dialog-footer/dialog-footer.component.scss @@ -1,3 +1,7 @@ :host { display: block; + + button[mat-icon-button] { + --mat-icon-button-touch-target-display: block; + } } diff --git a/libs/ui/src/lib/dialog-footer/dialog-footer.component.ts b/libs/ui/src/lib/dialog-footer/dialog-footer.component.ts index e230802a76..3c06f932ed 100644 --- a/libs/ui/src/lib/dialog-footer/dialog-footer.component.ts +++ b/libs/ui/src/lib/dialog-footer/dialog-footer.component.ts @@ -9,7 +9,7 @@ import { MatButtonModule } from '@angular/material/button'; import { MatDialogModule } from '@angular/material/dialog'; import { IonIcon } from '@ionic/angular/standalone'; import { addIcons } from 'ionicons'; -import { close } from 'ionicons/icons'; +import { closeOutline } from 'ionicons/icons'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -25,7 +25,7 @@ export class GfDialogFooterComponent { @Output() closeButtonClicked = new EventEmitter(); public constructor() { - addIcons({ close }); + addIcons({ closeOutline }); } public onClickCloseButton() { diff --git a/libs/ui/src/lib/dialog-header/dialog-header.component.html b/libs/ui/src/lib/dialog-header/dialog-header.component.html index 435af1b295..023548a562 100644 --- a/libs/ui/src/lib/dialog-header/dialog-header.component.html +++ b/libs/ui/src/lib/dialog-header/dialog-header.component.html @@ -1,12 +1,19 @@ -
+
{{ title() }} @if (deviceType() !== 'mobile') { - }
diff --git a/libs/ui/src/lib/dialog-header/dialog-header.component.scss b/libs/ui/src/lib/dialog-header/dialog-header.component.scss index 5d4e87f30f..c7dbf3b951 100644 --- a/libs/ui/src/lib/dialog-header/dialog-header.component.scss +++ b/libs/ui/src/lib/dialog-header/dialog-header.component.scss @@ -1,3 +1,14 @@ :host { display: block; + + button[mat-icon-button] { + margin-right: -0.8125rem; + margin-top: 0.125rem; + } + + .with-close-button { + .text-center { + padding-left: 0.9375rem; + } + } } diff --git a/libs/ui/src/lib/dialog-header/dialog-header.component.ts b/libs/ui/src/lib/dialog-header/dialog-header.component.ts index f16d66c4b5..a626e1b6f7 100644 --- a/libs/ui/src/lib/dialog-header/dialog-header.component.ts +++ b/libs/ui/src/lib/dialog-header/dialog-header.component.ts @@ -8,7 +8,7 @@ import { MatButtonModule } from '@angular/material/button'; import { MatDialogModule } from '@angular/material/dialog'; import { IonIcon } from '@ionic/angular/standalone'; import { addIcons } from 'ionicons'; -import { close } from 'ionicons/icons'; +import { closeOutline } from 'ionicons/icons'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -26,7 +26,7 @@ export class GfDialogHeaderComponent { public readonly closeButtonClicked = output(); public constructor() { - addIcons({ close }); + addIcons({ closeOutline }); } protected onClickCloseButton() { diff --git a/libs/ui/src/lib/file-drop-area/file-drop-area.component.html b/libs/ui/src/lib/file-drop-area/file-drop-area.component.html new file mode 100644 index 0000000000..a4d1d6c91e --- /dev/null +++ b/libs/ui/src/lib/file-drop-area/file-drop-area.component.html @@ -0,0 +1,37 @@ +@if (isLoading()) { +
+
+ {{ loadingText() }} +
+
+} @else { + +} +

+ + The following file formats are supported: + @for (fileFormatListPart of fileFormatListParts(); track $index) { + @if (fileFormatListPart.sampleUrl) { + {{ + fileFormatListPart.value + }} + } @else { + {{ fileFormatListPart.value }} + } + } + +

diff --git a/libs/ui/src/lib/file-drop-area/file-drop-area.component.scss b/libs/ui/src/lib/file-drop-area/file-drop-area.component.scss new file mode 100644 index 0000000000..ef73bc369a --- /dev/null +++ b/libs/ui/src/lib/file-drop-area/file-drop-area.component.scss @@ -0,0 +1,113 @@ +@property --aura-angle { + inherits: true; + initial-value: 0deg; + syntax: ''; +} + +:host { + --aura-padding: 0.125rem; + --cloud-icon-size: 2.5rem; + --drop-area-padding: 1.5rem; + + a { + color: rgba(var(--palette-primary-500), 1); + } + + // Based on the aura component of daisyUI (https://daisyui.com/components/aura) + .aura { + --aura-duration: 4000ms; + + animation: aura var(--aura-duration) linear infinite; + background-image: repeating-conic-gradient( + from var(--aura-angle), + transparent 0%, + transparent 40%, + rgba(var(--palette-primary-500), 1) 50% + ); + border-radius: calc(var(--bs-border-radius) + var(--aura-padding)); + padding: var(--aura-padding); + position: relative; + + &::after, + &::before { + animation: inherit; + background-image: inherit; + border-radius: inherit; + content: ''; + inset: 0; + position: absolute; + } + + &::after { + filter: blur(1rem); + opacity: 0.3; + } + + &::before { + filter: blur(0.25rem); + opacity: 0.7; + } + + .drop-area { + background-color: var(--light-background); + border-style: solid; + margin: 0; + // Keep the height of the drop area with the cloud icon + padding-block: calc( + var(--drop-area-padding) + (var(--cloud-icon-size) / 2) + ); + pointer-events: none; + position: relative; + z-index: 1; + } + + @media (prefers-reduced-motion: reduce) { + animation: none; + } + } + + .drop-area { + background-color: rgba(var(--palette-foreground-base), 0.02); + border: 1px dashed + rgba( + var(--palette-foreground-divider), + var(--palette-foreground-divider-alpha) + ); + // Reserve the space of the aura + margin: var(--aura-padding); + padding: var(--drop-area-padding); + + &:hover { + border-color: rgba(var(--palette-primary-500), 1) !important; + color: rgba(var(--palette-primary-500), 1); + } + + .cloud-icon { + font-size: var(--cloud-icon-size); + } + } +} + +:host-context(.theme-dark) { + .aura { + .drop-area { + background-color: var(--dark-background); + } + } + + .drop-area { + border-color: rgba( + var(--palette-foreground-divider-dark), + var(--palette-foreground-divider-dark-alpha) + ); + } +} + +@keyframes aura { + to { + --aura-angle: 360deg; + + // Force the GPU acceleration to prevent lags in Safari + transform: translateZ(1px); + } +} diff --git a/libs/ui/src/lib/file-drop-area/file-drop-area.component.stories.ts b/libs/ui/src/lib/file-drop-area/file-drop-area.component.stories.ts new file mode 100644 index 0000000000..5d14f276ab --- /dev/null +++ b/libs/ui/src/lib/file-drop-area/file-drop-area.component.stories.ts @@ -0,0 +1,49 @@ +import type { Meta, StoryObj } from '@storybook/angular'; + +import { GfFileDropAreaComponent } from './file-drop-area.component'; +import { FileFormat } from './interfaces/interfaces'; + +const FILE_FORMAT_CSV: FileFormat = { + extensions: ['csv'], + name: 'CSV', + sampleUrl: + 'https://github.com/ghostfolio/ghostfolio/blob/main/test/import/ok/sample.csv' +}; + +const FILE_FORMAT_JSON: FileFormat = { + extensions: ['json'], + name: 'JSON', + sampleUrl: + 'https://github.com/ghostfolio/ghostfolio/blob/main/test/import/ok/sample.json' +}; + +const FILE_FORMATS_WITH_GHOSTFOLIO_AI: FileFormat[] = [ + FILE_FORMAT_CSV, + { extensions: ['jpeg', 'jpg'], name: 'JPG' }, + FILE_FORMAT_JSON, + { extensions: ['pdf'], name: 'PDF' }, + { extensions: ['png'], name: 'PNG' } +]; + +export default { + args: { + loadingText: 'Processing the file...' + }, + component: GfFileDropAreaComponent, + title: 'File Drop Area' +} as Meta; + +type Story = StoryObj; + +export const Default: Story = { + args: { + fileFormats: [FILE_FORMAT_CSV, FILE_FORMAT_JSON] + } +}; + +export const Loading: Story = { + args: { + fileFormats: FILE_FORMATS_WITH_GHOSTFOLIO_AI, + isLoading: true + } +}; diff --git a/libs/ui/src/lib/file-drop-area/file-drop-area.component.ts b/libs/ui/src/lib/file-drop-area/file-drop-area.component.ts new file mode 100644 index 0000000000..d6cc328b64 --- /dev/null +++ b/libs/ui/src/lib/file-drop-area/file-drop-area.component.ts @@ -0,0 +1,129 @@ +import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; + +import { + ChangeDetectionStrategy, + Component, + computed, + input, + output +} from '@angular/core'; +import { IonIcon } from '@ionic/angular/standalone'; +import { addIcons } from 'ionicons'; +import { cloudUploadOutline } from 'ionicons/icons'; + +import { FileFormat } from './interfaces/interfaces'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + host: { + '(document:paste)': 'onPaste($event)', + class: 'd-flex flex-column' + }, + imports: [IonIcon], + selector: 'gf-file-drop-area', + styleUrls: ['./file-drop-area.component.scss'], + templateUrl: './file-drop-area.component.html' +}) +export class GfFileDropAreaComponent { + public readonly fileFormats = input.required(); + public readonly isLoading = input(false); + public readonly language = input(DEFAULT_LANGUAGE_CODE); + public readonly loadingText = input.required(); + + public readonly fileSelected = output(); + + protected readonly accept = computed(() => { + return this.fileFormats() + .flatMap(({ extensions }) => { + return extensions.map((extension) => { + return `.${extension}`; + }); + }) + .join(', '); + }); + + protected readonly fileFormatListParts = computed(() => { + const fileFormats = this.fileFormats(); + + return new Intl.ListFormat(this.language(), { type: 'disjunction' }) + .formatToParts( + fileFormats.map(({ name }) => { + return name; + }) + ) + .map(({ type, value }) => { + return { + value, + sampleUrl: + type === 'element' + ? fileFormats.find(({ name }) => { + return name === value; + })?.sampleUrl + : undefined + }; + }); + }); + + public constructor() { + addIcons({ cloudUploadOutline }); + } + + protected onDragEnter(event: DragEvent) { + event.preventDefault(); + event.stopPropagation(); + } + + protected onDragOver(event: DragEvent) { + event.preventDefault(); + event.stopPropagation(); + } + + protected onDrop(event: DragEvent) { + event.preventDefault(); + event.stopPropagation(); + + if (event.dataTransfer) { + // Prevent the browser's default behavior for handling the file drop + event.dataTransfer.dropEffect = 'copy'; + this.emitFirstFile(event.dataTransfer.files); + } + } + + protected onPaste(event: ClipboardEvent) { + if (this.isLoading()) { + return; + } + + const files = event.clipboardData?.files; + + if (files?.length) { + event.preventDefault(); + this.emitFirstFile(files); + } + } + + protected onSelectFile() { + const fileInputElement = document.createElement('input'); + + fileInputElement.accept = this.accept(); + fileInputElement.type = 'file'; + + fileInputElement.onchange = (event) => { + const files = (event.target as HTMLInputElement).files; + + if (files) { + this.emitFirstFile(files); + } + }; + + fileInputElement.click(); + } + + private emitFirstFile(files: FileList) { + const file = files.item(0); + + if (file) { + this.fileSelected.emit(file); + } + } +} diff --git a/libs/ui/src/lib/file-drop-area/index.ts b/libs/ui/src/lib/file-drop-area/index.ts new file mode 100644 index 0000000000..b5cf734153 --- /dev/null +++ b/libs/ui/src/lib/file-drop-area/index.ts @@ -0,0 +1,2 @@ +export * from './file-drop-area.component'; +export * from './interfaces/interfaces'; diff --git a/libs/ui/src/lib/file-drop-area/interfaces/interfaces.ts b/libs/ui/src/lib/file-drop-area/interfaces/interfaces.ts new file mode 100644 index 0000000000..695a3de654 --- /dev/null +++ b/libs/ui/src/lib/file-drop-area/interfaces/interfaces.ts @@ -0,0 +1,5 @@ +export interface FileFormat { + extensions: string[]; + name: string; + sampleUrl?: string; +} diff --git a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts index 4f8540974f..358dbbbcd4 100644 --- a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts +++ b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts @@ -6,7 +6,6 @@ import { Component, CUSTOM_ELEMENTS_SCHEMA, DestroyRef, - OnInit, inject } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; @@ -17,7 +16,6 @@ import { Validators } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; -import { DateAdapter, MAT_DATE_LOCALE } from '@angular/material/core'; import { MatDatepickerModule } from '@angular/material/datepicker'; import { MAT_DIALOG_DATA, @@ -50,7 +48,7 @@ import { HistoricalMarketDataEditorDialogParams } from './interfaces/interfaces' styleUrls: ['./historical-market-data-editor-dialog.scss'], templateUrl: 'historical-market-data-editor-dialog.html' }) -export class GfHistoricalMarketDataEditorDialogComponent implements OnInit { +export class GfHistoricalMarketDataEditorDialogComponent { public readonly data = inject(MAT_DIALOG_DATA); @@ -60,23 +58,16 @@ export class GfHistoricalMarketDataEditorDialogComponent implements OnInit { }); private readonly destroyRef = inject(DestroyRef); - private readonly locale = - this.data.user.settings.locale ?? inject(MAT_DATE_LOCALE); public constructor( private adminService: AdminService, private changeDetectorRef: ChangeDetectorRef, private dataService: DataService, - private dateAdapter: DateAdapter, public dialogRef: MatDialogRef ) { addIcons({ calendarClearOutline, refreshOutline }); } - public ngOnInit() { - this.dateAdapter.setLocale(this.locale); - } - public onCancel() { this.dialogRef.close({ withRefresh: false }); } diff --git a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/interfaces/interfaces.ts b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/interfaces/interfaces.ts index 4a0e419e7b..4803071ac7 100644 --- a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/interfaces/interfaces.ts +++ b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/interfaces/interfaces.ts @@ -1,4 +1,3 @@ -import { User } from '@ghostfolio/common/interfaces'; import { DataSource } from '@ghostfolio/prisma/enums'; export interface HistoricalMarketDataEditorDialogParams { @@ -7,5 +6,4 @@ export interface HistoricalMarketDataEditorDialogParams { dateString: string; marketPrice?: number; symbol: string; - user: User; } diff --git a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts index 94baafbf1a..cefc96b8b2 100644 --- a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts +++ b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts @@ -4,7 +4,7 @@ import { getDateFormatString, getLocale } from '@ghostfolio/common/helper'; -import { LineChartItem, User } from '@ghostfolio/common/interfaces'; +import { LineChartItem } from '@ghostfolio/common/interfaces'; import type { MarketData } from '@ghostfolio/prisma/browser'; import { DataSource } from '@ghostfolio/prisma/enums'; import { DataService } from '@ghostfolio/ui/services'; @@ -70,7 +70,6 @@ export class GfHistoricalMarketDataEditorComponent @Input() dataSource: DataSource; @Input() dateOfFirstActivity?: Date; @Input() symbol: string; - @Input() user: User; @Output() marketDataChanged = new EventEmitter(); @@ -233,8 +232,7 @@ export class GfHistoricalMarketDataEditorComponent currency: this.currency, dataSource: this.dataSource, dateString: `${yearMonth}-${day}`, - symbol: this.symbol, - user: this.user + symbol: this.symbol }, height: this.deviceType() === 'mobile' ? '98vh' : '80vh', width: this.deviceType() === 'mobile' ? '100vw' : '50rem' diff --git a/libs/ui/src/lib/services/admin.service.ts b/libs/ui/src/lib/services/admin.service.ts index 0307909dc1..78314c3b9b 100644 --- a/libs/ui/src/lib/services/admin.service.ts +++ b/libs/ui/src/lib/services/admin.service.ts @@ -5,10 +5,8 @@ import { } from '@ghostfolio/common/config'; import { CreateAssetProfileSplitDto, - CreatePlatformDto, MergeAssetProfileDto, - UpdateAssetProfileDto, - UpdatePlatformDto + UpdateAssetProfileDto } from '@ghostfolio/common/dtos'; import { AdminData, @@ -21,11 +19,7 @@ import { EnhancedAssetProfile } from '@ghostfolio/common/interfaces'; import { DateRange } from '@ghostfolio/common/types'; -import type { - AssetProfileSplit, - MarketData, - Platform -} from '@ghostfolio/prisma/browser'; +import type { AssetProfileSplit, MarketData } from '@ghostfolio/prisma/browser'; import { GF_ENVIRONMENT } from '@ghostfolio/ui/environment'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; @@ -61,10 +55,6 @@ export class AdminService { }); } - public deletePlatform(aId: string) { - return this.http.delete(`/api/v1/platform/${aId}`); - } - public deleteAssetProfileSplit({ dataSource, id, @@ -113,10 +103,6 @@ export class AdminService { }); } - public fetchPlatforms() { - return this.http.get('/api/v1/platform'); - } - public fetchUserById(id: string) { return this.http.get(`/api/v1/admin/user/${id}`); } @@ -252,17 +238,6 @@ export class AdminService { ); } - public postPlatform(aPlatform: CreatePlatformDto) { - return this.http.post(`/api/v1/platform`, aPlatform); - } - - public putPlatform(aPlatform: UpdatePlatformDto) { - return this.http.put( - `/api/v1/platform/${aPlatform.id}`, - aPlatform - ); - } - public syncDemoUserAccount() { return this.http.get(`/api/v1/admin/demo-user/sync`); } diff --git a/libs/ui/src/lib/services/data.service.ts b/libs/ui/src/lib/services/data.service.ts index a74dabded0..6292f8770a 100644 --- a/libs/ui/src/lib/services/data.service.ts +++ b/libs/ui/src/lib/services/data.service.ts @@ -3,6 +3,7 @@ import { CreateAccountBalanceDto, CreateAccountDto, CreateOrderDto, + CreatePlatformDto, CreateTagDto, CreateUserDto, CreateWatchlistItemDto, @@ -13,6 +14,7 @@ import { UpdateBulkMarketDataDto, UpdateOrderDto, UpdateOwnAccessTokenDto, + UpdatePlatformDto, UpdatePropertyDto, UpdateTagDto, UpdateUserSettingDto @@ -38,7 +40,6 @@ import { CreateActivityResponse, CreateStripeCheckoutSessionResponse, DataProviderHealthResponse, - DataProviderHistoricalResponse, ExportResponse, Filter, ImportResponse, @@ -46,6 +47,7 @@ import { LookupResponse, MarketDataOfMarketsResponse, OAuthResponse, + PlatformResponse, PlatformsResponse, PortfolioDetails, PortfolioDividendsResponse, @@ -306,18 +308,6 @@ export class DataService { ); } - public fetchExchangeRateForDate({ - date, - symbol - }: { - date: Date; - symbol: string; - }) { - return this.http.get( - `/api/v1/exchange-rate/${encodeURIComponent(symbol)}/${format(date, DATE_FORMAT, { in: utc })}` - ); - } - public deleteAccess(aId: string) { return this.http.delete(`/api/v1/access/${aId}`); } @@ -366,6 +356,10 @@ export class DataService { return this.http.delete(`/api/v1/user`, { body: aData }); } + public deletePlatform(aId: string) { + return this.http.delete(`/api/v1/platforms/${aId}`); + } + public deleteTag(aId: string) { return this.http.delete(`/api/v1/tags/${aId}`); } @@ -914,6 +908,10 @@ export class DataService { return this.http.post(url, marketData); } + public postPlatform(aPlatform: CreatePlatformDto) { + return this.http.post(`/api/v1/platforms`, aPlatform); + } + public postTag(aTag: CreateTagDto) { return this.http.post(`/api/v1/tags`, aTag); } @@ -953,6 +951,13 @@ export class DataService { ); } + public putPlatform(aPlatform: UpdatePlatformDto) { + return this.http.put( + `/api/v1/platforms/${aPlatform.id}`, + aPlatform + ); + } + public putTag(aTag: UpdateTagDto) { return this.http.put(`/api/v1/tags/${aTag.id}`, aTag); } diff --git a/package-lock.json b/package-lock.json index 61d6a0c375..bc07aafd78 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.88.0", + "version": "3.90.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.88.0", + "version": "3.90.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { @@ -29,9 +29,9 @@ "@internationalized/number": "3.6.8", "@ionic/angular": "8.8.12", "@keyv/redis": "5.1.6", - "@modelcontextprotocol/core": "2.0.0", - "@modelcontextprotocol/node": "2.0.0", - "@modelcontextprotocol/server": "2.0.0", + "@modelcontextprotocol/core": "2.3.1", + "@modelcontextprotocol/node": "2.1.1", + "@modelcontextprotocol/server": "2.3.1", "@nest-lab/throttler-storage-redis": "1.2.0", "@nestjs/bull": "11.0.5", "@nestjs/cache-manager": "3.1.3", @@ -49,7 +49,7 @@ "@openrouter/ai-sdk-provider": "3.1.0", "@prisma/adapter-pg": "7.10.0", "@prisma/client": "7.10.0", - "@rekog/mcp-nest": "2.0.7", + "@rekog/mcp-nest": "2.0.8", "@simplewebauthn/browser": "14.0.0", "@simplewebauthn/server": "14.0.3", "ai": "7.0.127", @@ -104,7 +104,7 @@ "svgmap": "2.21.0", "tablemark": "4.1.0", "twitter-api-v2": "1.29.1", - "undici": "8.11.2", + "undici": "8.12.2", "uuid": "14.0.2", "yahoo-finance2": "4.0.2", "zod": "4.6.5", @@ -149,7 +149,7 @@ "@types/jest": "30.0.0", "@types/jsonpath": "0.2.4", "@types/lodash-es": "4.17.12", - "@types/node": "22.20.1", + "@types/node": "22.20.5", "@types/papaparse": "5.5.2", "@types/passport-google-oauth20": "2.0.17", "@types/passport-openidconnect": "0.1.3", @@ -163,7 +163,7 @@ "jest-environment-node": "30.3.0", "jest-preset-angular": "17.0.0", "nx": "23.2.1", - "prettier": "3.9.9", + "prettier": "3.9.10", "prettier-plugin-organize-attributes": "1.0.0", "prisma": "7.10.0", "react": "18.2.0", @@ -180,7 +180,7 @@ "webpack-cli": "7.1.0" }, "engines": { - "node": ">=22.22.3" + "node": ">=22.23.4" } }, "node_modules/@adobe/css-tools": { @@ -9043,10 +9043,10 @@ } }, "node_modules/@modelcontextprotocol/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/core/-/core-2.0.0.tgz", - "integrity": "sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==", - "license": "MIT", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/core/-/core-2.3.1.tgz", + "integrity": "sha512-laVmIhPGpWi7rG9q+0UigblRN0Hws/Yjlb6qLFtVqryXVLkc4h+yN8z731POD2LnAGQlFe7/tXhUm7Bi0YB91g==", + "license": "Apache-2.0", "dependencies": { "zod": "^4.2.0" }, @@ -9055,24 +9055,19 @@ } }, "node_modules/@modelcontextprotocol/node": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/node/-/node-2.0.0.tgz", - "integrity": "sha512-Y4hAC2XdGDUdDOCbLDOCA4+aL3NUldjsOWlDL/YwpAxrPhRm1xHd7lZ+mLacvZ9t3PaH28wgNoaLQGrIk1P2pg==", - "license": "MIT", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/node/-/node-2.1.1.tgz", + "integrity": "sha512-EY92OAXN2xYL7tNS/MVsWJW1v8VHAPwl9B4Ca3pCrjmvqyC+S1C/6UHsMxF2GoFPraS5Yyg56vFz9brVpFojMA==", + "license": "Apache-2.0", "dependencies": { - "@hono/node-server": "^1.19.9" + "@hono/node-server": "^1.19.9", + "hono": "^4.11.4" }, "engines": { "node": ">=20" }, "peerDependencies": { - "@modelcontextprotocol/server": "^2.0.0", - "hono": "^4.11.4" - }, - "peerDependenciesMeta": { - "hono": { - "optional": true - } + "@modelcontextprotocol/server": "^2.3.0" } }, "node_modules/@modelcontextprotocol/sdk": { @@ -9116,12 +9111,12 @@ } }, "node_modules/@modelcontextprotocol/server": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/server/-/server-2.0.0.tgz", - "integrity": "sha512-YhHWdHfpFMQfd0prsEnxKeS3Qz3ytIGmsS0sth4KDjnacIT7hxk6hXHkJ9KysxlkvTM+WZAtQbbcUhdoP4Hvtw==", - "license": "MIT", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/server/-/server-2.3.1.tgz", + "integrity": "sha512-e59MfWuSssj6DoQ96JCTqdW1AXT5/XtnTl0WWd6MU1Ka434fFUGGosCLJbGNySDhHGvxQWoRWK137FXYFkYNWw==", + "license": "Apache-2.0", "dependencies": { - "@modelcontextprotocol/core": "2.0.0", + "@modelcontextprotocol/core": "2.3.1", "zod": "^4.2.0" }, "engines": { @@ -12758,9 +12753,9 @@ } }, "node_modules/@rekog/mcp-nest": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@rekog/mcp-nest/-/mcp-nest-2.0.7.tgz", - "integrity": "sha512-8DWrSapEA9Z/YJL9dFmj7sSbemmeQmf0VkGkW6Sn1itwKFf0n9hzTiwWt8XBtZvV5JVDNCtvRZKYYKgNjDcYPg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@rekog/mcp-nest/-/mcp-nest-2.0.8.tgz", + "integrity": "sha512-CDqzT1RBdvCNsRkDthcNPG3nxoy0GbRCrdrK+TjL+90ElL+j65lquBhUQcR37csGyeLa8uLnj/2unLqlKZRzoA==", "license": "MIT", "dependencies": { "multer": "^2.3.0", @@ -14311,9 +14306,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.20.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", - "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", + "version": "22.20.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.5.tgz", + "integrity": "sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -29605,9 +29600,9 @@ } }, "node_modules/prettier": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.9.tgz", - "integrity": "sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.10.tgz", + "integrity": "sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==", "dev": true, "license": "MIT", "bin": { @@ -33918,9 +33913,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-8.11.2.tgz", - "integrity": "sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==", + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.12.2.tgz", + "integrity": "sha512-XtuDWVdqTLr3NAxm2ly9/hU6kUsJOgGh1RASzMBbsw6aWCOaQzHdW+QQDfdERjfJ2V5vL5pRPa4RetO9UfivDg==", "license": "MIT", "engines": { "node": ">=22.19.0" diff --git a/package.json b/package.json index 1999175cf9..b3f01f0303 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.88.0", + "version": "3.90.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", @@ -73,9 +73,9 @@ "@internationalized/number": "3.6.8", "@ionic/angular": "8.8.12", "@keyv/redis": "5.1.6", - "@modelcontextprotocol/core": "2.0.0", - "@modelcontextprotocol/node": "2.0.0", - "@modelcontextprotocol/server": "2.0.0", + "@modelcontextprotocol/core": "2.3.1", + "@modelcontextprotocol/node": "2.1.1", + "@modelcontextprotocol/server": "2.3.1", "@nest-lab/throttler-storage-redis": "1.2.0", "@nestjs/bull": "11.0.5", "@nestjs/cache-manager": "3.1.3", @@ -93,7 +93,7 @@ "@openrouter/ai-sdk-provider": "3.1.0", "@prisma/adapter-pg": "7.10.0", "@prisma/client": "7.10.0", - "@rekog/mcp-nest": "2.0.7", + "@rekog/mcp-nest": "2.0.8", "@simplewebauthn/browser": "14.0.0", "@simplewebauthn/server": "14.0.3", "ai": "7.0.127", @@ -148,7 +148,7 @@ "svgmap": "2.21.0", "tablemark": "4.1.0", "twitter-api-v2": "1.29.1", - "undici": "8.11.2", + "undici": "8.12.2", "uuid": "14.0.2", "yahoo-finance2": "4.0.2", "zod": "4.6.5", @@ -193,7 +193,7 @@ "@types/jest": "30.0.0", "@types/jsonpath": "0.2.4", "@types/lodash-es": "4.17.12", - "@types/node": "22.20.1", + "@types/node": "22.20.5", "@types/papaparse": "5.5.2", "@types/passport-google-oauth20": "2.0.17", "@types/passport-openidconnect": "0.1.3", @@ -207,7 +207,7 @@ "jest-environment-node": "30.3.0", "jest-preset-angular": "17.0.0", "nx": "23.2.1", - "prettier": "3.9.9", + "prettier": "3.9.10", "prettier-plugin-organize-attributes": "1.0.0", "prisma": "7.10.0", "react": "18.2.0", @@ -224,6 +224,6 @@ "webpack-cli": "7.1.0" }, "engines": { - "node": ">=22.22.3" + "node": ">=22.23.4" } }