diff --git a/.config/prisma.ts b/.config/prisma.ts new file mode 100644 index 000000000..64691136c --- /dev/null +++ b/.config/prisma.ts @@ -0,0 +1,14 @@ +import { defineConfig } from '@prisma/config'; +import { config } from 'dotenv'; +import { expand } from 'dotenv-expand'; +import { join } from 'node:path'; + +expand(config({ quiet: true })); + +export default defineConfig({ + migrations: { + path: join(__dirname, '..', 'prisma', 'migrations'), + seed: `node ${join(__dirname, '..', 'prisma', 'seed.mts')}` + }, + schema: join(__dirname, '..', 'prisma', 'schema.prisma') +}); diff --git a/CHANGELOG.md b/CHANGELOG.md index 758898cee..79ff17256 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,117 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 2.215.0-beta.1 - 2025-11-05 + +### Added + +- Added the endpoint `GET /api/v1/admin/user/:id` + +### Changed + +- Improved the _Self-Hosting_ section content for the _Compare with..._ concept on the Frequently Asked Questions (FAQ) page +- Improved the _Self-Hosting_ section content for the _Markets_ concept on the Frequently Asked Questions (FAQ) page +- Changed the build executor of the client from `@nx/angular:webpack-browser` to `@nx/angular:browser-esbuild` +- Refactored the app component to standalone +- Improved the language localization for German (`de`) + +### Fixed + +- Fixed the style of the safe withdrawal rate selector in the _FIRE_ section (experimental) +- Assigned the `ADMIN` role to the first user signing up via a social login provider if no administrator existed +- Improved the table headers’ alignment in the platform management of the admin control panel +- Improved the table headers’ alignment in the tag management of the admin control panel + +## 2.214.0 - 2025-11-01 + +### Changed + +- Improved the icon of the _View Holding_ menu item in the activities table +- Ensured atomic data replacement during historical market data gathering +- Removed _Internet Identity_ as a social login provider +- Refreshed the cryptocurrencies list +- Upgraded `countries-list` from version `3.1.1` to `3.2.0` +- Upgraded `ng-extract-i18n-merge` from version `3.0.0` to `3.1.0` +- Upgraded `twitter-api-v2` from version `1.23.0` to `1.27.0` + +## 2.213.0 - 2025-10-30 + +### Added + +- Extended the activities table menu with a _View Holding_ item +- Added the error logging to the symbol lookup in the _Trackinsight_ data enhancer + +### Changed + +- Improved the icon of the holdings tab on the home page +- Improved the icon of the holdings tab on the home page for the _Zen Mode_ +- Improved the icon of the holdings tab in the account detail dialog +- Migrated the tags selector component in the holding detail dialog to form control +- Improved the language localization for German (`de`) +- Upgraded `nestjs` from version `11.1.3` to `11.1.8` + +## 2.212.0 - 2025-10-29 + +### Added + +- Added a close holding button to the holding detail dialog +- Added the _Sponsors_ section to the about page +- Extended the user detail dialog in the users section of the admin control panel + +### Changed + +- Refactored the generation of the holdings table in the _Copy AI prompt to clipboard for analysis_ action on the analysis page (experimental) +- Refactored the generation of the holdings table in the _Copy portfolio data to clipboard for AI prompt_ action on the analysis page (experimental) +- Improved the usability of the user detail dialog in the users section of the admin control panel +- Improved the language localization for German (`de`) + +### Fixed + +- Ensured the locale is available in the settings dialog to customize the rule thresholds of the _X-ray_ page + +## 2.211.0 - 2025-10-25 + +### Added + +- Extended the export functionality by the user account’s performance calculation type +- Added the _SelfhostedHub_ logo to the logo carousel on the landing page +- Added a user detail dialog to the users section of the admin control panel + +### Changed + +- Localized the number formatting in the static portfolio analysis rule: _Liquidity_ (Buying Power) +- Moved the _Prisma Configuration File_ from `prisma.config.ts` to `.config/prisma.ts` +- Improved the language localization for German (`de`) +- Upgraded `prisma` from version `6.17.1` to `6.18.0` +- Upgraded `tablemark` from version `3.1.0` to `4.1.0` + +### Fixed + +- Fixed the style in the footer row of the accounts table +- Fixed the rendering of names and symbols for custom assets in the import activities dialog +- Fixed an issue with the market price in base currency during the portfolio snapshot calculation + +## 2.210.1 - 2025-10-22 + +### Added + +- Added support for data gathering by date range in the asset profile details dialog of the admin control panel + +### Changed + +- Extracted the portfolio filter form of the assistant to a reusable component +- Formatted the holdings table in the _Copy AI prompt to clipboard for analysis_ action on the analysis page (experimental) +- Formatted the holdings table in the _Copy portfolio data to clipboard for AI prompt_ action on the analysis page (experimental) +- Reverted the explicit configuration of the _Redis_ address family in the job queue module +- Improved the language localization for German (`de`) +- Upgraded `ioredis` from version `5.6.1` to `5.8.2` + +### Fixed + +- Fixed the enter key press to submit the form of the login with access token dialog +- Fixed an issue in the database seeding process caused by unresolved environment variables in `DATABASE_URL` + +## 2.209.0 - 2025-10-18 ### Added @@ -20,10 +130,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the currency validation in the search functionality of the data provider service - Optimized the get quotes functionality by utilizing the asset profile resolutions in the _Financial Modeling Prep_ service - Extracted the footer to a component +- Refactored the blog page component to standalone - Improved the portfolio calculator unit tests to load the user currency from the exported file +- Improved the language localization for German (`de`) ### Fixed +- Fixed an issue in the `csv` file import where custom asset profiles failed due to validation errors +- Fixed an issue with the total buy and sell calculation in the summary related to activities in a custom currency - Respected the include indices flag in the search functionality of the _Financial Modeling Prep_ service - Fixed an issue where the scroll position was not restored when changing pages - Fixed the word wrap in the menus of the activities table component @@ -43,7 +157,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Removed the deprecated endpoint `GET api/v1/portfolio/position/:dataSource/:symbol` - Removed the deprecated endpoint `PUT api/v1/portfolio/position/:dataSource/:symbol/tags` - Improved the language localization for German (`de`) -- Upgraded `prisma` from version `6.16.1` to `6.16.3` +- Upgraded `prisma` from version `6.16.1` to `6.17.1` ### Fixed diff --git a/Dockerfile b/Dockerfile index be1bb53ea..5beaf6e03 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,11 +13,11 @@ RUN apt-get update && apt-get install -y --no-install-suggests \ # Only add basic files without the application itself to avoid rebuilding # layers when files (package.json etc.) have not changed +COPY ./.config .config/ COPY ./CHANGELOG.md CHANGELOG.md COPY ./LICENSE LICENSE COPY ./package.json package.json COPY ./package-lock.json package-lock.json -COPY ./prisma.config.ts prisma.config.ts COPY ./prisma/schema.prisma prisma/ RUN npm install @@ -44,7 +44,7 @@ WORKDIR /ghostfolio/dist/apps/api COPY ./package-lock.json /ghostfolio/dist/apps/api/ RUN npm install -COPY prisma.config.ts /ghostfolio/dist/apps/api/ +COPY .config /ghostfolio/dist/apps/api/.config/ COPY prisma /ghostfolio/dist/apps/api/prisma/ # Overwrite the generated package.json with the original one to ensure having diff --git a/README.md b/README.md index 82d5710d1..1a5cc6e95 100644 --- a/README.md +++ b/README.md @@ -297,7 +297,18 @@ Ghostfolio is **100% free** and **open source**. We encourage and support an act Not sure what to work on? We have [some ideas](https://github.com/ghostfolio/ghostfolio/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22%20no%3Aassignee), even for [newcomers](https://github.com/ghostfolio/ghostfolio/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22%20no%3Aassignee). Please join the Ghostfolio [Slack](https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg) channel or post to [@ghostfolio\_](https://x.com/ghostfolio_) on _X_. We would love to hear from you. -If you like to support this project, get [**Ghostfolio Premium**](https://ghostfol.io/en/pricing) or [**Buy me a coffee**](https://www.buymeacoffee.com/ghostfolio). +If you like to support this project, become a [**Sponsor**](https://github.com/sponsors/ghostfolio), get [**Ghostfolio Premium**](https://ghostfol.io/en/pricing) or [**Buy me a coffee**](https://www.buymeacoffee.com/ghostfolio). + +## Sponsors + +
+

+ Browser testing via
+ + LambdaTest Logo + +

+
## Analytics diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index 66f8483b4..7ed7f364b 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -17,7 +17,8 @@ import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { AdminData, AdminMarketData, - AdminUsers, + AdminUserResponse, + AdminUsersResponse, EnhancedSymbolProfile, ScraperConfiguration } from '@ghostfolio/common/interfaces'; @@ -169,7 +170,7 @@ export class AdminController { let date: Date; if (dateRange) { - const { startDate } = getIntervalFromDateRange(dateRange, new Date()); + const { startDate } = getIntervalFromDateRange(dateRange); date = startDate; } @@ -315,10 +316,17 @@ export class AdminController { public async getUsers( @Query('skip') skip?: number, @Query('take') take?: number - ): Promise { + ): Promise { return this.adminService.getUsers({ skip: isNaN(skip) ? undefined : skip, take: isNaN(take) ? undefined : take }); } + + @Get('user/:id') + @HasPermission(permissions.accessAdminControl) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async getUser(@Param('id') id: string): Promise { + return this.adminService.getUser(id); + } } diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 11f6f0599..6b29b141a 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -23,7 +23,8 @@ import { AdminMarketData, AdminMarketDataDetails, AdminMarketDataItem, - AdminUsers, + AdminUserResponse, + AdminUsersResponse, AssetProfileIdentifier, EnhancedSymbolProfile, Filter @@ -35,7 +36,8 @@ import { BadRequestException, HttpException, Injectable, - Logger + Logger, + NotFoundException } from '@nestjs/common'; import { AssetClass, @@ -507,16 +509,36 @@ export class AdminService { }; } + public async getUser(id: string): Promise { + const [user] = await this.getUsersWithAnalytics({ + where: { id } + }); + + if (!user) { + throw new NotFoundException(`User with ID ${id} not found`); + } + + return user; + } + public async getUsers({ skip, take = Number.MAX_SAFE_INTEGER }: { skip?: number; take?: number; - }): Promise { + }): Promise { const [count, users] = await Promise.all([ this.countUsersWithAnalytics(), - this.getUsersWithAnalytics({ skip, take }) + this.getUsersWithAnalytics({ + skip, + take, + where: { + NOT: { + analytics: null + } + } + }) ]); return { count, users }; @@ -814,17 +836,17 @@ export class AdminService { private async getUsersWithAnalytics({ skip, - take + take, + where }: { skip?: number; take?: number; - }): Promise { + where?: Prisma.UserWhereInput; + }): Promise { let orderBy: Prisma.Enumerable = [ { createdAt: 'desc' } ]; - let where: Prisma.UserWhereInput; - if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { orderBy = [ { @@ -833,12 +855,6 @@ export class AdminService { } } ]; - - where = { - NOT: { - analytics: null - } - }; } const usersWithAnalytics = await this.prismaService.user.findMany({ diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 86ceede28..5ec148558 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -71,7 +71,6 @@ import { UserModule } from './user/user.module'; BullModule.forRoot({ redis: { db: parseInt(process.env.REDIS_DB ?? '0', 10), - family: 0, host: process.env.REDIS_HOST, password: process.env.REDIS_PASSWORD, port: parseInt(process.env.REDIS_PORT ?? '6379', 10) diff --git a/apps/api/src/app/asset/asset.controller.ts b/apps/api/src/app/asset/asset.controller.ts index 828320f82..3b2031084 100644 --- a/apps/api/src/app/asset/asset.controller.ts +++ b/apps/api/src/app/asset/asset.controller.ts @@ -1,7 +1,7 @@ import { AdminService } from '@ghostfolio/api/app/admin/admin.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 { AdminMarketDataDetails } from '@ghostfolio/common/interfaces'; +import type { AssetResponse } from '@ghostfolio/common/interfaces'; import { Controller, Get, Param, UseInterceptors } from '@nestjs/common'; import { DataSource } from '@prisma/client'; @@ -17,7 +17,7 @@ export class AssetController { public async getAsset( @Param('dataSource') dataSource: DataSource, @Param('symbol') symbol: string - ): Promise { + ): Promise { const { assetProfile, marketData } = await this.adminService.getMarketDataBySymbol({ dataSource, symbol }); diff --git a/apps/api/src/app/auth/auth.controller.ts b/apps/api/src/app/auth/auth.controller.ts index 13d8e37f6..57fd04bc7 100644 --- a/apps/api/src/app/auth/auth.controller.ts +++ b/apps/api/src/app/auth/auth.controller.ts @@ -102,23 +102,6 @@ export class AuthController { } } - @Post('internet-identity') - public async internetIdentityLogin( - @Body() body: { principalId: string } - ): Promise { - try { - const authToken = await this.authService.validateInternetIdentityLogin( - body.principalId - ); - return { authToken }; - } catch { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - } - @Get('webauthn/generate-registration-options') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async generateRegistrationOptions() { diff --git a/apps/api/src/app/auth/auth.service.ts b/apps/api/src/app/auth/auth.service.ts index ceff492a0..a6ee5d260 100644 --- a/apps/api/src/app/auth/auth.service.ts +++ b/apps/api/src/app/auth/auth.service.ts @@ -4,7 +4,6 @@ import { PropertyService } from '@ghostfolio/api/services/property/property.serv import { Injectable, InternalServerErrorException } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; -import { Provider } from '@prisma/client'; import { ValidateOAuthLoginParams } from './interfaces/interfaces'; @@ -44,42 +43,6 @@ export class AuthService { }); } - public async validateInternetIdentityLogin(principalId: string) { - try { - const provider: Provider = 'INTERNET_IDENTITY'; - - let [user] = await this.userService.users({ - where: { provider, thirdPartyId: principalId } - }); - - if (!user) { - const isUserSignupEnabled = - await this.propertyService.isUserSignupEnabled(); - - if (!isUserSignupEnabled || true) { - throw new Error('Sign up forbidden'); - } - - // Create new user if not found - user = await this.userService.createUser({ - data: { - provider, - thirdPartyId: principalId - } - }); - } - - return this.jwtService.sign({ - id: user.id - }); - } catch (error) { - throw new InternalServerErrorException( - 'validateInternetIdentityLogin', - error.message - ); - } - } - public async validateOAuthLogin({ provider, thirdPartyId diff --git a/apps/api/src/app/auth/google.strategy.ts b/apps/api/src/app/auth/google.strategy.ts index 02f82a7a8..3e4b4ca0d 100644 --- a/apps/api/src/app/auth/google.strategy.ts +++ b/apps/api/src/app/auth/google.strategy.ts @@ -3,6 +3,7 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/con import { Injectable, Logger } from '@nestjs/common'; import { PassportStrategy } from '@nestjs/passport'; import { Provider } from '@prisma/client'; +import { DoneCallback } from 'passport'; import { Profile, Strategy } from 'passport-google-oauth20'; import { AuthService } from './auth.service'; @@ -29,7 +30,7 @@ export class GoogleStrategy extends PassportStrategy(Strategy, 'google') { _token: string, _refreshToken: string, profile: Profile, - done: Function + done: DoneCallback ) { try { const jwt = await this.authService.validateOAuthLogin({ diff --git a/apps/api/src/app/endpoints/ai/ai.service.ts b/apps/api/src/app/endpoints/ai/ai.service.ts index b479d74ea..d07768d69 100644 --- a/apps/api/src/app/endpoints/ai/ai.service.ts +++ b/apps/api/src/app/endpoints/ai/ai.service.ts @@ -10,9 +10,31 @@ import type { AiPromptMode } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; import { createOpenRouter } from '@openrouter/ai-sdk-provider'; import { generateText } from 'ai'; +import type { ColumnDescriptor } from 'tablemark'; @Injectable() export class AiService { + private static readonly HOLDINGS_TABLE_COLUMN_DEFINITIONS: ({ + key: + | 'ALLOCATION_PERCENTAGE' + | 'ASSET_CLASS' + | 'ASSET_SUB_CLASS' + | 'CURRENCY' + | 'NAME' + | 'SYMBOL'; + } & ColumnDescriptor)[] = [ + { key: 'NAME', name: 'Name' }, + { key: 'SYMBOL', name: 'Symbol' }, + { key: 'CURRENCY', name: 'Currency' }, + { key: 'ASSET_CLASS', name: 'Asset Class' }, + { key: 'ASSET_SUB_CLASS', name: 'Asset Sub Class' }, + { + align: 'right', + key: 'ALLOCATION_PERCENTAGE', + name: 'Allocation in Percentage' + } + ]; + public constructor( private readonly portfolioService: PortfolioService, private readonly propertyService: PropertyService @@ -58,34 +80,81 @@ export class AiService { userId }); - const holdingsTable = [ - '| Name | Symbol | Currency | Asset Class | Asset Sub Class | Allocation in Percentage |', - '| --- | --- | --- | --- | --- | --- |', - ...Object.values(holdings) - .sort((a, b) => { - return b.allocationInPercentage - a.allocationInPercentage; - }) - .map( - ({ - allocationInPercentage, - assetClass, - assetSubClass, - currency, - name, - symbol - }) => { - return `| ${name} | ${symbol} | ${currency} | ${assetClass} | ${assetSubClass} | ${(allocationInPercentage * 100).toFixed(3)}% |`; - } - ) - ]; + const holdingsTableColumns: ColumnDescriptor[] = + AiService.HOLDINGS_TABLE_COLUMN_DEFINITIONS.map(({ align, name }) => { + return { name, align: align ?? 'left' }; + }); + + const holdingsTableRows = Object.values(holdings) + .sort((a, b) => { + return b.allocationInPercentage - a.allocationInPercentage; + }) + .map( + ({ + allocationInPercentage, + assetClass, + assetSubClass, + currency, + name: label, + symbol + }) => { + return AiService.HOLDINGS_TABLE_COLUMN_DEFINITIONS.reduce( + (row, { key, name }) => { + switch (key) { + case 'ALLOCATION_PERCENTAGE': + row[name] = `${(allocationInPercentage * 100).toFixed(3)}%`; + break; + + case 'ASSET_CLASS': + row[name] = assetClass ?? ''; + break; + + case 'ASSET_SUB_CLASS': + row[name] = assetSubClass ?? ''; + break; + + case 'CURRENCY': + row[name] = currency; + break; + + case 'NAME': + row[name] = label; + break; + + case 'SYMBOL': + row[name] = symbol; + break; + + default: + row[name] = ''; + break; + } + + return row; + }, + {} as Record + ); + } + ); + + // Dynamic import to load ESM module from CommonJS context + // eslint-disable-next-line @typescript-eslint/no-implied-eval + const dynamicImport = new Function('s', 'return import(s)') as ( + s: string + ) => Promise; + const { tablemark } = await dynamicImport('tablemark'); + + const holdingsTableString = tablemark(holdingsTableRows, { + columns: holdingsTableColumns + }); if (mode === 'portfolio') { - return holdingsTable.join('\n'); + return holdingsTableString; } return [ `You are a neutral financial assistant. Please analyze the following investment portfolio (base currency being ${userCurrency}) in simple words.`, - ...holdingsTable, + holdingsTableString, 'Structure your answer with these sections:', 'Overview: Briefly summarize the portfolio’s composition and allocation rationale.', 'Risk Assessment: Identify potential risks, including market volatility, concentration, and sectoral imbalances.', diff --git a/apps/api/src/app/endpoints/benchmarks/benchmarks.controller.ts b/apps/api/src/app/endpoints/benchmarks/benchmarks.controller.ts index 69383a30d..629d90928 100644 --- a/apps/api/src/app/endpoints/benchmarks/benchmarks.controller.ts +++ b/apps/api/src/app/endpoints/benchmarks/benchmarks.controller.ts @@ -8,7 +8,7 @@ import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper' import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; import type { AssetProfileIdentifier, - BenchmarkMarketDataDetails, + BenchmarkMarketDataDetailsResponse, BenchmarkResponse } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; @@ -125,7 +125,7 @@ export class BenchmarksController { @Query('symbol') filterBySymbol?: string, @Query('tags') filterByTags?: string, @Query('withExcludedAccounts') withExcludedAccountsParam = 'false' - ): Promise { + ): Promise { const { endDate, startDate } = getIntervalFromDateRange( dateRange, new Date(startDateString) diff --git a/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts b/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts index aa53564b7..03ff32c21 100644 --- a/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts +++ b/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts @@ -6,7 +6,7 @@ import { MarketDataService } from '@ghostfolio/api/services/market-data/market-d import { DATE_FORMAT, parseDate, resetHours } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, - BenchmarkMarketDataDetails, + BenchmarkMarketDataDetailsResponse, Filter } from '@ghostfolio/common/interfaces'; import { DateRange, UserWithSettings } from '@ghostfolio/common/types'; @@ -43,7 +43,7 @@ export class BenchmarksService { startDate: Date; user: UserWithSettings; withExcludedAccounts?: boolean; - } & AssetProfileIdentifier): Promise { + } & AssetProfileIdentifier): Promise { const marketData: { date: string; value: number }[] = []; const userCurrency = user.settings.settings.baseCurrency; const userId = user.id; diff --git a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts index ac5881c4d..1094858cb 100644 --- a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts @@ -8,7 +8,7 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; -import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { @@ -114,7 +114,7 @@ export class GhostfolioService { try { const promises: Promise<{ - [date: string]: IDataProviderHistoricalResponse; + [date: string]: DataProviderHistoricalResponse; }>[] = []; for (const dataProviderService of this.getDataProviderServices()) { @@ -156,7 +156,7 @@ export class GhostfolioService { try { const promises: Promise<{ - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; }>[] = []; for (const dataProviderService of this.getDataProviderServices()) { diff --git a/apps/api/src/app/exchange-rate/exchange-rate.controller.ts b/apps/api/src/app/exchange-rate/exchange-rate.controller.ts index a5b2823d5..fc9e61d61 100644 --- a/apps/api/src/app/exchange-rate/exchange-rate.controller.ts +++ b/apps/api/src/app/exchange-rate/exchange-rate.controller.ts @@ -1,5 +1,5 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; -import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { Controller, @@ -25,7 +25,7 @@ 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({ diff --git a/apps/api/src/app/export/export.controller.ts b/apps/api/src/app/export/export.controller.ts index 8fa2baa43..5446f8789 100644 --- a/apps/api/src/app/export/export.controller.ts +++ b/apps/api/src/app/export/export.controller.ts @@ -1,7 +1,7 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; -import { Export } from '@ghostfolio/common/interfaces'; +import { ExportResponse } from '@ghostfolio/common/interfaces'; import type { RequestWithUser } from '@ghostfolio/common/types'; import { @@ -35,7 +35,7 @@ export class ExportController { @Query('dataSource') filterByDataSource?: string, @Query('symbol') filterBySymbol?: string, @Query('tags') filterByTags?: string - ): Promise { + ): Promise { const activityIds = filterByActivityIds?.split(',') ?? []; const filters = this.apiService.buildFiltersFromQueryParams({ filterByAccounts, @@ -48,8 +48,8 @@ export class ExportController { return this.exportService.export({ activityIds, filters, - userCurrency: this.request.user.settings.settings.baseCurrency, - userId: this.request.user.id + userId: this.request.user.id, + userSettings: this.request.user.settings.settings }); } } diff --git a/apps/api/src/app/export/export.service.ts b/apps/api/src/app/export/export.service.ts index 7d78bdf22..d07b199be 100644 --- a/apps/api/src/app/export/export.service.ts +++ b/apps/api/src/app/export/export.service.ts @@ -3,7 +3,11 @@ import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { environment } from '@ghostfolio/api/environments/environment'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { TagService } from '@ghostfolio/api/services/tag/tag.service'; -import { Filter, Export } from '@ghostfolio/common/interfaces'; +import { + ExportResponse, + Filter, + UserSettings +} from '@ghostfolio/common/interfaces'; import { Injectable } from '@nestjs/common'; import { Platform, Prisma } from '@prisma/client'; @@ -21,14 +25,14 @@ export class ExportService { public async export({ activityIds, filters, - userCurrency, - userId + userId, + userSettings }: { activityIds?: string[]; filters?: Filter[]; - userCurrency: string; userId: string; - }): Promise { + userSettings: UserSettings; + }): Promise { const { ACCOUNT: filtersByAccount } = groupBy(filters, ({ type }) => { return type; }); @@ -36,11 +40,11 @@ export class ExportService { let { activities } = await this.orderService.getOrders({ filters, - userCurrency, userId, includeDrafts: true, sortColumn: 'date', sortDirection: 'asc', + userCurrency: userSettings?.baseCurrency, withExcludedAccountsAndActivities: true }); @@ -244,7 +248,10 @@ export class ExportService { } ), user: { - settings: { currency: userCurrency } + settings: { + currency: userSettings?.baseCurrency, + performanceCalculationType: userSettings?.performanceCalculationType + } } }; } diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 69ec781c3..2ec28365e 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -539,6 +539,7 @@ export class ImportService { connectOrCreate: { create: { dataSource, + name, symbol, currency: assetProfile.currency, userId: dataSource === 'MANUAL' ? user.id : undefined @@ -743,14 +744,36 @@ export class ImportService { } if (!assetProfiles[getAssetProfileIdentifier({ dataSource, symbol })]) { - const assetProfile = { - currency, - ...( + if (['FEE', 'INTEREST', 'LIABILITY'].includes(type)) { + // Skip asset profile validation for FEE, INTEREST, and LIABILITY + // as these activity types don't require asset profiles + const assetProfileInImport = assetProfilesWithMarketDataDto?.find( + (profile) => { + return ( + profile.dataSource === dataSource && profile.symbol === symbol + ); + } + ); + + assetProfiles[getAssetProfileIdentifier({ dataSource, symbol })] = { + currency, + dataSource, + symbol, + name: assetProfileInImport?.name + }; + + continue; + } + + let assetProfile: Partial = { currency }; + + try { + assetProfile = ( await this.dataProviderService.getAssetProfiles([ { dataSource, symbol } ]) - )?.[symbol] - }; + )?.[symbol]; + } catch {} if (!assetProfile?.name) { const assetProfileInImport = assetProfilesWithMarketDataDto?.find( @@ -787,11 +810,7 @@ export class ImportService { } } - if ( - (dataSource !== 'MANUAL' && type === 'BUY') || - type === 'DIVIDEND' || - type === 'SELL' - ) { + if (!['FEE', 'INTEREST', 'LIABILITY'].includes(type)) { if (!assetProfile?.name) { throw new Error( `activities.${index}.symbol ("${symbol}") is not valid for the specified data source ("${dataSource}")` diff --git a/apps/api/src/app/info/info.controller.ts b/apps/api/src/app/info/info.controller.ts index 67d4101a3..7011713dd 100644 --- a/apps/api/src/app/info/info.controller.ts +++ b/apps/api/src/app/info/info.controller.ts @@ -1,5 +1,5 @@ import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor'; -import { InfoItem } from '@ghostfolio/common/interfaces'; +import { InfoResponse } from '@ghostfolio/common/interfaces'; import { Controller, Get, UseInterceptors } from '@nestjs/common'; @@ -11,7 +11,7 @@ export class InfoController { @Get() @UseInterceptors(TransformDataSourceInResponseInterceptor) - public async getInfo(): Promise { + public async getInfo(): Promise { return this.infoService.get(); } } diff --git a/apps/api/src/app/order/create-order.dto.ts b/apps/api/src/app/order/create-order.dto.ts index ba7a1d868..fb4ac32dd 100644 --- a/apps/api/src/app/order/create-order.dto.ts +++ b/apps/api/src/app/order/create-order.dto.ts @@ -44,7 +44,8 @@ export class CreateOrderDto { customCurrency?: string; @IsEnum(DataSource) - dataSource: DataSource; + @IsOptional() // Optional for type FEE, INTEREST, and LIABILITY (default data source is resolved in the backend) + dataSource?: DataSource; @IsISO8601() @Validate(IsAfter1970Constraint) diff --git a/apps/api/src/app/order/interfaces/activities.interface.ts b/apps/api/src/app/order/interfaces/activities.interface.ts index 01a5a60f0..8c88cc2cf 100644 --- a/apps/api/src/app/order/interfaces/activities.interface.ts +++ b/apps/api/src/app/order/interfaces/activities.interface.ts @@ -3,11 +3,6 @@ import { AccountWithPlatform } from '@ghostfolio/common/types'; import { Order, Tag } from '@prisma/client'; -export interface Activities { - activities: Activity[]; - count: number; -} - export interface Activity extends Order { account?: AccountWithPlatform; error?: ActivityError; diff --git a/apps/api/src/app/order/order.controller.ts b/apps/api/src/app/order/order.controller.ts index ffed8ac2e..d6c231059 100644 --- a/apps/api/src/app/order/order.controller.ts +++ b/apps/api/src/app/order/order.controller.ts @@ -11,6 +11,10 @@ import { DATA_GATHERING_QUEUE_PRIORITY_HIGH, HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; +import { + ActivitiesResponse, + ActivityResponse +} from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import type { DateRange, RequestWithUser } from '@ghostfolio/common/types'; @@ -36,7 +40,6 @@ import { parseISO } from 'date-fns'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { CreateOrderDto } from './create-order.dto'; -import { Activities, Activity } from './interfaces/activities.interface'; import { OrderService } from './order.service'; import { UpdateOrderDto } from './update-order.dto'; @@ -113,7 +116,7 @@ export class OrderController { @Query('symbol') filterBySymbol?: string, @Query('tags') filterByTags?: string, @Query('take') take?: number - ): Promise { + ): Promise { let endDate: Date; let startDate: Date; @@ -157,7 +160,7 @@ export class OrderController { public async getOrderById( @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Param('id') id: string - ): Promise { + ): Promise { const impersonationUserId = await this.impersonationService.validateImpersonationId(impersonationId); const userCurrency = this.request.user.settings.settings.baseCurrency; diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index 11579bbf1..e4c642977 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -14,6 +14,7 @@ import { } from '@ghostfolio/common/config'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { + ActivitiesResponse, AssetProfileIdentifier, EnhancedSymbolProfile, Filter @@ -37,8 +38,6 @@ import { endOfToday, isAfter } from 'date-fns'; import { groupBy, uniqBy } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; -import { Activities } from './interfaces/activities.interface'; - @Injectable() export class OrderService { public constructor( @@ -129,7 +128,7 @@ export class OrderService { const assetSubClass = data.assetSubClass; const dataSource: DataSource = 'MANUAL'; - let name: string; + let name = data.SymbolProfile.connectOrCreate.create.name; let symbol: string; if ( @@ -142,7 +141,7 @@ export class OrderService { symbol = data.SymbolProfile.connectOrCreate.create.symbol; } else { // Create custom asset profile - name = data.SymbolProfile.connectOrCreate.create.symbol; + name = name ?? data.SymbolProfile.connectOrCreate.create.symbol; symbol = uuidv4(); } @@ -345,7 +344,7 @@ export class OrderService { userCurrency: string; userId: string; withExcludedAccountsAndActivities?: boolean; - }): Promise { + }): Promise { let orderBy: Prisma.Enumerable = [ { date: 'asc' } ]; diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts index ccdbafac8..f4c99916f 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts @@ -1,4 +1,4 @@ -import { Export } from '@ghostfolio/common/interfaces'; +import { ExportResponse } from '@ghostfolio/common/interfaces'; import { readFileSync } from 'node:fs'; @@ -39,6 +39,6 @@ export const userDummyData = { id: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' }; -export function loadExportFile(filePath: string): Export { +export function loadExportFile(filePath: string): ExportResponse { return JSON.parse(readFileSync(filePath, 'utf8')); } diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index 8a8606003..10e5c15cb 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -9,7 +9,7 @@ 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 { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper'; import { @@ -193,7 +193,7 @@ export abstract class PortfolioCalculator { } const currencies: { [symbol: string]: string } = {}; - const dataGatheringItems: IDataGatheringItem[] = []; + const dataGatheringItems: DataGatheringItem[] = []; let firstIndex = transactionPoints.length; let firstTransactionPoint: TransactionPoint = null; let totalInterestWithCurrencyEffect = new Big(0); @@ -336,7 +336,7 @@ export abstract class PortfolioCalculator { ).mul( exchangeRatesByCurrency[`${item.currency}${this.currency}`]?.[ endDateString - ] + ] ?? 1 ); const { 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 9ffa1b409..aa174f319 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 @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) 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 ab8000702..69b6c3dfc 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 @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) 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 cc65fa8a2..a3cb8716e 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 @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) 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 7d9544666..ae083a7db 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 @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) 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 new file mode 100644 index 000000000..87893e647 --- /dev/null +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts @@ -0,0 +1,140 @@ +import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { + activityDummyData, + loadExportFile, + symbolProfileDummyData, + userDummyData +} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; +import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; +import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; +import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock'; +import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/app/redis-cache/redis-cache.service.mock'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service.mock'; +import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; +import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; +import { parseDate } from '@ghostfolio/common/helper'; +import { ExportResponse } from '@ghostfolio/common/interfaces'; +import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; + +import { Big } from 'big.js'; +import { join } from 'node:path'; + +jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { + return { + CurrentRateService: jest.fn().mockImplementation(() => { + return CurrentRateServiceMock; + }) + }; +}); + +jest.mock( + '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service', + () => { + return { + ExchangeRateDataService: jest.fn().mockImplementation(() => { + return ExchangeRateDataServiceMock; + }) + }; + } +); + +jest.mock( + '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', + () => { + return { + PortfolioSnapshotService: jest.fn().mockImplementation(() => { + return PortfolioSnapshotServiceMock; + }) + }; + } +); + +jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { + return { + RedisCacheService: jest.fn().mockImplementation(() => { + return RedisCacheServiceMock; + }) + }; +}); + +describe('PortfolioCalculator', () => { + let exportResponse: ExportResponse; + + let configurationService: ConfigurationService; + let currentRateService: CurrentRateService; + let exchangeRateDataService: ExchangeRateDataService; + let portfolioCalculatorFactory: PortfolioCalculatorFactory; + let portfolioSnapshotService: PortfolioSnapshotService; + let redisCacheService: RedisCacheService; + + beforeAll(() => { + exportResponse = loadExportFile( + join(__dirname, '../../../../../../../test/import/ok/btceur.json') + ); + }); + + beforeEach(() => { + configurationService = new ConfigurationService(); + + currentRateService = new CurrentRateService(null, null, null, null); + + exchangeRateDataService = new ExchangeRateDataService( + null, + null, + null, + null + ); + + portfolioSnapshotService = new PortfolioSnapshotService(null); + + redisCacheService = new RedisCacheService(null, null); + + portfolioCalculatorFactory = new PortfolioCalculatorFactory( + configurationService, + currentRateService, + exchangeRateDataService, + portfolioSnapshotService, + redisCacheService + ); + }); + + describe('get current positions', () => { + it.only('with BTCUSD buy (in EUR)', async () => { + jest.useFakeTimers().setSystemTime(parseDate('2022-01-14').getTime()); + + const activities: Activity[] = exportResponse.activities.map( + (activity) => ({ + ...activityDummyData, + ...activity, + date: parseDate(activity.date), + feeInAssetProfileCurrency: 4.46, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'USD', + dataSource: activity.dataSource, + name: 'Bitcoin', + symbol: activity.symbol + }, + unitPriceInAssetProfileCurrency: 44558.42 + }) + ); + + const portfolioCalculator = portfolioCalculatorFactory.createCalculator({ + activities, + calculationType: PerformanceCalculationType.ROAI, + currency: 'EUR', + userId: userDummyData.id + }); + + const portfolioSnapshot = await portfolioCalculator.computeSnapshot(); + + expect(portfolioSnapshot.positions[0].fee).toEqual(new Big(4.46)); + expect( + portfolioSnapshot.positions[0].feeInBaseCurrency.toNumber() + ).toBeCloseTo(3.94, 1); + }); + }); +}); 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 1ac0dcd16..cef8938c2 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 @@ -15,7 +15,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { Export } from '@ghostfolio/common/interfaces'; +import { ExportResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -23,7 +23,6 @@ import { join } from 'node:path'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -34,7 +33,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -44,7 +42,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) @@ -52,7 +49,7 @@ jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { }); describe('PortfolioCalculator', () => { - let exportResponse: Export; + let exportResponse: ExportResponse; let configurationService: ConfigurationService; let currentRateService: CurrentRateService; 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 de3f5d3cd..36e6fa900 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 @@ -21,7 +21,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -32,7 +31,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -42,7 +40,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) @@ -53,7 +50,6 @@ jest.mock( '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention ExchangeRateDataService: jest.fn().mockImplementation(() => { return ExchangeRateDataServiceMock; }) 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 29413c6ad..5a4dfdc07 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 @@ -15,7 +15,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { Export } from '@ghostfolio/common/interfaces'; +import { ExportResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -23,7 +23,6 @@ import { join } from 'node:path'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -34,7 +33,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -44,7 +42,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) @@ -52,7 +49,7 @@ jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { }); describe('PortfolioCalculator', () => { - let exportResponse: Export; + let exportResponse: ExportResponse; let configurationService: ConfigurationService; let currentRateService: CurrentRateService; 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 26b3325c2..2ee367530 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 @@ -15,7 +15,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { Export } from '@ghostfolio/common/interfaces'; +import { ExportResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -23,7 +23,6 @@ import { join } from 'node:path'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -34,7 +33,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -44,7 +42,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) @@ -52,7 +49,7 @@ jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { }); describe('PortfolioCalculator', () => { - let exportResponse: Export; + let exportResponse: ExportResponse; let configurationService: ConfigurationService; let currentRateService: CurrentRateService; 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 aaf2c4302..002be9154 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 @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) 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 f7d0e9e6d..bf0b15020 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 @@ -21,7 +21,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -32,7 +31,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -42,7 +40,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) @@ -53,7 +50,6 @@ jest.mock( '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention ExchangeRateDataService: jest.fn().mockImplementation(() => { return ExchangeRateDataServiceMock; }) 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 2cb3899e9..32822014c 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 @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) 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 bb976564a..08015da5b 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 @@ -28,7 +28,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -38,7 +37,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) 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 36b6e8be9..e5b128085 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 @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts index f64328d39..fdd9e4718 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts @@ -15,7 +15,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -26,7 +25,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -36,7 +34,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) 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 0f1cdfff7..cf330d136 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 @@ -15,7 +15,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { Export } from '@ghostfolio/common/interfaces'; +import { ExportResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -23,7 +23,6 @@ import { join } from 'node:path'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -34,7 +33,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -44,7 +42,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) @@ -52,7 +49,7 @@ jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { }); describe('PortfolioCalculator', () => { - let exportResponse: Export; + let exportResponse: ExportResponse; let configurationService: ConfigurationService; let currentRateService: CurrentRateService; 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 e426a68fa..681169062 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 @@ -15,7 +15,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { Export } from '@ghostfolio/common/interfaces'; +import { ExportResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; @@ -23,7 +23,6 @@ import { join } from 'node:path'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -34,7 +33,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -44,7 +42,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) @@ -52,7 +49,7 @@ jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { }); describe('PortfolioCalculator', () => { - let exportResponse: Export; + let exportResponse: ExportResponse; let configurationService: ConfigurationService; let currentRateService: CurrentRateService; 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 5e9949dd2..fc1d477a6 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 @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/interfaces/get-values-params.interface.ts b/apps/api/src/app/portfolio/interfaces/get-values-params.interface.ts index 5cf7c8811..ffb74ee9b 100644 --- a/apps/api/src/app/portfolio/interfaces/get-values-params.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/get-values-params.interface.ts @@ -1,8 +1,8 @@ -import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; import { DateQuery } from './date-query.interface'; export interface GetValuesParams { - dataGatheringItems: IDataGatheringItem[]; + dataGatheringItems: DataGatheringItem[]; dateQuery: DateQuery; } diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index f6f8e3d80..03796dad6 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -19,10 +19,10 @@ import { } from '@ghostfolio/common/config'; import { PortfolioDetails, - PortfolioDividends, + PortfolioDividendsResponse, PortfolioHoldingResponse, PortfolioHoldingsResponse, - PortfolioInvestments, + PortfolioInvestmentsResponse, PortfolioPerformanceResponse, PortfolioReportResponse } from '@ghostfolio/common/interfaces'; @@ -305,7 +305,7 @@ export class PortfolioController { @Query('range') dateRange: DateRange = 'max', @Query('symbol') filterBySymbol?: string, @Query('tags') filterByTags?: string - ): Promise { + ): Promise { const filters = this.apiService.buildFiltersFromQueryParams({ filterByAccounts, filterByAssetClasses, @@ -439,7 +439,7 @@ export class PortfolioController { @Query('range') dateRange: DateRange = 'max', @Query('symbol') filterBySymbol?: string, @Query('tags') filterByTags?: string - ): Promise { + ): Promise { const filters = this.apiService.buildFiltersFromQueryParams({ filterByAccounts, filterByAssetClasses, diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index bbfb31b79..b74b779f6 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -46,7 +46,7 @@ import { InvestmentItem, PortfolioDetails, PortfolioHoldingResponse, - PortfolioInvestments, + PortfolioInvestmentsResponse, PortfolioPerformanceResponse, PortfolioPosition, PortfolioReportResponse, @@ -397,7 +397,7 @@ export class PortfolioService { impersonationId: string; savingsRate: number; userId: string; - }): Promise { + }): Promise { userId = await this.getUserId(impersonationId, userId); const user = await this.userService.user({ id: userId }); const userCurrency = this.getUserCurrency(user); @@ -448,7 +448,7 @@ export class PortfolioService { }); } - let streaks: PortfolioInvestments['streaks']; + let streaks: PortfolioInvestmentsResponse['streaks']; if (savingsRate) { streaks = this.getStreaks({ @@ -2126,11 +2126,11 @@ export class PortfolioService { .filter(({ isDraft, type }) => { return isDraft === false && type === activityType; }) - .map(({ quantity, SymbolProfile, unitPrice }) => { + .map(({ currency, quantity, SymbolProfile, unitPrice }) => { return new Big( this.exchangeRateDataService.toCurrency( new Big(quantity).mul(unitPrice).toNumber(), - SymbolProfile.currency, + currency ?? SymbolProfile.currency, userCurrency ) ); diff --git a/apps/api/src/app/subscription/subscription.controller.ts b/apps/api/src/app/subscription/subscription.controller.ts index 244a6b806..e1c705fdd 100644 --- a/apps/api/src/app/subscription/subscription.controller.ts +++ b/apps/api/src/app/subscription/subscription.controller.ts @@ -5,7 +5,10 @@ import { DEFAULT_LANGUAGE_CODE, PROPERTY_COUPONS } from '@ghostfolio/common/config'; -import { Coupon } from '@ghostfolio/common/interfaces'; +import { + Coupon, + CreateStripeCheckoutSessionResponse +} from '@ghostfolio/common/interfaces'; import type { RequestWithUser } from '@ghostfolio/common/types'; import { @@ -111,11 +114,11 @@ export class SubscriptionController { @Post('stripe/checkout-session') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) - public async createCheckoutSession( + public createStripeCheckoutSession( @Body() { couponId, priceId }: { couponId?: string; priceId: string } - ) { + ): Promise { try { - return this.subscriptionService.createCheckoutSession({ + return this.subscriptionService.createStripeCheckoutSession({ couponId, priceId, user: this.request.user diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index 9574d17e9..37ab1c0f6 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -6,7 +6,10 @@ import { PROPERTY_STRIPE_CONFIG } from '@ghostfolio/common/config'; import { parseDate } from '@ghostfolio/common/helper'; -import { SubscriptionOffer } from '@ghostfolio/common/interfaces'; +import { + CreateStripeCheckoutSessionResponse, + SubscriptionOffer +} from '@ghostfolio/common/interfaces'; import { SubscriptionOfferKey, UserWithSettings @@ -38,7 +41,7 @@ export class SubscriptionService { } } - public async createCheckoutSession({ + public async createStripeCheckoutSession({ couponId, priceId, user @@ -46,7 +49,7 @@ export class SubscriptionService { couponId?: string; priceId: string; user: UserWithSettings; - }) { + }): Promise { const subscriptionOffers: { [offer in SubscriptionOfferKey]: SubscriptionOffer; } = @@ -58,33 +61,34 @@ export class SubscriptionService { } ); - const checkoutSessionCreateParams: Stripe.Checkout.SessionCreateParams = { - cancel_url: `${this.configurationService.get('ROOT_URL')}/${ - user.settings.settings.language - }/account`, - client_reference_id: user.id, - line_items: [ - { - price: priceId, - quantity: 1 - } - ], - locale: - (user.settings?.settings - ?.language as Stripe.Checkout.SessionCreateParams.Locale) ?? - DEFAULT_LANGUAGE_CODE, - metadata: subscriptionOffer - ? { subscriptionOffer: JSON.stringify(subscriptionOffer) } - : {}, - mode: 'payment', - payment_method_types: ['card'], - success_url: `${this.configurationService.get( - 'ROOT_URL' - )}/api/v1/subscription/stripe/callback?checkoutSessionId={CHECKOUT_SESSION_ID}` - }; + const stripeCheckoutSessionCreateParams: Stripe.Checkout.SessionCreateParams = + { + cancel_url: `${this.configurationService.get('ROOT_URL')}/${ + user.settings.settings.language + }/account`, + client_reference_id: user.id, + line_items: [ + { + price: priceId, + quantity: 1 + } + ], + locale: + (user.settings?.settings + ?.language as Stripe.Checkout.SessionCreateParams.Locale) ?? + DEFAULT_LANGUAGE_CODE, + metadata: subscriptionOffer + ? { subscriptionOffer: JSON.stringify(subscriptionOffer) } + : {}, + mode: 'payment', + payment_method_types: ['card'], + success_url: `${this.configurationService.get( + 'ROOT_URL' + )}/api/v1/subscription/stripe/callback?checkoutSessionId={CHECKOUT_SESSION_ID}` + }; if (couponId) { - checkoutSessionCreateParams.discounts = [ + stripeCheckoutSessionCreateParams.discounts = [ { coupon: couponId } @@ -92,7 +96,7 @@ export class SubscriptionService { } const session = await this.stripe.checkout.sessions.create( - checkoutSessionCreateParams + stripeCheckoutSessionCreateParams ); return { diff --git a/apps/api/src/app/symbol/symbol.controller.ts b/apps/api/src/app/symbol/symbol.controller.ts index 5d9a49a29..b374a914b 100644 --- a/apps/api/src/app/symbol/symbol.controller.ts +++ b/apps/api/src/app/symbol/symbol.controller.ts @@ -1,7 +1,7 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor'; -import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { LookupResponse } from '@ghostfolio/common/interfaces'; import type { RequestWithUser } from '@ghostfolio/common/types'; @@ -97,7 +97,7 @@ export class SymbolController { @Param('dataSource') dataSource: DataSource, @Param('dateString') dateString: string, @Param('symbol') symbol: string - ): Promise { + ): Promise { const date = parseISO(dateString); if (!isDate(date)) { diff --git a/apps/api/src/app/symbol/symbol.service.ts b/apps/api/src/app/symbol/symbol.service.ts index 56befb9b6..9eac234c9 100644 --- a/apps/api/src/app/symbol/symbol.service.ts +++ b/apps/api/src/app/symbol/symbol.service.ts @@ -1,7 +1,7 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { - IDataGatheringItem, - IDataProviderHistoricalResponse + DataGatheringItem, + DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; @@ -27,7 +27,7 @@ export class SymbolService { dataGatheringItem, includeHistoricalData }: { - dataGatheringItem: IDataGatheringItem; + dataGatheringItem: DataGatheringItem; includeHistoricalData?: number; }): Promise { const quotes = await this.dataProviderService.getQuotes({ @@ -75,10 +75,10 @@ export class SymbolService { dataSource, date = new Date(), symbol - }: IDataGatheringItem): Promise { + }: DataGatheringItem): Promise { let historicalData: { [symbol: string]: { - [date: string]: IDataProviderHistoricalResponse; + [date: string]: DataProviderHistoricalResponse; }; } = { [symbol]: {} diff --git a/apps/api/src/app/user/user.controller.ts b/apps/api/src/app/user/user.controller.ts index e545fd335..8704662f7 100644 --- a/apps/api/src/app/user/user.controller.ts +++ b/apps/api/src/app/user/user.controller.ts @@ -126,11 +126,7 @@ export class UserController { ); } - const hasAdmin = await this.userService.hasAdmin(); - - const { accessToken, id, role } = await this.userService.createUser({ - data: { role: hasAdmin ? 'USER' : 'ADMIN' } - }); + const { accessToken, id, role } = await this.userService.createUser(); return { accessToken, diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index f797270ff..65ce92cb2 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -526,15 +526,23 @@ export class UserService { }); } - public async createUser({ - data - }: { - data: Prisma.UserCreateInput; - }): Promise { - if (!data?.provider) { + public async createUser( + { + data + }: { + data: Prisma.UserCreateInput; + } = { data: {} } + ): Promise { + if (!data.provider) { data.provider = 'ANONYMOUS'; } + if (!data.role) { + const hasAdmin = await this.hasAdmin(); + + data.role = hasAdmin ? 'USER' : 'ADMIN'; + } + const user = await this.prismaService.user.create({ data: { ...data, diff --git a/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json b/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json index a6db74dfd..9a7a0eb77 100644 --- a/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json +++ b/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json @@ -1,7 +1,9 @@ { "1": "just buy $1 worth of this coin", "3": "The Three Musketeers", + "4": "4", "7": "Lucky7", + "8": "8", "32": "Project 32", "42": "42 Coin", "47": "President Trump", @@ -28,6 +30,7 @@ "00": "ZER0ZER0", "007": "007 coin", "0DOG": "Bitcoin Dogs", + "0G": "0G", "0KN": "0 Knowledge Network", "0LNETWORK": "0L Network", "0NE": "Stone", @@ -95,6 +98,7 @@ "2OMB": "2omb Finance", "2SHARES": "2SHARE", "2TF": "2TF", + "2Z": "DoubleZero", "300F": "300FIT", "314DAO": "Tonken 314 DAO", "32BIT": "32Bitcoin", @@ -133,6 +137,7 @@ "50TRUMP": "50TRUMP", "50X": "50x.com", "5IRE": "5ire", + "5PT": "Five Pillars Token", "69MINUTES": "69 Minutes", "77G": "GraphenTech", "7E": "7ELEVEN", @@ -222,6 +227,7 @@ "ACAT": "Alphacat", "ACATO": "ACA Token", "ACCEL": "Accel Defi", + "ACCES": "Metacces", "ACCN": "Accelerator Network", "ACD": "Alliance Cargo Direct", "ACDC": "Volt", @@ -407,7 +413,8 @@ "AI23T": "23 Turtles", "AI3": "Autonomys Network", "AI69SAKURA": "Sakura", - "AIA": "AIA Chain", + "AIA": "DeAgentAI", + "AIACHAIN": "AIA Chain", "AIAF": "AI Agent Factory", "AIAGENT": "AI Agents", "AIAGENTAPP": "Aiagent.app", @@ -533,6 +540,7 @@ "AIX": "ALIENX", "AIX9": "AthenaX9", "AIXBT": "aixbt by Virtuals", + "AIXCB": "aixCB by Virtuals", "AIXERC": "AI-X", "AIXT": "AIXTerminal", "AJNA": "Ajna Protocol", @@ -624,6 +632,7 @@ "ALNV1": "Aluna v1", "ALOHA": "Aloha", "ALON": "Alon", + "ALOR": "The Algorix", "ALOT": "Dexalot", "ALP": "Alphacon", "ALPA": "Alpaca", @@ -641,6 +650,7 @@ "ALPHAS": "Alpha Shards", "ALPHR": "Alphr", "ALPINE": "Alpine F1 Team Fan Token", + "ALPRO": "Assets Alphabet", "ALPS": "Alpenschillling", "ALT": "Altlayer", "ALTA": "Alta Finance", @@ -651,12 +661,13 @@ "ALTMAN": "SAM", "ALTOCAR": "AltoCar", "ALTR": "Altranium", + "ALTT": "Altcoinist", "ALU": "Altura", "ALUSD": "Alchemix USD", "ALUX": "Alux Bank", "ALV": "Allive", "ALV1": "ArchLoot v1", - "ALVA": "Alvara Protocol", + "ALVACOIN": "Alvara Protocol", "ALWAYS": "Always Evolving", "ALX": "ALAX", "ALY": "Ally", @@ -764,6 +775,7 @@ "ANML": "Animal Concerts", "ANN": "Annex Finance", "ANNE": "ANNE", + "ANOME": "Anome", "ANON": "HeyAnon", "ANONCOIN": "Anoncoin", "ANONCRYPTO": "ANON", @@ -786,6 +798,7 @@ "ANUS": "URANUS", "ANV": "Aniverse", "ANVL": "Anvil", + "ANVLV1": "Anvil v1", "ANW": "Anchor Neural World", "ANY": "Anyswap", "ANYONE": "ANyONe Protocol", @@ -795,7 +808,7 @@ "AOG": "AgeOfGods", "AOK": "AOK", "AOL": "AOL (America Online)", - "AOP": "Averopay", + "AOP": "Ark Of Panda", "AOS": "AOS", "AOT": "Age of Tanks", "AP": "America Party", @@ -917,7 +930,8 @@ "AREN": "Arenon", "ARENA": "Arena", "AREPA": "Arepacoin", - "ARES": "Ares Protocol", + "ARES": "ARES", + "ARESP": "Ares Protocol", "ARG": "Argentine Football Association Fan Token", "ARGENTUM": "Argentum", "ARGO": "ArGoApp", @@ -964,7 +978,7 @@ "ARRR": "Pirate Chain", "ARSL": "Aquarius Loan", "ARSW": "ArthSwap", - "ART": "Genify ART", + "ART": "LiveArt", "ARTC": "Artcoin", "ARTDECO": "ARTDECO", "ARTDRAW": "ArtDraw", @@ -1037,6 +1051,8 @@ "ASST": "AssetStream", "AST": "AirSwap", "ASTA": "ASTA", + "ASTER": "Aster", + "ASTERINU": "Aster INU", "ASTO": "Altered State Token", "ASTON": "Aston", "ASTONV": "Aston Villa Fan Token", @@ -1187,6 +1203,7 @@ "AVE": "Avesta", "AVEN": "Aventis AI", "AVENT": "Aventa", + "AVEROPAY": "Averopay", "AVERY": "Avery Games", "AVG": "Avocado DAO", "AVGOX": "Broadcom xStock", @@ -1241,8 +1258,11 @@ "AXNT": "Axentro", "AXO": "Axo", "AXOL": "Axol", + "AXOME": "Axolotl Meme", "AXON": "AxonDAO Governance Token", + "AXP": "aXpire v1", "AXPR": "aXpire", + "AXPRV2": "aXpire v2", "AXR": "AXRON", "AXS": "Axie Infinity Shards", "AXSV1": "Axie Infinity Shards v1", @@ -1286,7 +1306,9 @@ "BABI": "Babylons", "BABL": "Babylon Finance", "BABY": "Babylon", + "BABY4": "Baby 4", "BABYANDY": "Baby Andy", + "BABYASTER": "Baby Aster", "BABYB": "Baby Bali", "BABYBI": "Baby Bitcoin", "BABYBINANCE": "BABYBINANCE", @@ -1311,6 +1333,7 @@ "BABYCEO": "Baby Doge CEO", "BABYCRASH": "BabyCrash", "BABYCRAZYT": "BABY CRAZY TIGER", + "BABYCREPE": "BABY CREPE", "BABYCUBAN": "Baby Cuban", "BABYCZHAO": "Baby Czhao", "BABYD": "Baby Dragon", @@ -1411,6 +1434,7 @@ "BAFC": "BabyApeFunClub", "BAG": "Bag", "BAGS": "Basis Gold Share", + "BAGWORK": "Bagwork", "BAHAMAS": "Bahamas", "BAHIA": "Esporte Clube Bahia Fan Token", "BAI": "BearAI", @@ -1470,15 +1494,17 @@ "BANNER": "BannerCoin", "BANUS": "Banus.Finance", "BANX": "Banx.gg", - "BAO": "Bao Finance", + "BAO": "Bao Token V2", "BAOBAO": "BaoBao", "BAOE": "Business Age of Empires", "BAOM": "Battle of Memes", "BAOS": "BaoBaoSol", + "BAOV1": "BaoToken v1", "BAR": "FC Barcelona Fan Token", "BARA": "Capybara", "BARAKATUH": "Barakatuh", "BARC": "The Blu Arctic Water Company", + "BARD": "Lombard", "BAREBEARS": "BAREBEARS", "BARIO": "Bario", "BARK": "Bored Ark", @@ -1517,6 +1543,7 @@ "BASID": "Basid Coin", "BASIL": "Basilisk", "BASIS": "Basis", + "BASISCOIN": "Basis Coin", "BASK": "BasketDAO", "BAST": "Bast", "BASTET": "Bastet Goddess", @@ -1703,6 +1730,7 @@ "BEIBEI": "Chinese BEIBEI", "BEL": "Bella Protocol", "BELA": "Bela", + "BELG": "Belgian Malinois", "BELL": "Bellscoin", "BELLE": "Isabelle", "BELLS": "Bellscoin", @@ -1759,6 +1787,7 @@ "BETS": "BetSwirl", "BETT": "Bettium", "BETU": "Betu", + "BETURA": "BETURA", "BETZ": "Bet Lounge", "BEX": "BEX token", "BEY": "NBX", @@ -1772,7 +1801,7 @@ "BFEX": "BFEX", "BFG": "BFG Token", "BFHT": "BeFaster Holder Token", - "BFI": "BitDefi", + "BFI": "BlockFi-Ai", "BFIC": "Bficoin", "BFICGOLD": "BFICGOLD", "BFK WARZONE": "BFK Warzone", @@ -1861,6 +1890,7 @@ "BIGPUMP": "Big Pump", "BIGSB": "BigShortBets", "BIGTIME": "Big Time", + "BIGTOWN": "Burp", "BIGUP": "BigUp", "BIH": "BitHostCoin", "BIHU": "Key", @@ -1910,6 +1940,7 @@ "BISKIT": "Biskit Protocol", "BISO": "BISOSwap", "BIST": "Bistroo", + "BISTOX": "Bistox Exchange Token", "BIT": "BitDAO", "BIT16": "16BitCoin", "BITAIR": "Bitair", @@ -1923,6 +1954,7 @@ "BITBURN": "Bitburn", "BITC": "BitCash", "BITCAR": "BitCar", + "BITCARBON": "Bitcarbon", "BITCAT": "Bitcat", "BITCATONSOL": "Bitcat", "BITCCA": "Bitcci Cash", @@ -1939,12 +1971,14 @@ "BITCONNECT": "BitConnect Coin", "BITCORE": "BitCore", "BITCRATIC": "Bitcratic Token", + "BITDEFI": "BitDefi", "BITDEGREE": "BitDegree", "BITE": "Bitether", "BITF": "Bit Financial", "BITFLIP": "BitFlip", "BITG": "Bitcoin Green", "BITGOLD": "bitGold", + "BITGRIN": "BitGrin", "BITHER": "Bither", "BITL": "BitLux", "BITM": "BitMoney", @@ -2035,6 +2069,7 @@ "BLEPE": "Blepe", "BLERF": "BLERF", "BLES": "Blind Boxes", + "BLESS": "Bless Token", "BLET": "Brainlet", "BLF": "Baby Luffy", "BLHC": "BlackholeCoin", @@ -2060,6 +2095,7 @@ "BLOC": "Blockcloud", "BLOCK": "Blockasset", "BLOCKB": "Block Browser", + "BLOCKBID": "Blockbid", "BLOCKF": "Block Farm Club", "BLOCKG": "BlockGames", "BLOCKIFY": "Blockify.Games", @@ -2069,7 +2105,9 @@ "BLOCKS": "BLOCKS", "BLOCKSSPACE": "Blocks Space", "BLOCKSTAMP": "BlockStamp", + "BLOCKSV1": "BLOCKS v1", "BLOCKT": "Blocktools", + "BLOCKTRADE": "Blocktrade", "BLOCKW": "Blockwise", "BLOCM": "BLOC.MONEY", "BLOCX": "BLOCX.", @@ -2082,6 +2120,7 @@ "BLOVELY": "Baby Lovely Inu", "BLOX": "BLOX", "BLOXT": "Blox Token", + "BLOXWAP": "BLOXWAP", "BLP": "BullPerks", "BLPAI": "BullPerks AI", "BLPT": "Blockprompt", @@ -2093,6 +2132,7 @@ "BLTG": "Block-Logic", "BLTV": "BLTV Token", "BLU": "BlueCoin", + "BLUAI": "Bluwhale AI", "BLUB": "BLUB", "BLUE": "Bluefin", "BLUEBASE": "Blue", @@ -2106,6 +2146,7 @@ "BLUESPARROW": "BlueSparrow Token", "BLUESPARROWOLD": "BlueSparrowToken", "BLUEW": "Blue Whale", + "BLUEY": "BlueyonBase", "BLUFF": "BluffCat", "BLUI": "Blui", "BLUM": "Blum", @@ -2171,6 +2212,7 @@ "BNBFLOKI": "BNB FLOKI", "BNBFROG": "BNBFROG", "BNBH": "BnbHeroes Token", + "BNBHOLDER": "币安Holder", "BNBLION": "BNB LION", "BNBOLYMPIC": "BNB OLYMPIC", "BNBP": "BNBPot", @@ -2192,6 +2234,7 @@ "BNK": "Bankera", "BNKR": "BankrCoin", "BNKV1": "Bankera v1", + "BNL": "BitNational Token", "BNN": "Banyan Network", "BNOM": "BitNomad", "BNP": "BenePit", @@ -2388,6 +2431,7 @@ "BOU": "Boulle", "BOUNCE": "Bounce Token", "BOUNTY": "ChainBounty", + "BOUNTYK": "BOUNTYKINDS", "BOUTS": "BoutsPro", "BOW": "Archer Swap", "BOWE": "Book of Whales", @@ -2594,11 +2638,13 @@ "BST": "Blocksquare Token", "BSTAR": "Blackstar", "BSTC": "BST Chain", + "BSTER": "Bster", "BSTK": "BattleStake", "BSTN": "BitStation", "BSTR": "BSTR", "BSTS": "Magic Beasties", "BSTY": "GlobalBoost", + "BSU": "Baby Shark Universe Token", "BSV": "Bitcoin SV", "BSVBRC": "BSVBRC", "BSW": "Biswap", @@ -2670,6 +2716,7 @@ "BTDX": "Bitcloud 2.0", "BTE": "Betero", "BTECOIN": "BTEcoin", + "BTELEGRAM": "BetterTelegram Token", "BTEV1": "Betero v1", "BTEX": "BTEX", "BTF": "Blockchain Traded Fund", @@ -2772,6 +2819,7 @@ "BULLBEAR": "BullBear AI", "BULLC": "BuySell", "BULLF": "BULL FINANCE", + "BULLGOD": "Bull God", "BULLI": "Bullish On Ethereum", "BULLIEVERSE": "Bullieverse", "BULLINU": "Bull inu", @@ -2820,6 +2868,7 @@ "BUTT": "Buttercat", "BUTTCOIN": "The Next Bitcoin", "BUTTHOLE": "Butthole Coin", + "BUTTPLUG": "fartcoin killer", "BUX": "BUX", "BUXCOIN": "Buxcoin", "BUY": "Burency", @@ -2860,6 +2909,7 @@ "BXT": "BitTokens", "BXTB": "BXTB Foundation", "BXX": "Baanx", + "BXXV1": "Baanx v1", "BXY": "Beaxy", "BYAT": "Byat", "BYB": "BiorBank", @@ -2902,6 +2952,7 @@ "CACHE": "Cache", "CACHEGOLD": "CACHE Gold", "CACTUS": "CACTUS", + "CACXT": "Convertible ACXT", "CADAI": "CADAI", "CADC": "CAD Coin", "CADINU": "Canadian Inuit Dog", @@ -2930,6 +2981,7 @@ "CALCI": "Calcium", "CALI": "CaliCoin", "CALL": "Global Crypto Alliance", + "CALLISTO": "Callisto Network", "CALLS": "OnlyCalls by Virtuals", "CALO": "Calo", "CAM": "Consumption Avatar Matrix", @@ -2951,6 +3003,7 @@ "CANTI": "Cantina Royale", "CANTO": "CANTO", "CANYA": "CanYaCoin", + "CAOCAO": "CaoCao", "CAP": "Capverto", "CAPA": "Cake Panda", "CAPD": "Capdax", @@ -3003,6 +3056,7 @@ "CASIO": "CasinoXMetaverse", "CASPER": "Casper DeFi", "CASPERTOKEN": "Casper Token", + "CASPUR": "Caspur Zoomies", "CAST": "Castello Coin", "CASTLE": "bitCastle", "CAT": "Simon's Cat", @@ -3110,6 +3164,7 @@ "CBUCKS": "CRYPTOBUCKS", "CBUK": "CurveBlock", "CBX": "CropBytes", + "CBXRP": "Coinbase Wrapped XRP", "CBY": "Carbify", "CC": "CloudChat", "CC10": "Cryptocurrency Top 10 Tokens Index", @@ -3144,12 +3199,12 @@ "CCX": "Conceal", "CCXC": "CoolinDarkCoin", "CCXX": "CounosX", + "CDAG": "CannDollar", "CDAI": "Compound Dai", "CDBIO": "CDbio", "CDCETH": "Crypto.com Staked ETH", "CDCSOL": "Crypto.com Staked SOL", "CDEX": "Cryptodex", - "CDL": "CoinDeal Token", "CDN": "Canada eCoin", "CDOG": "Corn Dog", "CDOGE": "cyberdoge", @@ -3220,6 +3275,7 @@ "CGG": "Chain Guardians", "CGL": "Crypto Gladiator Shards", "CGLD": "Celo Gold", + "CGN": "CYGNUS", "CGO": "Comtech Gold", "CGPT": "ChainGPT", "CGPU": "ChainGPU", @@ -3239,6 +3295,7 @@ "CHAI": "Chroma AI", "CHAIN": "Chain Games", "CHAINCADE": "ChainCade", + "CHAINSOFWAR": "Chains of War", "CHAL": "Chalice Finance", "CHAM": "Champion", "CHAMP": "NFT Champions", @@ -3253,6 +3310,7 @@ "CHAPZ": "Chappyz", "CHARGED": "GoCharge Tech", "CHARIZARD": "Charizard Inu", + "CHARLIE": "Charlie Kirk", "CHARM": "Charm Coin", "CHARS": "CHARS", "CHART": "BetOnChart", @@ -3428,7 +3486,8 @@ "CLANKER": "tokenbot", "CLAP": "Clap Cat", "CLAS": "Classic USDC", - "CLASH": "Clashub", + "CLASH": "GeorgePlaysClashRoyale", + "CLASHUB": "Clashub", "CLASS": "Class Coin", "CLAY": "Clayton", "CLAYN": "Clay Nation", @@ -3465,7 +3524,7 @@ "CLND": "COLEND", "CLNX": "Coloniume Network", "CLNY": "Colony", - "CLO": "Callisto Network", + "CLO": "Yei Finance", "CLOA": "Cloak", "CLOAK": "CloakCoin", "CLOKI": "CATLOKI", @@ -3552,7 +3611,8 @@ "CNYX": "eToro Chinese Yuan", "CO": "Corite", "CO2": "CO2 Token", - "COAI": "CodeMong Ai", + "COA": "Alliance Games", + "COAI": "ChainOpera AI", "COAL": "BitCoal", "COB": "Cobinhood", "COBE": "Castle of Blackwater", @@ -3571,6 +3631,7 @@ "CODAI": "CODAI", "CODE": "Code Token", "CODEG": "CodeGenie", + "CODEMONG": "CodeMong Ai", "CODEO": "Codeo Token", "CODEXTOKEN": "CodexToken", "CODI": "Codi Finance", @@ -3592,7 +3653,9 @@ "COINB": "Coinbidex", "COINBT": "CoinBot", "COINBUCK": "Coinbuck", + "COINDEALTOKEN": "CoinDeal Token", "COINDEFI": "Coin", + "COINDEPO": "CoinDepo Token", "COING": "Coingrid", "COINH": "Coinhound", "COINLION": "CoinLion", @@ -3632,6 +3695,7 @@ "COMEW": "Coin In Meme World", "COMFI": "CompliFi", "COMM": "Community Coin", + "COMMON": "COMMON", "COMMS": "CallofMeme", "COMMUNITYCOIN": "Community Coin", "COMP": "Compound", @@ -3690,6 +3754,7 @@ "CORGIAI": "CorgiAI", "CORGIB": "The Corgi of PolkaBridge", "CORION": "Corion", + "CORL": "Coral Finance", "CORN": "Corn", "CORNELLA": "CORNELLA", "CORNFIELDFARM": "CORN", @@ -3721,7 +3786,7 @@ "COVA": "COVA", "COVAL": "Circuits of Value", "COVER": "Cover Protocol", - "COVEROLD": " Cover Protocol (old)", + "COVERV1": "Cover Protocol (old)", "COVEX": "CoVEX", "COVIDTOKEN": "Covid Token", "COVIR": "COVIR", @@ -3814,16 +3879,18 @@ "CREAM": "Cream", "CREAML": "Creamlands", "CREATIVE": "Creative Token", - "CRED": "Verify", + "CRED": "Credia Layer", "CREDI": "Credefi", "CREDIT": "Credit", "CREDITS": "Credits", "CREDO": "Credo", "CREED": "Thecreed", "CREMAT": "Cremation Coin", + "CREMEPUFF": "Creme Puff", "CREO": "Creo Engine", "CREP": "Compound Augur", - "CREPE": "Crepe Coin", + "CREPE": "CREPE", + "CREPECOIN": "Crepe Coin", "CRES": "Cresio", "CRESV1": "Cresio v1", "CREV": "CryptoRevolution", @@ -3873,6 +3940,7 @@ "CRP": "Crypton", "CRPS": "CryptoPennies", "CRPT": "Crypterium", + "CRPTC": "CRPT Classic", "CRS": "CYRUS", "CRSP": "CryptoSpots", "CRT": "Carr.Finance", @@ -3929,6 +3997,7 @@ "CRYPTOSDG": "Crypto SDG", "CRYPTOT": "Crypto Trump", "CRYPTOTANKS": "CryptoTanks", + "CRYPTOTR": "Crypto Trump", "CRYPTOU": "CryptoUnity", "CRYSTAL": "Crystal", "CRYSTALCLEAR": "Crystal Clear Token", @@ -4080,6 +4149,7 @@ "CWIF": "catwifhat", "CWIS": "Crypto Wisdom Coin", "CWN": "CryptoWorldNews", + "CWOIN": "cwoin", "CWR": "Cowrium", "CWS": "Crowns", "CWT": "CrossWallet", @@ -4127,6 +4197,7 @@ "CYP": "CypherPunkCoin", "CYPEPE": "CyPepe", "CYPHER": "CYPHER•GENESIS (Runes)", + "CYPR": "Cypher", "CYRS": "Cyrus Token", "CYRUS": "Cyrus Exchange", "CYS": "BlooCYS", @@ -4192,7 +4263,6 @@ "DAL": "DAOLaunch", "DALI": "Dalichain", "DALMA": "Dalma Inu", - "DAM": "Datamine", "DAMEX": "DAMEX", "DAMN": "Sol Killer", "DAMO": "Coinzen", @@ -4212,6 +4282,7 @@ "DAOLITY": "Daolity", "DAOP": "Dao Space", "DAOSOL": "MonkeDAO", + "DAOSQUARE": "DAOSquare Governance Token", "DAOVC": "DAO.VC", "DAOX": "Daox", "DAPP": "Pencils Protocol", @@ -4250,7 +4321,9 @@ "DAT": "Datum", "DATA": "Streamr", "DATAB": "Databot", + "DATAEC": "DATA Economy Index", "DATAMALL": "Datamall Coin", + "DATAMINE": "Datamine", "DATAO": "Data Ownership Protocol", "DATAWALLET": "DataWallet", "DATBOI": "Dat Boi", @@ -4347,6 +4420,7 @@ "DDRST": "DigiDinar StableToken", "DDRT": "DigiDinar Token", "DDS": "DDS.Store", + "DDUSDV1": "Decentralized USD", "DDX": "DerivaDAO", "DEA": "Degas Coin", "DEAI": "Zero1 Lab", @@ -4379,6 +4453,7 @@ "DEEPSEEK": "Global DePIN Chain", "DEEPSEEKAI": "DeepSeek AI Agent", "DEEPSEEKR1": "DeepSeek R1", + "DEEPSPACE": "DeepSpace", "DEER": "ToxicDeer Finance", "DEERSEIZED": "Deer Seized by US Government", "DEESSE": "Deesse", @@ -4475,6 +4550,7 @@ "DEVT": "DeHorizon", "DEVVE": "Devve", "DEVX": "Developeo", + "DEW": "DEW", "DEX": "DEX", "DEX223": "DEX223", "DEXA": "DEXA COIN", @@ -4531,6 +4607,7 @@ "DGLD": "Digital Gold", "DGLN": "Dogelana", "DGM": "DigiMoney", + "DGMA": "daGama", "DGME": "GameStop Tokenized Stock Defichain", "DGMS": "Digigems", "DGMT": "DigiMax DGMT", @@ -4629,6 +4706,7 @@ "DIPA": "Doge Ipa", "DIRTY": "Dirty Street Cats", "DIS": "DisChain", + "DISCO": "Disco By Matt Furie", "DISCOVERY": "DiscoveryIoT", "DISK": "Dark Lisk", "DISPEPE": "Disabled Pepe", @@ -4658,6 +4736,7 @@ "DKS": "DarkShield", "DKT": "Duelist King", "DKUMA": "KumaDex Token", + "DL": "Dill", "DLA": "Dolla", "DLANCE": "DeeLance", "DLB": "DiemLibre", @@ -4867,6 +4946,7 @@ "DONJR": "Don Jr.", "DONK": "Don-key", "DONKE": "DONKE", + "DONKEY": "donkey", "DONNIEFIN": "Donnie Finance", "DONS": "The Dons", "DONT": "Donald Trump (dont.cash)", @@ -4887,9 +4967,10 @@ "DOPEX": "DOPE", "DOPU": "DOPU The Dog with A Purpose", "DOR": "Dorado", - "DORA": "Dora Factory", + "DORA": "DORA", "DORAEMON": "Doraemon", "DORAV1": "Dora Factory v1", + "DORAV2": "Dora Factory", "DORK": "DORK", "DORKL": "DORK LORD", "DORKVADER": "DorkVader", @@ -5038,6 +5119,7 @@ "DTRC": "Datarius", "DTRUMP": "Degen Trump", "DTSLA": "Tesla Tokenized Stock Defichain", + "DTV": "DraperTV", "DTX": "DataBroker DAO", "DUA": "Brillion", "DUAL": "Dual Finance", @@ -5050,14 +5132,14 @@ "DUC": "DucatusCoin", "DUCAT": "Ducat", "DUCATO": "Ducato Protocol Token", - "DUCK": "Unit Protocol New", + "DUCK": "DuckChain Token", "DUCKAI": "Duck AI", "DUCKC": "DuckCoin", "DUCKD": "DuckDuckCoin", "DUCKER": "Ducker", "DUCKIES": "Yellow Duckies", "DUCKO": "Duck Off Coin", - "DUCKV1": "COL", + "DUCKV1": "UNITPROV1", "DUCKY": "Ducky Duck", "DUCX": "DucatusX", "DUDE": "DuDe", @@ -5082,9 +5164,10 @@ "DUREV": "Povel Durev", "DUROV": "FREE DUROV", "DURTH": "iShares MSCI World ETF Tokenized Stock Defichain", - "DUSD": "Decentralized USD", + "DUSD": "StandX DUSD", "DUSK": "Dusk Network", - "DUST": "DUST Protocol", + "DUST": "Dust", + "DUSTPROTOCOL": "DUST Protocol", "DUSTY": "Dusty", "DUX": "DuxCoin", "DUZCE": "Duzce Token", @@ -5140,6 +5223,7 @@ "DYNA": "Dynamix", "DYNAM": "Dynamic Crypto Index", "DYNAMICTRADING": "Dynamic Trading Rights", + "DYNASTYGLOB": "Dynasty Global Investments AG", "DYNCOIN": "Dyncoin", "DYNEX": "Dynex GPU", "DYNMT": "Dynamite", @@ -5180,6 +5264,7 @@ "EARNM": "EARNM", "EARTH": "Earth Token", "EARTHCOIN": "EarthCoin", + "EASY": "EASY", "EASYF": "EasyFeedback", "EASYMINE": "EasyMine", "EAT": "EDGE Activity Token", @@ -5250,7 +5335,9 @@ "EDDIE": "Eddie coin", "EDE": "El Dorado Exchange", "EDEL": "Coin Edelweis", - "EDEN": "EDEN", + "EDEN": "Eden Token", + "EDENA": "EDENA", + "EDENNETWORK": "EDEN", "EDEXA": "edeXa Security Token", "EDFI": "EdFi", "EDG": "Edgeless", @@ -5266,6 +5353,7 @@ "EDNS": "EDNS Token", "EDOG": "EDOG", "EDOGE": "ElonDoge", + "EDOM": "EDOM", "EDR": "Endor Protocol Token", "EDRC": "EDRCoin", "EDSE": "Eddie Seal", @@ -5317,6 +5405,7 @@ "EGOCOIN": "EGOcoin", "EGOD": "EgodCoin", "EGOLD": "EGOLD", + "EGOLDGG": "eGold", "EGON": "EgonCoin", "EGR": "Egoras Rights", "EGRN": "Energreen", @@ -5453,6 +5542,7 @@ "EMP": "Emp Money", "EMPC": "EmporiumCoin", "EMPH": "Emphy", + "EMPI": "Emperor", "EMPIRE": "Empire Token", "EMPR": "empowr", "EMR": "Emorya Finance", @@ -5473,11 +5563,13 @@ "ENCX": "Encrybit", "ENDCEX": "Endpoint CeX Fan Token", "ENDLESS": "Endless Board Game", + "ENDOR": "Endor Protocol Token", "ENE": "EneCoin", "ENEAR": "Near (Energiswap)", "ENEDEX": "Enedex", "ENERGYLEDGER": "Energy Ledger", "ENERGYX": "Safe Energy", + "ENF": "enfineo", "ENG": "Enigma", "ENGT": "Engagement Token", "ENIGMA": "ENIGMA", @@ -5493,6 +5585,7 @@ "ENRON": "Enron", "ENRX": "Enrex", "ENS": "Ethereum Name Service", + "ENSO": "Enso", "ENT": "Eternity", "ENTC": "EnterButton", "ENTER": "EnterCoin", @@ -5616,6 +5709,7 @@ "ET": "ENDO", "ET4": "Eticket4", "ETALON": "Etalon", + "ETAN": "Etarn", "ETBS": "EthBits", "ETBT": "Ethereum Black", "ETC": "Ethereum Classic", @@ -5708,6 +5802,7 @@ "EURE": "Monerium EUR emoney", "EUREV1": "Monerium EUR emoney v1", "EURI": "Eurite", + "EURL": "LUGH", "EURN": "NOKU EUR", "EURO3": "EURO3", "EUROB": "Etherfuse EUROB", @@ -5719,14 +5814,17 @@ "EURR": "StablR Euro", "EURRV1": "StablR Euro v1", "EURS": "STASIS EURS", + "EURST": "EURO Stable Token", "EURT": "Euro Tether", "EURTV1": "Euro Tether v1", "EURU": "Upper Euro", "EURX": "eToro Euro", "EUSD": "Egoras Dollar", + "EUT": "EarnUp Token", "EUTBL": "Spiko EU T-Bills Money Market Fund", "EV": "EVAI", "EVA": "Evadore", + "EVAA": "EVAA Protocol", "EVAI": "EVA Intelligence", "EVAL": "Chromia's EVAL by Virtuals", "EVAN": "Evanesco Network", @@ -5848,6 +5946,7 @@ "FACTORY": "ChainFactory", "FACTR": "Defactor", "FACTRPAY": "FactR", + "FACY": "ArAIstotle Fact Checker", "FADO": "FADO Go", "FAFO": "FAFO", "FAFOSOL": "Fafo", @@ -5877,6 +5976,7 @@ "FANG": "FANG Token", "FANS": "Fantasy Cash", "FANT": "Phantasia", + "FANTC": "FANtium Tennis Coin", "FANTOM": "Fantom Maker", "FANV": "FanVerse", "FANX": "FrontFanz", @@ -5982,11 +6082,12 @@ "FET": "Artificial Superintelligence Alliance", "FETCH": "Fetch", "FETS": "FE TECH", + "FETV1": "Fetch v1", "FEUSD": "Felix feUSD", "FEVR": "RealFevr", "FEX": "FEX Token", "FEY": "Feyorra", - "FF": "Forefront", + "FF": "Falcon Finance", "FF1": "Two Prime FF1 Token", "FFA": "Cryptofifa", "FFC": "FireflyCoin", @@ -5999,6 +6100,7 @@ "FGC": "FantasyGold", "FGD": "Freedom God DAO", "FGM": "Feels Good Man", + "FGPT": "FurGPT", "FGT": "Flozo Game Token", "FGZ": "Free Game Zone", "FHB": "FHB", @@ -6006,6 +6108,7 @@ "FHM": "FantOHM", "FI": "Fideum", "FIA": "FIA Protocol", + "FIATDAO": "FIAT DAO Token", "FIBO": "FibSWAP DEx", "FIBOS": "FIBOS", "FIBRE": "FIBRE", @@ -6126,6 +6229,7 @@ "FLIP": "Chainflip", "FLIX": "OmniFlix Network", "FLIXX": "Flixxo", + "FLK": "Fleek", "FLL": "Feellike", "FLLW": "Follow Coin", "FLM": "Flamingo", @@ -6202,6 +6306,7 @@ "FMC": "Fimarkcoin", "FME": "FME", "FMEX": "FMex", + "FMF": "Formosa Financial Token", "FMG": "FM Gallery", "FML": "FormulA", "FMT": "Finminity", @@ -6263,6 +6368,7 @@ "FORCE": "TriForce Tokens", "FORCEC": "Force Coin", "FORE": "FORE Protocol", + "FOREFRONT": "Forefront", "FOREST": "FOREST", "FORESTPLUS": "The Forbidden Forest", "FOREVER": "Forever Coin", @@ -6320,6 +6426,7 @@ "FRANK": "Frank", "FRANKLIN": "Franklin", "FRATT": "Frogg and Ratt", + "FRAX": "Frax Share", "FRAXLEGACY": "Frax", "FRAZ": "FrazCoin", "FRBK": " FreeBnk", @@ -6346,6 +6453,7 @@ "FREN": "FREN", "FRENC": "Frencoin", "FRENCH": "French On Base", + "FRENLY": "Frenly", "FRENPET": "Fren Pet", "FRENS": "Farmer Friends", "FRESCO": "Fresco", @@ -6498,6 +6606,7 @@ "FVT": "Finance Vote", "FWATCH": "Foliowatch", "FWB": "Friends With Benefits Pro", + "FWBV1": "Friends With Benefits Pro v1", "FWC": "Qatar 2022", "FWH": "FigureWifHat", "FWOG": "Fwog", @@ -6513,7 +6622,6 @@ "FXI": "FX1 Sports", "FXN": "FXN", "FXP": "FXPay", - "FXS": "Frax Share", "FXST": "FX Stock Token", "FXT": "Frog X Toad 6900", "FXUSD": "f(x) Protocol fxUSD", @@ -6541,7 +6649,8 @@ "GAIA": "Gaia Token", "GAIAE": "Gaia Everworld", "GAIAPLATFORM": "GAIA Platform", - "GAIN": "Gainfy", + "GAIN": "GriffinAI", + "GAINFY": "Gainfy", "GAINS": "Gains", "GAINSV1": "Gains v1", "GAJ": "Gaj Finance", @@ -6636,6 +6745,7 @@ "GBIT": "GravityBit", "GBK": "Goldblock", "GBL": "Global Token", + "GBNB": "GOLD BNB", "GBO": "Gabro.io", "GBOT": "GBOT", "GBOY": "GameBoy", @@ -6710,6 +6820,9 @@ "GENI": "Genius", "GENIE": "The Genie", "GENIEC": "GenieCoin", + "GENIESWAP": "GenieSwap", + "GENIESWAPV1": "GenieSwap v1", + "GENIFYART": "Genify ART", "GENIX": "Genix", "GENO": "GenomeFi", "GENOME": "GenomesDao", @@ -6793,7 +6906,7 @@ "GHNY": "Grizzly Honey", "GHO": "GHO", "GHOAD": "GhoadCoin", - "GHOST": "GhostbyMcAfee", + "GHOSTBY": "GhostbyMcAfee", "GHOSTCOIN": "GhostCoin", "GHOSTM": "GhostMarket", "GHOUL": "Ghoul Coin", @@ -6816,7 +6929,8 @@ "GIGACHAD": "GigaChad", "GIGAG": "GIGAGEEK", "GIGASWAP": "GigaSwap", - "GIGGLE": "Giggle Academy", + "GIGGLE": "Giggle Fund", + "GIGGLEACADEMY": "Giggle Academy", "GIGS": "Climate101", "GIGX": "GigXCoin", "GIKO": "Giko Cat", @@ -6958,6 +7072,7 @@ "GOAT": "Goatseus Maximus", "GOATAI": "GOAT AI", "GOATCOIN": "Goat", + "GOATED": "Goat Network", "GOATS": "GOATS", "GOATSE": "GOATSE", "GOB": "gob", @@ -6980,6 +7095,7 @@ "GOFX": "GooseFX", "GOG": "Guild of Guardians", "GOGLZ": "GOGGLES", + "GOGLZV1": "GOGGLES v1", "GOGO": "GOGO Finance", "GOGU": "GOGU Coin", "GOHOME": "GOHOME", @@ -6996,7 +7112,6 @@ "GOLDEN": "Golden Inu", "GOLDENC": "GoldenCat", "GOLDENG": "Golden Goose", - "GOLDENPACT": "GOLDEN PACT", "GOLDEX": "Goldex", "GOLDF": "Gold Fever", "GOLDMIN": "GoldMiner", @@ -7052,7 +7167,7 @@ "GOS": "Gosama", "GOSS": "GOSSIP-Coin", "GOST": "SoulCoin", - "GOT": "ParkinGo", + "GOT": "GOLDEN PACT", "GOTEM": "gotEM", "GOTG": "Got Guaranteed", "GOTTI": "Gotti Token", @@ -7137,6 +7252,7 @@ "GRIMEX": "SpaceGrime", "GRIN": "Grin", "GRIND": "Self Improving", + "GRIPPY": "GRIPPY", "GRL": "Greelance", "GRLC": "Garlicoin", "GRM": "GridMaster", @@ -7276,6 +7392,7 @@ "GVC": "Global Virtual Coin", "GVE": "Globalvillage Ecosystem", "GVL": "Greever", + "GVNR": "GVNR", "GVR": "Grove [OLD]", "GVRV1": "Grove v1", "GVT": "Genesis Vision", @@ -7346,8 +7463,8 @@ "HAMSTERB": "HamsterBase", "HAMSTR": "Hamster Coin", "HAN": "HanChain", - "HANA": "Hana", "HANACOIN": "Hanacoin", + "HANAETH": "Hana", "HANAETHCTO": "HANA", "HAND": "ShowHand", "HANDY": "Handy", @@ -7364,6 +7481,7 @@ "HARD": "Kava Lend", "HARE": "Hare Token", "HAREPLUS": "Hare Plus", + "HARIKO": "Inu Hariko", "HAROLD": "Harold", "HAROLDDUCK": "Harold", "HARPER": "Harper", @@ -7826,6 +7944,7 @@ "HYDRO": "Hydro", "HYDROMINER": "Hydrominer", "HYDROP": "Hydro Protocol", + "HYDX": "Hydrex", "HYGH": "HYGH", "HYN": "Hyperion", "HYP": "HyperX", @@ -7838,6 +7957,7 @@ "HYPERD": "HyperDAO", "HYPERFLY": "HyperFly", "HYPERIONX": "HyperionX", + "HYPERLEND": "HyperLend", "HYPERS": "HyperSpace", "HYPERSKIDS": "HYPERSKIDS", "HYPERSTAKE": "HyperStake", @@ -7851,6 +7971,7 @@ "HZ": "Horizon", "HZD": "HorizonDollar", "HZM": "HZM Coin", + "HZMV1": "HZM Coin v1", "HZN": "Horizon Protocol", "HZT": "HazMatCoin", "I0C": "I0coin", @@ -8025,13 +8146,14 @@ "INA": "pepeinatux", "INARI": "Inari", "INB": "Insight Chain", - "INC": "Incrementum", + "INC": "WAT Income token", "INCAKE": "InfinityCAKE", "INCEPT": "Incept", "INCNT": "Incent", "INCO": "InfinitiCoin", "INCORGNITO": "Incorgnito", "INCP": "InceptionCoin", + "INCREMENTUM": "Incrementum", "IND": "Indorse", "INDAY": "Independence Day", "INDEPENDENCEDAY": "Independence Day", @@ -8099,7 +8221,7 @@ "INTE": "InteractWith", "INTELLIQUE": "KARASOU", "INTER": "Inter Milan Fan Token", - "INTERN": "Interns", + "INTERN": "intern", "INTL": "Intelly", "INTO": "Influ Token", "INTR": "Interlay", @@ -8150,6 +8272,7 @@ "IP": "Story", "IP3": "Cripco", "IPAD": "Infinity Pad", + "IPAX": "Icopax", "IPC": "IPChain", "IPDN": "IPDnetwork", "IPL": "VouchForMe", @@ -8182,6 +8305,7 @@ "IRONBSC": "Iron BSC", "IRONCOIN": "IRONCOIN", "IRT": "Infinity Rocket", + "IRWA": "IncomRWA", "IRYDE": "iRYDE COIN", "ISA": "Islander", "ISDT": "ISTARDUST", @@ -8271,6 +8395,7 @@ "JADE": "Jade Protocol", "JADEC": "Jade Currency", "JAE": "JaeCoin", + "JAGER": "Jager Hunter", "JAGO": "Jagotrack", "JAI": "Japanese Akita Inu", "JAIHO": "Jaiho Crypto", @@ -8386,6 +8511,7 @@ "JNX": "Janex", "JNY": "JNY", "JOB": "Jobchain", + "JOBIESS": "JobIess", "JOBS": "JobsCoin", "JOBSEEK": "JobSeek AI", "JOC": "Speed Star JOC", @@ -8558,6 +8684,7 @@ "KASPY": "KASPY", "KASSIAHOME": "Kassia Home", "KASTA": "Kasta", + "KASTER": "King Aster", "KAT": "Karat", "KATA": "Katana Inu", "KATANA": "Katana Finance", @@ -8656,6 +8783,7 @@ "KFX": "KnoxFS", "KGB": "KGB protocol", "KGC": "Krypton Galaxy Coin", + "KGEN": "KGeN", "KGO": "Kiwigo", "KGT": "Kaby Gaming Token", "KHAI": "khai", @@ -8756,6 +8884,8 @@ "KLEVA": "KLEVA Protocol", "KLICKZIE": "Klickzie", "KLIMA": "KlimaDAO", + "KLINK": "Klink Finance", + "KLIP": "KLIP AI", "KLK": "Klickl Token", "KLKS": "Kalkulus", "KLKSYNC": "KLK Sync Protocol", @@ -8797,6 +8927,7 @@ "KNTO": "Kento", "KNU": "Keanu", "KNUT": "Knut From Zoo", + "KNUXX": "Knuxx Bully of ETH", "KNW": "Knowledge", "KOAI": "KOI", "KOALA": "KOALA", @@ -8974,9 +9105,10 @@ "L3USD": "L3USD", "L7": "L7", "LA": "Lagrange", - "LAB": "Labrys", + "LAB": "LAB", "LABORCRYPTO": "LaborCrypto", "LABRA": "LabraCoin", + "LABRYS": "Labrys", "LABS": "LABS Group", "LABUBU": "Labubu", "LABX": "Stakinglab", @@ -9146,6 +9278,7 @@ "LET": "LinkEye", "LETIT": "Letit", "LETS": "Let's WIN This", + "LETSBONK": "Let's BONK", "LETSGO": "Lets Go Brandon", "LEU": "CryptoLEU", "LEV": "Levante U.D. Fan Token", @@ -9215,8 +9348,9 @@ "LIFETOKEN": "LIFE", "LIFT": "Uplift", "LIGER": "Ligercoin", - "LIGHT": "Light", + "LIGHT": "LIGHT", "LIGHTCHAIN": "LightChain", + "LIGHTHEAVEN": "Light", "LIGHTSPEED": "LightSpeedCoin", "LIGMA": "Ligma Node", "LIGO": "Ligo", @@ -9280,6 +9414,7 @@ "LITION": "Lition", "LITT": "LitLab Games", "LITTLEGUY": "just a little guy", + "LITTLEMANYU": "Little Manyu", "LIV": "LiviaCoin", "LIVE": "TRONbetLive", "LIVENCOIN": "LivenPay", @@ -9320,6 +9455,7 @@ "LMR": "Lumerin", "LMT": "LIMITUS", "LMTOKEN": "LM Token", + "LMTS": "Limitless Official Token", "LMWR": "LimeWire Token", "LMXC": "LimonX", "LMY": "Lunch Money", @@ -9384,7 +9520,7 @@ "LONGM": "Long Mao", "LONGSHINE": "LongShine", "LOOBY": "Looby by Stephen Bliss", - "LOOK": "LookCoin", + "LOOK": "LOOK", "LOOKS": "LooksRare", "LOOM": "Loom Network", "LOOMV1": "Loom Network v1", @@ -9551,6 +9687,7 @@ "LUNG": "LunaGens", "LUNR": "Lunr Token", "LUPIN": "LUPIN", + "LUR": "Lumera", "LUS": "Luna Rush", "LUSD": "Liquity USD", "LUSH": "Lush AI", @@ -9590,7 +9727,8 @@ "LYL": "LoyalCoin", "LYM": "Lympo", "LYMPO": "Lympo Market Token", - "LYN": "LYNCHPIN Token", + "LYN": "Everlyn Token", + "LYNCHPIN": "LYNCHPIN Token", "LYNK": "Lynked.World", "LYNX": "Lynex", "LYNXCOIN": "Lynx", @@ -9609,6 +9747,7 @@ "LZM": "LoungeM", "LZUSDC": "LayerZero Bridged USDC (Fantom)", "M": "MemeCore", + "M0": "M by M^0", "M1": "SupplyShock", "M2O": "M2O Token", "M3M3": "M3M3", @@ -9672,6 +9811,7 @@ "MAI": "MAI", "MAIA": "Maia", "MAID": "MaidSafe Coin", + "MAIGA": "MAIGA Token", "MAIL": "CHAINMAIL", "MAINSTON": "Ston", "MAIV": "MAIV", @@ -9713,7 +9853,6 @@ "MANTI": "Mantis", "MANTLE": "Mantle", "MANUSAI": "Manus AI Agent", - "MANYU": "Little Manyu", "MANYUDOG": "MANYU", "MAO": "Mao", "MAOW": "MAOW", @@ -9891,6 +10030,7 @@ "MCONTENT": "MContent", "MCP": "My Crypto Play", "MCPC": "Mobile Crypto Pay Coin", + "MCQ": "Mecha Conquest", "MCRC": "MyCreditChain", "MCRN": "MacronCoin", "MCRT": "MagicCraft", @@ -10055,6 +10195,7 @@ "METADOGEV1": "MetaDoge V1", "METADOGEV2": "MetaDoge V2", "METAF": "MetaFastest", + "METAFIGHTER": "MetaFighter", "METAG": "MetagamZ", "METAGEAR": "MetaGear", "METAIVERSE": "MetAIverse", @@ -10072,6 +10213,7 @@ "METATR": "MetaTrace Utility Token", "METAUFO": "MetaUFO", "METAV": "METAVERSE", + "METAV1": "META v1", "METAVE": "Metaverse Convergence", "METAVERSEM": "MetaVerse-M", "METAVERSEX": "MetaverseX", @@ -10088,6 +10230,7 @@ "METO": "Metafluence", "METRO": "Metropoly", "METV1": "Metronome", + "METYA": "Metya Token", "MEU": "MetaUnit", "MEV": "MEVerse", "MEVETH": "mevETH", @@ -10100,8 +10243,9 @@ "MEX": "MEX", "MEXC": "MEXC Token", "MEXP": "MOJI Experience Points", + "MEY": "Mey Network", "MEZZ": "MEZZ Token", - "MF": "MetaFighter", + "MF": "Moonwalk Fitness", "MF1": "Meta Finance", "MFAM": "Moonwell Apollo", "MFC": "MFCoin", @@ -10130,7 +10274,7 @@ "MGLC": "MetaverseMGL", "MGLD": "Metallurgy", "MGN": "MagnaCoin", - "MGO": "MobileGo", + "MGO": "Mango Network", "MGOD": "MetaGods", "MGP": "MangoChain", "MGPT": "MotoGP Fan Token", @@ -10254,7 +10398,7 @@ "MIODIO": "MIODIOCOIN", "MIOTA": "IOTA", "MIR": "Mirror Protocol", - "MIRA": "Chains of War", + "MIRA": "Mira", "MIRACLE": "MIRACLE", "MIRACLETELE": "Miracle Tele", "MIRAI": "Project MIRAI", @@ -10328,6 +10472,7 @@ "MMAPS": "MapMetrics", "MMATIC": "Wrapped Polygon (Multichain)", "MMC": "Monopoly Millionaire Control", + "MMDAO": "MMDAO", "MMETA": "Duckie Land Multi Metaverse", "MMF": "MMFinance", "MMG": "Monopoly Millionaire Game", @@ -10397,6 +10542,7 @@ "MOBIC": "Mobility Coin", "MOBIE": "MobieCoin", "MOBILE": "Helium Mobile", + "MOBILEGO": "MobileGo", "MOBIU": "Mobius Money", "MOBU": "MOBU", "MOBX": "MOBIX", @@ -10461,6 +10607,7 @@ "MOMO2025": "momo", "MON": "MON Protocol", "MONA": "MonaCoin", + "MONAI": "MONAI", "MONAIZE": "Monaize", "MONARCH": "TRUEMONARCH", "MONART": "Monart", @@ -10620,12 +10767,14 @@ "MRBOB": "MR BOB COIN", "MRCH": "MerchDAO", "MRCR": "Mercor Finance", + "MRDN": "Meridian", "MRF": "Moonradar.finance", "MRFOX": "Mr.FOX Token", "MRHB": "MarhabaDeFi", "MRI": "Marshall Inu", "MRK": "MARK.SPACE", "MRKX": "Merck xStock", + "MRLN": "Merlin Token", "MRM": "Mr Mint", "MRN": "Mercoin", "MRNA": "Moderna", @@ -10666,6 +10815,7 @@ "MSQ": "MSquare Global", "MSR": "Masari", "MST": "Idle Mystic", + "MSTABLEUSD": "mStable USD", "MSTAR": "MerlinStarter", "MSTETH": "Eigenpie mstETH", "MSTO": "Millennium Sapphire", @@ -10753,7 +10903,7 @@ "MURA": "Murasaki", "MURATIAI": "MuratiAI", "MUSCAT": "MusCat", - "MUSD": "mStable USD", + "MUSD": "MetaMask USD", "MUSDC": "USD Coin (Multichain)", "MUSDCOIN": "MUSDcoin", "MUSE": "Muse DAO", @@ -10797,6 +10947,7 @@ "MWD": "MEW WOOF DAO", "MWETH": "Moonwell Flagship ETH (Morpho Vault)", "MWH": "Melania Wif Hat", + "MWXT": "MWX Token", "MX": "MX Token", "MXC": "Machine Xchange Coin", "MXD": "Denarius", @@ -10895,6 +11046,7 @@ "NATI": "IlluminatiCoin", "NATION": "Nation3", "NATIX": "NATIX Network", + "NATO": "The Nation Token", "NATOR": "Pepenator", "NAUSICAA": "Nausicaa-Inu", "NAUT": "Nautilus Coin", @@ -11028,6 +11180,7 @@ "NETRUM": "Netrum", "NETT": "Netswap", "NETVR": "Netvrk", + "NETX": "NetX Token", "NETZ": "MainnetZ", "NETZ1": "NETZERO", "NEU": "Neumark", @@ -11231,6 +11384,7 @@ "NOGS": "Noggles", "NOHAT": "DogWifNoHat", "NOIA": "Syntropy", + "NOICE": "noice", "NOIS": "Nois Network", "NOIZ": "NOIZ", "NOKA": "Noka Solana AI", @@ -11355,6 +11509,7 @@ "NUMBERS": "NumbersCoin", "NUMI": "NUMINE Token", "NUMITOR": "Numitor", + "NUNU": "nunu", "NUR": "Nurcoin", "NURA": "Nura Labs", "NUSA": "Nusa", @@ -11450,7 +11605,6 @@ "OBSI": "Obsidium", "OBSR": "OBSERVER Coin", "OBSUSHI": "Sushi (OmniBridge)", - "OBT": "Oobit", "OBTC": "Obitan Chain", "OBVIOUS": "OBVIOUS COIN", "OBX": "OpenBlox", @@ -11645,12 +11799,14 @@ "ONTACT": "OnTact", "ONUS": "ONUS", "ONX": "OnX.finance", + "OOB": "Oobit", "OOE": "OpenOcean", "OOFP": "OOFP", "OOGI": "OOGI", "OOKI": "Ooki", "OOKS": "Onooks", "OOM": "OomerBot", + "OOPS": "OOPS", "OORC": "Orbit Bridge Klaytn Orbit Chain", "OORT": "OORT", "OOT": "Utrum", @@ -11724,6 +11880,7 @@ "ORAO": "ORAO Network", "ORARE": "OneRare", "ORB": "KlayCity ORB", + "ORBD": "OrbitEdge", "ORBI": "Orbs", "ORBIS": "Orbis", "ORBIT": "Orbit Protocol", @@ -11816,6 +11973,7 @@ "OUSG": "OUSG", "OUT": "Netscouters", "OUTL": "Outlanders Token", + "OUTLAW": "OUTLAW Crypto Games", "OVATO": "Ovato", "OVC": "OVCODE", "OVER": "OverProtocol", @@ -11825,6 +11983,7 @@ "OVO": "OVO", "OVPP": "OpenVPP", "OVR": "Ovr", + "OWB": "OWB", "OWC": "Oduwa", "OWD": "Owlstand", "OWL": "OWL Token", @@ -11855,7 +12014,7 @@ "OZONE": "Ozone metaverse", "OZONEC": "Ozonechain", "OZP": "OZAPHYRE", - "P": "PUPS•WORLD•PEACE", + "P": "PoP Planet", "P1": "PEPE ONE", "P202": "Project 202", "P2P": "Sentinel", @@ -11900,6 +12059,7 @@ "PALMP": "PalmPay", "PALMV1": "PaLM AI v1", "PALMY": "Palmy", + "PALU": "Palu", "PAM": "PAM", "PAMBI": "Pambicoin", "PAMP": "PAMP Network", @@ -11912,6 +12072,7 @@ "PANDO": "Pando", "PANDOP": "PandoProject", "PANDORA": "Pandora", + "PANDU": "Pandu Pandas", "PANGEA": "PANGEA", "PANIC": "PanicSwap", "PANO": "PanoVerse", @@ -11944,6 +12105,7 @@ "PARETO": "Pareto Network Token", "PARI": "Paribus", "PARKGENE": "PARKGENE", + "PARKINGO": "ParkinGo", "PARLAY": "Parlay", "PARMA": "PARMA Fan Token", "PARQ": "PARQ", @@ -11980,6 +12142,7 @@ "PAXU": "Pax Unitas", "PAXW": "pax.world", "PAY": "TenX", + "PAYAI": "PayAI Network", "PAYB": "Paybswap", "PAYCENT": "Paycent", "PAYCON": "Paycon", @@ -12322,6 +12485,7 @@ "PINEYE": "PinEye", "PING": "CryptoPing", "PINGO": "PinGo", + "PINGPONG": "PINGPONG Token", "PINK": "PINK - The Panther", "PINKCOIN": "PinkCoin", "PINKSALE": "PinkSale", @@ -12334,6 +12498,7 @@ "PIO": "Pioneershares", "PIP": "Pip", "PIPA": "Pipa Coin", + "PIPE": "Pipe", "PIPI": "Pippi Finance", "PIPL": "PiplCoin", "PIPO": "Pipo", @@ -12376,6 +12541,7 @@ "PKF": "PolkaFoundry", "PKG": "PKG Token", "PKIN": "PUMPKIN", + "PKM": "Pockemy", "PKN": "Poken", "PKOIN": "Pocketcoin", "PKT": "PKT", @@ -12482,6 +12648,7 @@ "PNDR": "Pandora Finance", "PNFT": "Pawn My NFT", "PNG": "Pangolin", + "PNGDA": "Pengda Yellow Panda", "PNGN": "SpacePenguin", "PNIC": "Phoenic", "PNK": "Kleros", @@ -12499,7 +12666,8 @@ "POC": "POC Blockchain", "POCAT": "Polite Cat", "POCC": "POC Chain", - "POCHITA": "Pochita", + "POCHITA": "pochita", + "POCHITAV1": "Pochita", "POCKET": "XPocket", "POCO": "Pocoland", "POD": "Podo Point", @@ -12508,6 +12676,7 @@ "PODO": "Power Of Deep Ocean", "POE": "Portal Network", "POET": "Po.et", + "POFU": "POFU", "POG": "PolygonumOnline", "POGAI": "POGAI", "POGS": "POG", @@ -12603,6 +12772,7 @@ "PORT": "Port Finance", "PORT3": "Port3 Network", "PORTAL": "Portal", + "PORTALS": "Portals", "PORTALTOKEN": "Portal", "PORTO": "FC Porto", "PORTU": "Portuma", @@ -12679,6 +12849,7 @@ "PRG": "Paragon", "PRI": "PRIVATEUM INITIATIVE", "PRIA": "PRIA", + "PRICELESS": "Priceless", "PRICK": "Pickle Rick", "PRIDE": "Nomad Exiles", "PRIMAL": "PRIMAL", @@ -12819,6 +12990,7 @@ "PUMPAI": "PumpAI", "PUMPB": "Pump", "PUMPBTC": "pumpBTC", + "PUMPBTCXYZ": "PumpBTC", "PUMPFUNBAN": "Pump Fun Ban", "PUMPIT": "BOGDANOFF", "PUMPTRUMP": "PUMP TRUMP", @@ -12842,6 +13014,7 @@ "PUPPETS": "Puppets Coin", "PUPPIES": "I love puppies", "PUPS": "PUPS (Ordinals)", + "PUPSWORLD": "PUPS•WORLD•PEACE", "PUPU": "Pepe's Dog", "PURA": "Pura", "PURE": "Puriever", @@ -12918,6 +13091,7 @@ "Q2C": "QubitCoin", "QA": "Quantum Assets", "QAC": "Quasarcoin", + "QACE": "Qace Dynamics", "QAI": "QuantixAI", "QANX": "QANplatform", "QANXV2": "QANplatform v2", @@ -12968,6 +13142,7 @@ "QOOB": "QOOBER", "QORA": "QoraCoin", "QORPO": "QORPO WORLD", + "QPAY": "QPAY SOL", "QQBC": "QQBC IPFS BLOCKCHAIN", "QQQ": "Poseidon Network", "QQQF": "Standard Crypto Fund", @@ -12994,7 +13169,8 @@ "QTK": "QuantCheck", "QTL": "Quatloo", "QTLX": "Quantlytica", - "QTO": "QToken", + "QTO": "Quanto", + "QTOK": "QToken", "QTUM": "QTUM", "QTZ": "Quartz", "QU3": "QU3ai", @@ -13161,6 +13337,7 @@ "RCT": "RealChain", "RCX": "RedCrowCoin", "RD": "Round Dollar", + "RDAC": "Redacted Coin", "RDC": "Ordocoin", "RDD": "Reddcoin", "RDDT": "Reddit", @@ -13196,6 +13373,7 @@ "REALUSDV1": "Real USD v1", "REALUSDV2": "Real USD v2", "REALY": "Realy Metaverse", + "REALYN": "Real", "REAP": "ReapChain", "REAPER": "Grim Finance", "REAU": "Vira-lata Finance", @@ -13204,6 +13382,7 @@ "REBUS": "Rebuschain", "REC": "Rec Token (REC)", "RECA": "The Resistance Cat", + "RECALL": "Recall", "RECKOON": "Reckoon", "RECOM": "Recom", "RECON": "RECON", @@ -13244,6 +13423,7 @@ "REGEN": "Regen Network", "REGENT": "REGENT COIN", "REGI": "Resistance Girl", + "REGRET": "Regret", "REHA": "Resistance Hamster", "REHAB": "NFT Rehab", "REI": "REI Network", @@ -13357,7 +13537,6 @@ "RIBB": "Ribbit", "RIBBIT": "Ribbit", "RIC": "Riecoin", - "RICE": "DAOSquare Governance Token", "RICECOIN": "RiceCoin", "RICEFARM": "RiceFarm", "RICH": "GET RICH QUICK", @@ -13409,6 +13588,8 @@ "RITE": "ritestream", "RITO": "Ritocoin", "RITZ": "Ritz.Game", + "RIVER": "River", + "RIVERPTS": "River Point Reward Token", "RIVUS": "RivusDAO", "RIYA": "Etheriya", "RIZ": "Rivalz Network", @@ -13649,6 +13830,7 @@ "RVR": "Revolution VR", "RVST": "Revest Finance", "RVT": "Rivetz", + "RVV": "REVIVE", "RVX": "Rivex", "RWA": "Allo", "RWAECO": "RWA Ecosystem", @@ -13680,6 +13862,7 @@ "RYU": "The Blue Dragon", "RYZ": "Anryze", "RZR": "RazorCoin", + "RZTO": "RZTO Token", "RZUSD": "RZUSD", "RedFlokiCEO": "Red Floki CEO", "S": "Sonic Labs", @@ -13740,14 +13923,16 @@ "SAKAI": "Sakai Vault", "SAKATA": "Sakata Inu", "SAKE": "SakeToken", - "SAL": "SalPay", + "SAL": "Salvium", "SALD": "Salad", "SALE": "DxSale Network", "SALL": "Sallar", "SALLY": "SALAMANDER", "SALMAN": "Mohameme Bit Salman", "SALMON": "Salmon", + "SALPAY": "SalPay", "SALT": "Salt Lending", + "SALUTE": "Salute", "SAM": "Samsunspor Fan Token", "SAMA": "Moonsama", "SAMMY": "Samoyed", @@ -14232,6 +14417,7 @@ "SIFT": "Smart Investment Fund Token", "SIFU": "SIFU", "SIG": "Signal", + "SIGM": "Sigma", "SIGMA": "SIGMA", "SIGN": "Sign", "SIGNA": "Signa", @@ -14340,6 +14526,7 @@ "SKT": "Sukhavati Network", "SKU": "Sakura", "SKULL": "Pirate Blocks", + "SKUY": "Token Sekuya", "SKX": "SKPANAX", "SKY": "Sky", "SKYA": "Sekuya Multiverse", @@ -14394,7 +14581,7 @@ "SLRS": "Solrise Finance", "SLS": "SaluS", "SLST": "SmartLands", - "SLT": "Salute", + "SLT": "SLT", "SLUGDENG": "SLUG DENG", "SLUMBO": "SLUMBO", "SLVLUSD": "Staked Level USD", @@ -14558,6 +14745,7 @@ "SOFI": "RAI Finance", "SOFTCO": "SOFT COQ INU", "SOFTT": "Wrapped FTT (Sollet)", + "SOGNI": "Sogni AI", "SOGUR": "Sogur Currency", "SOH": "Stohn Coin", "SOHOT": "SOHOTRN", @@ -14630,6 +14818,7 @@ "SOLSCC": "sols", "SOLSPONGE": "Solsponge", "SOLT": "Soltalk AI", + "SOLTAN": "SOLTAN", "SOLTR": "SolTrump", "SOLV": "Solv Protocol", "SOLVBTC": "Solv Protocol SolvBTC", @@ -14803,6 +14992,7 @@ "SPRITZMOON": "SpritzMoon Crypto Token", "SPRKL": "Sparkle Loyalty", "SPROUT": "Sprout", + "SPRSTR": "SprotoStrategy", "SPRT": "Sportium", "SPRTS": "Sprouts", "SPRTZ": "SpritzCoin", @@ -14950,6 +15140,7 @@ "STAX": "Staxcoin", "STAY": "NFsTay", "STB": "stabble", + "STBL": "STBL Governance Token", "STBOT": "SolTradingBot", "STBTC": "Lorenzo stBTC", "STBU": "Stobox Token", @@ -15052,7 +15243,8 @@ "STREAMIT": "STREAMIT COIN", "STREETH": "STREETH", "STRI": "Strite", - "STRIKE": "Strike", + "STRIKE": "StrikeBit", + "STRIKETOKEN": "Strike", "STRIP": "Stripto", "STRK": "Starknet", "STRM": "StreamCoin", @@ -15062,6 +15254,7 @@ "STRONGX": "StrongX", "STRP": "Strips Finance", "STRS": "STARS", + "STRSZN": "Stream SZN", "STRUMP": "Super Trump", "STRX": "StrikeX", "STS": "SBank", @@ -15099,6 +15292,7 @@ "SUBA": "Yotsuba", "SUBAWU": "Subawu Token", "SUBF": "Super Best Friends", + "SUBHUB": "SUBHUB", "SUBS": "Substratum Network", "SUCR": "Sucre", "SUD": "Sudo Labs", @@ -15151,8 +15345,9 @@ "SUNTRON": "TRON MASCOT", "SUNV1": "Sun Token v1", "SUNWUKONG": "SunWukong", - "SUP": "Supcoin", + "SUP": "Superp", "SUP8EME": "SUP8EME Token", + "SUPCOIN": "Supcoin", "SUPE": "Supe Infinity", "SUPER": "SuperVerse", "SUPERBID": "SuperBid", @@ -15194,6 +15389,7 @@ "SVNN": "Savanna Haus", "SVPN": "Shadow Node", "SVS": "GivingToServices SVS", + "SVSA": "SavannaSurvival", "SVT": "Solvent", "SVTS": "Syncvault", "SVX": "Savix", @@ -15291,6 +15487,7 @@ "SYNCG": "SyncGPT", "SYNCN": "Sync Network", "SYNCO": "Synco", + "SYND": "Syndicate", "SYNDOG": "Synthesizer Dog", "SYNK": "Synk", "SYNLEV": "SynLev", @@ -15305,8 +15502,10 @@ "SYRAX": "Syrax AI", "SYRUP": "Syrup", "SYRUPUSDC": "SyrupUSDC", + "SYRUPUSDT": "Syrup USDT", "SYS": "Syscoin", "SZCB": "Zugacoin", + "SZN": "BNB SZN", "T": "Threshold Network Token", "T1": "Trump Mobile", "T23": "T23", @@ -15315,7 +15514,7 @@ "TAAS": "Token as a Service", "TAB": "MollyCoin", "TABOO": "Taboo Token", - "TAC": "Traceability Chain", + "TAC": "TAC", "TACC": "TACC", "TACHYON": "Tachyon Protocol", "TAD": "Tadpole", @@ -15411,6 +15610,7 @@ "TBEER": "TRON BEER", "TBFT": "Türkiye Basketbol Federasyon Token", "TBILL": "OpenEden T-Bills", + "TBILLV1": "OpenEden T-Bills v1", "TBIS": "TBIS token", "TBL": "Tombola", "TBR": "Tuebor", @@ -15490,6 +15690,7 @@ "TENDIE": "TendieSwap", "TENET": "TENET", "TENFI": "TEN", + "TENGE": "TENGE TENGE", "TENNET": "Tennet", "TENS": "TensorScan", "TENSHI": "Tenshi", @@ -15569,6 +15770,7 @@ "THEFARM": "FARM", "THEG": "The GameHub", "THEHARAMBE": "Harambe", + "THEINTERNS": "Interns", "THEM": "The Meta DAO", "THEMIS": "Themis", "THEN": "THENA", @@ -15639,6 +15841,7 @@ "TIM": "TIMTIM GAMES", "TIME": "Chrono.tech", "TIMEFUN": "timefun", + "TIMELESS": "Timeless", "TIMES": "DARKTIMES", "TIMESW": "Timeswap", "TIMI": "This Is My Iguana", @@ -15787,7 +15990,8 @@ "TOPIA": "Hytopia", "TOPN": "TOP Network", "TOR": "TOR", - "TORA": "TORA NEKO", + "TORA": "Tensora", + "TORAN": "TORA NEKO", "TORCH": "Hercules Token", "TORE": "Toreus Finance", "TORG": "TORG", @@ -15844,6 +16048,7 @@ "TRAC": "OriginTrail", "TRACE": "Trace Network Labs", "TRACEA": "Trace AI", + "TRACEABILITY": "Traceability Chain", "TRACKEDBIO": "TrackedBio", "TRACN": "trac (Ordinals)", "TRADE": "Polytrade", @@ -15860,6 +16065,7 @@ "TRANQ": "Tranquil Finance", "TRANS": "Trans Pepe", "TRANSFER": "TransferCoin", + "TRASH": "TrashCoin", "TRAT": "Tratok", "TRAVA": "Trava Finance", "TRAXIA": "Traxia Membership Token", @@ -16002,8 +16208,9 @@ "TRUST": "TrustDAO", "TRUSTNFT": "TrustNFT", "TRUT": "Truth", - "TRUTH": "TruthGPT", + "TRUTH": "Swarm Network", "TRUTHFI": "Truthfi", + "TRUTHGPT": "TruthGPT", "TRV": "TrustVerse", "TRVC": "Trivechain", "TRVL": "TRVL", @@ -16037,6 +16244,7 @@ "TSR": "Tesra", "TST": "Test", "TSTAI": "Test AI", + "TSTON": "Tonstakers TON", "TSTS": "Test", "TSUBASAUT": "TSUBASA Utility Token", "TSUGT": "Captain Tsubasa", @@ -16078,6 +16286,7 @@ "TURBOS": "Turbos Finance", "TURBOW": "Turbo Wallet", "TURT": "TurtSat", + "TURTLE": "Turtle", "TUS": "Treasure Under Sea", "TUSD": "True USD", "TUSDV1": "True USD v1", @@ -16142,14 +16351,13 @@ "TZKI": "Tsuzuki Inu", "TZPEPE": "Tezos Pepe", "TZU": "Sun Tzu", - "U": "Unidef", "U2U": "U2U Network", "U8D": "Universal Dollar", "UA1": "UA1", "UAEC": "United Arab Emirates Coin", "UAHG": "UAHg", "UAT": "UltrAlpha", - "UB": "UBit Token", + "UB": "Unibase", "UBA": "Unbox.Art", "UBC": "Universal Basic Compute", "UBCOIN": "Ubcoin", @@ -16158,6 +16366,7 @@ "UBI": "Universal Basic Income", "UBIQ": "Ubiqoin", "UBIT": "UBIT", + "UBITTOKEN": "UBit Token", "UBQ": "Ubiq", "UBT": "UniBright", "UBTC": "UnitedBitcoin", @@ -16169,11 +16378,12 @@ "UCA": "UCA Coin", "UCAP": "Unicap.finance", "UCASH": "U.CASH", + "UCCOIN": "UC Coin", "UCG": "Universe Crystal Gene", "UCH": "UChain", "UCJL": "Utility Cjournal", "UCM": "UCROWDME", - "UCN": "UC Coin", + "UCN": "UCHAIN", "UCO": "Uniris", "UCOIN": "Ucoin", "UCON": "YouCoin Metaverse", @@ -16272,7 +16482,9 @@ "UNIBTC": "uniBTC", "UNIC": "Unicly", "UNICE": "UNICE", + "UNICEF": "united normies in crypto extending funds", "UNICORN": "UNICORN Token", + "UNIDEF": "Unidef", "UNIDEXAI": "UniDexAI", "UNIDX": "UniDex", "UNIDXV1": "UniDex v1", @@ -16297,6 +16509,7 @@ "UNITARYSTATUS": "UnitaryStatus Dollar", "UNITE": "Unite", "UNITED": "UnitedCoins", + "UNITPROV2": "Unit Protocol New", "UNITRADE": "UniTrade", "UNITREEAI": "Unitree G1 AI", "UNITREEDOG": "Unitree AI Robot Dog", @@ -16361,11 +16574,13 @@ "USC": "Ultimate Secure Cash", "USCC": "USC", "USCOIN": "USCoin", + "USCR": "United States Crypto Reserve", "USD0": "Usual", "USD1": "World Liberty Financial USD", "USD3": "Web 3 Dollar", "USDA": "USDa", "USDACC": "USDA", + "USDAI": "USDai", "USDAP": "Bond Appetite USD", "USDB": "USD Bancor", "USDBC": "Bridged USDC", @@ -16421,6 +16636,7 @@ "USDUC": "Unstable Coin", "USDV": "Verified USD", "USDW": "USD DWIN", + "USDWON": "Won Chang", "USDX": "USDX Stablecoin", "USDXL": "Last USD", "USDY": "Ondo US Dollar Yield", @@ -16471,6 +16687,7 @@ "UTMDOGE": "UltramanDoge", "UTNP": "Universa", "UTON": "uTON", + "UTOPIA": "UCOIN", "UTT": "United Traders Token", "UTU": "UTU Protocol", "UTX": "UTIX", @@ -16485,6 +16702,7 @@ "UWUCOIN": "uwu", "UX": "Umee", "UXLINK": "UXLINK", + "UXLINKV1": "UXLINK v1", "UXOS": "UXOS", "UXP": "UXD Protocol", "UZUMAKI": "Uzumaki Inu", @@ -16508,6 +16726,7 @@ "VALORBIT": "Valorbit", "VALU": "Value", "VALUE": "Value Liquidity", + "VALYR": "Valyr", "VAMPIRE": "Vampire Inu", "VAN": "Vanspor Token", "VANA": "Vana", @@ -16605,6 +16824,7 @@ "VERA": "Vera", "VERI": "Veritaseum", "VERIC": "VeriCoin", + "VERIFY": "Verify", "VERO": "VEROPAD", "VERSA": "Versa Token", "VERSACE": "VERSACE", @@ -16628,9 +16848,12 @@ "VFIL": "Venus Filecoin", "VFOX": "VFOX", "VFT": "Value Finance", + "VFY": "zkVerify", + "VFYV1": "Verify Token", "VG": "Viu Ganhou", "VGO": "Vagabond", "VGX": "Voyager Token", + "VGXV1": "Voyager v1", "VHC": "Vault Hill City", "VI": "Vid", "VIA": "Octavia AI", @@ -16693,6 +16916,7 @@ "VITALIK": "OFFICIAL VITALIK", "VITAMINS": "Vitamins", "VITARNA": "VitaRNA", + "VITASTEM": "VitaStem", "VITE": "VITE", "VITEX": "ViteX Coin", "VITRA": "Vitra Studios", @@ -16737,6 +16961,7 @@ "VNO": "Veno Finance", "VNST": "VNST Stablecoin", "VNT": "VNT Chain", + "VNTR": "Venture Mind AI", "VNTW": "Value Network Token", "VNX": "VisionX", "VNXAU": "VNX Gold", @@ -16776,6 +17001,7 @@ "VOYACOIN": "Voyacoin", "VP": "Torah Network", "VPAD": "VLaunch", + "VPAY": "VPay by Virtuals", "VPK": "Vulture Peak", "VPND": "VaporNodes", "VPP": "Virtue Poker Points", @@ -16786,7 +17012,9 @@ "VR": "Victoria", "VR1": "VR1", "VRA": "Verasity", + "VRAV1": "Verasity v1", "VRC": "Virtual Coin", + "VRFY": "VERIFY", "VRGW": "Virtual Reality Game World", "VRH": "Versailles Heroes", "VRL": "Virtual X", @@ -16974,6 +17202,7 @@ "WBT": "WhiteBIT Token", "WBTC": "Wrapped Bitcoin", "WBTCWXG": "WBTC-WXG", + "WBULL": "BNB Wallstreet Bull", "WBX": "WiBX", "WCA": "WCAPES", "WCANTO": "Wrapped CANTO", @@ -17034,6 +17263,7 @@ "WEL": "Welsh Corgi", "WELA": "Wrapped Elastos", "WELD": "Weld", + "WELF": "welf", "WELL": "Moonwell", "WELL3": "WELL3", "WELLTOKEN": "Well", @@ -17069,6 +17299,7 @@ "WFAI": "WaifuAI", "WFBTC": "Wrapped Fantom Bitcoin", "WFDP": "WFDP", + "WFI": "WeFi", "WFIL": "Wrapped Filecoin", "WFLAMA": "WIFLAMA", "WFLOW": "Wrapped Flow", @@ -17208,6 +17439,7 @@ "WLUNA": "Wrapped LUNA Token", "WLUNC": "Wrapped LUNA Classic", "WLXT": "Wallex Token", + "WM": "WrappedM by M^0", "WMATIC": "Wrapped Matic", "WMB": "WatermelonBlock", "WMC": "Wrapped MistCoin", @@ -17343,6 +17575,7 @@ "WSI": "WeSendit", "WSIENNA": "Sienna ERC20", "WSM": "Wall Street Memes", + "WSOL": "Wrapped Solana", "WSPP": "Wolf Safe Poor People", "WSTA": "Wrapped Statera", "WSTETH": "Lido wstETH", @@ -17378,6 +17611,7 @@ "WUK": "WUKONG", "WUKONG": "Sun Wukong", "WULFY": "Wulfy", + "WUM": "Unicorn Meat", "WUSD": "Worldwide USD", "WUST": "Wrapped UST Token", "WVG0": "Wrapped Virgin Gen-0 CryptoKittties", @@ -17397,6 +17631,7 @@ "WXDAI": "Wrapped XDAI", "WXDC": "Wrapped XDC", "WXM": "WeatherXM", + "WXPL": "Wrapped XPL", "WXRP": "Wrapped XRP", "WXT": "WXT", "WXTZ": "Wrapped Tezos", @@ -17434,6 +17669,7 @@ "XALGO": "Wrapped ALGO", "XALPHA": "XAlpha AI", "XAMP": "Antiample", + "XAN": "Anoma", "XAND": "Xandeum", "XANK": "Xank", "XAP": "Apollon", @@ -17453,7 +17689,7 @@ "XBB": "BrickBlock", "XBC": "BitcoinPlus", "XBE": "XBE Token", - "XBG": "BitGrin", + "XBG": "XBorg Token", "XBI": "Bitcoin Incognito", "XBL": "Billionaire Token", "XBLAZE": "Trailblaze", @@ -17503,6 +17739,7 @@ "XCT": "C-Bits", "XCUR": "Curate", "XCV": "XCarnival", + "XCX": "Xeleb AI", "XCXT": "CoinonatX", "XD": "Data Transaction Token", "XDAG": "Dagger", @@ -17621,6 +17858,7 @@ "XMX": "XMax", "XMY": "MyriadCoin", "XNA": "Neurai", + "XNAP": "SNAPX", "XNB": "Xeonbit", "XNC": "Xenios", "XNET": "XNET Mobile", @@ -17662,6 +17900,7 @@ "XPH": "PharmaCoin", "XPHX": "PhoenixCo Token", "XPI": "XPi", + "XPIN": "XPIN Token", "XPL": "Plasma", "XPLA": "XPLA", "XPLL": "ParallelChain", @@ -17820,8 +18059,10 @@ "YAXIS": "yAxis", "YAY": "YAY Games", "YAYCOIN": "YAYcoin", + "YB": "Yield Basis", "YBC": "YbCoin", "YBDBD": "YBDBD", + "YBNB": "Yellow BNB 4", "YBO": "Young Boys Fan Token", "YBR": "YieldBricks", "YCC": "Yuan Chain Coin", @@ -17931,7 +18172,7 @@ "YTJIA": "Jia Yueting", "YTN": "YENTEN", "YTS": "YetiSwap", - "YU": "BOUNTYKINDS", + "YU": "Yala stablecoin", "YUANG": "Yuang Coin", "YUCHEN": "Sun Yuchen", "YUCJ": "Yu Coin", @@ -17991,6 +18232,7 @@ "ZBC": "Zebec Protocol", "ZBCN": "Zebec Network", "ZBIT": "zbit", + "ZBT": "ZEROBASE", "ZBU": "Zeebu", "ZBUV1": "ZEEBU v1", "ZCC": "ZCC Coin", @@ -18037,6 +18279,7 @@ "ZENI": "Zennies", "ZENIQ": "Zeniq Coin", "ZENITH": "Zenith Chain", + "ZENIX": "ZENIX", "ZENPROTOCOL": "Zen Protocol", "ZENQ": "Zenqira", "ZENT": "Zentry", @@ -18044,6 +18287,7 @@ "ZEP": "Zeppelin Dao", "ZEPH": "Zephyr Protocol", "ZER": "Zero", + "ZERA": "ZERA", "ZERC": "zkRace Coin", "ZEREBRO": "Zerebro", "ZERO": "ZeroLend", @@ -18235,5 +18479,7 @@ "redBUX": "redBUX", "sOHM": "Staked Olympus", "vXDEFI": "vXDEFI", - "wsOHM": "Wrapped Staked Olympus" + "wsOHM": "Wrapped Staked Olympus", + "修仙": "修仙", + "币安人生": "币安人生" } diff --git a/apps/api/src/dependencies.ts b/apps/api/src/dependencies.ts new file mode 100644 index 000000000..acb7af382 --- /dev/null +++ b/apps/api/src/dependencies.ts @@ -0,0 +1,3 @@ +// Dependencies required by .config/prisma.ts in Docker container +import 'dotenv'; +import 'dotenv-expand'; diff --git a/apps/api/src/models/interfaces/rule-settings.interface.ts b/apps/api/src/models/interfaces/rule-settings.interface.ts index 377bab52b..ff22650ca 100644 --- a/apps/api/src/models/interfaces/rule-settings.interface.ts +++ b/apps/api/src/models/interfaces/rule-settings.interface.ts @@ -1,3 +1,4 @@ export interface RuleSettings { isActive: boolean; + locale: string; } diff --git a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts index 0601eea9a..51c808b25 100644 --- a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts +++ b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts @@ -121,9 +121,14 @@ export class AccountClusterRiskCurrentInvestment extends Rule { }); } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { + public getSettings({ + baseCurrency, + locale, + xRayRules + }: UserSettings): Settings { return { baseCurrency, + locale, isActive: xRayRules?.[this.getKey()]?.isActive ?? true, thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.5 }; diff --git a/apps/api/src/models/rules/account-cluster-risk/single-account.ts b/apps/api/src/models/rules/account-cluster-risk/single-account.ts index 8890bb767..0e07a9dc6 100644 --- a/apps/api/src/models/rules/account-cluster-risk/single-account.ts +++ b/apps/api/src/models/rules/account-cluster-risk/single-account.ts @@ -72,8 +72,9 @@ export class AccountClusterRiskSingleAccount extends Rule { }); } - public getSettings({ xRayRules }: UserSettings): RuleSettings { + public getSettings({ locale, xRayRules }: UserSettings): RuleSettings { return { + locale, isActive: xRayRules?.[this.getKey()]?.isActive ?? true }; } diff --git a/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts b/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts index dab55413e..9a6f9dacb 100644 --- a/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts +++ b/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts @@ -109,9 +109,14 @@ export class AssetClassClusterRiskEquity extends Rule { }); } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { + public getSettings({ + baseCurrency, + locale, + xRayRules + }: UserSettings): Settings { return { baseCurrency, + locale, isActive: xRayRules?.[this.getKey()]?.isActive ?? true, thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.82, thresholdMin: xRayRules?.[this.getKey()]?.thresholdMin ?? 0.78 diff --git a/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts b/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts index f793ec16f..70cdb63c8 100644 --- a/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts +++ b/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts @@ -109,9 +109,14 @@ export class AssetClassClusterRiskFixedIncome extends Rule { }); } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { + public getSettings({ + baseCurrency, + locale, + xRayRules + }: UserSettings): Settings { return { baseCurrency, + locale, isActive: xRayRules?.[this.getKey()]?.isActive ?? true, thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.22, thresholdMin: xRayRules?.[this.getKey()]?.thresholdMin ?? 0.18 diff --git a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts index 2c2b6c4d6..273c98e35 100644 --- a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts +++ b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts @@ -97,9 +97,14 @@ export class CurrencyClusterRiskBaseCurrencyCurrentInvestment extends Rule { }); } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { + public getSettings({ + baseCurrency, + locale, + xRayRules + }: UserSettings): Settings { return { baseCurrency, + locale, isActive: xRayRules?.[this.getKey()]?.isActive ?? true, thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.5 }; diff --git a/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts b/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts index 7ca7a2d76..fa4f80d40 100644 --- a/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts +++ b/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts @@ -104,9 +104,14 @@ export class EconomicMarketClusterRiskDevelopedMarkets extends Rule { }); } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { + public getSettings({ + baseCurrency, + locale, + xRayRules + }: UserSettings): Settings { return { baseCurrency, + locale, isActive: xRayRules?.[this.getKey()]?.isActive ?? true, thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.72, thresholdMin: xRayRules?.[this.getKey()]?.thresholdMin ?? 0.68 diff --git a/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts b/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts index cbf9f98b7..1414b53ed 100644 --- a/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts +++ b/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts @@ -104,9 +104,14 @@ export class EconomicMarketClusterRiskEmergingMarkets extends Rule { }); } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { + public getSettings({ + baseCurrency, + locale, + xRayRules + }: UserSettings): Settings { return { baseCurrency, + locale, isActive: xRayRules?.[this.getKey()]?.isActive ?? true, thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.32, thresholdMin: xRayRules?.[this.getKey()]?.thresholdMin ?? 0.28 diff --git a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts index d97805fa6..2129f438b 100644 --- a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts +++ b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts @@ -59,9 +59,14 @@ export class EmergencyFundSetup extends Rule { }); } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { + public getSettings({ + baseCurrency, + locale, + xRayRules + }: UserSettings): Settings { return { baseCurrency, + locale, isActive: xRayRules?.[this.getKey()]?.isActive ?? true }; } diff --git a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts index 93c9aafd3..c5448a277 100644 --- a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts +++ b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts @@ -82,9 +82,14 @@ export class FeeRatioInitialInvestment extends Rule { }); } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { + public getSettings({ + baseCurrency, + locale, + xRayRules + }: UserSettings): Settings { return { baseCurrency, + locale, isActive: xRayRules?.[this.getKey()]?.isActive ?? true, thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.01 }; diff --git a/apps/api/src/models/rules/liquidity/buying-power.ts b/apps/api/src/models/rules/liquidity/buying-power.ts index 539d0a728..2cd4d6fee 100644 --- a/apps/api/src/models/rules/liquidity/buying-power.ts +++ b/apps/api/src/models/rules/liquidity/buying-power.ts @@ -40,7 +40,9 @@ export class BuyingPower extends Rule { languageCode: this.getLanguageCode(), placeholders: { baseCurrency: ruleSettings.baseCurrency, - thresholdMin: ruleSettings.thresholdMin + thresholdMin: ruleSettings.thresholdMin.toLocaleString( + ruleSettings.locale + ) } }), value: false @@ -53,7 +55,9 @@ export class BuyingPower extends Rule { languageCode: this.getLanguageCode(), placeholders: { baseCurrency: ruleSettings.baseCurrency, - thresholdMin: ruleSettings.thresholdMin + thresholdMin: ruleSettings.thresholdMin.toLocaleString( + ruleSettings.locale + ) } }), value: true @@ -86,9 +90,14 @@ export class BuyingPower extends Rule { }); } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { + public getSettings({ + baseCurrency, + locale, + xRayRules + }: UserSettings): Settings { return { baseCurrency, + locale, isActive: xRayRules?.[this.getKey()]?.isActive ?? true, thresholdMin: xRayRules?.[this.getKey()]?.thresholdMin ?? 0 }; diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts b/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts index 5d6cc999a..1242df759 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts @@ -94,9 +94,14 @@ export class RegionalMarketClusterRiskAsiaPacific extends Rule { }); } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { + public getSettings({ + baseCurrency, + locale, + xRayRules + }: UserSettings): Settings { return { baseCurrency, + locale, isActive: xRayRules?.[this.getKey()]?.isActive ?? true, thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.03, thresholdMin: xRayRules?.[this.getKey()]?.thresholdMin ?? 0.02 diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts b/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts index fa13a9e57..8486d843b 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts @@ -96,9 +96,14 @@ export class RegionalMarketClusterRiskEmergingMarkets extends Rule { }); } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { + public getSettings({ + baseCurrency, + locale, + xRayRules + }: UserSettings): Settings { return { baseCurrency, + locale, isActive: xRayRules?.[this.getKey()]?.isActive ?? true, thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.12, thresholdMin: xRayRules?.[this.getKey()]?.thresholdMin ?? 0.08 diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts b/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts index 3bbe7af84..459848db4 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts @@ -94,9 +94,14 @@ export class RegionalMarketClusterRiskEurope extends Rule { }); } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { + public getSettings({ + baseCurrency, + locale, + xRayRules + }: UserSettings): Settings { return { baseCurrency, + locale, isActive: xRayRules?.[this.getKey()]?.isActive ?? true, thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.15, thresholdMin: xRayRules?.[this.getKey()]?.thresholdMin ?? 0.11 diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts b/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts index 952e14795..d9c1cff6b 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts @@ -94,9 +94,14 @@ export class RegionalMarketClusterRiskJapan extends Rule { }); } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { + public getSettings({ + baseCurrency, + locale, + xRayRules + }: UserSettings): Settings { return { baseCurrency, + locale, isActive: xRayRules?.[this.getKey()]?.isActive ?? true, thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.06, thresholdMin: xRayRules?.[this.getKey()]?.thresholdMin ?? 0.04 diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts b/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts index f022ecff9..6180a2cc5 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts @@ -94,9 +94,14 @@ export class RegionalMarketClusterRiskNorthAmerica extends Rule { }); } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { + public getSettings({ + baseCurrency, + locale, + xRayRules + }: UserSettings): Settings { return { baseCurrency, + locale, isActive: xRayRules?.[this.getKey()]?.isActive ?? true, thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.69, thresholdMin: xRayRules?.[this.getKey()]?.thresholdMin ?? 0.65 diff --git a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts index 1e8f7eefa..1e631f8c8 100644 --- a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts +++ b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts @@ -8,8 +8,8 @@ import { GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { - IDataProviderHistoricalResponse, - IDataProviderResponse + DataProviderHistoricalResponse, + DataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; @@ -23,7 +23,7 @@ import { DataSource, SymbolProfile } from '@prisma/client'; import * as Alphavantage from 'alphavantage'; import { format, isAfter, isBefore, parse } from 'date-fns'; -import { IAlphaVantageHistoricalResponse } from './interfaces/interfaces'; +import { AlphaVantageHistoricalResponse } from './interfaces/interfaces'; @Injectable() export class AlphaVantageService implements DataProviderInterface { @@ -68,11 +68,11 @@ export class AlphaVantageService implements DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; }> { try { const historicalData: { - [symbol: string]: IAlphaVantageHistoricalResponse[]; + [symbol: string]: AlphaVantageHistoricalResponse[]; } = await this.alphaVantage.crypto.daily( symbol .substring(0, symbol.length - DEFAULT_CURRENCY.length) @@ -81,7 +81,7 @@ export class AlphaVantageService implements DataProviderInterface { ); const response: { - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; } = {}; response[symbol] = {}; @@ -115,7 +115,7 @@ export class AlphaVantageService implements DataProviderInterface { } public async getQuotes({}: GetQuotesParams): Promise<{ - [symbol: string]: IDataProviderResponse; + [symbol: string]: DataProviderResponse; }> { return {}; } diff --git a/apps/api/src/services/data-provider/alpha-vantage/interfaces/interfaces.ts b/apps/api/src/services/data-provider/alpha-vantage/interfaces/interfaces.ts index d954f3a75..897351df1 100644 --- a/apps/api/src/services/data-provider/alpha-vantage/interfaces/interfaces.ts +++ b/apps/api/src/services/data-provider/alpha-vantage/interfaces/interfaces.ts @@ -1 +1 @@ -export interface IAlphaVantageHistoricalResponse {} +export interface AlphaVantageHistoricalResponse {} diff --git a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts index 561d7d6db..e06cb6ab3 100644 --- a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts +++ b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts @@ -8,8 +8,8 @@ import { GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { - IDataProviderHistoricalResponse, - IDataProviderResponse + DataProviderHistoricalResponse, + DataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; @@ -109,7 +109,7 @@ export class CoinGeckoService implements DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; }> { try { const { error, prices, status } = await fetch( @@ -133,7 +133,7 @@ export class CoinGeckoService implements DataProviderInterface { } const result: { - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; } = { [symbol]: {} }; @@ -166,8 +166,8 @@ export class CoinGeckoService implements DataProviderInterface { public async getQuotes({ requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols - }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }> { - const response: { [symbol: string]: IDataProviderResponse } = {}; + }: GetQuotesParams): Promise<{ [symbol: string]: DataProviderResponse }> { + const response: { [symbol: string]: DataProviderResponse } = {}; if (symbols.length <= 0) { return response; diff --git a/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts b/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts index 8b885c013..1e297b93b 100644 --- a/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts @@ -4,7 +4,7 @@ import { Holding } from '@ghostfolio/common/interfaces'; import { Country } from '@ghostfolio/common/interfaces/country.interface'; import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; -import { Injectable } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import { SymbolProfile } from '@prisma/client'; import { countries } from 'countries-list'; @@ -202,7 +202,12 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { return undefined; }) - .catch(() => { + .catch(({ message }) => { + Logger.error( + `Failed to search Trackinsight symbol for ${symbol} (${message})`, + 'TrackinsightDataEnhancerService' + ); + return undefined; }); } 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 6d6054287..53ef5c5e4 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -2,8 +2,8 @@ import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.s import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { - IDataProviderHistoricalResponse, - IDataProviderResponse + DataProviderHistoricalResponse, + DataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; @@ -215,10 +215,10 @@ export class DataProviderService implements OnModuleInit { from: Date, to: Date ): Promise<{ - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; }> { let response: { - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; } = {}; if (isEmpty(aItems) || !isValid(from) || !isValid(to)) { @@ -284,7 +284,7 @@ export class DataProviderService implements OnModuleInit { from: Date; to: Date; }): Promise<{ - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; }> { for (const { currency, rootCurrency } of DERIVED_CURRENCIES) { if ( @@ -317,11 +317,11 @@ export class DataProviderService implements OnModuleInit { ); const result: { - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; } = {}; const promises: Promise<{ - data: { [date: string]: IDataProviderHistoricalResponse }; + data: { [date: string]: DataProviderHistoricalResponse }; symbol: string; }>[] = []; for (const { dataSource, symbol } of assetProfileIdentifiers) { @@ -329,7 +329,7 @@ export class DataProviderService implements OnModuleInit { if (dataProvider.canHandle(symbol)) { if (symbol === `${DEFAULT_CURRENCY}USX`) { const data: { - [date: string]: IDataProviderHistoricalResponse; + [date: string]: DataProviderHistoricalResponse; } = {}; for (const date of eachDayOfInterval({ end: to, start: from })) { @@ -399,10 +399,10 @@ export class DataProviderService implements OnModuleInit { useCache?: boolean; user?: UserWithSettings; }): Promise<{ - [symbol: string]: IDataProviderResponse; + [symbol: string]: DataProviderResponse; }> { const response: { - [symbol: string]: IDataProviderResponse; + [symbol: string]: DataProviderResponse; } = {}; const startTimeTotal = performance.now(); @@ -716,7 +716,7 @@ export class DataProviderService implements OnModuleInit { }: { allData: { data: { - [date: string]: IDataProviderHistoricalResponse; + [date: string]: DataProviderHistoricalResponse; }; symbol: string; }[]; @@ -728,7 +728,7 @@ export class DataProviderService implements OnModuleInit { })?.data; const data: { - [date: string]: IDataProviderHistoricalResponse; + [date: string]: DataProviderHistoricalResponse; } = {}; for (const date in rootData) { diff --git a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts index c18ec193f..b837b2e6f 100644 --- a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts +++ b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts @@ -8,8 +8,8 @@ import { GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { - IDataProviderHistoricalResponse, - IDataProviderResponse + DataProviderHistoricalResponse, + DataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { @@ -89,7 +89,7 @@ export class EodHistoricalDataService implements DataProviderInterface { symbol, to }: GetDividendsParams): Promise<{ - [date: string]: IDataProviderHistoricalResponse; + [date: string]: DataProviderHistoricalResponse; }> { symbol = this.convertToEodSymbol(symbol); @@ -99,7 +99,7 @@ export class EodHistoricalDataService implements DataProviderInterface { try { const response: { - [date: string]: IDataProviderHistoricalResponse; + [date: string]: DataProviderHistoricalResponse; } = {}; const historicalResult = await fetch( @@ -141,7 +141,7 @@ export class EodHistoricalDataService implements DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; }> { symbol = this.convertToEodSymbol(symbol); @@ -198,8 +198,8 @@ export class EodHistoricalDataService implements DataProviderInterface { public async getQuotes({ requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols - }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }> { - const response: { [symbol: string]: IDataProviderResponse } = {}; + }: GetQuotesParams): Promise<{ [symbol: string]: DataProviderResponse }> { + const response: { [symbol: string]: DataProviderResponse } = {}; if (symbols.length <= 0) { return response; diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts index 689f59fec..0caad99ca 100644 --- a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts +++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts @@ -9,8 +9,8 @@ import { GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { - IDataProviderHistoricalResponse, - IDataProviderResponse + DataProviderHistoricalResponse, + DataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { @@ -245,7 +245,7 @@ export class FinancialModelingPrepService implements DataProviderInterface { try { const response: { - [date: string]: IDataProviderHistoricalResponse; + [date: string]: DataProviderHistoricalResponse; } = {}; const dividends = await fetch( @@ -289,11 +289,11 @@ export class FinancialModelingPrepService implements DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; }> { const MAX_YEARS_PER_REQUEST = 5; const result: { - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; } = { [symbol]: {} }; @@ -353,8 +353,8 @@ export class FinancialModelingPrepService implements DataProviderInterface { public async getQuotes({ requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols - }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }> { - const response: { [symbol: string]: IDataProviderResponse } = {}; + }: GetQuotesParams): Promise<{ [symbol: string]: DataProviderResponse }> { + const response: { [symbol: string]: DataProviderResponse } = {}; if (symbols.length <= 0) { return response; diff --git a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts index ca8d72827..9928af8eb 100644 --- a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts @@ -9,8 +9,8 @@ import { GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { - IDataProviderHistoricalResponse, - IDataProviderResponse + DataProviderHistoricalResponse, + DataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { @@ -111,10 +111,10 @@ export class GhostfolioService implements DataProviderInterface { symbol, to }: GetDividendsParams): Promise<{ - [date: string]: IDataProviderHistoricalResponse; + [date: string]: DataProviderHistoricalResponse; }> { let dividends: { - [date: string]: IDataProviderHistoricalResponse; + [date: string]: DataProviderHistoricalResponse; } = {}; try { @@ -164,7 +164,7 @@ export class GhostfolioService implements DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; }> { try { const response = await fetch( @@ -228,9 +228,9 @@ export class GhostfolioService implements DataProviderInterface { requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), symbols }: GetQuotesParams): Promise<{ - [symbol: string]: IDataProviderResponse; + [symbol: string]: DataProviderResponse; }> { - let quotes: { [symbol: string]: IDataProviderResponse } = {}; + let quotes: { [symbol: string]: DataProviderResponse } = {}; if (symbols.length <= 0) { return quotes; diff --git a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts index 111f2d004..fc188c345 100644 --- a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts +++ b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts @@ -8,8 +8,8 @@ import { GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { - IDataProviderHistoricalResponse, - IDataProviderResponse + DataProviderHistoricalResponse, + DataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; @@ -60,7 +60,7 @@ export class GoogleSheetsService implements DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; }> { try { const sheet = await this.getSheet({ @@ -71,7 +71,7 @@ export class GoogleSheetsService implements DataProviderInterface { const rows = await sheet.getRows(); const historicalData: { - [date: string]: IDataProviderHistoricalResponse; + [date: string]: DataProviderHistoricalResponse; } = {}; rows @@ -104,8 +104,8 @@ export class GoogleSheetsService implements DataProviderInterface { public async getQuotes({ symbols - }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }> { - const response: { [symbol: string]: IDataProviderResponse } = {}; + }: GetQuotesParams): Promise<{ [symbol: string]: DataProviderResponse }> { + const response: { [symbol: string]: DataProviderResponse } = {}; if (symbols.length <= 0) { return response; diff --git a/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts b/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts index 475205a01..38eb62a2b 100644 --- a/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts +++ b/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts @@ -1,6 +1,6 @@ import { - IDataProviderHistoricalResponse, - IDataProviderResponse + DataProviderHistoricalResponse, + DataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { DataProviderInfo, @@ -26,7 +26,7 @@ export interface DataProviderInterface { symbol, to }: GetDividendsParams): Promise<{ - [date: string]: IDataProviderHistoricalResponse; + [date: string]: DataProviderHistoricalResponse; }>; getHistorical({ @@ -36,7 +36,7 @@ export interface DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; }>; // TODO: Return only one symbol getMaxNumberOfSymbolsPerRequest?(): number; @@ -46,7 +46,7 @@ export interface DataProviderInterface { getQuotes({ requestTimeout, symbols - }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }>; + }: GetQuotesParams): Promise<{ [symbol: string]: DataProviderResponse }>; getTestSymbol(): string; diff --git a/apps/api/src/services/data-provider/manual/manual.service.ts b/apps/api/src/services/data-provider/manual/manual.service.ts index c411f678b..00c28d9d2 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -8,8 +8,8 @@ import { GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { - IDataProviderHistoricalResponse, - IDataProviderResponse + DataProviderHistoricalResponse, + DataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; @@ -77,7 +77,7 @@ export class ManualService implements DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; }> { try { const [symbolProfile] = await this.symbolProfileService.getSymbolProfiles( @@ -88,7 +88,7 @@ export class ManualService implements DataProviderInterface { if (defaultMarketPrice) { const historical: { - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; } = { [symbol]: {} }; @@ -132,8 +132,8 @@ export class ManualService implements DataProviderInterface { public async getQuotes({ symbols - }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }> { - const response: { [symbol: string]: IDataProviderResponse } = {}; + }: GetQuotesParams): Promise<{ [symbol: string]: DataProviderResponse }> { + const response: { [symbol: string]: DataProviderResponse } = {}; if (symbols.length <= 0) { return response; diff --git a/apps/api/src/services/data-provider/rapid-api/interfaces/interfaces.ts b/apps/api/src/services/data-provider/rapid-api/interfaces/interfaces.ts index 995fdb9d3..f87a22639 100644 --- a/apps/api/src/services/data-provider/rapid-api/interfaces/interfaces.ts +++ b/apps/api/src/services/data-provider/rapid-api/interfaces/interfaces.ts @@ -1 +1 @@ -export interface IRapidApiResponse {} +export interface RapidApiResponse {} diff --git a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts index 824f44328..4d22e0feb 100644 --- a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts +++ b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts @@ -8,8 +8,8 @@ import { GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { - IDataProviderHistoricalResponse, - IDataProviderResponse + DataProviderHistoricalResponse, + DataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { ghostfolioFearAndGreedIndexSymbol, @@ -59,7 +59,7 @@ export class RapidApiService implements DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; }> { try { if ( @@ -96,7 +96,7 @@ export class RapidApiService implements DataProviderInterface { public async getQuotes({ symbols - }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }> { + }: GetQuotesParams): Promise<{ [symbol: string]: DataProviderResponse }> { if (symbols.length <= 0) { return {}; } diff --git a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts index 390449d78..b36b0f215 100644 --- a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts @@ -10,8 +10,8 @@ import { GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { - IDataProviderHistoricalResponse, - IDataProviderResponse + DataProviderHistoricalResponse, + DataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; @@ -96,7 +96,7 @@ export class YahooFinanceService implements DataProviderInterface { ) ); const response: { - [date: string]: IDataProviderHistoricalResponse; + [date: string]: DataProviderHistoricalResponse; } = {}; for (const historicalItem of historicalResult) { @@ -124,7 +124,7 @@ export class YahooFinanceService implements DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; }> { if (isSameDay(from, to)) { to = addDays(to, 1); @@ -145,7 +145,7 @@ export class YahooFinanceService implements DataProviderInterface { ); const response: { - [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; } = {}; response[symbol] = {}; @@ -183,8 +183,8 @@ export class YahooFinanceService implements DataProviderInterface { public async getQuotes({ symbols - }: GetQuotesParams): Promise<{ [symbol: string]: IDataProviderResponse }> { - const response: { [symbol: string]: IDataProviderResponse } = {}; + }: GetQuotesParams): Promise<{ [symbol: string]: DataProviderResponse }> { + const response: { [symbol: string]: DataProviderResponse } = {}; if (symbols.length <= 0) { return response; diff --git a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.mock.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.mock.ts index 8f5d1c28a..076375523 100644 --- a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.mock.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.mock.ts @@ -17,11 +17,21 @@ export const ExchangeRateDataServiceMock = { '2023-07-10': 0.8854 } }); + } else if (targetCurrency === 'EUR') { + return Promise.resolve({ + EUREUR: { + '2021-12-12': 1 + }, + USDEUR: { + '2021-12-12': 0.8855 + } + }); } else if (targetCurrency === 'USD') { return Promise.resolve({ USDUSD: { '2018-01-01': 1, '2021-11-16': 1, + '2021-12-12': 1, '2023-07-10': 1 } }); diff --git a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts index 433547c94..47c67c3de 100644 --- a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts @@ -1,6 +1,6 @@ import { LogPerformance } from '@ghostfolio/api/interceptors/performance-logging/performance-logging.interceptor'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; -import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; 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'; @@ -29,7 +29,7 @@ import ms from 'ms'; @Injectable() export class ExchangeRateDataService { private currencies: string[] = []; - private currencyPairs: IDataGatheringItem[] = []; + private currencyPairs: DataGatheringItem[] = []; private exchangeRates: { [currencyPair: string]: number } = {}; public constructor( diff --git a/apps/api/src/services/i18n/i18n.service.ts b/apps/api/src/services/i18n/i18n.service.ts index 0f1f6239d..cf340d7c6 100644 --- a/apps/api/src/services/i18n/i18n.service.ts +++ b/apps/api/src/services/i18n/i18n.service.ts @@ -65,7 +65,7 @@ export class I18nService { } private parseLanguageCode(aFileName: string) { - const match = aFileName.match(/\.([a-zA-Z]+)\.xlf$/); + const match = /\.([a-zA-Z]+)\.xlf$/.exec(aFileName); return match ? match[1] : DEFAULT_LANGUAGE_CODE; } diff --git a/apps/api/src/services/interfaces/interfaces.ts b/apps/api/src/services/interfaces/interfaces.ts index 0eaa149a3..492c2bd35 100644 --- a/apps/api/src/services/interfaces/interfaces.ts +++ b/apps/api/src/services/interfaces/interfaces.ts @@ -6,11 +6,11 @@ import { MarketState } from '@ghostfolio/common/types'; import { DataSource } from '@prisma/client'; -export interface IDataProviderHistoricalResponse { +export interface DataProviderHistoricalResponse { marketPrice: number; } -export interface IDataProviderResponse { +export interface DataProviderResponse { currency: string; dataProviderInfo?: DataProviderInfo; dataSource: DataSource; @@ -18,6 +18,7 @@ export interface IDataProviderResponse { marketState: MarketState; } -export interface IDataGatheringItem extends AssetProfileIdentifier { +export interface DataGatheringItem extends AssetProfileIdentifier { date?: Date; + force?: boolean; } diff --git a/apps/api/src/services/market-data/market-data.service.ts b/apps/api/src/services/market-data/market-data.service.ts index 58b9b09ec..d318b9a70 100644 --- a/apps/api/src/services/market-data/market-data.service.ts +++ b/apps/api/src/services/market-data/market-data.service.ts @@ -1,6 +1,6 @@ import { UpdateMarketDataDto } from '@ghostfolio/api/app/admin/update-market-data.dto'; import { DateQuery } from '@ghostfolio/api/app/portfolio/interfaces/date-query.interface'; -import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { resetHours } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; @@ -30,7 +30,7 @@ export class MarketDataService { dataSource, date = new Date(), symbol - }: IDataGatheringItem): Promise { + }: DataGatheringItem): Promise { return await this.prismaService.marketData.findFirst({ where: { dataSource, @@ -132,6 +132,61 @@ export class MarketDataService { }); } + /** + * Atomically replace market data for a symbol within a date range. + * Deletes existing data in the range and inserts new data within a single + * transaction to prevent data loss if the operation fails. + */ + public async replaceForSymbol({ + data, + dataSource, + symbol + }: AssetProfileIdentifier & { data: Prisma.MarketDataUpdateInput[] }) { + await this.prismaService.$transaction(async (prisma) => { + if (data.length > 0) { + let minTime = Infinity; + let maxTime = -Infinity; + + for (const { date } of data) { + const time = (date as Date).getTime(); + + if (time < minTime) { + minTime = time; + } + + if (time > maxTime) { + maxTime = time; + } + } + + const minDate = new Date(minTime); + const maxDate = new Date(maxTime); + + await prisma.marketData.deleteMany({ + where: { + dataSource, + symbol, + date: { + gte: minDate, + lte: maxDate + } + } + }); + + await prisma.marketData.createMany({ + data: data.map(({ date, marketPrice, state }) => ({ + dataSource, + symbol, + date: date as Date, + marketPrice: marketPrice as number, + state: state as MarketDataState + })), + skipDuplicates: true + }); + } + }); + } + public async updateAssetProfileIdentifier( oldAssetProfileIdentifier: AssetProfileIdentifier, newAssetProfileIdentifier: AssetProfileIdentifier diff --git a/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts b/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts index 9cf6f63e6..1a4038652 100644 --- a/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts +++ b/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts @@ -1,6 +1,6 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { AssetProfileDelistedError } from '@ghostfolio/api/services/data-provider/errors/asset-profile-delisted.error'; -import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { @@ -99,8 +99,8 @@ export class DataGatheringProcessor { ), name: GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_NAME }) - public async gatherHistoricalMarketData(job: Job) { - const { dataSource, date, symbol } = job.data; + public async gatherHistoricalMarketData(job: Job) { + const { dataSource, date, force, symbol } = job.data; try { let currentDate = parseISO(date as unknown as string); @@ -109,7 +109,7 @@ export class DataGatheringProcessor { `Historical market data gathering has been started for ${symbol} (${dataSource}) at ${format( currentDate, DATE_FORMAT - )}`, + )}${force ? ' (forced update)' : ''}`, `DataGatheringProcessor (${GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_NAME})` ); @@ -157,7 +157,15 @@ export class DataGatheringProcessor { currentDate = addDays(currentDate, 1); } - await this.marketDataService.updateMany({ data }); + if (force) { + await this.marketDataService.replaceForSymbol({ + data, + dataSource, + symbol + }); + } else { + await this.marketDataService.updateMany({ data }); + } Logger.log( `Historical market data gathering has been completed for ${symbol} (${dataSource}) at ${format( diff --git a/apps/api/src/services/queues/data-gathering/data-gathering.service.ts b/apps/api/src/services/queues/data-gathering/data-gathering.service.ts index dd93e3e47..c433f692f 100644 --- a/apps/api/src/services/queues/data-gathering/data-gathering.service.ts +++ b/apps/api/src/services/queues/data-gathering/data-gathering.service.ts @@ -1,8 +1,7 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; -import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; -import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; +import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; @@ -41,7 +40,6 @@ export class DataGatheringService { private readonly dataGatheringQueue: Queue, private readonly dataProviderService: DataProviderService, private readonly exchangeRateDataService: ExchangeRateDataService, - private readonly marketDataService: MarketDataService, private readonly prismaService: PrismaService, private readonly propertyService: PropertyService, private readonly symbolProfileService: SymbolProfileService @@ -94,9 +92,7 @@ export class DataGatheringService { }); } - public async gatherSymbol({ dataSource, date, symbol }: IDataGatheringItem) { - await this.marketDataService.deleteMany({ dataSource, symbol }); - + public async gatherSymbol({ dataSource, date, symbol }: DataGatheringItem) { const dataGatheringItems = (await this.getSymbolsMax()) .filter((dataGatheringItem) => { return ( @@ -111,6 +107,7 @@ export class DataGatheringService { await this.gatherSymbols({ dataGatheringItems, + force: true, priority: DATA_GATHERING_QUEUE_PRIORITY_HIGH }); } @@ -274,9 +271,11 @@ export class DataGatheringService { public async gatherSymbols({ dataGatheringItems, + force = false, priority }: { - dataGatheringItems: IDataGatheringItem[]; + dataGatheringItems: DataGatheringItem[]; + force?: boolean; priority: number; }) { await this.addJobsToQueue( @@ -285,6 +284,7 @@ export class DataGatheringService { data: { dataSource, date, + force, symbol }, name: GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_NAME, @@ -348,7 +348,7 @@ export class DataGatheringService { }); } - private async getCurrencies7D(): Promise { + private async getCurrencies7D(): Promise { const assetProfileIdentifiersWithCompleteMarketData = await this.getAssetProfileIdentifiersWithCompleteMarketData(); @@ -376,7 +376,7 @@ export class DataGatheringService { withUserSubscription = false }: { withUserSubscription?: boolean; - }): Promise { + }): Promise { const symbolProfiles = await this.symbolProfileService.getActiveSymbolProfilesByUserSubscription( { @@ -407,7 +407,7 @@ export class DataGatheringService { }); } - private async getSymbolsMax(): Promise { + private async getSymbolsMax(): Promise { const benchmarkAssetProfileIdMap: { [key: string]: boolean } = {}; ( (await this.propertyService.getByKey( diff --git a/apps/api/src/services/queues/portfolio-snapshot/interfaces/portfolio-snapshot-queue-job.interface.ts b/apps/api/src/services/queues/portfolio-snapshot/interfaces/portfolio-snapshot-queue-job.interface.ts index b9f315c5d..3486974f7 100644 --- a/apps/api/src/services/queues/portfolio-snapshot/interfaces/portfolio-snapshot-queue-job.interface.ts +++ b/apps/api/src/services/queues/portfolio-snapshot/interfaces/portfolio-snapshot-queue-job.interface.ts @@ -1,7 +1,7 @@ import { Filter } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; -export interface IPortfolioSnapshotQueueJob { +export interface PortfolioSnapshotQueueJob { calculationType: PerformanceCalculationType; filters: Filter[]; userCurrency: string; 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 6a2a3114e..75a3a8631 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 @@ -16,7 +16,7 @@ import { Injectable, Logger } from '@nestjs/common'; import { Job } from 'bull'; import { addMilliseconds } from 'date-fns'; -import { IPortfolioSnapshotQueueJob } from './interfaces/portfolio-snapshot-queue-job.interface'; +import { PortfolioSnapshotQueueJob } from './interfaces/portfolio-snapshot-queue-job.interface'; @Injectable() @Processor(PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE) @@ -37,9 +37,7 @@ export class PortfolioSnapshotProcessor { ), name: PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME }) - public async calculatePortfolioSnapshot( - job: Job - ) { + public async calculatePortfolioSnapshot(job: Job) { try { const startTime = performance.now(); 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 59fdc5855..898718106 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,13 +1,13 @@ import { Job, JobOptions } from 'bull'; import { setTimeout } from 'timers/promises'; -import { IPortfolioSnapshotQueueJob } from './interfaces/portfolio-snapshot-queue-job.interface'; +import { PortfolioSnapshotQueueJob } from './interfaces/portfolio-snapshot-queue-job.interface'; export const PortfolioSnapshotServiceMock = { addJobToQueue({ opts }: { - data: IPortfolioSnapshotQueueJob; + data: PortfolioSnapshotQueueJob; name: string; opts?: JobOptions; }): Promise> { diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.ts index 9dba9275e..d7449a9cc 100644 --- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.ts +++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.ts @@ -4,7 +4,7 @@ import { InjectQueue } from '@nestjs/bull'; import { Injectable } from '@nestjs/common'; import { JobOptions, Queue } from 'bull'; -import { IPortfolioSnapshotQueueJob } from './interfaces/portfolio-snapshot-queue-job.interface'; +import { PortfolioSnapshotQueueJob } from './interfaces/portfolio-snapshot-queue-job.interface'; @Injectable() export class PortfolioSnapshotService { @@ -18,7 +18,7 @@ export class PortfolioSnapshotService { name, opts }: { - data: IPortfolioSnapshotQueueJob; + data: PortfolioSnapshotQueueJob; name: string; opts?: JobOptions; }) { diff --git a/apps/client/project.json b/apps/client/project.json index adb63d5c1..0d3571cdf 100644 --- a/apps/client/project.json +++ b/apps/client/project.json @@ -61,30 +61,30 @@ }, "targets": { "build": { - "executor": "@nx/angular:webpack-browser", + "executor": "@nx/angular:browser-esbuild", "options": { - "deleteOutputPath": false, - "localize": true, - "outputPath": "dist/apps/client", "index": "apps/client/src/index.html", "main": "apps/client/src/main.ts", - "polyfills": "apps/client/src/polyfills.ts", + "outputPath": "dist/apps/client", "tsConfig": "apps/client/tsconfig.app.json", + "buildOptimizer": false, + "deleteOutputPath": false, + "extractLicenses": false, + "localize": true, + "namedChunks": true, + "ngswConfigPath": "apps/client/ngsw-config.json", + "optimization": false, + "polyfills": "apps/client/src/polyfills.ts", + "scripts": ["node_modules/marked/marked.min.js"], + "serviceWorker": true, + "sourceMap": true, "styles": [ "apps/client/src/assets/fonts/inter.css", "apps/client/src/styles/theme.scss", "apps/client/src/styles.scss", "node_modules/open-color/open-color.css" ], - "scripts": ["node_modules/marked/marked.min.js"], - "vendorChunk": true, - "extractLicenses": false, - "buildOptimizer": false, - "sourceMap": true, - "optimization": false, - "namedChunks": true, - "serviceWorker": true, - "ngswConfigPath": "apps/client/ngsw-config.json" + "vendorChunk": true }, "configurations": { "development-ca": { @@ -136,19 +136,6 @@ "localize": ["zh"] }, "production": { - "fileReplacements": [ - { - "replace": "apps/client/src/environments/environment.ts", - "with": "apps/client/src/environments/environment.prod.ts" - } - ], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "namedChunks": false, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, "budgets": [ { "type": "initial", @@ -160,7 +147,20 @@ "maximumWarning": "6kb", "maximumError": "10kb" } - ] + ], + "buildOptimizer": true, + "extractLicenses": true, + "fileReplacements": [ + { + "replace": "apps/client/src/environments/environment.ts", + "with": "apps/client/src/environments/environment.prod.ts" + } + ], + "namedChunks": false, + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "vendorChunk": false } }, "outputs": ["{options.outputPath}"], diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index bddd7d3da..b70850016 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -1,5 +1,3 @@ -import { GfHoldingDetailDialogComponent } from '@ghostfolio/client/components/holding-detail-dialog/holding-detail-dialog.component'; -import { HoldingDetailDialogParams } from '@ghostfolio/client/components/holding-detail-dialog/interfaces/interfaces'; import { getCssVariable } from '@ghostfolio/common/helper'; import { InfoItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; @@ -22,7 +20,9 @@ import { ActivatedRoute, NavigationEnd, PRIMARY_OUTLET, - Router + Router, + RouterLink, + RouterOutlet } from '@angular/router'; import { DataSource } from '@prisma/client'; import { addIcons } from 'ionicons'; @@ -31,6 +31,10 @@ import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; import { filter, takeUntil } from 'rxjs/operators'; +import { GfFooterComponent } from './components/footer/footer.component'; +import { GfHeaderComponent } from './components/header/header.component'; +import { GfHoldingDetailDialogComponent } from './components/holding-detail-dialog/holding-detail-dialog.component'; +import { HoldingDetailDialogParams } from './components/holding-detail-dialog/interfaces/interfaces'; import { NotificationService } from './core/notification/notification.service'; import { DataService } from './services/data.service'; import { ImpersonationStorageService } from './services/impersonation-storage.service'; @@ -38,13 +42,13 @@ import { TokenStorageService } from './services/token-storage.service'; import { UserService } from './services/user/user.service'; @Component({ - selector: 'gf-root', changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './app.component.html', + imports: [GfFooterComponent, GfHeaderComponent, RouterLink, RouterOutlet], + selector: 'gf-root', styleUrls: ['./app.component.scss'], - standalone: false + templateUrl: './app.component.html' }) -export class AppComponent implements OnDestroy, OnInit { +export class GfAppComponent implements OnDestroy, OnInit { @HostBinding('class.has-info-message') get getHasMessage() { return this.hasInfoMessage; } @@ -276,7 +280,10 @@ export class AppComponent implements OnDestroy, OnInit { .subscribe((user) => { this.user = user; - const dialogRef = this.dialog.open(GfHoldingDetailDialogComponent, { + const dialogRef = this.dialog.open< + GfHoldingDetailDialogComponent, + HoldingDetailDialogParams + >(GfHoldingDetailDialogComponent, { autoFocus: false, data: { dataSource, @@ -302,7 +309,7 @@ export class AppComponent implements OnDestroy, OnInit { hasPermission(this.user?.permissions, permissions.updateOrder) && !this.user?.settings?.isRestrictedView, locale: this.user?.settings?.locale - } as HoldingDetailDialogParams, + }, height: this.deviceType === 'mobile' ? '98vh' : '80vh', width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); diff --git a/apps/client/src/app/app.module.ts b/apps/client/src/app/app.module.ts deleted file mode 100644 index 63de8fca7..000000000 --- a/apps/client/src/app/app.module.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Platform } from '@angular/cdk/platform'; -import { - provideHttpClient, - withInterceptorsFromDi -} from '@angular/common/http'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatChipsModule } from '@angular/material/chips'; -import { - DateAdapter, - MAT_DATE_FORMATS, - MAT_DATE_LOCALE, - MatNativeDateModule -} from '@angular/material/core'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { BrowserModule } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { ServiceWorkerModule } from '@angular/service-worker'; -import { provideIonicAngular } from '@ionic/angular/standalone'; -import { provideMarkdown } from 'ngx-markdown'; -import { provideNgxSkeletonLoader } from 'ngx-skeleton-loader'; -import { NgxStripeModule, STRIPE_PUBLISHABLE_KEY } from 'ngx-stripe'; - -import { environment } from '../environments/environment'; -import { CustomDateAdapter } from './adapter/custom-date-adapter'; -import { DateFormats } from './adapter/date-formats'; -import { AppRoutingModule } from './app-routing.module'; -import { AppComponent } from './app.component'; -import { GfFooterComponent } from './components/footer/footer.component'; -import { GfHeaderComponent } from './components/header/header.component'; -import { authInterceptorProviders } from './core/auth.interceptor'; -import { httpResponseInterceptorProviders } from './core/http-response.interceptor'; -import { LanguageService } from './core/language.service'; -import { GfNotificationModule } from './core/notification/notification.module'; - -export function NgxStripeFactory(): string { - return environment.stripePublicKey; -} - -@NgModule({ - bootstrap: [AppComponent], - declarations: [AppComponent], - imports: [ - AppRoutingModule, - BrowserAnimationsModule, - BrowserModule, - GfFooterComponent, - GfHeaderComponent, - GfNotificationModule, - MatAutocompleteModule, - MatChipsModule, - MatNativeDateModule, - MatSnackBarModule, - MatTooltipModule, - NgxStripeModule.forRoot(environment.stripePublicKey), - ServiceWorkerModule.register('ngsw-worker.js', { - enabled: environment.production, - registrationStrategy: 'registerImmediately' - }) - ], - providers: [ - authInterceptorProviders, - httpResponseInterceptorProviders, - LanguageService, - provideHttpClient(withInterceptorsFromDi()), - provideIonicAngular(), - provideMarkdown(), - provideNgxSkeletonLoader(), - { - provide: DateAdapter, - useClass: CustomDateAdapter, - deps: [LanguageService, MAT_DATE_LOCALE, Platform] - }, - { provide: MAT_DATE_FORMATS, useValue: DateFormats }, - { - provide: STRIPE_PUBLISHABLE_KEY, - useFactory: NgxStripeFactory - } - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class AppModule {} diff --git a/apps/client/src/app/app-routing.module.ts b/apps/client/src/app/app.routes.ts similarity index 80% rename from apps/client/src/app/app-routing.module.ts rename to apps/client/src/app/app.routes.ts index 0ceee3725..9588cee68 100644 --- a/apps/client/src/app/app-routing.module.ts +++ b/apps/client/src/app/app.routes.ts @@ -1,13 +1,10 @@ -import { publicRoutes, internalRoutes } from '@ghostfolio/common/routes/routes'; +import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes, TitleStrategy } from '@angular/router'; +import { Routes } from '@angular/router'; import { AuthGuard } from './core/auth.guard'; -import { ModulePreloadService } from './core/module-preload.service'; -import { PageTitleStrategy } from './services/page-title.strategy'; -const routes: Routes = [ +export const routes: Routes = [ { path: publicRoutes.about.path, loadChildren: () => @@ -48,7 +45,7 @@ const routes: Routes = [ { path: publicRoutes.blog.path, loadChildren: () => - import('./pages/blog/blog-page.module').then((m) => m.BlogPageModule) + import('./pages/blog/blog-page.routes').then((m) => m.routes) }, { canActivate: [AuthGuard], @@ -147,24 +144,3 @@ const routes: Routes = [ pathMatch: 'full' } ]; - -@NgModule({ - imports: [ - RouterModule.forRoot( - routes, - // Preload all lazy loaded modules with the attribute preload === true - { - anchorScrolling: 'enabled', - // enableTracing: true, // <-- debugging purposes only - preloadingStrategy: ModulePreloadService, - scrollPositionRestoration: 'top' - } - ) - ], - providers: [ - ModulePreloadService, - { provide: TitleStrategy, useClass: PageTitleStrategy } - ], - exports: [RouterModule] -}) -export class AppRoutingModule {} diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts index bdc2424f5..94cb22699 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts @@ -43,9 +43,9 @@ import { Big } from 'big.js'; import { format, parseISO } from 'date-fns'; import { addIcons } from 'ionicons'; import { + albumsOutline, cashOutline, - swapVerticalOutline, - walletOutline + swapVerticalOutline } from 'ionicons/icons'; import { isNumber } from 'lodash'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @@ -129,7 +129,7 @@ export class GfAccountDetailDialogComponent implements OnDestroy, OnInit { } }); - addIcons({ cashOutline, swapVerticalOutline, walletOutline }); + addIcons({ albumsOutline, cashOutline, swapVerticalOutline }); } public ngOnInit() { diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html index eff500d0a..07ea17038 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html @@ -98,7 +98,7 @@ > - +
Holdings
{ this.user = user; - const dialogRef = this.dialog.open(GfAssetProfileDialogComponent, { + const dialogRef = this.dialog.open< + GfAssetProfileDialogComponent, + AssetProfileDialogParams + >(GfAssetProfileDialogComponent, { autoFocus: false, data: { dataSource, @@ -438,7 +441,7 @@ export class GfAdminMarketDataComponent colorScheme: this.user?.settings.colorScheme, deviceType: this.deviceType, locale: this.user?.settings?.locale - } as AssetProfileDialogParams, + }, height: this.deviceType === 'mobile' ? '98vh' : '80vh', width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); @@ -465,17 +468,17 @@ export class GfAdminMarketDataComponent .subscribe((user) => { this.user = user; - const dialogRef = this.dialog.open( + const dialogRef = this.dialog.open< GfCreateAssetProfileDialogComponent, - { - autoFocus: false, - data: { - deviceType: this.deviceType, - locale: this.user?.settings?.locale - } as CreateAssetProfileDialogParams, - width: this.deviceType === 'mobile' ? '100vw' : '50rem' - } - ); + CreateAssetProfileDialogParams + >(GfCreateAssetProfileDialogComponent, { + autoFocus: false, + data: { + deviceType: this.deviceType, + locale: this.user?.settings?.locale + }, + width: this.deviceType === 'mobile' ? '100vw' : '50rem' + }); dialogRef .afterClosed() diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts index 3fd9e506f..a56f6dec5 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts @@ -18,6 +18,7 @@ import { ScraperConfiguration, User } from '@ghostfolio/common/interfaces'; +import { DateRange } from '@ghostfolio/common/types'; import { GfCurrencySelectorComponent } from '@ghostfolio/ui/currency-selector'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { GfHistoricalMarketDataEditorComponent } from '@ghostfolio/ui/historical-market-data-editor'; @@ -190,6 +191,32 @@ export class GfAssetProfileDialogComponent implements OnDestroy, OnInit { }; public currencies: string[] = []; + public dateRangeOptions = [ + { + label: $localize`Current week` + ' (' + $localize`WTD` + ')', + value: 'wtd' + }, + { + label: $localize`Current month` + ' (' + $localize`MTD` + ')', + value: 'mtd' + }, + { + label: $localize`Current year` + ' (' + $localize`YTD` + ')', + value: 'ytd' + }, + { + label: '1 ' + $localize`year` + ' (' + $localize`1Y` + ')', + value: '1y' + }, + { + label: '5 ' + $localize`years` + ' (' + $localize`5Y` + ')', + value: '5y' + }, + { + label: $localize`Max`, + value: 'max' + } + ]; public historicalDataItems: LineChartItem[]; public isBenchmark = false; public isDataGatheringEnabled: boolean; @@ -405,9 +432,15 @@ export class GfAssetProfileDialogComponent implements OnDestroy, OnInit { .subscribe(); } - public onGatherSymbol({ dataSource, symbol }: AssetProfileIdentifier) { + public onGatherSymbol({ + dataSource, + range, + symbol + }: { + range?: DateRange; + } & AssetProfileIdentifier) { this.adminService - .gatherSymbol({ dataSource, symbol }) + .gatherSymbol({ dataSource, range, symbol }) .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(); } 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 301287cf5..3d855e6e0 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 @@ -26,12 +26,30 @@ [disabled]=" assetProfileForm.dirty || !assetProfileForm.controls.isActive.value " + [matMenuTriggerFor]="gatherHistoricalMarketDataMenu" (click)=" onGatherSymbol({ dataSource: data.dataSource, symbol: data.symbol }) " > Gather Historical Market Data + + @for (dateRange of dateRangeOptions; track dateRange.value) { + + } + + @if (hasPermissionToImpersonateAllUsers) { + } + @if ( + dataSource?.data.length > 0 && + data.hasPermissionToReportDataGlitch === true + ) { + Report Data Glitch... + } @if (data.hasPermissionToAccessAdminControl) { ... } - @if ( - dataSource?.data.length > 0 && - data.hasPermissionToReportDataGlitch === true - ) { - Report Data Glitch... - } diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts index 4c0b614c0..ab43e54dd 100644 --- a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts @@ -149,17 +149,17 @@ export class GfHomeWatchlistComponent implements OnDestroy, OnInit { .subscribe((user) => { this.user = user; - const dialogRef = this.dialog.open( + const dialogRef = this.dialog.open< GfCreateWatchlistItemDialogComponent, - { - autoFocus: false, - data: { - deviceType: this.deviceType, - locale: this.user?.settings?.locale - } as CreateWatchlistItemDialogParams, - width: this.deviceType === 'mobile' ? '100vw' : '50rem' - } - ); + CreateWatchlistItemDialogParams + >(GfCreateWatchlistItemDialogComponent, { + autoFocus: false, + data: { + deviceType: this.deviceType, + locale: this.user?.settings?.locale + }, + width: this.deviceType === 'mobile' ? '100vw' : '50rem' + }); dialogRef .afterClosed() diff --git a/apps/client/src/app/components/login-with-access-token-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/login-with-access-token-dialog/interfaces/interfaces.ts new file mode 100644 index 000000000..2fa8b7ea4 --- /dev/null +++ b/apps/client/src/app/components/login-with-access-token-dialog/interfaces/interfaces.ts @@ -0,0 +1,5 @@ +export interface LoginWithAccessTokenDialogParams { + accessToken: string; + hasPermissionToUseSocialLogin: boolean; + title: string; +} diff --git a/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.component.ts b/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.component.ts index 3812a18b9..c0926150f 100644 --- a/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.component.ts +++ b/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.component.ts @@ -1,10 +1,8 @@ import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; -import { InternetIdentityService } from '@ghostfolio/client/services/internet-identity.service'; import { KEY_STAY_SIGNED_IN, SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service'; -import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, Inject } from '@angular/core'; @@ -21,11 +19,12 @@ import { } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; -import { Router } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; import { addIcons } from 'ionicons'; import { eyeOffOutline, eyeOutline } from 'ionicons/icons'; +import { LoginWithAccessTokenDialogParams } from './interfaces/interfaces'; + @Component({ changeDetection: ChangeDetectionStrategy.OnPush, imports: [ @@ -51,12 +50,9 @@ export class GfLoginWithAccessTokenDialogComponent { public isAccessTokenHidden = true; public constructor( - @Inject(MAT_DIALOG_DATA) public data: any, + @Inject(MAT_DIALOG_DATA) public data: LoginWithAccessTokenDialogParams, public dialogRef: MatDialogRef, - private internetIdentityService: InternetIdentityService, - private router: Router, - private settingsStorageService: SettingsStorageService, - private tokenStorageService: TokenStorageService + private settingsStorageService: SettingsStorageService ) { addIcons({ eyeOffOutline, eyeOutline }); } @@ -79,14 +75,4 @@ export class GfLoginWithAccessTokenDialogComponent { }); } } - - public async onLoginWithInternetIdentity() { - try { - const { authToken } = await this.internetIdentityService.login(); - - this.tokenStorageService.saveToken(authToken); - this.dialogRef.close(); - this.router.navigate(['/']); - } catch {} - } } diff --git a/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html b/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html index e19d190c4..15e68822a 100644 --- a/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html +++ b/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2,13 +2,14 @@
-
+ Security Token + + @if (data.hasPermissionToUseSocialLogin) { +
or
+ + }
- @if (data.hasPermissionToUseSocialLogin) { -
or
-
- - Sign in with Google -
- }
+
) {} } diff --git a/apps/client/src/app/components/rule/rule.component.ts b/apps/client/src/app/components/rule/rule.component.ts index c38de8bbb..5ed39d5be 100644 --- a/apps/client/src/app/components/rule/rule.component.ts +++ b/apps/client/src/app/components/rule/rule.component.ts @@ -31,7 +31,7 @@ import { DeviceDetectorService } from 'ngx-device-detector'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject, takeUntil } from 'rxjs'; -import { IRuleSettingsDialogParams } from './rule-settings-dialog/interfaces/interfaces'; +import { RuleSettingsDialogParams } from './rule-settings-dialog/interfaces/interfaces'; import { GfRuleSettingsDialogComponent } from './rule-settings-dialog/rule-settings-dialog.component'; @Component({ @@ -51,6 +51,7 @@ export class GfRuleComponent implements OnInit { @Input() categoryName: string; @Input() hasPermissionToUpdateUserSettings: boolean; @Input() isLoading: boolean; + @Input() locale: string; @Input() rule: PortfolioReportRule; @Input() settings: XRayRulesSettings['AccountClusterRiskCurrentInvestment']; @@ -78,12 +79,16 @@ export class GfRuleComponent implements OnInit { } public onCustomizeRule(rule: PortfolioReportRule) { - const dialogRef = this.dialog.open(GfRuleSettingsDialogComponent, { + const dialogRef = this.dialog.open< + GfRuleSettingsDialogComponent, + RuleSettingsDialogParams + >(GfRuleSettingsDialogComponent, { data: { rule, categoryName: this.categoryName, + locale: this.locale, settings: this.settings - } as IRuleSettingsDialogParams, + }, width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); diff --git a/apps/client/src/app/components/rules/rules.component.html b/apps/client/src/app/components/rules/rules.component.html index d0cf7ece5..0c3153c52 100644 --- a/apps/client/src/app/components/rules/rules.component.html +++ b/apps/client/src/app/components/rules/rules.component.html @@ -12,6 +12,7 @@ [hasPermissionToUpdateUserSettings]=" hasPermissionToUpdateUserSettings " + [locale]="locale" [rule]="rule" [settings]="settings?.[rule.key]" (ruleUpdated)="onRuleUpdated($event)" diff --git a/apps/client/src/app/components/rules/rules.component.ts b/apps/client/src/app/components/rules/rules.component.ts index 6379a40fb..80a59740b 100644 --- a/apps/client/src/app/components/rules/rules.component.ts +++ b/apps/client/src/app/components/rules/rules.component.ts @@ -26,6 +26,7 @@ export class GfRulesComponent { @Input() categoryName: string; @Input() hasPermissionToUpdateUserSettings: boolean; @Input() isLoading: boolean; + @Input() locale: string; @Input() rules: PortfolioReportRule[]; @Input() settings: XRayRulesSettings; diff --git a/apps/client/src/app/components/user-account-access/user-account-access.component.ts b/apps/client/src/app/components/user-account-access/user-account-access.component.ts index bdb9af6ed..afcb9d9c8 100644 --- a/apps/client/src/app/components/user-account-access/user-account-access.component.ts +++ b/apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -31,6 +31,7 @@ import { EMPTY, Subject } from 'rxjs'; import { catchError, takeUntil } from 'rxjs/operators'; import { GfCreateOrUpdateAccessDialogComponent } from './create-or-update-access-dialog/create-or-update-access-dialog.component'; +import { CreateOrUpdateAccessDialogParams } from './create-or-update-access-dialog/interfaces/interfaces'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -187,10 +188,15 @@ export class GfUserAccountAccessComponent implements OnDestroy, OnInit { } private openCreateAccessDialog() { - const dialogRef = this.dialog.open(GfCreateOrUpdateAccessDialogComponent, { + const dialogRef = this.dialog.open< + GfCreateOrUpdateAccessDialogComponent, + CreateOrUpdateAccessDialogParams + >(GfCreateOrUpdateAccessDialogComponent, { data: { access: { alias: '', + grantee: null, + id: null, permissions: ['READ_RESTRICTED'], type: 'PRIVATE' } @@ -219,12 +225,15 @@ export class GfUserAccountAccessComponent implements OnDestroy, OnInit { return; } - const dialogRef = this.dialog.open(GfCreateOrUpdateAccessDialogComponent, { + const dialogRef = this.dialog.open< + GfCreateOrUpdateAccessDialogComponent, + CreateOrUpdateAccessDialogParams + >(GfCreateOrUpdateAccessDialogComponent, { data: { access: { alias: access.alias, - id: access.id, grantee: access.grantee === 'Public' ? null : access.grantee, + id: access.id, permissions: access.permissions, type: access.type } 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 f2f63b32b..025ec0f7a 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 @@ -108,7 +108,10 @@ export class GfUserAccountMembershipComponent implements OnDestroy { public onCheckout() { this.dataService - .createCheckoutSession({ couponId: this.couponId, priceId: this.priceId }) + .createStripeCheckoutSession({ + couponId: this.couponId, + priceId: this.priceId + }) .pipe( catchError((error) => { this.notificationService.alert({ @@ -117,7 +120,7 @@ export class GfUserAccountMembershipComponent implements OnDestroy { throw error; }), - switchMap(({ sessionId }: { sessionId: string }) => { + switchMap(({ sessionId }) => { return this.stripeService.redirectToCheckout({ sessionId }); }) ) diff --git a/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts new file mode 100644 index 000000000..d29bc01bc --- /dev/null +++ b/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts @@ -0,0 +1,8 @@ +import { AdminUsersResponse } from '@ghostfolio/common/interfaces'; + +export interface UserDetailDialogParams { + deviceType: string; + hasPermissionForSubscription: boolean; + locale: string; + userData: AdminUsersResponse['users'][0]; +} diff --git a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.scss b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.scss new file mode 100644 index 000000000..b63df0134 --- /dev/null +++ b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.scss @@ -0,0 +1,7 @@ +:host { + display: block; + + .mat-mdc-dialog-content { + max-height: unset; + } +} diff --git a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts new file mode 100644 index 000000000..bd336c4f8 --- /dev/null +++ b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts @@ -0,0 +1,52 @@ +import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; +import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; +import { GfValueComponent } from '@ghostfolio/ui/value'; + +import { CommonModule } from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, + CUSTOM_ELEMENTS_SCHEMA, + Inject, + OnDestroy +} from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatDialogModule } from '@angular/material/dialog'; +import { Subject } from 'rxjs'; + +import { UserDetailDialogParams } from './interfaces/interfaces'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + host: { class: 'd-flex flex-column h-100' }, + imports: [ + CommonModule, + GfDialogFooterComponent, + GfDialogHeaderComponent, + GfValueComponent, + MatButtonModule, + MatDialogModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + selector: 'gf-user-detail-dialog', + styleUrls: ['./user-detail-dialog.component.scss'], + templateUrl: './user-detail-dialog.html' +}) +export class GfUserDetailDialogComponent implements OnDestroy { + private unsubscribeSubject = new Subject(); + + public constructor( + @Inject(MAT_DIALOG_DATA) public data: UserDetailDialogParams, + public dialogRef: MatDialogRef + ) {} + + public onClose() { + this.dialogRef.close(); + } + + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } +} diff --git a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html new file mode 100644 index 000000000..6bc468b59 --- /dev/null +++ b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -0,0 +1,97 @@ + + +
+
+
+
+ + User ID + +
+
+ + Registration Date + +
+
+ +
+
+ + Role + +
+ @if (data.hasPermissionForSubscription) { +
+ + Country + +
+ } +
+ +
+
+ + Accounts + +
+
+ + Activities + +
+
+ + @if (data.hasPermissionForSubscription) { +
+
+ + Engagement per Day + +
+
+ + API Requests Today + +
+
+ } +
+
+ + diff --git a/apps/client/src/app/core/module-preload.service.ts b/apps/client/src/app/core/module-preload.service.ts index fcba48c52..85d9c5e33 100644 --- a/apps/client/src/app/core/module-preload.service.ts +++ b/apps/client/src/app/core/module-preload.service.ts @@ -7,7 +7,7 @@ export class ModulePreloadService implements PreloadingStrategy { /** * Preloads all lazy loading modules with the attribute 'preload' set to true */ - preload(route: Route, load: Function): Observable { + preload(route: Route, load: () => Observable): Observable { return route.data?.preload ? load() : of(null); } } diff --git a/apps/client/src/app/core/notification/alert-dialog/alert-dialog.component.ts b/apps/client/src/app/core/notification/alert-dialog/alert-dialog.component.ts index 98b6043eb..33d26c493 100644 --- a/apps/client/src/app/core/notification/alert-dialog/alert-dialog.component.ts +++ b/apps/client/src/app/core/notification/alert-dialog/alert-dialog.component.ts @@ -2,7 +2,7 @@ import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; -import { IAlertDialogParams } from './interfaces/interfaces'; +import { AlertDialogParams } from './interfaces/interfaces'; @Component({ imports: [MatButtonModule, MatDialogModule], @@ -17,7 +17,7 @@ export class GfAlertDialogComponent { public constructor(public dialogRef: MatDialogRef) {} - public initialize(aParams: IAlertDialogParams) { + public initialize(aParams: AlertDialogParams) { this.discardLabel = aParams.discardLabel; this.message = aParams.message; this.title = aParams.title; diff --git a/apps/client/src/app/core/notification/alert-dialog/interfaces/interfaces.ts b/apps/client/src/app/core/notification/alert-dialog/interfaces/interfaces.ts index 7cff077a7..835056ba7 100644 --- a/apps/client/src/app/core/notification/alert-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/core/notification/alert-dialog/interfaces/interfaces.ts @@ -1,4 +1,4 @@ -export interface IAlertDialogParams { +export interface AlertDialogParams { confirmLabel?: string; discardLabel?: string; message?: string; diff --git a/apps/client/src/app/core/notification/confirmation-dialog/confirmation-dialog.component.ts b/apps/client/src/app/core/notification/confirmation-dialog/confirmation-dialog.component.ts index 88e5113d7..49c6dc5a3 100644 --- a/apps/client/src/app/core/notification/confirmation-dialog/confirmation-dialog.component.ts +++ b/apps/client/src/app/core/notification/confirmation-dialog/confirmation-dialog.component.ts @@ -3,7 +3,7 @@ import { MatButtonModule } from '@angular/material/button'; import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; import { ConfirmationDialogType } from './confirmation-dialog.type'; -import { IConfirmDialogParams } from './interfaces/interfaces'; +import { ConfirmDialogParams } from './interfaces/interfaces'; @Component({ imports: [MatButtonModule, MatDialogModule], @@ -29,7 +29,7 @@ export class GfConfirmationDialogComponent { } } - public initialize(aParams: IConfirmDialogParams) { + public initialize(aParams: ConfirmDialogParams) { this.confirmLabel = aParams.confirmLabel; this.confirmType = aParams.confirmType; this.discardLabel = aParams.discardLabel; diff --git a/apps/client/src/app/core/notification/confirmation-dialog/interfaces/interfaces.ts b/apps/client/src/app/core/notification/confirmation-dialog/interfaces/interfaces.ts index 834988ceb..8788e54fe 100644 --- a/apps/client/src/app/core/notification/confirmation-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/core/notification/confirmation-dialog/interfaces/interfaces.ts @@ -1,6 +1,6 @@ import { ConfirmationDialogType } from '../confirmation-dialog.type'; -export interface IConfirmDialogParams { +export interface ConfirmDialogParams { confirmLabel?: string; confirmType: ConfirmationDialogType; discardLabel?: string; diff --git a/apps/client/src/app/core/notification/interfaces/interfaces.ts b/apps/client/src/app/core/notification/interfaces/interfaces.ts index f3546d457..c58c7fa28 100644 --- a/apps/client/src/app/core/notification/interfaces/interfaces.ts +++ b/apps/client/src/app/core/notification/interfaces/interfaces.ts @@ -1,13 +1,13 @@ import { ConfirmationDialogType } from '../confirmation-dialog/confirmation-dialog.type'; -export interface IAlertParams { +export interface AlertParams { discardFn?: () => void; discardLabel?: string; message?: string; title: string; } -export interface IConfirmParams { +export interface ConfirmParams { confirmFn: () => void; confirmLabel?: string; confirmType?: ConfirmationDialogType; @@ -18,7 +18,7 @@ export interface IConfirmParams { title: string; } -export interface IPromptParams { +export interface PromptParams { confirmFn: (value: string) => void; confirmLabel?: string; defaultValue?: string; diff --git a/apps/client/src/app/core/notification/notification.service.ts b/apps/client/src/app/core/notification/notification.service.ts index 1b58db64a..9c31aa7bd 100644 --- a/apps/client/src/app/core/notification/notification.service.ts +++ b/apps/client/src/app/core/notification/notification.service.ts @@ -8,9 +8,9 @@ import { GfAlertDialogComponent } from './alert-dialog/alert-dialog.component'; import { GfConfirmationDialogComponent } from './confirmation-dialog/confirmation-dialog.component'; import { ConfirmationDialogType } from './confirmation-dialog/confirmation-dialog.type'; import { - IAlertParams, - IConfirmParams, - IPromptParams + AlertParams, + ConfirmParams, + PromptParams } from './interfaces/interfaces'; import { GfPromptDialogComponent } from './prompt-dialog/prompt-dialog.component'; @@ -21,7 +21,7 @@ export class NotificationService { public constructor(private matDialog: MatDialog) {} - public alert(aParams: IAlertParams) { + public alert(aParams: AlertParams) { if (!aParams.discardLabel) { aParams.discardLabel = translate('CLOSE'); } @@ -45,7 +45,7 @@ export class NotificationService { }); } - public confirm(aParams: IConfirmParams) { + public confirm(aParams: ConfirmParams) { if (!aParams.confirmLabel) { aParams.confirmLabel = translate('YES'); } @@ -78,7 +78,7 @@ export class NotificationService { }); } - public prompt(aParams: IPromptParams) { + public prompt(aParams: PromptParams) { if (!aParams.confirmLabel) { aParams.confirmLabel = translate('OK'); } diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.html b/apps/client/src/app/pages/about/overview/about-overview-page.html index 4085498a9..185becba7 100644 --- a/apps/client/src/app/pages/about/overview/about-overview-page.html +++ b/apps/client/src/app/pages/about/overview/about-overview-page.html @@ -175,7 +175,7 @@
-
+
}
+ + @if (user?.subscription?.type !== 'Premium') { +
+
+

Sponsors

+
+ Browser testing via +
+ + LambdaTest Logo + +
+
+
+ }
diff --git a/apps/client/src/app/pages/accounts/accounts-page.component.ts b/apps/client/src/app/pages/accounts/accounts-page.component.ts index f09901e45..3a1616b6f 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.component.ts +++ b/apps/client/src/app/pages/accounts/accounts-page.component.ts @@ -23,6 +23,8 @@ import { EMPTY, Subject, Subscription } from 'rxjs'; import { catchError, takeUntil } from 'rxjs/operators'; import { GfCreateOrUpdateAccountDialogComponent } from './create-or-update-account-dialog/create-or-update-account-dialog.component'; +import { CreateOrUpdateAccountDialogParams } from './create-or-update-account-dialog/interfaces/interfaces'; +import { TransferBalanceDialogParams } from './transfer-balance/interfaces/interfaces'; import { GfTransferBalanceDialogComponent } from './transfer-balance/transfer-balance-dialog.component'; @Component({ @@ -179,7 +181,10 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit { name, platformId }: AccountModel) { - const dialogRef = this.dialog.open(GfCreateOrUpdateAccountDialogComponent, { + const dialogRef = this.dialog.open< + GfCreateOrUpdateAccountDialogComponent, + CreateOrUpdateAccountDialogParams + >(GfCreateOrUpdateAccountDialogComponent, { data: { account: { balance, @@ -227,7 +232,10 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit { } private openAccountDetailDialog(aAccountId: string) { - const dialogRef = this.dialog.open(GfAccountDetailDialogComponent, { + const dialogRef = this.dialog.open< + GfAccountDetailDialogComponent, + AccountDetailDialogParams + >(GfAccountDetailDialogComponent, { autoFocus: false, data: { accountId: aAccountId, @@ -237,7 +245,7 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit { !this.hasImpersonationId && hasPermission(this.user?.permissions, permissions.createOrder) && !this.user?.settings?.isRestrictedView - } as AccountDetailDialogParams, + }, height: this.deviceType === 'mobile' ? '98vh' : '80vh', width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); @@ -253,12 +261,16 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit { } private openCreateAccountDialog() { - const dialogRef = this.dialog.open(GfCreateOrUpdateAccountDialogComponent, { + const dialogRef = this.dialog.open< + GfCreateOrUpdateAccountDialogComponent, + CreateOrUpdateAccountDialogParams + >(GfCreateOrUpdateAccountDialogComponent, { data: { account: { balance: 0, comment: null, currency: this.user?.settings?.baseCurrency, + id: null, isExcluded: false, name: null, platformId: null @@ -295,7 +307,10 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit { } private openTransferBalanceDialog() { - const dialogRef = this.dialog.open(GfTransferBalanceDialogComponent, { + const dialogRef = this.dialog.open< + GfTransferBalanceDialogComponent, + TransferBalanceDialogParams + >(GfTransferBalanceDialogComponent, { data: { accounts: this.accounts }, diff --git a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/interfaces/interfaces.ts b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/interfaces/interfaces.ts index ffe4f14f6..a3e6272f8 100644 --- a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/interfaces/interfaces.ts @@ -1,5 +1,5 @@ import { Account } from '@prisma/client'; export interface CreateOrUpdateAccountDialogParams { - account: Account; + account: Omit; } diff --git a/apps/client/src/app/pages/blog/blog-page.component.ts b/apps/client/src/app/pages/blog/blog-page.component.ts index 65a867f65..7599a3358 100644 --- a/apps/client/src/app/pages/blog/blog-page.component.ts +++ b/apps/client/src/app/pages/blog/blog-page.component.ts @@ -1,19 +1,24 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { Component, OnDestroy } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Component, CUSTOM_ELEMENTS_SCHEMA, OnDestroy } from '@angular/core'; +import { MatCardModule } from '@angular/material/card'; +import { RouterModule } from '@angular/router'; +import { IonIcon } from '@ionic/angular/standalone'; import { addIcons } from 'ionicons'; import { chevronForwardOutline } from 'ionicons/icons'; import { Subject } from 'rxjs'; @Component({ host: { class: 'page' }, + imports: [CommonModule, IonIcon, MatCardModule, RouterModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-blog-page', styleUrls: ['./blog-page.scss'], - templateUrl: './blog-page.html', - standalone: false + templateUrl: './blog-page.html' }) -export class BlogPageComponent implements OnDestroy { +export class GfBlogPageComponent implements OnDestroy { public hasPermissionForSubscription: boolean; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/blog/blog-page.module.ts b/apps/client/src/app/pages/blog/blog-page.module.ts deleted file mode 100644 index 37925e494..000000000 --- a/apps/client/src/app/pages/blog/blog-page.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatCardModule } from '@angular/material/card'; -import { IonIcon } from '@ionic/angular/standalone'; - -import { BlogPageRoutingModule } from './blog-page-routing.module'; -import { BlogPageComponent } from './blog-page.component'; - -@NgModule({ - declarations: [BlogPageComponent], - imports: [BlogPageRoutingModule, CommonModule, IonIcon, MatCardModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class BlogPageModule {} diff --git a/apps/client/src/app/pages/blog/blog-page-routing.module.ts b/apps/client/src/app/pages/blog/blog-page.routes.ts similarity index 95% rename from apps/client/src/app/pages/blog/blog-page-routing.module.ts rename to apps/client/src/app/pages/blog/blog-page.routes.ts index 9b352b7a8..2b5a4be64 100644 --- a/apps/client/src/app/pages/blog/blog-page-routing.module.ts +++ b/apps/client/src/app/pages/blog/blog-page.routes.ts @@ -1,15 +1,14 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { publicRoutes } from '@ghostfolio/common/routes/routes'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; -import { BlogPageComponent } from './blog-page.component'; +import { GfBlogPageComponent } from './blog-page.component'; -const routes: Routes = [ +export const routes: Routes = [ { canActivate: [AuthGuard], - component: BlogPageComponent, + component: GfBlogPageComponent, path: '', title: publicRoutes.blog.title }, @@ -212,9 +211,3 @@ const routes: Routes = [ title: 'Hacktoberfest 2025' } ]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class BlogPageRoutingModule {} diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html index bc468fe96..f44759124 100644 --- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html @@ -184,7 +184,9 @@
  • Open the Admin Control panel
  • Navigate to the Market Data section
  • Choose an asset profile
  • -
  • In the dialog, check the Benchmark box
  • +
  • + In the dialog, check the Include in Benchmark / Markets box +
  • @@ -212,12 +214,13 @@ How do I set up Markets? -

    The Markets list is derived from your Benchmarks.

    1. Open the Admin Control panel
    2. Navigate to the Market Data section
    3. Choose an asset profile
    4. -
    5. In the dialog, check the Benchmark box
    6. +
    7. + In the dialog, check the Include in Benchmark / Markets box +

    Please note: Data is cached, meaning changes may take a few minutes diff --git a/apps/client/src/app/pages/home/home-page.component.ts b/apps/client/src/app/pages/home/home-page.component.ts index eb1ad62d9..fd860ced5 100644 --- a/apps/client/src/app/pages/home/home-page.component.ts +++ b/apps/client/src/app/pages/home/home-page.component.ts @@ -16,11 +16,11 @@ import { RouterModule } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; import { addIcons } from 'ionicons'; import { + albumsOutline, analyticsOutline, bookmarkOutline, newspaperOutline, - readerOutline, - walletOutline + readerOutline } from 'ionicons/icons'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; @@ -61,7 +61,7 @@ export class GfHomePageComponent implements OnDestroy, OnInit { routerLink: internalRoutes.home.routerLink }, { - iconName: 'wallet-outline', + iconName: 'albums-outline', label: internalRoutes.home.subRoutes.holdings.title, routerLink: internalRoutes.home.subRoutes.holdings.routerLink }, @@ -97,11 +97,11 @@ export class GfHomePageComponent implements OnDestroy, OnInit { }); addIcons({ + albumsOutline, analyticsOutline, bookmarkOutline, newspaperOutline, - readerOutline, - walletOutline + readerOutline }); } diff --git a/apps/client/src/app/pages/landing/landing-page.html b/apps/client/src/app/pages/landing/landing-page.html index 7f77c31a7..50602858a 100644 --- a/apps/client/src/app/pages/landing/landing-page.html +++ b/apps/client/src/app/pages/landing/landing-page.html @@ -38,9 +38,8 @@ i18n mat-flat-button [routerLink]="routerLinkRegister" + >Get Started - Get Started - } @if (hasPermissionForDemo) { @if (hasPermissionToCreateUser) { @@ -342,9 +341,8 @@ i18n mat-flat-button [routerLink]="routerLinkRegister" + >Get Started - Get Started - @if (hasPermissionForDemo) {

    or
    (GfImportActivitiesDialogComponent, { data: { deviceType: this.deviceType, user: this.user - } as ImportActivitiesDialogParams, + }, height: this.deviceType === 'mobile' ? '98vh' : undefined, width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); @@ -268,12 +272,15 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit { } public onImportDividends() { - const dialogRef = this.dialog.open(GfImportActivitiesDialogComponent, { + const dialogRef = this.dialog.open< + GfImportActivitiesDialogComponent, + ImportActivitiesDialogParams + >(GfImportActivitiesDialogComponent, { data: { activityTypes: ['DIVIDEND'], deviceType: this.deviceType, user: this.user - } as ImportActivitiesDialogParams, + }, height: this.deviceType === 'mobile' ? '98vh' : undefined, width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); @@ -306,18 +313,18 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit { } public openUpdateActivityDialog(aActivity: Activity) { - const dialogRef = this.dialog.open( + const dialogRef = this.dialog.open< GfCreateOrUpdateActivityDialogComponent, - { - data: { - activity: aActivity, - accounts: this.user?.accounts, - user: this.user - }, - height: this.deviceType === 'mobile' ? '98vh' : '80vh', - width: this.deviceType === 'mobile' ? '100vw' : '50rem' - } - ); + CreateOrUpdateActivityDialogParams + >(GfCreateOrUpdateActivityDialogComponent, { + data: { + activity: aActivity, + accounts: this.user?.accounts, + user: this.user + }, + height: this.deviceType === 'mobile' ? '98vh' : '80vh', + width: this.deviceType === 'mobile' ? '100vw' : '50rem' + }); dialogRef .afterClosed() @@ -350,26 +357,26 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit { .subscribe((user) => { this.updateUser(user); - const dialogRef = this.dialog.open( + const dialogRef = this.dialog.open< GfCreateOrUpdateActivityDialogComponent, - { - data: { - accounts: this.user?.accounts, - activity: { - ...aActivity, - accountId: aActivity?.accountId, - date: new Date(), - id: null, - fee: 0, - type: aActivity?.type ?? 'BUY', - unitPrice: null - }, - user: this.user + CreateOrUpdateActivityDialogParams + >(GfCreateOrUpdateActivityDialogComponent, { + data: { + accounts: this.user?.accounts, + activity: { + ...aActivity, + accountId: aActivity?.accountId, + date: new Date(), + id: null, + fee: 0, + type: aActivity?.type ?? 'BUY', + unitPrice: null }, - height: this.deviceType === 'mobile' ? '98vh' : '80vh', - width: this.deviceType === 'mobile' ? '100vw' : '50rem' - } - ); + user: this.user + }, + height: this.deviceType === 'mobile' ? '98vh' : '80vh', + width: this.deviceType === 'mobile' ? '100vw' : '50rem' + }); dialogRef .afterClosed() diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts index 60a39d361..cc454a66a 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts @@ -4,7 +4,6 @@ import { User } from '@ghostfolio/common/interfaces'; import { Account } from '@prisma/client'; export interface CreateOrUpdateActivityDialogParams { - accountId: string; accounts: Account[]; activity: Activity; user: User; 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 2439a4b65..0c0054e9b 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 @@ -346,6 +346,7 @@ export class GfImportActivitiesDialogComponent implements OnDestroy { isDryRun: true, tags: content.tags }); + this.activities = activities; this.dataSource = new MatTableDataSource(activities.reverse()); this.pageIndex = 0; @@ -360,15 +361,18 @@ export class GfImportActivitiesDialogComponent implements OnDestroy { const content = fileContent.split('\n').slice(1); try { - const data = await this.importActivitiesService.importCsv({ - fileContent, - isDryRun: true, - userAccounts: this.data.user.accounts - }); - this.activities = data.activities; - this.dataSource = new MatTableDataSource(data.activities.reverse()); + const { activities, assetProfiles } = + await this.importActivitiesService.importCsv({ + fileContent, + isDryRun: true, + userAccounts: this.data.user.accounts + }); + + this.activities = activities; + this.assetProfiles = assetProfiles; + this.dataSource = new MatTableDataSource(activities.reverse()); this.pageIndex = 0; - this.totalItems = data.activities.length; + this.totalItems = activities.length; } catch (error) { console.error(error); this.handleImportError({ diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/interfaces/interfaces.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/interfaces/interfaces.ts index a2131db88..051345e60 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/interfaces/interfaces.ts @@ -3,7 +3,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { Type } from '@prisma/client'; export interface ImportActivitiesDialogParams { - activityTypes: Type[]; + activityTypes?: Type[]; deviceType: string; user: User; } diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts index da909a78d..b4de51701 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts @@ -558,7 +558,10 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit { } private openAccountDetailDialog(aAccountId: string) { - const dialogRef = this.dialog.open(GfAccountDetailDialogComponent, { + const dialogRef = this.dialog.open< + GfAccountDetailDialogComponent, + AccountDetailDialogParams + >(GfAccountDetailDialogComponent, { autoFocus: false, data: { accountId: aAccountId, @@ -568,7 +571,7 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit { !this.hasImpersonationId && hasPermission(this.user?.permissions, permissions.createOrder) && !this.user?.settings?.isRestrictedView - } as AccountDetailDialogParams, + }, height: this.deviceType === 'mobile' ? '98vh' : '80vh', width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts index 26d474f73..63ed3569c 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -6,7 +6,7 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { HistoricalDataItem, InvestmentItem, - PortfolioInvestments, + PortfolioInvestmentsResponse, PortfolioPerformance, PortfolioPosition, ToggleOption, @@ -94,7 +94,7 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit { public performanceDataItems: HistoricalDataItem[]; public performanceDataItemsInPercentage: HistoricalDataItem[]; public portfolioEvolutionDataLabel = $localize`Investment`; - public streaks: PortfolioInvestments['streaks']; + public streaks: PortfolioInvestmentsResponse['streaks']; public top3: PortfolioPosition[]; public unitCurrentStreak: string; public unitLongestStreak: string; diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.scss b/apps/client/src/app/pages/portfolio/fire/fire-page.scss index 2892885c9..3a0618ed6 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.scss +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.scss @@ -1,9 +1,21 @@ +@use '../../../../styles/variables.scss' as variables; + +@mixin select-arrow($color) { + background-image: url("data:image/svg+xml;utf8,"); +} + :host { display: block; .safe-withdrawal-rate-select { + @include select-arrow(variables.$dark-primary-text); + + appearance: none; background-color: transparent; + background-position: right 0 center; + background-repeat: no-repeat; color: rgb(var(--dark-primary-text)); + padding: 0 0.75rem 0 0.25rem; &:focus { box-shadow: none; @@ -14,6 +26,8 @@ :host-context(.theme-dark) { .safe-withdrawal-rate-select { + @include select-arrow(variables.$light-primary-text); + color: rgb(var(--light-primary-text)); } } diff --git a/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html b/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html index d4820b59e..af74137d1 100644 --- a/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html +++ b/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html @@ -76,6 +76,7 @@ !hasImpersonationId && hasPermissionToUpdateUserSettings " [isLoading]="isLoading" + [locale]="user?.settings?.locale" [rules]="category.rules" [settings]="user?.settings?.xRayRules" (rulesUpdated)="onRulesUpdated($event)" @@ -90,6 +91,7 @@ !hasImpersonationId && hasPermissionToUpdateUserSettings " [isLoading]="isLoading" + [locale]="user?.settings?.locale" [rules]="inactiveRules" [settings]="user?.settings?.xRayRules" (rulesUpdated)="onRulesUpdated($event)" diff --git a/apps/client/src/app/pages/pricing/pricing-page.component.ts b/apps/client/src/app/pages/pricing/pricing-page.component.ts index 8bc3e3a67..82560246f 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.component.ts +++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -134,9 +134,12 @@ export class GfPricingPageComponent implements OnDestroy, OnInit { public onCheckout() { this.dataService - .createCheckoutSession({ couponId: this.couponId, priceId: this.priceId }) + .createStripeCheckoutSession({ + couponId: this.couponId, + priceId: this.priceId + }) .pipe( - switchMap(({ sessionId }: { sessionId: string }) => { + switchMap(({ sessionId }) => { return this.stripeService.redirectToCheckout({ sessionId }); }), catchError((error) => { diff --git a/apps/client/src/app/pages/pricing/pricing-page.html b/apps/client/src/app/pages/pricing/pricing-page.html index ee006b2d6..bea55f47f 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.html +++ b/apps/client/src/app/pages/pricing/pricing-page.html @@ -374,9 +374,8 @@ i18n mat-flat-button [routerLink]="routerLinkRegister" + >Get Started - Get Started -

    It’s free.

    diff --git a/apps/client/src/app/pages/register/register-page.component.ts b/apps/client/src/app/pages/register/register-page.component.ts index eff4e308b..78162487d 100644 --- a/apps/client/src/app/pages/register/register-page.component.ts +++ b/apps/client/src/app/pages/register/register-page.component.ts @@ -1,5 +1,4 @@ import { DataService } from '@ghostfolio/client/services/data.service'; -import { InternetIdentityService } from '@ghostfolio/client/services/internet-identity.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { InfoItem, LineChartItem } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; @@ -43,7 +42,6 @@ export class GfRegisterPageComponent implements OnDestroy, OnInit { private dataService: DataService, private deviceService: DeviceDetectorService, private dialog: MatDialog, - private internetIdentityService: InternetIdentityService, private router: Router, private tokenStorageService: TokenStorageService ) { @@ -73,29 +71,19 @@ export class GfRegisterPageComponent implements OnDestroy, OnInit { ); } - public async onLoginWithInternetIdentity() { - try { - const { authToken } = await this.internetIdentityService.login(); - - this.tokenStorageService.saveToken(authToken); - - await this.router.navigate(['/']); - } catch {} - } - public openShowAccessTokenDialog() { - const dialogRef = this.dialog.open( + const dialogRef = this.dialog.open< GfUserAccountRegistrationDialogComponent, - { - data: { - deviceType: this.deviceType, - needsToAcceptTermsOfService: this.hasPermissionForSubscription - } as UserAccountRegistrationDialogParams, - disableClose: true, - height: this.deviceType === 'mobile' ? '98vh' : undefined, - width: this.deviceType === 'mobile' ? '100vw' : '30rem' - } - ); + UserAccountRegistrationDialogParams + >(GfUserAccountRegistrationDialogComponent, { + data: { + deviceType: this.deviceType, + needsToAcceptTermsOfService: this.hasPermissionForSubscription + }, + disableClose: true, + height: this.deviceType === 'mobile' ? '98vh' : undefined, + width: this.deviceType === 'mobile' ? '100vw' : '30rem' + }); dialogRef .afterClosed() diff --git a/apps/client/src/app/pages/register/register-page.html b/apps/client/src/app/pages/register/register-page.html index eee49083a..de53777fa 100644 --- a/apps/client/src/app/pages/register/register-page.html +++ b/apps/client/src/app/pages/register/register-page.html @@ -28,20 +28,6 @@ @if (hasPermissionForSocialLogin) {
    or
    - @if (false) { - - }
    -

    Buy and Hold

    +

    Buy and Hold

    Buy and hold is a passive investment strategy where you buy assets and hold them for a long period regardless of fluctuations in the @@ -22,7 +22,7 @@
    -

    Deflation

    +

    Deflation

    Deflation is a decrease of the general price level for goods and services in an economy over a period of time. @@ -38,7 +38,7 @@
    -

    Dollar-Cost Averaging (DCA)

    +

    Dollar-Cost Averaging (DCA)

    Dollar-cost averaging is an investment strategy where you split the total amount to be invested across periodic purchases of a @@ -56,7 +56,7 @@
    -

    Financial Independence

    +

    Financial Independence

    Financial independence is the status of having enough income, for example with a passive income like dividends, to cover your living @@ -73,7 +73,7 @@
    -

    FIRE

    +

    FIRE

    FIRE is a movement that promotes saving and investing to achieve financial independence and early retirement. @@ -85,7 +85,7 @@
    -

    Inflation

    +

    Inflation

    Inflation is an increase of the general price level for goods and services in an economy over a period of time. @@ -102,11 +102,11 @@ @if (hasPermissionForSubscription) {
    -

    Personal Finance Tools

    +

    Personal Finance Tools

    Personal finance tools are software applications that help - individuals manage their money, track expenses, set budgets, - monitor investments, and make informed financial decisions. + manage your money, track expenses, set budgets, monitor + investments, and make informed financial decisions.
    -

    Stagflation

    +

    Stagflation

    Stagflation describes a situation in which there is a stagnant economy with high unemployment and high inflation. @@ -134,7 +134,7 @@
    -

    Stealth Wealth

    +

    Stealth Wealth

    Stealth wealth is a lifestyle choice where you don’t openly show off your wealth, but instead live quietly to maintain privacy and diff --git a/apps/client/src/app/pages/resources/guides/resources-guides.component.html b/apps/client/src/app/pages/resources/guides/resources-guides.component.html index 3bd8efec6..54b3d1f3e 100644 --- a/apps/client/src/app/pages/resources/guides/resources-guides.component.html +++ b/apps/client/src/app/pages/resources/guides/resources-guides.component.html @@ -5,7 +5,7 @@
    -

    Boringly Getting Rich

    +

    Boringly Getting Rich

    The Boringly Getting Rich guide supports you to get started with investing. It introduces a strategy utilizing a broadly @@ -21,7 +21,7 @@
    -

    How do I get my finances in order?

    +

    How do I get my finances in order?

    Before you can think of long-term investing, you have to get your finances in order. Learn how you can reach your financial goals diff --git a/apps/client/src/app/pages/resources/markets/resources-markets.component.html b/apps/client/src/app/pages/resources/markets/resources-markets.component.html index 74d4bb82b..ce780aedf 100644 --- a/apps/client/src/app/pages/resources/markets/resources-markets.component.html +++ b/apps/client/src/app/pages/resources/markets/resources-markets.component.html @@ -3,7 +3,7 @@
    -

    Crypto Coins Heatmap

    +

    Crypto Coins Heatmap

    With the Crypto Coins Heatmap you can track the daily market movements of cryptocurrencies as a visual snapshot. @@ -17,7 +17,7 @@
    -

    Fear & Greed Index

    +

    Fear & Greed Index

    The fear and greed index was developed by CNNMoney to measure the primary emotions (fear and greed) that influence how much @@ -32,7 +32,7 @@
    -

    Inflation Chart

    +

    Inflation Chart

    Inflation Chart helps you find the intrinsic value of stock markets, stock prices, goods and services by adjusting them to the @@ -48,7 +48,7 @@
    -

    Stock Heatmap

    +

    Stock Heatmap

    With the Stock Heatmap you can track the daily market movements of stocks as a visual snapshot. diff --git a/apps/client/src/app/pages/resources/overview/resources-overview.component.html b/apps/client/src/app/pages/resources/overview/resources-overview.component.html index 39d7c1e62..3a6f18d40 100644 --- a/apps/client/src/app/pages/resources/overview/resources-overview.component.html +++ b/apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -5,7 +5,7 @@
    @for (item of overviewItems; track item) {
    -

    {{ item.title }}

    +

    {{ item.title }}

    {{ item.description }}

    Explore {{ item.title }} →
    diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.html b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.html index 3c5c97558..a71ca0038 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.html +++ b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -330,9 +330,9 @@ Ghostfolio.

    diff --git a/apps/client/src/app/pages/zen/zen-page.component.ts b/apps/client/src/app/pages/zen/zen-page.component.ts index 0224c13c7..5ed9fe09c 100644 --- a/apps/client/src/app/pages/zen/zen-page.component.ts +++ b/apps/client/src/app/pages/zen/zen-page.component.ts @@ -8,7 +8,7 @@ import { MatTabsModule } from '@angular/material/tabs'; import { RouterModule } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; import { addIcons } from 'ionicons'; -import { analyticsOutline, walletOutline } from 'ionicons/icons'; +import { albumsOutline, analyticsOutline } from 'ionicons/icons'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -43,7 +43,7 @@ export class GfZenPageComponent implements OnDestroy, OnInit { routerLink: internalRoutes.zen.routerLink }, { - iconName: 'wallet-outline', + iconName: 'albums-outline', label: internalRoutes.zen.subRoutes.holdings.title, routerLink: internalRoutes.zen.subRoutes.holdings.routerLink } @@ -54,7 +54,7 @@ export class GfZenPageComponent implements OnDestroy, OnInit { } }); - addIcons({ analyticsOutline, walletOutline }); + addIcons({ albumsOutline, analyticsOutline }); } public ngOnInit() { diff --git a/apps/client/src/app/services/admin.service.ts b/apps/client/src/app/services/admin.service.ts index 670535291..2f3040ba3 100644 --- a/apps/client/src/app/services/admin.service.ts +++ b/apps/client/src/app/services/admin.service.ts @@ -1,7 +1,7 @@ import { UpdateAssetProfileDto } from '@ghostfolio/api/app/admin/update-asset-profile.dto'; import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto'; import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto'; -import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { HEADER_KEY_SKIP_INTERCEPTOR, HEADER_KEY_TOKEN @@ -12,11 +12,12 @@ import { AdminData, AdminJobs, AdminMarketData, - AdminUsers, + AdminUsersResponse, DataProviderGhostfolioStatusResponse, EnhancedSymbolProfile, Filter } from '@ghostfolio/common/interfaces'; +import { DateRange } from '@ghostfolio/common/types'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; @@ -153,7 +154,7 @@ export class AdminService { params = params.append('skip', skip); params = params.append('take', take); - return this.http.get('/api/v1/admin/user', { params }); + return this.http.get('/api/v1/admin/user', { params }); } public gather7Days() { @@ -178,9 +179,22 @@ export class AdminService { ); } - public gatherSymbol({ dataSource, symbol }: AssetProfileIdentifier) { + public gatherSymbol({ + dataSource, + range, + symbol + }: { + range?: DateRange; + } & AssetProfileIdentifier) { + let params = new HttpParams(); + + if (range) { + params = params.append('range', range); + } + const url = `/api/v1/admin/gather/${dataSource}/${symbol}`; - return this.http.post(url, {}); + + return this.http.post(url, undefined, { params }); } public fetchSymbolForDate({ @@ -194,7 +208,7 @@ export class AdminService { }) { const url = `/api/v1/symbol/${dataSource}/${symbol}/${dateString}`; - return this.http.get(url); + return this.http.get(url); } public patchAssetProfile( diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index c2678924b..6f0b17ed1 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -9,17 +9,13 @@ import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto' import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto'; import { CreateWatchlistItemDto } from '@ghostfolio/api/app/endpoints/watchlist/create-watchlist-item.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; -import { - Activities, - Activity -} from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; import { SymbolItem } from '@ghostfolio/api/app/symbol/interfaces/symbol-item.interface'; import { DeleteOwnUserDto } from '@ghostfolio/api/app/user/delete-own-user.dto'; import { UserItem } from '@ghostfolio/api/app/user/interfaces/user-item.interface'; import { UpdateOwnAccessTokenDto } from '@ghostfolio/api/app/user/update-own-access-token.dto'; import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; -import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { PropertyDto } from '@ghostfolio/api/services/property/property.dto'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { @@ -27,13 +23,17 @@ import { AccessTokenResponse, AccountBalancesResponse, AccountsResponse, + ActivitiesResponse, + ActivityResponse, AiPromptResponse, ApiKeyResponse, AssetProfileIdentifier, - BenchmarkMarketDataDetails, + AssetResponse, + BenchmarkMarketDataDetailsResponse, BenchmarkResponse, + CreateStripeCheckoutSessionResponse, DataProviderHealthResponse, - Export, + ExportResponse, Filter, ImportResponse, InfoItem, @@ -42,10 +42,10 @@ import { MarketDataOfMarketsResponse, OAuthResponse, PortfolioDetails, - PortfolioDividends, + PortfolioDividendsResponse, PortfolioHoldingResponse, PortfolioHoldingsResponse, - PortfolioInvestments, + PortfolioInvestmentsResponse, PortfolioPerformanceResponse, PortfolioReportResponse, PublicPortfolioResponse, @@ -169,17 +169,20 @@ export class DataService { return params; } - public createCheckoutSession({ + public createStripeCheckoutSession({ couponId, priceId }: { couponId?: string; priceId: string; }) { - return this.http.post('/api/v1/subscription/stripe/checkout-session', { - couponId, - priceId - }); + return this.http.post( + '/api/v1/subscription/stripe/checkout-session', + { + couponId, + priceId + } + ); } public fetchAccount(aAccountId: string) { @@ -212,7 +215,7 @@ export class DataService { sortColumn?: string; sortDirection?: SortDirection; take?: number; - }): Observable { + }): Observable { let params = this.buildFiltersAsQueryParams({ filters }); if (range) { @@ -247,7 +250,7 @@ export class DataService { } public fetchActivity(aActivityId: string) { - return this.http.get(`/api/v1/order/${aActivityId}`).pipe( + return this.http.get(`/api/v1/order/${aActivityId}`).pipe( map((activity) => { activity.createdAt = parseISO(activity.createdAt as unknown as string); activity.date = parseISO(activity.date as unknown as string); @@ -270,9 +273,12 @@ export class DataService { params = params.append('groupBy', groupBy); params = params.append('range', range); - return this.http.get('/api/v1/portfolio/dividends', { - params - }); + return this.http.get( + '/api/v1/portfolio/dividends', + { + params + } + ); } public fetchDividendsImport({ dataSource, symbol }: AssetProfileIdentifier) { @@ -288,7 +294,7 @@ export class DataService { date: Date; symbol: string; }) { - return this.http.get( + return this.http.get( `/api/v1/exchange-rate/${symbol}/${format(date, DATE_FORMAT, { in: utc })}` ); } @@ -342,7 +348,7 @@ export class DataService { public fetchAsset({ dataSource, symbol - }: AssetProfileIdentifier): Observable { + }: AssetProfileIdentifier): Observable { return this.http.get(`/api/v1/asset/${dataSource}/${symbol}`).pipe( map((data) => { for (const item of data.marketData) { @@ -365,7 +371,7 @@ export class DataService { range: DateRange; startDate: Date; withExcludedAccounts?: boolean; - } & AssetProfileIdentifier): Observable { + } & AssetProfileIdentifier) { let params = this.buildFiltersAsQueryParams({ filters }); params = params.append('range', range); @@ -374,7 +380,7 @@ export class DataService { params = params.append('withExcludedAccounts', withExcludedAccounts); } - return this.http.get( + return this.http.get( `/api/v1/benchmarks/${dataSource}/${symbol}/${format(startDate, DATE_FORMAT, { in: utc })}`, { params } ); @@ -403,7 +409,7 @@ export class DataService { params = params.append('activityIds', activityIds.join(',')); } - return this.http.get('/api/v1/export', { + return this.http.get('/api/v1/export', { params }); } @@ -460,7 +466,7 @@ export class DataService { params = params.append('groupBy', groupBy); params = params.append('range', range); - return this.http.get( + return this.http.get( '/api/v1/portfolio/investments', { params } ); diff --git a/apps/client/src/app/services/ics/ics.service.ts b/apps/client/src/app/services/ics/ics.service.ts index b94b2dee3..a3235380e 100644 --- a/apps/client/src/app/services/ics/ics.service.ts +++ b/apps/client/src/app/services/ics/ics.service.ts @@ -1,5 +1,5 @@ import { capitalize } from '@ghostfolio/common/helper'; -import { Export } from '@ghostfolio/common/interfaces'; +import { ExportResponse } from '@ghostfolio/common/interfaces'; import { Injectable } from '@angular/core'; import { Type } from '@prisma/client'; @@ -13,7 +13,7 @@ export class IcsService { private readonly ICS_LINE_BREAK = '\r\n'; public transformActivitiesToIcsContent( - aActivities: Export['activities'] + aActivities: ExportResponse['activities'] ): string { const header = [ 'BEGIN:VCALENDAR', diff --git a/apps/client/src/app/services/import-activities.service.ts b/apps/client/src/app/services/import-activities.service.ts index 27a34652b..0f2715e47 100644 --- a/apps/client/src/app/services/import-activities.service.ts +++ b/apps/client/src/app/services/import-activities.service.ts @@ -45,6 +45,7 @@ export class ImportActivitiesService { userAccounts: Account[]; }): Promise<{ activities: Activity[]; + assetProfiles: CreateAssetProfileWithMarketDataDto[]; }> { const content = csvToJson(fileContent, { dynamicTyping: true, @@ -53,23 +54,61 @@ export class ImportActivitiesService { }).data; const activities: CreateOrderDto[] = []; + const assetProfiles: CreateAssetProfileWithMarketDataDto[] = []; + for (const [index, item] of content.entries()) { + const currency = this.parseCurrency({ content, index, item }); + const dataSource = this.parseDataSource({ item }); + const symbol = this.parseSymbol({ content, index, item }); + const type = this.parseType({ content, index, item }); + activities.push({ + currency, + dataSource, + symbol, + type, accountId: this.parseAccount({ item, userAccounts }), comment: this.parseComment({ item }), - currency: this.parseCurrency({ content, index, item }), - dataSource: this.parseDataSource({ item }), date: this.parseDate({ content, index, item }), fee: this.parseFee({ content, index, item }), quantity: this.parseQuantity({ content, index, item }), - symbol: this.parseSymbol({ content, index, item }), - type: this.parseType({ content, index, item }), unitPrice: this.parseUnitPrice({ content, index, item }), updateAccountBalance: false }); + + if (dataSource === DataSource.MANUAL) { + // Create synthetic asset profile for MANUAL data source + assetProfiles.push({ + currency, + symbol, + assetClass: null, + assetSubClass: null, + comment: null, + countries: [], + cusip: null, + dataSource: DataSource.MANUAL, + figi: null, + figiComposite: null, + figiShareClass: null, + holdings: [], + isActive: true, + isin: null, + marketData: [], + name: symbol, + scraperConfiguration: null, + sectors: [], + symbolMapping: {}, + url: null + }); + } } - return await this.importJson({ activities, isDryRun }); + const result = await this.importJson({ + activities, + assetProfiles, + isDryRun + }); + return { ...result, assetProfiles }; } public importJson({ diff --git a/apps/client/src/app/services/internet-identity.service.ts b/apps/client/src/app/services/internet-identity.service.ts deleted file mode 100644 index 30ae13679..000000000 --- a/apps/client/src/app/services/internet-identity.service.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { OAuthResponse } from '@ghostfolio/common/interfaces'; - -import { HttpClient } from '@angular/common/http'; -import { Injectable, OnDestroy } from '@angular/core'; -import { AuthClient } from '@dfinity/auth-client'; -import { EMPTY, Subject } from 'rxjs'; -import { catchError, takeUntil } from 'rxjs/operators'; - -@Injectable({ - providedIn: 'root' -}) -export class InternetIdentityService implements OnDestroy { - private unsubscribeSubject = new Subject(); - - public constructor(private http: HttpClient) {} - - public async login(): Promise { - const authClient = await AuthClient.create({ - idleOptions: { - disableDefaultIdleCallback: true, - disableIdle: true - } - }); - - return new Promise((resolve, reject) => { - authClient.login({ - onError: async () => { - return reject(); - }, - onSuccess: () => { - const principalId = authClient.getIdentity().getPrincipal(); - - this.http - .post(`/api/v1/auth/internet-identity`, { - principalId: principalId.toText() - }) - .pipe( - catchError(() => { - reject(); - return EMPTY; - }), - takeUntil(this.unsubscribeSubject) - ) - .subscribe((response) => { - resolve(response); - }); - } - }); - }); - } - - public ngOnDestroy() { - this.unsubscribeSubject.next(); - this.unsubscribeSubject.complete(); - } -} diff --git a/apps/client/src/app/services/user/user.service.ts b/apps/client/src/app/services/user/user.service.ts index f52a52975..bd9d7d04c 100644 --- a/apps/client/src/app/services/user/user.service.ts +++ b/apps/client/src/app/services/user/user.service.ts @@ -116,18 +116,18 @@ export class UserService extends ObservableStore { permissions.enableSubscriptionInterstitial ) ) { - const dialogRef = this.dialog.open( + const dialogRef = this.dialog.open< GfSubscriptionInterstitialDialogComponent, - { - autoFocus: false, - data: { - user - } as SubscriptionInterstitialDialogParams, - disableClose: true, - height: this.deviceType === 'mobile' ? '98vh' : '80vh', - width: this.deviceType === 'mobile' ? '100vw' : '50rem' - } - ); + SubscriptionInterstitialDialogParams + >(GfSubscriptionInterstitialDialogComponent, { + autoFocus: false, + data: { + user + }, + disableClose: true, + height: this.deviceType === 'mobile' ? '98vh' : '80vh', + width: this.deviceType === 'mobile' ? '100vw' : '50rem' + }); dialogRef .afterClosed() diff --git a/apps/client/src/assets/icons/internet-computer.svg b/apps/client/src/assets/icons/internet-computer.svg deleted file mode 100644 index 6a1bf6c86..000000000 --- a/apps/client/src/assets/icons/internet-computer.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/apps/client/src/assets/images/logo-selfhostedhub.svg b/apps/client/src/assets/images/logo-selfhostedhub.svg new file mode 100644 index 000000000..72fccdc07 --- /dev/null +++ b/apps/client/src/assets/images/logo-selfhostedhub.svg @@ -0,0 +1,2 @@ + + diff --git a/apps/client/src/assets/images/sponsors/logo-lambdatest.png b/apps/client/src/assets/images/sponsors/logo-lambdatest.png new file mode 100644 index 000000000..9e05b1cde Binary files /dev/null and b/apps/client/src/assets/images/sponsors/logo-lambdatest.png differ diff --git a/apps/client/src/assets/oss-friends.json b/apps/client/src/assets/oss-friends.json index 827b56c3a..2fbf5e27d 100644 --- a/apps/client/src/assets/oss-friends.json +++ b/apps/client/src/assets/oss-friends.json @@ -1,5 +1,5 @@ { - "createdAt": "2025-09-17T00:00:00.000Z", + "createdAt": "2025-10-31T00:00:00.000Z", "data": [ { "name": "Activepieces", @@ -16,6 +16,11 @@ "description": "Argos provides the developer tools to debug tests and detect visual regressions.", "href": "https://argos-ci.com" }, + { + "name": "Bifrost", + "description": "Fastest LLM gateway with adaptive load balancer, cluster mode, guardrails, 1000+ models support & <100 µs overhead at 5k RPS.", + "href": "https://www.getmaxim.ai/bifrost" + }, { "name": "Cal.com", "description": "Cal.com is a scheduling tool that helps you schedule meetings without the back-and-forth emails.", @@ -56,11 +61,6 @@ "description": "Inbox Zero makes it easy to clean up your inbox and reach inbox zero fast. It provides bulk newsletter unsubscribe, cold email blocking, email analytics, and AI automations.", "href": "https://getinboxzero.com" }, - { - "name": "Infisical", - "description": "Open source, end-to-end encrypted platform that lets you securely manage secrets and configs across your team, devices, and infrastructure.", - "href": "https://infisical.com" - }, { "name": "KeepHQ", "description": "Keep is an open-source AIOps (AI for IT operations) platform", diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 20f803e84..7513eedaf 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -5,8 +5,8 @@ Features Característiques - apps/client/src/app/app.component.html - 79 + apps/client/src/app/components/footer/footer.component.html + 29 apps/client/src/app/components/header/header.component.html @@ -38,11 +38,11 @@ apps/client/src/app/components/header/header.component.ts - 279 + 283 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 60 libs/common/src/lib/routes/routes.ts @@ -101,8 +101,8 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. El risc d’assumir pèrdues en les inversions és substancial. No és recomanable invertir diners que pugui necessitar a curt termini. - apps/client/src/app/app.component.html - 221 + apps/client/src/app/components/footer/footer.component.html + 171 @@ -290,6 +290,14 @@ 11 + + please + please + + apps/client/src/app/pages/pricing/pricing-page.html + 350 + + Permission Permisos @@ -390,14 +398,6 @@ 86 - - Holdings - En cartera - - libs/ui/src/lib/assistant/assistant.html - 110 - - Cash Balances Balanç de Caixa @@ -423,11 +423,11 @@ Nom apps/client/src/app/components/admin-market-data/admin-market-data.html - 89 + 88 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 286 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -463,7 +463,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 137 + 135 + + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -491,15 +495,15 @@ Divisa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 201 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 293 + 311 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 47 + 45 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -515,7 +519,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 280 + 281 @@ -551,11 +555,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 297 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -579,7 +583,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 268 + 267 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -595,7 +599,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 451 @@ -603,11 +607,11 @@ Suprimir apps/client/src/app/components/admin-market-data/admin-market-data.html - 290 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 68 + 86 apps/client/src/app/components/admin-overview/admin-overview.html @@ -631,7 +635,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 461 + 478 libs/ui/src/lib/benchmark/benchmark.component.html @@ -663,7 +667,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 160 + 161 @@ -683,7 +687,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 567 @@ -695,11 +699,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 106 + 105 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 179 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -823,7 +827,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 169 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -835,7 +839,7 @@ Preu de Mercat apps/client/src/app/components/admin-market-data/admin-market-data.html - 133 + 132 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -895,11 +899,11 @@ Primera Activitat apps/client/src/app/components/admin-market-data/admin-market-data.html - 148 + 147 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 194 + 212 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -915,7 +919,7 @@ Nombre d’Activitats apps/client/src/app/components/admin-market-data/admin-market-data.html - 157 + 156 @@ -923,7 +927,7 @@ Dades Històriques apps/client/src/app/components/admin-market-data/admin-market-data.html - 166 + 165 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -935,7 +939,7 @@ Nombre de Sectors apps/client/src/app/components/admin-market-data/admin-market-data.html - 175 + 174 @@ -943,7 +947,7 @@ Nombre de Països apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 183 @@ -951,11 +955,11 @@ Recopilar Dades del Perfil apps/client/src/app/components/admin-market-data/admin-market-data.html - 235 + 234 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 48 + 66 @@ -963,7 +967,7 @@ Eliminar Perfils apps/client/src/app/components/admin-market-data/admin-market-data.html - 243 + 242 @@ -1003,7 +1007,7 @@ El preu de mercat actual és apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 639 + 672 @@ -1035,7 +1039,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 239 + 257 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1047,7 +1051,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 250 + 268 apps/client/src/app/components/admin-users/admin-users.html @@ -1063,11 +1067,11 @@ Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 274 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1083,11 +1087,11 @@ Països apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 266 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 504 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1099,7 +1103,7 @@ Mapatge de Símbols apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 357 + 379 @@ -1115,7 +1119,7 @@ Configuració del Proveïdor de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 382 + 404 @@ -1123,7 +1127,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 504 @@ -1131,11 +1135,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 464 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 516 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1151,7 +1155,7 @@ Notes apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 529 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1183,7 +1187,7 @@ Afegir manualment apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 19 + 18 @@ -1191,11 +1195,11 @@ Nom, símbol o ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 132 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 29 + 27 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html @@ -1275,7 +1279,7 @@ Afegir Divisa apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 22 + 20 @@ -1299,7 +1303,7 @@ Recollida de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1358,6 +1362,14 @@ 200 + + Activities + Activities + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 61 + + Add Platform Afegeix Plataforma @@ -1371,7 +1383,7 @@ Està segur que vol eliminar aquesta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 108 @@ -1382,6 +1394,14 @@ 8 + + Current year + Current year + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + + Add platform Afegeix una plataforma @@ -1427,7 +1447,7 @@ Està segur que vol eliminar aquesta etiqueta? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 103 + 104 @@ -1451,7 +1471,7 @@ Està segur que vol eliminar aquest usuari? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 211 @@ -1487,7 +1507,7 @@ Actuar com un altre Usuari apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -1495,7 +1515,7 @@ Eliminar Usuari apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -1543,7 +1563,7 @@ Punt de Referència apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 351 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1622,24 +1642,16 @@ 5 - - Get started - Primers Passos - - apps/client/src/app/components/header/header.component.html - 432 - - Oops! Incorrect Security Token. Oooh! El testimoni de seguretat és incorrecte. apps/client/src/app/components/header/header.component.ts - 294 + 298 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 153 + 154 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1675,7 +1687,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 190 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1890,6 +1902,14 @@ 52 + + Current week + Current week + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + + Add activity Afegeix activitat @@ -1955,15 +1975,15 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 451 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1973,6 +1993,10 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html 81 + + apps/client/src/app/pages/pricing/pricing-page.html + 343 + apps/client/src/app/pages/register/register-page.html 31 @@ -1982,20 +2006,12 @@ 30 - - Sign in with Internet Identity - Inicieu la sessió amb la identitat d’Internet - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 - - Sign in with Google Inicieu la sessió amb Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 37 @@ -2003,7 +2019,7 @@ Manteniu la sessió iniciada apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 48 @@ -2111,7 +2127,7 @@ Valor net apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 264 @@ -2119,7 +2135,7 @@ Rendiment anualitzat apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 274 + 277 @@ -2279,39 +2295,55 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 YTD YTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 1Y 1 any + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 5Y 5 anys + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 Max Màx + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 216 + libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -2379,7 +2411,7 @@ Introduïu el vostre codi de cupó. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -2387,7 +2419,7 @@ No s’ha pogut bescanviar el codi de cupó apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -2395,7 +2427,7 @@ El codi del cupó s’ha bescanviat apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -2403,7 +2435,7 @@ Torna a carregar apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -2466,6 +2498,14 @@ 280 + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 + + Oops! There was an error setting up biometric authentication. Ups! Hi ha hagut un error en configurar l’autenticació biomètrica. @@ -2519,7 +2559,7 @@ Localització apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 419 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2683,7 +2723,7 @@ D’acord apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -2706,8 +2746,8 @@ About Sobre - apps/client/src/app/app.component.html - 70 + apps/client/src/app/components/footer/footer.component.html + 20 apps/client/src/app/components/header/header.component.html @@ -2730,8 +2770,8 @@ Changelog Registre de canvis - apps/client/src/app/app.component.html - 77 + apps/client/src/app/components/footer/footer.component.html + 27 apps/client/src/app/pages/about/changelog/changelog-page.html @@ -2746,8 +2786,8 @@ License llicència - apps/client/src/app/app.component.html - 89 + apps/client/src/app/components/footer/footer.component.html + 39 apps/client/src/app/pages/about/license/license-page.html @@ -2762,8 +2802,8 @@ Privacy Policy Política de privadesa - apps/client/src/app/app.component.html - 105 + apps/client/src/app/components/footer/footer.component.html + 55 apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html @@ -2837,13 +2877,17 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Oops, cash balance transfer has failed. Vaja, la transferència del saldo en efectiu ha fallat. apps/client/src/app/pages/accounts/accounts-page.component.ts - 324 + 339 @@ -2959,7 +3003,7 @@ Visió general apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 113 apps/client/src/app/components/header/header.component.html @@ -2994,8 +3038,8 @@ Blog Bloc - apps/client/src/app/app.component.html - 74 + apps/client/src/app/components/footer/footer.component.html + 24 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html @@ -3114,8 +3158,8 @@ Frequently Asked Questions (FAQ) Preguntes freqüents (FAQ) - apps/client/src/app/app.component.html - 83 + apps/client/src/app/components/footer/footer.component.html + 33 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -3282,14 +3326,34 @@ Get Started Comença + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Holdings @@ -3314,6 +3378,10 @@ libs/common/src/lib/routes/routes.ts 167 + + libs/ui/src/lib/assistant/assistant.html + 110 + Summary @@ -3331,8 +3399,12 @@ Markets Mercats - apps/client/src/app/app.component.html - 61 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + + + apps/client/src/app/components/footer/footer.component.html + 11 apps/client/src/app/components/header/header.component.html @@ -3427,32 +3499,12 @@ 11 - - Get Started - Comença - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 447 - - - apps/client/src/app/pages/pricing/pricing-page.html - 351 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - Monthly Active Users Usuaris actius mensuals apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -3460,7 +3512,7 @@ Estrelles a GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -3472,7 +3524,7 @@ Activa el Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -3484,7 +3536,7 @@ Com es veu a apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -3492,7 +3544,7 @@ Protegeix els teus actius. Refina la teva estratègia d’inversió personal. apps/client/src/app/pages/landing/landing-page.html - 226 + 124 @@ -3500,7 +3552,7 @@ Ghostfolio permet a la gent ocupada fer un seguiment d’accions, ETF o criptomonedes sense ser rastrejada. apps/client/src/app/pages/landing/landing-page.html - 230 + 128 @@ -3508,7 +3560,7 @@ Vista de 360° apps/client/src/app/pages/landing/landing-page.html - 240 + 138 @@ -3516,7 +3568,7 @@ Obtingueu la imatge completa de les vostres finances personals en múltiples plataformes. apps/client/src/app/pages/landing/landing-page.html - 243 + 141 @@ -3524,7 +3576,7 @@ Web3 llest apps/client/src/app/pages/landing/landing-page.html - 251 + 149 @@ -3532,7 +3584,7 @@ Utilitza Ghostfolio de manera anònima i sigues propietari de les teves dades financeres. apps/client/src/app/pages/landing/landing-page.html - 254 + 152 @@ -3540,7 +3592,7 @@ Beneficia’t de millores contínues gràcies a una comunitat forta. apps/client/src/app/pages/landing/landing-page.html - 264 + 162 @@ -3556,7 +3608,7 @@ Per què Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 272 + 170 @@ -3564,7 +3616,7 @@ Ghostfolio és per a tu si ets... apps/client/src/app/pages/landing/landing-page.html - 274 + 172 @@ -3572,7 +3624,7 @@ negociar accions, ETF o criptomonedes en múltiples plataformes apps/client/src/app/pages/landing/landing-page.html - 280 + 178 @@ -3580,7 +3632,7 @@ perseguint una compra & mantenir l’estratègia apps/client/src/app/pages/landing/landing-page.html - 286 + 184 @@ -3588,7 +3640,7 @@ interessat a obtenir informació sobre la composició de la vostra cartera apps/client/src/app/pages/landing/landing-page.html - 291 + 189 @@ -3596,7 +3648,7 @@ valorant la privadesa i la propietat de les dades apps/client/src/app/pages/landing/landing-page.html - 296 + 194 @@ -3604,7 +3656,7 @@ al minimalisme apps/client/src/app/pages/landing/landing-page.html - 299 + 197 @@ -3612,7 +3664,7 @@ preocupant-se per diversificar els seus recursos econòmics apps/client/src/app/pages/landing/landing-page.html - 303 + 201 @@ -3620,7 +3672,7 @@ interessada en la independència financera apps/client/src/app/pages/landing/landing-page.html - 307 + 205 @@ -3628,7 +3680,7 @@ dir no als fulls de càlcul apps/client/src/app/pages/landing/landing-page.html - 311 + 209 @@ -3636,7 +3688,7 @@ encara llegint aquesta llista apps/client/src/app/pages/landing/landing-page.html - 314 + 212 @@ -3644,7 +3696,7 @@ Més informació sobre Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 319 + 217 @@ -3652,7 +3704,7 @@ Que nostre usuaris estan dient apps/client/src/app/pages/landing/landing-page.html - 328 + 226 @@ -3660,7 +3712,7 @@ Membres de tot el món estan utilitzant Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 367 + 265 @@ -3668,7 +3720,7 @@ Com ho fa Ghostfolio treballar? apps/client/src/app/pages/landing/landing-page.html - 384 + 282 @@ -3676,7 +3728,7 @@ Comença en només 3 passos apps/client/src/app/pages/landing/landing-page.html - 386 + 284 @@ -3692,7 +3744,7 @@ Registra’t de manera anònima* apps/client/src/app/pages/landing/landing-page.html - 392 + 290 @@ -3700,7 +3752,7 @@ * no es requereix cap adreça de correu electrònic ni targeta de crèdit apps/client/src/app/pages/landing/landing-page.html - 394 + 292 @@ -3708,7 +3760,7 @@ Afegiu qualsevol de les vostres transaccions històriques apps/client/src/app/pages/landing/landing-page.html - 406 + 304 @@ -3716,7 +3768,7 @@ Obteniu informació valuosa sobre la composició de la vostra cartera apps/client/src/app/pages/landing/landing-page.html - 418 + 316 @@ -3724,7 +3776,7 @@ Són tu llest? apps/client/src/app/pages/landing/landing-page.html - 432 + 330 @@ -3732,7 +3784,7 @@ Uneix-te ara o consulteu el compte d’exemple apps/client/src/app/pages/landing/landing-page.html - 435 + 333 @@ -3759,6 +3811,14 @@ 62 + + with your university e-mail address + with your university e-mail address + + apps/client/src/app/pages/pricing/pricing-page.html + 365 + + Active Users Usuaris actius @@ -3852,7 +3912,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 221 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -3960,7 +4020,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 214 + 215 @@ -3976,7 +4036,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 375 + 380 @@ -3992,7 +4052,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 387 + 392 @@ -4051,8 +4111,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -4307,6 +4367,14 @@ 138 + + Looking for a student discount? + Looking for a student discount? + + apps/client/src/app/pages/pricing/pricing-page.html + 359 + + Dividend Dividend @@ -4320,7 +4388,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 310 apps/client/src/app/pages/features/features-page.html @@ -4363,6 +4431,14 @@ 88 + + here + here + + apps/client/src/app/pages/pricing/pricing-page.html + 364 + + Monthly Mensualment @@ -4379,6 +4455,14 @@ 91 + + Close Holding + Close Holding + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 442 + + Absolute Asset Performance Rendiment absolut dels actius @@ -4503,8 +4587,8 @@ Pricing Preus - apps/client/src/app/app.component.html - 99 + apps/client/src/app/components/footer/footer.component.html + 49 apps/client/src/app/components/header/header.component.html @@ -4704,7 +4788,7 @@ És gratuït. apps/client/src/app/pages/pricing/pricing-page.html - 353 + 379 @@ -4759,20 +4843,12 @@ 281 - - Continue with Internet Identity - Continueu amb Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Continueu amb Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -5040,6 +5116,14 @@ 210 + + User ID + User ID + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + + Free Plan Pla gratuït @@ -5096,8 +5180,8 @@ Resources Recursos - apps/client/src/app/app.component.html - 64 + apps/client/src/app/components/footer/footer.component.html + 14 apps/client/src/app/components/header/header.component.html @@ -5128,6 +5212,14 @@ 37 + + Request it + Request it + + apps/client/src/app/pages/pricing/pricing-page.html + 361 + + Access Access @@ -5189,7 +5281,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 400 + 405 @@ -5201,7 +5293,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 413 + 418 @@ -5217,7 +5309,7 @@ Esborrany libs/ui/src/lib/activities-table/activities-table.component.html - 144 + 142 @@ -5225,7 +5317,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 457 @@ -5233,7 +5325,7 @@ Exporta l’esborrany com a ICS libs/ui/src/lib/activities-table/activities-table.component.html - 450 + 467 @@ -5241,7 +5333,7 @@ De veritat vols suprimir aquestes activitats? libs/ui/src/lib/activities-table/activities-table.component.ts - 270 + 276 @@ -5249,7 +5341,7 @@ Realment vols suprimir aquesta activitat? libs/ui/src/lib/activities-table/activities-table.component.ts - 280 + 286 @@ -5257,15 +5349,19 @@ Setmana fins avui libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 WTD WTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5273,15 +5369,19 @@ Mes fins a la data libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 MTD MTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5289,12 +5389,16 @@ Any fins a la data libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 year any + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 290 @@ -5305,15 +5409,19 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 years anys + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -5323,29 +5431,33 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Date Range Interval de dates libs/ui/src/lib/assistant/assistant.html - 171 + 170 - + Reset Filters Restableix els filtres libs/ui/src/lib/assistant/assistant.html - 266 + 204 - + Apply Filters Aplicar filtres libs/ui/src/lib/assistant/assistant.html - 276 + 217 @@ -5388,6 +5500,14 @@ 117 + + contact us + contact us + + apps/client/src/app/pages/pricing/pricing-page.html + 353 + + from ATH de l’ATH @@ -5433,7 +5553,7 @@ Import total previst libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 60 + 59 @@ -5453,7 +5573,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 295 + 298 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5509,14 +5629,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 312 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -5533,15 +5653,15 @@ Classe d’actius apps/client/src/app/components/admin-market-data/admin-market-data.html - 115 + 114 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 230 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 303 + 321 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5551,29 +5671,29 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Asset Sub Class Subclasse d’actiu apps/client/src/app/components/admin-market-data/admin-market-data.html - 124 + 123 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 221 + 239 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 337 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5709,7 +5829,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -5745,15 +5865,15 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 75 + 74 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 150 + 168 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 39 + 37 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5767,14 +5887,14 @@ Tag Etiqueta - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Year @@ -5784,6 +5904,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Years Anys @@ -5813,7 +5941,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 238 + 239 libs/ui/src/lib/i18n.ts @@ -6077,11 +6205,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6124,8 +6252,8 @@ Community Comunitat - apps/client/src/app/app.component.html - 130 + apps/client/src/app/components/footer/footer.component.html + 80 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -6197,7 +6325,7 @@ Open Source apps/client/src/app/pages/landing/landing-page.html - 261 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6208,8 +6336,8 @@ Personal Finance Personal Finance - apps/client/src/app/app.component.html - 57 + apps/client/src/app/components/footer/footer.component.html + 7 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6296,6 +6424,14 @@ 83 + + View Holding + View Holding + + libs/ui/src/lib/activities-table/activities-table.component.html + 444 + + Canada Canada @@ -6413,7 +6549,7 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 630 + 663 @@ -6453,7 +6589,7 @@ Inactive apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html - 87 + 88 @@ -6461,15 +6597,15 @@ Cancel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 143 + 161 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 580 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 59 + 57 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6517,11 +6653,11 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 582 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 61 + 59 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6556,6 +6692,14 @@ 11 + + Role + Role + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 31 + + Yes Yes @@ -6568,8 +6712,8 @@ Accounts Accounts - libs/ui/src/lib/assistant/assistant.html - 84 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 51 @@ -6596,6 +6740,14 @@ 63 + + If you plan to open an account at + If you plan to open an account at + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + + Performance with currency effect Performance Performance with currency effect Performance @@ -6665,7 +6817,7 @@ Oops! Invalid currency. apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 50 + 48 @@ -6700,6 +6852,14 @@ 163 + + to use our referral link and get a Ghostfolio Premium membership for one year + to use our referral link and get a Ghostfolio Premium membership for one year + + apps/client/src/app/pages/pricing/pricing-page.html + 357 + + can be self-hosted can be self-hosted @@ -6844,6 +7004,14 @@ 293 + + Engagement per Day + Engagement per Day + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 76 + + Guides Guides @@ -6955,7 +7123,7 @@ Could not generate an API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -6963,7 +7131,7 @@ Set this API key in your self-hosted environment: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -6971,7 +7139,7 @@ Ghostfolio Premium Data Provider API Key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -6979,7 +7147,15 @@ Do you really want to generate a new API key? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 + + + + Country + Country + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 37 @@ -7019,11 +7195,11 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 591 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 70 + 68 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -7071,7 +7247,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 251 + 260 @@ -7119,7 +7295,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7127,7 +7303,15 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 + + + + API Requests Today + API Requests Today + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 86 @@ -7135,7 +7319,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 391 + 413 @@ -7143,7 +7327,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 432 + 454 @@ -7151,7 +7335,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 470 @@ -7159,7 +7343,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 404 + 426 @@ -7167,7 +7351,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7175,7 +7359,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 @@ -7203,7 +7387,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7223,11 +7407,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7323,11 +7507,11 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 169 + 170 @@ -7335,7 +7519,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 237 @@ -7343,7 +7527,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7351,7 +7535,7 @@ Generate Security Token apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -7387,8 +7571,8 @@ Terms of Service Terms of Service - apps/client/src/app/app.component.html - 112 + apps/client/src/app/components/footer/footer.component.html + 62 libs/common/src/lib/routes/routes.ts @@ -7408,7 +7592,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 566 + 599 @@ -7416,7 +7600,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 574 + 607 @@ -7424,7 +7608,7 @@ Apply apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 153 @@ -7440,7 +7624,7 @@ Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 226 + 225 @@ -7448,7 +7632,7 @@ Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 231 + 230 @@ -7456,7 +7640,7 @@ Gather Historical Market Data apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 33 + 34 @@ -7612,15 +7796,7 @@ 158 - - Name - Name - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Quick Links @@ -7628,24 +7804,16 @@ 58 - - Asset Profiles - Asset Profiles - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Live Demo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 452 + 349 libs/common/src/lib/routes/routes.ts @@ -7770,6 +7938,14 @@ 5 + + Current month + Current month + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + + new new @@ -7936,7 +8112,7 @@ Do you really want to generate a new security token? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 174 + 175 @@ -7992,7 +8168,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 466 @@ -8016,7 +8192,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 110 + 113 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -8407,6 +8583,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 23 + + Follow Ghostfolio on LinkedIn Follow Ghostfolio on LinkedIn diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 9211617f0..a3583df02 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -25,8 +25,8 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. Das Ausfallrisiko beim Börsenhandel kann erheblich sein. Es ist nicht ratsam, Geld zu investieren, welches du kurzfristig benötigst. - apps/client/src/app/app.component.html - 221 + apps/client/src/app/components/footer/footer.component.html + 171 @@ -37,6 +37,14 @@ 11 + + please + bitte + + apps/client/src/app/pages/pricing/pricing-page.html + 350 + + Type Typ @@ -54,7 +62,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 160 + 161 @@ -94,11 +102,11 @@ Name apps/client/src/app/components/admin-market-data/admin-market-data.html - 89 + 88 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 286 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -134,7 +142,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 137 + 135 + + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -190,11 +202,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 297 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -218,7 +230,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 268 + 267 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -234,7 +246,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 451 @@ -242,11 +254,11 @@ Löschen apps/client/src/app/components/admin-market-data/admin-market-data.html - 290 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 68 + 86 apps/client/src/app/components/admin-overview/admin-overview.html @@ -270,7 +282,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 461 + 478 libs/ui/src/lib/benchmark/benchmark.component.html @@ -302,11 +314,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 106 + 105 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 179 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -368,6 +380,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Historical Market Data @@ -378,7 +394,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 567 @@ -426,7 +442,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 169 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -438,7 +454,7 @@ Marktpreis apps/client/src/app/components/admin-market-data/admin-market-data.html - 133 + 132 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -454,11 +470,11 @@ Erste Aktivität apps/client/src/app/components/admin-market-data/admin-market-data.html - 148 + 147 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 194 + 212 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -482,7 +498,7 @@ Historische Daten apps/client/src/app/components/admin-market-data/admin-market-data.html - 166 + 165 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -534,7 +550,7 @@ Letzte historische Marktdaten synchronisieren apps/client/src/app/components/admin-market-data/admin-market-data.html - 226 + 225 @@ -542,7 +558,7 @@ Alle historischen Marktdaten synchronisieren apps/client/src/app/components/admin-market-data/admin-market-data.html - 231 + 230 @@ -550,11 +566,11 @@ Profildaten synchronisieren apps/client/src/app/components/admin-market-data/admin-market-data.html - 235 + 234 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 48 + 66 @@ -562,7 +578,7 @@ Währung hinzufügen apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 22 + 20 @@ -625,12 +641,20 @@ 200 + + Activities + Aktivitäten + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 61 + + Do you really want to delete this user? Möchtest du diesen Benutzer wirklich löschen? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 211 @@ -684,14 +708,34 @@ Get Started Registrieren + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Sign in @@ -702,11 +746,11 @@ apps/client/src/app/components/header/header.component.ts - 279 + 283 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 60 libs/common/src/lib/routes/routes.ts @@ -722,11 +766,11 @@ Ups! Falsches Sicherheits-Token. apps/client/src/app/components/header/header.component.ts - 294 + 298 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 153 + 154 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -790,15 +834,15 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 451 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -808,6 +852,10 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html 81 + + apps/client/src/app/pages/pricing/pricing-page.html + 343 + apps/client/src/app/pages/register/register-page.html 31 @@ -817,20 +865,12 @@ 30 - - Sign in with Internet Identity - Einloggen mit Internet Identity - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 - - Sign in with Google Einloggen mit Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 37 @@ -838,7 +878,7 @@ Eingeloggt bleiben apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 48 @@ -894,7 +934,7 @@ Gesamtvermögen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 264 @@ -902,7 +942,7 @@ Performance pro Jahr apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 274 + 277 @@ -918,11 +958,11 @@ Sektoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 274 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -938,11 +978,11 @@ Länder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 266 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 504 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1010,39 +1050,55 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 YTD YTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 1Y 1J + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 5Y 5J + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 Max Max + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 216 + libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -1050,7 +1106,7 @@ Okay apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -1065,8 +1121,8 @@ About Über Ghostfolio - apps/client/src/app/app.component.html - 70 + apps/client/src/app/components/footer/footer.component.html + 20 apps/client/src/app/components/header/header.component.html @@ -1089,8 +1145,8 @@ Privacy Policy Datenschutzbestimmungen - apps/client/src/app/app.component.html - 105 + apps/client/src/app/components/footer/footer.component.html + 55 apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html @@ -1118,7 +1174,7 @@ Bitte gebe deinen Gutscheincode ein. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -1126,7 +1182,7 @@ Gutscheincode konnte nicht eingelöst werden apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -1134,7 +1190,7 @@ Gutscheincode wurde eingelöst apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -1142,7 +1198,7 @@ Neu laden apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -1206,7 +1262,7 @@ Lokalität apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 419 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1308,6 +1364,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Update account @@ -1330,15 +1390,15 @@ Währung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 201 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 293 + 311 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 47 + 45 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1354,7 +1414,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 280 + 281 @@ -1417,8 +1477,8 @@ Blog Blog - apps/client/src/app/app.component.html - 74 + apps/client/src/app/components/footer/footer.component.html + 24 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html @@ -1529,8 +1589,8 @@ Frequently Asked Questions (FAQ) Häufig gestellte Fragen (FAQ) - apps/client/src/app/app.component.html - 83 + apps/client/src/app/components/footer/footer.component.html + 33 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1549,8 +1609,8 @@ Features Features - apps/client/src/app/app.component.html - 79 + apps/client/src/app/components/footer/footer.component.html + 29 apps/client/src/app/components/header/header.component.html @@ -1570,7 +1630,7 @@ Übersicht apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 113 apps/client/src/app/components/header/header.component.html @@ -1605,8 +1665,12 @@ Markets Märkte - apps/client/src/app/app.component.html - 61 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + + + apps/client/src/app/components/footer/footer.component.html + 11 apps/client/src/app/components/header/header.component.html @@ -1804,10 +1868,6 @@ libs/common/src/lib/routes/routes.ts 167 - - - Holdings - Positionen libs/ui/src/lib/assistant/assistant.html 110 @@ -1821,6 +1881,14 @@ 10 + + Current week + Aktuelle Woche + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + + Add activity Aktivität hinzufügen @@ -1850,11 +1918,11 @@ Name, Symbol oder ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 132 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 29 + 27 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html @@ -1878,7 +1946,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 190 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1894,7 +1962,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 214 + 215 @@ -1902,7 +1970,7 @@ Kommentar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 529 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1926,7 +1994,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 221 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -1985,8 +2053,8 @@ Pricing Preise - apps/client/src/app/app.component.html - 99 + apps/client/src/app/components/footer/footer.component.html + 49 apps/client/src/app/components/header/header.component.html @@ -2073,20 +2141,12 @@ 281 - - Continue with Internet Identity - Weiter mit Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Weiter mit Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -2101,8 +2161,8 @@ Resources Ressourcen - apps/client/src/app/app.component.html - 64 + apps/client/src/app/components/footer/footer.component.html + 14 apps/client/src/app/components/header/header.component.html @@ -2150,7 +2210,7 @@ Geplant libs/ui/src/lib/activities-table/activities-table.component.html - 144 + 142 @@ -2166,7 +2226,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 375 + 380 @@ -2178,7 +2238,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 400 + 405 @@ -2190,7 +2250,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 413 + 418 @@ -2198,7 +2258,7 @@ Kopieren libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 457 @@ -2206,7 +2266,7 @@ Geplante Aktivität als ICS exportieren libs/ui/src/lib/activities-table/activities-table.component.html - 450 + 467 @@ -2214,7 +2274,7 @@ Möchtest du diese Aktivität wirklich löschen? libs/ui/src/lib/activities-table/activities-table.component.ts - 280 + 286 @@ -2225,6 +2285,14 @@ 117 + + contact us + kontaktiere uns + + apps/client/src/app/pages/pricing/pricing-page.html + 353 + + from ATH vom AZH @@ -2257,14 +2325,6 @@ 56 - - Get started - Registrieren - - apps/client/src/app/components/header/header.component.html - 432 - - This feature is currently unavailable. Diese Funktion ist derzeit nicht verfügbar. @@ -2322,7 +2382,7 @@ Sektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 239 + 257 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2334,7 +2394,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 250 + 268 apps/client/src/app/components/admin-users/admin-users.html @@ -2406,7 +2466,7 @@ Projizierter Gesamtbetrag libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 60 + 59 @@ -2434,7 +2494,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 295 + 298 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2458,7 +2518,7 @@ Anzahl Länder apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 183 @@ -2466,7 +2526,7 @@ Anzahl Sektoren apps/client/src/app/components/admin-market-data/admin-market-data.html - 175 + 174 @@ -2550,7 +2610,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 351 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -2642,14 +2702,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 312 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -2658,15 +2718,15 @@ Anlageklasse apps/client/src/app/components/admin-market-data/admin-market-data.html - 115 + 114 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 230 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 303 + 321 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2676,14 +2736,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Symbol @@ -2694,15 +2754,15 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 75 + 74 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 150 + 168 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 39 + 37 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2716,14 +2776,14 @@ Tag Tag - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Cash @@ -2854,7 +2914,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -2874,11 +2934,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -2966,7 +3026,7 @@ Anzahl Aktivitäten apps/client/src/app/components/admin-market-data/admin-market-data.html - 157 + 156 @@ -2982,7 +3042,7 @@ Symbol Zuordnung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 357 + 379 @@ -2993,6 +3053,14 @@ 425 + + Looking for a student discount? + Suchst du nach einem Studentenrabatt? + + apps/client/src/app/pages/pricing/pricing-page.html + 359 + + Dividend Dividenden @@ -3006,7 +3074,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 310 apps/client/src/app/pages/features/features-page.html @@ -3030,15 +3098,15 @@ Anlageunterklasse apps/client/src/app/components/admin-market-data/admin-market-data.html - 124 + 123 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 221 + 239 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 337 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3125,8 +3193,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3158,7 +3226,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 387 + 392 @@ -3477,32 +3545,12 @@ 303 - - Get Started - Jetzt loslegen - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 447 - - - apps/client/src/app/pages/pricing/pricing-page.html - 351 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - It’s free. Es ist kostenlos. apps/client/src/app/pages/pricing/pricing-page.html - 353 + 379 @@ -3622,7 +3670,7 @@ Historische Marktdaten synchronisieren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 33 + 34 @@ -3674,7 +3722,7 @@ Benutzer verwenden apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -3682,7 +3730,7 @@ Benutzer löschen apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -3690,7 +3738,7 @@ Möchtest du diese Aktivitäten wirklich löschen? libs/ui/src/lib/activities-table/activities-table.component.ts - 270 + 276 @@ -3709,6 +3757,14 @@ 8 + + Current year + Aktuelles Jahr + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + + Add platform Plattform hinzufügen @@ -3722,11 +3778,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 464 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 516 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3742,7 +3798,7 @@ Möchtest du diese Plattform wirklich löschen? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 108 @@ -3917,8 +3973,16 @@ Year Jahr - libs/ui/src/lib/i18n.ts - 32 + libs/ui/src/lib/i18n.ts + 32 + + + + View Details + Details anzeigen + + apps/client/src/app/components/admin-users/admin-users.html + 225 @@ -3937,8 +4001,8 @@ Changelog Changelog - apps/client/src/app/app.component.html - 77 + apps/client/src/app/components/footer/footer.component.html + 27 apps/client/src/app/pages/about/changelog/changelog-page.html @@ -3953,8 +4017,8 @@ License Lizenz - apps/client/src/app/app.component.html - 89 + apps/client/src/app/components/footer/footer.component.html + 39 apps/client/src/app/pages/about/license/license-page.html @@ -4082,7 +4146,7 @@ Scraper Konfiguration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 382 + 404 @@ -4241,6 +4305,14 @@ 210 + + User ID + Benutzer ID + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + + Free Plan Kostenlose Nutzung @@ -4514,7 +4586,7 @@ Sterne auf GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -4526,7 +4598,7 @@ Downloads auf Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -4646,7 +4718,7 @@ Monatlich aktive Nutzer apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -4654,7 +4726,7 @@ Bekannt aus apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -4662,7 +4734,7 @@ Schütze dein Vermögen. Optimiere deine persönliche Anlagestrategie. apps/client/src/app/pages/landing/landing-page.html - 226 + 124 @@ -4670,7 +4742,7 @@ Ghostfolio ermöglicht es geschäftigen Leuten, den Überblick über Aktien, ETFs oder Kryptowährungen zu behalten, ohne überwacht zu werden. apps/client/src/app/pages/landing/landing-page.html - 230 + 128 @@ -4678,7 +4750,7 @@ 360° Ansicht apps/client/src/app/pages/landing/landing-page.html - 240 + 138 @@ -4686,7 +4758,7 @@ Web3 ready apps/client/src/app/pages/landing/landing-page.html - 251 + 149 @@ -4694,7 +4766,7 @@ Nutze Ghostfolio ganz anonym und behalte deine Finanzdaten. apps/client/src/app/pages/landing/landing-page.html - 254 + 152 @@ -4702,7 +4774,7 @@ Profitiere von kontinuierlichen Verbesserungen durch eine aktive Community. apps/client/src/app/pages/landing/landing-page.html - 264 + 162 @@ -4718,7 +4790,7 @@ Warum Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 272 + 170 @@ -4726,7 +4798,7 @@ Ghostfolio ist für dich geeignet, wenn du... apps/client/src/app/pages/landing/landing-page.html - 274 + 172 @@ -4734,7 +4806,7 @@ Aktien, ETFs oder Kryptowährungen auf unterschiedlichen Plattformen handelst apps/client/src/app/pages/landing/landing-page.html - 280 + 178 @@ -4742,7 +4814,7 @@ eine Buy & Hold Strategie verfolgst apps/client/src/app/pages/landing/landing-page.html - 286 + 184 @@ -4750,7 +4822,7 @@ dich für die Zusammensetzung deines Portfolios interessierst apps/client/src/app/pages/landing/landing-page.html - 291 + 189 @@ -4758,7 +4830,7 @@ Privatsphäre und Datenhoheit wertschätzt apps/client/src/app/pages/landing/landing-page.html - 296 + 194 @@ -4766,7 +4838,7 @@ zum Frugalismus oder Minimalismus neigst apps/client/src/app/pages/landing/landing-page.html - 299 + 197 @@ -4774,7 +4846,7 @@ dich um die Diversifizierung deiner finanziellen Mittel kümmerst apps/client/src/app/pages/landing/landing-page.html - 303 + 201 @@ -4782,7 +4854,7 @@ Interesse an finanzieller Freiheit hast apps/client/src/app/pages/landing/landing-page.html - 307 + 205 @@ -4790,7 +4862,7 @@ Nein sagst zu Excel-Tabellen im Jahr apps/client/src/app/pages/landing/landing-page.html - 311 + 209 @@ -4798,7 +4870,7 @@ diese Liste bis zum Ende liest apps/client/src/app/pages/landing/landing-page.html - 314 + 212 @@ -4806,7 +4878,7 @@ Erfahre mehr über Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 319 + 217 @@ -4814,7 +4886,7 @@ Was unsere Nutzer sagen apps/client/src/app/pages/landing/landing-page.html - 328 + 226 @@ -4822,7 +4894,7 @@ Nutzer aus aller Welt verwenden Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 367 + 265 @@ -4830,7 +4902,7 @@ Wie funktioniert Ghostfolio ? apps/client/src/app/pages/landing/landing-page.html - 384 + 282 @@ -4838,7 +4910,7 @@ Registriere dich anonym* apps/client/src/app/pages/landing/landing-page.html - 392 + 290 @@ -4846,7 +4918,7 @@ * Keine E-Mail-Adresse oder Kreditkarte erforderlich apps/client/src/app/pages/landing/landing-page.html - 394 + 292 @@ -4854,7 +4926,7 @@ Füge historische Transaktionen hinzu apps/client/src/app/pages/landing/landing-page.html - 406 + 304 @@ -4862,7 +4934,7 @@ Erhalte nützliche Erkenntnisse über die Zusammensetzung deines Portfolios apps/client/src/app/pages/landing/landing-page.html - 418 + 316 @@ -4870,7 +4942,7 @@ Bist du bereit? apps/client/src/app/pages/landing/landing-page.html - 432 + 330 @@ -4878,7 +4950,7 @@ Verschaffe dir einen vollständigen Überblick deiner persönlichen Finanzen über mehrere Plattformen hinweg. apps/client/src/app/pages/landing/landing-page.html - 243 + 141 @@ -4886,7 +4958,7 @@ Beginne mit nur 3 Schritten apps/client/src/app/pages/landing/landing-page.html - 386 + 284 @@ -5187,6 +5259,14 @@ 62 + + with your university e-mail address + mit deiner Universitäts-E-Mail-Adresse + + apps/client/src/app/pages/pricing/pricing-page.html + 365 + + (Last 30 days) (Letzte 30 Tage) @@ -5256,7 +5336,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 238 + 239 libs/ui/src/lib/i18n.ts @@ -5284,7 +5364,7 @@ Möchtest du diesen Tag wirklich löschen? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 103 + 104 @@ -5359,6 +5439,14 @@ 37 + + Request it + Fordere ihn an + + apps/client/src/app/pages/pricing/pricing-page.html + 361 + + Access Zugang @@ -5396,7 +5484,7 @@ Manuell hinzufügen apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 19 + 18 @@ -5409,7 +5497,7 @@ , -  entnehmen, + entnehmen, apps/client/src/app/pages/portfolio/fire/fire-page.html 93 @@ -5468,7 +5556,7 @@ Ups, der Cash-Bestand Transfer ist fehlgeschlagen. apps/client/src/app/pages/accounts/accounts-page.component.ts - 324 + 339 @@ -5568,7 +5656,7 @@ Der aktuelle Marktpreis ist apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 639 + 672 @@ -5576,7 +5664,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 504 @@ -5584,7 +5672,7 @@ Zeitraum libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5675,6 +5763,22 @@ 88 + + here + hier + + apps/client/src/app/pages/pricing/pricing-page.html + 364 + + + + Close Holding + Position abschliessen + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 442 + + Absolute Asset Performance Absolute Anlage Performance @@ -5728,15 +5832,19 @@ Seit Wochenbeginn libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 WTD WTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5744,15 +5852,19 @@ Seit Monatsbeginn libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 MTD MTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5760,7 +5872,7 @@ Seit Jahresbeginn libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5783,17 +5895,21 @@ 8 - + Reset Filters Filter zurücksetzen libs/ui/src/lib/assistant/assistant.html - 266 + 204 year Jahr + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 290 @@ -5804,23 +5920,27 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 years Jahre + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 - + Apply Filters Filter anwenden libs/ui/src/lib/assistant/assistant.html - 276 + 217 @@ -5828,7 +5948,7 @@ Finanzmarktdaten synchronisieren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6045,7 +6165,15 @@ Melde dich jetzt an oder probiere die Live Demo aus apps/client/src/app/pages/landing/landing-page.html - 435 + 333 + + + + Include in + Berücksichtigen in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 @@ -6077,7 +6205,7 @@ Profile löschen apps/client/src/app/components/admin-market-data/admin-market-data.html - 243 + 242 @@ -6148,8 +6276,8 @@ Community Community - apps/client/src/app/app.component.html - 130 + apps/client/src/app/components/footer/footer.component.html + 80 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -6221,7 +6349,7 @@ Open Source apps/client/src/app/pages/landing/landing-page.html - 261 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6232,8 +6360,8 @@ Personal Finance Persönliche Finanzen - apps/client/src/app/app.component.html - 57 + apps/client/src/app/components/footer/footer.component.html + 7 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6320,6 +6448,14 @@ 83 + + View Holding + Position ansehen + + libs/ui/src/lib/activities-table/activities-table.component.html + 444 + + Canada Kanada @@ -6437,7 +6573,7 @@ Fehler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 630 + 663 @@ -6477,7 +6613,7 @@ Inaktiv apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html - 87 + 88 @@ -6485,15 +6621,15 @@ Abbrechen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 143 + 161 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 580 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 59 + 57 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6541,11 +6677,11 @@ Schliessen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 582 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 61 + 59 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6580,6 +6716,14 @@ 11 + + Role + Rolle + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 31 + + Yes Ja @@ -6592,8 +6736,8 @@ Accounts Konten - libs/ui/src/lib/assistant/assistant.html - 84 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 51 @@ -6620,6 +6764,14 @@ 63 + + If you plan to open an account at + Wenn du die Eröffnung eines Kontos planst bei + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + + Performance with currency effect Performance Performance mit Währungseffekt Performance @@ -6689,7 +6841,7 @@ Ups! Ungültige Währung. apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 50 + 48 @@ -6724,6 +6876,14 @@ 163 + + to use our referral link and get a Ghostfolio Premium membership for one year + um unseren Empfehlungslink zu verwenden und ein Ghostfolio Premium-Abonnement für ein Jahr zu erhalten + + apps/client/src/app/pages/pricing/pricing-page.html + 357 + + can be self-hosted kann selbst gehostet werden @@ -6868,6 +7028,14 @@ 293 + + Engagement per Day + Engagement pro Tag + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 76 + + Guides Ratgeber @@ -6979,7 +7147,7 @@ API-Schlüssel konnte nicht erstellt werden apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -6987,7 +7155,7 @@ Setze diesen API-Schlüssel in deiner selbst gehosteten Umgebung: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -6995,7 +7163,7 @@ API-Schlüssel für den Ghostfolio Premium Datenanbieter apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -7003,7 +7171,15 @@ Möchtest du wirklich einen neuen API-Schlüssel erstellen? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 + + + + Country + Land + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 37 @@ -7043,11 +7219,11 @@ Speichern apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 591 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 70 + 68 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -7095,7 +7271,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 251 + 260 @@ -7143,7 +7319,7 @@ Verzögert apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7151,7 +7327,15 @@ Sofort apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 + + + + API Requests Today + Heutige API Anfragen + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 86 @@ -7159,7 +7343,7 @@ Standardmarktpreis apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 391 + 413 @@ -7167,7 +7351,7 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 432 + 454 @@ -7175,7 +7359,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 470 @@ -7183,7 +7367,7 @@ HTTP Request-Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 404 + 426 @@ -7191,7 +7375,7 @@ Tagesende apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7199,7 +7383,7 @@ in Echtzeit apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 @@ -7227,7 +7411,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7247,11 +7431,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7347,11 +7531,11 @@ Sicherheits-Token apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 169 + 170 @@ -7359,7 +7543,7 @@ Möchtest du für diesen Benutzer wirklich ein neues Sicherheits-Token generieren? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 237 @@ -7367,7 +7551,7 @@ Konto, Position oder Seite finden... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7375,7 +7559,7 @@ Sicherheits-Token generieren apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -7411,8 +7595,8 @@ Terms of Service Allgemeine Geschäftsbedingungen - apps/client/src/app/app.component.html - 112 + apps/client/src/app/components/footer/footer.component.html + 62 libs/common/src/lib/routes/routes.ts @@ -7432,7 +7616,7 @@ () wird bereits verwendet. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 566 + 599 @@ -7440,7 +7624,7 @@ Bei der Änderung zu () ist ein Fehler aufgetreten. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 574 + 607 @@ -7448,7 +7632,7 @@ Übernehmen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 153 @@ -7612,15 +7796,7 @@ 158 - - Name - Name - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Schnellzugriff @@ -7628,24 +7804,16 @@ 58 - - Asset Profiles - Anlageprofile - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Live Demo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 452 + 349 libs/common/src/lib/routes/routes.ts @@ -7770,6 +7938,14 @@ 5 + + Current month + Aktueller Monat + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + + new neu @@ -7936,7 +8112,7 @@ Möchtest du wirklich ein neues Sicherheits-Token generieren? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 174 + 175 @@ -7992,7 +8168,7 @@ Anlageprofil verwalten apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 466 @@ -8016,7 +8192,7 @@ Ø Preis pro Einheit apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 110 + 113 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -8407,6 +8583,14 @@ 128 + + Registration Date + Registrierungsdatum + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 23 + + Follow Ghostfolio on LinkedIn Folge Ghostfolio auf LinkedIn diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 543adfd20..62f437994 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -26,8 +26,8 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. El riesgo de pérdida en trading puede ser sustancial. No es aconsejable invertir dinero que puedas necesitar a corto plazo. - apps/client/src/app/app.component.html - 221 + apps/client/src/app/components/footer/footer.component.html + 171 @@ -38,6 +38,14 @@ 11 + + please + please + + apps/client/src/app/pages/pricing/pricing-page.html + 350 + + Type Tipo @@ -55,7 +63,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 160 + 161 @@ -95,11 +103,11 @@ Nombre apps/client/src/app/components/admin-market-data/admin-market-data.html - 89 + 88 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 286 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -135,7 +143,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 137 + 135 + + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -191,11 +203,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 297 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -219,7 +231,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 268 + 267 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -235,7 +247,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 451 @@ -243,11 +255,11 @@ Elimina apps/client/src/app/components/admin-market-data/admin-market-data.html - 290 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 68 + 86 apps/client/src/app/components/admin-overview/admin-overview.html @@ -271,7 +283,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 461 + 478 libs/ui/src/lib/benchmark/benchmark.component.html @@ -303,11 +315,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 106 + 105 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 179 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -369,6 +381,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Historical Market Data @@ -379,7 +395,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 567 @@ -427,7 +443,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 169 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -439,7 +455,7 @@ Precio de mercado apps/client/src/app/components/admin-market-data/admin-market-data.html - 133 + 132 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -455,11 +471,11 @@ Primera actividad apps/client/src/app/components/admin-market-data/admin-market-data.html - 148 + 147 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 194 + 212 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -483,7 +499,7 @@ Datos históricos apps/client/src/app/components/admin-market-data/admin-market-data.html - 166 + 165 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -535,11 +551,11 @@ Recoger los datos del perfil apps/client/src/app/components/admin-market-data/admin-market-data.html - 235 + 234 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 48 + 66 @@ -547,7 +563,7 @@ Añadir divisa apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 22 + 20 @@ -610,12 +626,20 @@ 200 + + Activities + Activities + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 61 + + Do you really want to delete this user? ¿Estás seguro de eliminar este usuario? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 211 @@ -669,14 +693,34 @@ Get Started Empezar + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Sign in @@ -687,11 +731,11 @@ apps/client/src/app/components/header/header.component.ts - 279 + 283 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 60 libs/common/src/lib/routes/routes.ts @@ -707,11 +751,11 @@ Vaya! Token de seguridad incorrecto. apps/client/src/app/components/header/header.component.ts - 294 + 298 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 153 + 154 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -775,15 +819,15 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 451 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -793,6 +837,10 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html 81 + + apps/client/src/app/pages/pricing/pricing-page.html + 343 + apps/client/src/app/pages/register/register-page.html 31 @@ -802,20 +850,12 @@ 30 - - Sign in with Internet Identity - Iniciar sesión con Internet Identity - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 - - Sign in with Google Iniciar sesión con Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 37 @@ -823,7 +863,7 @@ Seguir conectado apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 48 @@ -879,7 +919,7 @@ Patrimonio neto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 264 @@ -887,7 +927,7 @@ Rendimiento anualizado apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 274 + 277 @@ -903,11 +943,11 @@ Sectores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 274 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -923,11 +963,11 @@ Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 266 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 504 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -995,39 +1035,55 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 YTD Desde principio de año + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 1Y 1 año + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 5Y 5 años + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 Max Máximo + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 216 + libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -1035,7 +1091,7 @@ De acuerdo apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -1050,8 +1106,8 @@ About Sobre - apps/client/src/app/app.component.html - 70 + apps/client/src/app/components/footer/footer.component.html + 20 apps/client/src/app/components/header/header.component.html @@ -1074,8 +1130,8 @@ Privacy Policy Política de privacidad - apps/client/src/app/app.component.html - 105 + apps/client/src/app/components/footer/footer.component.html + 55 apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html @@ -1103,7 +1159,7 @@ Por favor, ingresa tu código de cupón: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -1111,7 +1167,7 @@ No se puede canjear este código de cupón apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -1119,7 +1175,7 @@ El codigo de cupón ha sido canjeado apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -1127,7 +1183,7 @@ Refrescar apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -1191,7 +1247,7 @@ Ubicación apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 419 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1293,6 +1349,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Update account @@ -1315,15 +1375,15 @@ Divisa base apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 201 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 293 + 311 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 47 + 45 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1339,7 +1399,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 280 + 281 @@ -1402,8 +1462,8 @@ Blog Blog - apps/client/src/app/app.component.html - 74 + apps/client/src/app/components/footer/footer.component.html + 24 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html @@ -1514,8 +1574,8 @@ Frequently Asked Questions (FAQ) Preguntas más frecuentes (FAQ) - apps/client/src/app/app.component.html - 83 + apps/client/src/app/components/footer/footer.component.html + 33 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1534,8 +1594,8 @@ Features Funcionalidades - apps/client/src/app/app.component.html - 79 + apps/client/src/app/components/footer/footer.component.html + 29 apps/client/src/app/components/header/header.component.html @@ -1555,7 +1615,7 @@ Visión general apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 113 apps/client/src/app/components/header/header.component.html @@ -1590,8 +1650,12 @@ Markets Mercados - apps/client/src/app/app.component.html - 61 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + + + apps/client/src/app/components/footer/footer.component.html + 11 apps/client/src/app/components/header/header.component.html @@ -1789,10 +1853,6 @@ libs/common/src/lib/routes/routes.ts 167 - - - Holdings - Participaciones libs/ui/src/lib/assistant/assistant.html 110 @@ -1806,6 +1866,14 @@ 10 + + Current week + Current week + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + + Add activity Añadir operación @@ -1835,11 +1903,11 @@ Nombre, símbolo o ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 132 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 29 + 27 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html @@ -1863,7 +1931,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 190 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1879,7 +1947,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 214 + 215 @@ -1887,7 +1955,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 529 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1911,7 +1979,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 221 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -1970,8 +2038,8 @@ Pricing Precios - apps/client/src/app/app.component.html - 99 + apps/client/src/app/components/footer/footer.component.html + 49 apps/client/src/app/components/header/header.component.html @@ -2058,20 +2126,12 @@ 281 - - Continue with Internet Identity - Continuar con Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Continuar con Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -2086,8 +2146,8 @@ Resources Recursos - apps/client/src/app/app.component.html - 64 + apps/client/src/app/components/footer/footer.component.html + 14 apps/client/src/app/components/header/header.component.html @@ -2135,7 +2195,7 @@ Borrador libs/ui/src/lib/activities-table/activities-table.component.html - 144 + 142 @@ -2151,7 +2211,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 375 + 380 @@ -2163,7 +2223,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 400 + 405 @@ -2175,7 +2235,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 413 + 418 @@ -2183,7 +2243,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 457 @@ -2191,7 +2251,7 @@ Exportar borrador como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 450 + 467 @@ -2199,7 +2259,7 @@ ¿Estás seguro de eliminar esta operación? libs/ui/src/lib/activities-table/activities-table.component.ts - 280 + 286 @@ -2210,6 +2270,14 @@ 117 + + contact us + contact us + + apps/client/src/app/pages/pricing/pricing-page.html + 353 + + from ATH desde el máximo histórico (ATH) @@ -2242,14 +2310,6 @@ 56 - - Get started - Comenzar - - apps/client/src/app/components/header/header.component.html - 432 - - This feature is currently unavailable. Esta funcionalidad no está disponible actualmente. @@ -2355,7 +2415,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 239 + 257 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2367,7 +2427,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 250 + 268 apps/client/src/app/components/admin-users/admin-users.html @@ -2391,7 +2451,7 @@ Importe total previsto libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 60 + 59 @@ -2411,7 +2471,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 295 + 298 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2443,7 +2503,7 @@ Número de sectores apps/client/src/app/components/admin-market-data/admin-market-data.html - 175 + 174 @@ -2451,7 +2511,7 @@ Número de países apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 183 @@ -2527,7 +2587,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 351 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -2627,14 +2687,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 312 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -2643,15 +2703,15 @@ Tipo de activo apps/client/src/app/components/admin-market-data/admin-market-data.html - 115 + 114 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 230 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 303 + 321 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2661,14 +2721,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Symbol @@ -2679,15 +2739,15 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 75 + 74 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 150 + 168 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 39 + 37 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2701,14 +2761,14 @@ Tag Etiqueta - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Cash @@ -2839,7 +2899,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -2859,11 +2919,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -2951,7 +3011,7 @@ Recuento de actividades apps/client/src/app/components/admin-market-data/admin-market-data.html - 157 + 156 @@ -2967,7 +3027,15 @@ Mapeo de símbolos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 357 + 379 + + + + Looking for a student discount? + Looking for a student discount? + + apps/client/src/app/pages/pricing/pricing-page.html + 359 @@ -2983,7 +3051,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 310 apps/client/src/app/pages/features/features-page.html @@ -3015,15 +3083,15 @@ Subtipo de activo apps/client/src/app/components/admin-market-data/admin-market-data.html - 124 + 123 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 221 + 239 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 337 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3110,8 +3178,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3143,7 +3211,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 387 + 392 @@ -3462,32 +3530,12 @@ 303 - - Get Started - Empieza - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 447 - - - apps/client/src/app/pages/pricing/pricing-page.html - 351 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - It’s free. Es gratis. apps/client/src/app/pages/pricing/pricing-page.html - 353 + 379 @@ -3651,7 +3699,7 @@ Suplantar usuario apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -3659,7 +3707,7 @@ Eliminar usuario apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -3667,7 +3715,7 @@ ¿Realmente deseas eliminar estas actividades? libs/ui/src/lib/activities-table/activities-table.component.ts - 270 + 276 @@ -3686,6 +3734,14 @@ 8 + + Current year + Current year + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + + Add platform Agregar plataforma @@ -3699,11 +3755,11 @@ ¿La URL? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 464 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 516 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3719,7 +3775,7 @@ ¿Realmente deseas eliminar esta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 108 @@ -3898,6 +3954,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Liabilities Pasivos @@ -3914,8 +3978,8 @@ Changelog Registro de cambios - apps/client/src/app/app.component.html - 77 + apps/client/src/app/components/footer/footer.component.html + 27 apps/client/src/app/pages/about/changelog/changelog-page.html @@ -3930,8 +3994,8 @@ License Licencia - apps/client/src/app/app.component.html - 89 + apps/client/src/app/components/footer/footer.component.html + 39 apps/client/src/app/pages/about/license/license-page.html @@ -4059,7 +4123,7 @@ Configuración del scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 382 + 404 @@ -4218,6 +4282,14 @@ 210 + + User ID + User ID + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + + Free Plan Plan gratuito @@ -4491,7 +4563,7 @@ Estrellas en GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -4503,7 +4575,7 @@ Descargas en Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -4623,7 +4695,7 @@ Usuarios activos mensuales apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -4631,7 +4703,7 @@ Visto en apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -4639,7 +4711,7 @@ Protege tus assets. Mejora tu estrategia de inversión personal. apps/client/src/app/pages/landing/landing-page.html - 226 + 124 @@ -4647,7 +4719,7 @@ Ghostfolio permite a las personas ocupadas hacer un seguimiento de acciones, ETFs o criptomonedas sin ser rastreadas. apps/client/src/app/pages/landing/landing-page.html - 230 + 128 @@ -4655,7 +4727,7 @@ Vista 360° apps/client/src/app/pages/landing/landing-page.html - 240 + 138 @@ -4663,7 +4735,7 @@ Preparado para Web3 apps/client/src/app/pages/landing/landing-page.html - 251 + 149 @@ -4671,7 +4743,7 @@ Usa Ghostfolio de forma anónima y sé dueño de tus datos financieros. apps/client/src/app/pages/landing/landing-page.html - 254 + 152 @@ -4679,7 +4751,7 @@ Disfruta de mejoras continuas gracias a una comunidad sólida. apps/client/src/app/pages/landing/landing-page.html - 264 + 162 @@ -4695,7 +4767,7 @@ ¿Por qué Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 272 + 170 @@ -4703,7 +4775,7 @@ Ghostfolio es para ti si estás... apps/client/src/app/pages/landing/landing-page.html - 274 + 172 @@ -4711,7 +4783,7 @@ operando con acciones, ETFs o criptomonedas en múltiples plataformas apps/client/src/app/pages/landing/landing-page.html - 280 + 178 @@ -4719,7 +4791,7 @@ persiguiendo una compra & mantener estrategia apps/client/src/app/pages/landing/landing-page.html - 286 + 184 @@ -4727,7 +4799,7 @@ interesado en obtener información sobre la composición de tu portafolio apps/client/src/app/pages/landing/landing-page.html - 291 + 189 @@ -4735,7 +4807,7 @@ valorando la privacidad y la propiedad de tus datos apps/client/src/app/pages/landing/landing-page.html - 296 + 194 @@ -4743,7 +4815,7 @@ en el minimalismo apps/client/src/app/pages/landing/landing-page.html - 299 + 197 @@ -4751,7 +4823,7 @@ preocuparse por diversificar tus recursos financieros apps/client/src/app/pages/landing/landing-page.html - 303 + 201 @@ -4759,7 +4831,7 @@ interesado en la independencia financiera apps/client/src/app/pages/landing/landing-page.html - 307 + 205 @@ -4767,7 +4839,7 @@ diciendo no a las hojas de cálculo en apps/client/src/app/pages/landing/landing-page.html - 311 + 209 @@ -4775,7 +4847,7 @@ todavía leyendo esta lista apps/client/src/app/pages/landing/landing-page.html - 314 + 212 @@ -4783,7 +4855,7 @@ Más información sobre Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 319 + 217 @@ -4791,7 +4863,7 @@ Lo que nuestros usuarios están diciendo apps/client/src/app/pages/landing/landing-page.html - 328 + 226 @@ -4799,7 +4871,7 @@ Miembros de todo el mundo están usando Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 367 + 265 @@ -4807,7 +4879,7 @@ ¿Cómo Ghostfolio work? apps/client/src/app/pages/landing/landing-page.html - 384 + 282 @@ -4815,7 +4887,7 @@ Regístrate de forma anónima* apps/client/src/app/pages/landing/landing-page.html - 392 + 290 @@ -4823,7 +4895,7 @@ * no se requiere dirección de correo electrónico ni tarjeta de crédito apps/client/src/app/pages/landing/landing-page.html - 394 + 292 @@ -4831,7 +4903,7 @@ Agrega cualquiera de tus transacciones históricas apps/client/src/app/pages/landing/landing-page.html - 406 + 304 @@ -4839,7 +4911,7 @@ Obtén información valiosa sobre la composición de tu portafolio apps/client/src/app/pages/landing/landing-page.html - 418 + 316 @@ -4847,7 +4919,7 @@ ¿Estás listo? apps/client/src/app/pages/landing/landing-page.html - 432 + 330 @@ -4855,7 +4927,7 @@ Obtén una visión completa de tus finanzas personales en múltiples plataformas. apps/client/src/app/pages/landing/landing-page.html - 243 + 141 @@ -4863,7 +4935,7 @@ Comienza en solo 3 pasos apps/client/src/app/pages/landing/landing-page.html - 386 + 284 @@ -5164,6 +5236,14 @@ 62 + + with your university e-mail address + with your university e-mail address + + apps/client/src/app/pages/pricing/pricing-page.html + 365 + + (Last 30 days) (Últimos 30 días) @@ -5233,7 +5313,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 238 + 239 libs/ui/src/lib/i18n.ts @@ -5261,7 +5341,7 @@ ¿Realmente deseas eliminar esta etiqueta? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 103 + 104 @@ -5336,6 +5416,14 @@ 37 + + Request it + Request it + + apps/client/src/app/pages/pricing/pricing-page.html + 361 + + Access Acceso @@ -5373,7 +5461,7 @@ Añadir manualmente apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 19 + 18 @@ -5445,7 +5533,7 @@ Oops, el saldo de efectivo no se ha transferido. apps/client/src/app/pages/accounts/accounts-page.component.ts - 324 + 339 @@ -5545,7 +5633,7 @@ El precio actual de mercado es apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 639 + 672 @@ -5553,7 +5641,7 @@ Prueba apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 504 @@ -5561,7 +5649,7 @@ Rango de fechas libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5652,6 +5740,22 @@ 88 + + here + here + + apps/client/src/app/pages/pricing/pricing-page.html + 364 + + + + Close Holding + Close Holding + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 442 + + Absolute Asset Performance Rendimiento absoluto de los activos @@ -5705,15 +5809,19 @@ Semana hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 WTD WTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5721,15 +5829,19 @@ Mes hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 MTD MTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5737,7 +5849,7 @@ El año hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5760,17 +5872,21 @@ 8 - + Reset Filters Reiniciar filtros libs/ui/src/lib/assistant/assistant.html - 266 + 204 year año + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 290 @@ -5781,23 +5897,27 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 years años + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 - + Apply Filters Aplicar filtros libs/ui/src/lib/assistant/assistant.html - 276 + 217 @@ -5805,7 +5925,7 @@ Recopilación de datos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6022,7 +6142,15 @@ Únete ahora o consulta la cuenta de ejemplo apps/client/src/app/pages/landing/landing-page.html - 435 + 333 + + + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 @@ -6054,7 +6182,7 @@ Borrar Perfiles apps/client/src/app/components/admin-market-data/admin-market-data.html - 243 + 242 @@ -6125,8 +6253,8 @@ Community Comunidad - apps/client/src/app/app.component.html - 130 + apps/client/src/app/components/footer/footer.component.html + 80 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -6198,7 +6326,7 @@ Código abierto apps/client/src/app/pages/landing/landing-page.html - 261 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6209,8 +6337,8 @@ Personal Finance Finanzas personales - apps/client/src/app/app.component.html - 57 + apps/client/src/app/components/footer/footer.component.html + 7 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6297,6 +6425,14 @@ 83 + + View Holding + View Holding + + libs/ui/src/lib/activities-table/activities-table.component.html + 444 + + Canada Canadá @@ -6414,7 +6550,7 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 630 + 663 @@ -6454,7 +6590,7 @@ Inactiva apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html - 87 + 88 @@ -6462,15 +6598,15 @@ Cancelar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 143 + 161 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 580 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 59 + 57 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6518,11 +6654,11 @@ Cerca apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 582 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 61 + 59 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6557,6 +6693,14 @@ 11 + + Role + Role + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 31 + + Yes @@ -6569,8 +6713,8 @@ Accounts Accounts - libs/ui/src/lib/assistant/assistant.html - 84 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 51 @@ -6597,6 +6741,14 @@ 63 + + If you plan to open an account at + If you plan to open an account at + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + + Performance with currency effect Performance Performance with currency effect Performance @@ -6666,7 +6818,7 @@ ¡Ups! Moneda inválida. apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 50 + 48 @@ -6701,6 +6853,14 @@ 163 + + to use our referral link and get a Ghostfolio Premium membership for one year + to use our referral link and get a Ghostfolio Premium membership for one year + + apps/client/src/app/pages/pricing/pricing-page.html + 357 + + can be self-hosted se puede autoalojar @@ -6845,6 +7005,14 @@ 293 + + Engagement per Day + Engagement per Day + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 76 + + Guides Guías @@ -6956,7 +7124,7 @@ No se pudo generar una clave API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -6964,7 +7132,7 @@ Configure esta clave API en su entorno autohospedado: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -6972,7 +7140,7 @@ Clave API del proveedor de datos premium de Ghostfolio apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -6980,7 +7148,15 @@ ¿Realmente desea generar una nueva clave API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 + + + + Country + Country + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 37 @@ -7020,11 +7196,11 @@ Ahorrar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 591 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 70 + 68 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -7072,7 +7248,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 251 + 260 @@ -7120,7 +7296,7 @@ Perezoso apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7128,7 +7304,15 @@ Instantáneo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 + + + + API Requests Today + API Requests Today + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 86 @@ -7136,7 +7320,7 @@ Precio de mercado por defecto apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 391 + 413 @@ -7144,7 +7328,7 @@ Modo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 432 + 454 @@ -7152,7 +7336,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 470 @@ -7160,7 +7344,7 @@ Encabezados de solicitud HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 404 + 426 @@ -7168,7 +7352,7 @@ final del día apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7176,7 +7360,7 @@ en tiempo real apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 @@ -7204,7 +7388,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7224,11 +7408,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7324,11 +7508,11 @@ Token de seguridad apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 169 + 170 @@ -7336,7 +7520,7 @@ ¿Realmente deseas generar un nuevo token de seguridad para este usuario? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 237 @@ -7344,7 +7528,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7352,7 +7536,7 @@ Generar token de seguridad apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -7388,8 +7572,8 @@ Terms of Service Términos de servicio - apps/client/src/app/app.component.html - 112 + apps/client/src/app/components/footer/footer.component.html + 62 libs/common/src/lib/routes/routes.ts @@ -7409,7 +7593,7 @@ () ya está en uso. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 566 + 599 @@ -7417,7 +7601,7 @@ Ocurrió un error al actualizar a (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 574 + 607 @@ -7425,7 +7609,7 @@ Aplicar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 153 @@ -7441,7 +7625,7 @@ Recopilar datos históricos recientes del mercado apps/client/src/app/components/admin-market-data/admin-market-data.html - 226 + 225 @@ -7449,7 +7633,7 @@ Recopilar todos los datos históricos del mercado apps/client/src/app/components/admin-market-data/admin-market-data.html - 231 + 230 @@ -7457,7 +7641,7 @@ Recopilar datos históricos del mercado apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 33 + 34 @@ -7613,15 +7797,7 @@ 158 - - Name - Nombre - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Enlaces rápidos @@ -7629,24 +7805,16 @@ 58 - - Asset Profiles - Perfiles de activos - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Demostración en vivo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 452 + 349 libs/common/src/lib/routes/routes.ts @@ -7771,6 +7939,14 @@ 5 + + Current month + Current month + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + + new nuevo @@ -7937,7 +8113,7 @@ ¿Realmente deseas generar un nuevo token de seguridad? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 174 + 175 @@ -7993,7 +8169,7 @@ Gestionar perfil de activo apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 466 @@ -8017,7 +8193,7 @@ Precio medio por unidad apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 110 + 113 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -8408,6 +8584,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 23 + + Follow Ghostfolio on LinkedIn Siga a Ghostfolio en LinkedIn diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index f80653695..560859d05 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -5,8 +5,8 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. Le risque de perte en investissant peut être important. Il est déconseillé d’investir de l’argent dont vous pourriez avoir besoin à court terme. - apps/client/src/app/app.component.html - 221 + apps/client/src/app/components/footer/footer.component.html + 171 @@ -29,6 +29,14 @@ 11 + + please + please + + apps/client/src/app/pages/pricing/pricing-page.html + 350 + + Type Type @@ -46,7 +54,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 160 + 161 @@ -102,11 +110,11 @@ Nom apps/client/src/app/components/admin-market-data/admin-market-data.html - 89 + 88 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 286 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -142,7 +150,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 137 + 135 + + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -170,15 +182,15 @@ Devise apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 201 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 293 + 311 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 47 + 45 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -194,7 +206,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 280 + 281 @@ -246,11 +258,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 297 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -274,7 +286,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 268 + 267 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -290,7 +302,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 451 @@ -298,11 +310,11 @@ Supprimer apps/client/src/app/components/admin-market-data/admin-market-data.html - 290 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 68 + 86 apps/client/src/app/components/admin-overview/admin-overview.html @@ -326,7 +338,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 461 + 478 libs/ui/src/lib/benchmark/benchmark.component.html @@ -350,11 +362,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 106 + 105 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 179 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -424,6 +436,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Historical Market Data @@ -434,7 +450,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 567 @@ -482,7 +498,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 169 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -494,7 +510,7 @@ Prix du marché apps/client/src/app/components/admin-market-data/admin-market-data.html - 133 + 132 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -518,11 +534,11 @@ Première Activité apps/client/src/app/components/admin-market-data/admin-market-data.html - 148 + 147 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 194 + 212 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -538,7 +554,7 @@ Nombre d’Activités apps/client/src/app/components/admin-market-data/admin-market-data.html - 157 + 156 @@ -546,7 +562,7 @@ Données Historiques apps/client/src/app/components/admin-market-data/admin-market-data.html - 166 + 165 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -558,7 +574,7 @@ Nombre de Secteurs apps/client/src/app/components/admin-market-data/admin-market-data.html - 175 + 174 @@ -566,7 +582,7 @@ Nombre de Pays apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 183 @@ -574,11 +590,11 @@ Obtenir les Données du Profil apps/client/src/app/components/admin-market-data/admin-market-data.html - 235 + 234 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 48 + 66 @@ -594,7 +610,7 @@ Secteur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 239 + 257 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -606,7 +622,7 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 250 + 268 apps/client/src/app/components/admin-users/admin-users.html @@ -622,11 +638,11 @@ Secteurs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 274 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -642,11 +658,11 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 266 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 504 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -658,7 +674,7 @@ Équivalence de Symboles apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 357 + 379 @@ -666,7 +682,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 529 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -730,7 +746,7 @@ Ajouter Devise apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 22 + 20 @@ -817,12 +833,20 @@ 200 + + Activities + Activities + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 61 + + Do you really want to delete this user? Voulez-vous vraiment supprimer cet·te utilisateur·rice ? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 211 @@ -890,7 +914,7 @@ Référence apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 351 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -917,14 +941,6 @@ 5 - - Get started - Démarrer - - apps/client/src/app/components/header/header.component.html - 432 - - Sign in Se connecter @@ -934,11 +950,11 @@ apps/client/src/app/components/header/header.component.ts - 279 + 283 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 60 libs/common/src/lib/routes/routes.ts @@ -954,11 +970,11 @@ Oups! Jeton de Sécurité Incorrect. apps/client/src/app/components/header/header.component.ts - 294 + 298 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 153 + 154 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1070,15 +1086,15 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 451 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1088,6 +1104,10 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html 81 + + apps/client/src/app/pages/pricing/pricing-page.html + 343 + apps/client/src/app/pages/register/register-page.html 31 @@ -1097,20 +1117,12 @@ 30 - - Sign in with Internet Identity - Se connecter avec Internet Identity - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 - - Sign in with Google Se connecter avec Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 37 @@ -1118,7 +1130,7 @@ Rester connecté apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 48 @@ -1182,7 +1194,7 @@ Fortune apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 264 @@ -1190,7 +1202,7 @@ Performance annualisée apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 274 + 277 @@ -1230,7 +1242,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 190 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1254,39 +1266,55 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 YTD CDA + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 1Y 1A + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 5Y 5A + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 Max Max + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 216 + libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -1330,7 +1358,7 @@ D’accord apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -1345,8 +1373,8 @@ About À propos - apps/client/src/app/app.component.html - 70 + apps/client/src/app/components/footer/footer.component.html + 20 apps/client/src/app/components/header/header.component.html @@ -1369,8 +1397,8 @@ Privacy Policy Politique de Vie Privée - apps/client/src/app/app.component.html - 105 + apps/client/src/app/components/footer/footer.component.html + 55 apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html @@ -1410,7 +1438,7 @@ Veuillez entrer votre code promotionnel. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -1418,7 +1446,7 @@ Le code promotionnel n’a pas pu être appliqué apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -1426,7 +1454,7 @@ Le code promotionnel a été appliqué apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -1434,7 +1462,7 @@ Rafraîchir apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -1506,7 +1534,7 @@ Paramètres régionaux apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 419 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1640,6 +1668,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Update account @@ -1705,8 +1737,8 @@ Blog Blog - apps/client/src/app/app.component.html - 74 + apps/client/src/app/components/footer/footer.component.html + 24 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html @@ -1817,8 +1849,8 @@ Frequently Asked Questions (FAQ) Questions Fréquentes (FAQ) - apps/client/src/app/app.component.html - 83 + apps/client/src/app/components/footer/footer.component.html + 33 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1837,8 +1869,8 @@ Features Fonctionnalités - apps/client/src/app/app.component.html - 79 + apps/client/src/app/components/footer/footer.component.html + 29 apps/client/src/app/components/header/header.component.html @@ -1876,6 +1908,10 @@ libs/common/src/lib/routes/routes.ts 167 + + libs/ui/src/lib/assistant/assistant.html + 110 + Summary @@ -1893,8 +1929,12 @@ Markets Marchés - apps/client/src/app/app.component.html - 61 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + + + apps/client/src/app/components/footer/footer.component.html + 11 apps/client/src/app/components/header/header.component.html @@ -1946,7 +1986,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 221 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -1985,6 +2025,14 @@ 10 + + Current week + Current week + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + + Add activity Ajouter Activité @@ -2014,11 +2062,11 @@ Nom, symbole, ou ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 132 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 29 + 27 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html @@ -2038,7 +2086,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 214 + 215 @@ -2269,6 +2317,14 @@ 138 + + Looking for a student discount? + Looking for a student discount? + + apps/client/src/app/pages/pricing/pricing-page.html + 359 + + Dividend Dividende @@ -2282,7 +2338,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 310 apps/client/src/app/pages/features/features-page.html @@ -2373,20 +2429,12 @@ 7 - - Holdings - Positions - - libs/ui/src/lib/assistant/assistant.html - 110 - - Pricing Prix - apps/client/src/app/app.component.html - 99 + apps/client/src/app/components/footer/footer.component.html + 49 apps/client/src/app/components/header/header.component.html @@ -2448,14 +2496,34 @@ Get Started Démarrer + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Registration @@ -2489,20 +2557,12 @@ 101 - - Continue with Internet Identity - Continue avec Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Continuer avec Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -2517,8 +2577,8 @@ Resources Ressources - apps/client/src/app/app.component.html - 64 + apps/client/src/app/components/footer/footer.component.html + 14 apps/client/src/app/components/header/header.component.html @@ -2566,7 +2626,7 @@ Aperçu apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 113 apps/client/src/app/components/header/header.component.html @@ -2602,7 +2662,7 @@ Brouillon libs/ui/src/lib/activities-table/activities-table.component.html - 144 + 142 @@ -2618,7 +2678,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 375 + 380 @@ -2630,7 +2690,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 400 + 405 @@ -2642,7 +2702,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 413 + 418 @@ -2650,7 +2710,7 @@ Dupliquer libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 457 @@ -2658,7 +2718,7 @@ Exporter Brouillon sous ICS libs/ui/src/lib/activities-table/activities-table.component.html - 450 + 467 @@ -2666,7 +2726,7 @@ Voulez-vous vraiment supprimer cette activité ? libs/ui/src/lib/activities-table/activities-table.component.ts - 280 + 286 @@ -2677,6 +2737,14 @@ 117 + + contact us + contact us + + apps/client/src/app/pages/pricing/pricing-page.html + 353 + + from ATH par rapport au record historique @@ -2698,7 +2766,7 @@ Montant Total Prévu libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 60 + 59 @@ -2710,7 +2778,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 295 + 298 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2766,14 +2834,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 312 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -2782,15 +2850,15 @@ Classe d’Actifs apps/client/src/app/components/admin-market-data/admin-market-data.html - 115 + 114 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 230 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 303 + 321 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2800,29 +2868,29 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Asset Sub Class Sous-classe d’Actifs apps/client/src/app/components/admin-market-data/admin-market-data.html - 124 + 123 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 221 + 239 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 337 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2862,7 +2930,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -2874,15 +2942,15 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 75 + 74 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 150 + 168 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 39 + 37 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2896,14 +2964,14 @@ Tag Étiquette - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Cash @@ -3090,11 +3158,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3109,8 +3177,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3142,7 +3210,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 387 + 392 @@ -3461,32 +3529,12 @@ 303 - - Get Started - Démarrer - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 447 - - - apps/client/src/app/pages/pricing/pricing-page.html - 351 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - It’s free. C’est gratuit. apps/client/src/app/pages/pricing/pricing-page.html - 353 + 379 @@ -3650,7 +3698,7 @@ Voir en tant que ... apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -3658,7 +3706,7 @@ Supprimer l’Utilisateur apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -3666,7 +3714,7 @@ Voulez-vous vraiment supprimer toutes vos activités ? libs/ui/src/lib/activities-table/activities-table.component.ts - 270 + 276 @@ -3685,6 +3733,14 @@ 8 + + Current year + Current year + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + + Add platform Ajouter une Plateforme @@ -3698,11 +3754,11 @@ Lien apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 464 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 516 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3718,7 +3774,7 @@ Voulez-vous vraiment supprimer cette plateforme ? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 108 @@ -3897,6 +3953,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Liabilities Dettes @@ -3913,8 +3977,8 @@ Changelog Historique des modifications - apps/client/src/app/app.component.html - 77 + apps/client/src/app/components/footer/footer.component.html + 27 apps/client/src/app/pages/about/changelog/changelog-page.html @@ -3929,8 +3993,8 @@ License Licence - apps/client/src/app/app.component.html - 89 + apps/client/src/app/components/footer/footer.component.html + 39 apps/client/src/app/pages/about/license/license-page.html @@ -4058,7 +4122,7 @@ Configuration du Scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 382 + 404 @@ -4217,6 +4281,14 @@ 210 + + User ID + User ID + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + + Free Plan Plan gratuit @@ -4490,7 +4562,7 @@ Etoiles sur GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -4502,7 +4574,7 @@ Téléchargement depuis Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -4622,7 +4694,7 @@ Utilisateurs actifs mensuels apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -4630,7 +4702,7 @@ Médias apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -4638,7 +4710,7 @@ Protégez vos actifs. Affinez votre stratégie d’investissement personnelle.. apps/client/src/app/pages/landing/landing-page.html - 226 + 124 @@ -4646,7 +4718,7 @@ Ghostfolio permet aux personnes occupées de suivre ses actions, ETF ou cryptomonnaies sans être pistées. apps/client/src/app/pages/landing/landing-page.html - 230 + 128 @@ -4654,7 +4726,7 @@ Vision 360° apps/client/src/app/pages/landing/landing-page.html - 240 + 138 @@ -4662,7 +4734,7 @@ Compatible Web3 apps/client/src/app/pages/landing/landing-page.html - 251 + 149 @@ -4670,7 +4742,7 @@ Utilisez Ghostfolio de manière anonyme et soyez propriétaire de vos données financières. apps/client/src/app/pages/landing/landing-page.html - 254 + 152 @@ -4678,7 +4750,7 @@ Bénéficiez d’améliorations continues grâce à une communauté impliquée. apps/client/src/app/pages/landing/landing-page.html - 264 + 162 @@ -4694,7 +4766,7 @@ Pourquoi Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 272 + 170 @@ -4702,7 +4774,7 @@ Ghostfolio est pour vous si vous ... apps/client/src/app/pages/landing/landing-page.html - 274 + 172 @@ -4710,7 +4782,7 @@ tradez des actions, ETFs or crypto-monnaies sur plusieurs plateforme. apps/client/src/app/pages/landing/landing-page.html - 280 + 178 @@ -4718,7 +4790,7 @@ adoptez une stratégie Buy & and Hold apps/client/src/app/pages/landing/landing-page.html - 286 + 184 @@ -4726,7 +4798,7 @@ êtes intéressés d’avoir un aperçu de la composition de votre portefeuille apps/client/src/app/pages/landing/landing-page.html - 291 + 189 @@ -4734,7 +4806,7 @@ valorisez la confidentialité et la propriété de vos données apps/client/src/app/pages/landing/landing-page.html - 296 + 194 @@ -4742,7 +4814,7 @@ êtes minimaliste apps/client/src/app/pages/landing/landing-page.html - 299 + 197 @@ -4750,7 +4822,7 @@ vous souciez de diversifier vos ressources financières apps/client/src/app/pages/landing/landing-page.html - 303 + 201 @@ -4758,7 +4830,7 @@ êtes intéressés d’atteindre l’indépendance financière apps/client/src/app/pages/landing/landing-page.html - 307 + 205 @@ -4766,7 +4838,7 @@ dites non aux feuilles de calcul en apps/client/src/app/pages/landing/landing-page.html - 311 + 209 @@ -4774,7 +4846,7 @@ continuez à lire cette liste apps/client/src/app/pages/landing/landing-page.html - 314 + 212 @@ -4782,7 +4854,7 @@ En appendre plus sur Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 319 + 217 @@ -4790,7 +4862,7 @@ Qu’en pensent nos utilisateurs apps/client/src/app/pages/landing/landing-page.html - 328 + 226 @@ -4798,7 +4870,7 @@ Les utilisateurs du monde entier utilisent Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 367 + 265 @@ -4806,7 +4878,7 @@ Comment fonctionne Ghostfolio ? apps/client/src/app/pages/landing/landing-page.html - 384 + 282 @@ -4814,7 +4886,7 @@ Inscrivez-vous de manière anonyme* apps/client/src/app/pages/landing/landing-page.html - 392 + 290 @@ -4822,7 +4894,7 @@ * aucune adresse mail ni carte de crédit requise apps/client/src/app/pages/landing/landing-page.html - 394 + 292 @@ -4830,7 +4902,7 @@ Ajoutez l’une de vos transactions historiques apps/client/src/app/pages/landing/landing-page.html - 406 + 304 @@ -4838,7 +4910,7 @@ Obtenez de précieuses informations sur la composition de votre portefeuille apps/client/src/app/pages/landing/landing-page.html - 418 + 316 @@ -4846,7 +4918,7 @@ Êtes- vous prêts ? apps/client/src/app/pages/landing/landing-page.html - 432 + 330 @@ -4854,7 +4926,7 @@ Obtenez une vue d’ensemble de vos finances personnelles sur plusieurs plateformes. apps/client/src/app/pages/landing/landing-page.html - 243 + 141 @@ -4862,7 +4934,7 @@ Démarrer en seulement 3 étapes apps/client/src/app/pages/landing/landing-page.html - 386 + 284 @@ -5163,6 +5235,14 @@ 62 + + with your university e-mail address + with your university e-mail address + + apps/client/src/app/pages/pricing/pricing-page.html + 365 + + (Last 30 days) (Derniers 30 jours) @@ -5232,7 +5312,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 238 + 239 libs/ui/src/lib/i18n.ts @@ -5260,7 +5340,7 @@ Confirmez la suppression de ce tag ? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 103 + 104 @@ -5335,6 +5415,14 @@ 37 + + Request it + Request it + + apps/client/src/app/pages/pricing/pricing-page.html + 361 + + Access Accès @@ -5372,7 +5460,7 @@ Ajouter manuellement apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 19 + 18 @@ -5444,7 +5532,7 @@ Oops, échec du transfert de la cash balance. apps/client/src/app/pages/accounts/accounts-page.component.ts - 324 + 339 @@ -5544,7 +5632,7 @@ Le prix actuel du marché est apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 639 + 672 @@ -5552,7 +5640,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 504 @@ -5560,7 +5648,7 @@ Intervalle de Date libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5651,6 +5739,22 @@ 88 + + here + here + + apps/client/src/app/pages/pricing/pricing-page.html + 364 + + + + Close Holding + Close Holding + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 442 + + Absolute Asset Performance Performance des Actifs en valeur absolue @@ -5704,15 +5808,19 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 WTD WTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5720,15 +5828,19 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 MTD MTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5736,7 +5848,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5759,17 +5871,21 @@ 8 - + Reset Filters Réinitialiser les Filtres libs/ui/src/lib/assistant/assistant.html - 266 + 204 year année + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 290 @@ -5780,23 +5896,27 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 years années + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 - + Apply Filters Appliquer les Filtres libs/ui/src/lib/assistant/assistant.html - 276 + 217 @@ -5804,7 +5924,7 @@ Collecter les données apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6021,7 +6141,15 @@ Rejoindre ou voir un compte démo apps/client/src/app/pages/landing/landing-page.html - 435 + 333 + + + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 @@ -6053,7 +6181,7 @@ Supprimer des Profils apps/client/src/app/components/admin-market-data/admin-market-data.html - 243 + 242 @@ -6124,8 +6252,8 @@ Community Communauté - apps/client/src/app/app.component.html - 130 + apps/client/src/app/components/footer/footer.component.html + 80 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -6197,7 +6325,7 @@ Open Source apps/client/src/app/pages/landing/landing-page.html - 261 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6208,8 +6336,8 @@ Personal Finance Gestion de Patrimoine - apps/client/src/app/app.component.html - 57 + apps/client/src/app/components/footer/footer.component.html + 7 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6296,6 +6424,14 @@ 83 + + View Holding + View Holding + + libs/ui/src/lib/activities-table/activities-table.component.html + 444 + + Canada Canada @@ -6413,7 +6549,7 @@ Erreur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 630 + 663 @@ -6453,7 +6589,7 @@ Inactif apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html - 87 + 88 @@ -6461,15 +6597,15 @@ Annuler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 143 + 161 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 580 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 59 + 57 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6517,11 +6653,11 @@ Fermer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 582 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 61 + 59 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6556,6 +6692,14 @@ 11 + + Role + Role + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 31 + + Yes Oui @@ -6568,8 +6712,8 @@ Accounts Accounts - libs/ui/src/lib/assistant/assistant.html - 84 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 51 @@ -6596,6 +6740,14 @@ 63 + + If you plan to open an account at + If you plan to open an account at + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + + Performance with currency effect Performance Performance avec taux de change appliqué Performance @@ -6665,7 +6817,7 @@ Oups! Devise non valide. apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 50 + 48 @@ -6700,6 +6852,14 @@ 163 + + to use our referral link and get a Ghostfolio Premium membership for one year + to use our referral link and get a Ghostfolio Premium membership for one year + + apps/client/src/app/pages/pricing/pricing-page.html + 357 + + can be self-hosted peut être auto-hébergé @@ -6844,6 +7004,14 @@ 293 + + Engagement per Day + Engagement per Day + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 76 + + Guides Guides @@ -6955,7 +7123,7 @@ Impossible de générer une clé API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -6963,7 +7131,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 - 156 + 159 @@ -6971,7 +7139,7 @@ Clé API du fournisseur de données Ghostfolio Premium apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -6979,7 +7147,15 @@ Voulez-vous vraiment générer une nouvelle clé API ? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 + + + + Country + Country + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 37 @@ -7019,11 +7195,11 @@ Sauvegarder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 591 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 70 + 68 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -7071,7 +7247,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 251 + 260 @@ -7119,7 +7295,7 @@ Paresseux apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7127,7 +7303,15 @@ Instantané apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 + + + + API Requests Today + API Requests Today + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 86 @@ -7135,7 +7319,7 @@ Prix du marché par défaut apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 391 + 413 @@ -7143,7 +7327,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 432 + 454 @@ -7151,7 +7335,7 @@ Selecteur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 470 @@ -7159,7 +7343,7 @@ En-têtes de requête HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 404 + 426 @@ -7167,7 +7351,7 @@ fin de journée apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7175,7 +7359,7 @@ temps réel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 @@ -7203,7 +7387,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7223,11 +7407,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7323,11 +7507,11 @@ Jeton de sécurité apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 169 + 170 @@ -7335,7 +7519,7 @@ Voulez-vous vraiment générer un nouveau jeton de sécurité pour cet utilisateur ? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 237 @@ -7343,7 +7527,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7351,7 +7535,7 @@ Générer un jeton de sécurité apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -7387,8 +7571,8 @@ Terms of Service Conditions d’utilisation - apps/client/src/app/app.component.html - 112 + apps/client/src/app/components/footer/footer.component.html + 62 libs/common/src/lib/routes/routes.ts @@ -7408,7 +7592,7 @@ () est déjà utilisé. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 566 + 599 @@ -7416,7 +7600,7 @@ Une erreur s’est produite lors de la mise à jour vers (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 574 + 607 @@ -7424,7 +7608,7 @@ Appliquer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 153 @@ -7440,7 +7624,7 @@ Collecter les données récentes du marché historique apps/client/src/app/components/admin-market-data/admin-market-data.html - 226 + 225 @@ -7448,7 +7632,7 @@ Collecter toutes les données du marché historique apps/client/src/app/components/admin-market-data/admin-market-data.html - 231 + 230 @@ -7456,7 +7640,7 @@ Collecter les données du marché historique apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 33 + 34 @@ -7612,15 +7796,7 @@ 158 - - Name - Nom - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Liens rapides @@ -7628,24 +7804,16 @@ 58 - - Asset Profiles - Profils d’Actifs - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Démo Live apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 452 + 349 libs/common/src/lib/routes/routes.ts @@ -7770,6 +7938,14 @@ 5 + + Current month + Current month + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + + new new @@ -7936,7 +8112,7 @@ Voulez-vous vraiment générer un nouveau jeton de sécurité? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 174 + 175 @@ -7992,7 +8168,7 @@ Gérer le profil d’actif apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 466 @@ -8016,7 +8192,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 110 + 113 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -8407,6 +8583,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 23 + + Follow Ghostfolio on LinkedIn Follow Ghostfolio on LinkedIn diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 1c83e0337..076c02068 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -26,8 +26,8 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. Il rischio di perdita nel trading può essere notevole. Non è consigliabile investire denaro di cui potresti avere bisogno a breve termine. - apps/client/src/app/app.component.html - 221 + apps/client/src/app/components/footer/footer.component.html + 171 @@ -38,6 +38,14 @@ 11 + + please + please + + apps/client/src/app/pages/pricing/pricing-page.html + 350 + + Type Tipo @@ -55,7 +63,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 160 + 161 @@ -95,11 +103,11 @@ Nome apps/client/src/app/components/admin-market-data/admin-market-data.html - 89 + 88 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 286 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -135,7 +143,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 137 + 135 + + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -191,11 +203,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 297 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -219,7 +231,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 268 + 267 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -235,7 +247,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 451 @@ -243,11 +255,11 @@ Elimina apps/client/src/app/components/admin-market-data/admin-market-data.html - 290 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 68 + 86 apps/client/src/app/components/admin-overview/admin-overview.html @@ -271,7 +283,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 461 + 478 libs/ui/src/lib/benchmark/benchmark.component.html @@ -303,11 +315,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 106 + 105 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 179 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -369,6 +381,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Historical Market Data @@ -379,7 +395,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 567 @@ -427,7 +443,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 169 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -439,7 +455,7 @@ Prezzo di mercato apps/client/src/app/components/admin-market-data/admin-market-data.html - 133 + 132 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -455,11 +471,11 @@ Prima attività apps/client/src/app/components/admin-market-data/admin-market-data.html - 148 + 147 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 194 + 212 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -483,7 +499,7 @@ Dati storici apps/client/src/app/components/admin-market-data/admin-market-data.html - 166 + 165 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -535,11 +551,11 @@ Raccogli i dati del profilo apps/client/src/app/components/admin-market-data/admin-market-data.html - 235 + 234 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 48 + 66 @@ -547,7 +563,7 @@ Aggiungi valuta apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 22 + 20 @@ -610,12 +626,20 @@ 200 + + Activities + Activities + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 61 + + Do you really want to delete this user? Vuoi davvero eliminare questo utente? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 211 @@ -669,14 +693,34 @@ Get Started Inizia + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Sign in @@ -687,11 +731,11 @@ apps/client/src/app/components/header/header.component.ts - 279 + 283 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 60 libs/common/src/lib/routes/routes.ts @@ -707,11 +751,11 @@ Ops! Token di sicurezza errato. apps/client/src/app/components/header/header.component.ts - 294 + 298 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 153 + 154 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -775,15 +819,15 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 451 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -793,6 +837,10 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html 81 + + apps/client/src/app/pages/pricing/pricing-page.html + 343 + apps/client/src/app/pages/register/register-page.html 31 @@ -802,20 +850,12 @@ 30 - - Sign in with Internet Identity - Accedi con Internet Identity - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 - - Sign in with Google Accedi con Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 37 @@ -823,7 +863,7 @@ Rimani connesso apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 48 @@ -879,7 +919,7 @@ Patrimonio netto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 264 @@ -887,7 +927,7 @@ Prestazioni annualizzate apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 274 + 277 @@ -903,11 +943,11 @@ Settori apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 274 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -923,11 +963,11 @@ Paesi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 266 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 504 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -995,39 +1035,55 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 YTD anno corrente + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 1Y 1 anno + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 5Y 5 anni + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 Max Massimo + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 216 + libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -1035,7 +1091,7 @@ Bene apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -1050,8 +1106,8 @@ About Informazioni su - apps/client/src/app/app.component.html - 70 + apps/client/src/app/components/footer/footer.component.html + 20 apps/client/src/app/components/header/header.component.html @@ -1074,8 +1130,8 @@ Privacy Policy Informativa sulla privacy - apps/client/src/app/app.component.html - 105 + apps/client/src/app/components/footer/footer.component.html + 55 apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html @@ -1103,7 +1159,7 @@ Inserisci il tuo codice del buono: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -1111,7 +1167,7 @@ Impossibile riscattare il codice del buono apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -1119,7 +1175,7 @@ Il codice del buono è stato riscattato apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -1127,7 +1183,7 @@ Ricarica apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -1191,7 +1247,7 @@ Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 419 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1293,6 +1349,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Update account @@ -1315,15 +1375,15 @@ Valuta apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 201 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 293 + 311 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 47 + 45 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1339,7 +1399,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 280 + 281 @@ -1402,8 +1462,8 @@ Blog Blog - apps/client/src/app/app.component.html - 74 + apps/client/src/app/components/footer/footer.component.html + 24 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html @@ -1514,8 +1574,8 @@ Frequently Asked Questions (FAQ) Domande più frequenti (FAQ) - apps/client/src/app/app.component.html - 83 + apps/client/src/app/components/footer/footer.component.html + 33 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1534,8 +1594,8 @@ Features Funzionalità - apps/client/src/app/app.component.html - 79 + apps/client/src/app/components/footer/footer.component.html + 29 apps/client/src/app/components/header/header.component.html @@ -1555,7 +1615,7 @@ Panoramica apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 113 apps/client/src/app/components/header/header.component.html @@ -1590,8 +1650,12 @@ Markets Mercati - apps/client/src/app/app.component.html - 61 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + + + apps/client/src/app/components/footer/footer.component.html + 11 apps/client/src/app/components/header/header.component.html @@ -1789,10 +1853,6 @@ libs/common/src/lib/routes/routes.ts 167 - - - Holdings - Partecipazioni libs/ui/src/lib/assistant/assistant.html 110 @@ -1806,6 +1866,14 @@ 10 + + Current week + Current week + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + + Add activity Aggiungi un’attività @@ -1835,11 +1903,11 @@ Nome, simbolo o ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 132 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 29 + 27 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html @@ -1863,7 +1931,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 190 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1879,7 +1947,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 214 + 215 @@ -1887,7 +1955,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 529 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1911,7 +1979,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 221 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -1970,8 +2038,8 @@ Pricing Prezzi - apps/client/src/app/app.component.html - 99 + apps/client/src/app/components/footer/footer.component.html + 49 apps/client/src/app/components/header/header.component.html @@ -2058,20 +2126,12 @@ 281 - - Continue with Internet Identity - Continua con Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Continua con Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -2086,8 +2146,8 @@ Resources Risorse - apps/client/src/app/app.component.html - 64 + apps/client/src/app/components/footer/footer.component.html + 14 apps/client/src/app/components/header/header.component.html @@ -2135,7 +2195,7 @@ Bozza libs/ui/src/lib/activities-table/activities-table.component.html - 144 + 142 @@ -2151,7 +2211,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 375 + 380 @@ -2163,7 +2223,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 400 + 405 @@ -2175,7 +2235,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 413 + 418 @@ -2183,7 +2243,7 @@ Clona libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 457 @@ -2191,7 +2251,7 @@ Esporta la bozza come ICS libs/ui/src/lib/activities-table/activities-table.component.html - 450 + 467 @@ -2199,7 +2259,7 @@ Vuoi davvero eliminare questa attività? libs/ui/src/lib/activities-table/activities-table.component.ts - 280 + 286 @@ -2210,6 +2270,14 @@ 117 + + contact us + contact us + + apps/client/src/app/pages/pricing/pricing-page.html + 353 + + from ATH dal massimo storico (ATH) @@ -2242,14 +2310,6 @@ 56 - - Get started - Inizia - - apps/client/src/app/components/header/header.component.html - 432 - - This feature is currently unavailable. Questa funzionalità non è attualmente disponibile. @@ -2355,7 +2415,7 @@ Settore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 239 + 257 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2367,7 +2427,7 @@ Paese apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 250 + 268 apps/client/src/app/components/admin-users/admin-users.html @@ -2391,7 +2451,7 @@ Importo totale previsto libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 60 + 59 @@ -2411,7 +2471,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 295 + 298 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2443,7 +2503,7 @@ Numero di settori apps/client/src/app/components/admin-market-data/admin-market-data.html - 175 + 174 @@ -2451,7 +2511,7 @@ Numero di paesi apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 183 @@ -2527,7 +2587,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 351 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -2627,14 +2687,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 312 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -2643,15 +2703,15 @@ Classe asset apps/client/src/app/components/admin-market-data/admin-market-data.html - 115 + 114 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 230 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 303 + 321 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2661,14 +2721,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Symbol @@ -2679,15 +2739,15 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 75 + 74 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 150 + 168 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 39 + 37 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2701,14 +2761,14 @@ Tag Etichetta - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Cash @@ -2839,7 +2899,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -2859,11 +2919,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -2951,7 +3011,7 @@ Conteggio attività apps/client/src/app/components/admin-market-data/admin-market-data.html - 157 + 156 @@ -2967,7 +3027,15 @@ Mappatura dei simboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 357 + 379 + + + + Looking for a student discount? + Looking for a student discount? + + apps/client/src/app/pages/pricing/pricing-page.html + 359 @@ -2983,7 +3051,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 310 apps/client/src/app/pages/features/features-page.html @@ -3015,15 +3083,15 @@ Sottoclasse asset apps/client/src/app/components/admin-market-data/admin-market-data.html - 124 + 123 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 221 + 239 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 337 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3110,8 +3178,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3143,7 +3211,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 387 + 392 @@ -3462,32 +3530,12 @@ 303 - - Get Started - Inizia - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 447 - - - apps/client/src/app/pages/pricing/pricing-page.html - 351 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - It’s free. È gratuito. apps/client/src/app/pages/pricing/pricing-page.html - 353 + 379 @@ -3651,7 +3699,7 @@ Imita l’utente apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -3659,7 +3707,7 @@ Elimina l’utente apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -3667,7 +3715,7 @@ Vuoi davvero eliminare tutte le tue attività? libs/ui/src/lib/activities-table/activities-table.component.ts - 270 + 276 @@ -3686,6 +3734,14 @@ 8 + + Current year + Current year + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + + Add platform Aggiungi la piattaforma @@ -3699,11 +3755,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 464 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 516 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3719,7 +3775,7 @@ Vuoi davvero eliminare questa piattaforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 108 @@ -3898,6 +3954,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Liabilities Passività @@ -3914,8 +3978,8 @@ Changelog Changelog - apps/client/src/app/app.component.html - 77 + apps/client/src/app/components/footer/footer.component.html + 27 apps/client/src/app/pages/about/changelog/changelog-page.html @@ -3930,8 +3994,8 @@ License Licenza - apps/client/src/app/app.component.html - 89 + apps/client/src/app/components/footer/footer.component.html + 39 apps/client/src/app/pages/about/license/license-page.html @@ -4059,7 +4123,7 @@ Configurazione dello scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 382 + 404 @@ -4218,6 +4282,14 @@ 210 + + User ID + User ID + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + + Free Plan Piano gratuito @@ -4491,7 +4563,7 @@ Stelle su GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -4503,7 +4575,7 @@ Estrazioni su Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -4623,7 +4695,7 @@ Utenti attivi mensili apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -4631,7 +4703,7 @@ Come si vede su apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -4639,7 +4711,7 @@ Proteggi i tuoi asset. Perfeziona la tua strategia di investimento personale. apps/client/src/app/pages/landing/landing-page.html - 226 + 124 @@ -4647,7 +4719,7 @@ Ghostfolio permette alle persone impegnate di tenere traccia di azioni, ETF o criptovalute senza essere tracciate. apps/client/src/app/pages/landing/landing-page.html - 230 + 128 @@ -4655,7 +4727,7 @@ Vista a 360° apps/client/src/app/pages/landing/landing-page.html - 240 + 138 @@ -4663,7 +4735,7 @@ Pronto per il Web3 apps/client/src/app/pages/landing/landing-page.html - 251 + 149 @@ -4671,7 +4743,7 @@ Usa Ghostfolio in modo anonimo e possiedi i tuoi dati finanziari. apps/client/src/app/pages/landing/landing-page.html - 254 + 152 @@ -4679,7 +4751,7 @@ Beneficia dei continui miglioramenti grazie a una forte comunità. apps/client/src/app/pages/landing/landing-page.html - 264 + 162 @@ -4695,7 +4767,7 @@ Perché Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 272 + 170 @@ -4703,7 +4775,7 @@ Ghostfolio è per te se... apps/client/src/app/pages/landing/landing-page.html - 274 + 172 @@ -4711,7 +4783,7 @@ fai trading di azioni, ETF o criptovalute su più piattaforme apps/client/src/app/pages/landing/landing-page.html - 280 + 178 @@ -4719,7 +4791,7 @@ persegui una strategia buy & hold apps/client/src/app/pages/landing/landing-page.html - 286 + 184 @@ -4727,7 +4799,7 @@ sei interessato a conoscere la composizione del tuo portafoglio apps/client/src/app/pages/landing/landing-page.html - 291 + 189 @@ -4735,7 +4807,7 @@ valorizzi la privacy e la proprietà dei dati apps/client/src/app/pages/landing/landing-page.html - 296 + 194 @@ -4743,7 +4815,7 @@ sei per il minimalismo apps/client/src/app/pages/landing/landing-page.html - 299 + 197 @@ -4751,7 +4823,7 @@ ti interessa diversificare le tue risorse finanziarie apps/client/src/app/pages/landing/landing-page.html - 303 + 201 @@ -4759,7 +4831,7 @@ sei interessato all’indipendenza finanziaria apps/client/src/app/pages/landing/landing-page.html - 307 + 205 @@ -4767,7 +4839,7 @@ non vuoi utilizzare il foglio elettronico nel apps/client/src/app/pages/landing/landing-page.html - 311 + 209 @@ -4775,7 +4847,7 @@ stai ancora leggendo questo elenco apps/client/src/app/pages/landing/landing-page.html - 314 + 212 @@ -4783,7 +4855,7 @@ Ulteriori informazioni su Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 319 + 217 @@ -4791,7 +4863,7 @@ Cosa dicono i nostri utenti apps/client/src/app/pages/landing/landing-page.html - 328 + 226 @@ -4799,7 +4871,7 @@ Membri da tutto il mondo utilizzano Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 367 + 265 @@ -4807,7 +4879,7 @@ Come funziona Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 384 + 282 @@ -4815,7 +4887,7 @@ Iscriviti in modo anonimo* apps/client/src/app/pages/landing/landing-page.html - 392 + 290 @@ -4823,7 +4895,7 @@ * non è richiesto alcun indirizzo email né la carta di credito apps/client/src/app/pages/landing/landing-page.html - 394 + 292 @@ -4831,7 +4903,7 @@ Aggiungi le tue transazioni storiche apps/client/src/app/pages/landing/landing-page.html - 406 + 304 @@ -4839,7 +4911,7 @@ Ottieni informazioni preziose sulla composizione del tuo portafoglio apps/client/src/app/pages/landing/landing-page.html - 418 + 316 @@ -4847,7 +4919,7 @@ Sei pronto? apps/client/src/app/pages/landing/landing-page.html - 432 + 330 @@ -4855,7 +4927,7 @@ Ottieni un quadro completo delle tue finanze personali su più piattaforme. apps/client/src/app/pages/landing/landing-page.html - 243 + 141 @@ -4863,7 +4935,7 @@ Inizia in soli 3 passi apps/client/src/app/pages/landing/landing-page.html - 386 + 284 @@ -5164,6 +5236,14 @@ 62 + + with your university e-mail address + with your university e-mail address + + apps/client/src/app/pages/pricing/pricing-page.html + 365 + + (Last 30 days) (Ultimi 30 giorni) @@ -5233,7 +5313,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 238 + 239 libs/ui/src/lib/i18n.ts @@ -5261,7 +5341,7 @@ Sei sicuro di voler eliminare questo tag? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 103 + 104 @@ -5336,6 +5416,14 @@ 37 + + Request it + Request it + + apps/client/src/app/pages/pricing/pricing-page.html + 361 + + Access Accesso @@ -5373,7 +5461,7 @@ Aggiungi manualmente apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 19 + 18 @@ -5445,7 +5533,7 @@ Ops, il trasferimento del saldo di cassa è fallito. apps/client/src/app/pages/accounts/accounts-page.component.ts - 324 + 339 @@ -5545,7 +5633,7 @@ L’attuale prezzo di mercato è apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 639 + 672 @@ -5553,7 +5641,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 504 @@ -5561,7 +5649,7 @@ Intervallo di date libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5652,6 +5740,22 @@ 88 + + here + here + + apps/client/src/app/pages/pricing/pricing-page.html + 364 + + + + Close Holding + Close Holding + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 442 + + Absolute Asset Performance Rendimento assoluto dell’Asset @@ -5705,15 +5809,19 @@ Da inizio settimana libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 WTD Settimana corrente + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5721,15 +5829,19 @@ Da inizio mese libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 MTD Mese corrente + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5737,7 +5849,7 @@ Da inizio anno libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5760,17 +5872,21 @@ 8 - + Reset Filters Reset Filtri libs/ui/src/lib/assistant/assistant.html - 266 + 204 year anno + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 290 @@ -5781,23 +5897,27 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 years anni + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 - + Apply Filters Applica i Filtri libs/ui/src/lib/assistant/assistant.html - 276 + 217 @@ -5805,7 +5925,7 @@ Raccolta Dati apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6022,7 +6142,15 @@ Registrati adesso o prova l’account demo apps/client/src/app/pages/landing/landing-page.html - 435 + 333 + + + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 @@ -6054,7 +6182,7 @@ Elimina i profili apps/client/src/app/components/admin-market-data/admin-market-data.html - 243 + 242 @@ -6125,8 +6253,8 @@ Community Comunità - apps/client/src/app/app.component.html - 130 + apps/client/src/app/components/footer/footer.component.html + 80 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -6198,7 +6326,7 @@ Open Source apps/client/src/app/pages/landing/landing-page.html - 261 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6209,8 +6337,8 @@ Personal Finance Finanza Personale - apps/client/src/app/app.component.html - 57 + apps/client/src/app/components/footer/footer.component.html + 7 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6297,6 +6425,14 @@ 83 + + View Holding + View Holding + + libs/ui/src/lib/activities-table/activities-table.component.html + 444 + + Canada Canada @@ -6414,7 +6550,7 @@ Errore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 630 + 663 @@ -6454,7 +6590,7 @@ Inattivo apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html - 87 + 88 @@ -6462,15 +6598,15 @@ Annulla apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 143 + 161 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 580 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 59 + 57 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6518,11 +6654,11 @@ Chiudi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 582 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 61 + 59 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6557,6 +6693,14 @@ 11 + + Role + Role + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 31 + + Yes Si @@ -6569,8 +6713,8 @@ Accounts Accounts - libs/ui/src/lib/assistant/assistant.html - 84 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 51 @@ -6597,6 +6741,14 @@ 63 + + If you plan to open an account at + If you plan to open an account at + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + + Performance with currency effect Performance Prestazioni con effetto valuta Prestazioni @@ -6666,7 +6818,7 @@ Oops! Valuta sbagliata. apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 50 + 48 @@ -6701,6 +6853,14 @@ 163 + + to use our referral link and get a Ghostfolio Premium membership for one year + to use our referral link and get a Ghostfolio Premium membership for one year + + apps/client/src/app/pages/pricing/pricing-page.html + 357 + + can be self-hosted può essere ospitato in proprio @@ -6845,6 +7005,14 @@ 293 + + Engagement per Day + Engagement per Day + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 76 + + Guides Guide @@ -6956,7 +7124,7 @@ Non è stato possibile generare un API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -6964,7 +7132,7 @@ Imposta questa API key nel tuo ambiente self-hosted: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -6972,7 +7140,7 @@ API Key for Ghostfolio Premium Data Provider apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -6980,7 +7148,15 @@ Vuoi davvero generare una nuova API key? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 + + + + Country + Country + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 37 @@ -7020,11 +7196,11 @@ Salva apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 591 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 70 + 68 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -7072,7 +7248,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 251 + 260 @@ -7120,7 +7296,7 @@ Pigro apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7128,7 +7304,15 @@ Istantaneo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 + + + + API Requests Today + API Requests Today + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 86 @@ -7136,7 +7320,7 @@ Prezzo di mercato predefinito apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 391 + 413 @@ -7144,7 +7328,7 @@ Modalità apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 432 + 454 @@ -7152,7 +7336,7 @@ Selettore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 470 @@ -7160,7 +7344,7 @@ Intestazioni della richiesta HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 404 + 426 @@ -7168,7 +7352,7 @@ fine giornata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7176,7 +7360,7 @@ in tempo reale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 @@ -7204,7 +7388,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7224,11 +7408,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7324,11 +7508,11 @@ Token di sicurezza apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 169 + 170 @@ -7336,7 +7520,7 @@ Vuoi davvero generare un nuovo token di sicurezza per questo utente? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 237 @@ -7344,7 +7528,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7352,7 +7536,7 @@ Genera Token di Sicurezza apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -7388,8 +7572,8 @@ Terms of Service Termini e condizioni - apps/client/src/app/app.component.html - 112 + apps/client/src/app/components/footer/footer.component.html + 62 libs/common/src/lib/routes/routes.ts @@ -7409,7 +7593,7 @@ () e gia in uso. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 566 + 599 @@ -7417,7 +7601,7 @@ Si è verificato un errore durante l’aggiornamento di (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 574 + 607 @@ -7425,7 +7609,7 @@ Applica apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 153 @@ -7441,7 +7625,7 @@ Raccogli dati storici di mercato recenti apps/client/src/app/components/admin-market-data/admin-market-data.html - 226 + 225 @@ -7449,7 +7633,7 @@ Raccogli tutti i dati storici di mercato apps/client/src/app/components/admin-market-data/admin-market-data.html - 231 + 230 @@ -7457,7 +7641,7 @@ Raccogli dati storici di mercato apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 33 + 34 @@ -7613,15 +7797,7 @@ 158 - - Name - Nome - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Collegamenti rapidi @@ -7629,24 +7805,16 @@ 58 - - Asset Profiles - Profili delle risorse - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Dimostrazione dal vivo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 452 + 349 libs/common/src/lib/routes/routes.ts @@ -7771,6 +7939,14 @@ 5 + + Current month + Current month + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + + new nuovo @@ -7937,7 +8113,7 @@ Vuoi davvero generare un nuovo token di sicurezza? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 174 + 175 @@ -7993,7 +8169,7 @@ Gestisci profilo risorsa apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 466 @@ -8017,7 +8193,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 110 + 113 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -8408,6 +8584,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 23 + + Follow Ghostfolio on LinkedIn Follow Ghostfolio on LinkedIn diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 6c1e247c8..4a17736b4 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -25,8 +25,8 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. Het risico op verlies bij handelen kan aanzienlijk zijn. Het is niet aan te raden om geld te investeren dat je misschien op korte termijn nodig heeft. - apps/client/src/app/app.component.html - 221 + apps/client/src/app/components/footer/footer.component.html + 171 @@ -37,6 +37,14 @@ 11 + + please + please + + apps/client/src/app/pages/pricing/pricing-page.html + 350 + + Type Type @@ -54,7 +62,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 160 + 161 @@ -94,11 +102,11 @@ Naam apps/client/src/app/components/admin-market-data/admin-market-data.html - 89 + 88 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 286 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -134,7 +142,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 137 + 135 + + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -190,11 +202,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 297 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -218,7 +230,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 268 + 267 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -234,7 +246,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 451 @@ -242,11 +254,11 @@ Verwijderen apps/client/src/app/components/admin-market-data/admin-market-data.html - 290 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 68 + 86 apps/client/src/app/components/admin-overview/admin-overview.html @@ -270,7 +282,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 461 + 478 libs/ui/src/lib/benchmark/benchmark.component.html @@ -302,11 +314,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 106 + 105 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 179 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -368,6 +380,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Historical Market Data @@ -378,7 +394,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 567 @@ -426,7 +442,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 169 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -438,7 +454,7 @@ Marktprijs apps/client/src/app/components/admin-market-data/admin-market-data.html - 133 + 132 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -454,11 +470,11 @@ Eerste activiteit apps/client/src/app/components/admin-market-data/admin-market-data.html - 148 + 147 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 194 + 212 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -482,7 +498,7 @@ Historische gegevens apps/client/src/app/components/admin-market-data/admin-market-data.html - 166 + 165 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -534,11 +550,11 @@ Verzamel profielgegevens apps/client/src/app/components/admin-market-data/admin-market-data.html - 235 + 234 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 48 + 66 @@ -546,7 +562,7 @@ Valuta toevoegen apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 22 + 20 @@ -609,12 +625,20 @@ 200 + + Activities + Activities + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 61 + + Do you really want to delete this user? Wilt je deze gebruiker echt verwijderen? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 211 @@ -668,14 +692,34 @@ Get Started Aan de slag + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Sign in @@ -686,11 +730,11 @@ apps/client/src/app/components/header/header.component.ts - 279 + 283 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 60 libs/common/src/lib/routes/routes.ts @@ -706,11 +750,11 @@ Oeps! Onjuiste beveiligingstoken. apps/client/src/app/components/header/header.component.ts - 294 + 298 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 153 + 154 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -774,15 +818,15 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 451 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -792,6 +836,10 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html 81 + + apps/client/src/app/pages/pricing/pricing-page.html + 343 + apps/client/src/app/pages/register/register-page.html 31 @@ -801,20 +849,12 @@ 30 - - Sign in with Internet Identity - Aanmelden met Internet Identity - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 - - Sign in with Google Aanmelden met Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 37 @@ -822,7 +862,7 @@ Aangemeld blijven apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 48 @@ -878,7 +918,7 @@ Netto waarde apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 264 @@ -886,7 +926,7 @@ Rendement per jaar apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 274 + 277 @@ -902,11 +942,11 @@ Sectoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 274 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -922,11 +962,11 @@ Landen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 266 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 504 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -994,39 +1034,55 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 YTD YTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 1Y 1J + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 5Y 5J + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 Max Max + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 216 + libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -1034,7 +1090,7 @@ Oké apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -1049,8 +1105,8 @@ About Over - apps/client/src/app/app.component.html - 70 + apps/client/src/app/components/footer/footer.component.html + 20 apps/client/src/app/components/header/header.component.html @@ -1073,8 +1129,8 @@ Privacy Policy Privacybeleid - apps/client/src/app/app.component.html - 105 + apps/client/src/app/components/footer/footer.component.html + 55 apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html @@ -1102,7 +1158,7 @@ Voer je couponcode in: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -1110,7 +1166,7 @@ Kon je kortingscode niet inwisselen apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -1118,7 +1174,7 @@ Je couponcode is ingewisseld apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -1126,7 +1182,7 @@ Herladen apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -1190,7 +1246,7 @@ Locatie apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 419 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1292,6 +1348,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Update account @@ -1314,15 +1374,15 @@ Valuta apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 201 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 293 + 311 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 47 + 45 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1338,7 +1398,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 280 + 281 @@ -1401,8 +1461,8 @@ Blog Blog - apps/client/src/app/app.component.html - 74 + apps/client/src/app/components/footer/footer.component.html + 24 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html @@ -1513,8 +1573,8 @@ Frequently Asked Questions (FAQ) Veelgestelde vragen - apps/client/src/app/app.component.html - 83 + apps/client/src/app/components/footer/footer.component.html + 33 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1533,8 +1593,8 @@ Features Functionaliteiten - apps/client/src/app/app.component.html - 79 + apps/client/src/app/components/footer/footer.component.html + 29 apps/client/src/app/components/header/header.component.html @@ -1554,7 +1614,7 @@ Overzicht apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 113 apps/client/src/app/components/header/header.component.html @@ -1589,8 +1649,12 @@ Markets Markten - apps/client/src/app/app.component.html - 61 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + + + apps/client/src/app/components/footer/footer.component.html + 11 apps/client/src/app/components/header/header.component.html @@ -1788,10 +1852,6 @@ libs/common/src/lib/routes/routes.ts 167 - - - Holdings - Posities libs/ui/src/lib/assistant/assistant.html 110 @@ -1805,6 +1865,14 @@ 10 + + Current week + Current week + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + + Add activity Activiteit toevoegen @@ -1834,11 +1902,11 @@ Naam, symbool of ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 132 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 29 + 27 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html @@ -1862,7 +1930,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 190 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1878,7 +1946,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 214 + 215 @@ -1886,7 +1954,7 @@ Opmerking apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 529 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1910,7 +1978,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 221 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -1969,8 +2037,8 @@ Pricing Prijzen - apps/client/src/app/app.component.html - 99 + apps/client/src/app/components/footer/footer.component.html + 49 apps/client/src/app/components/header/header.component.html @@ -2057,20 +2125,12 @@ 281 - - Continue with Internet Identity - Ga verder met Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Verder met Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -2085,8 +2145,8 @@ Resources Bronnen - apps/client/src/app/app.component.html - 64 + apps/client/src/app/components/footer/footer.component.html + 14 apps/client/src/app/components/header/header.component.html @@ -2134,7 +2194,7 @@ Concept libs/ui/src/lib/activities-table/activities-table.component.html - 144 + 142 @@ -2150,7 +2210,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 375 + 380 @@ -2162,7 +2222,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 400 + 405 @@ -2174,7 +2234,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 413 + 418 @@ -2182,7 +2242,7 @@ Kloon libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 457 @@ -2190,7 +2250,7 @@ Concept exporteren als ICS libs/ui/src/lib/activities-table/activities-table.component.html - 450 + 467 @@ -2198,7 +2258,7 @@ Wil je deze activiteit echt verwijderen? libs/ui/src/lib/activities-table/activities-table.component.ts - 280 + 286 @@ -2209,6 +2269,14 @@ 117 + + contact us + contact us + + apps/client/src/app/pages/pricing/pricing-page.html + 353 + + from ATH van ATH @@ -2241,14 +2309,6 @@ 56 - - Get started - Aan de slag - - apps/client/src/app/components/header/header.component.html - 432 - - This feature is currently unavailable. Deze functie is momenteel niet beschikbaar. @@ -2354,7 +2414,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 239 + 257 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2366,7 +2426,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 250 + 268 apps/client/src/app/components/admin-users/admin-users.html @@ -2390,7 +2450,7 @@ Verwacht totaalbedrag libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 60 + 59 @@ -2410,7 +2470,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 295 + 298 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2442,7 +2502,7 @@ Aantal sectoren apps/client/src/app/components/admin-market-data/admin-market-data.html - 175 + 174 @@ -2450,7 +2510,7 @@ Aantal landen apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 183 @@ -2526,7 +2586,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 351 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -2626,14 +2686,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 312 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -2642,15 +2702,15 @@ Asset klasse apps/client/src/app/components/admin-market-data/admin-market-data.html - 115 + 114 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 230 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 303 + 321 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2660,14 +2720,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Symbol @@ -2678,15 +2738,15 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 75 + 74 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 150 + 168 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 39 + 37 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2700,14 +2760,14 @@ Tag Label - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Cash @@ -2838,7 +2898,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -2858,11 +2918,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -2950,7 +3010,7 @@ Aantal activiteiten apps/client/src/app/components/admin-market-data/admin-market-data.html - 157 + 156 @@ -2966,7 +3026,15 @@ Symbool toewijzen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 357 + 379 + + + + Looking for a student discount? + Looking for a student discount? + + apps/client/src/app/pages/pricing/pricing-page.html + 359 @@ -2982,7 +3050,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 310 apps/client/src/app/pages/features/features-page.html @@ -3014,15 +3082,15 @@ Asset subklasse apps/client/src/app/components/admin-market-data/admin-market-data.html - 124 + 123 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 221 + 239 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 337 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3109,8 +3177,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3142,7 +3210,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 387 + 392 @@ -3461,32 +3529,12 @@ 303 - - Get Started - Aan de slag - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 447 - - - apps/client/src/app/pages/pricing/pricing-page.html - 351 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - It’s free. Het is gratis. apps/client/src/app/pages/pricing/pricing-page.html - 353 + 379 @@ -3650,7 +3698,7 @@ Gebruiker immiteren apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -3658,7 +3706,7 @@ Gebruiker verwijderen apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -3666,7 +3714,7 @@ Weet je zeker dat je alle activiteiten wilt verwijderen? libs/ui/src/lib/activities-table/activities-table.component.ts - 270 + 276 @@ -3685,6 +3733,14 @@ 8 + + Current year + Current year + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + + Add platform Platform toevoegen @@ -3698,11 +3754,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 464 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 516 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3718,7 +3774,7 @@ Wil je dit platform echt verwijderen? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 108 @@ -3897,6 +3953,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Liabilities Verplichtingen @@ -3913,8 +3977,8 @@ Changelog Changelog - apps/client/src/app/app.component.html - 77 + apps/client/src/app/components/footer/footer.component.html + 27 apps/client/src/app/pages/about/changelog/changelog-page.html @@ -3929,8 +3993,8 @@ License Licentie - apps/client/src/app/app.component.html - 89 + apps/client/src/app/components/footer/footer.component.html + 39 apps/client/src/app/pages/about/license/license-page.html @@ -4058,7 +4122,7 @@ Scraper instellingen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 382 + 404 @@ -4217,6 +4281,14 @@ 210 + + User ID + User ID + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + + Free Plan Gratis abonnement @@ -4490,7 +4562,7 @@ Sterren op GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -4502,7 +4574,7 @@ Pulls op Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -4622,7 +4694,7 @@ Maandelijkse actieve gebruikers apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -4630,7 +4702,7 @@ Zoals te zien in apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -4638,7 +4710,7 @@ Bescherm je financiële bezittingen. Verfijn je persoonlijke investeringsstrategie. apps/client/src/app/pages/landing/landing-page.html - 226 + 124 @@ -4646,7 +4718,7 @@ Ghostfolio stelt drukbezette mensen in staat om aandelen, ETF’s of cryptocurrencies bij te houden zonder gevolgd te worden. apps/client/src/app/pages/landing/landing-page.html - 230 + 128 @@ -4654,7 +4726,7 @@ 360°-overzicht apps/client/src/app/pages/landing/landing-page.html - 240 + 138 @@ -4662,7 +4734,7 @@ Klaar voor Web3 apps/client/src/app/pages/landing/landing-page.html - 251 + 149 @@ -4670,7 +4742,7 @@ Gebruik Ghostfolio anoniem en bezit je financiële gegevens. apps/client/src/app/pages/landing/landing-page.html - 254 + 152 @@ -4678,7 +4750,7 @@ Profiteer van voortdurende verbeteringen door een sterke gemeenschap. apps/client/src/app/pages/landing/landing-page.html - 264 + 162 @@ -4694,7 +4766,7 @@ Waarom Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 272 + 170 @@ -4702,7 +4774,7 @@ Ghostfolio is iets voor je als je... apps/client/src/app/pages/landing/landing-page.html - 274 + 172 @@ -4710,7 +4782,7 @@ handelt in aandelen, ETF’s of cryptocurrencies op meerdere platforms apps/client/src/app/pages/landing/landing-page.html - 280 + 178 @@ -4718,7 +4790,7 @@ streeft naar een buy & hold strategie apps/client/src/app/pages/landing/landing-page.html - 286 + 184 @@ -4726,7 +4798,7 @@ geïnteresseerd bent in het krijgen van inzicht in je portefeuillesamenstelling apps/client/src/app/pages/landing/landing-page.html - 291 + 189 @@ -4734,7 +4806,7 @@ privacy en eigendom van gegevens waardeert apps/client/src/app/pages/landing/landing-page.html - 296 + 194 @@ -4742,7 +4814,7 @@ houdt van een minimalistisch ontwerp apps/client/src/app/pages/landing/landing-page.html - 299 + 197 @@ -4750,7 +4822,7 @@ zorgdraagt voor het diversifiëren van je financiële middelen apps/client/src/app/pages/landing/landing-page.html - 303 + 201 @@ -4758,7 +4830,7 @@ geïnteresseerd bent in financiële onafhankelijkheid apps/client/src/app/pages/landing/landing-page.html - 307 + 205 @@ -4766,7 +4838,7 @@ "nee" zegt tegen spreadsheets in apps/client/src/app/pages/landing/landing-page.html - 311 + 209 @@ -4774,7 +4846,7 @@ nog steeds deze lijst aan het lezen bent apps/client/src/app/pages/landing/landing-page.html - 314 + 212 @@ -4782,7 +4854,7 @@ Leer meer over Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 319 + 217 @@ -4790,7 +4862,7 @@ Wat onze gebruikers zeggen apps/client/src/app/pages/landing/landing-page.html - 328 + 226 @@ -4798,7 +4870,7 @@ Leden van over de hele wereld gebruikenGhostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 367 + 265 @@ -4806,7 +4878,7 @@ Hoe Ghostfolio werkt? apps/client/src/app/pages/landing/landing-page.html - 384 + 282 @@ -4814,7 +4886,7 @@ Anoniem aanmelden* apps/client/src/app/pages/landing/landing-page.html - 392 + 290 @@ -4822,7 +4894,7 @@ * geen e-mailadres of creditcard nodig apps/client/src/app/pages/landing/landing-page.html - 394 + 292 @@ -4830,7 +4902,7 @@ Voeg al je historische transacties toe apps/client/src/app/pages/landing/landing-page.html - 406 + 304 @@ -4838,7 +4910,7 @@ Krijg waardevolle inzichten in de samenstelling van je portefeuille apps/client/src/app/pages/landing/landing-page.html - 418 + 316 @@ -4846,7 +4918,7 @@ Ben jij er klaar voor? apps/client/src/app/pages/landing/landing-page.html - 432 + 330 @@ -4854,7 +4926,7 @@ Krijg een volledig beeld van je persoonlijke financiën op meerdere platforms. apps/client/src/app/pages/landing/landing-page.html - 243 + 141 @@ -4862,7 +4934,7 @@ Aan de slag in slechts 3 stappen apps/client/src/app/pages/landing/landing-page.html - 386 + 284 @@ -5163,6 +5235,14 @@ 62 + + with your university e-mail address + with your university e-mail address + + apps/client/src/app/pages/pricing/pricing-page.html + 365 + + (Last 30 days) (Laatste 30 dagen) @@ -5232,7 +5312,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 238 + 239 libs/ui/src/lib/i18n.ts @@ -5260,7 +5340,7 @@ Weet u zetker dat u dit label wilt verwijderen? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 103 + 104 @@ -5335,6 +5415,14 @@ 37 + + Request it + Request it + + apps/client/src/app/pages/pricing/pricing-page.html + 361 + + Access Toegang @@ -5372,7 +5460,7 @@ Voeg Handmatig Toe apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 19 + 18 @@ -5444,7 +5532,7 @@ Oeps, geldoverdracht is mislukt. apps/client/src/app/pages/accounts/accounts-page.component.ts - 324 + 339 @@ -5544,7 +5632,7 @@ De huidige markt waarde is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 639 + 672 @@ -5552,7 +5640,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 504 @@ -5560,7 +5648,7 @@ Datumbereik libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5651,6 +5739,22 @@ 88 + + here + here + + apps/client/src/app/pages/pricing/pricing-page.html + 364 + + + + Close Holding + Close Holding + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 442 + + Absolute Asset Performance Absolute Activaprestaties @@ -5704,15 +5808,19 @@ Week tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 WTD Week tot nu toe + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5720,15 +5828,19 @@ Maand tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 MTD MTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5736,7 +5848,7 @@ Jaar tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5759,17 +5871,21 @@ 8 - + Reset Filters Filters Herstellen libs/ui/src/lib/assistant/assistant.html - 266 + 204 year jaar + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 290 @@ -5780,23 +5896,27 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 years jaren + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 - + Apply Filters Filters Toepassen libs/ui/src/lib/assistant/assistant.html - 276 + 217 @@ -5804,7 +5924,7 @@ Data Verzamelen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6021,7 +6141,15 @@ Word nu lid of bekijk het voorbeeldaccount apps/client/src/app/pages/landing/landing-page.html - 435 + 333 + + + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 @@ -6053,7 +6181,7 @@ Verwijder Profielen apps/client/src/app/components/admin-market-data/admin-market-data.html - 243 + 242 @@ -6124,8 +6252,8 @@ Community Gemeenschap - apps/client/src/app/app.component.html - 130 + apps/client/src/app/components/footer/footer.component.html + 80 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -6197,7 +6325,7 @@ Open Source apps/client/src/app/pages/landing/landing-page.html - 261 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6208,8 +6336,8 @@ Personal Finance Persoonlijke Financiën - apps/client/src/app/app.component.html - 57 + apps/client/src/app/components/footer/footer.component.html + 7 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6296,6 +6424,14 @@ 83 + + View Holding + View Holding + + libs/ui/src/lib/activities-table/activities-table.component.html + 444 + + Canada Canada @@ -6413,7 +6549,7 @@ Fout apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 630 + 663 @@ -6453,7 +6589,7 @@ Inactief apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html - 87 + 88 @@ -6461,15 +6597,15 @@ Annuleren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 143 + 161 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 580 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 59 + 57 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6517,11 +6653,11 @@ Sluiten apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 582 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 61 + 59 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6556,6 +6692,14 @@ 11 + + Role + Role + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 31 + + Yes Ja @@ -6568,8 +6712,8 @@ Accounts Accounts - libs/ui/src/lib/assistant/assistant.html - 84 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 51 @@ -6596,6 +6740,14 @@ 63 + + If you plan to open an account at + If you plan to open an account at + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + + Performance with currency effect Performance Prestatie met valuta effect Prestatie @@ -6665,7 +6817,7 @@ Oeps! Ongeldige valuta. apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 50 + 48 @@ -6700,6 +6852,14 @@ 163 + + to use our referral link and get a Ghostfolio Premium membership for one year + to use our referral link and get a Ghostfolio Premium membership for one year + + apps/client/src/app/pages/pricing/pricing-page.html + 357 + + can be self-hosted kan zelf gehost worden @@ -6844,6 +7004,14 @@ 293 + + Engagement per Day + Engagement per Day + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 76 + + Guides Gidsen @@ -6955,7 +7123,7 @@ Er kon geen API-sleutel worden gegenereerd apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -6963,7 +7131,7 @@ Stel deze API-sleutel in uw zelf-gehoste omgeving in: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -6971,7 +7139,7 @@ Ghostfolio Premium Gegevensleverancier API-sleutel apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -6979,7 +7147,15 @@ Wilt u echt een nieuwe API-sleutel genereren? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 + + + + Country + Country + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 37 @@ -7019,11 +7195,11 @@ Opslaan apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 591 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 70 + 68 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -7071,7 +7247,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 251 + 260 @@ -7119,7 +7295,7 @@ Lui apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7127,7 +7303,15 @@ Direct apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 + + + + API Requests Today + API Requests Today + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 86 @@ -7135,7 +7319,7 @@ Standaard Marktprijs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 391 + 413 @@ -7143,7 +7327,7 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 432 + 454 @@ -7151,7 +7335,7 @@ Kiezer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 470 @@ -7159,7 +7343,7 @@ HTTP Verzoek Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 404 + 426 @@ -7167,7 +7351,7 @@ eind van de dag apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7175,7 +7359,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 @@ -7203,7 +7387,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7223,11 +7407,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7323,11 +7507,11 @@ Beveiligingstoken apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 169 + 170 @@ -7335,7 +7519,7 @@ Wilt u echt een nieuw beveiligingstoken voor deze gebruiker aanmaken? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 237 @@ -7343,7 +7527,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7351,7 +7535,7 @@ Beveiligingstoken Aanmaken apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -7387,8 +7571,8 @@ Terms of Service Servicevoorwaarden - apps/client/src/app/app.component.html - 112 + apps/client/src/app/components/footer/footer.component.html + 62 libs/common/src/lib/routes/routes.ts @@ -7408,7 +7592,7 @@ () is al in gebruik. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 566 + 599 @@ -7416,7 +7600,7 @@ Er is een fout opgetreden tijdens het updaten naar (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 574 + 607 @@ -7424,7 +7608,7 @@ Toepassen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 153 @@ -7440,7 +7624,7 @@ Verzamel Recente Marktgegevens apps/client/src/app/components/admin-market-data/admin-market-data.html - 226 + 225 @@ -7448,7 +7632,7 @@ Verzamel Alle Marktgegevens apps/client/src/app/components/admin-market-data/admin-market-data.html - 231 + 230 @@ -7456,7 +7640,7 @@ Verzamel Historische Marktgegevens apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 33 + 34 @@ -7612,15 +7796,7 @@ 158 - - Name - Naam - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Snelle koppelingen @@ -7628,24 +7804,16 @@ 58 - - Asset Profiles - Activaprofielen - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Live-demo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 452 + 349 libs/common/src/lib/routes/routes.ts @@ -7770,6 +7938,14 @@ 5 + + Current month + Current month + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + + new nieuw @@ -7936,7 +8112,7 @@ Wilt u echt een nieuwe securitytoken genereren? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 174 + 175 @@ -7992,7 +8168,7 @@ Beheer activaprofiel apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 466 @@ -8016,7 +8192,7 @@ Gemiddelde eenheidsprijs apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 110 + 113 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -8407,6 +8583,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 23 + + Follow Ghostfolio on LinkedIn Volg Ghostfolio op LinkedIn diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 860e0742f..321cfbecd 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -214,8 +214,8 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. Ryzyko strat na rynku może być znaczne. Nie jest zalecane inwestowanie pieniędzy, które mogą być potrzebne w krótkim okresie. - apps/client/src/app/app.component.html - 221 + apps/client/src/app/components/footer/footer.component.html + 171 @@ -238,6 +238,14 @@ 11 + + please + please + + apps/client/src/app/pages/pricing/pricing-page.html + 350 + + Type Typ @@ -255,7 +263,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 160 + 161 @@ -339,11 +347,11 @@ Nazwa apps/client/src/app/components/admin-market-data/admin-market-data.html - 89 + 88 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 286 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -379,7 +387,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 137 + 135 + + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -407,15 +419,15 @@ Waluta apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 201 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 293 + 311 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 47 + 45 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -431,7 +443,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 280 + 281 @@ -467,11 +479,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 297 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -495,7 +507,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 268 + 267 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -511,7 +523,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 451 @@ -519,11 +531,11 @@ Usuń apps/client/src/app/components/admin-market-data/admin-market-data.html - 290 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 68 + 86 apps/client/src/app/components/admin-overview/admin-overview.html @@ -547,7 +559,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 461 + 478 libs/ui/src/lib/benchmark/benchmark.component.html @@ -579,7 +591,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 567 @@ -591,11 +603,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 106 + 105 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 179 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -703,7 +715,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 169 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -715,7 +727,7 @@ Cena Rynkowa apps/client/src/app/components/admin-market-data/admin-market-data.html - 133 + 132 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -775,11 +787,11 @@ Pierwsza Aktywność apps/client/src/app/components/admin-market-data/admin-market-data.html - 148 + 147 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 194 + 212 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -795,7 +807,7 @@ Liczba Aktywności apps/client/src/app/components/admin-market-data/admin-market-data.html - 157 + 156 @@ -803,7 +815,7 @@ Dane Historyczne apps/client/src/app/components/admin-market-data/admin-market-data.html - 166 + 165 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -815,7 +827,7 @@ Liczba Sektorów apps/client/src/app/components/admin-market-data/admin-market-data.html - 175 + 174 @@ -823,7 +835,7 @@ Liczba Krajów apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 183 @@ -831,11 +843,11 @@ Zbierz Dane Profilu apps/client/src/app/components/admin-market-data/admin-market-data.html - 235 + 234 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 48 + 66 @@ -875,7 +887,7 @@ Sektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 239 + 257 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -887,7 +899,7 @@ Kraj apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 250 + 268 apps/client/src/app/components/admin-users/admin-users.html @@ -903,11 +915,11 @@ Sektory apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 274 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -923,11 +935,11 @@ Kraje apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 266 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 504 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -939,7 +951,7 @@ Mapowanie Symboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 357 + 379 @@ -955,7 +967,7 @@ Konfiguracja Scrapera apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 382 + 404 @@ -963,7 +975,7 @@ Notatka apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 529 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -995,7 +1007,7 @@ Dodaj Ręcznie apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 19 + 18 @@ -1003,11 +1015,11 @@ Nazwa, symbol lub ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 132 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 29 + 27 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html @@ -1087,7 +1099,7 @@ Dodaj Walutę apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 22 + 20 @@ -1158,6 +1170,14 @@ 200 + + Activities + Activities + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 61 + + Add Platform Dodaj Platformę @@ -1171,11 +1191,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 464 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 516 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1191,7 +1211,7 @@ Czy naprawdę chcesz usunąć tę platformę? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 108 @@ -1202,6 +1222,14 @@ 8 + + Current year + Current year + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + + Add platform Dodaj platformę @@ -1247,7 +1275,7 @@ Czy naprawdę chcesz usunąć ten tag? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 103 + 104 @@ -1271,7 +1299,7 @@ Czy na pewno chcesz usunąć tego użytkownika? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 211 @@ -1307,7 +1335,7 @@ Wciel się w Użytkownika apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -1315,7 +1343,7 @@ Usuń Użytkownika apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -1363,7 +1391,7 @@ Poziom Odniesienia (Benchmark) apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 351 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1398,14 +1426,6 @@ 5 - - Get started - Rozpocznij - - apps/client/src/app/components/header/header.component.html - 432 - - Sign in Zaloguj się @@ -1415,11 +1435,11 @@ apps/client/src/app/components/header/header.component.ts - 279 + 283 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 60 libs/common/src/lib/routes/routes.ts @@ -1435,11 +1455,11 @@ Ups! Nieprawidłowy token bezpieczeństwa. apps/client/src/app/components/header/header.component.ts - 294 + 298 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 153 + 154 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1578,6 +1598,14 @@ 52 + + Current week + Current week + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + + Add activity Dodaj działalność @@ -1643,15 +1671,15 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 451 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1661,6 +1689,10 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html 81 + + apps/client/src/app/pages/pricing/pricing-page.html + 343 + apps/client/src/app/pages/register/register-page.html 31 @@ -1670,20 +1702,12 @@ 30 - - Sign in with Internet Identity - Zaloguj się przy użyciu Tożsamości Internetowej (Internet Identity) - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 - - Sign in with Google Zaloguj się przez Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 37 @@ -1691,7 +1715,7 @@ Pozostań zalogowany apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 48 @@ -1787,7 +1811,7 @@ Wartość Netto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 264 @@ -1795,7 +1819,7 @@ Osiągi w Ujęciu Rocznym apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 274 + 277 @@ -1835,7 +1859,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 190 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2027,39 +2051,55 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 YTD Liczony od początku roku (year-to-date) + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 1Y 1 rok + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 5Y 5 lat + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 Max Maksimum + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 216 + libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -2091,7 +2131,7 @@ Wpisz kod kuponu: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -2099,7 +2139,7 @@ Nie udało się zrealizować kodu kuponu apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -2107,7 +2147,7 @@ Kupon został zrealizowany apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -2115,7 +2155,7 @@ Odśwież apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -2207,7 +2247,7 @@ Ustawienia Regionalne apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 419 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2359,7 +2399,7 @@ Okej apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -2374,8 +2414,8 @@ About O Ghostfolio - apps/client/src/app/app.component.html - 70 + apps/client/src/app/components/footer/footer.component.html + 20 apps/client/src/app/components/header/header.component.html @@ -2398,8 +2438,8 @@ Changelog Changelog - apps/client/src/app/app.component.html - 77 + apps/client/src/app/components/footer/footer.component.html + 27 apps/client/src/app/pages/about/changelog/changelog-page.html @@ -2414,8 +2454,8 @@ License Licencja - apps/client/src/app/app.component.html - 89 + apps/client/src/app/components/footer/footer.component.html + 39 apps/client/src/app/pages/about/license/license-page.html @@ -2430,8 +2470,8 @@ Privacy Policy Polityka Prywatności - apps/client/src/app/app.component.html - 105 + apps/client/src/app/components/footer/footer.component.html + 55 apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html @@ -2505,13 +2545,17 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Oops, cash balance transfer has failed. Ups, transfer salda nie powiódł się. apps/client/src/app/pages/accounts/accounts-page.component.ts - 324 + 339 @@ -2619,7 +2663,7 @@ Przegląd apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 113 apps/client/src/app/components/header/header.component.html @@ -2654,8 +2698,8 @@ Blog Blog - apps/client/src/app/app.component.html - 74 + apps/client/src/app/components/footer/footer.component.html + 24 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html @@ -2774,8 +2818,8 @@ Frequently Asked Questions (FAQ) Często zadawane pytania (FAQ) - apps/client/src/app/app.component.html - 83 + apps/client/src/app/components/footer/footer.component.html + 33 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -2794,8 +2838,8 @@ Features Funkcje - apps/client/src/app/app.component.html - 79 + apps/client/src/app/components/footer/footer.component.html + 29 apps/client/src/app/components/header/header.component.html @@ -2917,14 +2961,34 @@ Get Started Rozpocznij + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Holdings @@ -2949,6 +3013,10 @@ libs/common/src/lib/routes/routes.ts 167 + + libs/ui/src/lib/assistant/assistant.html + 110 + Summary @@ -2966,8 +3034,12 @@ Markets Rynki - apps/client/src/app/app.component.html - 61 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + + + apps/client/src/app/components/footer/footer.component.html + 11 apps/client/src/app/components/header/header.component.html @@ -3054,32 +3126,12 @@ 11 - - Get Started - Rozpocznij - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 447 - - - apps/client/src/app/pages/pricing/pricing-page.html - 351 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - Monthly Active Users Aktywni Użytkownicy w Miesiącu apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -3087,7 +3139,7 @@ Gwiazdki na GitHubie apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -3099,7 +3151,7 @@ Pobrania na Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -3111,7 +3163,7 @@ Dostrzegli Nas apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -3119,7 +3171,7 @@ Chroń swoje zasoby. Udoskonal swoją osobistą strategię inwestycyjną. apps/client/src/app/pages/landing/landing-page.html - 226 + 124 @@ -3127,7 +3179,7 @@ Ghostfolio umożliwia zapracowanym osobom śledzenie akcji, funduszy ETF lub kryptowalut, jednocześnie zachowując prywatność. apps/client/src/app/pages/landing/landing-page.html - 230 + 128 @@ -3135,7 +3187,7 @@ Widok 360° apps/client/src/app/pages/landing/landing-page.html - 240 + 138 @@ -3143,7 +3195,7 @@ Uzyskaj pełny obraz swoich finansów osobistych na wielu różnych platformach. apps/client/src/app/pages/landing/landing-page.html - 243 + 141 @@ -3151,7 +3203,7 @@ Gotowy na Web3 apps/client/src/app/pages/landing/landing-page.html - 251 + 149 @@ -3159,7 +3211,7 @@ Korzystaj z Ghostfolio anonimowo i zachowaj pełną kontrolę nad swoimi danymi finansowymi. apps/client/src/app/pages/landing/landing-page.html - 254 + 152 @@ -3167,7 +3219,7 @@ Czerp korzyści z nieustannych ulepszeń dzięki silnej społeczności. apps/client/src/app/pages/landing/landing-page.html - 264 + 162 @@ -3183,7 +3235,7 @@ Dlaczego Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 272 + 170 @@ -3191,7 +3243,7 @@ Ghostfolio jest dla Ciebie, jeśli... apps/client/src/app/pages/landing/landing-page.html - 274 + 172 @@ -3199,7 +3251,7 @@ handlujesz akcjami, funduszami ETF lub kryptowalutami na wielu platformach apps/client/src/app/pages/landing/landing-page.html - 280 + 178 @@ -3207,7 +3259,7 @@ realizujesz strategię buy & hold apps/client/src/app/pages/landing/landing-page.html - 286 + 184 @@ -3215,7 +3267,7 @@ chcesz uzyskać wgląd w strukturę swojego portfolio apps/client/src/app/pages/landing/landing-page.html - 291 + 189 @@ -3223,7 +3275,7 @@ cenisz sobie prywatność i własność swoich danych apps/client/src/app/pages/landing/landing-page.html - 296 + 194 @@ -3231,7 +3283,7 @@ lubisz minimalizm apps/client/src/app/pages/landing/landing-page.html - 299 + 197 @@ -3239,7 +3291,7 @@ zależy Ci na dywersyfikacji swoich zasobów finansowych apps/client/src/app/pages/landing/landing-page.html - 303 + 201 @@ -3247,7 +3299,7 @@ jesteś zainteresowany niezależnością finansową apps/client/src/app/pages/landing/landing-page.html - 307 + 205 @@ -3255,7 +3307,7 @@ mówisz „nie” arkuszom kalkulacyjnym w roku apps/client/src/app/pages/landing/landing-page.html - 311 + 209 @@ -3263,7 +3315,7 @@ nadal czytasz tę listę apps/client/src/app/pages/landing/landing-page.html - 314 + 212 @@ -3271,7 +3323,7 @@ Dowiedz się więcej o Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 319 + 217 @@ -3279,7 +3331,7 @@ Co mówią nasi użytkownicy apps/client/src/app/pages/landing/landing-page.html - 328 + 226 @@ -3287,7 +3339,7 @@ Użytkownicy z całego świata korzystają z Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 367 + 265 @@ -3295,7 +3347,7 @@ Jak działa Ghostfolio ? apps/client/src/app/pages/landing/landing-page.html - 384 + 282 @@ -3303,7 +3355,7 @@ Rozpocznij w zaledwie 3 krokach apps/client/src/app/pages/landing/landing-page.html - 386 + 284 @@ -3319,7 +3371,7 @@ Zarejestruj się anonimowo* apps/client/src/app/pages/landing/landing-page.html - 392 + 290 @@ -3327,7 +3379,7 @@ * nie jest wymagany ani adres e-mail, ani karta kredytowa apps/client/src/app/pages/landing/landing-page.html - 394 + 292 @@ -3335,7 +3387,7 @@ Dodaj dowolne z Twoich historycznych transakcji apps/client/src/app/pages/landing/landing-page.html - 406 + 304 @@ -3343,7 +3395,7 @@ Zyskaj cenny wgląd w strukturę swojego portfolio apps/client/src/app/pages/landing/landing-page.html - 418 + 316 @@ -3351,7 +3403,7 @@ Czy jesteś gotów? apps/client/src/app/pages/landing/landing-page.html - 432 + 330 @@ -3378,6 +3430,14 @@ 62 + + with your university e-mail address + with your university e-mail address + + apps/client/src/app/pages/pricing/pricing-page.html + 365 + + Active Users Aktywni Użytkownicy @@ -3471,7 +3531,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 221 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -3507,7 +3567,7 @@ Czy na pewno chcesz usunąć te aktywności? libs/ui/src/lib/activities-table/activities-table.component.ts - 270 + 276 @@ -3587,7 +3647,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 214 + 215 @@ -3603,7 +3663,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 375 + 380 @@ -3619,7 +3679,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 387 + 392 @@ -3678,8 +3738,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3918,6 +3978,14 @@ 138 + + Looking for a student discount? + Looking for a student discount? + + apps/client/src/app/pages/pricing/pricing-page.html + 359 + + Dividend Dywidenda @@ -3931,7 +3999,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 310 apps/client/src/app/pages/features/features-page.html @@ -4046,20 +4114,12 @@ 7 - - Holdings - Inwestycje - - libs/ui/src/lib/assistant/assistant.html - 110 - - Pricing Cennik - apps/client/src/app/app.component.html - 99 + apps/client/src/app/components/footer/footer.component.html + 49 apps/client/src/app/components/header/header.component.html @@ -4275,7 +4335,7 @@ Jest bezpłatny. apps/client/src/app/pages/pricing/pricing-page.html - 353 + 379 @@ -4317,17 +4377,9 @@ apps/client/src/app/components/admin-users/admin-users.html 81 - - libs/common/src/lib/routes/routes.ts - 281 - - - - Continue with Internet Identity - Kontynuuj z tożsamością internetową - - apps/client/src/app/pages/register/register-page.html - 42 + + libs/common/src/lib/routes/routes.ts + 281 @@ -4335,7 +4387,7 @@ Zaloguj z Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -4579,6 +4631,14 @@ 210 + + User ID + User ID + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + + Free Plan Plan Darmowy @@ -4647,8 +4707,8 @@ Resources Zasoby - apps/client/src/app/app.component.html - 64 + apps/client/src/app/components/footer/footer.component.html + 14 apps/client/src/app/components/header/header.component.html @@ -4679,6 +4739,14 @@ 37 + + Request it + Request it + + apps/client/src/app/pages/pricing/pricing-page.html + 361 + + Access Dostęp @@ -4732,7 +4800,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 400 + 405 @@ -4744,7 +4812,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 413 + 418 @@ -4752,7 +4820,7 @@ Przygotuj Wstępną Wersję libs/ui/src/lib/activities-table/activities-table.component.html - 144 + 142 @@ -4760,7 +4828,7 @@ Sklonuj libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 457 @@ -4768,7 +4836,7 @@ Eksportuj Wersję Roboczą jako ICS libs/ui/src/lib/activities-table/activities-table.component.html - 450 + 467 @@ -4776,7 +4844,7 @@ Czy na pewno chcesz usunąć tę działalność? libs/ui/src/lib/activities-table/activities-table.component.ts - 280 + 286 @@ -4786,6 +4854,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + , @@ -4811,6 +4883,14 @@ 117 + + contact us + contact us + + apps/client/src/app/pages/pricing/pricing-page.html + 353 + + from ATH od ATH @@ -4856,7 +4936,7 @@ Przewidywana Łączna Kwota libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 60 + 59 @@ -4868,7 +4948,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 295 + 298 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -4924,14 +5004,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 312 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -4948,15 +5028,15 @@ Rodzaj Aktywów apps/client/src/app/components/admin-market-data/admin-market-data.html - 115 + 114 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 230 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 303 + 321 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4966,29 +5046,29 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Asset Sub Class Podklasa Aktywów apps/client/src/app/components/admin-market-data/admin-market-data.html - 124 + 123 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 221 + 239 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 337 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5116,7 +5196,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -5152,15 +5232,15 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 75 + 74 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 150 + 168 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 39 + 37 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5174,14 +5254,14 @@ Tag Tag - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Year @@ -5191,6 +5271,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Years Lata @@ -5220,7 +5308,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 238 + 239 libs/ui/src/lib/i18n.ts @@ -5476,11 +5564,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5544,7 +5632,7 @@ Obecna cena rynkowa wynosi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 639 + 672 @@ -5552,7 +5640,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 504 @@ -5560,7 +5648,7 @@ Zakres Dat libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5651,6 +5739,22 @@ 88 + + here + here + + apps/client/src/app/pages/pricing/pricing-page.html + 364 + + + + Close Holding + Close Holding + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 442 + + Absolute Asset Performance Łączny wynik aktywów @@ -5704,15 +5808,19 @@ Dotychczasowy tydzień libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 WTD WTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5720,15 +5828,19 @@ Od początku miesiąca libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 MTD MTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5736,7 +5848,7 @@ Od początku roku libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5759,17 +5871,21 @@ 8 - + Reset Filters Resetuj Filtry libs/ui/src/lib/assistant/assistant.html - 266 + 204 year rok + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 290 @@ -5780,23 +5896,27 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 years lata + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 - + Apply Filters Zastosuj Filtry libs/ui/src/lib/assistant/assistant.html - 276 + 217 @@ -5804,7 +5924,7 @@ Gromadzenie Danych apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6021,7 +6141,15 @@ Dołącz teraz lub sprawdź przykładowe konto apps/client/src/app/pages/landing/landing-page.html - 435 + 333 + + + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 @@ -6053,7 +6181,7 @@ Usuń Profile apps/client/src/app/components/admin-market-data/admin-market-data.html - 243 + 242 @@ -6124,8 +6252,8 @@ Community Społeczność - apps/client/src/app/app.component.html - 130 + apps/client/src/app/components/footer/footer.component.html + 80 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -6197,7 +6325,7 @@ Otwarty Kod Źródłowy apps/client/src/app/pages/landing/landing-page.html - 261 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6208,8 +6336,8 @@ Personal Finance Finanse Osobiste - apps/client/src/app/app.component.html - 57 + apps/client/src/app/components/footer/footer.component.html + 7 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6296,6 +6424,14 @@ 83 + + View Holding + View Holding + + libs/ui/src/lib/activities-table/activities-table.component.html + 444 + + Canada Kanada @@ -6413,7 +6549,7 @@ Błąd apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 630 + 663 @@ -6453,7 +6589,7 @@ Nieaktywny apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html - 87 + 88 @@ -6461,15 +6597,15 @@ Anuluj apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 143 + 161 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 580 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 59 + 57 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6517,11 +6653,11 @@ Zamknij apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 582 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 61 + 59 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6556,6 +6692,14 @@ 11 + + Role + Role + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 31 + + Yes Tak @@ -6568,8 +6712,8 @@ Accounts Accounts - libs/ui/src/lib/assistant/assistant.html - 84 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 51 @@ -6596,6 +6740,14 @@ 63 + + If you plan to open an account at + If you plan to open an account at + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + + Performance with currency effect Performance Wydajność z efektem walutowym Wydajność @@ -6665,7 +6817,7 @@ Ups! Błędna waluta. apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 50 + 48 @@ -6700,6 +6852,14 @@ 163 + + to use our referral link and get a Ghostfolio Premium membership for one year + to use our referral link and get a Ghostfolio Premium membership for one year + + apps/client/src/app/pages/pricing/pricing-page.html + 357 + + can be self-hosted może być hostowany samodzielnie @@ -6844,6 +7004,14 @@ 293 + + Engagement per Day + Engagement per Day + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 76 + + Guides Poradniki @@ -6955,7 +7123,7 @@ Nie udało się wygenerować klucza API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -6963,7 +7131,7 @@ Ustaw ten klucz API w samodzielnie hostowanym środowisku: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -6971,7 +7139,7 @@ Klucz API dostawcy danych Premium Ghostfolio apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -6979,7 +7147,15 @@ Czy na pewno chcesz wygenerować nowy klucz API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 + + + + Country + Country + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 37 @@ -7019,11 +7195,11 @@ Zapisz apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 591 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 70 + 68 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -7071,7 +7247,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 251 + 260 @@ -7119,7 +7295,7 @@ Leniwy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7127,7 +7303,15 @@ Natychmiastowy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 + + + + API Requests Today + API Requests Today + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 86 @@ -7135,7 +7319,7 @@ Domyślna cena rynkowa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 391 + 413 @@ -7143,7 +7327,7 @@ Tryb apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 432 + 454 @@ -7151,7 +7335,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 470 @@ -7159,7 +7343,7 @@ Nagłówki żądań HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 404 + 426 @@ -7167,7 +7351,7 @@ koniec dnia apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7175,7 +7359,7 @@ w czasie rzeczywistym apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 @@ -7203,7 +7387,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7223,11 +7407,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7323,11 +7507,11 @@ Token bezpieczeństwa apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 169 + 170 @@ -7335,7 +7519,7 @@ Czy napewno chcesz wygenerować nowy token bezpieczeństwa dla tego użytkownika? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 237 @@ -7343,7 +7527,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7351,7 +7535,7 @@ Generowanie Tokena Zabezpieczającego apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -7387,8 +7571,8 @@ Terms of Service Warunki świadczenia usług - apps/client/src/app/app.component.html - 112 + apps/client/src/app/components/footer/footer.component.html + 62 libs/common/src/lib/routes/routes.ts @@ -7408,7 +7592,7 @@ () jest już w użyciu. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 566 + 599 @@ -7416,7 +7600,7 @@ Wystąpił błąd podczas aktualizacji do (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 574 + 607 @@ -7424,7 +7608,7 @@ Zatwierdź apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 153 @@ -7440,7 +7624,7 @@ Zbierz najnowsze historyczne dane rynkowe apps/client/src/app/components/admin-market-data/admin-market-data.html - 226 + 225 @@ -7448,7 +7632,7 @@ Zbierz wszystkie historyczne dane rynkowe apps/client/src/app/components/admin-market-data/admin-market-data.html - 231 + 230 @@ -7456,7 +7640,7 @@ Zbierz historyczne dane rynkowe apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 33 + 34 @@ -7612,15 +7796,7 @@ 158 - - Name - Nazwa - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Szybkie linki @@ -7628,24 +7804,16 @@ 58 - - Asset Profiles - Profile zasobów - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Demonstracja na żywo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 452 + 349 libs/common/src/lib/routes/routes.ts @@ -7770,6 +7938,14 @@ 5 + + Current month + Current month + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + + new nowy @@ -7936,7 +8112,7 @@ Czy na pewno chcesz wygenerować nowy token bezpieczeństwa? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 174 + 175 @@ -7992,7 +8168,7 @@ Zarządzaj profilem aktywów apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 466 @@ -8016,7 +8192,7 @@ Średnia cena jednostkowa apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 110 + 113 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -8407,6 +8583,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 23 + + Follow Ghostfolio on LinkedIn Follow Ghostfolio on LinkedIn diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 8d3d2593a..dc8804544 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -5,8 +5,8 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. O risco de perda em investimentos pode ser substancial. Não é aconselhável investir dinheiro que possa vir a precisar a curto prazo. - apps/client/src/app/app.component.html - 221 + apps/client/src/app/components/footer/footer.component.html + 171 @@ -29,6 +29,14 @@ 11 + + please + please + + apps/client/src/app/pages/pricing/pricing-page.html + 350 + + Type Tipo @@ -46,7 +54,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 160 + 161 @@ -102,11 +110,11 @@ Nome apps/client/src/app/components/admin-market-data/admin-market-data.html - 89 + 88 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 286 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -142,7 +150,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 137 + 135 + + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -170,15 +182,15 @@ Moeda apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 201 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 293 + 311 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 47 + 45 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -194,7 +206,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 280 + 281 @@ -246,11 +258,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 297 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -274,7 +286,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 268 + 267 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -290,7 +302,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 451 @@ -298,11 +310,11 @@ Eliminar apps/client/src/app/components/admin-market-data/admin-market-data.html - 290 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 68 + 86 apps/client/src/app/components/admin-overview/admin-overview.html @@ -326,7 +338,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 461 + 478 libs/ui/src/lib/benchmark/benchmark.component.html @@ -350,11 +362,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 106 + 105 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 179 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -424,6 +436,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Historical Market Data @@ -434,7 +450,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 567 @@ -482,7 +498,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 169 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -494,7 +510,7 @@ Preço de Mercado apps/client/src/app/components/admin-market-data/admin-market-data.html - 133 + 132 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -518,11 +534,11 @@ Primeira Atividade apps/client/src/app/components/admin-market-data/admin-market-data.html - 148 + 147 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 194 + 212 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -546,7 +562,7 @@ Dados Históricos apps/client/src/app/components/admin-market-data/admin-market-data.html - 166 + 165 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -558,7 +574,7 @@ Contagem de Países apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 183 @@ -566,7 +582,7 @@ Contagem de Setores apps/client/src/app/components/admin-market-data/admin-market-data.html - 175 + 174 @@ -574,11 +590,11 @@ Recolher Dados de Perfíl apps/client/src/app/components/admin-market-data/admin-market-data.html - 235 + 234 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 48 + 66 @@ -626,7 +642,7 @@ Adicionar Moeda apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 22 + 20 @@ -689,12 +705,20 @@ 200 + + Activities + Activities + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 61 + + Do you really want to delete this user? Deseja realmente excluir este utilizador? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 211 @@ -762,7 +786,7 @@ Referência apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 351 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -789,14 +813,6 @@ 5 - - Get started - Começar - - apps/client/src/app/components/header/header.component.html - 432 - - Sign in Iniciar sessão @@ -806,11 +822,11 @@ apps/client/src/app/components/header/header.component.ts - 279 + 283 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 60 libs/common/src/lib/routes/routes.ts @@ -826,11 +842,11 @@ Oops! Token de Segurança Incorreto. apps/client/src/app/components/header/header.component.ts - 294 + 298 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 153 + 154 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -950,15 +966,15 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 451 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -968,6 +984,10 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html 81 + + apps/client/src/app/pages/pricing/pricing-page.html + 343 + apps/client/src/app/pages/register/register-page.html 31 @@ -977,20 +997,12 @@ 30 - - Sign in with Internet Identity - Iniciar sessão com Internet Identity - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 - - Sign in with Google Iniciar sessão com Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 37 @@ -998,7 +1010,7 @@ Manter sessão iniciada apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 48 @@ -1062,7 +1074,7 @@ Valor Líquido apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 264 @@ -1070,7 +1082,7 @@ Desempenho Anual apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 274 + 277 @@ -1110,7 +1122,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 190 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1122,7 +1134,7 @@ Setor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 239 + 257 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1134,7 +1146,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 250 + 268 apps/client/src/app/components/admin-users/admin-users.html @@ -1150,11 +1162,11 @@ Setores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 274 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1170,11 +1182,11 @@ Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 266 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 504 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1242,39 +1254,55 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 YTD AATD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 1Y 1A + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 5Y 5A + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 Max Máx + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 216 + libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -1318,7 +1346,7 @@ OK apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -1333,8 +1361,8 @@ About Sobre - apps/client/src/app/app.component.html - 70 + apps/client/src/app/components/footer/footer.component.html + 20 apps/client/src/app/components/header/header.component.html @@ -1357,8 +1385,8 @@ Privacy Policy Política de Privacidade - apps/client/src/app/app.component.html - 105 + apps/client/src/app/components/footer/footer.component.html + 55 apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html @@ -1398,7 +1426,7 @@ Por favor, insira o seu código de cupão: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -1406,7 +1434,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 - 179 + 182 @@ -1414,7 +1442,7 @@ Código de cupão foi resgatado apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -1422,7 +1450,7 @@ Atualizar apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -1502,7 +1530,7 @@ Localidade apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 419 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1636,6 +1664,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Update account @@ -1681,8 +1713,8 @@ Blog Blog - apps/client/src/app/app.component.html - 74 + apps/client/src/app/components/footer/footer.component.html + 24 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html @@ -1793,8 +1825,8 @@ Frequently Asked Questions (FAQ) FAQ - apps/client/src/app/app.component.html - 83 + apps/client/src/app/components/footer/footer.component.html + 33 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1813,8 +1845,8 @@ Features Funcionalidades - apps/client/src/app/app.component.html - 79 + apps/client/src/app/components/footer/footer.component.html + 29 apps/client/src/app/components/header/header.component.html @@ -1834,7 +1866,7 @@ Visão geral apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 113 apps/client/src/app/components/header/header.component.html @@ -1869,8 +1901,12 @@ Markets Mercados - apps/client/src/app/app.component.html - 61 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + + + apps/client/src/app/components/footer/footer.component.html + 11 apps/client/src/app/components/header/header.component.html @@ -1922,7 +1958,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 221 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -1961,6 +1997,14 @@ 10 + + Current week + Current week + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + + Add activity Adicionar atividade @@ -1990,11 +2034,11 @@ Nome, símbolo or ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 132 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 29 + 27 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html @@ -2014,7 +2058,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 214 + 215 @@ -2022,7 +2066,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 529 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2316,10 +2360,6 @@ libs/common/src/lib/routes/routes.ts 167 - - - Holdings - Posições libs/ui/src/lib/assistant/assistant.html 110 @@ -2329,8 +2369,8 @@ Pricing Preços - apps/client/src/app/app.component.html - 99 + apps/client/src/app/components/footer/footer.component.html + 49 apps/client/src/app/components/header/header.component.html @@ -2392,14 +2432,34 @@ Get Started Começar + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Registration @@ -2433,20 +2493,12 @@ 101 - - Continue with Internet Identity - Continuar com Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Continuar com Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -2461,8 +2513,8 @@ Resources Recursos - apps/client/src/app/app.component.html - 64 + apps/client/src/app/components/footer/footer.component.html + 14 apps/client/src/app/components/header/header.component.html @@ -2510,7 +2562,7 @@ Rascunho libs/ui/src/lib/activities-table/activities-table.component.html - 144 + 142 @@ -2526,7 +2578,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 375 + 380 @@ -2538,7 +2590,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 400 + 405 @@ -2550,7 +2602,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 413 + 418 @@ -2558,7 +2610,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 457 @@ -2566,7 +2618,7 @@ Exportar Rascunho como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 450 + 467 @@ -2574,7 +2626,7 @@ Deseja realmente eliminar esta atividade? libs/ui/src/lib/activities-table/activities-table.component.ts - 280 + 286 @@ -2585,6 +2637,14 @@ 117 + + contact us + contact us + + apps/client/src/app/pages/pricing/pricing-page.html + 353 + + from ATH a partir do ATH (All Time High) @@ -2606,7 +2666,7 @@ Montante Total Projetado libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 60 + 59 @@ -2618,7 +2678,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 295 + 298 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2646,14 +2706,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 312 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -2662,15 +2722,15 @@ Classe de Ativo apps/client/src/app/components/admin-market-data/admin-market-data.html - 115 + 114 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 230 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 303 + 321 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2680,14 +2740,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Emergency Fund @@ -2714,7 +2774,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -2726,15 +2786,15 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 75 + 74 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 150 + 168 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 39 + 37 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2748,14 +2808,14 @@ Tag Marcador - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Cash @@ -2942,11 +3002,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -2958,7 +3018,7 @@ Nº de Atividades apps/client/src/app/components/admin-market-data/admin-market-data.html - 157 + 156 @@ -2974,7 +3034,7 @@ Mapeamento de Símbolo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 357 + 379 @@ -3033,6 +3093,14 @@ 71 + + Looking for a student discount? + Looking for a student discount? + + apps/client/src/app/pages/pricing/pricing-page.html + 359 + + Dividend Dividendos @@ -3046,7 +3114,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 310 apps/client/src/app/pages/features/features-page.html @@ -3078,15 +3146,15 @@ Subclasse de Ativos apps/client/src/app/components/admin-market-data/admin-market-data.html - 124 + 123 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 221 + 239 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 337 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3109,8 +3177,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3142,7 +3210,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 387 + 392 @@ -3461,32 +3529,12 @@ 303 - - Get Started - Começar - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 447 - - - apps/client/src/app/pages/pricing/pricing-page.html - 351 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - It’s free. É gratuito. apps/client/src/app/pages/pricing/pricing-page.html - 353 + 379 @@ -3650,7 +3698,7 @@ Personificar Utilizador apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -3658,7 +3706,7 @@ Apagar Utilizador apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -3666,7 +3714,7 @@ Deseja mesmo eliminar estas atividades? libs/ui/src/lib/activities-table/activities-table.component.ts - 270 + 276 @@ -3685,6 +3733,14 @@ 8 + + Current year + Current year + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + + Add platform Adicionar plataforma @@ -3698,11 +3754,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 464 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 516 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3718,7 +3774,7 @@ Deseja mesmo eliminar esta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 108 @@ -3897,6 +3953,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Liabilities Responsabilidades @@ -3913,8 +3977,8 @@ Changelog Registo de alterações - apps/client/src/app/app.component.html - 77 + apps/client/src/app/components/footer/footer.component.html + 27 apps/client/src/app/pages/about/changelog/changelog-page.html @@ -3929,8 +3993,8 @@ License Licença - apps/client/src/app/app.component.html - 89 + apps/client/src/app/components/footer/footer.component.html + 39 apps/client/src/app/pages/about/license/license-page.html @@ -4058,7 +4122,7 @@ Configuração do raspador apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 382 + 404 @@ -4217,6 +4281,14 @@ 210 + + User ID + User ID + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + + Free Plan Plano gratuito @@ -4490,7 +4562,7 @@ Estrelas no GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -4502,7 +4574,7 @@ Não puxa Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -4622,7 +4694,7 @@ Usuários ativos mensais apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -4630,7 +4702,7 @@ Como visto em apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -4638,7 +4710,7 @@ Proteja o seu assets. Refine your personal investment strategy. apps/client/src/app/pages/landing/landing-page.html - 226 + 124 @@ -4646,7 +4718,7 @@ O Ghostfolio permite que pessoas ocupadas acompanhem ações, ETFs ou criptomoedas sem serem rastreadas. apps/client/src/app/pages/landing/landing-page.html - 230 + 128 @@ -4654,7 +4726,7 @@ 360° visualizar apps/client/src/app/pages/landing/landing-page.html - 240 + 138 @@ -4662,7 +4734,7 @@ Web3 Preparar apps/client/src/app/pages/landing/landing-page.html - 251 + 149 @@ -4670,7 +4742,7 @@ Use o Ghostfolio anonimamente e possua seus dados financeiros. apps/client/src/app/pages/landing/landing-page.html - 254 + 152 @@ -4678,7 +4750,7 @@ Beneficie-se de melhorias contínuas através de uma comunidade forte. apps/client/src/app/pages/landing/landing-page.html - 264 + 162 @@ -4694,7 +4766,7 @@ Por que Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 272 + 170 @@ -4702,7 +4774,7 @@ Ghostfolio é para você se você for... apps/client/src/app/pages/landing/landing-page.html - 274 + 172 @@ -4710,7 +4782,7 @@ negociar ações, ETFs ou criptomoedas em múltiplas plataformas apps/client/src/app/pages/landing/landing-page.html - 280 + 178 @@ -4718,7 +4790,7 @@ buscando uma compra & estratégia de retenção apps/client/src/app/pages/landing/landing-page.html - 286 + 184 @@ -4726,7 +4798,7 @@ interessado em obter insights sobre a composição do seu portfólio apps/client/src/app/pages/landing/landing-page.html - 291 + 189 @@ -4734,7 +4806,7 @@ valorizando a privacidade e a propriedade dos dados apps/client/src/app/pages/landing/landing-page.html - 296 + 194 @@ -4742,7 +4814,7 @@ no minimalismo apps/client/src/app/pages/landing/landing-page.html - 299 + 197 @@ -4750,7 +4822,7 @@ preocupando-se em diversificar seus recursos financeiros apps/client/src/app/pages/landing/landing-page.html - 303 + 201 @@ -4758,7 +4830,7 @@ interessado em independência financeira apps/client/src/app/pages/landing/landing-page.html - 307 + 205 @@ -4766,7 +4838,7 @@ dizendo não às planilhas em apps/client/src/app/pages/landing/landing-page.html - 311 + 209 @@ -4774,7 +4846,7 @@ ainda lendo esta lista apps/client/src/app/pages/landing/landing-page.html - 314 + 212 @@ -4782,7 +4854,7 @@ Saiba mais sobre o Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 319 + 217 @@ -4790,7 +4862,7 @@ Qual é o nosso users are saying apps/client/src/app/pages/landing/landing-page.html - 328 + 226 @@ -4798,7 +4870,7 @@ Membros de todo o mundo estão usando Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 367 + 265 @@ -4806,7 +4878,7 @@ Como é que Ghostfolio work? apps/client/src/app/pages/landing/landing-page.html - 384 + 282 @@ -4814,7 +4886,7 @@ Inscreva-se anonimamente* apps/client/src/app/pages/landing/landing-page.html - 392 + 290 @@ -4822,7 +4894,7 @@ * no e-mail address nor credit card required apps/client/src/app/pages/landing/landing-page.html - 394 + 292 @@ -4830,7 +4902,7 @@ Adicione qualquer uma de suas transações históricas apps/client/src/app/pages/landing/landing-page.html - 406 + 304 @@ -4838,7 +4910,7 @@ Obtenha insights valiosos sobre a composição do seu portfólio apps/client/src/app/pages/landing/landing-page.html - 418 + 316 @@ -4846,7 +4918,7 @@ São you preparar? apps/client/src/app/pages/landing/landing-page.html - 432 + 330 @@ -4854,7 +4926,7 @@ Tenha uma visão completa das suas finanças pessoais em diversas plataformas. apps/client/src/app/pages/landing/landing-page.html - 243 + 141 @@ -4862,7 +4934,7 @@ Comece em apenas 3 passos apps/client/src/app/pages/landing/landing-page.html - 386 + 284 @@ -5163,6 +5235,14 @@ 62 + + with your university e-mail address + with your university e-mail address + + apps/client/src/app/pages/pricing/pricing-page.html + 365 + + (Last 30 days) (Últimos 30 dias) @@ -5232,7 +5312,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 238 + 239 libs/ui/src/lib/i18n.ts @@ -5260,7 +5340,7 @@ Você realmente deseja excluir esta tag? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 103 + 104 @@ -5335,6 +5415,14 @@ 37 + + Request it + Request it + + apps/client/src/app/pages/pricing/pricing-page.html + 361 + + Access Acesso @@ -5372,7 +5460,7 @@ Adicionar manualmente apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 19 + 18 @@ -5444,7 +5532,7 @@ Ops, a transferência do saldo em dinheiro falhou. apps/client/src/app/pages/accounts/accounts-page.component.ts - 324 + 339 @@ -5544,7 +5632,7 @@ O preço de mercado atual é apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 639 + 672 @@ -5552,7 +5640,7 @@ Teste apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 504 @@ -5560,7 +5648,7 @@ Período libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5651,6 +5739,22 @@ 88 + + here + here + + apps/client/src/app/pages/pricing/pricing-page.html + 364 + + + + Close Holding + Close Holding + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 442 + + Absolute Asset Performance Desempenho absoluto de ativos @@ -5704,15 +5808,19 @@ Semana até agora libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 WTD WTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5720,15 +5828,19 @@ Do mês até a data libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 MTD MTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5736,7 +5848,7 @@ No acumulado do ano libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5759,17 +5871,21 @@ 8 - + Reset Filters Redefinir filtros libs/ui/src/lib/assistant/assistant.html - 266 + 204 year ano + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 290 @@ -5780,23 +5896,27 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 years anos + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 - + Apply Filters Aplicar filtros libs/ui/src/lib/assistant/assistant.html - 276 + 217 @@ -5804,7 +5924,7 @@ Coleta de dados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6021,7 +6141,15 @@ Cadastre-se agora ou confira a conta de exemplo apps/client/src/app/pages/landing/landing-page.html - 435 + 333 + + + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 @@ -6053,7 +6181,7 @@ Excluir perfis apps/client/src/app/components/admin-market-data/admin-market-data.html - 243 + 242 @@ -6124,8 +6252,8 @@ Community Comunidade - apps/client/src/app/app.component.html - 130 + apps/client/src/app/components/footer/footer.component.html + 80 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -6197,7 +6325,7 @@ Código aberto apps/client/src/app/pages/landing/landing-page.html - 261 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6208,8 +6336,8 @@ Personal Finance Finanças Pessoais - apps/client/src/app/app.component.html - 57 + apps/client/src/app/components/footer/footer.component.html + 7 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6296,6 +6424,14 @@ 83 + + View Holding + View Holding + + libs/ui/src/lib/activities-table/activities-table.component.html + 444 + + Canada Canadá @@ -6413,7 +6549,7 @@ Erro apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 630 + 663 @@ -6453,7 +6589,7 @@ Inativo apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html - 87 + 88 @@ -6461,15 +6597,15 @@ Cancelar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 143 + 161 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 580 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 59 + 57 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6517,11 +6653,11 @@ Fechar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 582 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 61 + 59 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6556,6 +6692,14 @@ 11 + + Role + Role + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 31 + + Yes Sim @@ -6568,8 +6712,8 @@ Accounts Accounts - libs/ui/src/lib/assistant/assistant.html - 84 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 51 @@ -6596,6 +6740,14 @@ 63 + + If you plan to open an account at + If you plan to open an account at + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + + Performance with currency effect Performance Performance with currency effect Performance @@ -6665,7 +6817,7 @@ Ops! Moeda inválida. apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 50 + 48 @@ -6700,6 +6852,14 @@ 163 + + to use our referral link and get a Ghostfolio Premium membership for one year + to use our referral link and get a Ghostfolio Premium membership for one year + + apps/client/src/app/pages/pricing/pricing-page.html + 357 + + can be self-hosted pode ser auto-hospedado @@ -6844,6 +7004,14 @@ 293 + + Engagement per Day + Engagement per Day + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 76 + + Guides Guias @@ -6955,7 +7123,7 @@ Não foi possível gerar uma chave de API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -6963,7 +7131,7 @@ Defina esta chave de API no seu ambiente auto-hospedado: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -6971,7 +7139,7 @@ Chave de API do Provedor de Dados do Ghostfolio Premium apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -6979,7 +7147,15 @@ Você realmente deseja gerar uma nova chave de API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 + + + + Country + Country + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 37 @@ -7019,11 +7195,11 @@ Guardar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 591 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 70 + 68 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -7071,7 +7247,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 251 + 260 @@ -7119,7 +7295,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7127,7 +7303,15 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 + + + + API Requests Today + API Requests Today + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 86 @@ -7135,7 +7319,7 @@ Preço de mercado padrão apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 391 + 413 @@ -7143,7 +7327,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 432 + 454 @@ -7151,7 +7335,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 470 @@ -7159,7 +7343,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 404 + 426 @@ -7167,7 +7351,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7175,7 +7359,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 @@ -7203,7 +7387,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7223,11 +7407,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7323,11 +7507,11 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 169 + 170 @@ -7335,7 +7519,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 237 @@ -7343,7 +7527,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7351,7 +7535,7 @@ Generate Security Token apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -7387,8 +7571,8 @@ Terms of Service Termos de Serviço - apps/client/src/app/app.component.html - 112 + apps/client/src/app/components/footer/footer.component.html + 62 libs/common/src/lib/routes/routes.ts @@ -7408,7 +7592,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 566 + 599 @@ -7416,7 +7600,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 574 + 607 @@ -7424,7 +7608,7 @@ Apply apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 153 @@ -7440,7 +7624,7 @@ Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 226 + 225 @@ -7448,7 +7632,7 @@ Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 231 + 230 @@ -7456,7 +7640,7 @@ Gather Historical Market Data apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 33 + 34 @@ -7612,15 +7796,7 @@ 158 - - Name - Nome - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Links rápidos @@ -7628,24 +7804,16 @@ 58 - - Asset Profiles - Perfis de ativos - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Live Demo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 452 + 349 libs/common/src/lib/routes/routes.ts @@ -7770,6 +7938,14 @@ 5 + + Current month + Current month + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + + new new @@ -7936,7 +8112,7 @@ Do you really want to generate a new security token? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 174 + 175 @@ -7992,7 +8168,7 @@ Gerenciar perfil de ativos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 466 @@ -8016,7 +8192,7 @@ Preço médio unitário apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 110 + 113 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -8407,6 +8583,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 23 + + Follow Ghostfolio on LinkedIn Siga o Ghostfolio no LinkedIn diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 5e47e4017..235f670a3 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -186,8 +186,8 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. Alım satımda kayıp riski büyük boyutta olabilir. Kısa vadede ihtiyaç duyabileceğiniz parayla yatırım yapmak tavsiye edilmez. - apps/client/src/app/app.component.html - 221 + apps/client/src/app/components/footer/footer.component.html + 171 @@ -210,6 +210,14 @@ 11 + + please + please + + apps/client/src/app/pages/pricing/pricing-page.html + 350 + + Type Tip @@ -227,7 +235,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 160 + 161 @@ -299,11 +307,11 @@ Ad apps/client/src/app/components/admin-market-data/admin-market-data.html - 89 + 88 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 286 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -339,7 +347,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 137 + 135 + + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -367,15 +379,15 @@ Para Birimi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 201 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 293 + 311 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 47 + 45 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -391,7 +403,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 280 + 281 @@ -427,11 +439,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 297 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -455,7 +467,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 268 + 267 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -471,7 +483,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 451 @@ -479,11 +491,11 @@ Sil apps/client/src/app/components/admin-market-data/admin-market-data.html - 290 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 68 + 86 apps/client/src/app/components/admin-overview/admin-overview.html @@ -507,7 +519,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 461 + 478 libs/ui/src/lib/benchmark/benchmark.component.html @@ -531,11 +543,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 106 + 105 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 179 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -605,6 +617,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Historical Market Data @@ -615,7 +631,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 567 @@ -663,7 +679,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 169 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -675,7 +691,7 @@ Piyasa Fiyatı apps/client/src/app/components/admin-market-data/admin-market-data.html - 133 + 132 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -727,11 +743,11 @@ İlk İşlem apps/client/src/app/components/admin-market-data/admin-market-data.html - 148 + 147 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 194 + 212 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -747,7 +763,7 @@ İşlem Sayısı apps/client/src/app/components/admin-market-data/admin-market-data.html - 157 + 156 @@ -755,7 +771,7 @@ Tarihsel Veri apps/client/src/app/components/admin-market-data/admin-market-data.html - 166 + 165 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -767,7 +783,7 @@ Sektör Sayısı apps/client/src/app/components/admin-market-data/admin-market-data.html - 175 + 174 @@ -775,7 +791,7 @@ Ülke Sayısı apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 183 @@ -783,11 +799,11 @@ Profil Verisini Getir apps/client/src/app/components/admin-market-data/admin-market-data.html - 235 + 234 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 48 + 66 @@ -803,7 +819,7 @@ Sektör apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 239 + 257 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -815,7 +831,7 @@ Ülke apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 250 + 268 apps/client/src/app/components/admin-users/admin-users.html @@ -831,11 +847,11 @@ Sektörler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 274 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -851,11 +867,11 @@ Ülkeler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 266 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 504 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -867,7 +883,7 @@ Sembol Eşleştirme apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 357 + 379 @@ -883,7 +899,7 @@ Veri Toplayıcı Yapılandırması apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 382 + 404 @@ -891,7 +907,7 @@ Not apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 529 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -915,11 +931,11 @@ Ad, sembol ya da ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 132 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 29 + 27 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html @@ -983,7 +999,7 @@ Para Birimi Ekle apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 22 + 20 @@ -1070,6 +1086,14 @@ 200 + + Activities + Activities + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 61 + + Add Platform Platform Ekle @@ -1083,11 +1107,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 464 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 516 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1103,7 +1127,7 @@ Bu platformu silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 108 @@ -1114,6 +1138,14 @@ 8 + + Current year + Current year + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + + Add platform Platform Ekle @@ -1135,7 +1167,7 @@ Bu kullanıcıyı silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 211 @@ -1171,7 +1203,7 @@ Kullanıcıyı Taklit Et apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -1179,7 +1211,7 @@ Kullanıcıyı Sil apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -1227,7 +1259,7 @@ Karşılaştırma Ölçütü apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 351 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1254,14 +1286,6 @@ 5 - - Get started - Haydi Başlayalım - - apps/client/src/app/components/header/header.component.html - 432 - - Sign in Giriş @@ -1271,11 +1295,11 @@ apps/client/src/app/components/header/header.component.ts - 279 + 283 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 60 libs/common/src/lib/routes/routes.ts @@ -1291,11 +1315,11 @@ Hay Allah! Güvenlik anahtarı yanlış. apps/client/src/app/components/header/header.component.ts - 294 + 298 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 153 + 154 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1434,6 +1458,14 @@ 52 + + Current week + Current week + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + + Add activity İşlem ekle. @@ -1499,15 +1531,15 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 451 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1517,6 +1549,10 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html 81 + + apps/client/src/app/pages/pricing/pricing-page.html + 343 + apps/client/src/app/pages/register/register-page.html 31 @@ -1526,20 +1562,12 @@ 30 - - Sign in with Internet Identity - İnternet Kimliği (Internet Identity) ile Oturum Aç - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 - - Sign in with Google Google ile Oturum Aç apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 37 @@ -1547,7 +1575,7 @@ Oturumu açık tut apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 48 @@ -1631,7 +1659,7 @@ Toplam Varlık apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 264 @@ -1639,7 +1667,7 @@ Yıllıklandırılmış Performans apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 274 + 277 @@ -1679,7 +1707,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 190 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1883,39 +1911,55 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 YTD YTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 1Y 1Y + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 5Y 5Y + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 Max Maks. + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 216 + libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -1959,7 +2003,7 @@ Tamam apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -1974,8 +2018,8 @@ About Hakkında - apps/client/src/app/app.component.html - 70 + apps/client/src/app/components/footer/footer.component.html + 20 apps/client/src/app/components/header/header.component.html @@ -1998,8 +2042,8 @@ Changelog Değişiklik Günlüğü - apps/client/src/app/app.component.html - 77 + apps/client/src/app/components/footer/footer.component.html + 27 apps/client/src/app/pages/about/changelog/changelog-page.html @@ -2014,8 +2058,8 @@ License Lisans - apps/client/src/app/app.component.html - 89 + apps/client/src/app/components/footer/footer.component.html + 39 apps/client/src/app/pages/about/license/license-page.html @@ -2030,8 +2074,8 @@ Privacy Policy Gizlilik Politikası - apps/client/src/app/app.component.html - 105 + apps/client/src/app/components/footer/footer.component.html + 55 apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html @@ -2105,6 +2149,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Update account @@ -2187,7 +2235,7 @@ Özet apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 113 apps/client/src/app/components/header/header.component.html @@ -2222,8 +2270,8 @@ Blog Blog - apps/client/src/app/app.component.html - 74 + apps/client/src/app/components/footer/footer.component.html + 24 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html @@ -2342,8 +2390,8 @@ Frequently Asked Questions (FAQ) Sıkça Sorulan Sorular (SSS) - apps/client/src/app/app.component.html - 83 + apps/client/src/app/components/footer/footer.component.html + 33 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -2362,8 +2410,8 @@ Features Özellikler - apps/client/src/app/app.component.html - 79 + apps/client/src/app/components/footer/footer.component.html + 29 apps/client/src/app/components/header/header.component.html @@ -2497,14 +2545,34 @@ Get Started Başla + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Holdings @@ -2529,6 +2597,10 @@ libs/common/src/lib/routes/routes.ts 167 + + libs/ui/src/lib/assistant/assistant.html + 110 + Summary @@ -2546,8 +2618,12 @@ Markets Piyasalar - apps/client/src/app/app.component.html - 61 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + + + apps/client/src/app/components/footer/footer.component.html + 11 apps/client/src/app/components/header/header.component.html @@ -2610,32 +2686,12 @@ 11 - - Get Started - Başla - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 447 - - - apps/client/src/app/pages/pricing/pricing-page.html - 351 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - Monthly Active Users Aylık Aktif Kullanıcılar apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -2643,7 +2699,7 @@ GitHub’daki Beğeniler apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -2655,7 +2711,7 @@ Docker Hub’ta Çekmeler apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -2667,7 +2723,7 @@ Şurada görüldüğü gibi apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -2675,7 +2731,7 @@ varlıklarınızı koruyun. Kişisel yatırım stratejinizi geliştirin. apps/client/src/app/pages/landing/landing-page.html - 226 + 124 @@ -2683,7 +2739,7 @@ Ghostfolio, takip edilmeden hisse senetleri, ETF’ler veya kripto paraları izlemek isteyen yoğun insanlara güç verir. apps/client/src/app/pages/landing/landing-page.html - 230 + 128 @@ -2691,7 +2747,7 @@ 360° Görünüm apps/client/src/app/pages/landing/landing-page.html - 240 + 138 @@ -2699,7 +2755,7 @@ Kişisel finansınızın tam resmini birden fazla platformda edinin. apps/client/src/app/pages/landing/landing-page.html - 243 + 141 @@ -2707,7 +2763,7 @@ Web3 Hazır apps/client/src/app/pages/landing/landing-page.html - 251 + 149 @@ -2715,7 +2771,7 @@ Ghostfolio’yu anonim olarak kullanın ve finansal verilerinize sahip çıkın. apps/client/src/app/pages/landing/landing-page.html - 254 + 152 @@ -2723,7 +2779,7 @@ Güçlü bir topluluk aracılığıyla sürekli gelişmelerden faydalanın. apps/client/src/app/pages/landing/landing-page.html - 264 + 162 @@ -2739,7 +2795,7 @@ Neden Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 272 + 170 @@ -2747,7 +2803,7 @@ Ghostfolio tam size göre, apps/client/src/app/pages/landing/landing-page.html - 274 + 172 @@ -2755,7 +2811,7 @@ Birden fazla platformda hisse senedi, ETF veya kripto para ticareti yapıyorsanız, apps/client/src/app/pages/landing/landing-page.html - 280 + 178 @@ -2763,7 +2819,7 @@ al ve tut stratejisi izliyorsanız, apps/client/src/app/pages/landing/landing-page.html - 286 + 184 @@ -2771,7 +2827,7 @@ Portföy bileşimine dair içgörüleri edinmek istiyorsanız, apps/client/src/app/pages/landing/landing-page.html - 291 + 189 @@ -2779,7 +2835,7 @@ Gizliliğe ve verilerinize sahip çıkmayı önemsiyorsanız apps/client/src/app/pages/landing/landing-page.html - 296 + 194 @@ -2787,7 +2843,7 @@ minimalizme ilgi duyuyorsanız apps/client/src/app/pages/landing/landing-page.html - 299 + 197 @@ -2795,7 +2851,7 @@ finansal kaynaklarınızı çeşitlendirmeye önem veriyorsanız apps/client/src/app/pages/landing/landing-page.html - 303 + 201 @@ -2803,7 +2859,7 @@ finansal özgürlük peşindeyseniz apps/client/src/app/pages/landing/landing-page.html - 307 + 205 @@ -2811,7 +2867,7 @@ elektronik tablo uygulamalarına hayır diyorsanız apps/client/src/app/pages/landing/landing-page.html - 311 + 209 @@ -2819,7 +2875,7 @@ bu listeyi hala okuyorsanız apps/client/src/app/pages/landing/landing-page.html - 314 + 212 @@ -2827,7 +2883,7 @@ Ghostfolio hakkında daha fazla bilgi edinin apps/client/src/app/pages/landing/landing-page.html - 319 + 217 @@ -2835,7 +2891,7 @@ Kullanıcılarımızın görüşleri apps/client/src/app/pages/landing/landing-page.html - 328 + 226 @@ -2843,7 +2899,7 @@ Dünyanın dört bir yanındaki kullanıcılar Ghostfolio Premium kullanıyorlar. apps/client/src/app/pages/landing/landing-page.html - 367 + 265 @@ -2851,7 +2907,7 @@ NasılGhostfolio çalışır? apps/client/src/app/pages/landing/landing-page.html - 384 + 282 @@ -2859,7 +2915,7 @@ Sadece 3 adımda başlayın apps/client/src/app/pages/landing/landing-page.html - 386 + 284 @@ -2875,7 +2931,7 @@ Anonim olarak kaydolun* apps/client/src/app/pages/landing/landing-page.html - 392 + 290 @@ -2883,7 +2939,7 @@ * e-posta adresi veya kredi kartı gerekmez apps/client/src/app/pages/landing/landing-page.html - 394 + 292 @@ -2891,7 +2947,7 @@ Herhangi bir geçmiş işleminizi ekleyin apps/client/src/app/pages/landing/landing-page.html - 406 + 304 @@ -2899,7 +2955,7 @@ Portföy bileşiminizle ilgili değerli bilgiler edinin apps/client/src/app/pages/landing/landing-page.html - 418 + 316 @@ -2907,7 +2963,7 @@ Hazır mısınız? apps/client/src/app/pages/landing/landing-page.html - 432 + 330 @@ -2983,7 +3039,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 221 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -3019,7 +3075,7 @@ Tüm işlemlerinizi silmeyi gerçekten istiyor musunuz? libs/ui/src/lib/activities-table/activities-table.component.ts - 270 + 276 @@ -3075,7 +3131,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 214 + 215 @@ -3091,7 +3147,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 375 + 380 @@ -3107,7 +3163,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 387 + 392 @@ -3166,8 +3222,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3414,6 +3470,14 @@ 138 + + Looking for a student discount? + Looking for a student discount? + + apps/client/src/app/pages/pricing/pricing-page.html + 359 + + Dividend Temettü @@ -3427,7 +3491,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 310 apps/client/src/app/pages/features/features-page.html @@ -3542,20 +3606,12 @@ 7 - - Holdings - Varlıklar - - libs/ui/src/lib/assistant/assistant.html - 110 - - Pricing Fiyatlandırma - apps/client/src/app/app.component.html - 99 + apps/client/src/app/components/footer/footer.component.html + 49 apps/client/src/app/components/header/header.component.html @@ -3771,7 +3827,7 @@ Ücretsiz. apps/client/src/app/pages/pricing/pricing-page.html - 353 + 379 @@ -3838,20 +3894,12 @@ 101 - - Continue with Internet Identity - İnternet Kimliği ile Devam Et - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Google ile Devam Et apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -4079,6 +4127,14 @@ 210 + + User ID + User ID + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + + Free Plan Ücretsiz Plan @@ -4146,9 +4202,9 @@ Resources Kaynaklar - - apps/client/src/app/app.component.html - 64 + + apps/client/src/app/components/footer/footer.component.html + 14 apps/client/src/app/components/header/header.component.html @@ -4212,7 +4268,7 @@ Lütfen kupon kodunuzu girin: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -4220,7 +4276,7 @@ Kupon kodu kullanılamadı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -4228,7 +4284,7 @@ Kupon kodu kullanıldı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -4236,7 +4292,7 @@ Yeniden Yükle apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -4328,7 +4384,7 @@ Yerel Ayarlar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 419 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -4468,7 +4524,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 400 + 405 @@ -4480,7 +4536,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 413 + 418 @@ -4488,7 +4544,7 @@ Taslak libs/ui/src/lib/activities-table/activities-table.component.html - 144 + 142 @@ -4496,7 +4552,7 @@ Klonla libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 457 @@ -4504,7 +4560,7 @@ Taslakları ICS Olarak Dışa Aktar libs/ui/src/lib/activities-table/activities-table.component.html - 450 + 467 @@ -4512,7 +4568,7 @@ TBu işlemi silmeyi gerçekten istiyor musunuz? libs/ui/src/lib/activities-table/activities-table.component.ts - 280 + 286 @@ -4523,6 +4579,14 @@ 117 + + contact us + contact us + + apps/client/src/app/pages/pricing/pricing-page.html + 353 + + from ATH Tüm Zamanların En Yüksek Seviyesinden @@ -4568,7 +4632,7 @@ Hesaplanan Toplam Tutar libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 60 + 59 @@ -4580,7 +4644,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 295 + 298 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -4636,14 +4700,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 312 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -4660,15 +4724,15 @@ Varlık Sınıfı apps/client/src/app/components/admin-market-data/admin-market-data.html - 115 + 114 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 230 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 303 + 321 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4678,29 +4742,29 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Asset Sub Class AVarlık Alt Sınıfı apps/client/src/app/components/admin-market-data/admin-market-data.html - 124 + 123 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 221 + 239 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 337 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4828,7 +4892,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -4864,15 +4928,15 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 75 + 74 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 150 + 168 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 39 + 37 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4886,14 +4950,14 @@ Tag Etiket - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Year @@ -4903,6 +4967,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Years Yıl @@ -5136,11 +5208,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5171,6 +5243,14 @@ 62 + + with your university e-mail address + with your university e-mail address + + apps/client/src/app/pages/pricing/pricing-page.html + 365 + + (Last 30 days) (Son 30 gün) @@ -5240,7 +5320,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 238 + 239 libs/ui/src/lib/i18n.ts @@ -5260,7 +5340,7 @@ Bu etiketi silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 103 + 104 @@ -5335,6 +5415,14 @@ 37 + + Request it + Request it + + apps/client/src/app/pages/pricing/pricing-page.html + 361 + + Access Erişim @@ -5372,7 +5460,7 @@ Elle Giriş apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 19 + 18 @@ -5444,7 +5532,7 @@ Hay Allah, Nakit bakiyesi tranferi başarısız oldu. apps/client/src/app/pages/accounts/accounts-page.component.ts - 324 + 339 @@ -5544,7 +5632,7 @@ Şu anki piyasa fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 639 + 672 @@ -5552,7 +5640,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 504 @@ -5560,7 +5648,7 @@ Tarih Aralığı libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5651,6 +5739,22 @@ 88 + + here + here + + apps/client/src/app/pages/pricing/pricing-page.html + 364 + + + + Close Holding + Close Holding + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 442 + + Absolute Asset Performance Mutlak Varlık Performansı @@ -5704,15 +5808,19 @@ Hafta içi libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 WTD WTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5720,15 +5828,19 @@ Ay içi libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 MTD MTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5736,7 +5848,7 @@ Yıl içi libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5759,17 +5871,21 @@ 8 - + Reset Filters Filtreleri Sıfırla libs/ui/src/lib/assistant/assistant.html - 266 + 204 year Yıl + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 290 @@ -5780,23 +5896,27 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 years Yıllar + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 - + Apply Filters Filtreleri Uygula libs/ui/src/lib/assistant/assistant.html - 276 + 217 @@ -5804,7 +5924,7 @@ Veri Toplama apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6021,7 +6141,15 @@ Hemen katıl ya da örnek hesabı incele apps/client/src/app/pages/landing/landing-page.html - 435 + 333 + + + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 @@ -6053,7 +6181,7 @@ Profilleri Sil apps/client/src/app/components/admin-market-data/admin-market-data.html - 243 + 242 @@ -6124,8 +6252,8 @@ Community Topluluk - apps/client/src/app/app.component.html - 130 + apps/client/src/app/components/footer/footer.component.html + 80 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -6197,7 +6325,7 @@ Açık Kaynak apps/client/src/app/pages/landing/landing-page.html - 261 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6208,8 +6336,8 @@ Personal Finance Kişisel Finans - apps/client/src/app/app.component.html - 57 + apps/client/src/app/components/footer/footer.component.html + 7 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6296,6 +6424,14 @@ 83 + + View Holding + View Holding + + libs/ui/src/lib/activities-table/activities-table.component.html + 444 + + Canada Kanada @@ -6413,7 +6549,7 @@ Hata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 630 + 663 @@ -6453,7 +6589,7 @@ Pasif apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html - 87 + 88 @@ -6461,15 +6597,15 @@ İptal Et apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 143 + 161 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 580 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 59 + 57 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6517,11 +6653,11 @@ Kapat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 582 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 61 + 59 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6556,6 +6692,14 @@ 11 + + Role + Role + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 31 + + Yes Evet @@ -6568,8 +6712,8 @@ Accounts Accounts - libs/ui/src/lib/assistant/assistant.html - 84 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 51 @@ -6596,6 +6740,14 @@ 63 + + If you plan to open an account at + If you plan to open an account at + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + + Performance with currency effect Performance Kur farkı etkisiyle performans Performans @@ -6665,7 +6817,7 @@ Hay Allah! Geçersiz para birimi. apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 50 + 48 @@ -6700,6 +6852,14 @@ 163 + + to use our referral link and get a Ghostfolio Premium membership for one year + to use our referral link and get a Ghostfolio Premium membership for one year + + apps/client/src/app/pages/pricing/pricing-page.html + 357 + + can be self-hosted kendi sunucunuzda barındırılabilir @@ -6844,6 +7004,14 @@ 293 + + Engagement per Day + Engagement per Day + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 76 + + Guides Kılavuzlar @@ -6955,7 +7123,7 @@ API anahtarı oluşturulamadı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -6963,7 +7131,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 - 156 + 159 @@ -6971,7 +7139,7 @@ Ghostfolio Premium Veri Sağlayıcı API Anahtarı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -6979,7 +7147,15 @@ Yeni bir API anahtarı oluşturmak istediğinize emin misiniz? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 + + + + Country + Country + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 37 @@ -7019,11 +7195,11 @@ Kaydet apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 591 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 70 + 68 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -7071,7 +7247,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 251 + 260 @@ -7119,7 +7295,7 @@ Tembel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7127,7 +7303,15 @@ Anında apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 + + + + API Requests Today + API Requests Today + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 86 @@ -7135,7 +7319,7 @@ Varsayılan Piyasa Fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 391 + 413 @@ -7143,7 +7327,7 @@ Mod apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 432 + 454 @@ -7151,7 +7335,7 @@ Seçici apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 470 @@ -7159,7 +7343,7 @@ HTTP İstek Başlıkları apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 404 + 426 @@ -7167,7 +7351,7 @@ gün sonu apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7175,7 +7359,7 @@ gerçek zamanlı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 @@ -7203,7 +7387,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7223,11 +7407,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7323,11 +7507,11 @@ Güvenlik belirteci apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 169 + 170 @@ -7335,7 +7519,7 @@ Bu kullanıcı için yeni bir güvenlik belirteci oluşturmak istediğinize emin misiniz? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 237 @@ -7343,7 +7527,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7351,7 +7535,7 @@ Güvenlik belirteci oluştur apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -7387,8 +7571,8 @@ Terms of Service Hizmet Koşulları - apps/client/src/app/app.component.html - 112 + apps/client/src/app/components/footer/footer.component.html + 62 libs/common/src/lib/routes/routes.ts @@ -7408,7 +7592,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 566 + 599 @@ -7416,7 +7600,7 @@ Güncelleştirilirken bir hata oluştu (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 574 + 607 @@ -7424,7 +7608,7 @@ Uygula apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 153 @@ -7440,7 +7624,7 @@ Yakın Geçmiş Piyasa Verilerini Topla apps/client/src/app/components/admin-market-data/admin-market-data.html - 226 + 225 @@ -7448,7 +7632,7 @@ Tüm Geçmiş Piyasa Verilerini Topla apps/client/src/app/components/admin-market-data/admin-market-data.html - 231 + 230 @@ -7456,7 +7640,7 @@ Geçmiş Piyasa Verilerini Topla apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 33 + 34 @@ -7612,15 +7796,7 @@ 158 - - Name - İsim - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Hızlı Bağlantılar @@ -7628,24 +7804,16 @@ 58 - - Asset Profiles - Varlık Profilleri - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Canlı Demo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 452 + 349 libs/common/src/lib/routes/routes.ts @@ -7770,6 +7938,14 @@ 5 + + Current month + Current month + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + + new yeni @@ -7936,7 +8112,7 @@ Do you really want to generate a new security token? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 174 + 175 @@ -7992,7 +8168,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 466 @@ -8016,7 +8192,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 110 + 113 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -8407,6 +8583,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 23 + + Follow Ghostfolio on LinkedIn Ghostfolio’yu LinkedIn’de takip edin diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 2a6ac4f5c..c1f2c7bce 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -5,8 +5,8 @@ Features Функції - apps/client/src/app/app.component.html - 79 + apps/client/src/app/components/footer/footer.component.html + 29 apps/client/src/app/components/header/header.component.html @@ -38,11 +38,11 @@ apps/client/src/app/components/header/header.component.ts - 279 + 283 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 60 libs/common/src/lib/routes/routes.ts @@ -101,8 +101,8 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. Ризик втрат у торгівлі може бути суттєвим. Не рекомендується інвестувати гроші, які можуть знадобитися в короткостроковій перспективі. - apps/client/src/app/app.component.html - 221 + apps/client/src/app/components/footer/footer.component.html + 171 @@ -290,6 +290,14 @@ 11 + + please + please + + apps/client/src/app/pages/pricing/pricing-page.html + 350 + + Permission Дозвіл @@ -338,8 +346,8 @@ Accounts Accounts - libs/ui/src/lib/assistant/assistant.html - 84 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 51 @@ -414,14 +422,6 @@ 86 - - Holdings - Активи - - libs/ui/src/lib/assistant/assistant.html - 110 - - Cash Balances Баланс готівки @@ -447,11 +447,11 @@ Назва apps/client/src/app/components/admin-market-data/admin-market-data.html - 89 + 88 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 286 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -487,7 +487,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 137 + 135 + + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -515,15 +519,15 @@ Валюта apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 201 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 293 + 311 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 47 + 45 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -539,7 +543,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 280 + 281 @@ -575,11 +579,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 297 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -603,7 +607,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 268 + 267 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -619,7 +623,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 451 @@ -627,11 +631,11 @@ Видалити apps/client/src/app/components/admin-market-data/admin-market-data.html - 290 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 68 + 86 apps/client/src/app/components/admin-overview/admin-overview.html @@ -655,7 +659,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 461 + 478 libs/ui/src/lib/benchmark/benchmark.component.html @@ -687,7 +691,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 160 + 161 @@ -707,7 +711,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 567 @@ -727,11 +731,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 106 + 105 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 179 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -883,7 +887,7 @@ Ринкова ціна apps/client/src/app/components/admin-market-data/admin-market-data.html - 133 + 132 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -899,11 +903,11 @@ Перша активність apps/client/src/app/components/admin-market-data/admin-market-data.html - 148 + 147 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 194 + 212 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -919,7 +923,7 @@ Кількість активностей apps/client/src/app/components/admin-market-data/admin-market-data.html - 157 + 156 @@ -927,7 +931,7 @@ Історичні дані apps/client/src/app/components/admin-market-data/admin-market-data.html - 166 + 165 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -939,7 +943,7 @@ Кількість секторів apps/client/src/app/components/admin-market-data/admin-market-data.html - 175 + 174 @@ -947,7 +951,7 @@ Кількість країн apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 183 @@ -955,11 +959,11 @@ Зібрати дані профілю apps/client/src/app/components/admin-market-data/admin-market-data.html - 235 + 234 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 48 + 66 @@ -967,7 +971,7 @@ Видалити профілі apps/client/src/app/components/admin-market-data/admin-market-data.html - 243 + 242 @@ -999,7 +1003,7 @@ Помилка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 630 + 663 @@ -1007,7 +1011,7 @@ Поточна ринкова ціна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 639 + 672 @@ -1023,7 +1027,7 @@ Сектор apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 239 + 257 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1035,7 +1039,7 @@ Країна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 250 + 268 apps/client/src/app/components/admin-users/admin-users.html @@ -1051,11 +1055,11 @@ Сектори apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 274 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1071,11 +1075,11 @@ Країни apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 266 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 504 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1087,7 +1091,7 @@ Зіставлення символів apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 357 + 379 @@ -1103,7 +1107,7 @@ Конфігурація скребка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 382 + 404 @@ -1111,7 +1115,7 @@ Тест apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 504 @@ -1119,11 +1123,11 @@ URL apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 464 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 516 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1139,7 +1143,7 @@ Примітка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 529 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1171,7 +1175,7 @@ Додати вручну apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 19 + 18 @@ -1179,7 +1183,7 @@ Додати валюту apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 22 + 20 @@ -1187,11 +1191,11 @@ Назва, символ або ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 132 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 29 + 27 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html @@ -1207,7 +1211,7 @@ Упс! Невірна валюта. apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 50 + 48 @@ -1295,7 +1299,7 @@ Збір даних apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1354,6 +1358,14 @@ 200 + + Activities + Activities + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 61 + + Add Platform Додати платформу @@ -1367,7 +1379,7 @@ Ви дійсно хочете видалити цю платформу? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 108 @@ -1378,6 +1390,14 @@ 8 + + Current year + Current year + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + + Add platform Додати платформу @@ -1487,15 +1507,15 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 451 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1505,6 +1525,10 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html 81 + + apps/client/src/app/pages/pricing/pricing-page.html + 343 + apps/client/src/app/pages/register/register-page.html 31 @@ -1539,7 +1563,7 @@ Ви дійсно хочете видалити цей тег? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 103 + 104 @@ -1563,7 +1587,7 @@ Ви дійсно хочете видалити цього користувача? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 211 @@ -1603,7 +1627,7 @@ Видавати себе за користувача apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -1611,7 +1635,7 @@ Видалити користувача apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -1659,7 +1683,7 @@ Порівняльний показник apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 351 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1730,24 +1754,16 @@ 5 - - Get started - Почати - - apps/client/src/app/components/header/header.component.html - 432 - - Oops! Incorrect Security Token. Упс! Неправильний Секретний Токен. apps/client/src/app/components/header/header.component.ts - 294 + 298 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 153 + 154 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1762,6 +1778,14 @@ 63 + + If you plan to open an account at + If you plan to open an account at + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + + Performance with currency effect Performance Прибутковість з урахуванням валютного ефекту валюти Прибутковість @@ -1799,7 +1823,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 190 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2014,6 +2038,14 @@ 52 + + Current week + Current week + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + + Add activity Додати активність @@ -2070,20 +2102,12 @@ 72 - - Sign in with Internet Identity - Увійти з Інтернет-Ідентичністю - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 - - Sign in with Google Увійти з Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 37 @@ -2091,7 +2115,7 @@ Залишатися в системі apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 48 @@ -2199,7 +2223,7 @@ Чиста вартість apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 264 @@ -2207,7 +2231,7 @@ Річна доходність apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 274 + 277 @@ -2215,11 +2239,11 @@ Зберегти apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 591 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 70 + 68 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -2487,39 +2511,55 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 YTD З початку року + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 1Y 1 рік + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 5Y 5 років + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 Max Максимум + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 216 + libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -2583,7 +2623,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 251 + 260 @@ -2615,7 +2655,7 @@ Не вдалося згенерувати ключ API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -2623,7 +2663,7 @@ ОК apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -2639,7 +2679,7 @@ Встановіть цей ключ API у вашому self-hosted середовищі: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -2647,7 +2687,7 @@ Ключ API Ghostfolio Premium Data Provider apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -2655,7 +2695,7 @@ Ви дійсно хочете згенерувати новий ключ API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 @@ -2663,7 +2703,7 @@ Не вдалося обміняти код купона apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -2671,7 +2711,7 @@ Код купона був обміняний apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -2679,7 +2719,7 @@ Перезавантажити apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -2687,7 +2727,7 @@ Будь ласка, введіть ваш код купона. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -2758,6 +2798,14 @@ 280 + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 + + Oops! There was an error setting up biometric authentication. Упс! Виникла помилка під час налаштування біометричної автентифікації. @@ -2811,7 +2859,7 @@ Локалізація apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 419 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2982,8 +3030,8 @@ About Про нас - apps/client/src/app/app.component.html - 70 + apps/client/src/app/components/footer/footer.component.html + 20 apps/client/src/app/components/header/header.component.html @@ -3006,8 +3054,8 @@ Changelog Журнал змін - apps/client/src/app/app.component.html - 77 + apps/client/src/app/components/footer/footer.component.html + 27 apps/client/src/app/pages/about/changelog/changelog-page.html @@ -3022,8 +3070,8 @@ License Ліцензія - apps/client/src/app/app.component.html - 89 + apps/client/src/app/components/footer/footer.component.html + 39 apps/client/src/app/pages/about/license/license-page.html @@ -3038,8 +3086,8 @@ Privacy Policy Політика конфіденційності - apps/client/src/app/app.component.html - 105 + apps/client/src/app/components/footer/footer.component.html + 55 apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html @@ -3113,13 +3161,17 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Oops, cash balance transfer has failed. Упс, перенесення балансу готівки не вдалося. apps/client/src/app/pages/accounts/accounts-page.component.ts - 324 + 339 @@ -3235,7 +3287,7 @@ Огляд apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 113 apps/client/src/app/components/header/header.component.html @@ -3278,8 +3330,8 @@ Blog Блог - apps/client/src/app/app.component.html - 74 + apps/client/src/app/components/footer/footer.component.html + 24 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html @@ -3398,8 +3450,8 @@ Frequently Asked Questions (FAQ) Часто задавані питання (FAQ) - apps/client/src/app/app.component.html - 83 + apps/client/src/app/components/footer/footer.component.html + 33 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -3566,14 +3618,34 @@ Get Started Почати + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Holdings @@ -3598,6 +3670,10 @@ libs/common/src/lib/routes/routes.ts 167 + + libs/ui/src/lib/assistant/assistant.html + 110 + Summary @@ -3615,8 +3691,12 @@ Markets Ринки - apps/client/src/app/app.component.html - 61 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + + + apps/client/src/app/components/footer/footer.component.html + 11 apps/client/src/app/components/header/header.component.html @@ -3711,32 +3791,12 @@ 11 - - Get Started - Почати - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 447 - - - apps/client/src/app/pages/pricing/pricing-page.html - 351 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - Monthly Active Users Щомісячні активні користувачі apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -3744,7 +3804,7 @@ Зірки на GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -3756,7 +3816,7 @@ Завантаження на Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -3768,7 +3828,7 @@ Як видно в apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -3776,7 +3836,7 @@ Захищайте свої активи. Вдосконалюйте власну інвестиційну стратегію. apps/client/src/app/pages/landing/landing-page.html - 226 + 124 @@ -3784,7 +3844,7 @@ Ghostfolio допомагає зайнятим людям відстежувати акції, ETF або криптовалюти без ризику бути відстеженими. apps/client/src/app/pages/landing/landing-page.html - 230 + 128 @@ -3792,7 +3852,7 @@ 360° огляд apps/client/src/app/pages/landing/landing-page.html - 240 + 138 @@ -3800,7 +3860,7 @@ Отримайте повну картину ваших особистих фінансів на різних платформах. apps/client/src/app/pages/landing/landing-page.html - 243 + 141 @@ -3808,7 +3868,7 @@ Готовий до Web3 apps/client/src/app/pages/landing/landing-page.html - 251 + 149 @@ -3816,7 +3876,7 @@ Використовуйте Ghostfolio анонімно та володійте своїми фінансовими даними. apps/client/src/app/pages/landing/landing-page.html - 254 + 152 @@ -3824,7 +3884,7 @@ Отримуйте користь від постійних покращень завдяки сильній спільноті. apps/client/src/app/pages/landing/landing-page.html - 264 + 162 @@ -3840,7 +3900,7 @@ Чому Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 272 + 170 @@ -3848,7 +3908,7 @@ Ghostfolio для вас, якщо ви... apps/client/src/app/pages/landing/landing-page.html - 274 + 172 @@ -3856,7 +3916,7 @@ торгуєте акціями, ETF або криптовалютами на різних платформах apps/client/src/app/pages/landing/landing-page.html - 280 + 178 @@ -3864,7 +3924,7 @@ дотримуєтеся стратегії купівлі та утримання apps/client/src/app/pages/landing/landing-page.html - 286 + 184 @@ -3872,7 +3932,7 @@ вас цікавлять інсайти вашого складу портфеля apps/client/src/app/pages/landing/landing-page.html - 291 + 189 @@ -3880,7 +3940,7 @@ цінуєте конфіденційність і володіння даними apps/client/src/app/pages/landing/landing-page.html - 296 + 194 @@ -3888,7 +3948,7 @@ займаєтесь мінімалізмом apps/client/src/app/pages/landing/landing-page.html - 299 + 197 @@ -3896,7 +3956,7 @@ піклуєтесь про диверсифікацію ваших фінансових ресурсів apps/client/src/app/pages/landing/landing-page.html - 303 + 201 @@ -3904,7 +3964,7 @@ цікавитесь фінансовою незалежністю apps/client/src/app/pages/landing/landing-page.html - 307 + 205 @@ -3912,7 +3972,7 @@ кажете ні таблицям у apps/client/src/app/pages/landing/landing-page.html - 311 + 209 @@ -3920,7 +3980,7 @@ все ще читаєте цей список apps/client/src/app/pages/landing/landing-page.html - 314 + 212 @@ -3928,7 +3988,7 @@ Дізнайтеся більше про Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 319 + 217 @@ -3936,7 +3996,7 @@ Що говорять користувачі apps/client/src/app/pages/landing/landing-page.html - 328 + 226 @@ -3944,7 +4004,7 @@ Члени зі всього світу використовують Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 367 + 265 @@ -3952,7 +4012,7 @@ Як працює Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 384 + 282 @@ -3960,7 +4020,7 @@ Почніть всього за 3 кроки apps/client/src/app/pages/landing/landing-page.html - 386 + 284 @@ -3976,7 +4036,7 @@ Зареєструйтеся анонімно* apps/client/src/app/pages/landing/landing-page.html - 392 + 290 @@ -3984,7 +4044,7 @@ * не потрібні електронна адреса та кредитна картка apps/client/src/app/pages/landing/landing-page.html - 394 + 292 @@ -3992,7 +4052,7 @@ Додайте будь-які з ваших історичних транзакцій apps/client/src/app/pages/landing/landing-page.html - 406 + 304 @@ -4000,7 +4060,7 @@ Отримуйте цінні інсайти вашого складу портфеля apps/client/src/app/pages/landing/landing-page.html - 418 + 316 @@ -4008,7 +4068,7 @@ Ви готові? apps/client/src/app/pages/landing/landing-page.html - 432 + 330 @@ -4016,7 +4076,7 @@ Приєднуйтесь зараз або перегляньте демонстраційний рахунок apps/client/src/app/pages/landing/landing-page.html - 435 + 333 @@ -4043,6 +4103,14 @@ 62 + + with your university e-mail address + with your university e-mail address + + apps/client/src/app/pages/pricing/pricing-page.html + 365 + + Active Users Активні користувачі @@ -4136,7 +4204,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 221 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -4248,7 +4316,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 169 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -4264,7 +4332,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 214 + 215 @@ -4280,7 +4348,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 375 + 380 @@ -4296,7 +4364,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 387 + 392 @@ -4355,8 +4423,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -4627,6 +4695,14 @@ 138 + + Looking for a student discount? + Looking for a student discount? + + apps/client/src/app/pages/pricing/pricing-page.html + 359 + + Dividend Дивіденди @@ -4640,7 +4716,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 310 apps/client/src/app/pages/features/features-page.html @@ -4683,6 +4759,14 @@ 88 + + here + here + + apps/client/src/app/pages/pricing/pricing-page.html + 364 + + Monthly Щомісячно @@ -4699,6 +4783,14 @@ 91 + + Close Holding + Close Holding + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 442 + + Absolute Asset Performance Абсолютна прибутковість активів @@ -4856,15 +4948,15 @@ Неактивний apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html - 87 + 88 Pricing Ціни - apps/client/src/app/app.component.html - 99 + apps/client/src/app/components/footer/footer.component.html + 49 apps/client/src/app/components/header/header.component.html @@ -5064,7 +5156,7 @@ Це безкоштовно. apps/client/src/app/pages/pricing/pricing-page.html - 353 + 379 @@ -5135,20 +5227,12 @@ 281 - - Continue with Internet Identity - Продовжити з Інтернет-Ідентичністю - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Продовжити з Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -5175,6 +5259,14 @@ 293 + + Engagement per Day + Engagement per Day + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 76 + + Guides Посібники @@ -5326,8 +5418,8 @@ Community Спільнота - apps/client/src/app/app.component.html - 130 + apps/client/src/app/components/footer/footer.component.html + 80 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -5399,7 +5491,7 @@ Відкритий код apps/client/src/app/pages/landing/landing-page.html - 261 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5410,8 +5502,8 @@ Personal Finance Особисті фінанси - apps/client/src/app/app.component.html - 57 + apps/client/src/app/components/footer/footer.component.html + 7 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5666,6 +5758,14 @@ 171 + + to use our referral link and get a Ghostfolio Premium membership for one year + to use our referral link and get a Ghostfolio Premium membership for one year + + apps/client/src/app/pages/pricing/pricing-page.html + 357 + + can be self-hosted може бути self-hosted @@ -5698,6 +5798,14 @@ 210 + + User ID + User ID + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + + can be used anonymously може використовуватися анонімно @@ -5810,8 +5918,8 @@ Resources Ресурси - apps/client/src/app/app.component.html - 64 + apps/client/src/app/components/footer/footer.component.html + 14 apps/client/src/app/components/header/header.component.html @@ -5842,6 +5950,14 @@ 37 + + Request it + Request it + + apps/client/src/app/pages/pricing/pricing-page.html + 361 + + Access Доступ @@ -5903,7 +6019,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 400 + 405 @@ -5915,7 +6031,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 413 + 418 @@ -5931,7 +6047,7 @@ Чернетка libs/ui/src/lib/activities-table/activities-table.component.html - 144 + 142 @@ -5939,7 +6055,7 @@ Клонувати libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 457 @@ -5947,7 +6063,7 @@ Експортувати чернетку як ICS libs/ui/src/lib/activities-table/activities-table.component.html - 450 + 467 @@ -5955,7 +6071,7 @@ Ви дійсно хочете видалити ці дії? libs/ui/src/lib/activities-table/activities-table.component.ts - 270 + 276 @@ -5963,7 +6079,7 @@ Ви дійсно хочете видалити цю активність? libs/ui/src/lib/activities-table/activities-table.component.ts - 280 + 286 @@ -5971,15 +6087,19 @@ Тиждень до дати libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 WTD WTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5987,15 +6107,19 @@ Місяць до дати libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 MTD MTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -6003,12 +6127,16 @@ Рік до дати libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 year рік + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 290 @@ -6019,15 +6147,19 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 years роки + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -6037,29 +6169,33 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Date Range Діапазон дат libs/ui/src/lib/assistant/assistant.html - 171 + 170 - + Reset Filters Скинути фільтри libs/ui/src/lib/assistant/assistant.html - 266 + 204 - + Apply Filters Застосувати фільтри libs/ui/src/lib/assistant/assistant.html - 276 + 217 @@ -6102,6 +6238,14 @@ 117 + + contact us + contact us + + apps/client/src/app/pages/pricing/pricing-page.html + 353 + + from ATH від ІМ @@ -6147,7 +6291,7 @@ Прогнозована загальна сума libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 60 + 59 @@ -6167,7 +6311,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 295 + 298 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -6239,14 +6383,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 312 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -6263,15 +6407,15 @@ Клас активів apps/client/src/app/components/admin-market-data/admin-market-data.html - 115 + 114 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 230 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 303 + 321 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -6281,29 +6425,29 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Asset Sub Class Підклас активів apps/client/src/app/components/admin-market-data/admin-market-data.html - 124 + 123 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 221 + 239 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 337 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -6331,15 +6475,15 @@ Скасувати apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 143 + 161 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 580 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 59 + 57 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6395,11 +6539,11 @@ Закрити apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 582 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 61 + 59 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6531,7 +6675,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -6575,15 +6719,15 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 75 + 74 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 150 + 168 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 39 + 37 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -6597,14 +6741,14 @@ Tag Тег - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Year @@ -6614,6 +6758,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Years Роки @@ -6622,6 +6774,14 @@ 33 + + Role + Role + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 31 + + Yes Так @@ -6651,7 +6811,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 238 + 239 libs/ui/src/lib/i18n.ts @@ -6886,6 +7046,14 @@ 83 + + View Holding + View Holding + + libs/ui/src/lib/activities-table/activities-table.component.html + 444 + + Canada Канада @@ -7038,6 +7206,14 @@ 110 + + Country + Country + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 37 + + API Key Ключ API @@ -7079,11 +7255,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7119,7 +7295,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7127,7 +7303,15 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 + + + + API Requests Today + API Requests Today + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 86 @@ -7135,7 +7319,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 391 + 413 @@ -7143,7 +7327,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 432 + 454 @@ -7151,7 +7335,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 470 @@ -7159,7 +7343,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 404 + 426 @@ -7167,7 +7351,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7175,7 +7359,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 @@ -7203,7 +7387,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7223,11 +7407,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7323,11 +7507,11 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 169 + 170 @@ -7335,7 +7519,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 237 @@ -7343,7 +7527,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7351,7 +7535,7 @@ Generate Security Token apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -7387,8 +7571,8 @@ Terms of Service Terms of Service - apps/client/src/app/app.component.html - 112 + apps/client/src/app/components/footer/footer.component.html + 62 libs/common/src/lib/routes/routes.ts @@ -7408,7 +7592,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 566 + 599 @@ -7416,7 +7600,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 574 + 607 @@ -7424,7 +7608,7 @@ Apply apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 153 @@ -7440,7 +7624,7 @@ Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 226 + 225 @@ -7448,7 +7632,7 @@ Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 231 + 230 @@ -7456,7 +7640,7 @@ Gather Historical Market Data apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 33 + 34 @@ -7612,15 +7796,7 @@ 158 - - Name - Name - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Quick Links @@ -7628,24 +7804,16 @@ 58 - - Asset Profiles - Asset Profiles - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Live Demo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 452 + 349 libs/common/src/lib/routes/routes.ts @@ -7770,6 +7938,14 @@ 5 + + Current month + Current month + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + + new new @@ -7936,7 +8112,7 @@ Do you really want to generate a new security token? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 174 + 175 @@ -7992,7 +8168,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 466 @@ -8016,7 +8192,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 110 + 113 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -8407,6 +8583,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 23 + + Follow Ghostfolio on LinkedIn Follow Ghostfolio on LinkedIn diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 9082cd38a..3a6ce2f09 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -202,8 +202,8 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. - apps/client/src/app/app.component.html - 221 + apps/client/src/app/components/footer/footer.component.html + 171 @@ -224,6 +224,13 @@ 11 + + please + + apps/client/src/app/pages/pricing/pricing-page.html + 350 + + Type @@ -240,7 +247,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 160 + 161 @@ -323,11 +330,11 @@ Name apps/client/src/app/components/admin-market-data/admin-market-data.html - 89 + 88 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 286 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -363,7 +370,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 137 + 135 + + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -389,15 +400,15 @@ Currency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 201 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 293 + 311 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 47 + 45 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -413,7 +424,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 280 + 281 @@ -448,11 +459,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 297 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -475,7 +486,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 268 + 267 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -491,18 +502,18 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 451 Delete apps/client/src/app/components/admin-market-data/admin-market-data.html - 290 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 68 + 86 apps/client/src/app/components/admin-overview/admin-overview.html @@ -526,7 +537,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 461 + 478 libs/ui/src/lib/benchmark/benchmark.component.html @@ -555,7 +566,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 567 @@ -566,11 +577,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 106 + 105 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 179 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -667,7 +678,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 169 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -678,7 +689,7 @@ Market Price apps/client/src/app/components/admin-market-data/admin-market-data.html - 133 + 132 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -732,11 +743,11 @@ First Activity apps/client/src/app/components/admin-market-data/admin-market-data.html - 148 + 147 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 194 + 212 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -751,14 +762,14 @@ Activities Count apps/client/src/app/components/admin-market-data/admin-market-data.html - 157 + 156 Historical Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 166 + 165 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -769,39 +780,39 @@ Sectors Count apps/client/src/app/components/admin-market-data/admin-market-data.html - 175 + 174 Countries Count apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 183 Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 226 + 225 Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 231 + 230 Gather Profile Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 235 + 234 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 48 + 66 @@ -822,7 +833,7 @@ Gather Historical Market Data apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 33 + 34 @@ -844,7 +855,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 239 + 257 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -855,7 +866,7 @@ Country apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 250 + 268 apps/client/src/app/components/admin-users/admin-users.html @@ -870,11 +881,11 @@ Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 274 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -889,11 +900,11 @@ Countries apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 266 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 504 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -904,7 +915,7 @@ Symbol Mapping apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 357 + 379 @@ -918,14 +929,14 @@ Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 382 + 404 Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 529 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -954,18 +965,18 @@ Add Manually apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 19 + 18 Name, symbol or ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 132 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 29 + 27 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html @@ -1036,7 +1047,7 @@ Add Currency apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 22 + 20 @@ -1099,6 +1110,13 @@ 200 + + Activities + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 61 + + Add Platform @@ -1110,11 +1128,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 464 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 516 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1129,7 +1147,7 @@ Do you really want to delete this platform? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 108 @@ -1139,6 +1157,13 @@ 8 + + Current year + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + + Add platform @@ -1179,7 +1204,7 @@ Do you really want to delete this tag? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 103 + 104 @@ -1200,7 +1225,7 @@ Do you really want to delete this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 211 @@ -1232,14 +1257,14 @@ Impersonate User apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 Delete User apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -1283,7 +1308,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 351 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1315,13 +1340,6 @@ 5 - - Get started - - apps/client/src/app/components/header/header.component.html - 432 - - Sign in @@ -1330,11 +1348,11 @@ apps/client/src/app/components/header/header.component.ts - 279 + 283 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 60 libs/common/src/lib/routes/routes.ts @@ -1349,11 +1367,11 @@ Oops! Incorrect Security Token. apps/client/src/app/components/header/header.component.ts - 294 + 298 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 153 + 154 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1478,6 +1496,13 @@ 52 + + Current week + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + + Add activity @@ -1538,15 +1563,15 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 451 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1556,6 +1581,10 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html 81 + + apps/client/src/app/pages/pricing/pricing-page.html + 343 + apps/client/src/app/pages/register/register-page.html 31 @@ -1565,25 +1594,18 @@ 30 - - Sign in with Internet Identity - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 - - Sign in with Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 37 Stay signed in apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 48 @@ -1668,14 +1690,14 @@ Net Worth apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 264 Annualized Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 274 + 277 @@ -1711,7 +1733,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 190 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1890,35 +1912,51 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 YTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 1Y + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 5Y + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 Max + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 216 + libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -1946,28 +1984,28 @@ Please enter your coupon code. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 Could not redeem coupon code apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 Coupon code has been redeemed apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 Reload apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -2049,7 +2087,7 @@ Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 419 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2185,7 +2223,7 @@ Okay apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -2199,8 +2237,8 @@ About - apps/client/src/app/app.component.html - 70 + apps/client/src/app/components/footer/footer.component.html + 20 apps/client/src/app/components/header/header.component.html @@ -2222,8 +2260,8 @@ Changelog - apps/client/src/app/app.component.html - 77 + apps/client/src/app/components/footer/footer.component.html + 27 apps/client/src/app/pages/about/changelog/changelog-page.html @@ -2237,8 +2275,8 @@ License - apps/client/src/app/app.component.html - 89 + apps/client/src/app/components/footer/footer.component.html + 39 apps/client/src/app/pages/about/license/license-page.html @@ -2252,8 +2290,8 @@ Privacy Policy - apps/client/src/app/app.component.html - 105 + apps/client/src/app/components/footer/footer.component.html + 55 apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html @@ -2322,12 +2360,16 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Oops, cash balance transfer has failed. apps/client/src/app/pages/accounts/accounts-page.component.ts - 324 + 339 @@ -2424,7 +2466,7 @@ Overview apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 113 apps/client/src/app/components/header/header.component.html @@ -2458,8 +2500,8 @@ Blog - apps/client/src/app/app.component.html - 74 + apps/client/src/app/components/footer/footer.component.html + 24 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html @@ -2575,8 +2617,8 @@ Frequently Asked Questions (FAQ) - apps/client/src/app/app.component.html - 83 + apps/client/src/app/components/footer/footer.component.html + 33 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -2594,8 +2636,8 @@ Features - apps/client/src/app/app.component.html - 79 + apps/client/src/app/components/footer/footer.component.html + 29 apps/client/src/app/components/header/header.component.html @@ -2703,14 +2745,34 @@ Get Started + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Holdings @@ -2734,6 +2796,10 @@ libs/common/src/lib/routes/routes.ts 167 + + libs/ui/src/lib/assistant/assistant.html + 110 + Summary @@ -2749,8 +2815,12 @@ Markets - apps/client/src/app/app.component.html - 61 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + + + apps/client/src/app/components/footer/footer.component.html + 11 apps/client/src/app/components/header/header.component.html @@ -2831,37 +2901,18 @@ 11 - - Get Started - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 447 - - - apps/client/src/app/pages/pricing/pricing-page.html - 351 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - Monthly Active Users apps/client/src/app/pages/landing/landing-page.html - 70 + 69 Stars on GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -2872,7 +2923,7 @@ Pulls on Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -2883,56 +2934,56 @@ As seen in apps/client/src/app/pages/landing/landing-page.html - 115 + 114 Protect your assets. Refine your personal investment strategy. apps/client/src/app/pages/landing/landing-page.html - 226 + 124 Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. apps/client/src/app/pages/landing/landing-page.html - 230 + 128 360° View apps/client/src/app/pages/landing/landing-page.html - 240 + 138 Get the full picture of your personal finances across multiple platforms. apps/client/src/app/pages/landing/landing-page.html - 243 + 141 Web3 Ready apps/client/src/app/pages/landing/landing-page.html - 251 + 149 Use Ghostfolio anonymously and own your financial data. apps/client/src/app/pages/landing/landing-page.html - 254 + 152 Benefit from continuous improvements through a strong community. apps/client/src/app/pages/landing/landing-page.html - 264 + 162 @@ -2946,112 +2997,112 @@ Why Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 272 + 170 Ghostfolio is for you if you are... apps/client/src/app/pages/landing/landing-page.html - 274 + 172 trading stocks, ETFs or cryptocurrencies on multiple platforms apps/client/src/app/pages/landing/landing-page.html - 280 + 178 pursuing a buy & hold strategy apps/client/src/app/pages/landing/landing-page.html - 286 + 184 interested in getting insights of your portfolio composition apps/client/src/app/pages/landing/landing-page.html - 291 + 189 valuing privacy and data ownership apps/client/src/app/pages/landing/landing-page.html - 296 + 194 into minimalism apps/client/src/app/pages/landing/landing-page.html - 299 + 197 caring about diversifying your financial resources apps/client/src/app/pages/landing/landing-page.html - 303 + 201 interested in financial independence apps/client/src/app/pages/landing/landing-page.html - 307 + 205 saying no to spreadsheets in apps/client/src/app/pages/landing/landing-page.html - 311 + 209 still reading this list apps/client/src/app/pages/landing/landing-page.html - 314 + 212 Learn more about Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 319 + 217 What our users are saying apps/client/src/app/pages/landing/landing-page.html - 328 + 226 Members from around the globe are using Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 367 + 265 How does Ghostfolio work? apps/client/src/app/pages/landing/landing-page.html - 384 + 282 Get started in only 3 steps apps/client/src/app/pages/landing/landing-page.html - 386 + 284 @@ -3065,35 +3116,35 @@ Sign up anonymously* apps/client/src/app/pages/landing/landing-page.html - 392 + 290 * no e-mail address nor credit card required apps/client/src/app/pages/landing/landing-page.html - 394 + 292 Add any of your historical transactions apps/client/src/app/pages/landing/landing-page.html - 406 + 304 Get valuable insights of your portfolio composition apps/client/src/app/pages/landing/landing-page.html - 418 + 316 Are you ready? apps/client/src/app/pages/landing/landing-page.html - 432 + 330 @@ -3117,6 +3168,13 @@ 62 + + with your university e-mail address + + apps/client/src/app/pages/pricing/pricing-page.html + 365 + + Active Users @@ -3200,7 +3258,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 221 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -3235,7 +3293,7 @@ Do you really want to delete these activities? libs/ui/src/lib/activities-table/activities-table.component.ts - 270 + 276 @@ -3306,7 +3364,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 214 + 215 @@ -3321,7 +3379,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 375 + 380 @@ -3336,7 +3394,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 387 + 392 @@ -3388,8 +3446,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3603,6 +3661,13 @@ 138 + + Looking for a student discount? + + apps/client/src/app/pages/pricing/pricing-page.html + 359 + + Dividend @@ -3615,7 +3680,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 310 apps/client/src/app/pages/features/features-page.html @@ -3715,21 +3780,14 @@ Calculator apps/client/src/app/pages/portfolio/fire/fire-page.html - 7 - - - - Holdings - - libs/ui/src/lib/assistant/assistant.html - 110 + 7 Pricing - apps/client/src/app/app.component.html - 99 + apps/client/src/app/components/footer/footer.component.html + 49 apps/client/src/app/components/header/header.component.html @@ -3927,7 +3985,7 @@ It’s free. apps/client/src/app/pages/pricing/pricing-page.html - 353 + 379 @@ -3969,18 +4027,11 @@ 281 - - Continue with Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -4202,6 +4253,13 @@ 210 + + User ID + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + + Free Plan @@ -4273,8 +4331,8 @@ Resources - apps/client/src/app/app.component.html - 64 + apps/client/src/app/components/footer/footer.component.html + 14 apps/client/src/app/components/header/header.component.html @@ -4304,6 +4362,13 @@ 37 + + Request it + + apps/client/src/app/pages/pricing/pricing-page.html + 361 + + Access @@ -4358,7 +4423,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 400 + 405 @@ -4369,35 +4434,35 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 413 + 418 Draft libs/ui/src/lib/activities-table/activities-table.component.html - 144 + 142 Clone libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 457 Export Draft as ICS libs/ui/src/lib/activities-table/activities-table.component.html - 450 + 467 Do you really want to delete this activity? libs/ui/src/lib/activities-table/activities-table.component.ts - 280 + 286 @@ -4406,6 +4471,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + 50-Day Trend @@ -4442,6 +4511,13 @@ 117 + + contact us + + apps/client/src/app/pages/pricing/pricing-page.html + 353 + + from ATH @@ -4481,7 +4557,7 @@ Projected Total Amount libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 60 + 59 @@ -4492,7 +4568,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 295 + 298 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -4544,14 +4620,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 312 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -4566,15 +4642,15 @@ Asset Class apps/client/src/app/components/admin-market-data/admin-market-data.html - 115 + 114 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 230 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 303 + 321 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4584,28 +4660,28 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Asset Sub Class apps/client/src/app/components/admin-market-data/admin-market-data.html - 124 + 123 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 221 + 239 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 337 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4720,7 +4796,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -4752,15 +4828,15 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 75 + 74 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 150 + 168 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 39 + 37 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4773,14 +4849,14 @@ Tag - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Year @@ -4789,6 +4865,13 @@ 32 + + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Years @@ -4815,7 +4898,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 238 + 239 libs/ui/src/lib/i18n.ts @@ -5043,11 +5126,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5065,21 +5148,21 @@ Date Range libs/ui/src/lib/assistant/assistant.html - 171 + 170 The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 639 + 672 Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 504 @@ -5153,6 +5236,13 @@ 193 + + Close Holding + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 442 + + Absolute Asset Performance @@ -5183,6 +5273,13 @@ 88 + + here + + apps/client/src/app/pages/pricing/pricing-page.html + 364 + + Asset Performance @@ -5208,35 +5305,43 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 Week to date libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 Month to date libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 MTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 WTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5257,15 +5362,19 @@ 42 - + Reset Filters libs/ui/src/lib/assistant/assistant.html - 266 + 204 year + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 290 @@ -5276,21 +5385,25 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 years + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 - + Apply Filters libs/ui/src/lib/assistant/assistant.html - 276 + 217 @@ -5320,7 +5433,7 @@ Data Gathering apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -5489,7 +5602,14 @@ Join now or check out the example account apps/client/src/app/pages/landing/landing-page.html - 435 + 333 + + + + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 @@ -5517,7 +5637,7 @@ Delete Profiles apps/client/src/app/components/admin-market-data/admin-market-data.html - 243 + 242 @@ -5565,8 +5685,8 @@ Community - apps/client/src/app/app.component.html - 130 + apps/client/src/app/components/footer/footer.component.html + 80 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -5687,6 +5807,13 @@ 99 + + View Holding + + libs/ui/src/lib/activities-table/activities-table.component.html + 444 + + Canada @@ -5725,8 +5852,8 @@ Personal Finance - apps/client/src/app/app.component.html - 57 + apps/client/src/app/components/footer/footer.component.html + 7 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5779,7 +5906,7 @@ Open Source apps/client/src/app/pages/landing/landing-page.html - 261 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5839,22 +5966,22 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 630 + 663 Cancel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 143 + 161 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 580 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 59 + 57 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -5897,6 +6024,13 @@ 9 + + Role + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 31 + + Yes @@ -5915,18 +6049,18 @@ Inactive apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html - 87 + 88 Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 582 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 61 + 59 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6017,6 +6151,13 @@ 55 + + If you plan to open an account at + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + + Performance with currency effect Performance @@ -6027,8 +6168,8 @@ Accounts - libs/ui/src/lib/assistant/assistant.html - 84 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 51 @@ -6095,6 +6236,13 @@ 10 + + to use our referral link and get a Ghostfolio Premium membership for one year + + apps/client/src/app/pages/pricing/pricing-page.html + 357 + + can be self-hosted @@ -6172,7 +6320,7 @@ Oops! Invalid currency. apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 50 + 48 @@ -6244,6 +6392,13 @@ 291 + + Engagement per Day + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 76 + + Guides @@ -6327,6 +6482,13 @@ 26 + + Country + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 37 + + API Key @@ -6345,28 +6507,28 @@ Could not generate an API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 Do you really want to generate a new API key? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 Ghostfolio Premium Data Provider API Key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 Set this API key in your self-hosted environment: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -6387,11 +6549,11 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 591 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 70 + 68 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6452,7 +6614,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 251 + 260 @@ -6480,56 +6642,63 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 432 + 454 + + + + API Requests Today + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 86 Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 391 + 413 Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 470 Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 404 + 426 real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -6554,7 +6723,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -6573,11 +6742,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -6661,32 +6830,32 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 237 Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 169 + 170 Generate Security Token apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -6699,8 +6868,8 @@ Terms of Service - apps/client/src/app/app.component.html - 112 + apps/client/src/app/components/footer/footer.component.html + 62 libs/common/src/lib/routes/routes.ts @@ -6737,21 +6906,21 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 566 + 599 An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 574 + 607 Apply apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 153 @@ -6855,13 +7024,6 @@ 275 - - Name - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - Set up @@ -6904,29 +7066,22 @@ 158 - + Quick Links libs/ui/src/lib/assistant/assistant.html 58 - - Asset Profiles - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 452 + 349 libs/common/src/lib/routes/routes.ts @@ -7038,6 +7193,13 @@ 3 + + Current month + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + + new @@ -7198,7 +7360,7 @@ Do you really want to generate a new security token? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 174 + 175 @@ -7234,7 +7396,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 466 @@ -7255,7 +7417,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 110 + 113 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -7599,6 +7761,13 @@ 128 + + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 23 + + Join the Ghostfolio Slack community diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 1ab9e776e..1595ea726 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -215,8 +215,8 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. 交易存在巨大亏损风险,因此不应投入您短期内可能急需的资金。 - apps/client/src/app/app.component.html - 221 + apps/client/src/app/components/footer/footer.component.html + 171 @@ -239,6 +239,14 @@ 11 + + please + please + + apps/client/src/app/pages/pricing/pricing-page.html + 350 + + Type 类型 @@ -256,7 +264,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 160 + 161 @@ -348,11 +356,11 @@ 名称 apps/client/src/app/components/admin-market-data/admin-market-data.html - 89 + 88 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 286 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -388,7 +396,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 137 + 135 + + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -416,15 +428,15 @@ 货币 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 183 + 201 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 293 + 311 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 47 + 45 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -440,7 +452,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 280 + 281 @@ -476,11 +488,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 297 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -504,7 +516,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 268 + 267 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -520,7 +532,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 451 @@ -528,11 +540,11 @@ 删除 apps/client/src/app/components/admin-market-data/admin-market-data.html - 290 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 68 + 86 apps/client/src/app/components/admin-overview/admin-overview.html @@ -556,7 +568,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 461 + 478 libs/ui/src/lib/benchmark/benchmark.component.html @@ -588,7 +600,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 567 @@ -600,11 +612,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 106 + 105 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 179 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -712,7 +724,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 169 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -724,7 +736,7 @@ 市场价 apps/client/src/app/components/admin-market-data/admin-market-data.html - 133 + 132 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -784,11 +796,11 @@ 首笔交易 apps/client/src/app/components/admin-market-data/admin-market-data.html - 148 + 147 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 194 + 212 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -804,7 +816,7 @@ 活动计数 apps/client/src/app/components/admin-market-data/admin-market-data.html - 157 + 156 @@ -812,7 +824,7 @@ 历史数据 apps/client/src/app/components/admin-market-data/admin-market-data.html - 166 + 165 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -824,7 +836,7 @@ 行业数 apps/client/src/app/components/admin-market-data/admin-market-data.html - 175 + 174 @@ -832,7 +844,7 @@ 国家数 apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 183 @@ -840,11 +852,11 @@ 收集个人资料数据 apps/client/src/app/components/admin-market-data/admin-market-data.html - 235 + 234 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 48 + 66 @@ -884,7 +896,7 @@ 行业 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 239 + 257 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -896,7 +908,7 @@ 国家 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 250 + 268 apps/client/src/app/components/admin-users/admin-users.html @@ -912,11 +924,11 @@ 行业 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 256 + 274 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -932,11 +944,11 @@ 国家 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 266 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 504 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -948,7 +960,7 @@ 代码映射 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 357 + 379 @@ -964,7 +976,7 @@ 刮削配置 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 382 + 404 @@ -972,7 +984,7 @@ 笔记 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 529 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1004,7 +1016,7 @@ 手动添加 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 19 + 18 @@ -1012,11 +1024,11 @@ 名称、代码或 ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 132 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 29 + 27 apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html @@ -1096,7 +1108,7 @@ 添加货币 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 22 + 20 @@ -1167,6 +1179,14 @@ 200 + + Activities + Activities + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 61 + + Add Platform 添加平台 @@ -1180,11 +1200,11 @@ 网址 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 464 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 516 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1200,7 +1220,7 @@ 您真的要删除这个平台吗? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 108 @@ -1211,6 +1231,14 @@ 8 + + Current year + Current year + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + + Add platform 添加平台 @@ -1256,7 +1284,7 @@ 您真的要删除此标签吗? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 103 + 104 @@ -1280,7 +1308,7 @@ 您真的要删除该用户吗? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 211 @@ -1316,7 +1344,7 @@ 模拟用户 apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -1324,7 +1352,7 @@ 删除用户 apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -1372,7 +1400,7 @@ 基准 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 351 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1407,14 +1435,6 @@ 5 - - Get started - 开始使用 - - apps/client/src/app/components/header/header.component.html - 432 - - Sign in 登入 @@ -1424,11 +1444,11 @@ apps/client/src/app/components/header/header.component.ts - 279 + 283 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 60 libs/common/src/lib/routes/routes.ts @@ -1444,11 +1464,11 @@ 哎呀!安全令牌不正确。 apps/client/src/app/components/header/header.component.ts - 294 + 298 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 153 + 154 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1587,6 +1607,14 @@ 52 + + Current week + Current week + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + + Add activity 添加活动 @@ -1652,15 +1680,15 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 451 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1670,6 +1698,10 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html 81 + + apps/client/src/app/pages/pricing/pricing-page.html + 343 + apps/client/src/app/pages/register/register-page.html 31 @@ -1679,20 +1711,12 @@ 30 - - Sign in with Internet Identity - 使用互联网身份登录 - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 - - Sign in with Google 使用 Google 登录 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 37 @@ -1700,7 +1724,7 @@ 保持登录 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 48 @@ -1796,7 +1820,7 @@ 净值 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 264 @@ -1804,7 +1828,7 @@ 年化业绩 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 274 + 277 @@ -1844,7 +1868,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 190 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2036,39 +2060,55 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 YTD 年初至今 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 204 + libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 1Y 1年 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 5Y 5年 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 Max 最大限度 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 216 + libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -2100,7 +2140,7 @@ 请输入您的优惠券代码。 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -2108,7 +2148,7 @@ 无法兑换优惠券代码 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -2116,7 +2156,7 @@ 优惠券代码已被兑换 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -2124,7 +2164,7 @@ 重新加载 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -2216,7 +2256,7 @@ 语言环境 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 419 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2368,7 +2408,7 @@ 好的 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -2383,8 +2423,8 @@ About 关于 - apps/client/src/app/app.component.html - 70 + apps/client/src/app/components/footer/footer.component.html + 20 apps/client/src/app/components/header/header.component.html @@ -2407,8 +2447,8 @@ Changelog 更新日志 - apps/client/src/app/app.component.html - 77 + apps/client/src/app/components/footer/footer.component.html + 27 apps/client/src/app/pages/about/changelog/changelog-page.html @@ -2423,8 +2463,8 @@ License 许可证 - apps/client/src/app/app.component.html - 89 + apps/client/src/app/components/footer/footer.component.html + 39 apps/client/src/app/pages/about/license/license-page.html @@ -2439,8 +2479,8 @@ Privacy Policy 隐私政策 - apps/client/src/app/app.component.html - 105 + apps/client/src/app/components/footer/footer.component.html + 55 apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html @@ -2514,13 +2554,17 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Oops, cash balance transfer has failed. 糟糕,现金余额转账失败。 apps/client/src/app/pages/accounts/accounts-page.component.ts - 324 + 339 @@ -2628,7 +2672,7 @@ 概述 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 113 apps/client/src/app/components/header/header.component.html @@ -2663,8 +2707,8 @@ Blog 博客 - apps/client/src/app/app.component.html - 74 + apps/client/src/app/components/footer/footer.component.html + 24 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html @@ -2783,8 +2827,8 @@ Frequently Asked Questions (FAQ) 常见问题 (FAQ) - apps/client/src/app/app.component.html - 83 + apps/client/src/app/components/footer/footer.component.html + 33 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -2803,8 +2847,8 @@ Features 功能 - apps/client/src/app/app.component.html - 79 + apps/client/src/app/components/footer/footer.component.html + 29 apps/client/src/app/components/header/header.component.html @@ -2926,14 +2970,34 @@ Get Started 立即开始 + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Holdings @@ -2958,6 +3022,10 @@ libs/common/src/lib/routes/routes.ts 167 + + libs/ui/src/lib/assistant/assistant.html + 110 + Summary @@ -2975,8 +3043,12 @@ Markets 市场 - apps/client/src/app/app.component.html - 61 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + + + apps/client/src/app/components/footer/footer.component.html + 11 apps/client/src/app/components/header/header.component.html @@ -3063,32 +3135,12 @@ 11 - - Get Started - 开始使用 - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 447 - - - apps/client/src/app/pages/pricing/pricing-page.html - 351 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - Monthly Active Users 每月活跃用户数 apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -3096,7 +3148,7 @@ GitHub 上的星星 apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -3108,7 +3160,7 @@ Docker Hub 拉取次数 apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -3120,7 +3172,7 @@ 如图所示 apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -3128,7 +3180,7 @@ 保护你的资产。完善你的个人投资策略 apps/client/src/app/pages/landing/landing-page.html - 226 + 124 @@ -3136,7 +3188,7 @@ Ghostfolio 使忙碌的人们能够在不被追踪的情况下跟踪股票、ETF 或加密货币。 apps/client/src/app/pages/landing/landing-page.html - 230 + 128 @@ -3144,7 +3196,7 @@ 360° 视角 apps/client/src/app/pages/landing/landing-page.html - 240 + 138 @@ -3152,7 +3204,7 @@ 跨多个平台全面了解您的个人财务状况。 apps/client/src/app/pages/landing/landing-page.html - 243 + 141 @@ -3160,7 +3212,7 @@ Web3 就绪 apps/client/src/app/pages/landing/landing-page.html - 251 + 149 @@ -3168,7 +3220,7 @@ 匿名使用 Ghostfolio 并拥有您的财务数据。 apps/client/src/app/pages/landing/landing-page.html - 254 + 152 @@ -3176,7 +3228,7 @@ 通过强大的社区不断改进,从中受益。 apps/client/src/app/pages/landing/landing-page.html - 264 + 162 @@ -3192,7 +3244,7 @@ 为什么使用Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 272 + 170 @@ -3200,7 +3252,7 @@ 如果您符合以下条件,那么 Ghostfolio 适合您... apps/client/src/app/pages/landing/landing-page.html - 274 + 172 @@ -3208,7 +3260,7 @@ 在多个平台上交易股票、ETF 或加密货币 apps/client/src/app/pages/landing/landing-page.html - 280 + 178 @@ -3216,7 +3268,7 @@ 采取买入并持有策略 apps/client/src/app/pages/landing/landing-page.html - 286 + 184 @@ -3224,7 +3276,7 @@ 有兴趣深入了解您的投资组合构成 apps/client/src/app/pages/landing/landing-page.html - 291 + 189 @@ -3232,7 +3284,7 @@ 重视隐私和数据所有权 apps/client/src/app/pages/landing/landing-page.html - 296 + 194 @@ -3240,7 +3292,7 @@ 进入极简主义 apps/client/src/app/pages/landing/landing-page.html - 299 + 197 @@ -3248,7 +3300,7 @@ 关心您的财务资源多元化 apps/client/src/app/pages/landing/landing-page.html - 303 + 201 @@ -3256,7 +3308,7 @@ 对财务独立感兴趣 apps/client/src/app/pages/landing/landing-page.html - 307 + 205 @@ -3264,7 +3316,7 @@ 年对电子表格说不 apps/client/src/app/pages/landing/landing-page.html - 311 + 209 @@ -3272,7 +3324,7 @@ 仍在阅读此列表 apps/client/src/app/pages/landing/landing-page.html - 314 + 212 @@ -3280,7 +3332,7 @@ 了解有关 Ghostfolio 的更多信息 apps/client/src/app/pages/landing/landing-page.html - 319 + 217 @@ -3288,7 +3340,7 @@ 听听我们的用户怎么说 apps/client/src/app/pages/landing/landing-page.html - 328 + 226 @@ -3296,7 +3348,7 @@ 来自世界各地的会员正在使用Ghostfolio 高级版 apps/client/src/app/pages/landing/landing-page.html - 367 + 265 @@ -3304,7 +3356,7 @@ Ghostfolio 如何工作? apps/client/src/app/pages/landing/landing-page.html - 384 + 282 @@ -3312,7 +3364,7 @@ 只需 3 步即可开始 apps/client/src/app/pages/landing/landing-page.html - 386 + 284 @@ -3328,7 +3380,7 @@ 匿名注册* apps/client/src/app/pages/landing/landing-page.html - 392 + 290 @@ -3336,7 +3388,7 @@ * 无需电子邮件地址或信用卡 apps/client/src/app/pages/landing/landing-page.html - 394 + 292 @@ -3344,7 +3396,7 @@ 添加您的任何历史交易 apps/client/src/app/pages/landing/landing-page.html - 406 + 304 @@ -3352,7 +3404,7 @@ 获取有关您的投资组合构成的宝贵见解 apps/client/src/app/pages/landing/landing-page.html - 418 + 316 @@ -3360,7 +3412,7 @@ 准备好了吗? apps/client/src/app/pages/landing/landing-page.html - 432 + 330 @@ -3387,6 +3439,14 @@ 62 + + with your university e-mail address + with your university e-mail address + + apps/client/src/app/pages/pricing/pricing-page.html + 365 + + Active Users 活跃用户 @@ -3480,7 +3540,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 221 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -3516,7 +3576,7 @@ 您确定要删除这些活动吗? libs/ui/src/lib/activities-table/activities-table.component.ts - 270 + 276 @@ -3596,7 +3656,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 214 + 215 @@ -3612,7 +3672,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 375 + 380 @@ -3628,7 +3688,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 387 + 392 @@ -3687,8 +3747,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3927,6 +3987,14 @@ 138 + + Looking for a student discount? + Looking for a student discount? + + apps/client/src/app/pages/pricing/pricing-page.html + 359 + + Dividend 股息 @@ -3940,7 +4008,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 310 apps/client/src/app/pages/features/features-page.html @@ -4055,20 +4123,12 @@ 7 - - Holdings - 持仓 - - libs/ui/src/lib/assistant/assistant.html - 110 - - Pricing 价格 - apps/client/src/app/app.component.html - 99 + apps/client/src/app/components/footer/footer.component.html + 49 apps/client/src/app/components/header/header.component.html @@ -4284,7 +4344,7 @@ 免费。 apps/client/src/app/pages/pricing/pricing-page.html - 353 + 379 @@ -4327,16 +4387,8 @@ 81 - libs/common/src/lib/routes/routes.ts - 281 - - - - Continue with Internet Identity - 继续互联网身份 - - apps/client/src/app/pages/register/register-page.html - 42 + libs/common/src/lib/routes/routes.ts + 281 @@ -4344,7 +4396,7 @@ 继续使用谷歌 apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -4588,6 +4640,14 @@ 210 + + User ID + User ID + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + + Free Plan 免费计划 @@ -4668,8 +4728,8 @@ Resources 资源 - apps/client/src/app/app.component.html - 64 + apps/client/src/app/components/footer/footer.component.html + 14 apps/client/src/app/components/header/header.component.html @@ -4700,6 +4760,14 @@ 37 + + Request it + Request it + + apps/client/src/app/pages/pricing/pricing-page.html + 361 + + Access 权限 @@ -4761,7 +4829,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 400 + 405 @@ -4773,7 +4841,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 413 + 418 @@ -4781,7 +4849,7 @@ 草稿 libs/ui/src/lib/activities-table/activities-table.component.html - 144 + 142 @@ -4789,7 +4857,7 @@ 克隆 libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 457 @@ -4797,7 +4865,7 @@ 将汇票导出为 ICS libs/ui/src/lib/activities-table/activities-table.component.html - 450 + 467 @@ -4805,7 +4873,7 @@ 您确实要删除此活动吗? libs/ui/src/lib/activities-table/activities-table.component.ts - 280 + 286 @@ -4815,6 +4883,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + 50-Day Trend @@ -4856,6 +4928,14 @@ 117 + + contact us + contact us + + apps/client/src/app/pages/pricing/pricing-page.html + 353 + + from ATH 从 ATH @@ -4901,7 +4981,7 @@ 预计总额 libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 60 + 59 @@ -4913,7 +4993,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 295 + 298 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -4969,14 +5049,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 312 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -4993,15 +5073,15 @@ 资产类别 apps/client/src/app/components/admin-market-data/admin-market-data.html - 115 + 114 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 212 + 230 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 303 + 321 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5011,29 +5091,29 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Asset Sub Class 资产子类别 apps/client/src/app/components/admin-market-data/admin-market-data.html - 124 + 123 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 221 + 239 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 337 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5161,7 +5241,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -5197,15 +5277,15 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 75 + 74 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 150 + 168 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 39 + 37 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5219,14 +5299,14 @@ Tag 标签 - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Year @@ -5236,6 +5316,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Years @@ -5265,7 +5353,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 238 + 239 libs/ui/src/lib/i18n.ts @@ -5521,11 +5609,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5545,7 +5633,7 @@ 日期范围 libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5553,7 +5641,7 @@ 当前市场价格为 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 639 + 672 @@ -5561,7 +5649,7 @@ 测试 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 504 @@ -5644,6 +5732,14 @@ 193 + + Close Holding + Close Holding + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 442 + + Absolute Asset Performance 绝对资产回报 @@ -5676,6 +5772,14 @@ 88 + + here + here + + apps/client/src/app/pages/pricing/pricing-page.html + 364 + + Asset Performance 资产回报 @@ -5705,7 +5809,7 @@ 今年迄今为止 libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5713,7 +5817,7 @@ 本周至今 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5721,23 +5825,31 @@ 本月至今 libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 MTD 本月至今 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 WTD 本周至今 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 196 + libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5760,17 +5872,21 @@ 42 - + Reset Filters 重置过滤器 libs/ui/src/lib/assistant/assistant.html - 266 + 204 year + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 208 + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 290 @@ -5781,23 +5897,27 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 years + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 212 + libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 - + Apply Filters 应用过滤器 libs/ui/src/lib/assistant/assistant.html - 276 + 217 @@ -5830,7 +5950,7 @@ 数据收集 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6022,7 +6142,15 @@ 立即加入 或查看示例账户 apps/client/src/app/pages/landing/landing-page.html - 435 + 333 + + + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 @@ -6054,7 +6182,7 @@ 删除配置文件 apps/client/src/app/components/admin-market-data/admin-market-data.html - 243 + 242 @@ -6125,8 +6253,8 @@ Community 社区 - apps/client/src/app/app.component.html - 130 + apps/client/src/app/components/footer/footer.component.html + 80 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -6198,7 +6326,7 @@ 开源 apps/client/src/app/pages/landing/landing-page.html - 261 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6209,8 +6337,8 @@ Personal Finance 个人理财 - apps/client/src/app/app.component.html - 57 + apps/client/src/app/components/footer/footer.component.html + 7 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6297,6 +6425,14 @@ 83 + + View Holding + View Holding + + libs/ui/src/lib/activities-table/activities-table.component.html + 444 + + Canada 加拿大 @@ -6414,7 +6550,7 @@ 错误 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 630 + 663 @@ -6454,7 +6590,7 @@ 非活跃 apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html - 87 + 88 @@ -6462,15 +6598,15 @@ 取消 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 143 + 161 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 580 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 59 + 57 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6518,11 +6654,11 @@ 关闭 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 582 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 61 + 59 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -6557,6 +6693,14 @@ 11 + + Role + Role + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 31 + + Yes @@ -6569,8 +6713,8 @@ Accounts Accounts - libs/ui/src/lib/assistant/assistant.html - 84 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 51 @@ -6597,6 +6741,14 @@ 63 + + If you plan to open an account at + If you plan to open an account at + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + + Performance with currency effect Performance 含货币影响的表现 表现 @@ -6666,7 +6818,7 @@ 哎呀!无效的货币。 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 50 + 48 @@ -6701,6 +6853,14 @@ 163 + + to use our referral link and get a Ghostfolio Premium membership for one year + to use our referral link and get a Ghostfolio Premium membership for one year + + apps/client/src/app/pages/pricing/pricing-page.html + 357 + + can be self-hosted 可以自托管 @@ -6845,6 +7005,14 @@ 293 + + Engagement per Day + Engagement per Day + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 76 + + Guides 指南 @@ -6956,7 +7124,7 @@ 无法生成 API 密钥 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -6964,7 +7132,7 @@ 在您的自托管环境中设置此 API 密钥: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -6972,7 +7140,7 @@ Ghostfolio Premium 数据提供者 API 密钥 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -6980,7 +7148,15 @@ 您确定要生成新的 API 密钥吗? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 + + + + Country + Country + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 37 @@ -7020,11 +7196,11 @@ 保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 591 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html - 70 + 68 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -7072,7 +7248,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 251 + 260 @@ -7120,7 +7296,7 @@ 延迟 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7128,7 +7304,15 @@ 即时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 + + + + API Requests Today + API Requests Today + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 86 @@ -7136,7 +7320,7 @@ 默认市场价格 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 391 + 413 @@ -7144,7 +7328,7 @@ 模式 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 432 + 454 @@ -7152,7 +7336,7 @@ 选择器 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 470 @@ -7160,7 +7344,7 @@ HTTP 请求标头 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 404 + 426 @@ -7168,7 +7352,7 @@ 收盘 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 203 + 230 @@ -7176,7 +7360,7 @@ 实时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 207 + 234 @@ -7204,7 +7388,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7224,11 +7408,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7324,11 +7508,11 @@ 安全令牌 apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 169 + 170 @@ -7336,7 +7520,7 @@ 您确定要为此用户生成新的安全令牌吗? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 237 @@ -7344,7 +7528,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7352,7 +7536,7 @@ 生成安全令牌 apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -7388,8 +7572,8 @@ Terms of Service 服务条款 - apps/client/src/app/app.component.html - 112 + apps/client/src/app/components/footer/footer.component.html + 62 libs/common/src/lib/routes/routes.ts @@ -7409,7 +7593,7 @@ () 已在使用中。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 566 + 599 @@ -7417,7 +7601,7 @@ 在更新到 () 时发生错误。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 574 + 607 @@ -7425,7 +7609,7 @@ 应用 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 153 @@ -7441,7 +7625,7 @@ 收集近期历史市场数据 apps/client/src/app/components/admin-market-data/admin-market-data.html - 226 + 225 @@ -7449,7 +7633,7 @@ 收集所有历史市场数据 apps/client/src/app/components/admin-market-data/admin-market-data.html - 231 + 230 @@ -7457,7 +7641,7 @@ 收集历史市场数据 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 33 + 34 @@ -7613,15 +7797,7 @@ 158 - - Name - 名称 - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links 快速链接 @@ -7629,24 +7805,16 @@ 58 - - Asset Profiles - 资产概况 - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo 现场演示 apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 452 + 349 libs/common/src/lib/routes/routes.ts @@ -7771,6 +7939,14 @@ 5 + + Current month + Current month + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 200 + + new 新增 @@ -7937,7 +8113,7 @@ 您真的想要生成一个新的安全令牌吗? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 174 + 175 @@ -7993,7 +8169,7 @@ 管理资产概况 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 466 @@ -8017,7 +8193,7 @@ 平均单位价格 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 110 + 113 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -8408,6 +8584,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 23 + + Follow Ghostfolio on LinkedIn 在 LinkedIn 上关注 Ghostfolio diff --git a/apps/client/src/main.ts b/apps/client/src/main.ts index 2f656ddf2..fc8a9ef7a 100644 --- a/apps/client/src/main.ts +++ b/apps/client/src/main.ts @@ -1,17 +1,45 @@ import { locale } from '@ghostfolio/common/config'; -import { InfoItem } from '@ghostfolio/common/interfaces'; +import { InfoResponse } from '@ghostfolio/common/interfaces'; import { filterGlobalPermissions } from '@ghostfolio/common/permissions'; -import { enableProdMode } from '@angular/core'; -import { LOCALE_ID } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { Platform } from '@angular/cdk/platform'; +import { + provideHttpClient, + withInterceptorsFromDi +} from '@angular/common/http'; +import { enableProdMode, importProvidersFrom, LOCALE_ID } from '@angular/core'; +import { + DateAdapter, + MAT_DATE_FORMATS, + MAT_DATE_LOCALE, + MatNativeDateModule +} from '@angular/material/core'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { bootstrapApplication } from '@angular/platform-browser'; +import { provideAnimations } from '@angular/platform-browser/animations'; +import { RouterModule, TitleStrategy } from '@angular/router'; +import { ServiceWorkerModule } from '@angular/service-worker'; +import { provideIonicAngular } from '@ionic/angular/standalone'; +import { provideMarkdown } from 'ngx-markdown'; +import { provideNgxSkeletonLoader } from 'ngx-skeleton-loader'; +import { NgxStripeModule, STRIPE_PUBLISHABLE_KEY } from 'ngx-stripe'; -import { AppModule } from './app/app.module'; +import { CustomDateAdapter } from './app/adapter/custom-date-adapter'; +import { DateFormats } from './app/adapter/date-formats'; +import { GfAppComponent } from './app/app.component'; +import { routes } from './app/app.routes'; +import { authInterceptorProviders } from './app/core/auth.interceptor'; +import { httpResponseInterceptorProviders } from './app/core/http-response.interceptor'; +import { LanguageService } from './app/core/language.service'; +import { ModulePreloadService } from './app/core/module-preload.service'; +import { GfNotificationModule } from './app/core/notification/notification.module'; +import { PageTitleStrategy } from './app/services/page-title.strategy'; import { environment } from './environments/environment'; (async () => { const response = await fetch('/api/v1/info'); - const info: InfoItem = await response.json(); + const info: InfoResponse = await response.json(); const utmSource = window.localStorage.getItem('utm_source') as | 'ios' | 'trusted-web-activity'; @@ -29,9 +57,54 @@ import { environment } from './environments/environment'; enableProdMode(); } - platformBrowserDynamic() - .bootstrapModule(AppModule, { - providers: [{ provide: LOCALE_ID, useValue: locale }] - }) - .catch((error) => console.error(error)); + await bootstrapApplication(GfAppComponent, { + providers: [ + authInterceptorProviders, + httpResponseInterceptorProviders, + importProvidersFrom( + GfNotificationModule, + MatNativeDateModule, + MatSnackBarModule, + MatTooltipModule, + NgxStripeModule.forRoot(environment.stripePublicKey), + RouterModule.forRoot(routes, { + anchorScrolling: 'enabled', + preloadingStrategy: ModulePreloadService, + scrollPositionRestoration: 'top' + }), + ServiceWorkerModule.register('ngsw-worker.js', { + enabled: environment.production, + registrationStrategy: 'registerImmediately' + }) + ), + LanguageService, + ModulePreloadService, + provideAnimations(), + provideHttpClient(withInterceptorsFromDi()), + provideIonicAngular(), + provideMarkdown(), + provideNgxSkeletonLoader(), + { + deps: [LanguageService, MAT_DATE_LOCALE, Platform], + provide: DateAdapter, + useClass: CustomDateAdapter + }, + { + provide: LOCALE_ID, + useValue: locale + }, + { + provide: MAT_DATE_FORMATS, + useValue: DateFormats + }, + { + provide: STRIPE_PUBLISHABLE_KEY, + useFactory: () => environment.stripePublicKey + }, + { + provide: TitleStrategy, + useClass: PageTitleStrategy + } + ] + }); })(); diff --git a/apps/client/src/styles/theme.scss b/apps/client/src/styles/theme.scss index fe9fd44a5..8dd6d8e36 100644 --- a/apps/client/src/styles/theme.scss +++ b/apps/client/src/styles/theme.scss @@ -1,9 +1,6 @@ @use '@angular/material' as mat; -$dark-primary-text: rgba(black, 0.87); -$light-primary-text: white; - -$mat-css-dark-theme-selector: '.theme-dark'; +@use './variables.scss' as variables; $gf-primary: ( 50: var(--gf-theme-primary-50), @@ -21,20 +18,20 @@ $gf-primary: ( A400: var(--gf-theme-primary-A400), A700: var(--gf-theme-primary-A700), contrast: ( - 50: $dark-primary-text, - 100: $dark-primary-text, - 200: $dark-primary-text, - 300: $light-primary-text, - 400: $light-primary-text, - 500: $light-primary-text, - 600: $light-primary-text, - 700: $light-primary-text, - 800: $light-primary-text, - 900: $light-primary-text, - A100: $dark-primary-text, - A200: $light-primary-text, - A400: $light-primary-text, - A700: $light-primary-text + 50: variables.$dark-primary-text, + 100: variables.$dark-primary-text, + 200: variables.$dark-primary-text, + 300: variables.$light-primary-text, + 400: variables.$light-primary-text, + 500: variables.$light-primary-text, + 600: variables.$light-primary-text, + 700: variables.$light-primary-text, + 800: variables.$light-primary-text, + 900: variables.$light-primary-text, + A100: variables.$dark-primary-text, + A200: variables.$light-primary-text, + A400: variables.$light-primary-text, + A700: variables.$light-primary-text ) ); @@ -54,20 +51,20 @@ $gf-secondary: ( A400: var(--gf-theme-secondary-A400), A700: var(--gf-theme-secondary-A700), contrast: ( - 50: $dark-primary-text, - 100: $dark-primary-text, - 200: $dark-primary-text, - 300: $light-primary-text, - 400: $light-primary-text, - 500: $light-primary-text, - 600: $light-primary-text, - 700: $light-primary-text, - 800: $light-primary-text, - 900: $light-primary-text, - A100: $dark-primary-text, - A200: $light-primary-text, - A400: $light-primary-text, - A700: $light-primary-text + 50: variables.$dark-primary-text, + 100: variables.$dark-primary-text, + 200: variables.$dark-primary-text, + 300: variables.$light-primary-text, + 400: variables.$light-primary-text, + 500: variables.$light-primary-text, + 600: variables.$light-primary-text, + 700: variables.$light-primary-text, + 800: variables.$light-primary-text, + 900: variables.$light-primary-text, + A100: variables.$dark-primary-text, + A200: variables.$light-primary-text, + A400: variables.$light-primary-text, + A700: variables.$light-primary-text ) ); diff --git a/apps/client/src/styles/variables.scss b/apps/client/src/styles/variables.scss new file mode 100644 index 000000000..dcf26eecc --- /dev/null +++ b/apps/client/src/styles/variables.scss @@ -0,0 +1,4 @@ +$dark-primary-text: rgba(black, 0.87); +$light-primary-text: white; + +$mat-css-dark-theme-selector: '.theme-dark'; diff --git a/eslint.config.cjs b/eslint.config.cjs index c7e08821c..a88d0cc85 100644 --- a/eslint.config.cjs +++ b/eslint.config.cjs @@ -152,7 +152,6 @@ module.exports = [ // The following rules are part of eslint:recommended // and can be remove once solved - 'no-constant-binary-expression': 'warn', 'no-loss-of-precision': 'warn', // The following rules are part of @typescript-eslint/recommended-type-checked @@ -170,7 +169,6 @@ module.exports = [ '@typescript-eslint/no-unsafe-argument': 'warn', '@typescript-eslint/no-unsafe-assignment': 'warn', '@typescript-eslint/no-unsafe-enum-comparison': 'warn', - '@typescript-eslint/no-unsafe-function-type': 'warn', '@typescript-eslint/no-unsafe-member-access': 'warn', '@typescript-eslint/no-unsafe-return': 'warn', '@typescript-eslint/no-unsafe-call': 'warn', @@ -189,8 +187,7 @@ module.exports = [ // The following rules are part of @typescript-eslint/stylistic-type-checked // and can be remove once solved - '@typescript-eslint/prefer-nullish-coalescing': 'warn', // TODO: Requires strictNullChecks: true - '@typescript-eslint/prefer-regexp-exec': 'warn' + '@typescript-eslint/prefer-nullish-coalescing': 'warn' // TODO: Requires strictNullChecks: true } })) ]; diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index 97b762267..7452b604c 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -375,7 +375,7 @@ export function parseDate(date: string): Date { // Transform 'yyyyMMdd' format to supported format by parse function if (date?.length === 8) { - const match = date.match(/^(\d{4})(\d{2})(\d{2})$/); + const match = /^(\d{4})(\d{2})(\d{2})$/.exec(date); if (match) { const [, year, month, day] = match; diff --git a/libs/common/src/lib/interfaces/admin-user.interface.ts b/libs/common/src/lib/interfaces/admin-user.interface.ts new file mode 100644 index 000000000..872abca90 --- /dev/null +++ b/libs/common/src/lib/interfaces/admin-user.interface.ts @@ -0,0 +1,13 @@ +import { Role } from '@prisma/client'; + +export interface AdminUser { + accountCount: number; + activityCount: number; + country: string; + createdAt: Date; + dailyApiRequests: number; + engagement: number; + id: string; + lastActivity: Date; + role: Role; +} diff --git a/libs/common/src/lib/interfaces/admin-users.interface.ts b/libs/common/src/lib/interfaces/admin-users.interface.ts deleted file mode 100644 index 79031425a..000000000 --- a/libs/common/src/lib/interfaces/admin-users.interface.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Role } from '@prisma/client'; - -export interface AdminUsers { - count: number; - users: { - accountCount: number; - activityCount: number; - country: string; - createdAt: Date; - dailyApiRequests: number; - engagement: number; - id: string; - lastActivity: Date; - role: Role; - }[]; -} diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index 1da2236e8..899813f30 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -7,16 +7,14 @@ import type { AdminMarketData, AdminMarketDataItem } from './admin-market-data.interface'; -import type { AdminUsers } from './admin-users.interface'; +import type { AdminUser } from './admin-user.interface'; import type { AssetClassSelectorOption } from './asset-class-selector-option.interface'; import type { AssetProfileIdentifier } from './asset-profile-identifier.interface'; -import type { BenchmarkMarketDataDetails } from './benchmark-market-data-details.interface'; import type { BenchmarkProperty } from './benchmark-property.interface'; import type { Benchmark } from './benchmark.interface'; import type { Coupon } from './coupon.interface'; import type { DataProviderInfo } from './data-provider-info.interface'; import type { EnhancedSymbolProfile } from './enhanced-symbol-profile.interface'; -import type { Export } from './export.interface'; import type { FilterGroup } from './filter-group.interface'; import type { Filter } from './filter.interface'; import type { FireWealth } from './fire-wealth.interface'; @@ -30,8 +28,6 @@ import type { LookupItem } from './lookup-item.interface'; import type { MarketData } from './market-data.interface'; import type { PortfolioChart } from './portfolio-chart.interface'; import type { PortfolioDetails } from './portfolio-details.interface'; -import type { PortfolioDividends } from './portfolio-dividends.interface'; -import type { PortfolioInvestments } from './portfolio-investments.interface'; import type { PortfolioPerformance } from './portfolio-performance.interface'; import type { PortfolioPosition } from './portfolio-position.interface'; import type { PortfolioReportRule } from './portfolio-report-rule.interface'; @@ -41,23 +37,34 @@ import type { Product } from './product'; import type { AccessTokenResponse } from './responses/access-token-response.interface'; import type { AccountBalancesResponse } from './responses/account-balances-response.interface'; import type { AccountsResponse } from './responses/accounts-response.interface'; +import type { ActivitiesResponse } from './responses/activities-response.interface'; +import type { ActivityResponse } from './responses/activity-response.interface'; +import type { AdminUserResponse } from './responses/admin-user-response.interface'; +import type { AdminUsersResponse } from './responses/admin-users-response.interface'; import type { AiPromptResponse } from './responses/ai-prompt-response.interface'; import type { ApiKeyResponse } from './responses/api-key-response.interface'; +import type { AssetResponse } from './responses/asset-response.interface'; +import type { BenchmarkMarketDataDetailsResponse } from './responses/benchmark-market-data-details-response.interface'; import type { BenchmarkResponse } from './responses/benchmark-response.interface'; +import type { CreateStripeCheckoutSessionResponse } from './responses/create-stripe-checkout-session-response.interface'; import type { DataEnhancerHealthResponse } from './responses/data-enhancer-health-response.interface'; import type { DataProviderGhostfolioAssetProfileResponse } from './responses/data-provider-ghostfolio-asset-profile-response.interface'; import type { DataProviderGhostfolioStatusResponse } from './responses/data-provider-ghostfolio-status-response.interface'; import type { DataProviderHealthResponse } from './responses/data-provider-health-response.interface'; import type { DividendsResponse } from './responses/dividends-response.interface'; import type { ResponseError } from './responses/errors.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'; +import type { InfoResponse } from './responses/info-response.interface'; import type { LookupResponse } from './responses/lookup-response.interface'; import type { MarketDataDetailsResponse } from './responses/market-data-details-response.interface'; import type { MarketDataOfMarketsResponse } from './responses/market-data-of-markets-response.interface'; import type { OAuthResponse } from './responses/oauth-response.interface'; +import type { PortfolioDividendsResponse } from './responses/portfolio-dividends-response.interface'; import { PortfolioHoldingResponse } from './responses/portfolio-holding-response.interface'; import type { PortfolioHoldingsResponse } from './responses/portfolio-holdings-response.interface'; +import type { PortfolioInvestmentsResponse } from './responses/portfolio-investments.interface'; import type { PortfolioPerformanceResponse } from './responses/portfolio-performance-response.interface'; import type { PortfolioReportResponse } from './responses/portfolio-report.interface'; import type { PublicPortfolioResponse } from './responses/public-portfolio-response.interface'; @@ -80,21 +87,27 @@ export { AccountBalance, AccountBalancesResponse, AccountsResponse, + ActivitiesResponse, + ActivityResponse, AdminData, AdminJobs, AdminMarketData, AdminMarketDataDetails, AdminMarketDataItem, - AdminUsers, + AdminUser, + AdminUserResponse, + AdminUsersResponse, AiPromptResponse, ApiKeyResponse, AssetClassSelectorOption, AssetProfileIdentifier, + AssetResponse, Benchmark, - BenchmarkMarketDataDetails, + BenchmarkMarketDataDetailsResponse, BenchmarkProperty, BenchmarkResponse, Coupon, + CreateStripeCheckoutSessionResponse, DataEnhancerHealthResponse, DataProviderGhostfolioAssetProfileResponse, DataProviderGhostfolioStatusResponse, @@ -102,7 +115,7 @@ export { DataProviderInfo, DividendsResponse, EnhancedSymbolProfile, - Export, + ExportResponse, Filter, FilterGroup, FireWealth, @@ -112,6 +125,7 @@ export { HoldingWithParents, ImportResponse, InfoItem, + InfoResponse, InvestmentItem, LineChartItem, LookupItem, @@ -122,10 +136,10 @@ export { OAuthResponse, PortfolioChart, PortfolioDetails, - PortfolioDividends, + PortfolioDividendsResponse, PortfolioHoldingResponse, PortfolioHoldingsResponse, - PortfolioInvestments, + PortfolioInvestmentsResponse, PortfolioPerformance, PortfolioPerformanceResponse, PortfolioPosition, diff --git a/libs/common/src/lib/interfaces/portfolio-dividends.interface.ts b/libs/common/src/lib/interfaces/portfolio-dividends.interface.ts deleted file mode 100644 index 585c46bb7..000000000 --- a/libs/common/src/lib/interfaces/portfolio-dividends.interface.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { InvestmentItem } from './investment-item.interface'; - -export interface PortfolioDividends { - dividends: InvestmentItem[]; -} diff --git a/libs/common/src/lib/interfaces/portfolio-investments.interface.ts b/libs/common/src/lib/interfaces/portfolio-investments.interface.ts deleted file mode 100644 index 70de5c7d6..000000000 --- a/libs/common/src/lib/interfaces/portfolio-investments.interface.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { InvestmentItem } from './investment-item.interface'; - -export interface PortfolioInvestments { - investments: InvestmentItem[]; - streaks: { currentStreak: number; longestStreak: number }; -} diff --git a/libs/common/src/lib/interfaces/responses/activities-response.interface.ts b/libs/common/src/lib/interfaces/responses/activities-response.interface.ts new file mode 100644 index 000000000..e6abe4618 --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/activities-response.interface.ts @@ -0,0 +1,6 @@ +import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; + +export interface ActivitiesResponse { + activities: Activity[]; + count: number; +} diff --git a/libs/common/src/lib/interfaces/responses/activity-response.interface.ts b/libs/common/src/lib/interfaces/responses/activity-response.interface.ts new file mode 100644 index 000000000..5dd338627 --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/activity-response.interface.ts @@ -0,0 +1,3 @@ +import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; + +export interface ActivityResponse extends Activity {} diff --git a/libs/common/src/lib/interfaces/responses/admin-user-response.interface.ts b/libs/common/src/lib/interfaces/responses/admin-user-response.interface.ts new file mode 100644 index 000000000..8e93fc097 --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/admin-user-response.interface.ts @@ -0,0 +1,3 @@ +import { AdminUser } from '../admin-user.interface'; + +export interface AdminUserResponse extends AdminUser {} diff --git a/libs/common/src/lib/interfaces/responses/admin-users-response.interface.ts b/libs/common/src/lib/interfaces/responses/admin-users-response.interface.ts new file mode 100644 index 000000000..8dd058030 --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/admin-users-response.interface.ts @@ -0,0 +1,6 @@ +import { AdminUser } from '../admin-user.interface'; + +export interface AdminUsersResponse { + count: number; + users: AdminUser[]; +} diff --git a/libs/common/src/lib/interfaces/responses/asset-response.interface.ts b/libs/common/src/lib/interfaces/responses/asset-response.interface.ts new file mode 100644 index 000000000..452ec0d3d --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/asset-response.interface.ts @@ -0,0 +1,3 @@ +import type { AdminMarketDataDetails } from '../admin-market-data-details.interface'; + +export interface AssetResponse extends AdminMarketDataDetails {} diff --git a/libs/common/src/lib/interfaces/benchmark-market-data-details.interface.ts b/libs/common/src/lib/interfaces/responses/benchmark-market-data-details-response.interface.ts similarity index 64% rename from libs/common/src/lib/interfaces/benchmark-market-data-details.interface.ts rename to libs/common/src/lib/interfaces/responses/benchmark-market-data-details-response.interface.ts index ed693b9af..cdd63ff79 100644 --- a/libs/common/src/lib/interfaces/benchmark-market-data-details.interface.ts +++ b/libs/common/src/lib/interfaces/responses/benchmark-market-data-details-response.interface.ts @@ -1,5 +1,5 @@ import { LineChartItem } from '@ghostfolio/common/interfaces'; -export interface BenchmarkMarketDataDetails { +export interface BenchmarkMarketDataDetailsResponse { marketData: LineChartItem[]; } diff --git a/libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts b/libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts new file mode 100644 index 000000000..18c9e4400 --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts @@ -0,0 +1,3 @@ +export interface CreateStripeCheckoutSessionResponse { + sessionId: string; +} diff --git a/libs/common/src/lib/interfaces/responses/dividends-response.interface.ts b/libs/common/src/lib/interfaces/responses/dividends-response.interface.ts index f7cacf89a..15afc54c9 100644 --- a/libs/common/src/lib/interfaces/responses/dividends-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/dividends-response.interface.ts @@ -1,7 +1,7 @@ -import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; export interface DividendsResponse { dividends: { - [date: string]: IDataProviderHistoricalResponse; + [date: string]: DataProviderHistoricalResponse; }; } diff --git a/libs/common/src/lib/interfaces/export.interface.ts b/libs/common/src/lib/interfaces/responses/export-response.interface.ts similarity index 64% rename from libs/common/src/lib/interfaces/export.interface.ts rename to libs/common/src/lib/interfaces/responses/export-response.interface.ts index 16a49b0ef..8b1697ca4 100644 --- a/libs/common/src/lib/interfaces/export.interface.ts +++ b/libs/common/src/lib/interfaces/responses/export-response.interface.ts @@ -7,10 +7,11 @@ import { Tag } from '@prisma/client'; -import { AccountBalance } from './account-balance.interface'; -import { MarketData } from './market-data.interface'; +import { AccountBalance } from '../account-balance.interface'; +import { MarketData } from '../market-data.interface'; +import { UserSettings } from '../user-settings.interface'; -export interface Export { +export interface ExportResponse { accounts: (Omit & { balances: AccountBalance[]; })[]; @@ -36,5 +37,10 @@ export interface Export { }; platforms: Platform[]; tags: Omit[]; - user: { settings: { currency: string } }; + user: { + settings: { + currency: UserSettings['baseCurrency']; + performanceCalculationType: UserSettings['performanceCalculationType']; + }; + }; } diff --git a/libs/common/src/lib/interfaces/responses/historical-response.interface.ts b/libs/common/src/lib/interfaces/responses/historical-response.interface.ts index 12309a352..24383ab07 100644 --- a/libs/common/src/lib/interfaces/responses/historical-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/historical-response.interface.ts @@ -1,7 +1,7 @@ -import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; export interface HistoricalResponse { historicalData: { - [date: string]: IDataProviderHistoricalResponse; + [date: string]: DataProviderHistoricalResponse; }; } diff --git a/libs/common/src/lib/interfaces/responses/info-response.interface.ts b/libs/common/src/lib/interfaces/responses/info-response.interface.ts new file mode 100644 index 000000000..45e62db73 --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/info-response.interface.ts @@ -0,0 +1,3 @@ +import { InfoItem } from '../index'; + +export interface InfoResponse extends InfoItem {} diff --git a/libs/common/src/lib/interfaces/responses/portfolio-dividends-response.interface.ts b/libs/common/src/lib/interfaces/responses/portfolio-dividends-response.interface.ts new file mode 100644 index 000000000..bd33dbccb --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/portfolio-dividends-response.interface.ts @@ -0,0 +1,5 @@ +import { InvestmentItem } from '../investment-item.interface'; + +export interface PortfolioDividendsResponse { + dividends: InvestmentItem[]; +} diff --git a/libs/common/src/lib/interfaces/responses/portfolio-investments.interface.ts b/libs/common/src/lib/interfaces/responses/portfolio-investments.interface.ts new file mode 100644 index 000000000..6d0d60002 --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/portfolio-investments.interface.ts @@ -0,0 +1,6 @@ +import { InvestmentItem } from '../investment-item.interface'; + +export interface PortfolioInvestmentsResponse { + investments: InvestmentItem[]; + streaks: { currentStreak: number; longestStreak: number }; +} diff --git a/libs/common/src/lib/interfaces/responses/quotes-response.interface.ts b/libs/common/src/lib/interfaces/responses/quotes-response.interface.ts index 79c9d3024..8b9b09cb8 100644 --- a/libs/common/src/lib/interfaces/responses/quotes-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/quotes-response.interface.ts @@ -1,5 +1,5 @@ -import { IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; export interface QuotesResponse { - quotes: { [symbol: string]: IDataProviderResponse }; + quotes: { [symbol: string]: DataProviderResponse }; } diff --git a/libs/common/src/lib/interfaces/user.interface.ts b/libs/common/src/lib/interfaces/user.interface.ts index a48317fad..2e0906895 100644 --- a/libs/common/src/lib/interfaces/user.interface.ts +++ b/libs/common/src/lib/interfaces/user.interface.ts @@ -1,6 +1,9 @@ -import { SubscriptionType } from '@ghostfolio/common/types/subscription-type.type'; +import { + AccountWithPlatform, + SubscriptionType +} from '@ghostfolio/common/types'; -import { Access, Account, Tag } from '@prisma/client'; +import { Access, Tag } from '@prisma/client'; import { SubscriptionOffer } from './subscription-offer.interface'; import { SystemMessage } from './system-message.interface'; @@ -9,7 +12,7 @@ import { UserSettings } from './user-settings.interface'; // TODO: Compare with UserWithSettings export interface User { access: Pick[]; - accounts: Account[]; + accounts: AccountWithPlatform[]; activitiesCount: number; dateOfFirstActivity: Date; id: string; diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.html b/libs/ui/src/lib/accounts-table/accounts-table.component.html index 609c76ee1..805ffe77d 100644 --- a/libs/ui/src/lib/accounts-table/accounts-table.component.html +++ b/libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -290,7 +290,7 @@ - +
    - @if (!isUUID(element.SymbolProfile?.symbol)) { + @if ( + element.SymbolProfile?.dataSource !== 'MANUAL' && + !isUUID(element.SymbolProfile?.symbol) + ) {
    {{ element.SymbolProfile?.symbol | gfSymbol @@ -434,6 +437,14 @@ class="no-max-width" xPosition="before" > + @if (canClickActivity(element)) { + + } - - -
    + @if (!searchFormControl.value) { +
    + + Date Range + + @for ( + dateRangeOption of dateRangeOptions; + track dateRangeOption.value + ) { + {{ + dateRangeOption.label + }} + } + + +
    +
    + +
    + + +
    - } - +
    + }
    diff --git a/libs/ui/src/lib/assistant/interfaces/interfaces.ts b/libs/ui/src/lib/assistant/interfaces/interfaces.ts index 247641094..e018e0eb6 100644 --- a/libs/ui/src/lib/assistant/interfaces/interfaces.ts +++ b/libs/ui/src/lib/assistant/interfaces/interfaces.ts @@ -3,38 +3,38 @@ import { AccountWithValue, DateRange } from '@ghostfolio/common/types'; import { SearchMode } from '../enums/search-mode'; -export interface IAccountSearchResultItem +export interface AccountSearchResultItem extends Pick { mode: SearchMode.ACCOUNT; routerLink: string[]; } -export interface IAssetSearchResultItem extends AssetProfileIdentifier { +export interface AssetSearchResultItem extends AssetProfileIdentifier { assetSubClassString: string; currency: string; mode: SearchMode.ASSET_PROFILE | SearchMode.HOLDING; name: string; } -export interface IDateRangeOption { +export interface DateRangeOption { label: string; value: DateRange; } -export interface IQuickLinkSearchResultItem { +export interface QuickLinkSearchResultItem { mode: SearchMode.QUICK_LINK; name: string; routerLink: string[]; } -export type ISearchResultItem = - | IAccountSearchResultItem - | IAssetSearchResultItem - | IQuickLinkSearchResultItem; +export type SearchResultItem = + | AccountSearchResultItem + | AssetSearchResultItem + | QuickLinkSearchResultItem; -export interface ISearchResults { - accounts: ISearchResultItem[]; - assetProfiles: ISearchResultItem[]; - holdings: ISearchResultItem[]; - quickLinks: ISearchResultItem[]; +export interface SearchResults { + accounts: SearchResultItem[]; + assetProfiles: SearchResultItem[]; + holdings: SearchResultItem[]; + quickLinks: SearchResultItem[]; } diff --git a/libs/ui/src/lib/benchmark/benchmark.component.html b/libs/ui/src/lib/benchmark/benchmark.component.html index 2b75e5672..ab6db8887 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.html +++ b/libs/ui/src/lib/benchmark/benchmark.component.html @@ -8,8 +8,8 @@ [dataSource]="dataSource" > - - Name + + Name
    diff --git a/libs/ui/src/lib/benchmark/benchmark.component.ts b/libs/ui/src/lib/benchmark/benchmark.component.ts index 3af9bc674..bb66acba8 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.ts +++ b/libs/ui/src/lib/benchmark/benchmark.component.ts @@ -155,14 +155,17 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy { dataSource, symbol }: AssetProfileIdentifier) { - const dialogRef = this.dialog.open(GfBenchmarkDetailDialogComponent, { + const dialogRef = this.dialog.open< + GfBenchmarkDetailDialogComponent, + BenchmarkDetailDialogParams + >(GfBenchmarkDetailDialogComponent, { data: { dataSource, symbol, colorScheme: this.user?.settings?.colorScheme, deviceType: this.deviceType, locale: this.locale - } as BenchmarkDetailDialogParams, + }, height: this.deviceType === 'mobile' ? '98vh' : undefined, width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); diff --git a/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts b/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts index df7ca79fa..44276ec43 100644 --- a/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts +++ b/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -185,7 +185,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy { 'principalInvestmentAmount' ).value, projectedTotalAmount: - Number(this.getProjectedTotalAmount().toFixed(0)) ?? 0, + Math.round(this.getProjectedTotalAmount()) || 0, retirementDate: this.getRetirementDate() ?? this.DEFAULT_RETIREMENT_DATE }, 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 7fbb1e621..002422c57 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 @@ -199,21 +199,21 @@ export class GfHistoricalMarketDataEditorComponent }) { const marketPrice = this.marketDataByMonth[yearMonth]?.[day]?.marketPrice; - const dialogRef = this.dialog.open( + const dialogRef = this.dialog.open< GfHistoricalMarketDataEditorDialogComponent, - { - data: { - marketPrice, - currency: this.currency, - dataSource: this.dataSource, - dateString: `${yearMonth}-${day}`, - symbol: this.symbol, - user: this.user - } as HistoricalMarketDataEditorDialogParams, - height: this.deviceType === 'mobile' ? '98vh' : '80vh', - width: this.deviceType === 'mobile' ? '100vw' : '50rem' - } - ); + HistoricalMarketDataEditorDialogParams + >(GfHistoricalMarketDataEditorDialogComponent, { + data: { + marketPrice, + currency: this.currency, + dataSource: this.dataSource, + dateString: `${yearMonth}-${day}`, + symbol: this.symbol, + user: this.user + }, + height: this.deviceType === 'mobile' ? '98vh' : '80vh', + width: this.deviceType === 'mobile' ? '100vw' : '50rem' + }); dialogRef .afterClosed() diff --git a/libs/ui/src/lib/logo-carousel/logo-carousel.component.scss b/libs/ui/src/lib/logo-carousel/logo-carousel.component.scss index 18c3a26cb..89a837195 100644 --- a/libs/ui/src/lib/logo-carousel/logo-carousel.component.scss +++ b/libs/ui/src/lib/logo-carousel/logo-carousel.component.scss @@ -139,6 +139,15 @@ max-height: 1.25rem; } + &.logo-selfhostedhub { + background-image: url('/assets/images/logo-selfhostedhub.svg'); + background-position: center; + background-repeat: no-repeat; + background-size: contain; + filter: grayscale(1); + opacity: 0.5; + } + &.logo-sourceforge { mask-image: url('/assets/images/logo-sourceforge.svg'); } diff --git a/libs/ui/src/lib/logo-carousel/logo-carousel.component.ts b/libs/ui/src/lib/logo-carousel/logo-carousel.component.ts index d7d3fa6af..ea6344694 100644 --- a/libs/ui/src/lib/logo-carousel/logo-carousel.component.ts +++ b/libs/ui/src/lib/logo-carousel/logo-carousel.component.ts @@ -82,6 +82,12 @@ export class GfLogoCarouselComponent { title: 'selfh.st — Self-hosted content and software', url: 'https://selfh.st' }, + { + className: 'logo-selfhostedhub', + name: 'SelfhostedHub', + title: 'SelfhostedHub — Discover best self-hosted software', + url: 'https://selfhostedhub.com' + }, { className: 'logo-sourceforge', isMask: true, diff --git a/libs/ui/src/lib/portfolio-filter-form/index.ts b/libs/ui/src/lib/portfolio-filter-form/index.ts new file mode 100644 index 000000000..51d22c034 --- /dev/null +++ b/libs/ui/src/lib/portfolio-filter-form/index.ts @@ -0,0 +1,2 @@ +export * from './interfaces'; +export * from './portfolio-filter-form.component'; diff --git a/libs/ui/src/lib/portfolio-filter-form/interfaces/index.ts b/libs/ui/src/lib/portfolio-filter-form/interfaces/index.ts new file mode 100644 index 000000000..62feaa56a --- /dev/null +++ b/libs/ui/src/lib/portfolio-filter-form/interfaces/index.ts @@ -0,0 +1 @@ +export * from './portfolio-filter-form-value.interface'; diff --git a/libs/ui/src/lib/portfolio-filter-form/interfaces/portfolio-filter-form-value.interface.ts b/libs/ui/src/lib/portfolio-filter-form/interfaces/portfolio-filter-form-value.interface.ts new file mode 100644 index 000000000..21ff0ae3b --- /dev/null +++ b/libs/ui/src/lib/portfolio-filter-form/interfaces/portfolio-filter-form-value.interface.ts @@ -0,0 +1,8 @@ +import { PortfolioPosition } from '@ghostfolio/common/interfaces'; + +export interface PortfolioFilterFormValue { + account: string; + assetClass: string; + holding: PortfolioPosition; + tag: string; +} diff --git a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html new file mode 100644 index 000000000..e017d33d6 --- /dev/null +++ b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -0,0 +1,75 @@ +
    +
    + + Account + + + @for (account of accounts; track account.id) { + +
    + @if (account.platform?.url) { + + } + {{ account.name }} +
    +
    + } +
    +
    +
    +
    + + Holding + + {{ + filterForm.get('holding')?.value?.name + }} + + @for (holding of holdings; track holding.name) { + +
    + {{ holding.name }} +
    + {{ holding.symbol | gfSymbol }} · {{ holding.currency }} +
    +
    + } +
    +
    +
    +
    + + Tag + + + @for (tag of tags; track tag.id) { + {{ tag.label }} + } + + +
    +
    + + Asset Class + + + @for (assetClass of assetClasses; track assetClass.id) { + {{ + assetClass.label + }} + } + + +
    +
    diff --git a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.scss b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.scss new file mode 100644 index 000000000..5d4e87f30 --- /dev/null +++ b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.scss @@ -0,0 +1,3 @@ +:host { + display: block; +} diff --git a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.stories.ts b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.stories.ts new file mode 100644 index 000000000..710a4e9c5 --- /dev/null +++ b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.stories.ts @@ -0,0 +1,79 @@ +import '@angular/localize/init'; +import { Meta, moduleMetadata, StoryObj } from '@storybook/angular'; + +import { GfPortfolioFilterFormComponent } from './portfolio-filter-form.component'; + +const meta: Meta = { + title: 'Portfolio Filter Form', + component: GfPortfolioFilterFormComponent, + decorators: [ + moduleMetadata({ + imports: [GfPortfolioFilterFormComponent] + }) + ] +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + accounts: [ + { + id: '733110b6-7c55-44eb-8cc5-c4c3e9d48a79', + name: 'Trading Account', + platform: { + name: 'Interactive Brokers', + url: 'https://interactivebrokers.com' + } + }, + { + id: '24ba27d6-e04b-4fb4-b856-b24c2ef0422a', + name: 'Investment Account', + platform: { + name: 'Fidelity', + url: 'https://fidelity.com' + } + } + ] as any, + assetClasses: [ + { id: 'COMMODITY', label: 'Commodity', type: 'ASSET_CLASS' }, + { id: 'EQUITY', label: 'Equity', type: 'ASSET_CLASS' }, + { id: 'FIXED_INCOME', label: 'Fixed Income', type: 'ASSET_CLASS' } + ] as any, + holdings: [ + { + currency: 'USD', + dataSource: 'YAHOO', + name: 'Apple Inc.', + symbol: 'AAPL' + }, + { + currency: 'USD', + dataSource: 'YAHOO', + name: 'Microsoft Corporation', + symbol: 'MSFT' + } + ] as any, + tags: [ + { + id: 'EMERGENCY_FUND', + label: 'Emergency Fund', + type: 'TAG' + }, + { + id: 'RETIREMENT_FUND', + label: 'Retirement Fund', + type: 'TAG' + } + ] as any, + disabled: false + } +}; + +export const Disabled: Story = { + args: { + ...Default.args, + disabled: true + } +}; diff --git a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts new file mode 100644 index 000000000..794f43d4d --- /dev/null +++ b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts @@ -0,0 +1,177 @@ +import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; +import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; +import { Filter, PortfolioPosition } from '@ghostfolio/common/interfaces'; +import { AccountWithPlatform } from '@ghostfolio/common/types'; + +import { + CUSTOM_ELEMENTS_SCHEMA, + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + Input, + OnChanges, + OnDestroy, + OnInit, + forwardRef +} from '@angular/core'; +import { + ControlValueAccessor, + FormBuilder, + FormControl, + FormGroup, + FormsModule, + NG_VALUE_ACCESSOR, + ReactiveFormsModule +} from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { Subject, takeUntil } from 'rxjs'; + +import { GfEntityLogoComponent } from '../entity-logo/entity-logo.component'; +import { PortfolioFilterFormValue } from './interfaces'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + FormsModule, + GfEntityLogoComponent, + GfSymbolPipe, + MatFormFieldModule, + MatSelectModule, + ReactiveFormsModule + ], + providers: [ + { + multi: true, + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => GfPortfolioFilterFormComponent) + } + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + selector: 'gf-portfolio-filter-form', + styleUrls: ['./portfolio-filter-form.component.scss'], + templateUrl: './portfolio-filter-form.component.html' +}) +export class GfPortfolioFilterFormComponent + implements ControlValueAccessor, OnInit, OnChanges, OnDestroy +{ + @Input() accounts: AccountWithPlatform[] = []; + @Input() assetClasses: Filter[] = []; + @Input() holdings: PortfolioPosition[] = []; + @Input() tags: Filter[] = []; + @Input() disabled = false; + + public filterForm: FormGroup; + + private unsubscribeSubject = new Subject(); + + public constructor( + private changeDetectorRef: ChangeDetectorRef, + private formBuilder: FormBuilder + ) { + this.filterForm = this.formBuilder.group({ + account: new FormControl(null), + assetClass: new FormControl(null), + holding: new FormControl(null), + tag: new FormControl(null) + }); + } + + public ngOnInit() { + this.filterForm.valueChanges + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((value) => { + this.onChange(value as PortfolioFilterFormValue); + this.onTouched(); + }); + } + + public hasFilters() { + const formValue = this.filterForm.value; + + return Object.values(formValue).some((value) => { + return !!value; + }); + } + + public holdingComparisonFunction( + option: PortfolioPosition, + value: PortfolioPosition + ) { + if (value === null) { + return false; + } + + return ( + getAssetProfileIdentifier(option) === getAssetProfileIdentifier(value) + ); + } + + public ngOnChanges() { + if (this.disabled) { + this.filterForm.disable({ emitEvent: false }); + } else { + this.filterForm.enable({ emitEvent: false }); + } + + const tagControl = this.filterForm.get('tag'); + + if (this.tags.length === 0) { + tagControl?.disable({ emitEvent: false }); + } else if (!this.disabled) { + tagControl?.enable({ emitEvent: false }); + } + + this.changeDetectorRef.markForCheck(); + } + + public registerOnChange(fn: (value: PortfolioFilterFormValue) => void) { + this.onChange = fn; + } + + public registerOnTouched(fn: () => void) { + this.onTouched = fn; + } + + public setDisabledState(isDisabled: boolean) { + this.disabled = isDisabled; + + if (this.disabled) { + this.filterForm.disable({ emitEvent: false }); + } else { + this.filterForm.enable({ emitEvent: false }); + } + + this.changeDetectorRef.markForCheck(); + } + + public writeValue(value: PortfolioFilterFormValue | null) { + if (value) { + this.filterForm.setValue( + { + account: value.account ?? null, + assetClass: value.assetClass ?? null, + holding: value.holding ?? null, + tag: value.tag ?? null + }, + { emitEvent: false } + ); + } else { + this.filterForm.reset({}, { emitEvent: false }); + } + } + + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + private onChange = (_value: PortfolioFilterFormValue): void => { + // ControlValueAccessor onChange callback + }; + + private onTouched = (): void => { + // ControlValueAccessor onTouched callback + }; +} diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts index 3f062a374..2d8a03ac0 100644 --- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts +++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -31,6 +31,7 @@ import ChartDataLabels from 'chartjs-plugin-datalabels'; import { isUUID } from 'class-validator'; import Color from 'color'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; +import OpenColor from 'open-color'; import { translate } from '../i18n'; @@ -47,7 +48,7 @@ const { teal, violet, yellow -} = require('open-color'); +} = OpenColor; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/libs/ui/src/lib/tags-selector/tags-selector.component.ts b/libs/ui/src/lib/tags-selector/tags-selector.component.ts index 05a4b3e7a..7f1a8805e 100644 --- a/libs/ui/src/lib/tags-selector/tags-selector.component.ts +++ b/libs/ui/src/lib/tags-selector/tags-selector.component.ts @@ -5,12 +5,10 @@ import { Component, CUSTOM_ELEMENTS_SCHEMA, ElementRef, - EventEmitter, Input, OnChanges, OnDestroy, OnInit, - Output, signal, ViewChild } from '@angular/core'; @@ -66,8 +64,6 @@ export class GfTagsSelectorComponent @Input() tags: Tag[]; @Input() tagsAvailable: Tag[]; - @Output() tagsChanged = new EventEmitter(); - @ViewChild('tagInput') tagInput: ElementRef; public filteredOptions: Subject = new BehaviorSubject([]); @@ -115,7 +111,6 @@ export class GfTagsSelectorComponent }); const newTags = this.tagsSelected(); - this.tagsChanged.emit(newTags); this.onChange(newTags); this.onTouched(); this.tagInput.nativeElement.value = ''; @@ -130,7 +125,6 @@ export class GfTagsSelectorComponent }); const newTags = this.tagsSelected(); - this.tagsChanged.emit(newTags); this.onChange(newTags); this.onTouched(); this.updateFilters(); diff --git a/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts b/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts index 4e06d49cc..6ae958b83 100644 --- a/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts +++ b/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -33,10 +33,11 @@ import { isUUID } from 'class-validator'; import { differenceInDays, max } from 'date-fns'; import { orderBy } from 'lodash'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; +import OpenColor from 'open-color'; import { GetColorParams } from './interfaces/interfaces'; -const { gray, green, red } = require('open-color'); +const { gray, green, red } = OpenColor; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/package-lock.json b/package-lock.json index e65c23ac7..095b9f7f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.208.0", + "version": "2.215.0-beta.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.208.0", + "version": "2.215.0-beta.1", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { @@ -23,27 +23,22 @@ "@angular/service-worker": "20.2.4", "@codewithdan/observable-store": "2.2.15", "@date-fns/utc": "2.1.0", - "@dfinity/agent": "0.15.7", - "@dfinity/auth-client": "0.15.7", - "@dfinity/candid": "0.15.7", - "@dfinity/identity": "0.15.7", - "@dfinity/principal": "0.15.7", "@internationalized/number": "3.6.3", "@ionic/angular": "8.7.3", "@keyv/redis": "4.4.0", - "@nestjs/bull": "11.0.2", + "@nestjs/bull": "11.0.4", "@nestjs/cache-manager": "3.0.1", - "@nestjs/common": "11.1.3", + "@nestjs/common": "11.1.8", "@nestjs/config": "4.0.2", - "@nestjs/core": "11.1.3", + "@nestjs/core": "11.1.8", "@nestjs/event-emitter": "3.0.1", - "@nestjs/jwt": "11.0.0", + "@nestjs/jwt": "11.0.1", "@nestjs/passport": "11.0.5", - "@nestjs/platform-express": "11.1.3", - "@nestjs/schedule": "6.0.0", - "@nestjs/serve-static": "5.0.3", + "@nestjs/platform-express": "11.1.8", + "@nestjs/schedule": "6.0.1", + "@nestjs/serve-static": "5.0.4", "@openrouter/ai-sdk-provider": "0.7.2", - "@prisma/client": "6.17.1", + "@prisma/client": "6.18.0", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", "@stripe/stripe-js": "7.9.0", @@ -62,9 +57,11 @@ "class-validator": "0.14.2", "color": "5.0.0", "countries-and-timezones": "3.8.0", - "countries-list": "3.1.1", + "countries-list": "3.2.0", "countup.js": "2.9.0", "date-fns": "4.1.0", + "dotenv": "17.2.3", + "dotenv-expand": "12.0.3", "envalid": "8.1.0", "fuse.js": "7.1.0", "google-spreadsheet": "3.2.0", @@ -75,7 +72,7 @@ "lodash": "4.17.21", "marked": "15.0.4", "ms": "3.0.0-canary.1", - "ng-extract-i18n-merge": "3.0.0", + "ng-extract-i18n-merge": "3.1.0", "ngx-device-detector": "10.1.0", "ngx-markdown": "20.0.0", "ngx-skeleton-loader": "11.3.0", @@ -90,7 +87,8 @@ "rxjs": "7.8.1", "stripe": "18.5.0", "svgmap": "2.12.2", - "twitter-api-v2": "1.23.0", + "tablemark": "4.1.0", + "twitter-api-v2": "1.27.0", "uuid": "11.1.0", "yahoo-finance2": "3.10.0", "zone.js": "0.15.1" @@ -109,8 +107,8 @@ "@angular/pwa": "20.2.2", "@eslint/eslintrc": "3.3.1", "@eslint/js": "9.35.0", - "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.3", + "@nestjs/schematics": "11.0.9", + "@nestjs/testing": "11.1.8", "@nx/angular": "21.5.1", "@nx/cypress": "21.5.1", "@nx/eslint-plugin": "21.5.1", @@ -148,7 +146,7 @@ "nx": "21.5.1", "prettier": "3.6.2", "prettier-plugin-organize-attributes": "1.0.0", - "prisma": "6.17.1", + "prisma": "6.18.0", "react": "18.2.0", "react-dom": "18.2.0", "replace-in-file": "8.3.0", @@ -4710,6 +4708,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" @@ -4722,6 +4721,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -4950,73 +4950,6 @@ "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/@dfinity/agent": { - "version": "0.15.7", - "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-0.15.7.tgz", - "integrity": "sha512-w34yvlUTpPBG8nLOD0t/ao3k2xonOFq4QGvfJ1HiS/nIggdza/3xC3nLBszGrjVYWj1jqu8BLFvQXCAeWin75A==", - "license": "Apache-2.0", - "dependencies": { - "base64-arraybuffer": "^0.2.0", - "bignumber.js": "^9.0.0", - "borc": "^2.1.1", - "js-sha256": "0.9.0", - "simple-cbor": "^0.4.1", - "ts-node": "^10.8.2" - }, - "peerDependencies": { - "@dfinity/candid": "^0.15.7", - "@dfinity/principal": "^0.15.7" - } - }, - "node_modules/@dfinity/auth-client": { - "version": "0.15.7", - "resolved": "https://registry.npmjs.org/@dfinity/auth-client/-/auth-client-0.15.7.tgz", - "integrity": "sha512-f6cRqXayCf+7+9gNcDnAZZwJrgBYKIzfxjxeRLlpsueQeo+E/BX2yVSANxzTkCNc4U3p+ttHI1RNtasLunYTcA==", - "license": "Apache-2.0", - "dependencies": { - "idb": "^7.0.2" - }, - "peerDependencies": { - "@dfinity/agent": "^0.15.7", - "@dfinity/identity": "^0.15.7", - "@dfinity/principal": "^0.15.7" - } - }, - "node_modules/@dfinity/candid": { - "version": "0.15.7", - "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-0.15.7.tgz", - "integrity": "sha512-lTcjK/xrSyT7wvUQ2pApG+yklQAwxaofQ04D1IWv0/8gKbY0eUbh8G2w6+CypJ15Hb1CH24ijUj8nWdeX/z3jg==", - "license": "Apache-2.0", - "dependencies": { - "ts-node": "^10.8.2" - } - }, - "node_modules/@dfinity/identity": { - "version": "0.15.7", - "resolved": "https://registry.npmjs.org/@dfinity/identity/-/identity-0.15.7.tgz", - "integrity": "sha512-kBAkx9wq78jSQf6T5aayLyWm8YgtOZw8bW6+OuzX6tR3hkAEa85A9TcKA7BjkmMWSIskjEDVQub4fFfKWS2vOQ==", - "license": "Apache-2.0", - "dependencies": { - "borc": "^2.1.1", - "js-sha256": "^0.9.0", - "tweetnacl": "^1.0.1" - }, - "peerDependencies": { - "@dfinity/agent": "^0.15.7", - "@dfinity/principal": "^0.15.7", - "@peculiar/webcrypto": "^1.4.0" - } - }, - "node_modules/@dfinity/principal": { - "version": "0.15.7", - "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-0.15.7.tgz", - "integrity": "sha512-6/AkYzpGEH6Jw/0+B/EeeQn+5u2GDDvRLt1kQPhIG4txQYFnOy04H3VvyrymmfAj6/CXUgrOrux6OxgYSLYVJg==", - "license": "Apache-2.0", - "dependencies": { - "js-sha256": "^0.9.0", - "ts-node": "^10.8.2" - } - }, "node_modules/@discoveryjs/json-ext": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", @@ -6112,9 +6045,9 @@ } }, "node_modules/@ioredis/commands": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.3.0.tgz", - "integrity": "sha512-M/T6Zewn7sDaBQEqIZ8Rb+i9y8qfGmq+5SDFSf9sA2lUZTmdDLVdOiQaeDp+Q4wElZ9HG1GAX5KhDaidp6LQsQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.4.0.tgz", + "integrity": "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==", "license": "MIT" }, "node_modules/@isaacs/balanced-match": { @@ -8994,12 +8927,12 @@ } }, "node_modules/@nestjs/bull": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/bull/-/bull-11.0.2.tgz", - "integrity": "sha512-RjyP9JZUuLmMhmq1TMNIZqolkAd14az1jyXMMVki+C9dYvaMjWzBSwcZAtKs9Pk15Rm7qN1xn3R11aMV2Xv4gg==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@nestjs/bull/-/bull-11.0.4.tgz", + "integrity": "sha512-QVz2PR/rJF/isy7otVnMTSqLf/O71p9Ka7lBZt9Gm+NQFv8fcH2L11GL7TA0whyCcw/kAX5iRepUXz/wed4JoA==", "license": "MIT", "dependencies": { - "@nestjs/bull-shared": "^11.0.2", + "@nestjs/bull-shared": "^11.0.4", "tslib": "2.8.1" }, "peerDependencies": { @@ -9009,9 +8942,9 @@ } }, "node_modules/@nestjs/bull-shared": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@nestjs/bull-shared/-/bull-shared-11.0.3.tgz", - "integrity": "sha512-CaHniPkLAxis6fAB1DB8WZELQv8VPCLedbj7iP0VQ1pz74i6NSzG9mBg6tOomXq/WW4la4P4OMGEQ48UAJh20A==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@nestjs/bull-shared/-/bull-shared-11.0.4.tgz", + "integrity": "sha512-VBJcDHSAzxQnpcDfA0kt9MTGUD1XZzfByV70su0W0eDCQ9aqIEBlzWRW21tv9FG9dIut22ysgDidshdjlnczLw==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -9035,14 +8968,14 @@ } }, "node_modules/@nestjs/common": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.3.tgz", - "integrity": "sha512-ogEK+GriWodIwCw6buQ1rpcH4Kx+G7YQ9EwuPySI3rS05pSdtQ++UhucjusSI9apNidv+QURBztJkRecwwJQXg==", + "version": "11.1.8", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.8.tgz", + "integrity": "sha512-bbsOqwld/GdBfiRNc4nnjyWWENDEicq4SH+R5AuYatvf++vf1x5JIsHB1i1KtfZMD3eRte0D4K9WXuAYil6XAg==", "license": "MIT", "dependencies": { "file-type": "21.0.0", "iterare": "1.2.1", - "load-esm": "1.0.2", + "load-esm": "1.0.3", "tslib": "2.8.1", "uid": "2.0.2" }, @@ -9080,17 +9013,44 @@ "rxjs": "^7.1.0" } }, + "node_modules/@nestjs/config/node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@nestjs/config/node_modules/dotenv-expand": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.1.tgz", + "integrity": "sha512-LaKRbou8gt0RNID/9RoI+J2rvXsBRPMV7p+ElHlPhcSARbCPDYcYG2s1TIzAfWv4YSgyY5taidWzzs31lNV3yQ==", + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/@nestjs/core": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.3.tgz", - "integrity": "sha512-5lTni0TCh8x7bXETRD57pQFnKnEg1T6M+VLE7wAmyQRIecKQU+2inRGZD+A4v2DC1I04eA0WffP0GKLxjOKlzw==", + "version": "11.1.8", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.8.tgz", + "integrity": "sha512-7riWfmTmMhCJHZ5ZiaG+crj4t85IPCq/wLRuOUSigBYyFT2JZj0lVHtAdf4Davp9ouNI8GINBDt9h9b5Gz9nTw==", "hasInstallScript": true, "license": "MIT", "dependencies": { "@nuxt/opencollective": "0.4.1", "fast-safe-stringify": "2.1.1", "iterare": "1.2.1", - "path-to-regexp": "8.2.0", + "path-to-regexp": "8.3.0", "tslib": "2.8.1", "uid": "2.0.2" }, @@ -9135,12 +9095,12 @@ } }, "node_modules/@nestjs/jwt": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.0.tgz", - "integrity": "sha512-v7YRsW3Xi8HNTsO+jeHSEEqelX37TVWgwt+BcxtkG/OfXJEOs6GZdbdza200d6KqId1pJQZ6UPj1F0M6E+mxaA==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.1.tgz", + "integrity": "sha512-HXSsc7SAnCnjA98TsZqrE7trGtHDnYXWp4Ffy6LwSmck1QvbGYdMzBquXofX5l6tIRpeY4Qidl2Ti2CVG77Pdw==", "license": "MIT", "dependencies": { - "@types/jsonwebtoken": "9.0.7", + "@types/jsonwebtoken": "9.0.10", "jsonwebtoken": "9.0.2" }, "peerDependencies": { @@ -9158,15 +9118,15 @@ } }, "node_modules/@nestjs/platform-express": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.3.tgz", - "integrity": "sha512-hEDNMlaPiBO72fxxX/CuRQL3MEhKRc/sIYGVoXjrnw6hTxZdezvvM6A95UaLsYknfmcZZa/CdG1SMBZOu9agHQ==", + "version": "11.1.8", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.8.tgz", + "integrity": "sha512-rL6pZH9BW7BnL5X2eWbJMtt86uloAKjFgyY5+L2UkizgfEp7rgAs0+Z1z0BcW2Pgu5+q8O7RKPNyHJ/9ZNz/ZQ==", "license": "MIT", "dependencies": { "cors": "2.8.5", "express": "5.1.0", - "multer": "2.0.1", - "path-to-regexp": "8.2.0", + "multer": "2.0.2", + "path-to-regexp": "8.3.0", "tslib": "2.8.1" }, "funding": { @@ -9179,12 +9139,12 @@ } }, "node_modules/@nestjs/schedule": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-6.0.0.tgz", - "integrity": "sha512-aQySMw6tw2nhitELXd3EiRacQRgzUKD9mFcUZVOJ7jPLqIBvXOyvRWLsK9SdurGA+jjziAlMef7iB5ZEFFoQpw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-6.0.1.tgz", + "integrity": "sha512-v3yO6cSPAoBSSyH67HWnXHzuhPhSNZhRmLY38JvCt2sqY8sPMOODpcU1D79iUMFf7k16DaMEbL4Mgx61ZhiC8Q==", "license": "MIT", "dependencies": { - "cron": "4.3.0" + "cron": "4.3.3" }, "peerDependencies": { "@nestjs/common": "^10.0.0 || ^11.0.0", @@ -9192,15 +9152,15 @@ } }, "node_modules/@nestjs/schematics": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.5.tgz", - "integrity": "sha512-T50SCNyqCZ/fDssaOD7meBKLZ87ebRLaJqZTJPvJKjlib1VYhMOCwXYsr7bjMPmuPgiQHOwvppz77xN/m6GM7A==", + "version": "11.0.9", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.9.tgz", + "integrity": "sha512-0NfPbPlEaGwIT8/TCThxLzrlz3yzDNkfRNpbL7FiplKq3w4qXpJg0JYwqgMEJnLQZm3L/L/5XjoyfJHUO3qX9g==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.6", - "@angular-devkit/schematics": "19.2.6", - "comment-json": "4.2.5", + "@angular-devkit/core": "19.2.17", + "@angular-devkit/schematics": "19.2.17", + "comment-json": "4.4.1", "jsonc-parser": "3.3.1", "pluralize": "8.0.0" }, @@ -9209,9 +9169,9 @@ } }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { - "version": "19.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.6.tgz", - "integrity": "sha512-WFgiYhrDMq83UNaGRAneIM7CYYdBozD+yYA9BjoU8AgBLKtrvn6S8ZcjKAk5heoHtY/u8pEb0mwDTz9gxFmJZQ==", + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.17.tgz", + "integrity": "sha512-Ah008x2RJkd0F+NLKqIpA34/vUGwjlprRCkvddjDopAWRzYn6xCkz1Tqwuhn0nR1Dy47wTLKYD999TYl5ONOAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9237,13 +9197,13 @@ } }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { - "version": "19.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.6.tgz", - "integrity": "sha512-YTAxNnT++5eflx19OUHmOWu597/TbTel+QARiZCv1xQw99+X8DCKKOUXtqBRd53CAHlREDI33Rn/JLY3NYgMLQ==", + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.17.tgz", + "integrity": "sha512-ADfbaBsrG8mBF6Mfs+crKA/2ykB8AJI50Cv9tKmZfwcUcyAdmTr+vVvhsBCfvUAEokigSsgqgpYxfkJVxhJYeg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.6", + "@angular-devkit/core": "19.2.17", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", @@ -9341,12 +9301,12 @@ "license": "ISC" }, "node_modules/@nestjs/serve-static": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-5.0.3.tgz", - "integrity": "sha512-0jFjTlSVSLrI+mot8lfm+h2laXtKzCvgsVStv9T1ZBZTDwS26gM5czIhIESmWAod0PfrbCDFiu9C1MglObL8VA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-5.0.4.tgz", + "integrity": "sha512-3kO1M9D3vsPyWPFardxIjUYeuolS58PnhCoBTkS7t3BrdZFZCKHnBZ15js+UOzOR2Q6HmD7ssGjLd0DVYVdvOw==", "license": "MIT", "dependencies": { - "path-to-regexp": "8.2.0" + "path-to-regexp": "8.3.0" }, "peerDependencies": { "@fastify/static": "^8.0.4", @@ -9368,9 +9328,9 @@ } }, "node_modules/@nestjs/testing": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.3.tgz", - "integrity": "sha512-CeXG6/eEqgFIkPkmU00y18Dd3DLOIDFhPItzJK1SWckKo6IhcnfoRJzGx75bmuvUMjb51j6An96S/+MJ2ty9jA==", + "version": "11.1.8", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.8.tgz", + "integrity": "sha512-E6K+0UTKztcPxJzLnQa7S34lFjZbrj3Z1r7c5y5WDrL1m5HD1H4AeyBhicHgdaFmxjLAva2bq0sYKy/S7cdeYA==", "dev": true, "license": "MIT", "dependencies": { @@ -11878,36 +11838,6 @@ "tslib": "^2.8.1" } }, - "node_modules/@peculiar/json-schema": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", - "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@peculiar/webcrypto": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz", - "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.3.8", - "@peculiar/json-schema": "^1.1.12", - "pvtsutils": "^1.3.5", - "tslib": "^2.6.2", - "webcrypto-core": "^1.8.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, "node_modules/@phenomnomnominal/tsquery": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz", @@ -11953,9 +11883,9 @@ "license": "MIT" }, "node_modules/@prisma/client": { - "version": "6.17.1", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.17.1.tgz", - "integrity": "sha512-zL58jbLzYamjnNnmNA51IOZdbk5ci03KviXCuB0Tydc9btH2kDWsi1pQm2VecviRTM7jGia0OPPkgpGnT3nKvw==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.18.0.tgz", + "integrity": "sha512-jnL2I9gDnPnw4A+4h5SuNn8Gc+1mL1Z79U/3I9eE2gbxJG1oSA+62ByPW4xkeDgwE0fqMzzpAZ7IHxYnLZ4iQA==", "hasInstallScript": true, "license": "Apache-2.0", "engines": { @@ -11975,66 +11905,66 @@ } }, "node_modules/@prisma/config": { - "version": "6.17.1", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.17.1.tgz", - "integrity": "sha512-fs8wY6DsvOCzuiyWVckrVs1LOcbY4LZNz8ki4uUIQ28jCCzojTGqdLhN2Jl5lDnC1yI8/gNIKpsWDM8pLhOdwA==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.18.0.tgz", + "integrity": "sha512-rgFzspCpwsE+q3OF/xkp0fI2SJ3PfNe9LLMmuSVbAZ4nN66WfBiKqJKo/hLz3ysxiPQZf8h1SMf2ilqPMeWATQ==", "devOptional": true, "license": "Apache-2.0", "dependencies": { "c12": "3.1.0", "deepmerge-ts": "7.1.5", - "effect": "3.16.12", + "effect": "3.18.4", "empathic": "2.0.0" } }, "node_modules/@prisma/debug": { - "version": "6.17.1", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.17.1.tgz", - "integrity": "sha512-Vf7Tt5Wh9XcndpbmeotuqOMLWPTjEKCsgojxXP2oxE1/xYe7PtnP76hsouG9vis6fctX+TxgmwxTuYi/+xc7dQ==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.18.0.tgz", + "integrity": "sha512-PMVPMmxPj0ps1VY75DIrT430MoOyQx9hmm174k6cmLZpcI95rAPXOQ+pp8ANQkJtNyLVDxnxVJ0QLbrm/ViBcg==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines": { - "version": "6.17.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.17.1.tgz", - "integrity": "sha512-D95Ik3GYZkqZ8lSR4EyFOJ/tR33FcYRP8kK61o+WMsyD10UfJwd7+YielflHfKwiGodcqKqoraWw8ElAgMDbPw==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.18.0.tgz", + "integrity": "sha512-i5RzjGF/ex6AFgqEe2o1IW8iIxJGYVQJVRau13kHPYEL1Ck8Zvwuzamqed/1iIljs5C7L+Opiz5TzSsUebkriA==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.17.1", - "@prisma/engines-version": "6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac", - "@prisma/fetch-engine": "6.17.1", - "@prisma/get-platform": "6.17.1" + "@prisma/debug": "6.18.0", + "@prisma/engines-version": "6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f", + "@prisma/fetch-engine": "6.18.0", + "@prisma/get-platform": "6.18.0" } }, "node_modules/@prisma/engines-version": { - "version": "6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac.tgz", - "integrity": "sha512-17140E3huOuD9lMdJ9+SF/juOf3WR3sTJMVyyenzqUPbuH+89nPhSWcrY+Mf7tmSs6HvaO+7S+HkELinn6bhdg==", + "version": "6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f.tgz", + "integrity": "sha512-T7Af4QsJQnSgWN1zBbX+Cha5t4qjHRxoeoWpK4JugJzG/ipmmDMY5S+O0N1ET6sCBNVkf6lz+Y+ZNO9+wFU8pQ==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/fetch-engine": { - "version": "6.17.1", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.17.1.tgz", - "integrity": "sha512-AYZiHOs184qkDMiTeshyJCtyL4yERkjfTkJiSJdYuSfc24m94lTNL5+GFinZ6vVz+ktX4NJzHKn1zIFzGTWrWg==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.18.0.tgz", + "integrity": "sha512-TdaBvTtBwP3IoqVYoGIYpD4mWlk0pJpjTJjir/xLeNWlwog7Sl3bD2J0jJ8+5+q/6RBg+acb9drsv5W6lqae7A==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.17.1", - "@prisma/engines-version": "6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac", - "@prisma/get-platform": "6.17.1" + "@prisma/debug": "6.18.0", + "@prisma/engines-version": "6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f", + "@prisma/get-platform": "6.18.0" } }, "node_modules/@prisma/get-platform": { - "version": "6.17.1", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.17.1.tgz", - "integrity": "sha512-AKEn6fsfz0r482S5KRDFlIGEaq9wLNcgalD1adL+fPcFFblIKs1sD81kY/utrHdqKuVC6E1XSRpegDK3ZLL4Qg==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.18.0.tgz", + "integrity": "sha512-uXNJCJGhxTCXo2B25Ta91Rk1/Nmlqg9p7G9GKh8TPhxvAyXCvMNQoogj4JLEUy+3ku8g59cpyQIKFhqY2xO2bg==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.17.1" + "@prisma/debug": "6.18.0" } }, "node_modules/@redis/client": { @@ -13724,24 +13654,28 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, "license": "MIT" }, "node_modules/@tufjs/canonical-json": { @@ -14419,11 +14353,12 @@ "license": "MIT" }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", - "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", "license": "MIT", "dependencies": { + "@types/ms": "*", "@types/node": "*" } }, @@ -14435,9 +14370,9 @@ "license": "MIT" }, "node_modules/@types/luxon": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.6.2.tgz", - "integrity": "sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz", + "integrity": "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==", "license": "MIT" }, "node_modules/@types/mdx": { @@ -14454,6 +14389,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "22.15.17", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", @@ -15649,6 +15590,7 @@ "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "devOptional": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -15695,6 +15637,7 @@ "version": "8.3.4", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, "license": "MIT", "dependencies": { "acorn": "^8.11.0" @@ -16020,6 +15963,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, "license": "MIT" }, "node_modules/argparse": { @@ -16672,14 +16616,6 @@ "dev": true, "license": "MIT" }, - "node_modules/base64-arraybuffer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", - "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -17003,30 +16939,6 @@ "popper.js": "^1.16.1" } }, - "node_modules/borc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", - "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.0", - "buffer": "^5.5.0", - "commander": "^2.15.0", - "ieee754": "^1.1.13", - "iso-url": "~0.4.7", - "json-text-sequence": "~0.1.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/borc/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -17123,6 +17035,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -17565,6 +17478,12 @@ "node": ">=8" } }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "license": "MIT" + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -18230,17 +18149,15 @@ } }, "node_modules/comment-json": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.5.tgz", - "integrity": "sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.4.1.tgz", + "integrity": "sha512-r1To31BQD5060QdkC+Iheai7gHwoSZobzunqkf2/kQ6xIAfJyrKNAFUwdKvkK7Qgu7pVTKQEa7ok7Ed3ycAJgg==", "dev": true, "license": "MIT", "dependencies": { "array-timsort": "^1.0.3", "core-util-is": "^1.0.3", - "esprima": "^4.0.1", - "has-own-prop": "^2.0.0", - "repeat-string": "^1.6.1" + "esprima": "^4.0.1" }, "engines": { "node": ">= 6" @@ -18606,9 +18523,9 @@ } }, "node_modules/countries-list": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/countries-list/-/countries-list-3.1.1.tgz", - "integrity": "sha512-nPklKJ5qtmY5MdBKw1NiBAoyx5Sa7p2yPpljZyQ7gyCN1m+eMFs9I6CT37Mxt8zvR5L3VzD3DJBE4WQzX3WF4A==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/countries-list/-/countries-list-3.2.0.tgz", + "integrity": "sha512-HYHAo2fwEsG3TmbsNdVmIQPHizRlqeYMTtLEAl0IANG/3jRYX7p3NR6VapDqKP0n60TmsRy1dyRjVN5JbywDbA==", "license": "MIT" }, "node_modules/countup.js": { @@ -19284,16 +19201,17 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, "license": "MIT" }, "node_modules/cron": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/cron/-/cron-4.3.0.tgz", - "integrity": "sha512-ciiYNLfSlF9MrDqnbMdRWFiA6oizSF7kA1osPP9lRzNu0Uu+AWog1UKy7SkckiDY2irrNjeO6qLyKnXC8oxmrw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/cron/-/cron-4.3.3.tgz", + "integrity": "sha512-B/CJj5yL3sjtlun6RtYHvoSB26EmQ2NUmhq9ZiJSyKIM4K/fqfh9aelDFlIayD2YMeFZqWLi9hHV+c+pq2Djkw==", "license": "MIT", "dependencies": { - "@types/luxon": "~3.6.0", - "luxon": "~3.6.0" + "@types/luxon": "~3.7.0", + "luxon": "~3.7.0" }, "engines": { "node": ">=18.x" @@ -20767,12 +20685,6 @@ "dev": true, "license": "MIT" }, - "node_modules/delimit-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", - "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==", - "license": "BSD-2-Clause" - }, "node_modules/denque": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", @@ -20867,6 +20779,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -21036,9 +20949,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -21048,9 +20961,9 @@ } }, "node_modules/dotenv-expand": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.1.tgz", - "integrity": "sha512-LaKRbou8gt0RNID/9RoI+J2rvXsBRPMV7p+ElHlPhcSARbCPDYcYG2s1TIzAfWv4YSgyY5taidWzzs31lNV3yQ==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.3.tgz", + "integrity": "sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==", "license": "BSD-2-Clause", "dependencies": { "dotenv": "^16.4.5" @@ -21062,6 +20975,18 @@ "url": "https://dotenvx.com" } }, + "node_modules/dotenv-expand/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -21124,9 +21049,9 @@ "license": "MIT" }, "node_modules/effect": { - "version": "3.16.12", - "resolved": "https://registry.npmjs.org/effect/-/effect-3.16.12.tgz", - "integrity": "sha512-N39iBk0K71F9nb442TLbTkjl24FLUzuvx2i1I2RsEAQsdAdUTuUoW0vlfUXgkMTUOnYqKnWcFfqw4hK4Pw27hg==", + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz", + "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -24157,16 +24082,6 @@ "node": ">=8" } }, - "node_modules/has-own-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", - "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -24797,12 +24712,6 @@ "postcss": "^8.1.0" } }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "license": "ISC" - }, "node_modules/identity-obj-proxy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", @@ -25057,12 +24966,12 @@ } }, "node_modules/ioredis": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz", - "integrity": "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.8.2.tgz", + "integrity": "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==", "license": "MIT", "dependencies": { - "@ioredis/commands": "^1.1.1", + "@ioredis/commands": "1.4.0", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", @@ -25794,15 +25703,6 @@ "dev": true, "license": "ISC" }, - "node_modules/iso-url": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", - "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", @@ -30055,12 +29955,6 @@ "license": "MIT", "peer": true }, - "node_modules/js-sha256": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", - "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", - "license": "MIT" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -30273,15 +30167,6 @@ "dev": true, "license": "ISC" }, - "node_modules/json-text-sequence": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", - "integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==", - "license": "MIT", - "dependencies": { - "delimit-stream": "0.1.0" - } - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -31572,9 +31457,9 @@ } }, "node_modules/load-esm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.2.tgz", - "integrity": "sha512-nVAvWk/jeyrWyXEAs84mpQCYccxRqgKY4OznLuJhJCa0XsPSfdOIr2zvBZEj3IHEHbX97jjscKRRV539bW0Gpw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz", + "integrity": "sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==", "funding": [ { "type": "github", @@ -31992,9 +31877,9 @@ "license": "ISC" }, "node_modules/luxon": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz", - "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", "license": "MIT", "engines": { "node": ">=12" @@ -32040,6 +31925,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, "license": "ISC" }, "node_modules/make-fetch-happen": { @@ -32585,9 +32471,9 @@ } }, "node_modules/multer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.1.tgz", - "integrity": "sha512-Ug8bXeTIUlxurg8xLTEskKShvcKDZALo1THEX5E41pYCD2sCVub5/kIRIGqWNoqV6szyLyQKV6mD4QUrWE5GCQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", @@ -32737,9 +32623,9 @@ "license": "MIT" }, "node_modules/ng-extract-i18n-merge": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ng-extract-i18n-merge/-/ng-extract-i18n-merge-3.0.0.tgz", - "integrity": "sha512-vTWtAz6a/wVYxnUMFHp1ur6o4JSLm+LcxdSMV8o8Ml2p5oCsSB4iFd5E6h8Yb8X8D596qyBz0ELgiDmbn4YyRQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ng-extract-i18n-merge/-/ng-extract-i18n-merge-3.1.0.tgz", + "integrity": "sha512-4rJRcpTcP54xf5cjoz3S1By0T04X2RoyQcMDxr4wLdRx3fVxkeP8jeuLzmj9F4G5n0yMQb+6jhUiFERxpkfs1w==", "license": "MIT", "dependencies": { "@angular-devkit/architect": "^0.2000.0", @@ -33451,6 +33337,19 @@ "node": ">=8" } }, + "node_modules/nx/node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/nx/node_modules/dotenv-expand": { "version": "11.0.7", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", @@ -34695,12 +34594,13 @@ "license": "ISC" }, "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", - "engines": { - "node": ">=16" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/path-type": { @@ -35740,15 +35640,15 @@ } }, "node_modules/prisma": { - "version": "6.17.1", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.17.1.tgz", - "integrity": "sha512-ac6h0sM1Tg3zu8NInY+qhP/S9KhENVaw9n1BrGKQVFu05JT5yT5Qqqmb8tMRIE3ZXvVj4xcRA5yfrsy4X7Yy5g==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.18.0.tgz", + "integrity": "sha512-bXWy3vTk8mnRmT+SLyZBQoC2vtV9Z8u7OHvEu+aULYxwiop/CPiFZ+F56KsNRNf35jw+8wcu8pmLsjxpBxAO9g==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/config": "6.17.1", - "@prisma/engines": "6.17.1" + "@prisma/config": "6.18.0", + "@prisma/engines": "6.18.0" }, "bin": { "prisma": "build/index.js" @@ -36453,16 +36353,6 @@ "entities": "^2.0.0" } }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/replace-in-file": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-8.3.0.tgz", @@ -38034,12 +37924,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/simple-cbor": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/simple-cbor/-/simple-cbor-0.4.1.tgz", - "integrity": "sha512-rijcxtwx2b4Bje3sqeIqw5EeW7UlOIC4YfOdwqIKacpvRQ/D78bWg/4/0m5e0U91oKvlGh7LlJuZCu07ISCC7w==", - "license": "ISC" - }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", @@ -39046,6 +38930,117 @@ "url": "https://opencollective.com/synckit" } }, + "node_modules/tablemark": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tablemark/-/tablemark-4.1.0.tgz", + "integrity": "sha512-B3LDjbDo+ac+D5RwkBOPZZ6ua8716KdT+6NO3DKOCHJq0ezE6vV2r92rjrC1ci2H+ocuysl5ytf1T0QqV65yoA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2", + "change-case": "^5.4.4", + "string-width": "^8.1.0", + "wordwrapjs": "^5.1.0", + "wrap-ansi": "^9.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/tablemark/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/tablemark/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tablemark/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/tablemark/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tablemark/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/tablemark/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/tablemark/node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tapable": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", @@ -39884,6 +39879,7 @@ "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -40061,16 +40057,10 @@ "node": "*" } }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "license": "Unlicense" - }, "node_modules/twitter-api-v2": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/twitter-api-v2/-/twitter-api-v2-1.23.0.tgz", - "integrity": "sha512-5i1agETVpTuY68Zuk9i2B3N9wHzc4JIWw0WKyG4CEaFv9mRKmU87roa+U1oYYXTChWb0HMcqfkwoBJHYmLbeDA==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/twitter-api-v2/-/twitter-api-v2-1.27.0.tgz", + "integrity": "sha512-hbIFwzg0NeOcFOdmJqtKMCXjLjc0INff/7NwhnZ2zpnw65oku8i+0eMxo5M0iTc1hs+inD/IpDw3S0Xh2c45QQ==", "license": "Apache-2.0" }, "node_modules/type-check": { @@ -40637,6 +40627,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, "license": "MIT" }, "node_modules/v8-to-istanbul": { @@ -40952,20 +40943,6 @@ "license": "MIT", "optional": true }, - "node_modules/webcrypto-core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.8.1.tgz", - "integrity": "sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==", - "license": "MIT", - "peer": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.3.13", - "@peculiar/json-schema": "^1.1.12", - "asn1js": "^3.0.5", - "pvtsutils": "^1.3.5", - "tslib": "^2.7.0" - } - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -41928,6 +41905,15 @@ "node": ">=0.10.0" } }, + "node_modules/wordwrapjs": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz", + "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -42257,6 +42243,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" diff --git a/package.json b/package.json index cb0ba6731..ea8646565 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.208.0", + "version": "2.215.0-beta.1", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", @@ -69,27 +69,22 @@ "@angular/service-worker": "20.2.4", "@codewithdan/observable-store": "2.2.15", "@date-fns/utc": "2.1.0", - "@dfinity/agent": "0.15.7", - "@dfinity/auth-client": "0.15.7", - "@dfinity/candid": "0.15.7", - "@dfinity/identity": "0.15.7", - "@dfinity/principal": "0.15.7", "@internationalized/number": "3.6.3", "@ionic/angular": "8.7.3", "@keyv/redis": "4.4.0", - "@nestjs/bull": "11.0.2", + "@nestjs/bull": "11.0.4", "@nestjs/cache-manager": "3.0.1", - "@nestjs/common": "11.1.3", + "@nestjs/common": "11.1.8", "@nestjs/config": "4.0.2", - "@nestjs/core": "11.1.3", + "@nestjs/core": "11.1.8", "@nestjs/event-emitter": "3.0.1", - "@nestjs/jwt": "11.0.0", + "@nestjs/jwt": "11.0.1", "@nestjs/passport": "11.0.5", - "@nestjs/platform-express": "11.1.3", - "@nestjs/schedule": "6.0.0", - "@nestjs/serve-static": "5.0.3", + "@nestjs/platform-express": "11.1.8", + "@nestjs/schedule": "6.0.1", + "@nestjs/serve-static": "5.0.4", "@openrouter/ai-sdk-provider": "0.7.2", - "@prisma/client": "6.17.1", + "@prisma/client": "6.18.0", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", "@stripe/stripe-js": "7.9.0", @@ -108,9 +103,11 @@ "class-validator": "0.14.2", "color": "5.0.0", "countries-and-timezones": "3.8.0", - "countries-list": "3.1.1", + "countries-list": "3.2.0", "countup.js": "2.9.0", "date-fns": "4.1.0", + "dotenv": "17.2.3", + "dotenv-expand": "12.0.3", "envalid": "8.1.0", "fuse.js": "7.1.0", "google-spreadsheet": "3.2.0", @@ -121,7 +118,7 @@ "lodash": "4.17.21", "marked": "15.0.4", "ms": "3.0.0-canary.1", - "ng-extract-i18n-merge": "3.0.0", + "ng-extract-i18n-merge": "3.1.0", "ngx-device-detector": "10.1.0", "ngx-markdown": "20.0.0", "ngx-skeleton-loader": "11.3.0", @@ -136,7 +133,8 @@ "rxjs": "7.8.1", "stripe": "18.5.0", "svgmap": "2.12.2", - "twitter-api-v2": "1.23.0", + "tablemark": "4.1.0", + "twitter-api-v2": "1.27.0", "uuid": "11.1.0", "yahoo-finance2": "3.10.0", "zone.js": "0.15.1" @@ -155,8 +153,8 @@ "@angular/pwa": "20.2.2", "@eslint/eslintrc": "3.3.1", "@eslint/js": "9.35.0", - "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.3", + "@nestjs/schematics": "11.0.9", + "@nestjs/testing": "11.1.8", "@nx/angular": "21.5.1", "@nx/cypress": "21.5.1", "@nx/eslint-plugin": "21.5.1", @@ -194,7 +192,7 @@ "nx": "21.5.1", "prettier": "3.6.2", "prettier-plugin-organize-attributes": "1.0.0", - "prisma": "6.17.1", + "prisma": "6.18.0", "react": "18.2.0", "react-dom": "18.2.0", "replace-in-file": "8.3.0", diff --git a/prisma.config.ts b/prisma.config.ts deleted file mode 100644 index 24da6d886..000000000 --- a/prisma.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import 'dotenv/config'; -import { join } from 'node:path'; -import { defineConfig } from 'prisma/config'; - -export default defineConfig({ - migrations: { - path: join('prisma', 'migrations'), - seed: `node ${join('prisma', 'seed.mts')}` - }, - schema: join('prisma', 'schema.prisma') -}); diff --git a/test/import/not-ok/invalid-data-source.json b/test/import/not-ok/invalid-data-source.json index 472e295ee..f8e920c67 100644 --- a/test/import/not-ok/invalid-data-source.json +++ b/test/import/not-ok/invalid-data-source.json @@ -14,5 +14,11 @@ "type": "BUY", "unitPrice": 100.0 } - ] + ], + "user": { + "settings": { + "currency": "USD", + "performanceCalculationType": "ROAI" + } + } } diff --git a/test/import/not-ok/invalid-date-before-min.json b/test/import/not-ok/invalid-date-before-min.json index 3040581b2..260d79166 100644 --- a/test/import/not-ok/invalid-date-before-min.json +++ b/test/import/not-ok/invalid-date-before-min.json @@ -14,5 +14,11 @@ "type": "BUY", "unitPrice": 100.0 } - ] + ], + "user": { + "settings": { + "currency": "USD", + "performanceCalculationType": "ROAI" + } + } } diff --git a/test/import/not-ok/invalid-date.json b/test/import/not-ok/invalid-date.json index 99cd6d156..4522c6dcc 100644 --- a/test/import/not-ok/invalid-date.json +++ b/test/import/not-ok/invalid-date.json @@ -14,5 +14,11 @@ "type": "BUY", "unitPrice": 100.0 } - ] + ], + "user": { + "settings": { + "currency": "USD", + "performanceCalculationType": "ROAI" + } + } } diff --git a/test/import/not-ok/invalid-symbol.json b/test/import/not-ok/invalid-symbol.json index 14f0051ec..0bbbf53db 100644 --- a/test/import/not-ok/invalid-symbol.json +++ b/test/import/not-ok/invalid-symbol.json @@ -14,5 +14,11 @@ "type": "BUY", "unitPrice": 100.0 } - ] + ], + "user": { + "settings": { + "currency": "USD", + "performanceCalculationType": "ROAI" + } + } } diff --git a/test/import/not-ok/invalid-type.json b/test/import/not-ok/invalid-type.json index a23f72411..a8967d81a 100644 --- a/test/import/not-ok/invalid-type.json +++ b/test/import/not-ok/invalid-type.json @@ -14,5 +14,11 @@ "type": "", "unitPrice": 100.0 } - ] + ], + "user": { + "settings": { + "currency": "USD", + "performanceCalculationType": "ROAI" + } + } } diff --git a/test/import/not-ok/unavailable-exchange-rate.json b/test/import/not-ok/unavailable-exchange-rate.json index 4d8be156a..66c7044d7 100644 --- a/test/import/not-ok/unavailable-exchange-rate.json +++ b/test/import/not-ok/unavailable-exchange-rate.json @@ -15,5 +15,11 @@ "date": "1990-01-01T00:00:00.000Z", "symbol": "MSFT" } - ] + ], + "user": { + "settings": { + "currency": "USD", + "performanceCalculationType": "ROAI" + } + } } diff --git a/test/import/ok/500-activities.json b/test/import/ok/500-activities.json index b691a6f9f..2793c695e 100644 --- a/test/import/ok/500-activities.json +++ b/test/import/ok/500-activities.json @@ -6019,7 +6019,8 @@ ], "user": { "settings": { - "currency": "USD" + "currency": "USD", + "performanceCalculationType": "ROAI" } } } diff --git a/test/import/ok/btceur.json b/test/import/ok/btceur.json index b370682f9..ae9eb8921 100644 --- a/test/import/ok/btceur.json +++ b/test/import/ok/btceur.json @@ -23,7 +23,8 @@ ], "user": { "settings": { - "currency": "USD" + "currency": "USD", + "performanceCalculationType": "ROAI" } } } diff --git a/test/import/ok/btcusd-short.json b/test/import/ok/btcusd-short.json index bc4152de9..6f25a7740 100644 --- a/test/import/ok/btcusd-short.json +++ b/test/import/ok/btcusd-short.json @@ -36,7 +36,8 @@ ], "user": { "settings": { - "currency": "USD" + "currency": "USD", + "performanceCalculationType": "ROAI" } } } diff --git a/test/import/ok/btcusd.json b/test/import/ok/btcusd.json index fc2e1f66e..4a85f967e 100644 --- a/test/import/ok/btcusd.json +++ b/test/import/ok/btcusd.json @@ -23,7 +23,8 @@ ], "user": { "settings": { - "currency": "USD" + "currency": "USD", + "performanceCalculationType": "ROAI" } } } diff --git a/test/import/ok/derived-currency.json b/test/import/ok/derived-currency.json index e740c1ae3..637ab21b6 100644 --- a/test/import/ok/derived-currency.json +++ b/test/import/ok/derived-currency.json @@ -31,7 +31,8 @@ ], "user": { "settings": { - "currency": "USD" + "currency": "USD", + "performanceCalculationType": "ROAI" } } } diff --git a/test/import/ok/novn-buy-and-sell-partially.json b/test/import/ok/novn-buy-and-sell-partially.json index 8c5778566..3bdd7eb7e 100644 --- a/test/import/ok/novn-buy-and-sell-partially.json +++ b/test/import/ok/novn-buy-and-sell-partially.json @@ -27,7 +27,8 @@ ], "user": { "settings": { - "currency": "CHF" + "currency": "CHF", + "performanceCalculationType": "ROAI" } } } diff --git a/test/import/ok/novn-buy-and-sell.json b/test/import/ok/novn-buy-and-sell.json index 71ee9b7a9..6ae519d87 100644 --- a/test/import/ok/novn-buy-and-sell.json +++ b/test/import/ok/novn-buy-and-sell.json @@ -27,7 +27,8 @@ ], "user": { "settings": { - "currency": "CHF" + "currency": "CHF", + "performanceCalculationType": "ROAI" } } } diff --git a/test/import/ok/penthouse-apartment.csv b/test/import/ok/penthouse-apartment.csv new file mode 100644 index 000000000..27eb5bf1c --- /dev/null +++ b/test/import/ok/penthouse-apartment.csv @@ -0,0 +1,2 @@ +Date,Code,DataSource,Currency,Price,Quantity,Action,Fee,Note +01.01.2022,Penthouse Apartment,MANUAL,USD,500000.0,1,buy,0.00, diff --git a/test/import/ok/penthouse-apartment.json b/test/import/ok/penthouse-apartment.json index 3b230cf76..0c35521e6 100644 --- a/test/import/ok/penthouse-apartment.json +++ b/test/import/ok/penthouse-apartment.json @@ -42,12 +42,13 @@ "symbol": "7e91b7d4-1430-4212-8380-289a06c9bbc1", "tags": [], "type": "BUY", - "unitPrice": 500000, + "unitPrice": 500000 } ], "user": { "settings": { - "currency": "USD" + "currency": "USD", + "performanceCalculationType": "ROAI" } } } diff --git a/test/import/ok/sample.json b/test/import/ok/sample.json index 21277129f..bc2798718 100644 --- a/test/import/ok/sample.json +++ b/test/import/ok/sample.json @@ -147,7 +147,8 @@ ], "user": { "settings": { - "currency": "USD" + "currency": "USD", + "performanceCalculationType": "ROAI" } } } diff --git a/test/import/ok/vti-buy-long-history.json b/test/import/ok/vti-buy-long-history.json index c8cd25e60..88b38d2b1 100644 --- a/test/import/ok/vti-buy-long-history.json +++ b/test/import/ok/vti-buy-long-history.json @@ -40,7 +40,8 @@ ], "user": { "settings": { - "currency": "USD" + "currency": "USD", + "performanceCalculationType": "ROAI" } } } diff --git a/test/import/ok/without-accounts.json b/test/import/ok/without-accounts.json index 8a24f86fc..2283dd889 100644 --- a/test/import/ok/without-accounts.json +++ b/test/import/ok/without-accounts.json @@ -47,7 +47,8 @@ ], "user": { "settings": { - "currency": "USD" + "currency": "USD", + "performanceCalculationType": "ROAI" } } }