diff --git a/CHANGELOG.md b/CHANGELOG.md index d17dbc5f0..0fef4ef7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,16 +9,183 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Added a live preview of the date and number format to the user settings +- Added the country flag to the currency selector +- Added a _Storybook_ story for the currency selector component +- Extended the entity logo component by a `hasPlaceholder` attribute to reserve the space of a missing logo - Warmed up the portfolio snapshot calculation in the background during the biometric authentication ### Changed +- Improved the usability of the create watchlist item dialog by setting the initial focus to the search field +- Migrated the abstract _Material_ form field from a component to a directive +- Removed the redundant `balance` attribute of the account in favor of the account balances + +### Fixed + +- Fixed the values of the charts and tables in impersonation mode with an unrestricted access to show absolute values instead of percentages +- Fixed the savings rate of the investment timeline chart and the streaks on the analysis page in impersonation mode to be based on the impersonated user +- Fixed the savings rate of the _FIRE_ calculator in impersonation mode to not be based on the impersonating user + +## 3.43.0 - 2026-08-06 + +### Added + +- Added the platform logo to the platform selector in the create or update account dialog +- Added the platform logo to the account selector in the create or update activity dialog +- Extended the value component by an `isLoading` attribute to distinguish the loading state from redacted values + +### Changed + +- Guarded the system tags against deletion and renaming in the tag management of the admin control panel +- Improved the language localization for Spanish (`es`) + +### Fixed + +- Handled an exception in the country weightings parsing of the _Financial Modeling Prep_ service + +## 3.42.0 - 2026-08-04 + +### Changed + +- Improved the usability of the portfolio summary by collapsing the _Holdings_ and _Cash_ breakdowns by default +- Extended the support of the _Exclude from Analysis_ tag from accounts to activities +- Optimized the performance of the search in the assistant by reusing the cached portfolio snapshot +- Improved the validation of the import functionality when referencing an asset profile with the data source `MANUAL` +- Improved the validation of the endpoint to add a custom asset profile in the admin control panel + +### Fixed + +- Fixed the fuzzy search for the holdings in the assistant + +## 3.41.0 - 2026-08-03 + +### Added + +- Added support for the account platforms in the activities import +- Added the database model and endpoints to manage the stock splits of an asset profile (experimental) + +### Changed + +- Improved the usability of the admin control panel by eliminating the page reload on changing a setting +- Improved the usability of the admin control panel by eliminating the page reload on deleting an asset profile +- Improved the usability of the admin control panel by eliminating the page reload on flushing the cache +- Improved the usability of the admin control panel by eliminating the page reload on gathering historical market data +- Improved the language localization for German (`de`) + +### Fixed + +- Fixed the loading state in the user detail dialog of the admin control panel’s users section +- Fixed a race condition where the portfolio snapshot computation was completed before its result had been cached, causing a redundant recomputation +- Fixed an endless loop in the portfolio snapshot computation if the computed result could not be read from the cache + +## 3.40.0 - 2026-08-02 + +### Changed + +- Improved the style of the read-only tags in the tags selector component +- Improved the language localization for Chinese (`zh`) +- Upgraded `nestjs` from version `11.1.27` to `11.1.28` + +### Fixed + +- Fixed the handling of the _Exclude from Analysis_ tag in the activities table +- Fixed the persistence of an empty comment in the create or update account dialog +- Resolved a validation error caused by empty strings in the asset profile details dialog of the admin control panel + +## 3.39.0 - 2026-08-01 + +### Changed + +- Harmonized the data format of the export functionality +- Removed the deprecated `firstOrderDate` attribute from the `GET api/v2/portfolio/performance` endpoint response +- Removed the deprecated `isExcluded` attribute of the account in favor of the _Exclude from Analysis_ tag including a data migration +- Improved the language localization for German (`de`) +- Upgraded `prisma` from version `7.8.0` to `7.9.1` + +### Fixed + +- Fixed the scroll behavior of the page content behind an open dialog +- Fixed the export functionality to only include the accounts of the exported activities if a filter is applied + +## 3.38.0 - 2026-07-31 + +### Added + +- Added support for the date range filter in the export functionality +- Added support for the date range filter on the portfolio activities page + +### Changed + +- Improved the style of the tabs in the account detail dialog on mobile +- Improved the style of the tabs in the holding detail dialog on mobile +- Improved the style of the tabs in the asset profile dialog of the admin control panel on mobile +- Improved the style of the empty state in the _Fear & Greed Index_ component +- Added the activity count to the delete menu item of the activities table +- Added the activity count to the deletion confirmation dialog of the activities table +- Improved the style of the type filter in the activities table component (experimental) +- Improved the search functionality by trimming the query +- Improved the log output in the search functionality of the _Yahoo Finance_ service for unsupported queries +- Improved the performance of the property service by caching the properties in memory +- Improved the validation of the query parameters in the activities endpoints +- Improved the language localization for German (`de`) + +### Fixed + +- Fixed the calendar year date range in time zones with a negative _UTC_ offset +- Fixed the deletion of activities to respect the activity type filter on the activities page (experimental) +- Fixed the deletion of activities to respect the date range filter on the activities page +- Fixed the static portfolio analysis rule for a portfolio with no holdings: _Asset Class Cluster Risks_ (Equity) +- Fixed the static portfolio analysis rule for a portfolio with no holdings: _Asset Class Cluster Risks_ (Fixed Income) +- Fixed the static portfolio analysis rule for a portfolio with no holdings: _Currency Cluster Risks_ (Investment) +- Fixed the static portfolio analysis rule for a portfolio with no holdings: _Currency Cluster Risks_ (Investment: Base Currency) +- Fixed the static portfolio analysis rule for a portfolio with no holdings: _Economic Market Cluster Risks_ (Developed Markets) +- Fixed the static portfolio analysis rule for a portfolio with no holdings: _Economic Market Cluster Risks_ (Emerging Markets) +- Fixed the static portfolio analysis rule for a portfolio with no holdings: _Regional Market Cluster Risks_ (Asia-Pacific) +- Fixed the static portfolio analysis rule for a portfolio with no holdings: _Regional Market Cluster Risks_ (Emerging Markets) +- Fixed the static portfolio analysis rule for a portfolio with no holdings: _Regional Market Cluster Risks_ (Europe) +- Fixed the static portfolio analysis rule for a portfolio with no holdings: _Regional Market Cluster Risks_ (Japan) +- Fixed the static portfolio analysis rule for a portfolio with no holdings: _Regional Market Cluster Risks_ (North America) + +## 3.37.0 - 2026-07-30 + +### Added + +- Added an empty state to the _Fear & Greed Index_ component +- Added a _Storybook_ story for the _Fear & Greed Index_ component + +### Changed + +- Moved the tags to the overview tab of the account detail dialog (experimental) +- Moved the tags to the overview tab of the holding detail dialog +- Consolidated the markets pages into a single route where the _Fear & Greed Index_ is controlled by permission +- Refactored the line chart components to share the common chart configuration +- Improved the language localization for Spanish (`es`) +- Improved the language localization for Ukrainian (`uk`) + +### Fixed + +- Ignored future-dated account balances in the portfolio calculation + +## 3.36.0 - 2026-07-29 + +### Added + +- Added an overview tab to the account detail dialog +- Added the tags (read-only) to the account detail dialog (experimental) + +### Changed + +- Improved the portfolio summary tab on the home page +- Improved the language localization for German (`de`) - Upgraded `@openrouter/ai-sdk-provider` from version `2.9.1` to `3.0.0` - Upgraded `ai` from version `6.0.174` to `7.0.37` ### Fixed - Fixed the time in market of the portfolio summary to be empty if there is no activity +- Fixed an issue with the delete button in the activities filter component +- Fixed the tags in the read-only mode of the tags selector component ## 3.35.0 - 2026-07-27 diff --git a/apps/api/src/app/account-balance/account-balance.service.ts b/apps/api/src/app/account-balance/account-balance.service.ts index 84932f429..29c7f2887 100644 --- a/apps/api/src/app/account-balance/account-balance.service.ts +++ b/apps/api/src/app/account-balance/account-balance.service.ts @@ -1,5 +1,8 @@ import { PortfolioChangedEvent } from '@ghostfolio/api/events/portfolio-changed.event'; -import { WHERE_ACCOUNT_NOT_EXCLUDED } from '@ghostfolio/api/helper/account.helper'; +import { + isAccountBalanceInFuture, + WHERE_ACCOUNT_NOT_EXCLUDED +} from '@ghostfolio/api/helper/account.helper'; import { LogPerformance } from '@ghostfolio/api/interceptors/performance-logging/performance-logging.interceptor'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; @@ -15,7 +18,7 @@ import { Injectable } from '@nestjs/common'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { AccountBalance, Prisma } from '@prisma/client'; import { Big } from 'big.js'; -import { format, parseISO } from 'date-fns'; +import { endOfToday, format, parseISO } from 'date-fns'; import { groupBy } from 'lodash'; @Injectable() @@ -114,8 +117,13 @@ export class AccountBalanceService { const accumulatedBalancesByDate: { [date: string]: HistoricalDataItem } = {}; const lastBalancesByAccount: { [accountId: string]: Big } = {}; + const endOfTodayDate = endOfToday(); for (const { accountId, date, valueInBaseCurrency } of balances) { + if (isAccountBalanceInFuture({ date, endOfTodayDate })) { + continue; + } + const formattedDate = format(date, DATE_FORMAT); lastBalancesByAccount[accountId] = new Big(valueInBaseCurrency); diff --git a/apps/api/src/app/account/account.controller.ts b/apps/api/src/app/account/account.controller.ts index 6466a13b2..f43aeedd5 100644 --- a/apps/api/src/app/account/account.controller.ts +++ b/apps/api/src/app/account/account.controller.ts @@ -156,32 +156,34 @@ export class AccountController { public async createAccount( @Body() data: CreateAccountDto ): Promise { - const { tags: tagIds, ...accountData } = data; + const { balance, tags: tagIds, ...accountData } = data; if (accountData.platformId) { const platformId = accountData.platformId; delete accountData.platformId; - return this.accountService.createAccount( - { + return this.accountService.createAccount({ + balance, + tagIds, + data: { ...accountData, platform: { connect: { id: platformId } }, user: { connect: { id: this.request.user.id } } }, - this.request.user.id, - tagIds - ); + userId: this.request.user.id + }); } else { delete accountData.platformId; - return this.accountService.createAccount( - { + return this.accountService.createAccount({ + balance, + tagIds, + data: { ...accountData, user: { connect: { id: this.request.user.id } } }, - this.request.user.id, - tagIds - ); + userId: this.request.user.id + }); } } @@ -257,52 +259,50 @@ export class AccountController { ); } - const { tags: tagIds, ...accountData } = data; + const { balance, tags: tagIds, ...accountData } = data; if (accountData.platformId) { const platformId = accountData.platformId; delete accountData.platformId; - return this.accountService.updateAccount( - { - data: { - ...accountData, - platform: { connect: { id: platformId } }, - user: { connect: { id: this.request.user.id } } - }, - where: { - id_userId: { - id, - userId: this.request.user.id - } - } + return this.accountService.updateAccount({ + balance, + tagIds, + data: { + ...accountData, + platform: { connect: { id: platformId } }, + user: { connect: { id: this.request.user.id } } }, - this.request.user.id, - tagIds - ); + userId: this.request.user.id, + where: { + id_userId: { + id, + userId: this.request.user.id + } + } + }); } else { // platformId is null, remove it delete accountData.platformId; - return this.accountService.updateAccount( - { - data: { - ...accountData, - platform: originalAccount.platformId - ? { disconnect: true } - : undefined, - user: { connect: { id: this.request.user.id } } - }, - where: { - id_userId: { - id, - userId: this.request.user.id - } - } + return this.accountService.updateAccount({ + balance, + tagIds, + data: { + ...accountData, + platform: originalAccount.platformId + ? { disconnect: true } + : undefined, + user: { connect: { id: this.request.user.id } } }, - this.request.user.id, - tagIds - ); + userId: this.request.user.id, + where: { + id_userId: { + id, + userId: this.request.user.id + } + } + }); } } } diff --git a/apps/api/src/app/account/account.service.ts b/apps/api/src/app/account/account.service.ts index 209806234..3d0bb91bd 100644 --- a/apps/api/src/app/account/account.service.ts +++ b/apps/api/src/app/account/account.service.ts @@ -1,11 +1,16 @@ import { AccountBalanceService } from '@ghostfolio/api/app/account-balance/account-balance.service'; import { PortfolioChangedEvent } from '@ghostfolio/api/events/portfolio-changed.event'; -import { WHERE_ACCOUNT_NOT_EXCLUDED } from '@ghostfolio/api/helper/account.helper'; +import { + getWhereAccountBalanceNotInFuture, + isAccountBalanceInFuture, + WHERE_ACCOUNT_NOT_EXCLUDED +} from '@ghostfolio/api/helper/account.helper'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { TagService } from '@ghostfolio/api/services/tag/tag.service'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { Filter } from '@ghostfolio/common/interfaces'; +import { AccountWithBalance } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; import { EventEmitter2 } from '@nestjs/event-emitter'; @@ -19,8 +24,8 @@ import { Tag } from '@prisma/client'; import { Big } from 'big.js'; -import { format } from 'date-fns'; -import { groupBy } from 'lodash'; +import { endOfToday, format } from 'date-fns'; +import { groupBy, isNil } from 'lodash'; import { CashDetails } from './interfaces/cash-details.interface'; @@ -36,12 +41,14 @@ export class AccountService { public async account({ id_userId - }: Prisma.AccountWhereUniqueInput): Promise { + }: Prisma.AccountWhereUniqueInput): Promise { const account = await this.prismaService.account.findUnique({ include: { balances: { orderBy: { date: 'desc' }, - take: 1 + take: 1, + // Ignore account balances in the future + where: getWhereAccountBalanceNotInFuture() } }, where: { id_userId } @@ -81,7 +88,7 @@ export class AccountService { where?: Prisma.AccountWhereInput; orderBy?: Prisma.AccountOrderByWithRelationInput; }): Promise< - (Account & { + (AccountWithBalance & { activities?: (Order & { SymbolProfile?: SymbolProfile })[]; balances?: AccountBalance[]; platform?: Platform; @@ -95,7 +102,16 @@ export class AccountService { include.balances = { orderBy: { date: 'desc' }, - ...(isBalancesIncluded ? {} : { take: 1 }) + // If the balances are included, they are returned as-is (including the + // ones in the future) because the client renders the full history. The + // balance is derived below and skips the account balances in the future. + ...(isBalancesIncluded + ? {} + : { + take: 1, + // Ignore account balances in the future + where: getWhereAccountBalanceNotInFuture() + }) }; if (isTagsIncluded) { @@ -115,10 +131,17 @@ export class AccountService { where }); + const endOfTodayDate = endOfToday(); + return accounts.map((account) => { const result = { ...account, - balance: account.balances[0]?.value ?? 0, + balance: + // The balances are ordered by date descending, hence the first account + // balance which is not in the future reflects the current balance + account.balances.find(({ date }) => { + return !isAccountBalanceInFuture({ date, endOfTodayDate }); + })?.value ?? 0, tags: isTagsIncluded ? (account.tags as unknown as { tag: Tag }[]).map(({ tag }) => { return tag; @@ -138,12 +161,18 @@ export class AccountService { }); } - public async createAccount( - data: Prisma.AccountCreateInput, - aUserId: string, - tagIds?: string[] - ): Promise { - await this.tagService.validateTagIds({ tagIds, userId: aUserId }); + public async createAccount({ + balance, + data, + tagIds, + userId + }: { + balance?: number; + data: Prisma.AccountCreateInput; + tagIds?: string[]; + userId: string; + }): Promise { + await this.tagService.validateTagIds({ tagIds, userId }); const account = await this.prismaService.account.create({ data: { @@ -160,12 +189,14 @@ export class AccountService { } }); - await this.accountBalanceService.createOrUpdateAccountBalance({ - accountId: account.id, - balance: data.balance, - date: format(new Date(), DATE_FORMAT), - userId: aUserId - }); + if (!isNil(balance)) { + await this.accountBalanceService.createOrUpdateAccountBalance({ + balance, + userId, + accountId: account.id, + date: format(new Date(), DATE_FORMAT) + }); + } this.eventEmitter.emit( PortfolioChangedEvent.getName(), @@ -194,7 +225,7 @@ export class AccountService { return account; } - public async getAccounts(aUserId: string): Promise { + public async getAccounts(aUserId: string): Promise { const accounts = await this.accounts({ include: { activities: true, @@ -273,17 +304,20 @@ export class AccountService { }; } - public async updateAccount( - params: { - data: Prisma.AccountUpdateInput; - where: Prisma.AccountWhereUniqueInput; - }, - aUserId: string, - tagIds?: string[] - ): Promise { - const { data, where } = params; - - await this.tagService.validateTagIds({ tagIds, userId: aUserId }); + public async updateAccount({ + balance, + data, + tagIds, + userId, + where + }: { + balance?: number; + data: Prisma.AccountUpdateInput; + tagIds?: string[]; + userId: string; + where: Prisma.AccountWhereUniqueInput; + }): Promise { + await this.tagService.validateTagIds({ tagIds, userId }); const account = await this.prismaService.account.update({ data: { @@ -302,12 +336,14 @@ export class AccountService { where }); - await this.accountBalanceService.createOrUpdateAccountBalance({ - accountId: account.id, - balance: data.balance as number, - date: format(new Date(), DATE_FORMAT), - userId: aUserId - }); + if (!isNil(balance)) { + await this.accountBalanceService.createOrUpdateAccountBalance({ + balance, + userId, + accountId: account.id, + date: format(new Date(), DATE_FORMAT) + }); + } this.eventEmitter.emit( PortfolioChangedEvent.getName(), diff --git a/apps/api/src/app/account/interfaces/cash-details.interface.ts b/apps/api/src/app/account/interfaces/cash-details.interface.ts index 715343766..b396328a5 100644 --- a/apps/api/src/app/account/interfaces/cash-details.interface.ts +++ b/apps/api/src/app/account/interfaces/cash-details.interface.ts @@ -1,6 +1,6 @@ -import { Account } from '@prisma/client'; +import { AccountWithBalance } from '@ghostfolio/common/types'; export interface CashDetails { - accounts: Account[]; + accounts: AccountWithBalance[]; balanceInBaseCurrency: number; } diff --git a/apps/api/src/app/activities/activities-filter.dto.ts b/apps/api/src/app/activities/activities-filter.dto.ts new file mode 100644 index 000000000..0c56aacc8 --- /dev/null +++ b/apps/api/src/app/activities/activities-filter.dto.ts @@ -0,0 +1,21 @@ +import { DATE_RANGE_PATTERN } from '@ghostfolio/api/dtos/date-range-filter.dto'; +import { FilterDto } from '@ghostfolio/api/dtos/filter.dto'; +import { DateRange } from '@ghostfolio/common/types'; + +import { Type as ActivityType } from '@prisma/client'; +import { Transform, TransformFnParams } from 'class-transformer'; +import { IsEnum, IsOptional, Matches } from 'class-validator'; +import { isString } from 'lodash'; + +export class ActivitiesFilterDto extends FilterDto { + @IsEnum(ActivityType, { each: true }) + @IsOptional() + @Transform(({ value }: TransformFnParams) => { + return isString(value) ? value.split(',') : value; + }) + activityTypes?: ActivityType[]; + + @IsOptional() + @Matches(DATE_RANGE_PATTERN) + range?: DateRange; +} diff --git a/apps/api/src/app/activities/activities.controller.ts b/apps/api/src/app/activities/activities.controller.ts index 21dabc639..a1b559c84 100644 --- a/apps/api/src/app/activities/activities.controller.ts +++ b/apps/api/src/app/activities/activities.controller.ts @@ -18,7 +18,7 @@ import { ActivityResponse } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; -import type { DateRange, RequestWithUser } from '@ghostfolio/common/types'; +import type { RequestWithUser } from '@ghostfolio/common/types'; import { Body, @@ -29,7 +29,6 @@ import { HttpException, Inject, Param, - ParseIntPipe, Post, Put, Query, @@ -38,11 +37,13 @@ import { } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; -import { Order, Prisma, Type as ActivityType } from '@prisma/client'; +import { Order } from '@prisma/client'; import { parseISO } from 'date-fns'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; +import { ActivitiesFilterDto } from './activities-filter.dto'; import { ActivitiesService } from './activities.service'; +import { GetActivitiesDto } from './get-activities.dto'; @Controller('activities') export class ActivitiesController { @@ -60,22 +61,47 @@ export class ActivitiesController { @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(TransformDataSourceInRequestInterceptor) public async deleteActivities( - @Query('accounts') filterByAccounts?: string, - @Query('assetClasses') filterByAssetClasses?: string, - @Query('dataSource') filterByDataSource?: string, - @Query('symbol') filterBySymbol?: string, - @Query('tags') filterByTags?: string + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, + @Query() + { + accounts, + activityTypes, + assetClasses, + dataSource, + range, + symbol, + tags + }: ActivitiesFilterDto ): Promise { + if (impersonationId) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + + let endDate: Date; + let startDate: Date; + + if (range) { + ({ endDate, startDate } = getIntervalFromDateRange({ + dateRange: range + })); + } + const filters = this.apiService.buildFiltersFromQueryParams({ - filterByAccounts, - filterByAssetClasses, - filterByDataSource, - filterBySymbol, - filterByTags + filterByAccounts: accounts, + filterByAssetClasses: assetClasses, + filterByDataSource: dataSource, + filterBySymbol: symbol, + filterByTags: tags }); return this.activitiesService.deleteActivities({ + endDate, filters, + startDate, + types: activityTypes, userId: this.request.user.id }); } @@ -108,38 +134,41 @@ export class ActivitiesController { @UseInterceptors(TransformDataSourceInResponseInterceptor) public async getAllActivities( @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, - @Query('accounts') filterByAccounts?: string, - @Query('activityTypes') filterByTypes?: string, - @Query('assetClasses') filterByAssetClasses?: string, - @Query('dataSource') filterByDataSource?: string, - @Query('range') dateRange?: DateRange, - @Query('skip', new ParseIntPipe({ optional: true })) skip?: number, - @Query('sortColumn') sortColumn?: string, - @Query('sortDirection') sortDirection?: Prisma.SortOrder, - @Query('symbol') filterBySymbol?: string, - @Query('tags') filterByTags?: string, - @Query('take', new ParseIntPipe({ optional: true })) take?: number + @Query() + { + accounts, + activityTypes, + assetClasses, + dataSource, + range, + skip, + sortColumn, + sortDirection, + symbol, + tags, + take + }: GetActivitiesDto ): Promise { let endDate: Date; let startDate: Date; - if (dateRange) { - ({ endDate, startDate } = getIntervalFromDateRange({ dateRange })); + if (range) { + ({ endDate, startDate } = getIntervalFromDateRange({ + dateRange: range + })); } const filters = this.apiService.buildFiltersFromQueryParams({ - filterByAccounts, - filterByAssetClasses, - filterByDataSource, - filterBySymbol, - filterByTags + filterByAccounts: accounts, + filterByAssetClasses: assetClasses, + filterByDataSource: dataSource, + filterBySymbol: symbol, + filterByTags: tags }); const impersonationUserId = await this.impersonationService.validateImpersonationId(impersonationId); - const types = (filterByTypes?.split(',') as ActivityType[]) ?? []; - const userCurrency = this.request.user.settings.settings.baseCurrency; const { activities, count } = await this.activitiesService.getActivities({ @@ -150,9 +179,9 @@ export class ActivitiesController { sortDirection, startDate, take, - types, userCurrency, includeDrafts: true, + types: activityTypes, userId: impersonationUserId || this.request.user.id, withExcludedAccountsAndActivities: true }); diff --git a/apps/api/src/app/activities/activities.service.ts b/apps/api/src/app/activities/activities.service.ts index 0a390d4ec..140726aeb 100644 --- a/apps/api/src/app/activities/activities.service.ts +++ b/apps/api/src/app/activities/activities.service.ts @@ -3,7 +3,10 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { CashDetails } from '@ghostfolio/api/app/account/interfaces/cash-details.interface'; import { AssetProfileChangedEvent } from '@ghostfolio/api/events/asset-profile-changed.event'; import { PortfolioChangedEvent } from '@ghostfolio/api/events/portfolio-changed.event'; -import { WHERE_ACCOUNT_NOT_EXCLUDED } from '@ghostfolio/api/helper/account.helper'; +import { + isAccountBalanceInFuture, + WHERE_ACCOUNT_NOT_EXCLUDED +} from '@ghostfolio/api/helper/account.helper'; import { LogPerformance } from '@ghostfolio/api/interceptors/performance-logging/performance-logging.interceptor'; import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; @@ -17,12 +20,13 @@ import { DATA_GATHERING_QUEUE_PRIORITY_HIGH, GATHER_ASSET_PROFILE_PROCESS_JOB_NAME, GATHER_ASSET_PROFILE_PROCESS_JOB_OPTIONS, - ghostfolioPrefix, + NON_INVESTMENT_ACTIVITY_TYPES, TAG_ID_EXCLUDE_FROM_ANALYSIS } from '@ghostfolio/common/config'; import { canDeleteAssetProfile, - getAssetProfileIdentifier + getAssetProfileIdentifier, + isValidCustomAssetProfileSymbol } from '@ghostfolio/common/helper'; import { ActivitiesResponse, @@ -45,7 +49,6 @@ import { Type as ActivityType } from '@prisma/client'; import { Big } from 'big.js'; -import { isUUID } from 'class-validator'; import { endOfToday, isAfter } from 'date-fns'; import { groupBy, uniqBy } from 'lodash'; import { randomUUID } from 'node:crypto'; @@ -189,7 +192,7 @@ export class ActivitiesService { const userId = data.userId; if ( - ['FEE', 'INTEREST', 'LIABILITY'].includes(data.type) || + NON_INVESTMENT_ACTIVITY_TYPES.includes(data.type) || (data.SymbolProfile.connectOrCreate.create.dataSource === 'MANUAL' && data.type === 'BUY') ) { @@ -201,10 +204,9 @@ export class ActivitiesService { let symbol: string; if ( - data.SymbolProfile.connectOrCreate.create.symbol.startsWith( - `${ghostfolioPrefix}_` - ) || - isUUID(data.SymbolProfile.connectOrCreate.create.symbol) + isValidCustomAssetProfileSymbol( + data.SymbolProfile.connectOrCreate.create.symbol + ) ) { // Connect custom asset profile (clone) symbol = data.SymbolProfile.connectOrCreate.create.symbol; @@ -259,7 +261,7 @@ export class ActivitiesService { const orderData: Prisma.OrderCreateInput = data; - const isDraft = ['FEE', 'INTEREST', 'LIABILITY'].includes(data.type) + const isDraft = NON_INVESTMENT_ACTIVITY_TYPES.includes(data.type) ? false : isAfter(data.date as Date, endOfToday()); @@ -358,14 +360,23 @@ export class ActivitiesService { } public async deleteActivities({ + endDate, filters, + startDate, + types, userId }: { + endDate?: Date; filters?: Filter[]; + startDate?: Date; + types?: ActivityType[]; userId: string; }): Promise { const { activities } = await this.getActivities({ + endDate, filters, + startDate, + types, userId, includeDrafts: true, userCurrency: undefined, @@ -456,6 +467,7 @@ export class ActivitiesService { } const activities: Activity[] = []; + const endOfTodayDate = endOfToday(); for (const account of cashDetails.accounts) { const { balances } = await this.accountBalanceService.getAccountBalances({ @@ -468,6 +480,15 @@ export class ActivitiesService { let currentBalanceInBaseCurrency = 0; for (const balanceItem of balances) { + if ( + isAccountBalanceInFuture({ + endOfTodayDate, + date: balanceItem.date + }) + ) { + continue; + } + const syntheticActivityTemplate: Activity = { userId, accountId: account.id, @@ -961,7 +982,7 @@ export class ActivitiesService { let isDraft = false; if ( - ['FEE', 'INTEREST', 'LIABILITY'].includes(data.type) || + NON_INVESTMENT_ACTIVITY_TYPES.includes(data.type) || (data.SymbolProfile.connect.dataSource_symbol.dataSource === 'MANUAL' && data.type === 'BUY') ) { diff --git a/apps/api/src/app/activities/get-activities.dto.ts b/apps/api/src/app/activities/get-activities.dto.ts new file mode 100644 index 000000000..0430a89c1 --- /dev/null +++ b/apps/api/src/app/activities/get-activities.dto.ts @@ -0,0 +1,27 @@ +import { Prisma } from '@prisma/client'; +import { Type } from 'class-transformer'; +import { IsIn, IsInt, IsOptional, Min } from 'class-validator'; + +import { ActivitiesFilterDto } from './activities-filter.dto'; + +export class GetActivitiesDto extends ActivitiesFilterDto { + @IsInt() + @IsOptional() + @Min(0) + @Type(() => Number) + skip?: number; + + @IsIn(Object.values(Prisma.OrderScalarFieldEnum)) + @IsOptional() + sortColumn?: keyof typeof Prisma.OrderScalarFieldEnum; + + @IsIn(['asc', 'desc'] as Prisma.SortOrder[]) + @IsOptional() + sortDirection?: Prisma.SortOrder; + + @IsInt() + @IsOptional() + @Min(0) + @Type(() => Number) + take?: number; +} diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 26a4e06f4..d384e0d55 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -7,6 +7,7 @@ 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'; import { + ghostfolioPrefix, PROPERTY_CURRENCIES, PROPERTY_IS_READ_ONLY_MODE, PROPERTY_IS_USER_SIGNUP_ENABLED @@ -14,7 +15,8 @@ import { import { applyAssetProfileOverrides, getAssetProfileIdentifier, - getCurrencyFromSymbol + getCurrencyFromSymbol, + hasGhostfolioPrefix } from '@ghostfolio/common/helper'; import { AdminData, @@ -63,6 +65,12 @@ export class AdminService { > { try { if (dataSource === 'MANUAL') { + if (!hasGhostfolioPrefix(symbol)) { + throw new BadRequestException( + `symbol ("${symbol}") must start with the prefix "${ghostfolioPrefix}_" for the data source ("${dataSource}")` + ); + } + return this.symbolProfileService.add({ currency, dataSource, @@ -107,8 +115,11 @@ export class AdminService { await this.marketDataService.deleteMany({ dataSource, symbol }); const currency = getCurrencyFromSymbol(symbol); - const customCurrencies = - await this.propertyService.getByKey(PROPERTY_CURRENCIES); + + const customCurrencies = await this.propertyService.getByKey( + PROPERTY_CURRENCIES, + { skipCache: true } + ); if (customCurrencies.includes(currency)) { const updatedCustomCurrencies = customCurrencies.filter( diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index bd76ef49b..ddda044a7 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -1,4 +1,5 @@ import { EventsModule } from '@ghostfolio/api/events/events.module'; +import { PortfolioSnapshotComputationExceptionFilter } from '@ghostfolio/api/filters/portfolio-snapshot-computation-exception.filter'; import { getRedisConnectionOptions } from '@ghostfolio/api/helper/redis.helper'; import { BullBoardAuthMiddleware } from '@ghostfolio/api/middlewares/bull-board-auth.middleware'; import { HtmlTemplateMiddleware } from '@ghostfolio/api/middlewares/html-template.middleware'; @@ -24,6 +25,7 @@ import { ThrottlerStorageRedisService } from '@nest-lab/throttler-storage-redis' import { BullModule } from '@nestjs/bull'; import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; +import { APP_FILTER } from '@nestjs/core'; import { EventEmitterModule } from '@nestjs/event-emitter'; import { ScheduleModule } from '@nestjs/schedule'; import { ServeStaticModule } from '@nestjs/serve-static'; @@ -184,7 +186,13 @@ import { UserModule } from './user/user.module'; UserModule, WatchlistModule ], - providers: [I18nService] + providers: [ + I18nService, + { + provide: APP_FILTER, + useClass: PortfolioSnapshotComputationExceptionFilter + } + ] }) export class AppModule implements NestModule { public configure(consumer: MiddlewareConsumer) { diff --git a/apps/api/src/app/asset/asset.controller.ts b/apps/api/src/app/asset/asset.controller.ts index de04b5c81..49afb43d7 100644 --- a/apps/api/src/app/asset/asset.controller.ts +++ b/apps/api/src/app/asset/asset.controller.ts @@ -20,7 +20,7 @@ export class AssetController { @Param('dataSource') dataSource: DataSource, @Param('symbol') symbol: string ): Promise { - const { assetProfile, marketData } = + const { assetProfile, marketData, splits } = await this.assetProfilesService.getAssetProfile({ dataSource, symbol @@ -28,6 +28,7 @@ export class AssetController { return { marketData, + splits, assetProfile: pick(assetProfile, ['dataSource', 'name', 'symbol']) }; } diff --git a/apps/api/src/app/auth/api-key.strategy.ts b/apps/api/src/app/auth/api-key.strategy.ts index f9937aaa7..232a272bc 100644 --- a/apps/api/src/app/auth/api-key.strategy.ts +++ b/apps/api/src/app/auth/api-key.strategy.ts @@ -35,6 +35,13 @@ export class ApiKeyStrategy extends PassportStrategy( ); } + if (await this.userService.isDailyRequestLimitExceeded({ user })) { + throw new HttpException( + getReasonPhrase(StatusCodes.TOO_MANY_REQUESTS), + StatusCodes.TOO_MANY_REQUESTS + ); + } + await this.prismaService.analytics.upsert({ create: { user: { connect: { id: user.id } } }, update: { diff --git a/apps/api/src/app/auth/jwt.strategy.ts b/apps/api/src/app/auth/jwt.strategy.ts index c70e8fb60..189389a86 100644 --- a/apps/api/src/app/auth/jwt.strategy.ts +++ b/apps/api/src/app/auth/jwt.strategy.ts @@ -42,6 +42,13 @@ export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { ); } + if (await this.userService.isDailyRequestLimitExceeded({ user })) { + throw new HttpException( + getReasonPhrase(StatusCodes.TOO_MANY_REQUESTS), + StatusCodes.TOO_MANY_REQUESTS + ); + } + const country = countriesAndTimezones.getCountryForTimezone(timezone)?.id; diff --git a/apps/api/src/app/endpoints/ai/ai.controller.ts b/apps/api/src/app/endpoints/ai/ai.controller.ts index b1607b53b..6c8102db1 100644 --- a/apps/api/src/app/endpoints/ai/ai.controller.ts +++ b/apps/api/src/app/endpoints/ai/ai.controller.ts @@ -1,4 +1,5 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { FilterDto } from '@ghostfolio/api/dtos/filter.dto'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { AiPromptResponse } from '@ghostfolio/common/interfaces'; @@ -31,18 +32,15 @@ export class AiController { @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getPrompt( @Param('mode') mode: AiPromptMode, - @Query('accounts') filterByAccounts?: string, - @Query('assetClasses') filterByAssetClasses?: string, - @Query('dataSource') filterByDataSource?: string, - @Query('symbol') filterBySymbol?: string, - @Query('tags') filterByTags?: string + @Query() + { accounts, assetClasses, dataSource, symbol, tags }: FilterDto ): Promise { const filters = this.apiService.buildFiltersFromQueryParams({ - filterByAccounts, - filterByAssetClasses, - filterByDataSource, - filterBySymbol, - filterByTags + filterByAccounts: accounts, + filterByAssetClasses: assetClasses, + filterByDataSource: dataSource, + filterBySymbol: symbol, + filterByTags: tags }); const prompt = await this.aiService.getPrompt({ diff --git a/apps/api/src/app/endpoints/asset-profiles/asset-profiles.controller.ts b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.controller.ts index 6be23c269..5ffb756a0 100644 --- a/apps/api/src/app/endpoints/asset-profiles/asset-profiles.controller.ts +++ b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.controller.ts @@ -4,7 +4,10 @@ import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interce import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; -import { UpdateAssetProfileDataDto } from '@ghostfolio/common/dtos'; +import { + CreateAssetProfileSplitDto, + UpdateAssetProfileDataDto +} from '@ghostfolio/common/dtos'; import { getCurrencyFromSymbol, isCurrency } from '@ghostfolio/common/helper'; import { AssetProfileResponse } from '@ghostfolio/common/interfaces'; import { @@ -18,19 +21,22 @@ import { MarketDataPreset, RequestWithUser } from '@ghostfolio/common/types'; import { Body, Controller, + Delete, Get, HttpException, Inject, Param, ParseIntPipe, Patch, + Post, Query, UseGuards, UseInterceptors } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; -import { DataSource, Prisma } from '@prisma/client'; +import { AssetProfileSplit, DataSource, Prisma } from '@prisma/client'; +import { parseISO } from 'date-fns'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { AssetProfilesService } from './asset-profiles.service'; @@ -119,6 +125,51 @@ export class AssetProfilesController { }); } + @Post(':dataSource/:symbol/splits') + @UseGuards(AuthGuard('jwt')) + @UseInterceptors(TransformDataSourceInRequestInterceptor) + public async createSplit( + @Body() data: CreateAssetProfileSplitDto, + @Param('dataSource') dataSource: DataSource, + @Param('symbol') symbol: string + ): Promise { + const { id: symbolProfileId } = await this.validateAccessToSplits({ + dataSource, + symbol, + permission: permissions.createAssetProfileSplit, + permissionOfOwnAssetProfile: + permissions.createAssetProfileSplitOfOwnAssetProfile + }); + + return this.assetProfilesService.createSplit({ + dataSource, + symbol, + symbolProfileId, + date: parseISO(data.date), + denominator: data.denominator, + numerator: data.numerator + }); + } + + @Delete(':dataSource/:symbol/splits/:id') + @UseGuards(AuthGuard('jwt')) + @UseInterceptors(TransformDataSourceInRequestInterceptor) + public async deleteSplit( + @Param('dataSource') dataSource: DataSource, + @Param('id') id: string, + @Param('symbol') symbol: string + ): Promise { + const { id: symbolProfileId } = await this.validateAccessToSplits({ + dataSource, + symbol, + permission: permissions.deleteAssetProfileSplit, + permissionOfOwnAssetProfile: + permissions.deleteAssetProfileSplitOfOwnAssetProfile + }); + + return this.assetProfilesService.deleteSplit({ id, symbolProfileId }); + } + @HasPermission(permissions.accessAdminControl) @Patch(':dataSource/:symbol') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @@ -139,4 +190,47 @@ export class AssetProfilesController { assetProfileData ); } + + private async validateAccessToSplits({ + dataSource, + permission, + permissionOfOwnAssetProfile, + symbol + }: { + dataSource: DataSource; + permission: string; + permissionOfOwnAssetProfile: string; + symbol: string; + }) { + const [assetProfile] = await this.symbolProfileService.getSymbolProfiles([ + { dataSource, symbol } + ]); + + if (!assetProfile) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } + + const canAccessAllAssetProfiles = hasPermission( + this.request.user.permissions, + permission + ); + + const canAccessOwnAssetProfile = + assetProfile.userId === this.request.user.id && + hasPermission(this.request.user.permissions, permissionOfOwnAssetProfile); + + if (!canAccessAllAssetProfiles && !canAccessOwnAssetProfile) { + throw new HttpException( + assetProfile.userId + ? getReasonPhrase(StatusCodes.NOT_FOUND) + : getReasonPhrase(StatusCodes.FORBIDDEN), + assetProfile.userId ? StatusCodes.NOT_FOUND : StatusCodes.FORBIDDEN + ); + } + + return assetProfile; + } } diff --git a/apps/api/src/app/endpoints/asset-profiles/asset-profiles.module.ts b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.module.ts index f96d92eb3..9df342f5f 100644 --- a/apps/api/src/app/endpoints/asset-profiles/asset-profiles.module.ts +++ b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.module.ts @@ -2,11 +2,13 @@ import { ActivitiesModule } from '@ghostfolio/api/app/activities/activities.modu import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module'; import { ApiModule } from '@ghostfolio/api/services/api/api.module'; +import { AssetProfileSplitModule } from '@ghostfolio/api/services/asset-profile-split/asset-profile-split.module'; import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; +import { DataGatheringQueueModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { Module } from '@nestjs/common'; @@ -20,7 +22,9 @@ import { AssetProfilesService } from './asset-profiles.service'; imports: [ ActivitiesModule, ApiModule, + AssetProfileSplitModule, BenchmarkModule, + DataGatheringQueueModule, DataProviderModule, ExchangeRateDataModule, MarketDataModule, diff --git a/apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts index bc6aeff1e..0d50e2223 100644 --- a/apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts +++ b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts @@ -1,9 +1,11 @@ import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service'; +import { AssetProfileSplitService } from '@ghostfolio/api/services/asset-profile-split/asset-profile-split.service'; import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { UpdateAssetProfileDataDto } from '@ghostfolio/common/dtos'; import { @@ -30,7 +32,9 @@ import { groupBy } from 'lodash'; export class AssetProfilesService { public constructor( private readonly activitiesService: ActivitiesService, + private readonly assetProfileSplitService: AssetProfileSplitService, private readonly benchmarkService: BenchmarkService, + private readonly dataGatheringService: DataGatheringService, private readonly dataProviderService: DataProviderService, private readonly exchangeRateDataService: ExchangeRateDataService, private readonly marketDataService: MarketDataService, @@ -38,6 +42,48 @@ export class AssetProfilesService { private readonly symbolProfileService: SymbolProfileService ) {} + public async createSplit({ + dataSource, + date, + denominator, + numerator, + symbol, + symbolProfileId + }: { + date: Date; + denominator: number; + numerator: number; + symbolProfileId: string; + } & AssetProfileIdentifier) { + const assetProfileSplit = await this.assetProfileSplitService.upsert({ + date, + denominator, + numerator, + symbolProfileId + }); + + await this.dataGatheringService.gatherSymbol({ dataSource, symbol }); + + return assetProfileSplit; + } + + public async deleteSplit({ + id, + symbolProfileId + }: { + id: string; + symbolProfileId: string; + }) { + const isDeleted = await this.assetProfileSplitService.deleteById({ + id, + symbolProfileId + }); + + if (!isDeleted) { + throw new NotFoundException(); + } + } + public async getAssetProfile({ dataSource, symbol @@ -54,7 +100,7 @@ export class AssetProfilesService { await this.activitiesService.getStatisticsByCurrency(currency)); } - const [[assetProfile], marketData] = await Promise.all([ + const [[assetProfile], marketData, splits] = await Promise.all([ this.symbolProfileService.getSymbolProfiles([ { dataSource, @@ -69,7 +115,8 @@ export class AssetProfilesService { dataSource, symbol } - }) + }), + this.assetProfileSplitService.getSplits({ dataSource, symbol }) ]); if (assetProfile) { @@ -80,6 +127,7 @@ export class AssetProfilesService { return { marketData, + splits, assetProfile: assetProfile ?? { activitiesCount, currency, @@ -92,6 +140,7 @@ export class AssetProfilesService { } }; } + public async getAssetProfiles({ filters = [], presetId, diff --git a/apps/api/src/app/endpoints/benchmarks/benchmarks.controller.ts b/apps/api/src/app/endpoints/benchmarks/benchmarks.controller.ts index 74bb6b672..53df9bd92 100644 --- a/apps/api/src/app/endpoints/benchmarks/benchmarks.controller.ts +++ b/apps/api/src/app/endpoints/benchmarks/benchmarks.controller.ts @@ -5,17 +5,14 @@ import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interc import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.service'; import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper'; -import { - DEFAULT_DATE_RANGE, - HEADER_KEY_IMPERSONATION -} from '@ghostfolio/common/config'; +import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; import type { AssetProfileIdentifier, BenchmarkMarketDataDetailsResponse, BenchmarkResponse } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; -import type { DateRange, RequestWithUser } from '@ghostfolio/common/types'; +import type { RequestWithUser } from '@ghostfolio/common/types'; import { Body, @@ -37,6 +34,7 @@ import { DataSource } from '@prisma/client'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { BenchmarksService } from './benchmarks.service'; +import { GetBenchmarkMarketDataDto } from './get-benchmark-market-data.dto'; @Controller('benchmarks') export class BenchmarksController { @@ -121,38 +119,39 @@ export class BenchmarksController { @Param('dataSource') dataSource: DataSource, @Param('startDateString') startDateString: string, @Param('symbol') symbol: string, - @Query('range') dateRange: DateRange = DEFAULT_DATE_RANGE, - @Query('accounts') filterByAccounts?: string, - @Query('assetClasses') filterByAssetClasses?: string, - @Query('dataSource') filterByDataSource?: string, - @Query('symbol') filterBySymbol?: string, - @Query('tags') filterByTags?: string, - @Query('withExcludedAccounts') withExcludedAccountsParam = 'false' + @Query() + { + accounts, + assetClasses, + dataSource: filterByDataSource, + range, + symbol: filterBySymbol, + tags, + withExcludedAccounts + }: GetBenchmarkMarketDataDto ): Promise { const { endDate, startDate } = getIntervalFromDateRange({ - dateRange, + dateRange: range, startDate: new Date(startDateString) }); const filters = this.apiService.buildFiltersFromQueryParams({ - filterByAccounts, - filterByAssetClasses, filterByDataSource, filterBySymbol, - filterByTags + filterByAccounts: accounts, + filterByAssetClasses: assetClasses, + filterByTags: tags }); - const withExcludedAccounts = withExcludedAccountsParam === 'true'; - return this.benchmarksService.getMarketDataForUser({ dataSource, - dateRange, endDate, filters, impersonationId, startDate, symbol, withExcludedAccounts, + dateRange: range, user: this.request.user }); } diff --git a/apps/api/src/app/endpoints/benchmarks/get-benchmark-market-data.dto.ts b/apps/api/src/app/endpoints/benchmarks/get-benchmark-market-data.dto.ts new file mode 100644 index 000000000..9599ade59 --- /dev/null +++ b/apps/api/src/app/endpoints/benchmarks/get-benchmark-market-data.dto.ts @@ -0,0 +1,12 @@ +import { DateRangeFilterDto } from '@ghostfolio/api/dtos/date-range-filter.dto'; + +import { Transform, TransformFnParams } from 'class-transformer'; +import { IsBoolean } from 'class-validator'; + +export class GetBenchmarkMarketDataDto extends DateRangeFilterDto { + @IsBoolean() + @Transform(({ value }: TransformFnParams) => { + return value === 'true'; + }) + withExcludedAccounts? = false; +} diff --git a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.controller.ts b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.controller.ts index 5d6979acc..0cdca8110 100644 --- a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.controller.ts +++ b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.controller.ts @@ -51,7 +51,7 @@ export class GhostfolioController { const maxDailyRequests = await this.ghostfolioService.getMaxDailyRequests(); if ( - this.request.user.dataProviderGhostfolioDailyRequests > maxDailyRequests + this.request.user.dataProviderGhostfolioDailyRequests >= maxDailyRequests ) { throw new HttpException( getReasonPhrase(StatusCodes.TOO_MANY_REQUESTS), @@ -90,12 +90,12 @@ export class GhostfolioController { @Version('2') public async getDividends( @Param('symbol') symbol: string, - @Query() query: GetDividendsDto + @Query() { from, granularity, to }: GetDividendsDto ): Promise { const maxDailyRequests = await this.ghostfolioService.getMaxDailyRequests(); if ( - this.request.user.dataProviderGhostfolioDailyRequests > maxDailyRequests + this.request.user.dataProviderGhostfolioDailyRequests >= maxDailyRequests ) { throw new HttpException( getReasonPhrase(StatusCodes.TOO_MANY_REQUESTS), @@ -105,10 +105,10 @@ export class GhostfolioController { try { const dividends = await this.ghostfolioService.getDividends({ + granularity, symbol, - from: parseDate(query.from), - granularity: query.granularity, - to: parseDate(query.to) + from: parseDate(from), + to: parseDate(to) }); await this.ghostfolioService.incrementDailyRequests({ @@ -130,12 +130,12 @@ export class GhostfolioController { @Version('2') public async getHistorical( @Param('symbol') symbol: string, - @Query() query: GetHistoricalDto + @Query() { from, granularity, to }: GetHistoricalDto ): Promise { const maxDailyRequests = await this.ghostfolioService.getMaxDailyRequests(); if ( - this.request.user.dataProviderGhostfolioDailyRequests > maxDailyRequests + this.request.user.dataProviderGhostfolioDailyRequests >= maxDailyRequests ) { throw new HttpException( getReasonPhrase(StatusCodes.TOO_MANY_REQUESTS), @@ -145,10 +145,10 @@ export class GhostfolioController { try { const historicalData = await this.ghostfolioService.getHistorical({ + granularity, symbol, - from: parseDate(query.from), - granularity: query.granularity, - to: parseDate(query.to) + from: parseDate(from), + to: parseDate(to) }); await this.ghostfolioService.incrementDailyRequests({ @@ -176,7 +176,7 @@ export class GhostfolioController { const maxDailyRequests = await this.ghostfolioService.getMaxDailyRequests(); if ( - this.request.user.dataProviderGhostfolioDailyRequests > maxDailyRequests + this.request.user.dataProviderGhostfolioDailyRequests >= maxDailyRequests ) { throw new HttpException( getReasonPhrase(StatusCodes.TOO_MANY_REQUESTS), @@ -215,7 +215,7 @@ export class GhostfolioController { const maxDailyRequests = await this.ghostfolioService.getMaxDailyRequests(); if ( - this.request.user.dataProviderGhostfolioDailyRequests > maxDailyRequests + this.request.user.dataProviderGhostfolioDailyRequests >= maxDailyRequests ) { throw new HttpException( getReasonPhrase(StatusCodes.TOO_MANY_REQUESTS), @@ -247,12 +247,12 @@ export class GhostfolioController { @UseGuards(AuthGuard('api-key'), HasPermissionGuard) @Version('2') public async getQuotes( - @Query() query: GetQuotesDto + @Query() { symbols }: GetQuotesDto ): Promise { const maxDailyRequests = await this.ghostfolioService.getMaxDailyRequests(); if ( - this.request.user.dataProviderGhostfolioDailyRequests > maxDailyRequests + this.request.user.dataProviderGhostfolioDailyRequests >= maxDailyRequests ) { throw new HttpException( getReasonPhrase(StatusCodes.TOO_MANY_REQUESTS), @@ -262,7 +262,7 @@ export class GhostfolioController { try { const quotes = await this.ghostfolioService.getQuotes({ - symbols: query.symbols + symbols }); await this.ghostfolioService.incrementDailyRequests({ 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 2c22f0c10..b858688c2 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 @@ -17,7 +17,10 @@ import { DERIVED_CURRENCIES } from '@ghostfolio/common/config'; import { PROPERTY_DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS } from '@ghostfolio/common/config'; -import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; +import { + getAssetProfileIdentifier, + isValidSearchQuery +} from '@ghostfolio/common/helper'; import { DataProviderGhostfolioAssetProfileResponse, DataProviderHistoricalResponse, @@ -326,8 +329,12 @@ export class GhostfolioService { } public async incrementDailyRequests({ userId }: { userId: string }) { - await this.prismaService.analytics.update({ - data: { + await this.prismaService.analytics.upsert({ + create: { + dataProviderGhostfolioDailyRequests: 1, + user: { connect: { id: userId } } + }, + update: { dataProviderGhostfolioDailyRequests: { increment: 1 } }, where: { userId } @@ -340,7 +347,9 @@ export class GhostfolioService { }: GetSearchParams): Promise { const results: LookupResponse = { items: [] }; - if (!query) { + query = query?.trim(); + + if (!isValidSearchQuery(query)) { return results; } @@ -348,10 +357,6 @@ export class GhostfolioService { let lookupItems: LookupItem[] = []; const promises: Promise<{ items: LookupItem[] }>[] = []; - if (query?.length < 2) { - return { items: lookupItems }; - } - for (const dataProviderService of this.getDataProviderServices()) { promises.push( dataProviderService.search({ diff --git a/apps/api/src/app/endpoints/tags/tags.controller.ts b/apps/api/src/app/endpoints/tags/tags.controller.ts index 21e29c6ab..cd043b593 100644 --- a/apps/api/src/app/endpoints/tags/tags.controller.ts +++ b/apps/api/src/app/endpoints/tags/tags.controller.ts @@ -2,6 +2,7 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorat import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { TagService } from '@ghostfolio/api/services/tag/tag.service'; import { CreateTagDto, UpdateTagDto } from '@ghostfolio/common/dtos'; +import { isSystemTag } from '@ghostfolio/common/helper'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { RequestWithUser } from '@ghostfolio/common/types'; @@ -69,7 +70,7 @@ export class TagsController { id }); - if (!originalTag) { + if (!originalTag || isSystemTag(originalTag)) { throw new HttpException( getReasonPhrase(StatusCodes.FORBIDDEN), StatusCodes.FORBIDDEN @@ -94,7 +95,7 @@ export class TagsController { id }); - if (!originalTag) { + if (!originalTag || isSystemTag(originalTag)) { throw new HttpException( getReasonPhrase(StatusCodes.FORBIDDEN), StatusCodes.FORBIDDEN diff --git a/apps/api/src/app/export/export.controller.ts b/apps/api/src/app/export/export.controller.ts index 4f4f4e6dd..27218d03d 100644 --- a/apps/api/src/app/export/export.controller.ts +++ b/apps/api/src/app/export/export.controller.ts @@ -2,6 +2,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 { ApiService } from '@ghostfolio/api/services/api/api.service'; +import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper'; import { ExportResponse } from '@ghostfolio/common/interfaces'; import type { RequestWithUser } from '@ghostfolio/common/types'; @@ -15,9 +16,9 @@ import { } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; -import { Type as ActivityType } from '@prisma/client'; import { ExportService } from './export.service'; +import { GetExportDto } from './get-export.dto'; @Controller('export') export class ExportController { @@ -32,29 +33,41 @@ export class ExportController { @UseInterceptors(TransformDataSourceInRequestInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async export( - @Query('accounts') filterByAccounts?: string, - @Query('activityIds') filterByActivityIds?: string, - @Query('activityTypes') filterByTypes?: string, - @Query('assetClasses') filterByAssetClasses?: string, - @Query('dataSource') filterByDataSource?: string, - @Query('symbol') filterBySymbol?: string, - @Query('tags') filterByTags?: string + @Query() + { + accounts, + activityIds, + activityTypes, + assetClasses, + dataSource, + range, + symbol, + tags + }: GetExportDto ): Promise { - const activityIds = filterByActivityIds?.split(',') ?? []; - const activityTypes = (filterByTypes?.split(',') as ActivityType[]) ?? []; + let endDate: Date; + let startDate: Date; + + if (range) { + ({ endDate, startDate } = getIntervalFromDateRange({ + dateRange: range + })); + } const filters = this.apiService.buildFiltersFromQueryParams({ - filterByAccounts, - filterByAssetClasses, - filterByDataSource, - filterBySymbol, - filterByTags + filterByAccounts: accounts, + filterByAssetClasses: assetClasses, + filterByDataSource: dataSource, + filterBySymbol: symbol, + filterByTags: tags }); return this.exportService.export({ activityIds, activityTypes, + endDate, filters, + startDate, 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 a94479562..35db20993 100644 --- a/apps/api/src/app/export/export.service.ts +++ b/apps/api/src/app/export/export.service.ts @@ -25,13 +25,17 @@ export class ExportService { public async export({ activityIds, activityTypes, + endDate, filters, + startDate, userId, userSettings }: { activityIds?: string[]; activityTypes?: ActivityType[]; + endDate?: Date; filters?: Filter[]; + startDate?: Date; userId: string; userSettings: UserSettings; }): Promise { @@ -41,7 +45,9 @@ export class ExportService { const platformsMap: { [platformId: string]: Platform } = {}; let { activities } = await this.activitiesService.getActivities({ + endDate, filters, + startDate, userId, includeDrafts: true, sortColumn: 'date', @@ -67,6 +73,13 @@ export class ExportService { }; } + const isFilteredExport = + activityIds?.length > 0 || + activityTypes?.length > 0 || + filters?.length > 0 || + !!endDate || + !!startDate; + const accounts = ( await this.accountService.accounts({ where, @@ -81,7 +94,7 @@ export class ExportService { }) ) .filter(({ id }) => { - return activityIds?.length > 0 + return isFilteredExport ? activities.some(({ accountId }) => { return accountId === id; }) @@ -89,30 +102,26 @@ export class ExportService { }) .map( ({ - balance, balances, comment, currency, id, - isExcluded, name, platform, platformId, tags - }) => { + }): ExportResponse['accounts'][number] => { if (platformId) { platformsMap[platformId] = platform; } return { - balance, balances: balances.map(({ date, value }) => { return { date: date.toISOString(), value }; }), comment, currency, id, - isExcluded, name, platformId, tags: tags.map(({ id: tagId }) => { diff --git a/apps/api/src/app/export/get-export.dto.ts b/apps/api/src/app/export/get-export.dto.ts new file mode 100644 index 000000000..5fc3c81ba --- /dev/null +++ b/apps/api/src/app/export/get-export.dto.ts @@ -0,0 +1,14 @@ +import { ActivitiesFilterDto } from '@ghostfolio/api/app/activities/activities-filter.dto'; + +import { Transform, TransformFnParams } from 'class-transformer'; +import { IsOptional, IsUUID } from 'class-validator'; +import { isString } from 'lodash'; + +export class GetExportDto extends ActivitiesFilterDto { + @IsOptional() + @IsUUID(undefined, { each: true }) + @Transform(({ value }: TransformFnParams) => { + return isString(value) ? value.split(',') : value; + }) + activityIds?: string[]; +} diff --git a/apps/api/src/app/health/health.service.ts b/apps/api/src/app/health/health.service.ts index f08f33a1e..42a0be61b 100644 --- a/apps/api/src/app/health/health.service.ts +++ b/apps/api/src/app/health/health.service.ts @@ -26,7 +26,9 @@ export class HealthService { public async isDatabaseHealthy() { try { - await this.propertyService.getByKey(PROPERTY_CURRENCIES); + await this.propertyService.getByKey(PROPERTY_CURRENCIES, { + skipCache: true + }); return true; } catch { diff --git a/apps/api/src/app/import/import-data.dto.ts b/apps/api/src/app/import/import-data.dto.ts index bf45c7cda..1ab6fe3e5 100644 --- a/apps/api/src/app/import/import-data.dto.ts +++ b/apps/api/src/app/import/import-data.dto.ts @@ -2,6 +2,7 @@ import { CreateAccountWithBalancesDto, CreateAssetProfileWithMarketDataDto, CreateOrderDto, + CreatePlatformDto, CreateTagDto } from '@ghostfolio/common/dtos'; @@ -26,6 +27,12 @@ export class ImportDataDto { @ValidateNested({ each: true }) assetProfiles?: CreateAssetProfileWithMarketDataDto[]; + @IsArray() + @IsOptional() + @Type(() => CreatePlatformDto) + @ValidateNested({ each: true }) + platforms?: CreatePlatformDto[]; + @IsArray() @IsOptional() @Type(() => CreateTagDto) diff --git a/apps/api/src/app/import/import.controller.ts b/apps/api/src/app/import/import.controller.ts index c2d53e3cb..cd378d07d 100644 --- a/apps/api/src/app/import/import.controller.ts +++ b/apps/api/src/app/import/import.controller.ts @@ -77,6 +77,7 @@ export class ImportController { accountsWithBalancesDto: importData.accounts ?? [], activitiesDto: importData.activities, assetProfilesWithMarketDataDto: importData.assetProfiles ?? [], + platformsDto: importData.platforms ?? [], tagsDto: importData.tags ?? [], user: this.request.user }); diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index b706baa8d..9d1e899c3 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -9,10 +9,16 @@ import { MarketDataService } from '@ghostfolio/api/services/market-data/market-d import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { TagService } from '@ghostfolio/api/services/tag/tag.service'; -import { DATA_GATHERING_QUEUE_PRIORITY_HIGH } from '@ghostfolio/common/config'; +import { + DATA_GATHERING_QUEUE_PRIORITY_HIGH, + ghostfolioPrefix, + NON_INVESTMENT_ACTIVITY_TYPES, + TAG_ID_EXCLUDE_FROM_ANALYSIS +} from '@ghostfolio/common/config'; import { CreateAssetProfileDto, CreateOrderDto } from '@ghostfolio/common/dtos'; import { getAssetProfileIdentifier, + isValidCustomAssetProfileSymbol, parseDate } from '@ghostfolio/common/helper'; import { @@ -174,6 +180,7 @@ export class ImportService { assetProfilesWithMarketDataDto, isDryRun = false, maxActivitiesToImport, + platformsDto, tagsDto, user }: { @@ -182,14 +189,89 @@ export class ImportService { assetProfilesWithMarketDataDto: ImportDataDto['assetProfiles']; isDryRun?: boolean; maxActivitiesToImport: number; + platformsDto: ImportDataDto['platforms']; tagsDto: ImportDataDto['tags']; user: UserWithSettings; }): Promise { const accountIdMapping: { [oldAccountId: string]: string } = {}; const assetProfileSymbolMapping: { [oldSymbol: string]: string } = {}; + const platformIdMapping: { [oldPlatformId: string]: string } = {}; const tagIdMapping: { [oldTagId: string]: string } = {}; const userCurrency = user.settings.settings.baseCurrency; + // Validate the symbols before any data is persisted + for (const [index, assetProfileWithMarketData] of ( + assetProfilesWithMarketDataDto ?? [] + ).entries()) { + if ( + assetProfileWithMarketData.dataSource === DataSource.MANUAL && + !isValidCustomAssetProfileSymbol(assetProfileWithMarketData.symbol) + ) { + throw new Error( + `assetProfiles.${index}.symbol ("${assetProfileWithMarketData.symbol}") must be a UUID or start with the prefix "${ghostfolioPrefix}_" for the data source ("${DataSource.MANUAL}")` + ); + } + } + + // Validate the symbols before any data is persisted. Activities without a + // data source are excluded, since a symbol is generated in + // createActivity() if needed. + for (const [index, activity] of activitiesDto.entries()) { + if (!activity.dataSource) { + if (NON_INVESTMENT_ACTIVITY_TYPES.includes(activity.type)) { + activity.dataSource = DataSource.MANUAL; + } else { + activity.dataSource = + this.dataProviderService.getDataSourceForImport(); + } + } else if ( + activity.dataSource === DataSource.MANUAL && + !isValidCustomAssetProfileSymbol(activity.symbol) + ) { + throw new Error( + `activities.${index}.symbol ("${activity.symbol}") must be a UUID or start with the prefix "${ghostfolioPrefix}_" for the data source ("${DataSource.MANUAL}")` + ); + } + } + + if (platformsDto?.length) { + const canCreatePlatform = hasPermission( + user.permissions, + permissions.createPlatform + ); + + const existingPlatforms = await this.platformService.getPlatforms(); + + for (const platform of platformsDto) { + // Check if there is any existing platform with the same ID, otherwise + // fall back to a platform with the same URL + const existingPlatform = + existingPlatforms.find(({ id }) => { + return id === platform.id; + }) ?? + existingPlatforms.find(({ url }) => { + return url === platform.url; + }); + + if (existingPlatform) { + // Store the new to old platform ID mappings for creating accounts + if (platform.id && existingPlatform.id !== platform.id) { + platformIdMapping[platform.id] = existingPlatform.id; + } + } else { + if (!canCreatePlatform) { + throw new Error( + `Insufficient permissions to create platform ("${platform.name}")` + ); + } + + if (!isDryRun) { + await this.platformService.createPlatform(platform); + } + } + } + } + const existingTagsOfUser = tagsDto?.length || (!isDryRun && accountsWithBalancesDto?.length) ? await this.tagService.getTagsForUser(user.id) @@ -272,10 +354,16 @@ export class ImportService { // If there is no account or if the account belongs to a different user then create a new account if (!accountWithSameId || accountWithSameId.userId !== user.id) { - const account = omit(accountWithBalances, ['balances', 'tags']); + const account = omit(accountWithBalances, [ + 'balance', + 'balances', + 'isExcluded', + 'tags' + ]); let oldAccountId: string; - const platformId = account.platformId; + const platformId = + platformIdMapping[account.platformId] ?? account.platformId; delete account.platformId; @@ -292,6 +380,16 @@ export class ImportService { return existingTagIds.has(tagId); }); + // Map the legacy isExcluded attribute of old export files to + // the "Exclude from Analysis" tag + if ( + accountWithBalances.isExcluded && + existingTagIds.has(TAG_ID_EXCLUDE_FROM_ANALYSIS) && + !tagIds.includes(TAG_ID_EXCLUDE_FROM_ANALYSIS) + ) { + tagIds.push(TAG_ID_EXCLUDE_FROM_ANALYSIS); + } + let accountObject: Prisma.AccountCreateInput = { ...account, balances: { @@ -311,11 +409,12 @@ export class ImportService { }; } - const newAccount = await this.accountService.createAccount( - accountObject, - user.id, - tagIds - ); + const newAccount = await this.accountService.createAccount({ + tagIds, + balance: accountWithBalances.balance, + data: accountObject, + userId: user.id + }); // Store the new to old account ID mappings for updating activities if (accountWithSameId && oldAccountId) { @@ -325,71 +424,117 @@ export class ImportService { } } - if (!isDryRun && assetProfilesWithMarketDataDto?.length) { - const existingAssetProfiles = - await this.symbolProfileService.getSymbolProfiles( - assetProfilesWithMarketDataDto.map(({ dataSource, symbol }) => { - return { dataSource, symbol }; + if (assetProfilesWithMarketDataDto?.length) { + const customAssetProfileNames = assetProfilesWithMarketDataDto + .filter(({ dataSource, name }) => { + return dataSource === DataSource.MANUAL && Boolean(name); + }) + .map(({ name }) => { + return name; + }); + + const [existingAssetProfiles, existingCustomAssetProfilesOfUser] = + await Promise.all([ + this.symbolProfileService.getSymbolProfiles( + assetProfilesWithMarketDataDto.map(({ dataSource, symbol }) => { + return { dataSource, symbol }; + }) + ), + this.symbolProfileService.getCustomSymbolProfilesByNames({ + names: customAssetProfileNames, + userId: user.id }) - ); + ]); for (const assetProfileWithMarketData of assetProfilesWithMarketDataDto) { + let symbol = assetProfileWithMarketData.symbol; + // Check if there is any existing asset profile const existingAssetProfile = existingAssetProfiles.find( - ({ dataSource, symbol }) => { + (assetProfile) => { return ( - dataSource === assetProfileWithMarketData.dataSource && - symbol === assetProfileWithMarketData.symbol + assetProfile.dataSource === + assetProfileWithMarketData.dataSource && + assetProfile.symbol === assetProfileWithMarketData.symbol ); } ); - // If there is no asset profile or if the asset profile belongs to a different user, then create a new asset profile + // If there is no asset profile or if the asset profile belongs to a + // different user, then reuse the custom asset profile of the user or + // create a new asset profile if (!existingAssetProfile || existingAssetProfile.userId !== user.id) { - const assetProfile: CreateAssetProfileDto = omit( - assetProfileWithMarketData, - 'marketData' - ); + // Check if the user has a custom asset profile with the same name. + // Skip asset profiles with a legacy free-text symbol as they would + // fail the symbol validation on a future import. + const existingCustomAssetProfileOfUser = + assetProfileWithMarketData.dataSource === DataSource.MANUAL + ? existingCustomAssetProfilesOfUser.find((customAssetProfile) => { + return ( + customAssetProfile.name === + assetProfileWithMarketData.name && + isValidCustomAssetProfileSymbol(customAssetProfile.symbol) + ); + }) + : undefined; + + if (existingCustomAssetProfileOfUser) { + // Reuse the custom asset profile of the user instead of creating a duplicate + symbol = existingCustomAssetProfileOfUser.symbol; + } else { + const assetProfile: CreateAssetProfileDto = omit( + assetProfileWithMarketData, + 'marketData' + ); + + // Asset profile belongs to a different user, generate a new symbol + if (existingAssetProfile && !isDryRun) { + symbol = randomUUID(); + } - // Asset profile belongs to a different user - if (existingAssetProfile) { - const symbol = randomUUID(); - assetProfileSymbolMapping[assetProfile.symbol] = symbol; assetProfile.symbol = symbol; + + if (!isDryRun) { + // Create a new asset profile + const assetProfileObject: Prisma.SymbolProfileCreateInput = { + ...assetProfile, + user: { connect: { id: user.id } } + }; + + await this.symbolProfileService.add(assetProfileObject); + } } - // Create a new asset profile - const assetProfileObject: Prisma.SymbolProfileCreateInput = { - ...assetProfile, - user: { connect: { id: user.id } } - }; + if (symbol !== assetProfileWithMarketData.symbol) { + assetProfileSymbolMapping[assetProfileWithMarketData.symbol] = + symbol; - await this.symbolProfileService.add(assetProfileObject); + // Keep the asset profile in sync with the activities to validate + assetProfileWithMarketData.symbol = symbol; + } } - // Insert or update market data - const marketDataObjects = assetProfileWithMarketData.marketData.map( - (marketData) => { + if (!isDryRun) { + // Insert or update market data + const marketDataObjects = ( + assetProfileWithMarketData.marketData ?? [] + ).map((marketData) => { return { ...marketData, - dataSource: assetProfileWithMarketData.dataSource, - symbol: assetProfileWithMarketData.symbol + symbol, + dataSource: assetProfileWithMarketData.dataSource } as Prisma.MarketDataUpdateInput; - } - ); + }); - await this.marketDataService.updateMany({ data: marketDataObjects }); + await this.marketDataService.updateMany({ data: marketDataObjects }); + } } } for (const activity of activitiesDto) { - if (!activity.dataSource) { - if (['FEE', 'INTEREST', 'LIABILITY'].includes(activity.type)) { - activity.dataSource = DataSource.MANUAL; - } else { - activity.dataSource = - this.dataProviderService.getDataSourceForImport(); - } + // If an asset profile is created or reused, then update the symbol in all activities + if (assetProfileSymbolMapping[activity.symbol]) { + activity.symbol = assetProfileSymbolMapping[activity.symbol]; } if (!isDryRun) { @@ -398,11 +543,6 @@ export class ImportService { activity.accountId = accountIdMapping[activity.accountId]; } - // If a new asset profile is created, then update the symbol in all activities - if (assetProfileSymbolMapping[activity.symbol]) { - activity.symbol = assetProfileSymbolMapping[activity.symbol]; - } - // If a new tag is created, then update the tag ID in all activities activity.tags = (activity.tags ?? []).map((tagId) => { return tagIdMapping[tagId] ?? tagId; diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index 38f942156..cdab3fdf0 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -1,4 +1,5 @@ import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; +import { PortfolioSnapshotComputationError } from '@ghostfolio/api/app/portfolio/errors/portfolio-snapshot-computation.error'; import { PortfolioCalculatorPosition } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator-position.interface'; import { PortfolioOrder } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order.interface'; import { PortfolioSnapshotValue } from '@ghostfolio/api/app/portfolio/interfaces/snapshot-value.interface'; @@ -65,6 +66,8 @@ import { isNumber, sortBy, sum, uniqBy } from 'lodash'; export abstract class PortfolioCalculator { protected static readonly ENABLE_LOGGING = false; + private static readonly MAX_INITIALIZATION_ATTEMPTS = 3; + protected readonly logger = new Logger(PortfolioCalculator.name); protected accountBalanceItems: HistoricalDataItem[]; @@ -174,6 +177,11 @@ export abstract class PortfolioCalculator { this.computeTransactionPoints(); this.snapshotPromise = this.initialize(); + + // Mark the rejection as handled to prevent an unhandled promise rejection + // in case the snapshot promise is never awaited. Consumers awaiting it + // still receive the error. + this.snapshotPromise.catch(() => undefined); } protected abstract calculateOverallPerformance( @@ -1124,7 +1132,7 @@ export abstract class PortfolioCalculator { } @LogPerformance - private async initialize() { + private async initialize(attempt = 1) { const startTimeTotal = performance.now(); let cachedPortfolioSnapshot: PortfolioSnapshot; @@ -1183,6 +1191,12 @@ export abstract class PortfolioCalculator { }); } } else { + if (attempt > PortfolioCalculator.MAX_INITIALIZATION_ATTEMPTS) { + throw new PortfolioSnapshotComputationError( + `Portfolio snapshot of user '${this.userId}' could not be computed after ${PortfolioCalculator.MAX_INITIALIZATION_ATTEMPTS} attempts` + ); + } + // Wait for computation await this.portfolioSnapshotService.addJobToQueue({ data: { @@ -1205,7 +1219,7 @@ export abstract class PortfolioCalculator { await job.finished(); } - await this.initialize(); + await this.initialize(attempt + 1); } } } 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 fe23af04b..a6bedc55d 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 @@ -54,6 +54,9 @@ describe('PortfolioCalculator', () => { let redisCacheService: RedisCacheService; beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); 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 061aaf817..dc22cdbab 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 @@ -54,6 +54,9 @@ describe('PortfolioCalculator', () => { let redisCacheService: RedisCacheService; beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); 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 c8e0af46d..9d55a79dd 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 @@ -54,6 +54,9 @@ describe('PortfolioCalculator', () => { let redisCacheService: RedisCacheService; beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); 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 4922382a9..a2d576361 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 @@ -54,6 +54,9 @@ describe('PortfolioCalculator', () => { let redisCacheService: RedisCacheService; beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts index 21a8d2056..1143e3bd2 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts @@ -76,6 +76,9 @@ describe('PortfolioCalculator', () => { }); beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); 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 4f5da58b8..e5b0d69d6 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 @@ -64,6 +64,9 @@ describe('PortfolioCalculator', () => { }); beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); 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 f20506b06..ea1df4203 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 @@ -66,6 +66,9 @@ describe('PortfolioCalculator', () => { let redisCacheService: RedisCacheService; beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); 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 79c6979ef..93d91c500 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 @@ -64,6 +64,9 @@ describe('PortfolioCalculator', () => { }); beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); 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 eb5571feb..1fa2d1264 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 @@ -64,6 +64,9 @@ describe('PortfolioCalculator', () => { }); beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts index 9bef6ad39..3b09bfd26 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts @@ -77,6 +77,9 @@ describe('PortfolioCalculator', () => { let redisCacheService: RedisCacheService; beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); exchangeRateDataService = new ExchangeRateDataService( @@ -166,6 +169,14 @@ describe('PortfolioCalculator', () => { id: randomUUID(), value: 2000, valueInBaseCurrency: 1800 + }, + { + // Ignored future account balance + accountId, + date: parseDate('2050-12-31'), + id: randomUUID(), + value: 0, + valueInBaseCurrency: 0 } ] }); @@ -178,7 +189,6 @@ describe('PortfolioCalculator', () => { createdAt: parseDate('2023-12-31'), currency: 'USD', id: accountId, - isExcluded: false, name: 'USD', platformId: null, updatedAt: parseDate('2023-12-31'), @@ -354,7 +364,6 @@ describe('PortfolioCalculator', () => { createdAt: parseDate('2023-12-31'), currency: 'CHF', id: accountId, - isExcluded: false, name: 'CHF', platformId: null, updatedAt: parseDate('2023-12-31'), @@ -486,7 +495,6 @@ describe('PortfolioCalculator', () => { createdAt: parseDate('2023-12-31'), currency: 'CHF', id: accountId, - isExcluded: false, name: 'CHF', platformId: null, updatedAt: parseDate('2023-12-31'), 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 4e413c0c5..000cc5935 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 @@ -54,6 +54,9 @@ describe('PortfolioCalculator', () => { let redisCacheService: RedisCacheService; beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); 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 984dc1154..451973a9f 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 @@ -66,6 +66,9 @@ describe('PortfolioCalculator', () => { let redisCacheService: RedisCacheService; beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-jnug-buy-and-sell-and-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-jnug-buy-and-sell-and-buy-and-sell.spec.ts index 962cfe2d8..2cc87934a 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-jnug-buy-and-sell-and-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-jnug-buy-and-sell-and-buy-and-sell.spec.ts @@ -67,6 +67,9 @@ describe('PortfolioCalculator', () => { }); beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); 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 94654af61..68572c63e 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 @@ -54,6 +54,9 @@ describe('PortfolioCalculator', () => { let redisCacheService: RedisCacheService; beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); 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 b1f030aae..53236f007 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 @@ -52,6 +52,9 @@ describe('PortfolioCalculator', () => { let redisCacheService: RedisCacheService; beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 91c095623..f6598f22b 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 @@ -54,6 +54,9 @@ describe('PortfolioCalculator', () => { let redisCacheService: RedisCacheService; beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-activities.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-activities.spec.ts index ff5dc93f9..fb7a43477 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-activities.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-activities.spec.ts @@ -49,6 +49,9 @@ describe('PortfolioCalculator', () => { let redisCacheService: RedisCacheService; beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); 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 8ce62db59..8c3858dcd 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 @@ -67,6 +67,9 @@ describe('PortfolioCalculator', () => { }); beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); 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 10cc2da01..364d173e1 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 @@ -67,6 +67,9 @@ describe('PortfolioCalculator', () => { }); beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); 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 226eaa3d8..ce5f90f5c 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 @@ -54,6 +54,9 @@ describe('PortfolioCalculator', () => { let redisCacheService: RedisCacheService; beforeEach(() => { + PortfolioSnapshotServiceMock.reset(); + RedisCacheServiceMock.reset(); + configurationService = new ConfigurationService(); currentRateService = new CurrentRateService(null, null, null, null); diff --git a/apps/api/src/app/portfolio/errors/portfolio-snapshot-computation.error.ts b/apps/api/src/app/portfolio/errors/portfolio-snapshot-computation.error.ts new file mode 100644 index 000000000..074ac0bae --- /dev/null +++ b/apps/api/src/app/portfolio/errors/portfolio-snapshot-computation.error.ts @@ -0,0 +1,7 @@ +export class PortfolioSnapshotComputationError extends Error { + public constructor(message: string) { + super(message); + + this.name = 'PortfolioSnapshotComputationError'; + } +} diff --git a/apps/api/src/app/portfolio/get-details.dto.ts b/apps/api/src/app/portfolio/get-details.dto.ts new file mode 100644 index 000000000..e2a13e3b6 --- /dev/null +++ b/apps/api/src/app/portfolio/get-details.dto.ts @@ -0,0 +1,12 @@ +import { DateRangeFilterDto } from '@ghostfolio/api/dtos/date-range-filter.dto'; + +import { Transform, TransformFnParams } from 'class-transformer'; +import { IsBoolean } from 'class-validator'; + +export class GetDetailsDto extends DateRangeFilterDto { + @IsBoolean() + @Transform(({ value }: TransformFnParams) => { + return value === 'true'; + }) + withMarkets? = false; +} diff --git a/apps/api/src/app/portfolio/get-dividends.dto.ts b/apps/api/src/app/portfolio/get-dividends.dto.ts new file mode 100644 index 000000000..f1dff4a97 --- /dev/null +++ b/apps/api/src/app/portfolio/get-dividends.dto.ts @@ -0,0 +1,10 @@ +import { DateRangeFilterDto } from '@ghostfolio/api/dtos/date-range-filter.dto'; +import { GroupBy } from '@ghostfolio/common/types'; + +import { IsIn, IsOptional } from 'class-validator'; + +export class GetDividendsDto extends DateRangeFilterDto { + @IsIn(['month', 'year'] as GroupBy[]) + @IsOptional() + groupBy?: GroupBy; +} diff --git a/apps/api/src/app/portfolio/get-holdings.dto.ts b/apps/api/src/app/portfolio/get-holdings.dto.ts new file mode 100644 index 000000000..b776bfe0d --- /dev/null +++ b/apps/api/src/app/portfolio/get-holdings.dto.ts @@ -0,0 +1,14 @@ +import { DateRangeFilterDto } from '@ghostfolio/api/dtos/date-range-filter.dto'; +import { HoldingType } from '@ghostfolio/common/types'; + +import { IsIn, IsOptional, IsString } from 'class-validator'; + +export class GetHoldingsDto extends DateRangeFilterDto { + @IsIn(['ACTIVE', 'CLOSED'] as HoldingType[]) + @IsOptional() + holdingType?: HoldingType; + + @IsOptional() + @IsString() + query?: string; +} diff --git a/apps/api/src/app/portfolio/get-investments.dto.ts b/apps/api/src/app/portfolio/get-investments.dto.ts new file mode 100644 index 000000000..bf312a543 --- /dev/null +++ b/apps/api/src/app/portfolio/get-investments.dto.ts @@ -0,0 +1,10 @@ +import { DateRangeFilterDto } from '@ghostfolio/api/dtos/date-range-filter.dto'; +import { GroupBy } from '@ghostfolio/common/types'; + +import { IsIn, IsOptional } from 'class-validator'; + +export class GetInvestmentsDto extends DateRangeFilterDto { + @IsIn(['month', 'year'] as GroupBy[]) + @IsOptional() + groupBy?: GroupBy; +} diff --git a/apps/api/src/app/portfolio/get-performance.dto.ts b/apps/api/src/app/portfolio/get-performance.dto.ts new file mode 100644 index 000000000..5992c2a09 --- /dev/null +++ b/apps/api/src/app/portfolio/get-performance.dto.ts @@ -0,0 +1,12 @@ +import { DateRangeFilterDto } from '@ghostfolio/api/dtos/date-range-filter.dto'; + +import { Transform, TransformFnParams } from 'class-transformer'; +import { IsBoolean } from 'class-validator'; + +export class GetPerformanceDto extends DateRangeFilterDto { + @IsBoolean() + @Transform(({ value }: TransformFnParams) => { + return value === 'true'; + }) + withExcludedAccounts? = false; +} diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index 5239de24f..953976a4a 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -15,7 +15,6 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/con import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper'; import { - DEFAULT_DATE_RANGE, HEADER_KEY_IMPERSONATION, UNKNOWN_KEY } from '@ghostfolio/common/config'; @@ -34,11 +33,7 @@ import { isRestrictedView, permissions } from '@ghostfolio/common/permissions'; -import type { - DateRange, - GroupBy, - RequestWithUser -} from '@ghostfolio/common/types'; +import type { RequestWithUser } from '@ghostfolio/common/types'; import { Body, @@ -60,6 +55,11 @@ import { AssetClass, AssetSubClass, DataSource } from '@prisma/client'; import { Big } from 'big.js'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; +import { GetDetailsDto } from './get-details.dto'; +import { GetDividendsDto } from './get-dividends.dto'; +import { GetHoldingsDto } from './get-holdings.dto'; +import { GetInvestmentsDto } from './get-investments.dto'; +import { GetPerformanceDto } from './get-performance.dto'; import { PortfolioService } from './portfolio.service'; import { UpdateHoldingTagsDto } from './update-holding-tags.dto'; @@ -82,16 +82,17 @@ export class PortfolioController { @UseInterceptors(TransformDataSourceInResponseInterceptor) public async getDetails( @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, - @Query('accounts') filterByAccounts?: string, - @Query('assetClasses') filterByAssetClasses?: string, - @Query('dataSource') filterByDataSource?: string, - @Query('range') dateRange: DateRange = DEFAULT_DATE_RANGE, - @Query('symbol') filterBySymbol?: string, - @Query('tags') filterByTags?: string, - @Query('withMarkets') withMarketsParam = 'false' + @Query() + { + accounts: filterByAccounts, + assetClasses: filterByAssetClasses, + dataSource: filterByDataSource, + range, + symbol: filterBySymbol, + tags: filterByTags, + withMarkets + }: GetDetailsDto ): Promise { - const withMarkets = withMarketsParam === 'true'; - let hasDetails = true; let hasError = false; @@ -118,10 +119,10 @@ export class PortfolioController { platforms, summary } = await this.portfolioService.getDetails({ - dateRange, filters, impersonationId, withMarkets, + dateRange: range, userId: this.request.user.id, withSummary: true }); @@ -135,7 +136,7 @@ export class PortfolioController { if ( hasReadRestrictedAccessPermission({ impersonationId, - user: this.request.user + accesses: this.request.user?.accessesGet }) || isRestrictedView(this.request.user) ) { @@ -179,7 +180,7 @@ export class PortfolioController { hasDetails === false || hasReadRestrictedAccessPermission({ impersonationId, - user: this.request.user + accesses: this.request.user?.accessesGet }) || isRestrictedView(this.request.user) ) { @@ -326,20 +327,23 @@ export class PortfolioController { @UseInterceptors(TransformDataSourceInRequestInterceptor) public async getDividends( @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, - @Query('accounts') filterByAccounts?: string, - @Query('assetClasses') filterByAssetClasses?: string, - @Query('dataSource') filterByDataSource?: string, - @Query('groupBy') groupBy?: GroupBy, - @Query('range') dateRange: DateRange = DEFAULT_DATE_RANGE, - @Query('symbol') filterBySymbol?: string, - @Query('tags') filterByTags?: string + @Query() + { + accounts, + assetClasses, + dataSource, + groupBy, + range, + symbol, + tags + }: GetDividendsDto ): Promise { const filters = this.apiService.buildFiltersFromQueryParams({ - filterByAccounts, - filterByAssetClasses, - filterByDataSource, - filterBySymbol, - filterByTags + filterByAccounts: accounts, + filterByAssetClasses: assetClasses, + filterByDataSource: dataSource, + filterBySymbol: symbol, + filterByTags: tags }); const impersonationUserId = @@ -349,7 +353,9 @@ export class PortfolioController { const { settings } = await this.userService.user({ id: userId }); const userCurrency = settings.settings.baseCurrency; - const { endDate, startDate } = getIntervalFromDateRange({ dateRange }); + const { endDate, startDate } = getIntervalFromDateRange({ + dateRange: range + }); const { activities } = await this.activitiesService.getActivities({ endDate, @@ -368,7 +374,7 @@ export class PortfolioController { if ( hasReadRestrictedAccessPermission({ impersonationId, - user: this.request.user + accesses: this.request.user?.accessesGet }) || isRestrictedView(this.request.user) ) { @@ -429,29 +435,32 @@ export class PortfolioController { @UseInterceptors(TransformDataSourceInResponseInterceptor) public async getHoldings( @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, - @Query('accounts') filterByAccounts?: string, - @Query('assetClasses') filterByAssetClasses?: string, - @Query('dataSource') filterByDataSource?: string, - @Query('holdingType') filterByHoldingType?: string, - @Query('query') filterBySearchQuery?: string, - @Query('range') dateRange: DateRange = DEFAULT_DATE_RANGE, - @Query('symbol') filterBySymbol?: string, - @Query('tags') filterByTags?: string + @Query() + { + accounts, + assetClasses, + dataSource, + holdingType, + query, + range, + symbol, + tags + }: GetHoldingsDto ): Promise { const filters = this.apiService.buildFiltersFromQueryParams({ - filterByAccounts, - filterByAssetClasses, - filterByDataSource, - filterByHoldingType, - filterBySearchQuery, - filterBySymbol, - filterByTags + filterByAccounts: accounts, + filterByAssetClasses: assetClasses, + filterByDataSource: dataSource, + filterByHoldingType: holdingType, + filterBySearchQuery: query, + filterBySymbol: symbol, + filterByTags: tags }); const holdings = await this.portfolioService.getHoldings({ - dateRange, filters, impersonationId, + dateRange: range, userId: this.request.user.id }); @@ -463,35 +472,38 @@ export class PortfolioController { @UseInterceptors(TransformDataSourceInRequestInterceptor) public async getInvestments( @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, - @Query('accounts') filterByAccounts?: string, - @Query('assetClasses') filterByAssetClasses?: string, - @Query('dataSource') filterByDataSource?: string, - @Query('groupBy') groupBy?: GroupBy, - @Query('range') dateRange: DateRange = DEFAULT_DATE_RANGE, - @Query('symbol') filterBySymbol?: string, - @Query('tags') filterByTags?: string + @Query() + { + accounts, + assetClasses, + dataSource, + groupBy, + range, + symbol, + tags + }: GetInvestmentsDto ): Promise { const filters = this.apiService.buildFiltersFromQueryParams({ - filterByAccounts, - filterByAssetClasses, - filterByDataSource, - filterBySymbol, - filterByTags + filterByAccounts: accounts, + filterByAssetClasses: assetClasses, + filterByDataSource: dataSource, + filterBySymbol: symbol, + filterByTags: tags }); - let { investments, streaks } = await this.portfolioService.getInvestments({ - dateRange, - filters, - groupBy, - impersonationId, - savingsRate: this.request.user?.settings?.settings.savingsRate, - userId: this.request.user.id - }); + let { investments, savingsRate, streaks } = + await this.portfolioService.getInvestments({ + filters, + groupBy, + impersonationId, + dateRange: range, + userId: this.request.user.id + }); if ( hasReadRestrictedAccessPermission({ impersonationId, - user: this.request.user + accesses: this.request.user?.accessesGet }) || isRestrictedView(this.request.user) ) { @@ -509,6 +521,8 @@ export class PortfolioController { 'currentStreak', 'longestStreak' ]); + + savingsRate = null; } if ( @@ -525,7 +539,7 @@ export class PortfolioController { ]); } - return { investments, streaks }; + return { investments, savingsRate, streaks }; } @Get('performance') @@ -536,36 +550,37 @@ export class PortfolioController { @Version('2') public async getPerformanceV2( @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, - @Query('accounts') filterByAccounts?: string, - @Query('assetClasses') filterByAssetClasses?: string, - @Query('dataSource') filterByDataSource?: string, - @Query('range') dateRange: DateRange = DEFAULT_DATE_RANGE, - @Query('symbol') filterBySymbol?: string, - @Query('tags') filterByTags?: string, - @Query('withExcludedAccounts') withExcludedAccountsParam = 'false' + @Query() + { + accounts, + assetClasses, + dataSource, + range, + symbol, + tags, + withExcludedAccounts + }: GetPerformanceDto ): Promise { - const withExcludedAccounts = withExcludedAccountsParam === 'true'; - const filters = this.apiService.buildFiltersFromQueryParams({ - filterByAccounts, - filterByAssetClasses, - filterByDataSource, - filterBySymbol, - filterByTags + filterByAccounts: accounts, + filterByAssetClasses: assetClasses, + filterByDataSource: dataSource, + filterBySymbol: symbol, + filterByTags: tags }); const performanceInformation = await this.portfolioService.getPerformance({ - dateRange, filters, impersonationId, withExcludedAccounts, + dateRange: range, userId: this.request.user.id }); if ( hasReadRestrictedAccessPermission({ impersonationId, - user: this.request.user + accesses: this.request.user?.accessesGet }) || isRestrictedView(this.request.user) || this.request.user.settings.settings.viewMode === 'ZEN' diff --git a/apps/api/src/app/portfolio/portfolio.service.spec.ts b/apps/api/src/app/portfolio/portfolio.service.spec.ts index c16590cce..eed3a27cb 100644 --- a/apps/api/src/app/portfolio/portfolio.service.spec.ts +++ b/apps/api/src/app/portfolio/portfolio.service.spec.ts @@ -1,6 +1,7 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { CashDetails } from '@ghostfolio/api/app/account/interfaces/cash-details.interface'; import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service'; +import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator'; import { userDummyData } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; import { UserService } from '@ghostfolio/api/app/user/user.service'; @@ -11,9 +12,13 @@ import { ImpersonationService } from '@ghostfolio/api/services/impersonation/imp import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { UNKNOWN_KEY } from '@ghostfolio/common/config'; import { parseDate } from '@ghostfolio/common/helper'; -import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; +import { + AssetProfileIdentifier, + PortfolioSummary +} from '@ghostfolio/common/interfaces'; +import { AccountWithBalance } from '@ghostfolio/common/types'; -import { Account, DataSource } from '@prisma/client'; +import { DataSource } from '@prisma/client'; import { Big } from 'big.js'; import { randomUUID } from 'node:crypto'; @@ -92,6 +97,7 @@ describe('PortfolioService', () => { null, null, null, + null, null ); @@ -187,7 +193,6 @@ describe('PortfolioService', () => { createdAt: parseDate('2024-01-01'), currency: 'USD', id: randomUUID(), - isExcluded: false, name: 'USD', platformId: null, updatedAt: parseDate('2024-01-01'), @@ -215,13 +220,12 @@ describe('PortfolioService', () => { it('should return cash holdings when the calculator emits cash positions with the exchange-rate data source', async () => { const accountId = randomUUID(); - const cashAccount: Account = { + const cashAccount: AccountWithBalance = { balance: 2000, comment: null, createdAt: parseDate('2024-01-01'), currency: 'USD', id: accountId, - isExcluded: false, name: 'USD', platformId: null, updatedAt: parseDate('2024-01-01'), @@ -337,6 +341,86 @@ describe('PortfolioService', () => { }); }); + describe('getSummary', () => { + const getSummary = (args: object) => { + return ( + portfolioService as unknown as { + getSummary: (aArgs: object) => Promise; + } + ).getSummary(args); + }; + + function createPortfolioCalculator() { + return { + getDividendInBaseCurrency: jest.fn().mockResolvedValue(new Big(0)), + getFeesInBaseCurrency: jest.fn().mockResolvedValue(new Big(0)), + getInterestInBaseCurrency: jest.fn().mockResolvedValue(new Big(0)), + getLiabilitiesInBaseCurrency: jest.fn().mockResolvedValue(new Big(0)), + getSnapshot: jest.fn().mockResolvedValue({ + currentValueInBaseCurrency: new Big(3000), + totalCashInBaseCurrency: new Big(1000), + totalInvestment: new Big(2000), + totalInvestmentWithCurrencyEffect: new Big(2000) + }), + getStartDate: jest.fn().mockReturnValue(parseDate('2024-01-01')) + } as unknown as PortfolioCalculator; + } + + beforeEach(() => { + jest + .spyOn(activitiesService, 'getActivities') + .mockResolvedValue({ activities: [], count: 0 }); + + jest + .spyOn(impersonationService, 'validateImpersonationId') + .mockResolvedValue(null); + + jest.spyOn(portfolioService, 'getPerformance').mockResolvedValue({ + performance: { + currentValueInBaseCurrency: 3000, + netPerformance: 500, + netPerformancePercentage: 0.2, + netPerformancePercentageWithCurrencyEffect: 0.2, + netPerformanceWithCurrencyEffect: 500 + } + } as Awaited>); + + jest.spyOn(userService, 'user').mockResolvedValue({ + id: userDummyData.id, + settings: { + settings: { + baseCurrency: 'CHF' + } + } + } as unknown as Awaited>); + }); + + it('should derive the cash and net worth from the account balance when there are no excluded accounts, no emergency fund and no liabilities', async () => { + jest.spyOn(accountService, 'getCashDetails').mockResolvedValue({ + accounts: [], + balanceInBaseCurrency: 1000 + }); + + const portfolioCalculator = createPortfolioCalculator(); + + const summary = await getSummary({ + portfolioCalculator, + balanceInBaseCurrency: 1000, + emergencyFundHoldingsValueInBaseCurrency: 0, + filteredValueInBaseCurrency: new Big(3000), + impersonationId: undefined, + userCurrency: 'CHF', + userId: userDummyData.id + }); + + expect(summary.cash).toBe(1000); + expect(summary.emergencyFund.total).toBe(0); + expect(summary.excludedAccountsAndActivities).toBe(0); + expect(summary.totalAssetsInBaseCurrency).toBe(3000); + expect(summary.totalValueInBaseCurrency).toBe(3000); + }); + }); + describe('getValueOfAccountsAndPlatforms', () => { const getValueOfAccountsAndPlatforms = (args: object) => { return ( @@ -353,7 +437,6 @@ describe('PortfolioService', () => { balance: 100, currency: 'USD', id: randomUUID(), - isExcluded: false, name: 'Account 1', platform: { name: 'Platform 1' }, platformId: randomUUID() @@ -362,7 +445,7 @@ describe('PortfolioService', () => { beforeEach(() => { jest .spyOn(accountService, 'getAccounts') - .mockResolvedValue([account] as unknown as Account[]); + .mockResolvedValue([account] as unknown as AccountWithBalance[]); jest .spyOn(exchangeRateDataService, 'toCurrency') diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 6a3c1f145..48ea66dac 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -64,6 +64,7 @@ import { } from '@ghostfolio/common/interfaces'; import { TimelinePosition } from '@ghostfolio/common/models'; import { + AccountWithBalance, AccountWithValue, DateRange, GroupBy, @@ -75,7 +76,6 @@ import { PerformanceCalculationType } from '@ghostfolio/common/types/performance import { Inject, Injectable, Logger } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { - Account, Type as ActivityType, AssetClass, AssetSubClass, @@ -165,6 +165,10 @@ export class PortfolioService { }; } + const filtersWithoutSearchQueryFilter = filters?.filter(({ type }) => { + return type !== 'SEARCH_QUERY'; + }); + const [accounts, details, user] = await Promise.all([ this.accountService.accounts({ where, @@ -176,8 +180,8 @@ export class PortfolioService { orderBy: { name: 'asc' } }), this.getDetails({ - filters, withExcludedAccounts, + filters: filtersWithoutSearchQueryFilter, impersonationId: userId, userId: this.request.user.id }), @@ -369,14 +373,6 @@ export class PortfolioService { userId: string; }) { userId = await this.getUserId(impersonationId, userId); - const { holdings: holdingsMap } = await this.getDetails({ - dateRange, - filters, - impersonationId, - userId - }); - - let holdings = Object.values(holdingsMap); const { SEARCH_QUERY: [filterBySearchQuery] = [] } = groupBy( filters, @@ -385,9 +381,22 @@ export class PortfolioService { } ); + const filtersWithoutSearchQueryFilter = filters?.filter(({ type }) => { + return type !== 'SEARCH_QUERY'; + }); + + const { holdings: holdingsMap } = await this.getDetails({ + dateRange, + impersonationId, + userId, + filters: filtersWithoutSearchQueryFilter + }); + + let holdings = Object.values(holdingsMap); + if (filterBySearchQuery) { const fuse = new Fuse(holdings, { - keys: ['isin', 'name', 'symbol'], + keys: ['assetProfile.isin', 'assetProfile.name', 'assetProfile.symbol'], threshold: 0.3 }); @@ -404,19 +413,18 @@ export class PortfolioService { filters, groupBy, impersonationId, - savingsRate, userId }: { dateRange: DateRange; filters?: Filter[]; groupBy?: GroupBy; impersonationId: string; - savingsRate: number; userId: string; }): Promise { userId = await this.getUserId(impersonationId, userId); const user = await this.userService.user({ id: userId }); const userCurrency = this.getUserCurrency(user); + const savingsRate = (user.settings?.settings as UserSettings)?.savingsRate; const { endDate, startDate } = getIntervalFromDateRange({ dateRange }); @@ -429,6 +437,7 @@ export class PortfolioService { if (activities.length === 0) { return { + savingsRate, investments: [], streaks: { currentStreak: 0, longestStreak: 0 } }; @@ -475,6 +484,7 @@ export class PortfolioService { return { investments, + savingsRate, streaks }; } @@ -651,6 +661,7 @@ export class PortfolioService { }; } ), + isin: assetProfile.isin, name: assetProfile.name, sectors: assetProfile.sectors, symbol: assetProfile.symbol, @@ -1035,7 +1046,6 @@ export class PortfolioService { return { chart: [], dateOfFirstActivity: undefined, - firstOrderDate: undefined, hasErrors: false, performance: { currentNetWorth: 0, @@ -1093,7 +1103,6 @@ export class PortfolioService { errors, hasErrors, dateOfFirstActivity: parseDate(historicalData[0]?.date), - firstOrderDate: parseDate(historicalData[0]?.date), performance: { netPerformance, netPerformanceWithCurrencyEffect, @@ -1126,6 +1135,8 @@ export class PortfolioService { withSummary: true }); + const hasOpenHoldings = Object.keys(holdings).length > 0; + const marketsAdvancedTotalInBaseCurrency = getSum( Object.values(marketsAdvanced).map(({ valueInBaseCurrency }) => { return new Big(valueInBaseCurrency); @@ -1185,26 +1196,25 @@ export class PortfolioService { id: 'rule.currencyClusterRisk.category', languageCode: userSettings.language }), - rules: - summary.activityCount > 0 - ? await this.rulesService.evaluate( - [ - new CurrencyClusterRiskBaseCurrencyCurrentInvestment( - this.exchangeRateDataService, - this.i18nService, - Object.values(holdings), - userSettings.language - ), - new CurrencyClusterRiskCurrentInvestment( - this.exchangeRateDataService, - this.i18nService, - Object.values(holdings), - userSettings.language - ) - ], - userSettings - ) - : undefined + rules: hasOpenHoldings + ? await this.rulesService.evaluate( + [ + new CurrencyClusterRiskBaseCurrencyCurrentInvestment( + this.exchangeRateDataService, + this.i18nService, + Object.values(holdings), + userSettings.language + ), + new CurrencyClusterRiskCurrentInvestment( + this.exchangeRateDataService, + this.i18nService, + Object.values(holdings), + userSettings.language + ) + ], + userSettings + ) + : undefined }, { key: 'assetClassClusterRisk', @@ -1212,26 +1222,25 @@ export class PortfolioService { id: 'rule.assetClassClusterRisk.category', languageCode: userSettings.language }), - rules: - summary.activityCount > 0 - ? await this.rulesService.evaluate( - [ - new AssetClassClusterRiskEquity( - this.exchangeRateDataService, - this.i18nService, - userSettings.language, - Object.values(holdings) - ), - new AssetClassClusterRiskFixedIncome( - this.exchangeRateDataService, - this.i18nService, - userSettings.language, - Object.values(holdings) - ) - ], - userSettings - ) - : undefined + rules: hasOpenHoldings + ? await this.rulesService.evaluate( + [ + new AssetClassClusterRiskEquity( + this.exchangeRateDataService, + this.i18nService, + userSettings.language, + Object.values(holdings) + ), + new AssetClassClusterRiskFixedIncome( + this.exchangeRateDataService, + this.i18nService, + userSettings.language, + Object.values(holdings) + ) + ], + userSettings + ) + : undefined }, { key: 'accountClusterRisk', @@ -1266,28 +1275,27 @@ export class PortfolioService { id: 'rule.economicMarketClusterRisk.category', languageCode: userSettings.language }), - rules: - summary.activityCount > 0 - ? await this.rulesService.evaluate( - [ - new EconomicMarketClusterRiskDevelopedMarkets( - this.exchangeRateDataService, - this.i18nService, - marketsTotalInBaseCurrency, - markets.developedMarkets.valueInBaseCurrency, - userSettings.language - ), - new EconomicMarketClusterRiskEmergingMarkets( - this.exchangeRateDataService, - this.i18nService, - marketsTotalInBaseCurrency, - markets.emergingMarkets.valueInBaseCurrency, - userSettings.language - ) - ], - userSettings - ) - : undefined + rules: hasOpenHoldings + ? await this.rulesService.evaluate( + [ + new EconomicMarketClusterRiskDevelopedMarkets( + this.exchangeRateDataService, + this.i18nService, + marketsTotalInBaseCurrency, + markets.developedMarkets.valueInBaseCurrency, + userSettings.language + ), + new EconomicMarketClusterRiskEmergingMarkets( + this.exchangeRateDataService, + this.i18nService, + marketsTotalInBaseCurrency, + markets.emergingMarkets.valueInBaseCurrency, + userSettings.language + ) + ], + userSettings + ) + : undefined }, { key: 'regionalMarketClusterRisk', @@ -1295,49 +1303,48 @@ export class PortfolioService { id: 'rule.regionalMarketClusterRisk.category', languageCode: userSettings.language }), - rules: - summary.activityCount > 0 - ? await this.rulesService.evaluate( - [ - new RegionalMarketClusterRiskAsiaPacific( - this.exchangeRateDataService, - this.i18nService, - userSettings.language, - marketsAdvancedTotalInBaseCurrency, - marketsAdvanced.asiaPacific.valueInBaseCurrency - ), - new RegionalMarketClusterRiskEmergingMarkets( - this.exchangeRateDataService, - this.i18nService, - userSettings.language, - marketsAdvancedTotalInBaseCurrency, - marketsAdvanced.emergingMarkets.valueInBaseCurrency - ), - new RegionalMarketClusterRiskEurope( - this.exchangeRateDataService, - this.i18nService, - userSettings.language, - marketsAdvancedTotalInBaseCurrency, - marketsAdvanced.europe.valueInBaseCurrency - ), - new RegionalMarketClusterRiskJapan( - this.exchangeRateDataService, - this.i18nService, - userSettings.language, - marketsAdvancedTotalInBaseCurrency, - marketsAdvanced.japan.valueInBaseCurrency - ), - new RegionalMarketClusterRiskNorthAmerica( - this.exchangeRateDataService, - this.i18nService, - userSettings.language, - marketsAdvancedTotalInBaseCurrency, - marketsAdvanced.northAmerica.valueInBaseCurrency - ) - ], - userSettings - ) - : undefined + rules: hasOpenHoldings + ? await this.rulesService.evaluate( + [ + new RegionalMarketClusterRiskAsiaPacific( + this.exchangeRateDataService, + this.i18nService, + userSettings.language, + marketsAdvancedTotalInBaseCurrency, + marketsAdvanced.asiaPacific.valueInBaseCurrency + ), + new RegionalMarketClusterRiskEmergingMarkets( + this.exchangeRateDataService, + this.i18nService, + userSettings.language, + marketsAdvancedTotalInBaseCurrency, + marketsAdvanced.emergingMarkets.valueInBaseCurrency + ), + new RegionalMarketClusterRiskEurope( + this.exchangeRateDataService, + this.i18nService, + userSettings.language, + marketsAdvancedTotalInBaseCurrency, + marketsAdvanced.europe.valueInBaseCurrency + ), + new RegionalMarketClusterRiskJapan( + this.exchangeRateDataService, + this.i18nService, + userSettings.language, + marketsAdvancedTotalInBaseCurrency, + marketsAdvanced.japan.valueInBaseCurrency + ), + new RegionalMarketClusterRiskNorthAmerica( + this.exchangeRateDataService, + this.i18nService, + userSettings.language, + marketsAdvancedTotalInBaseCurrency, + marketsAdvanced.northAmerica.valueInBaseCurrency + ) + ], + userSettings + ) + : undefined }, { key: 'fees', @@ -2136,7 +2143,7 @@ export class PortfolioService { const accounts: PortfolioDetails['accounts'] = {}; const platforms: PortfolioDetails['platforms'] = {}; - let currentAccounts: (Account & { + let currentAccounts: (AccountWithBalance & { Order?: Order[]; platform?: Platform; tags?: Tag[]; diff --git a/apps/api/src/app/redis-cache/redis-cache.service.mock.ts b/apps/api/src/app/redis-cache/redis-cache.service.mock.ts index feb669ab0..2a3c1cc7a 100644 --- a/apps/api/src/app/redis-cache/redis-cache.service.mock.ts +++ b/apps/api/src/app/redis-cache/redis-cache.service.mock.ts @@ -18,6 +18,9 @@ export const RedisCacheServiceMock = { return `portfolio-snapshot-${userId}${filtersHash > 0 ? `-${filtersHash}` : ''}`; }, + reset: () => { + RedisCacheServiceMock.cache.clear(); + }, set: (key: string, value: string): Promise => { RedisCacheServiceMock.cache.set(key, value); diff --git a/apps/api/src/app/subscription/subscription.controller.ts b/apps/api/src/app/subscription/subscription.controller.ts index 4018e4753..a70fe8791 100644 --- a/apps/api/src/app/subscription/subscription.controller.ts +++ b/apps/api/src/app/subscription/subscription.controller.ts @@ -54,7 +54,9 @@ export class SubscriptionController { } let coupons = - (await this.propertyService.getByKey(PROPERTY_COUPONS)) ?? []; + (await this.propertyService.getByKey(PROPERTY_COUPONS, { + skipCache: true + })) ?? []; const coupon = coupons.find((currentCoupon) => { return currentCoupon.code === couponCode; diff --git a/apps/api/src/app/user/user.controller.ts b/apps/api/src/app/user/user.controller.ts index 7a1fc71dc..2b679f34c 100644 --- a/apps/api/src/app/user/user.controller.ts +++ b/apps/api/src/app/user/user.controller.ts @@ -1,7 +1,9 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { CustomThrottlerGuard } from '@ghostfolio/api/guards/custom-throttler.guard'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { decodeDataSource } from '@ghostfolio/api/helper/data-source.helper'; import { RedactValuesInResponseInterceptor } from '@ghostfolio/api/interceptors/redact-values-in-response/redact-values-in-response.interceptor'; +import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; @@ -119,6 +121,7 @@ export class UserController { @Get() @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(RedactValuesInResponseInterceptor) + @UseInterceptors(TransformDataSourceInResponseInterceptor) public async getUser( @Headers('accept-language') acceptLanguage: string, @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string @@ -165,6 +168,7 @@ export class UserController { @Put('setting') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + @UseInterceptors(TransformDataSourceInResponseInterceptor) public async updateUserSetting(@Body() data: UpdateUserSettingDto) { if ( size(data) === 1 && @@ -192,6 +196,12 @@ export class UserController { data ); + if (userSettings['filters.dataSource']) { + userSettings['filters.dataSource'] = decodeDataSource( + userSettings['filters.dataSource'] + ); + } + for (const key in userSettings) { if (userSettings[key] === false || userSettings[key] === null) { delete userSettings[key]; diff --git a/apps/api/src/app/user/user.module.ts b/apps/api/src/app/user/user.module.ts index 3f4e898fc..156630964 100644 --- a/apps/api/src/app/user/user.module.ts +++ b/apps/api/src/app/user/user.module.ts @@ -1,6 +1,7 @@ import { ActivitiesModule } from '@ghostfolio/api/app/activities/activities.module'; import { SubscriptionModule } from '@ghostfolio/api/app/subscription/subscription.module'; import { RedactValuesInResponseModule } from '@ghostfolio/api/interceptors/redact-values-in-response/redact-values-in-response.module'; +import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { I18nModule } from '@ghostfolio/api/services/i18n/i18n.module'; import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; @@ -30,7 +31,8 @@ import { UserService } from './user.service'; PropertyModule, RedactValuesInResponseModule, SubscriptionModule, - TagModule + TagModule, + TransformDataSourceInResponseModule ], providers: [UserService] }) diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 648f36cbf..8fb11ad34 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -31,9 +31,12 @@ import { DEFAULT_LOCALE, PROPERTY_API_KEY_GHOSTFOLIO, PROPERTY_IS_READ_ONLY_MODE, + PROPERTY_MAX_DAILY_REQUESTS, PROPERTY_REFERRAL_PARTNERS, PROPERTY_SYSTEM_MESSAGE, - TAG_ID_EXCLUDE_FROM_ANALYSIS + TAG_ID_EXCLUDE_FROM_ANALYSIS, + THROTTLE_DAILY_KEY, + THROTTLE_DAILY_TTL } from '@ghostfolio/common/config'; import { SubscriptionType } from '@ghostfolio/common/enums'; import { @@ -50,15 +53,18 @@ import { import { UserWithSettings } from '@ghostfolio/common/types'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; -import { Injectable } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import { EventEmitter2 } from '@nestjs/event-emitter'; +import { InjectThrottlerStorage, ThrottlerStorage } from '@nestjs/throttler'; import { Prisma, Role, Settings, User } from '@prisma/client'; import { differenceInDays, subDays } from 'date-fns'; -import { without } from 'lodash'; +import { isNil, without } from 'lodash'; import { createHmac } from 'node:crypto'; @Injectable() export class UserService { + private readonly logger = new Logger(UserService.name); + public constructor( private readonly activitiesService: ActivitiesService, private readonly configurationService: ConfigurationService, @@ -67,7 +73,9 @@ export class UserService { private readonly prismaService: PrismaService, private readonly propertyService: PropertyService, private readonly subscriptionService: SubscriptionService, - private readonly tagService: TagService + private readonly tagService: TagService, + @InjectThrottlerStorage() + private readonly throttlerStorage: ThrottlerStorage ) {} public async count(args?: Prisma.UserCountArgs) { @@ -128,6 +136,7 @@ export class UserService { where: { granteeUserId: id } }), this.prismaService.account.findMany({ + include: { platform: true }, orderBy: { name: 'asc' }, @@ -178,15 +187,15 @@ export class UserService { systemMessage = systemMessageProperty; } - let tags = tagsForUser.filter((tag) => { - return tag.id !== TAG_ID_EXCLUDE_FROM_ANALYSIS; - }); + let tags = tagsForUser; if ( this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && subscription.type === SubscriptionType.Basic ) { - tags = []; + tags = tags.filter(({ id }) => { + return id === TAG_ID_EXCLUDE_FROM_ANALYSIS; + }); } return { @@ -228,6 +237,38 @@ export class UserService { return usersWithAdminRole.length > 0; } + public async isDailyRequestLimitExceeded({ + user + }: { + user: UserWithSettings; + }) { + if (user.subscription?.type === SubscriptionType.Premium) { + return false; + } + + const maxDailyRequests = await this.getMaxDailyRequests(); + + if (maxDailyRequests === undefined) { + return false; + } + + try { + const { isBlocked } = await this.throttlerStorage.increment( + `${THROTTLE_DAILY_KEY}-${user.id}`, + THROTTLE_DAILY_TTL, + maxDailyRequests, + THROTTLE_DAILY_TTL, + THROTTLE_DAILY_KEY + ); + + return isBlocked; + } catch (error) { + this.logger.error(error); + + return false; + } + } + public async user( userWhereUniqueInput: Prisma.UserWhereUniqueInput ): Promise { @@ -286,7 +327,7 @@ export class UserService { updatedAt, activityCount: analytics?.activityCount, dataProviderGhostfolioDailyRequests: - analytics?.dataProviderGhostfolioDailyRequests + analytics?.dataProviderGhostfolioDailyRequests ?? 0 }; if (user.settings) { @@ -509,9 +550,11 @@ export class UserService { currentPermissions, permissions.accessHoldingsChart, permissions.createAccess, + permissions.createAssetProfileSplitOfOwnAssetProfile, permissions.createMarketDataOfOwnAssetProfile, permissions.createOwnTag, permissions.createWatchlistItem, + permissions.deleteAssetProfileSplitOfOwnAssetProfile, permissions.readAiPrompt, permissions.readMarketDataOfOwnAssetProfile, permissions.updateMarketDataOfOwnAssetProfile @@ -555,7 +598,10 @@ export class UserService { } } else { if ( - await this.propertyService.getByKey(PROPERTY_API_KEY_GHOSTFOLIO) + this.configurationService.get('ENABLE_FEATURE_FEAR_AND_GREED_INDEX') || + (await this.propertyService.getByKey( + PROPERTY_API_KEY_GHOSTFOLIO + )) ) { currentPermissions.push(permissions.readMarketDataOfMarkets); } @@ -779,4 +825,26 @@ export class UserService { return settings; } + + private async getMaxDailyRequests() { + const value = await this.propertyService.getByKey( + PROPERTY_MAX_DAILY_REQUESTS + ); + + if (isNil(value) || value === '') { + return undefined; + } + + const maxDailyRequests = Number(value); + + if (!Number.isInteger(maxDailyRequests) || maxDailyRequests < 0) { + this.logger.warn( + `The property ${PROPERTY_MAX_DAILY_REQUESTS} is not a non-negative integer ("${value}"), the daily request limit is not applied` + ); + + return undefined; + } + + return maxDailyRequests; + } } diff --git a/apps/api/src/dtos/date-range-filter.dto.ts b/apps/api/src/dtos/date-range-filter.dto.ts new file mode 100644 index 000000000..bf440ac7c --- /dev/null +++ b/apps/api/src/dtos/date-range-filter.dto.ts @@ -0,0 +1,16 @@ +import { DATE_RANGES, DEFAULT_DATE_RANGE } from '@ghostfolio/common/config'; +import { DateRange } from '@ghostfolio/common/types'; + +import { Matches } from 'class-validator'; + +import { FilterDto } from './filter.dto'; + +// A named date range or a calendar year like '2024', '2023', '2022', etc. +export const DATE_RANGE_PATTERN = new RegExp( + `^(${DATE_RANGES.join('|')}|\\d{4})$` +); + +export class DateRangeFilterDto extends FilterDto { + @Matches(DATE_RANGE_PATTERN) + range?: DateRange = DEFAULT_DATE_RANGE; +} diff --git a/apps/api/src/dtos/filter.dto.ts b/apps/api/src/dtos/filter.dto.ts new file mode 100644 index 000000000..cb26d582b --- /dev/null +++ b/apps/api/src/dtos/filter.dto.ts @@ -0,0 +1,23 @@ +import { IsOptional, IsString } from 'class-validator'; + +export class FilterDto { + @IsOptional() + @IsString() + accounts?: string; + + @IsOptional() + @IsString() + assetClasses?: string; + + @IsOptional() + @IsString() + dataSource?: string; + + @IsOptional() + @IsString() + symbol?: string; + + @IsOptional() + @IsString() + tags?: string; +} diff --git a/apps/api/src/filters/portfolio-snapshot-computation-exception.filter.ts b/apps/api/src/filters/portfolio-snapshot-computation-exception.filter.ts new file mode 100644 index 000000000..05471c3f6 --- /dev/null +++ b/apps/api/src/filters/portfolio-snapshot-computation-exception.filter.ts @@ -0,0 +1,26 @@ +import { PortfolioSnapshotComputationError } from '@ghostfolio/api/app/portfolio/errors/portfolio-snapshot-computation.error'; + +import { ArgumentsHost, Catch, ExceptionFilter, Logger } from '@nestjs/common'; +import { Response } from 'express'; +import { getReasonPhrase, StatusCodes } from 'http-status-codes'; + +@Catch(PortfolioSnapshotComputationError) +export class PortfolioSnapshotComputationExceptionFilter implements ExceptionFilter { + private readonly logger = new Logger( + PortfolioSnapshotComputationExceptionFilter.name + ); + + public catch( + exception: PortfolioSnapshotComputationError, + host: ArgumentsHost + ) { + this.logger.error(exception.message); + + const response = host.switchToHttp().getResponse(); + + response.status(StatusCodes.SERVICE_UNAVAILABLE).json({ + message: getReasonPhrase(StatusCodes.SERVICE_UNAVAILABLE), + statusCode: StatusCodes.SERVICE_UNAVAILABLE + }); + } +} diff --git a/apps/api/src/helper/account.helper.ts b/apps/api/src/helper/account.helper.ts index 0800c022e..da0762ba5 100644 --- a/apps/api/src/helper/account.helper.ts +++ b/apps/api/src/helper/account.helper.ts @@ -1,12 +1,28 @@ import { TAG_ID_EXCLUDE_FROM_ANALYSIS } from '@ghostfolio/common/config'; import { Prisma } from '@prisma/client'; +import { endOfToday, isAfter } from 'date-fns'; export const WHERE_ACCOUNT_NOT_EXCLUDED: Prisma.AccountWhereInput = { - isExcluded: false, tags: { none: { tagId: TAG_ID_EXCLUDE_FROM_ANALYSIS } } }; + +export function getWhereAccountBalanceNotInFuture(): Prisma.AccountBalanceWhereInput { + return { + date: { lte: endOfToday() } + }; +} + +export function isAccountBalanceInFuture({ + date, + endOfTodayDate = endOfToday() +}: { + date: Date; + endOfTodayDate?: Date; +}) { + return isAfter(date, endOfTodayDate); +} diff --git a/apps/api/src/interceptors/redact-values-in-response/redact-values-in-response.interceptor.ts b/apps/api/src/interceptors/redact-values-in-response/redact-values-in-response.interceptor.ts index 60b994cac..6a9596298 100644 --- a/apps/api/src/interceptors/redact-values-in-response/redact-values-in-response.interceptor.ts +++ b/apps/api/src/interceptors/redact-values-in-response/redact-values-in-response.interceptor.ts @@ -38,7 +38,7 @@ export class RedactValuesInResponseInterceptor implements NestInterceptor< if ( hasReadRestrictedAccessPermission({ impersonationId, - user + accesses: user?.accessesGet }) || isRestrictedView(user) ) { diff --git a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts index 6b38b2d54..81aabf4ae 100644 --- a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts +++ b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts @@ -78,6 +78,7 @@ export class TransformDataSourceInResponseInterceptor< valueMap, object: data, paths: [ + '["filters.dataSource"]', 'activities[*].assetProfile.dataSource', 'activities[*].dataSource', 'assetProfile.dataSource', @@ -88,6 +89,7 @@ export class TransformDataSourceInResponseInterceptor< 'holdings[*].assetProfile.dataSource', 'holdings[*].dataSource', 'items[*].dataSource', + 'settings["filters.dataSource"]', 'watchlist[*].dataSource' ] }); diff --git a/apps/api/src/services/asset-profile-split/asset-profile-split.module.ts b/apps/api/src/services/asset-profile-split/asset-profile-split.module.ts new file mode 100644 index 000000000..1219a2f98 --- /dev/null +++ b/apps/api/src/services/asset-profile-split/asset-profile-split.module.ts @@ -0,0 +1,12 @@ +import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; + +import { Module } from '@nestjs/common'; + +import { AssetProfileSplitService } from './asset-profile-split.service'; + +@Module({ + exports: [AssetProfileSplitService], + imports: [PrismaModule], + providers: [AssetProfileSplitService] +}) +export class AssetProfileSplitModule {} diff --git a/apps/api/src/services/asset-profile-split/asset-profile-split.service.ts b/apps/api/src/services/asset-profile-split/asset-profile-split.service.ts new file mode 100644 index 000000000..ec842caaf --- /dev/null +++ b/apps/api/src/services/asset-profile-split/asset-profile-split.service.ts @@ -0,0 +1,87 @@ +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { resetHours } from '@ghostfolio/common/helper'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; + +import { Injectable } from '@nestjs/common'; +import { AssetProfileSplit } from '@prisma/client'; + +@Injectable() +export class AssetProfileSplitService { + public constructor(private readonly prismaService: PrismaService) {} + + /** + * Deletes the split with the given id of an asset profile and returns + * whether it existed + */ + public async deleteById({ + id, + symbolProfileId + }: { + id: string; + symbolProfileId: string; + }) { + const { count } = await this.prismaService.assetProfileSplit.deleteMany({ + where: { + id, + symbolProfileId + } + }); + + return count > 0; + } + + /** + * Returns the splits of the given asset profile in ascending order by date + */ + public async getSplits({ + dataSource, + symbol + }: AssetProfileIdentifier): Promise { + return this.prismaService.assetProfileSplit.findMany({ + orderBy: [ + { + date: 'asc' + } + ], + where: { + symbolProfile: { + dataSource, + symbol + } + } + }); + } + + public async upsert({ + date, + denominator, + numerator, + symbolProfileId + }: { + date: Date; + denominator: number; + numerator: number; + symbolProfileId: string; + }): Promise { + const dateOfSplit = resetHours(date); + + return this.prismaService.assetProfileSplit.upsert({ + create: { + denominator, + numerator, + symbolProfileId, + date: dateOfSplit + }, + update: { + denominator, + numerator + }, + where: { + symbolProfileId_date: { + symbolProfileId, + date: dateOfSplit + } + } + }); + } +} diff --git a/apps/api/src/services/benchmark/benchmark.service.ts b/apps/api/src/services/benchmark/benchmark.service.ts index 17e729f9f..993e0f0aa 100644 --- a/apps/api/src/services/benchmark/benchmark.service.ts +++ b/apps/api/src/services/benchmark/benchmark.service.ts @@ -159,7 +159,8 @@ export class BenchmarkService { let benchmarks = (await this.propertyService.getByKey( - PROPERTY_BENCHMARKS + PROPERTY_BENCHMARKS, + { skipCache: true } )) ?? []; benchmarks.push({ symbolProfileId: assetProfile.id }); @@ -196,7 +197,8 @@ export class BenchmarkService { let benchmarks = (await this.propertyService.getByKey( - PROPERTY_BENCHMARKS + PROPERTY_BENCHMARKS, + { skipCache: true } )) ?? []; benchmarks = benchmarks.filter(({ symbolProfileId }) => { 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 64a8bf4ef..29e4e5129 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 @@ -50,12 +50,10 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { response: Partial; symbol: string; }): Promise> { - if ( - !( - response.assetClass === 'EQUITY' && - ['ETF', 'MUTUALFUND'].includes(response.assetSubClass) - ) - ) { + if (!( + response.assetClass === 'EQUITY' && + ['ETF', 'MUTUALFUND'].includes(response.assetSubClass) + )) { return response; } @@ -214,8 +212,8 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { return undefined; }) .catch(({ message }) => { - this.logger.error( - `Failed to search Trackinsight symbol for ${symbol} (${message})` + this.logger.warn( + `Could not search Trackinsight symbol for "${symbol}": ${message}` ); 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 e8d5f5030..c5de3e4e5 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -9,6 +9,7 @@ import { PropertyService } from '@ghostfolio/api/services/property/property.serv import { DEFAULT_CURRENCY, DERIVED_CURRENCIES, + NON_INVESTMENT_ACTIVITY_TYPES, PROPERTY_API_KEY_GHOSTFOLIO, PROPERTY_DATA_SOURCE_MAPPING } from '@ghostfolio/common/config'; @@ -20,7 +21,8 @@ import { getCurrencyFromSymbol, getStartOfUtcDate, isCurrency, - isDerivedCurrency + isDerivedCurrency, + isValidSearchQuery } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, @@ -267,7 +269,7 @@ export class DataProviderService implements OnModuleInit { if (!assetProfiles[assetProfileIdentifier]) { if ( (dataSource === DataSource.MANUAL && type === 'BUY') || - ['FEE', 'INTEREST', 'LIABILITY'].includes(type) + NON_INVESTMENT_ACTIVITY_TYPES.includes(type) ) { const assetProfileInImport = assetProfilesWithMarketDataDto?.find( (assetProfile) => { @@ -317,7 +319,7 @@ export class DataProviderService implements OnModuleInit { if (!assetProfile?.name) { throw new Error( - `activities.${index}.symbol ("${symbol}") is not valid for the specified data source ("${maskedDataSource}")` + `${activityPath}.symbol ("${symbol}") is not valid for the specified data source ("${maskedDataSource}")` ); } @@ -838,7 +840,9 @@ export class DataProviderService implements OnModuleInit { let lookupItems: LookupItem[] = []; const promises: Promise[] = []; - if (query?.length < 2) { + query = query?.trim(); + + if (!isValidSearchQuery(query)) { return { items: lookupItems }; } 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 05df65ad1..f7f2e7eb9 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 @@ -178,7 +178,7 @@ export class FinancialModelingPrepService aliases: FinancialModelingPrepService.countriesMapping, name: countryName }), - weight: parseFloat(weightPercentage.slice(0, -1)) / 100 + weight: parseFloat(`${weightPercentage}`) / 100 }; }); 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 52fb5d5a8..364354f6b 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 @@ -330,7 +330,11 @@ export class YahooFinanceService implements DataProviderInterface { }); } } catch (error) { - this.logger.error(error); + if (error?.name === 'BadRequestError') { + this.logger.warn(`Could not search for "${query}": ${error.message}`); + } else { + this.logger.error(error); + } } return { items }; diff --git a/apps/api/src/services/property/property.service.ts b/apps/api/src/services/property/property.service.ts index 80643482f..6d8130bbc 100644 --- a/apps/api/src/services/property/property.service.ts +++ b/apps/api/src/services/property/property.service.ts @@ -6,27 +6,39 @@ import { import { PropertyKey } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; +import { Property } from '@prisma/client'; +import { addMilliseconds, isBefore } from 'date-fns'; +import ms from 'ms'; import { PropertyValue } from './interfaces/interfaces'; @Injectable() export class PropertyService { + private static readonly CACHE_TTL = ms('1 minute'); + + private cachedProperties: Promise; + private cachedPropertiesExpiresAt: Date; + public constructor(private readonly prismaService: PrismaService) {} public async delete({ key }: { key: PropertyKey }) { - return this.prismaService.property.delete({ + const property = await this.prismaService.property.delete({ where: { key } }); + + this.invalidateCache(); + + return property; } - public async get() { + public async get({ skipCache = false } = {}) { const response: { [key: string]: PropertyValue; } = { [PROPERTY_CURRENCIES]: [] }; - const properties = await this.prismaService.property.findMany(); + const properties = await this.getProperties({ skipCache }); for (const property of properties) { let value = property.value; @@ -41,8 +53,11 @@ export class PropertyService { return response; } - public async getByKey(aKey: PropertyKey) { - const properties = await this.get(); + public async getByKey( + aKey: PropertyKey, + { skipCache = false } = {} + ) { + const properties = await this.get({ skipCache }); return properties[aKey] as TValue; } @@ -53,10 +68,53 @@ export class PropertyService { } public async put({ key, value }: { key: PropertyKey; value: string }) { - return this.prismaService.property.upsert({ + const property = await this.prismaService.property.upsert({ create: { key, value }, update: { value }, where: { key } }); + + this.invalidateCache(); + + return property; + } + + /** + * Returns the properties from the in-memory cache, falling back to the + * database. Callers which write back a modified property must set + * skipCache to avoid basing the write on a stale read. + */ + private async getProperties({ skipCache = false } = {}) { + if (skipCache) { + return this.prismaService.property.findMany(); + } + + if ( + this.cachedProperties && + isBefore(new Date(), this.cachedPropertiesExpiresAt) + ) { + return this.cachedProperties; + } + + const properties = this.prismaService.property.findMany().catch((error) => { + if (this.cachedProperties === properties) { + this.invalidateCache(); + } + + throw error; + }); + + this.cachedProperties = properties; + this.cachedPropertiesExpiresAt = addMilliseconds( + new Date(), + PropertyService.CACHE_TTL + ); + + return this.cachedProperties; + } + + private invalidateCache() { + this.cachedProperties = undefined; + this.cachedPropertiesExpiresAt = undefined; } } 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 cf94a9d2b..2ade39a8a 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 @@ -87,7 +87,7 @@ export class PortfolioSnapshotProcessor { : 0 ); - this.redisCacheService.set( + await this.redisCacheService.set( this.redisCacheService.getPortfolioSnapshotKey({ filters: job.data.filters, userId: job.data.userId 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 7eb09d966..fddbd01ab 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,32 +1,47 @@ +import { PortfolioSnapshotValue } from '@ghostfolio/api/app/portfolio/interfaces/snapshot-value.interface'; +import { RedisCacheServiceMock } from '@ghostfolio/api/app/redis-cache/redis-cache.service.mock'; + import type { Job, JobId, JobOptions } from 'bull'; +import ms from 'ms'; import { setTimeout } from 'timers/promises'; import { PortfolioSnapshotQueueJob } from './interfaces/portfolio-snapshot-queue-job.interface'; export const PortfolioSnapshotServiceMock = { - addJobToQueue({ + addJobToQueue: ({ opts }: { data: PortfolioSnapshotQueueJob; name: string; opts?: JobOptions; - }): Promise { + }): Promise => { const mockJob: Partial = { finished: async () => { await setTimeout(100); - return Promise.resolve(); + // Mimic the processor which caches the computed portfolio snapshot + // under the job id + await RedisCacheServiceMock.set( + opts?.jobId as string, + JSON.stringify({ + expiration: Date.now() + ms('1 minute'), + portfolioSnapshot: {} + } as unknown as PortfolioSnapshotValue) + ); } }; - this.jobsStore.set(opts?.jobId, mockJob); + PortfolioSnapshotServiceMock.jobsStore.set(opts?.jobId, mockJob); return Promise.resolve(mockJob as Job); }, - getJob(jobId: JobId): Promise { - const job = this.jobsStore.get(jobId); + getJob: (jobId: JobId): Promise => { + const job = PortfolioSnapshotServiceMock.jobsStore.get(jobId); return Promise.resolve(job as Job); }, - jobsStore: new Map>() + jobsStore: new Map>(), + reset: () => { + PortfolioSnapshotServiceMock.jobsStore.clear(); + } }; diff --git a/apps/api/src/services/symbol-profile/symbol-profile.service.ts b/apps/api/src/services/symbol-profile/symbol-profile.service.ts index 1854a9f93..ebc8a94c7 100644 --- a/apps/api/src/services/symbol-profile/symbol-profile.service.ts +++ b/apps/api/src/services/symbol-profile/symbol-profile.service.ts @@ -105,6 +105,27 @@ export class SymbolProfileService { }; } + public async getCustomSymbolProfilesByNames({ + names, + userId + }: { + names: string[]; + userId: string; + }): Promise[]> { + if (names.length === 0) { + return []; + } + + return this.prismaService.symbolProfile.findMany({ + select: { name: true, symbol: true }, + where: { + userId, + dataSource: DataSource.MANUAL, + name: { in: names } + } + }); + } + public async getSymbolProfiles( aAssetProfileIdentifiers: AssetProfileIdentifier[] ): Promise { diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index ff67daf5e..65b5e95b0 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -57,12 +57,12 @@ export class GfAppComponent implements OnInit { public currentRoute: string; public currentSubRoute: string; public deviceType: string; - public hasImpersonationId: boolean; public hasInfoMessage: boolean; public hasPermissionToChangeDateRange: boolean; public hasPermissionToChangeFilters: boolean; public hasPromotion = false; public hasTabs = false; + public impersonationId: string | null; public info: InfoItem; public pageTitle: string; public routerLinkRegister = publicRoutes.register.routerLink; @@ -116,7 +116,7 @@ export class GfAppComponent implements OnInit { .onChangeHasImpersonation() .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((impersonationId) => { - this.hasImpersonationId = !!impersonationId; + this.impersonationId = impersonationId; }); this.router.events @@ -135,7 +135,10 @@ export class GfAppComponent implements OnInit { this.currentSubRoute === internalRoutes.home.subRoutes?.holdings.path) || (this.currentRoute === internalRoutes.portfolio.path && - !this.currentSubRoute)) && + !this.currentSubRoute) || + (this.currentRoute === internalRoutes.portfolio.path && + this.currentSubRoute === + internalRoutes.portfolio.subRoutes?.activities.path)) && this.user?.settings?.viewMode !== 'ZEN' ) { this.hasPermissionToChangeDateRange = true; @@ -288,13 +291,12 @@ export class GfAppComponent implements OnInit { baseCurrency: this.user?.settings?.baseCurrency, colorScheme: this.user?.settings?.colorScheme, deviceType: this.deviceType, - hasImpersonationId: this.hasImpersonationId, hasPermissionToAccessAdminControl: hasPermission( this.user?.permissions, permissions.accessAdminControl ), hasPermissionToCreateActivity: - !this.hasImpersonationId && + !this.impersonationId && hasPermission( this.user?.permissions, permissions.createActivity @@ -305,12 +307,13 @@ export class GfAppComponent implements OnInit { permissions.reportDataGlitch ), hasPermissionToUpdateActivity: - !this.hasImpersonationId && + !this.impersonationId && hasPermission( this.user?.permissions, permissions.updateActivity ) && !this.user?.settings?.isRestrictedView, + impersonationId: this.impersonationId, locale: this.user?.settings?.locale }, height: this.deviceType === 'mobile' ? '98vh' : '80vh', 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 62b87cfc0..a0350ee6b 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 @@ -14,13 +14,19 @@ import { PortfolioPosition, User } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { + hasPermission, + hasReadRestrictedAccessPermission, + permissions +} from '@ghostfolio/common/permissions'; import { GfAccountBalancesComponent } from '@ghostfolio/ui/account-balances'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer'; import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header'; import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table'; +import { translate } from '@ghostfolio/ui/i18n'; import { DataService } from '@ghostfolio/ui/services'; +import { GfTagsSelectorComponent } from '@ghostfolio/ui/tags-selector'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { @@ -42,12 +48,14 @@ import { MatTableDataSource } from '@angular/material/table'; import { MatTabsModule } from '@angular/material/tabs'; import { NavigationStart, Router } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; +import { Tag } from '@prisma/client'; import { Big } from 'big.js'; import { format, parseISO } from 'date-fns'; import { addIcons } from 'ionicons'; import { albumsOutline, cashOutline, + readerOutline, swapVerticalOutline } from 'ionicons/icons'; import { isNumber } from 'lodash'; @@ -69,6 +77,7 @@ import { GfDialogHeaderComponent, GfHoldingsTableComponent, GfInvestmentChartComponent, + GfTagsSelectorComponent, GfValueComponent, IonIcon, MatButtonModule, @@ -97,7 +106,7 @@ export class GfAccountDetailDialogComponent implements OnInit { protected holdings: PortfolioPosition[]; protected interestInBaseCurrency: number; protected interestInBaseCurrencyPrecision = 2; - protected isLoadingActivities: boolean; + protected isLoading = true; protected isLoadingChart: boolean; protected name: string | null; protected pageIndex = 0; @@ -105,6 +114,7 @@ export class GfAccountDetailDialogComponent implements OnInit { protected platformName: string; protected sortColumn = 'date'; protected sortDirection: SortDirection = 'desc'; + protected tags: Tag[]; protected totalItems: number; protected user: User; protected valueInBaseCurrency: number; @@ -148,7 +158,12 @@ export class GfAccountDetailDialogComponent implements OnInit { } }); - addIcons({ albumsOutline, cashOutline, swapVerticalOutline }); + addIcons({ + albumsOutline, + cashOutline, + readerOutline, + swapVerticalOutline + }); } public ngOnInit() { @@ -214,7 +229,10 @@ export class GfAccountDetailDialogComponent implements OnInit { protected showValuesInPercentage() { return ( - this.data.hasImpersonationId || this.user?.settings?.isRestrictedView + hasReadRestrictedAccessPermission({ + accesses: this.user?.access, + impersonationId: this.data.impersonationId + }) || this.user?.settings?.isRestrictedView ); } @@ -231,6 +249,7 @@ export class GfAccountDetailDialogComponent implements OnInit { interestInBaseCurrency, name, platform, + tags, value, valueInBaseCurrency }) => { @@ -280,16 +299,25 @@ export class GfAccountDetailDialogComponent implements OnInit { this.name = name; this.platformName = platform?.name ?? '-'; + + this.tags = + tags?.map((tag) => { + return { + ...tag, + name: translate(tag.name) + }; + }) ?? []; + this.valueInBaseCurrency = valueInBaseCurrency; + this.isLoading = false; + this.changeDetectorRef.markForCheck(); } ); } private fetchActivities() { - this.isLoadingActivities = true; - this.dataService .fetchActivities({ filters: [{ id: this.data.accountId, type: 'ACCOUNT' }], @@ -303,8 +331,6 @@ export class GfAccountDetailDialogComponent implements OnInit { this.dataSource = new MatTableDataSource(activities); this.totalItems = count; - this.isLoadingActivities = false; - this.changeDetectorRef.markForCheck(); }); } @@ -325,8 +351,7 @@ export class GfAccountDetailDialogComponent implements OnInit { } ], range: DEFAULT_DATE_RANGE, - withExcludedAccounts: true, - withItems: true + withExcludedAccounts: true }) .pipe(takeUntilDestroyed(this.destroyRef)) }).subscribe({ 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 5c5be6cb7..cb3246c00 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 @@ -12,6 +12,7 @@ -
-
- Cash Balance -
-
- Equity -
-
- Interest -
-
- Dividend -
-
- Activities -
-
- Platform -
-
- + + + +
Overview
+
+
+
+
+ Cash Balance +
+
+ Equity +
+
+ Interest +
+
+ Dividend +
+
+ + @if (activitiesCount === 1) { + Activity + } @else { + Activities + } + +
+
+ Platform +
+ @if (user?.settings?.isExperimentalFeatures) { +
+ +
+ } +
+
+
@@ -124,8 +158,8 @@ [pageSize]="pageSize" [showAccountColumn]="false" [showActions]=" - !data.hasImpersonationId && data.hasPermissionToCreateActivity && + !data.impersonationId && user?.settings?.isExperimentalFeatures && !user?.settings?.isRestrictedView " @@ -149,8 +183,8 @@ [currentBalance]="balance" [locale]="user?.settings?.locale" [showActions]=" - !data.hasImpersonationId && hasPermissionToDeleteAccountBalance && + !data.impersonationId && !user.settings.isRestrictedView " (accountBalanceCreated)="onAddAccountBalance($event)" diff --git a/apps/client/src/app/components/account-detail-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/account-detail-dialog/interfaces/interfaces.ts index 2f80dac36..0e7d04f2c 100644 --- a/apps/client/src/app/components/account-detail-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/account-detail-dialog/interfaces/interfaces.ts @@ -1,8 +1,8 @@ export interface AccountDetailDialogParams { accountId: string; deviceType: string; - hasImpersonationId: boolean; hasPermissionToCreateActivity: boolean; + impersonationId: string | null; } export interface AccountDetailDialogResult { diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts index b29ccc7d7..8592070ee 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts @@ -43,6 +43,7 @@ import { MatPaginatorModule, PageEvent } from '@angular/material/paginator'; +import { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar'; import { MatSort, MatSortModule, @@ -64,6 +65,7 @@ import { ellipsisVertical, trashOutline } from 'ionicons/icons'; +import ms from 'ms'; import { DeviceDetectorService } from 'ngx-device-detector'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject } from 'rxjs'; @@ -88,6 +90,7 @@ import { CreateAssetProfileDialogParams } from './create-asset-profile-dialog/in MatCheckboxModule, MatMenuModule, MatPaginatorModule, + MatSnackBarModule, MatSortModule, MatTableModule, NgxSkeletonLoaderModule, @@ -177,6 +180,7 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { private readonly dialog = inject(MatDialog); private readonly route = inject(ActivatedRoute); private readonly router = inject(Router); + private readonly snackBar = inject(MatSnackBar); private readonly userService = inject(UserService); public constructor() { @@ -239,7 +243,7 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { .subscribe((filters) => { this.activeFilters = filters; - this.loadData(); + this.reloadData({ pageIndex: 0 }); }); addIcons({ @@ -285,15 +289,25 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { dataSource, symbol }: AssetProfileIdentifier) { - this.adminMarketDataService.deleteAssetProfile({ dataSource, symbol }); + this.adminMarketDataService + .deleteAssetProfile({ dataSource, symbol }) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(() => { + this.reloadData(); + }); } protected onDeleteAssetProfiles() { - this.adminMarketDataService.deleteAssetProfiles( - this.selection.selected.map(({ dataSource, symbol }) => { - return { dataSource, symbol }; - }) - ); + this.adminMarketDataService + .deleteAssetProfiles( + this.selection.selected.map(({ dataSource, symbol }) => { + return { dataSource, symbol }; + }) + ) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(() => { + this.reloadData(); + }); } protected onGatherMax() { @@ -301,9 +315,7 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { .gatherMax() .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(() => { - setTimeout(() => { - window.location.reload(); - }, 300); + this.notifyDataGatheringHasBeenStarted(); }); } @@ -311,7 +323,9 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { this.adminService .gatherProfileData() .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(); + .subscribe(() => { + this.notifyDataGatheringHasBeenStarted(); + }); } protected onGatherRecentMarketData() { @@ -319,9 +333,7 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { .gatherRecentMarketData() .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(() => { - setTimeout(() => { - window.location.reload(); - }, 300); + this.notifyDataGatheringHasBeenStarted(); }); } @@ -396,6 +408,16 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { }); } + private notifyDataGatheringHasBeenStarted() { + this.snackBar.open( + '✅ ' + $localize`Data gathering has been started.`, + undefined, + { + duration: ms('3 seconds') + } + ); + } + private openAssetProfileDialog({ dataSource, symbol @@ -431,6 +453,8 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { if (newAssetProfileIdentifier) { this.onOpenAssetProfileDialog(newAssetProfileIdentifier); } else { + this.reloadData(); + this.router.navigate(['.'], { relativeTo: this.route }); } }); @@ -483,4 +507,14 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { }); }); } + + private reloadData({ + pageIndex = this.paginator().pageIndex + }: { pageIndex?: number } = {}) { + this.loadData({ + pageIndex, + sortColumn: this.sort().active, + sortDirection: this.sort().direction + }); + } } diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts index 28c8c2d9f..c4d45b7f0 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts @@ -4,7 +4,7 @@ import { NotificationService } from '@ghostfolio/ui/notifications'; import { AdminService } from '@ghostfolio/ui/services'; import { Injectable } from '@angular/core'; -import { EMPTY, catchError, finalize, forkJoin } from 'rxjs'; +import { EMPTY, Subject, catchError, finalize, forkJoin } from 'rxjs'; @Injectable() export class AdminMarketDataService { @@ -14,25 +14,29 @@ export class AdminMarketDataService { ) {} public deleteAssetProfile({ dataSource, symbol }: AssetProfileIdentifier) { + const assetProfileDeleted = new Subject(); + this.notificationService.confirm({ confirmFn: () => { this.adminService .deleteProfileData({ dataSource, symbol }) .subscribe(() => { - setTimeout(() => { - window.location.reload(); - }, 300); + assetProfileDeleted.next(); + assetProfileDeleted.complete(); }); }, confirmType: ConfirmationDialogType.Warn, title: $localize`Do you really want to delete this asset profile?` }); + + return assetProfileDeleted.asObservable(); } public deleteAssetProfiles( aAssetProfileIdentifiers: AssetProfileIdentifier[] ) { const assetProfileCount = aAssetProfileIdentifiers.length; + const assetProfilesDeleted = new Subject(); this.notificationService.confirm({ confirmFn: () => { @@ -55,7 +59,8 @@ export class AdminMarketDataService { return EMPTY; }), finalize(() => { - window.location.reload(); + assetProfilesDeleted.next(); + assetProfilesDeleted.complete(); }) ) .subscribe(); @@ -66,5 +71,7 @@ export class AdminMarketDataService { ? $localize`Do you really want to delete this asset profile?` : $localize`Do you really want to delete these ${assetProfileCount}:count: asset profiles?` }); + + return assetProfilesDeleted.asObservable(); } } 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 c5562740f..8fc012488 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 @@ -11,7 +11,11 @@ import { DATE_FORMAT, getCountryName, getCurrencyFromSymbol, - isCurrency + getDateFormatString, + getStringOrNull, + getStringOrUndefined, + isCurrency, + isSplitRatio } from '@ghostfolio/common/helper'; import { AdminMarketDataDetails, @@ -35,6 +39,7 @@ import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplet import { GfValueComponent } from '@ghostfolio/ui/value'; import { TextFieldModule } from '@angular/cdk/text-field'; +import { CommonModule } from '@angular/common'; import { HttpErrorResponse } from '@angular/common/http'; import { ChangeDetectionStrategy, @@ -61,6 +66,7 @@ import { MatCheckboxChange, MatCheckboxModule } from '@angular/material/checkbox'; +import { MatDatepickerModule } from '@angular/material/datepicker'; import { MAT_DIALOG_DATA, MatDialogModule, @@ -74,6 +80,7 @@ import { MatTabsModule } from '@angular/material/tabs'; import { IonIcon } from '@ionic/angular/standalone'; import { AssetClass, + AssetProfileSplit, AssetSubClass, DataGatheringFrequency, DataSource, @@ -86,11 +93,14 @@ import { format } from 'date-fns'; import { StatusCodes } from 'http-status-codes'; import { addIcons } from 'ionicons'; import { + calendarClearOutline, codeSlashOutline, createOutline, ellipsisVertical, + gitCompareOutline, readerOutline, - serverOutline + serverOutline, + trashOutline } from 'ionicons/icons'; import { isBoolean } from 'lodash'; import ms from 'ms'; @@ -103,6 +113,7 @@ import { AssetProfileDialogParams } from './interfaces/interfaces'; changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'd-flex flex-column h-100' }, imports: [ + CommonModule, FormsModule, GfCurrencySelectorComponent, GfEntityLogoComponent, @@ -114,6 +125,7 @@ import { AssetProfileDialogParams } from './interfaces/interfaces'; IonIcon, MatButtonModule, MatCheckboxModule, + MatDatepickerModule, MatDialogModule, MatInputModule, MatMenuModule, @@ -194,6 +206,26 @@ export class GfAssetProfileDialogComponent implements OnInit { } ); + protected readonly assetProfileSplitForm = this.formBuilder.group( + { + date: new FormControl(null, Validators.required), + denominator: new FormControl(null, Validators.required), + numerator: new FormControl(null, Validators.required) + }, + { + validators: (control: AbstractControl): ValidationErrors | null => { + const { denominator, numerator } = control.value as { + denominator: number; + numerator: number; + }; + + return isSplitRatio({ denominator, numerator }) + ? null + : { invalidSplitRatio: true }; + } + } + ); + protected readonly canDeleteAssetProfile = canDeleteAssetProfile; protected canEditAssetProfile = true; @@ -245,11 +277,13 @@ export class GfAssetProfileDialogComponent implements OnInit { value: 'max' } ]; + protected defaultDateFormat: string; protected readonly getCountryName = getCountryName; protected historicalDataItems: LineChartItem[]; protected isBenchmark = false; protected isDataGatheringEnabled: boolean; protected isEditAssetProfileIdentifierMode = false; + protected isLoading = true; protected readonly isUUID = isUUID; protected marketDataItems: MarketData[] = []; @@ -268,6 +302,8 @@ export class GfAssetProfileDialogComponent implements OnInit { [name: string]: { name: string; value: number }; }; + protected splits: AssetProfileSplit[] = []; + protected readonly translate = translate; protected user: User; @@ -291,11 +327,14 @@ export class GfAssetProfileDialogComponent implements OnInit { private userService: UserService ) { addIcons({ + calendarClearOutline, codeSlashOutline, createOutline, ellipsisVertical, + gitCompareOutline, readerOutline, - serverOutline + serverOutline, + trashOutline }); } @@ -308,6 +347,7 @@ export class GfAssetProfileDialogComponent implements OnInit { this.benchmarks = benchmarks; this.currencies = currencies; + this.defaultDateFormat = getDateFormatString(this.data.locale); this.initialize(); } @@ -362,8 +402,9 @@ export class GfAssetProfileDialogComponent implements OnInit { symbol: this.data.symbol }) .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(({ assetProfile, marketData }) => { + .subscribe(({ assetProfile, marketData, splits }) => { this.assetProfile = assetProfile; + this.splits = splits ?? []; this.assetClassLabel = translate(this.assetProfile?.assetClass ?? ''); this.assetSubClassLabel = translate( @@ -456,6 +497,8 @@ export class GfAssetProfileDialogComponent implements OnInit { this.assetProfileForm.markAsPristine(); + this.isLoading = false; + this.changeDetectorRef.markForCheck(); }); } @@ -491,9 +534,12 @@ export class GfAssetProfileDialogComponent implements OnInit { dataSource, symbol }: AssetProfileIdentifier) { - this.adminMarketDataService.deleteAssetProfile({ dataSource, symbol }); - - this.dialogRef.close(); + this.adminMarketDataService + .deleteAssetProfile({ dataSource, symbol }) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(() => { + this.dialogRef.close(); + }); } protected onGatherProfileDataBySymbol({ @@ -519,6 +565,45 @@ export class GfAssetProfileDialogComponent implements OnInit { .subscribe(); } + protected onAddSplit() { + const { date, denominator, numerator } = + this.assetProfileSplitForm.getRawValue(); + + if (!date || !denominator || !numerator) { + return; + } + + this.adminService + .postAssetProfileSplit({ + dataSource: this.data.dataSource, + split: { + denominator, + numerator, + date: format(date, DATE_FORMAT) + }, + symbol: this.data.symbol + }) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(() => { + this.assetProfileSplitForm.reset(); + + this.initialize(); + }); + } + + protected onDeleteSplit(aId: string) { + this.adminService + .deleteAssetProfileSplit({ + dataSource: this.data.dataSource, + id: aId, + symbol: this.data.symbol + }) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(() => { + this.initialize(); + }); + } + protected onMarketDataChanged(withRefresh: boolean = false) { if (withRefresh) { this.initialize(); @@ -568,9 +653,10 @@ export class GfAssetProfileDialogComponent implements OnInit { this.assetProfileForm.controls.scraperConfiguration.controls.headers .value ?? '{}' ) as Record, - locale: + locale: getStringOrUndefined( this.assetProfileForm.controls.scraperConfiguration.controls.locale - ?.value ?? undefined, + ?.value + ), mode: this.assetProfileForm.controls.scraperConfiguration.controls.mode ?.value ?? undefined, @@ -619,7 +705,7 @@ export class GfAssetProfileDialogComponent implements OnInit { assetClass: this.assetProfileForm.controls.assetClass.value ?? undefined, assetSubClass: this.assetProfileForm.controls.assetSubClass.value ?? undefined, - comment: this.assetProfileForm.controls.comment.value ?? undefined, + comment: getStringOrNull(this.assetProfileForm.controls.comment.value), currency: this.assetProfileForm.controls.currency.value ?? undefined, dataGatheringFrequency: this.assetProfileForm.controls.dataGatheringFrequency.value ?? @@ -628,7 +714,7 @@ export class GfAssetProfileDialogComponent implements OnInit { ? this.assetProfileForm.controls.isActive.value : undefined, name: this.assetProfileForm.controls.name.value ?? undefined, - url: this.assetProfileForm.controls.url.value ?? undefined + url: getStringOrNull(this.assetProfileForm.controls.url.value) }; try { @@ -737,9 +823,10 @@ export class GfAssetProfileDialogComponent implements OnInit { this.assetProfileForm.controls.scraperConfiguration.controls.headers .value ?? '{}' ) as Record, - locale: + locale: getStringOrUndefined( this.assetProfileForm.controls.scraperConfiguration.controls.locale - ?.value ?? undefined, + ?.value + ), mode: this.assetProfileForm.controls.scraperConfiguration.controls .mode?.value, selector: 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 c9abdeeb7..bcda048f8 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 @@ -105,6 +105,7 @@ @@ -182,6 +183,7 @@ i18n size="medium" [enableCopyToClipboardButton]="true" + [isLoading]="isLoading" [value]="assetProfile?.symbol" >Symbol
@@ -190,6 +192,7 @@ - Currency @@ -230,6 +237,7 @@ i18n size="medium" [isDate]="assetProfile?.dateOfFirstActivity ? true : false" + [isLoading]="isLoading" [locale]="data.locale" [value]="assetProfile?.dateOfFirstActivity ?? '-'" >First ActivityActivities + + @if (false && user?.settings?.isExperimentalFeatures) { + + + +
Splits
+
+
+
+
+ @if (splits.length > 0) { + + + + + + + + + + @for (split of splits; track split.id) { + + + + + + } + +
Date + Split Ratio +
+ {{ split.date | date: defaultDateFormat }} + + {{ split.numerator }}:{{ split.denominator }} + + +
+ } +
+ + Date + + + + + + +
+ + Shares After + + +
:
+ + Shares Before + + +
+
+ +
+
+
+
+
+
+ } @if (assetProfile?.dataSource === 'MANUAL') { diff --git a/apps/client/src/app/components/admin-overview/admin-overview.component.ts b/apps/client/src/app/components/admin-overview/admin-overview.component.ts index 0bed8111f..733200c91 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.component.ts +++ b/apps/client/src/app/components/admin-overview/admin-overview.component.ts @@ -64,6 +64,7 @@ import { } from 'ionicons/icons'; import ms, { StringValue } from 'ms'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; +import { catchError, of, switchMap } from 'rxjs'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -105,6 +106,8 @@ export class GfAdminOverviewComponent implements OnInit { protected readonly info: InfoItem; protected isDataGatheringEnabled: boolean; protected isLoading = false; + protected isReadOnlyMode: boolean; + protected isUserSignupEnabled: boolean; protected readonly permissions = permissions; protected systemMessage: SystemMessage; protected userCount: number; @@ -179,6 +182,8 @@ export class GfAdminOverviewComponent implements OnInit { } public ngOnInit() { + this.isLoading = true; + this.fetchAdminData(); } @@ -270,9 +275,15 @@ export class GfAdminOverviewComponent implements OnInit { .flush() .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(() => { - setTimeout(() => { - window.location.reload(); - }, 300); + this.dataService.updateInfo(); + + this.snackBar.open( + '✅ ' + $localize`Cache has been flushed.`, + undefined, + { + duration: ms('3 seconds') + } + ); }); }, confirmType: ConfirmationDialogType.Warn, @@ -330,8 +341,6 @@ export class GfAdminOverviewComponent implements OnInit { } private fetchAdminData() { - this.isLoading = true; - this.adminService .fetchAdminData() .pipe(takeUntilDestroyed(this.destroyRef)) @@ -344,6 +353,11 @@ export class GfAdminOverviewComponent implements OnInit { this.isDataGatheringEnabled = settings[PROPERTY_IS_DATA_GATHERING_ENABLED] === false ? false : true; + this.isReadOnlyMode = settings[PROPERTY_IS_READ_ONLY_MODE] === true; + + this.isUserSignupEnabled = + settings[PROPERTY_IS_USER_SIGNUP_ENABLED] === false ? false : true; + this.systemMessage = settings[PROPERTY_SYSTEM_MESSAGE] as SystemMessage; this.userCount = userCount; this.version = version; @@ -372,11 +386,20 @@ export class GfAdminOverviewComponent implements OnInit { .putAdminSetting(key, { value: value || value === false ? JSON.stringify(value) : undefined }) - .pipe(takeUntilDestroyed(this.destroyRef)) + .pipe( + switchMap(() => { + return this.userService.get(true); + }), + catchError(() => { + // Refresh anyway to reflect the actual state of the settings + return of(undefined); + }), + takeUntilDestroyed(this.destroyRef) + ) .subscribe(() => { - setTimeout(() => { - window.location.reload(); - }, 300); + this.dataService.updateInfo(); + + this.fetchAdminData(); }); } diff --git a/apps/client/src/app/components/admin-overview/admin-overview.html b/apps/client/src/app/components/admin-overview/admin-overview.html index 7e05600a6..cc999629b 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.html +++ b/apps/client/src/app/components/admin-overview/admin-overview.html @@ -7,6 +7,7 @@ i18n size="large" [enableCopyToClipboardButton]="true" + [isLoading]="isLoading" [value]="version" >Version @@ -19,6 +20,7 @@ Users @@ -66,7 +68,8 @@ @@ -79,6 +82,7 @@ color="primary" hideIcon="true" [checked]="isDataGatheringEnabled" + [disabled]="isLoading" (change)="onEnableDataGatheringChange($event)" /> @@ -89,7 +93,9 @@
@if (systemMessage) {
-
{{ systemMessage | json }}
+
+ {{ systemMessage | json }} +
} - @if (!info?.systemMessage) { + @if (!systemMessage) { - + - } @else if (isGhostfolioApiKeyValid === false) { + } @else if (hasGhostfolioApiKey === false) { - diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts index c474e29ab..0091ae5d7 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1,20 +1,21 @@ import { - getTooltipOptions, - getVerticalHoverLinePlugin + getChartBorderColor, + getChartElementsOptions, + getTimeAxisOptions, + getValueAxisOptions, + getVerticalHoverLinePlugin, + getZeroLineAnnotation } from '@ghostfolio/common/chart-helper'; import { primaryColorRgb, secondaryColorRgb } from '@ghostfolio/common/config'; -import { - getBackgroundColor, - getDateFormatString, - getLocale, - getTextColor, - parseDate -} from '@ghostfolio/common/helper'; +import { getLocale, parseDate } from '@ghostfolio/common/helper'; import { LineChartItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { ColorScheme } from '@ghostfolio/common/types'; -import { registerChartConfiguration } from '@ghostfolio/ui/chart'; +import { + getTimeSeriesTooltipOptions, + registerChartConfiguration +} from '@ghostfolio/ui/chart'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { @@ -166,28 +167,13 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { data, options: { animation: false, - elements: { - line: { - tension: 0 - }, - point: { - hoverBackgroundColor: getBackgroundColor(this.colorScheme()), - hoverRadius: 2, - radius: 0 - } - }, + elements: getChartElementsOptions(this.colorScheme()), interaction: { intersect: false, mode: 'index' }, maintainAspectRatio: true, plugins: { annotation: { annotations: { - yAxis: { - borderColor: `rgba(${getTextColor(this.colorScheme())}, 0.1)`, - borderWidth: 1, - scaleID: 'y', - type: 'line', - value: 0 - } + yAxis: getZeroLineAnnotation(this.colorScheme()) } }, legend: { @@ -195,54 +181,21 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { }, tooltip: this.getTooltipPluginConfiguration(), verticalHoverLine: { - color: `rgba(${getTextColor(this.colorScheme())}, 0.1)` + color: getChartBorderColor(this.colorScheme()) } }, responsive: true, scales: { - x: { - border: { - color: `rgba(${getTextColor(this.colorScheme())}, 0.1)`, - width: 1 - }, - display: true, - grid: { - display: false - }, - type: 'time', - time: { - tooltipFormat: getDateFormatString(this.locale()), - unit: 'year' + x: getTimeAxisOptions({ + colorScheme: this.colorScheme(), + locale: this.locale() + }), + y: getValueAxisOptions({ + colorScheme: this.colorScheme(), + tickCallback: (tickValue) => { + return `${Number(tickValue).toFixed(2)} %`; } - }, - y: { - border: { - width: 0 - }, - display: true, - grid: { - color: ({ scale, tick }) => { - if ( - tick.value === 0 || - tick.value === scale.max || - tick.value === scale.min - ) { - return `rgba(${getTextColor(this.colorScheme())}, 0.1)`; - } - - return 'transparent'; - } - }, - position: 'right', - ticks: { - callback: (value: number) => { - return `${value.toFixed(2)} %`; - }, - display: true, - mirror: true, - z: 1 - } - } + }) } }, plugins: [ @@ -255,16 +208,10 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { } private getTooltipPluginConfiguration(): Partial> { - return { - ...getTooltipOptions({ - colorScheme: this.colorScheme(), - locale: this.locale(), - unit: '%' - }), - mode: 'index', - position: 'top', - xAlign: 'center', - yAlign: 'bottom' - }; + return getTimeSeriesTooltipOptions<'line'>({ + colorScheme: this.colorScheme(), + locale: this.locale(), + unit: '%' + }); } } diff --git a/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html b/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html deleted file mode 100644 index dd2925f43..000000000 --- a/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html +++ /dev/null @@ -1,24 +0,0 @@ -
-
-
{{ fearAndGreedIndexEmoji }}
-
-
- {{ fearAndGreedIndexText }} - {{ fearAndGreedIndex | number: '1.0-0' }}/100 -
- Current Market Mood -
-
- @if (!fearAndGreedIndex) { - - } -
diff --git a/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.scss b/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.scss deleted file mode 100644 index dfe024a03..000000000 --- a/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -:host { - display: block; - - ngx-skeleton-loader { - bottom: 0; - top: 0; - } -} diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts index 50a833aeb..57b8196d6 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts @@ -22,6 +22,7 @@ import { } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; +import { AccountWithValue } from '@ghostfolio/common/types'; import { GfAccountsTableComponent } from '@ghostfolio/ui/accounts-table'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfDataProviderCreditsComponent } from '@ghostfolio/ui/data-provider-credits'; @@ -65,7 +66,7 @@ import { MatTableDataSource } from '@angular/material/table'; import { MatTabsModule } from '@angular/material/tabs'; import { NavigationStart, Router, RouterModule } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; -import { Account, MarketData, Tag } from '@prisma/client'; +import { MarketData, Tag } from '@prisma/client'; import { isUUID } from 'class-validator'; import { format, isSameMonth, isToday, parseISO } from 'date-fns'; import { addIcons } from 'ionicons'; @@ -117,7 +118,7 @@ import { templateUrl: 'holding-detail-dialog.html' }) export class GfHoldingDetailDialogComponent implements OnInit { - protected accounts: Account[]; + protected accounts: AccountWithValue[]; protected activitiesCount: number; protected assetClass: string; protected assetProfile: Pick< @@ -157,6 +158,7 @@ export class GfHoldingDetailDialogComponent implements OnInit { }>; protected investmentInBaseCurrencyWithCurrencyEffect: number; protected investmentInBaseCurrencyWithCurrencyEffectPrecision = 2; + protected isLoading = true; protected readonly isUUID = isUUID; protected marketDataItems: MarketData[] = []; protected marketPrice: number; @@ -571,6 +573,8 @@ export class GfHoldingDetailDialogComponent implements OnInit { this.fetchMarketData(); } + this.isLoading = false; + this.changeDetectorRef.markForCheck(); } ); diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html index 0a8ee6dce..8292ff598 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -12,6 +12,7 @@ @@ -54,6 +56,7 @@ size="medium" [colorizeSign]="true" [isCurrency]="true" + [isLoading]="isLoading" [locale]="data.locale" [precision]="netPerformanceWithCurrencyEffectPrecision" [unit]="data.baseCurrency" @@ -74,6 +77,7 @@ i18n size="medium" [colorizeSign]="true" + [isLoading]="isLoading" [isPercent]="true" [locale]="data.locale" [precision]="netPerformancePercentWithCurrencyEffectPrecision" @@ -94,6 +98,7 @@ i18n size="medium" [isCurrency]="true" + [isLoading]="isLoading" [locale]="data.locale" [precision]="averagePricePrecision" [unit]="assetProfile?.currency" @@ -106,6 +111,7 @@ i18n size="medium" [isCurrency]="true" + [isLoading]="isLoading" [locale]="data.locale" [precision]="marketPricePrecision" [unit]="assetProfile?.currency" @@ -124,6 +130,7 @@ round(marketPriceMin, marketPriceMinPrecision) " [isCurrency]="true" + [isLoading]="isLoading" [locale]="data.locale" [precision]="marketPriceMinPrecision" [unit]="assetProfile?.currency" @@ -142,6 +149,7 @@ round(marketPriceMin, marketPriceMinPrecision) " [isCurrency]="true" + [isLoading]="isLoading" [locale]="data.locale" [precision]="marketPriceMaxPrecision" [unit]="assetProfile?.currency" @@ -153,6 +161,7 @@ InvestmentInvested Capital
@if ( @@ -181,6 +191,7 @@ i18n size="medium" [isCurrency]="true" + [isLoading]="isLoading" [locale]="data.locale" [precision]="dividendInBaseCurrencyPrecision" [unit]="data.baseCurrency" @@ -192,6 +203,7 @@ First Activity @@ -331,6 +346,17 @@ >ISIN +
+
+ + +
@if (dataProviderInfo) {
@@ -356,7 +382,7 @@ [hasPermissionToCreateActivity]="false" [hasPermissionToDeleteActivity]="false" [hasPermissionToExportActivities]=" - !data.hasImpersonationId && !user?.settings?.isRestrictedView + !data.impersonationId && !user?.settings?.isRestrictedView " [hasPermissionToFilter]="false" [hasPermissionToOpenDetails]="false" @@ -364,8 +390,8 @@ [pageIndex]="pageIndex" [pageSize]="pageSize" [showActions]=" - !data.hasImpersonationId && data.hasPermissionToCreateActivity && + !data.impersonationId && user?.settings?.isExperimentalFeatures && !user?.settings?.isRestrictedView " @@ -419,16 +445,6 @@ } -
- - - @if ( data.hasPermissionToAccessAdminControl || (dataSource?.data.length > 0 && diff --git a/apps/client/src/app/components/holding-detail-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/holding-detail-dialog/interfaces/interfaces.ts index 40c94ca60..efc10d6ac 100644 --- a/apps/client/src/app/components/holding-detail-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/holding-detail-dialog/interfaces/interfaces.ts @@ -7,11 +7,11 @@ export interface HoldingDetailDialogParams { colorScheme: ColorScheme; dataSource: DataSource; deviceType: string; - hasImpersonationId: boolean; hasPermissionToAccessAdminControl: boolean; hasPermissionToCreateActivity: boolean; hasPermissionToReportDataGlitch: boolean; hasPermissionToUpdateActivity: boolean; + impersonationId: string | null; locale: string; symbol: string; } diff --git a/apps/client/src/app/components/home-market/home-market.component.ts b/apps/client/src/app/components/home-market/home-market.component.ts deleted file mode 100644 index 0eec3f2d9..000000000 --- a/apps/client/src/app/components/home-market/home-market.component.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { GfFearAndGreedIndexComponent } from '@ghostfolio/client/components/fear-and-greed-index/fear-and-greed-index.component'; -import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { Benchmark, InfoItem, User } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark'; -import { DataService } from '@ghostfolio/ui/services'; - -import { - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - computed, - CUSTOM_ELEMENTS_SCHEMA, - DestroyRef, - inject, - OnInit, - signal -} from '@angular/core'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { DeviceDetectorService } from 'ngx-device-detector'; - -@Component({ - changeDetection: ChangeDetectionStrategy.OnPush, - imports: [GfBenchmarkComponent, GfFearAndGreedIndexComponent], - schemas: [CUSTOM_ELEMENTS_SCHEMA], - selector: 'gf-home-market', - styleUrls: ['./home-market.scss'], - templateUrl: './home-market.html' -}) -export class GfHomeMarketComponent implements OnInit { - protected readonly benchmarks = signal([]); - - protected readonly deviceType = computed( - () => this.deviceDetectorService.deviceInfo().deviceType - ); - - protected fearAndGreedIndex: number | undefined; - protected hasPermissionToAccessFearAndGreedIndex: boolean; - protected user: User; - - private readonly info: InfoItem; - - private readonly changeDetectorRef = inject(ChangeDetectorRef); - private readonly dataService = inject(DataService); - private readonly destroyRef = inject(DestroyRef); - private readonly deviceDetectorService = inject(DeviceDetectorService); - private readonly userService = inject(UserService); - - public constructor() { - this.info = this.dataService.fetchInfo(); - - this.userService.stateChanged - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((state) => { - if (state?.user) { - this.user = state.user; - - this.changeDetectorRef.markForCheck(); - } - }); - } - - public ngOnInit() { - this.hasPermissionToAccessFearAndGreedIndex = hasPermission( - this.info?.globalPermissions, - permissions.enableFearAndGreedIndex - ); - - if (this.hasPermissionToAccessFearAndGreedIndex) { - this.fearAndGreedIndex = this.info.fearAndGreedStocksMarketPrice; - } - - this.dataService - .fetchBenchmarks() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(({ benchmarks }) => { - this.benchmarks.set(benchmarks); - }); - } -} diff --git a/apps/client/src/app/components/home-market/home-market.html b/apps/client/src/app/components/home-market/home-market.html deleted file mode 100644 index b1e21df95..000000000 --- a/apps/client/src/app/components/home-market/home-market.html +++ /dev/null @@ -1,35 +0,0 @@ -
-

Markets

- @if (hasPermissionToAccessFearAndGreedIndex) { -
-
- -
-
- } - -
-
- - @if (benchmarks()?.length > 0) { -
- - Calculations are based on delayed market data and may not be - displayed in real-time. -
- } -
-
-
diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts index 0107f36a2..97fa6f744 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 @@ -146,7 +146,6 @@ export class GfHomeWatchlistComponent implements OnInit { GfCreateWatchlistItemDialogComponent, CreateWatchlistItemDialogParams >(GfCreateWatchlistItemDialogComponent, { - autoFocus: false, data: { deviceType: this.deviceType(), locale: this.user?.settings?.locale ?? DEFAULT_LOCALE diff --git a/apps/client/src/app/components/investment-chart/investment-chart.component.ts b/apps/client/src/app/components/investment-chart/investment-chart.component.ts index 3aa65b998..2a1ffd97c 100644 --- a/apps/client/src/app/components/investment-chart/investment-chart.component.ts +++ b/apps/client/src/app/components/investment-chart/investment-chart.component.ts @@ -1,20 +1,21 @@ import { - getTooltipOptions, + getChartBorderColor, + getChartElementsOptions, + getTimeAxisOptions, + getValueAxisOptions, getVerticalHoverLinePlugin, + getZeroLineAnnotation, transformTickToAbbreviation } from '@ghostfolio/common/chart-helper'; import { primaryColorRgb, secondaryColorRgb } from '@ghostfolio/common/config'; -import { - getBackgroundColor, - getDateFormatString, - getLocale, - getTextColor, - parseDate -} from '@ghostfolio/common/helper'; +import { getLocale, parseDate } from '@ghostfolio/common/helper'; import { LineChartItem } from '@ghostfolio/common/interfaces'; import { InvestmentItem } from '@ghostfolio/common/interfaces/investment-item.interface'; import { ColorScheme, GroupBy } from '@ghostfolio/common/types'; -import { registerChartConfiguration } from '@ghostfolio/ui/chart'; +import { + getTimeSeriesTooltipOptions, + registerChartConfiguration +} from '@ghostfolio/ui/chart'; import { ChangeDetectionStrategy, @@ -175,16 +176,7 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy { data: chartData, options: { animation: false, - elements: { - line: { - tension: 0 - }, - point: { - hoverBackgroundColor: getBackgroundColor(this.colorScheme), - hoverRadius: 2, - radius: 0 - } - }, + elements: getChartElementsOptions(this.colorScheme), interaction: { intersect: false, mode: 'index' }, maintainAspectRatio: true, plugins: { @@ -212,13 +204,7 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy { value: this.savingsRate } : undefined, - yAxis: { - borderColor: `rgba(${getTextColor(this.colorScheme)}, 0.1)`, - borderWidth: 1, - scaleID: 'y', - type: 'line', - value: 0 - } + yAxis: getZeroLineAnnotation(this.colorScheme) } }, legend: { @@ -226,54 +212,23 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy { }, tooltip: this.getTooltipPluginConfiguration(), verticalHoverLine: { - color: `rgba(${getTextColor(this.colorScheme)}, 0.1)` + color: getChartBorderColor(this.colorScheme) } }, responsive: true, scales: { - x: { - border: { - color: `rgba(${getTextColor(this.colorScheme)}, 0.1)`, - width: this.groupBy ? 0 : 1 - }, - display: true, - grid: { - display: false - }, - type: 'time', - time: { - tooltipFormat: getDateFormatString(this.locale), - unit: 'year' - } - }, - y: { - border: { - display: false - }, + x: getTimeAxisOptions({ + borderWidth: this.groupBy ? 0 : 1, + colorScheme: this.colorScheme, + locale: this.locale + }), + y: getValueAxisOptions({ + colorScheme: this.colorScheme, display: !this.isInPercentage, - grid: { - color: ({ scale, tick }) => { - if ( - tick.value === 0 || - tick.value === scale.max || - tick.value === scale.min - ) { - return `rgba(${getTextColor(this.colorScheme)}, 0.1)`; - } - - return 'transparent'; - } - }, - position: 'right', - ticks: { - callback: (value: number) => { - return transformTickToAbbreviation(value); - }, - display: true, - mirror: true, - z: 1 + tickCallback: (tickValue) => { + return transformTickToAbbreviation(Number(tickValue)); } - } + }) } }, plugins: [ @@ -289,19 +244,13 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy { private getTooltipPluginConfiguration(): Partial< TooltipOptions<'bar' | 'line'> > { - return { - ...getTooltipOptions({ - colorScheme: this.colorScheme, - currency: this.isInPercentage ? undefined : this.currency, - groupBy: this.groupBy, - locale: this.isInPercentage ? undefined : this.locale, - unit: this.isInPercentage ? '%' : undefined - }), - mode: 'index', - position: 'top', - xAlign: 'center', - yAlign: 'bottom' - }; + return getTimeSeriesTooltipOptions<'bar' | 'line'>({ + colorScheme: this.colorScheme, + currency: this.isInPercentage ? undefined : this.currency, + groupBy: this.groupBy, + locale: this.isInPercentage ? undefined : this.locale, + unit: this.isInPercentage ? '%' : undefined + }); } private isInFuture(aContext: ScriptableLineSegmentContext, aValue: T) { diff --git a/apps/client/src/app/components/markets/markets.component.ts b/apps/client/src/app/components/markets/markets.component.ts index d2f64f3fc..27f60d86a 100644 --- a/apps/client/src/app/components/markets/markets.component.ts +++ b/apps/client/src/app/components/markets/markets.component.ts @@ -1,15 +1,17 @@ -import { GfFearAndGreedIndexComponent } from '@ghostfolio/client/components/fear-and-greed-index/fear-and-greed-index.component'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { resetHours } from '@ghostfolio/common/helper'; import { Benchmark, HistoricalDataItem, + InfoItem, MarketDataOfMarketsResponse, ToggleOption, User } from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { FearAndGreedIndexMode } from '@ghostfolio/common/types'; import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark'; +import { GfFearAndGreedIndexComponent } from '@ghostfolio/ui/fear-and-greed-index'; import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; import { DataService } from '@ghostfolio/ui/services'; import { GfToggleComponent } from '@ghostfolio/ui/toggle'; @@ -18,9 +20,12 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, + computed, CUSTOM_ELEMENTS_SCHEMA, DestroyRef, - OnInit + inject, + OnInit, + signal } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -39,29 +44,50 @@ import { DeviceDetectorService } from 'ngx-device-detector'; templateUrl: './markets.html' }) export class GfMarketsComponent implements OnInit { - public benchmarks: Benchmark[]; - public deviceType: string; - public fearAndGreedIndex: number; - public fearAndGreedIndexData: MarketDataOfMarketsResponse['fearAndGreedIndex']; - public fearLabel = $localize`Fear`; - public greedLabel = $localize`Greed`; - public historicalDataItems: HistoricalDataItem[]; - public fearAndGreedIndexMode: FearAndGreedIndexMode = 'STOCKS'; - public fearAndGreedIndexModeOptions: ToggleOption[] = [ + protected readonly benchmarks = signal([]); + + protected readonly deviceType = computed( + () => this.deviceDetectorService.deviceInfo().deviceType + ); + + protected readonly fearAndGreedIndexModeOptions: ToggleOption[] = [ { label: $localize`Stocks`, value: 'STOCKS' }, { label: $localize`Cryptocurrencies`, value: 'CRYPTOCURRENCIES' } ]; - public readonly numberOfDays = 365; - public user: User; - - public constructor( - private changeDetectorRef: ChangeDetectorRef, - private dataService: DataService, - private destroyRef: DestroyRef, - private deviceDetectorService: DeviceDetectorService, - private userService: UserService - ) { - this.deviceType = this.deviceDetectorService.getDeviceInfo().deviceType; + + protected readonly fearLabel = $localize`Fear`; + protected readonly greedLabel = $localize`Greed`; + protected readonly numberOfDays = 365; + + protected fearAndGreedIndex: number | undefined; + protected fearAndGreedIndexMode: FearAndGreedIndexMode = 'STOCKS'; + protected hasPermissionToAccessFearAndGreedIndex: boolean; + protected hasPermissionToReadMarketDataOfMarkets: boolean; + protected historicalDataItems: HistoricalDataItem[]; + protected isLoadingFearAndGreedIndex = true; + protected user: User; + + private fearAndGreedIndexData: MarketDataOfMarketsResponse['fearAndGreedIndex']; + + private readonly info: InfoItem; + + private readonly changeDetectorRef = inject(ChangeDetectorRef); + private readonly dataService = inject(DataService); + private readonly destroyRef = inject(DestroyRef); + private readonly deviceDetectorService = inject(DeviceDetectorService); + private readonly userService = inject(UserService); + + public constructor() { + this.info = this.dataService.fetchInfo(); + + this.hasPermissionToAccessFearAndGreedIndex = hasPermission( + this.info?.globalPermissions, + permissions.enableFearAndGreedIndex + ); + + if (this.hasPermissionToAccessFearAndGreedIndex) { + this.fearAndGreedIndex = this.info.fearAndGreedStocksMarketPrice; + } this.userService.stateChanged .pipe(takeUntilDestroyed(this.destroyRef)) @@ -69,6 +95,20 @@ export class GfMarketsComponent implements OnInit { if (state?.user) { this.user = state.user; + this.hasPermissionToReadMarketDataOfMarkets = hasPermission( + this.user.permissions, + permissions.readMarketDataOfMarkets + ); + + if ( + this.hasPermissionToReadMarketDataOfMarkets && + !this.fearAndGreedIndexData + ) { + this.fetchMarketDataOfMarkets(); + } else { + this.isLoadingFearAndGreedIndex = false; + } + this.changeDetectorRef.markForCheck(); } }); @@ -76,27 +116,37 @@ export class GfMarketsComponent implements OnInit { public ngOnInit() { this.dataService - .fetchMarketDataOfMarkets({ includeHistoricalData: this.numberOfDays }) + .fetchBenchmarks() .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(({ fearAndGreedIndex }) => { - this.fearAndGreedIndexData = fearAndGreedIndex; + .subscribe(({ benchmarks }) => { + this.benchmarks.set(benchmarks); + }); + } - this.initialize(); + protected onChangeFearAndGreedIndexMode( + aFearAndGreedIndexMode: FearAndGreedIndexMode + ) { + this.fearAndGreedIndexMode = aFearAndGreedIndexMode; - this.changeDetectorRef.markForCheck(); - }); + this.initializeFearAndGreedIndex(); + } + private fetchMarketDataOfMarkets() { this.dataService - .fetchBenchmarks() + .fetchMarketDataOfMarkets({ includeHistoricalData: this.numberOfDays }) .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(({ benchmarks }) => { - this.benchmarks = benchmarks; + .subscribe(({ fearAndGreedIndex }) => { + this.fearAndGreedIndexData = fearAndGreedIndex; + + this.initializeFearAndGreedIndex(); + + this.isLoadingFearAndGreedIndex = false; this.changeDetectorRef.markForCheck(); }); } - public initialize() { + private initializeFearAndGreedIndex() { this.fearAndGreedIndex = this.fearAndGreedIndexData[this.fearAndGreedIndexMode]?.marketPrice; @@ -109,12 +159,4 @@ export class GfMarketsComponent implements OnInit { } ]; } - - public onChangeFearAndGreedIndexMode( - aFearAndGreedIndexMode: FearAndGreedIndexMode - ) { - this.fearAndGreedIndexMode = aFearAndGreedIndexMode; - - this.initialize(); - } } diff --git a/apps/client/src/app/components/markets/markets.html b/apps/client/src/app/components/markets/markets.html index 38234a785..bd9013a00 100644 --- a/apps/client/src/app/components/markets/markets.html +++ b/apps/client/src/app/components/markets/markets.html @@ -1,52 +1,62 @@

Markets

-
-
- @if (user?.settings?.isExperimentalFeatures) { -
- +
+ @if (hasPermissionToReadMarketDataOfMarkets) { + @if (user?.settings?.isExperimentalFeatures) { +
+ +
+ } +
+ Last {{ numberOfDays }} Days +
+ -
- } -
- Last {{ numberOfDays }} Days + } +
- -
-
+ }
- @if (benchmarks?.length > 0) { + @if (benchmarks()?.length > 0) {
diff --git a/apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html b/apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html index 7b9522956..d6339a5ff 100644 --- a/apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html +++ b/apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html @@ -38,24 +38,18 @@
diff --git a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html index fd0ac9b72..520986c89 100644 --- a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html +++ b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -2,7 +2,11 @@
Time in Market
- +
@@ -46,10 +51,11 @@
@@ -57,19 +63,16 @@

-
Investment
+
Invested Capital
@@ -79,12 +82,11 @@ @@ -97,10 +99,11 @@ @@ -113,12 +116,11 @@ @@ -136,13 +138,10 @@ class="justify-content-end" position="end" [colorizeSign]="true" + [isLoading]="isLoading" [isPercent]="true" [locale]="locale" - [value]=" - isLoading - ? undefined - : summary?.netPerformancePercentageWithCurrencyEffect - " + [value]="summary?.netPerformancePercentageWithCurrencyEffect" /> @@ -156,16 +155,32 @@ class="justify-content-end" position="end" [isCurrency]="true" + [isLoading]="isLoading" [locale]="locale" [precision]="precision" [unit]="baseCurrency" - [value]="isLoading ? undefined : summary?.totalAssetsInBaseCurrency" + [value]="summary?.totalAssetsInBaseCurrency" />
-
- Cash +
+ @if (hasHoldingsBreakdown) { + + + + } + Holdings @if ( !hasImpersonationId && summary?.totalValueInBaseCurrency > 0 && @@ -173,9 +188,11 @@ ) { }
@@ -184,25 +201,27 @@ class="justify-content-end" position="end" [isCurrency]="true" + [isLoading]="isLoading" [locale]="locale" [precision]="precision" [unit]="baseCurrency" - [value]="isLoading ? undefined : summary?.totalCashInBaseCurrency" + [value]="holdingsInBaseCurrency" />
- @if (isLoading || summary?.emergencyFund?.cash > 0) { + @if (hasHoldingsBreakdown && isHoldingsExpanded) {
-
Buying Power
+
Investments
@@ -213,17 +232,33 @@ class="justify-content-end" position="end" [isCurrency]="true" + [isLoading]="isLoading" [locale]="locale" [precision]="precision" [unit]="baseCurrency" - [value]="isLoading ? undefined : summary?.emergencyFund?.cash" + [value]="summary?.emergencyFund?.assets" /> }
-
- Holdings +
+ @if (hasCashBreakdown) { + + + + } + Cash @if ( !hasImpersonationId && summary?.totalValueInBaseCurrency > 0 && @@ -231,9 +266,11 @@ ) { }
@@ -242,14 +279,30 @@ class="justify-content-end" position="end" [isCurrency]="true" + [isLoading]="isLoading" [locale]="locale" [precision]="precision" [unit]="baseCurrency" - [value]="isLoading ? undefined : holdingsInBaseCurrency" + [value]="summary?.totalCashInBaseCurrency" />
- @if (isLoading || summary?.emergencyFund?.assets > 0) { + @if (hasCashBreakdown && isCashExpanded) { +
+
Buying Power
+
+ +
+
Emergency Fund
@@ -257,10 +310,11 @@ class="justify-content-end" position="end" [isCurrency]="true" + [isLoading]="isLoading" [locale]="locale" [precision]="precision" [unit]="baseCurrency" - [value]="isLoading ? undefined : summary?.emergencyFund?.assets" + [value]="summary?.emergencyFund?.cash" />
@@ -275,19 +329,22 @@ ) { }
@@ -306,10 +363,11 @@ @@ -322,10 +380,11 @@ @@ -338,13 +397,10 @@ class="justify-content-end" position="end" [colorizeSign]="true" + [isLoading]="isLoading" [isPercent]="true" [locale]="locale" - [value]=" - isLoading - ? undefined - : summary?.annualizedPerformancePercentWithCurrencyEffect - " + [value]="summary?.annualizedPerformancePercentWithCurrencyEffect" /> @@ -361,9 +417,11 @@ ) { } @@ -395,10 +453,11 @@ @@ -408,10 +467,11 @@ @@ -421,10 +481,11 @@ diff --git a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.scss b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.scss index 6feaa22d1..534976f11 100644 --- a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.scss +++ b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.scss @@ -1,6 +1,19 @@ :host { display: block; + .caret-container { + width: 1rem; + + .caret { + font-size: 0.7rem; + transition: transform 150ms ease-in-out; + + &.caret-expanded { + transform: rotate(90deg); + } + } + } + .indent-1 { margin-left: 1rem; } diff --git a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts index 1cd2ec93c..eac5ef9a6 100644 --- a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts +++ b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts @@ -18,6 +18,7 @@ import { IonIcon } from '@ionic/angular/standalone'; import { formatDistanceToNow } from 'date-fns'; import { addIcons } from 'ionicons'; import { + caretForwardOutline, ellipsisHorizontalCircleOutline, informationCircleOutline } from 'ionicons/icons'; @@ -47,13 +48,19 @@ export class GfPortfolioSummaryComponent implements OnChanges { 'BUY_AND_SELL_ACTIVITIES_TOOLTIP' ); + protected isCashExpanded = false; + protected isHoldingsExpanded = false; protected precision = 2; protected timeInMarket: string | undefined; private readonly notificationService = inject(NotificationService); public constructor() { - addIcons({ ellipsisHorizontalCircleOutline, informationCircleOutline }); + addIcons({ + caretForwardOutline, + ellipsisHorizontalCircleOutline, + informationCircleOutline + }); } protected get cashPercentage() { @@ -77,6 +84,14 @@ export class GfPortfolioSummaryComponent implements OnChanges { : 0; } + protected get hasCashBreakdown() { + return !this.isLoading && this.summary?.emergencyFund?.cash > 0; + } + + protected get hasHoldingsBreakdown() { + return !this.isLoading && this.summary?.emergencyFund?.assets > 0; + } + protected get holdingsInBaseCurrency() { if ( !isNumber(this.summary?.totalAssetsInBaseCurrency) || @@ -98,6 +113,16 @@ export class GfPortfolioSummaryComponent implements OnChanges { : 0; } + protected get investmentsInBaseCurrency() { + if (!isNumber(this.holdingsInBaseCurrency)) { + return null; + } + + return ( + this.holdingsInBaseCurrency - (this.summary.emergencyFund?.assets ?? 0) + ); + } + public ngOnChanges() { if (this.summary) { if ( @@ -135,4 +160,12 @@ export class GfPortfolioSummaryComponent implements OnChanges { title: $localize`Please set the amount of your emergency fund.` }); } + + protected onToggleCash() { + this.isCashExpanded = !this.isCashExpanded; + } + + protected onToggleHoldings() { + this.isHoldingsExpanded = !this.isHoldingsExpanded; + } } 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 63bf6e24e..defe751ee 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 @@ -24,7 +24,7 @@ import { MatSnackBar } from '@angular/material/snack-bar'; import { RouterModule } from '@angular/router'; import ms, { StringValue } from 'ms'; import { EMPTY } from 'rxjs'; -import { catchError } from 'rxjs/operators'; +import { catchError, switchMap } from 'rxjs/operators'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -173,6 +173,9 @@ export class GfUserAccountMembershipComponent { this.dataService .redeemCoupon(couponCode) .pipe( + switchMap(() => { + return this.userService.get(true); + }), catchError(() => { this.snackBar.open( '😞 ' + $localize`Could not redeem coupon code`, @@ -187,27 +190,13 @@ export class GfUserAccountMembershipComponent { takeUntilDestroyed(this.destroyRef) ) .subscribe(() => { - const snackBarRef = this.snackBar.open( + this.snackBar.open( '✅ ' + $localize`Coupon code has been redeemed`, - $localize`Reload`, + undefined, { duration: ms('3 seconds') } ); - - snackBarRef - .afterDismissed() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(() => { - window.location.reload(); - }); - - snackBarRef - .onAction() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(() => { - window.location.reload(); - }); }); } }, diff --git a/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts b/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts index a62760dad..18ce8e07c 100644 --- a/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts +++ b/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -5,7 +5,10 @@ import { } from '@ghostfolio/client/services/settings-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service'; -import { E_MAIL_LINE_BREAK } from '@ghostfolio/common/config'; +import { + DEFAULT_LANGUAGE_CODE, + E_MAIL_LINE_BREAK +} from '@ghostfolio/common/config'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { downloadAsFile } from '@ghostfolio/common/helper'; import { User } from '@ghostfolio/common/interfaces'; @@ -19,6 +22,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, + computed, CUSTOM_ELEMENTS_SCHEMA, DestroyRef, inject, @@ -47,6 +51,7 @@ import { format, parseISO } from 'date-fns'; import { addIcons } from 'ionicons'; import { eyeOffOutline, eyeOutline } from 'ionicons/icons'; import ms from 'ms'; +import { DeviceDetectorService } from 'ngx-device-detector'; import { EMPTY, throwError } from 'rxjs'; import { catchError } from 'rxjs/operators'; @@ -84,6 +89,7 @@ export class GfUserAccountSettingsComponent implements OnInit { protected hasPermissionToUpdateUserSettings: boolean; protected isAccessTokenHidden = true; protected readonly isFingerprintSupported = this.doesBrowserSupportAuthn(); + protected isLoading = true; protected isWebAuthnEnabled: boolean; protected readonly language = document.documentElement.lang; protected locales = [ @@ -104,10 +110,17 @@ export class GfUserAccountSettingsComponent implements OnInit { 'uk', 'zh' ]; + protected readonly previewDate = new Date().toISOString(); + protected readonly previewValue = 9999.99; protected user: User; + protected readonly deviceType = computed( + () => this.deviceDetectorService.deviceInfo().deviceType + ); + private readonly changeDetectorRef = inject(ChangeDetectorRef); private readonly dataService = inject(DataService); + private readonly deviceDetectorService = inject(DeviceDetectorService); private readonly destroyRef = inject(DestroyRef); private readonly notificationService = inject(NotificationService); private readonly settingsStorageService = inject(SettingsStorageService); @@ -127,6 +140,14 @@ export class GfUserAccountSettingsComponent implements OnInit { if (state?.user) { this.user = state.user; + const userDetailUrl = [ + window.location.origin, + DEFAULT_LANGUAGE_CODE, + internalRoutes.adminControl.path, + internalRoutes.adminControl.subRoutes.users.path, + this.user.id + ].join('/'); + this.closeUserAccountMailHref = `mailto:hi@ghostfol.io?subject=Delete Account&body=${[ 'Hello', '', @@ -134,7 +155,11 @@ export class GfUserAccountSettingsComponent implements OnInit { '', `User ID: ${this.user.id}`, '', - 'Kind regards' + 'Kind regards', + '', + '', + '---', + userDetailUrl ].join(E_MAIL_LINE_BREAK)}`; this.hasPermissionToDeleteOwnUser = hasPermission( @@ -163,6 +188,8 @@ export class GfUserAccountSettingsComponent implements OnInit { this.locales = Array.from(new Set(this.locales)).sort(); + this.isLoading = false; + this.changeDetectorRef.markForCheck(); } }); @@ -251,10 +278,6 @@ export class GfUserAccountSettingsComponent implements OnInit { .fetchExport() .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((data) => { - for (const activity of data.activities) { - delete (activity as Omit & { id?: string }).id; - } - downloadAsFile({ content: data, fileName: `ghostfolio-export-${format( diff --git a/apps/client/src/app/components/user-account-settings/user-account-settings.html b/apps/client/src/app/components/user-account-settings/user-account-settings.html index e77a89b24..cb39360f7 100644 --- a/apps/client/src/app/components/user-account-settings/user-account-settings.html +++ b/apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -146,7 +146,7 @@ -
+
Locale
@@ -154,7 +154,10 @@
- + {{ locale }} } + + + · + +
@@ -273,6 +293,7 @@
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 index 9e341037a..3aec4d42c 100644 --- 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 @@ -56,14 +56,18 @@ export class GfUserDetailDialogComponent implements OnInit { protected readonly baseCurrency: string; protected readonly canDeleteUser = canDeleteUser; protected readonly getCountryName = getCountryName; + protected isLoading = true; + protected readonly subscriptionsDataSource = new MatTableDataSource(); + protected readonly subscriptionsDisplayedColumns = [ 'createdAt', 'type', 'price', 'expiresAt' ]; + protected user: AdminUserResponse; protected readonly data = inject(MAT_DIALOG_DATA); @@ -72,6 +76,7 @@ export class GfUserDetailDialogComponent implements OnInit { private readonly changeDetectorRef = inject(ChangeDetectorRef); private readonly dataService = inject(DataService); private readonly destroyRef = inject(DestroyRef); + private readonly dialogRef = inject>( MatDialogRef @@ -101,6 +106,8 @@ export class GfUserDetailDialogComponent implements OnInit { this.subscriptionsDataSource.data = this.user.subscriptions ?? []; + this.isLoading = false; + this.changeDetectorRef.markForCheck(); }); } 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 index e2cdb66a5..efc4fe5b4 100644 --- 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 @@ -36,12 +36,19 @@ i18n size="medium" [enableCopyToClipboardButton]="true" + [isLoading]="isLoading" [value]="user?.id" >User ID
- Role + Role
@@ -51,6 +58,7 @@ i18n size="medium" [isDate]="true" + [isLoading]="isLoading" [locale]="data.locale" [value]="user?.createdAt" >Registration Date
Authentication
Membership
Accounts
Activities
API Requests Today
{ - this.hasImpersonationId = !!impersonationId; + this.impersonationId = impersonationId; }); this.userService.stateChanged @@ -155,7 +160,7 @@ export class GfAccountsPageComponent implements OnInit { }); } - protected onUpdateAccount(aAccount: AccountModel) { + protected onUpdateAccount(aAccount: AccountWithValue) { this.router.navigate([], { queryParams: { accountId: aAccount.id, editDialog: true } }); @@ -191,11 +196,10 @@ export class GfAccountsPageComponent implements OnInit { comment, currency, id, - isExcluded, name, platformId, tags - }: AccountModel & { tags?: Tag[] }) { + }: AccountWithValue & { tags?: Tag[] }) { const dialogRef = this.dialog.open< GfCreateOrUpdateAccountDialogComponent, CreateOrUpdateAccountDialogParams @@ -206,7 +210,6 @@ export class GfAccountsPageComponent implements OnInit { comment, currency, id, - isExcluded, name, platformId, tags @@ -253,11 +256,11 @@ export class GfAccountsPageComponent implements OnInit { data: { accountId: aAccountId, deviceType: this.deviceType(), - hasImpersonationId: this.hasImpersonationId, hasPermissionToCreateActivity: !this.hasImpersonationId && hasPermission(this.user?.permissions, permissions.createActivity) && - !this.user?.settings?.isRestrictedView + !this.user?.settings?.isRestrictedView, + impersonationId: this.impersonationId }, height: this.deviceType() === 'mobile' ? '98vh' : '80vh', width: this.deviceType() === 'mobile' ? '100vw' : '50rem' @@ -288,7 +291,6 @@ export class GfAccountsPageComponent implements OnInit { comment: null, currency: this.user?.settings?.baseCurrency ?? null, id: null, - isExcluded: false, name: null, platformId: null, tags: [] diff --git a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts index de0172eac..c1d171b6f 100644 --- a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts +++ b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { TAG_ID_EXCLUDE_FROM_ANALYSIS } from '@ghostfolio/common/config'; import { CreateAccountDto, UpdateAccountDto } from '@ghostfolio/common/dtos'; +import { getStringOrNull } from '@ghostfolio/common/helper'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { validateObjectForForm } from '@ghostfolio/common/utils'; import { GfCurrencySelectorComponent } from '@ghostfolio/ui/currency-selector'; @@ -27,7 +27,6 @@ import { } from '@angular/forms'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; import { MAT_DIALOG_DATA, MatDialogModule, @@ -51,7 +50,6 @@ import { CreateOrUpdateAccountDialogParams } from './interfaces/interfaces'; GfTagsSelectorComponent, MatAutocompleteModule, MatButtonModule, - MatCheckboxModule, MatDialogModule, MatFormFieldModule, MatInputModule, @@ -78,6 +76,12 @@ export class GfCreateOrUpdateAccountDialogComponent { private readonly formBuilder = inject(FormBuilder); private readonly userService = inject(UserService); + protected get selectedPlatform() { + const platform = this.accountForm.get('platformId')?.value; + + return typeof platform === 'string' ? undefined : (platform as Platform); + } + public ngOnInit() { const { currencies } = this.dataService.fetchInfo(); this.currencies = currencies; @@ -87,26 +91,19 @@ export class GfCreateOrUpdateAccountDialogComponent { permissions.createOwnTag ); - this.tagsAvailable = [ - ...(this.data.user?.tags ?? []), - { - id: TAG_ID_EXCLUDE_FROM_ANALYSIS, - name: 'EXCLUDE_FROM_ANALYSIS', - userId: null - } - ].map((tag) => { - return { - ...tag, - name: translate(tag.name) - }; - }); + this.tagsAvailable = + this.data.user?.tags?.map((tag) => { + return { + ...tag, + name: translate(tag.name) + }; + }) ?? []; this.accountForm = this.formBuilder.group({ accountId: [{ disabled: true, value: this.data.account.id }], balance: [this.data.account.balance, Validators.required], comment: [this.data.account.comment], currency: [this.data.account.currency, Validators.required], - isExcluded: [this.data.account.isExcluded], name: [this.data.account.name, Validators.required], platformId: [null, this.autocompleteObjectValidator()], tags: [ @@ -201,10 +198,9 @@ export class GfCreateOrUpdateAccountDialogComponent { protected async onSubmit() { const account: CreateAccountDto | UpdateAccountDto = { balance: this.accountForm.get('balance')?.value, - comment: this.accountForm.get('comment')?.value ?? null, + comment: getStringOrNull(this.accountForm.get('comment')?.value), currency: this.accountForm.get('currency')?.value, id: this.accountForm.get('accountId')?.value, - isExcluded: this.accountForm.get('isExcluded')?.value, name: this.accountForm.get('name')?.value, platformId: this.accountForm.get('platformId')?.value?.id ?? null, tags: this.accountForm diff --git a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html index d5743313d..86a034b53 100644 --- a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html +++ b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -46,6 +46,15 @@
Platform + @if (selectedPlatform) { + + } @@ -92,11 +102,6 @@ [tagsAvailable]="tagsAvailable" />
-
- Exclude from Analysis -
@if (data.account.id) {
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 c51503277..43015de00 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,9 +1,13 @@ import { User } from '@ghostfolio/common/interfaces'; +import { AccountWithBalance } from '@ghostfolio/common/types'; -import { Account, Tag } from '@prisma/client'; +import { Tag } from '@prisma/client'; export interface CreateOrUpdateAccountDialogParams { - account: Omit & { + account: Omit< + AccountWithBalance, + 'createdAt' | 'id' | 'updatedAt' | 'userId' + > & { id: string | null; tags?: Tag[]; }; diff --git a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html index 50c96be86..2f74bfbe7 100644 --- a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html +++ b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -13,13 +13,12 @@ @for (account of accounts; track account) {
- @if (account.platform?.url) { - - } + {{ account.name }}
@@ -34,13 +33,12 @@ @for (account of accounts; track account) {
- @if (account.platform?.url) { - - } + {{ account.name }}
diff --git a/apps/client/src/app/pages/api/api-page.component.ts b/apps/client/src/app/pages/api/api-page.component.ts index 556890271..8b80370e8 100644 --- a/apps/client/src/app/pages/api/api-page.component.ts +++ b/apps/client/src/app/pages/api/api-page.component.ts @@ -1,4 +1,3 @@ -import { GfFearAndGreedIndexComponent } from '@ghostfolio/client/components/fear-and-greed-index/fear-and-greed-index.component'; import { HEADER_KEY_SKIP_INTERCEPTOR, HEADER_KEY_TOKEN @@ -14,6 +13,7 @@ import { MarketDataOfMarketsResponse, QuotesResponse } from '@ghostfolio/common/interfaces'; +import { GfFearAndGreedIndexComponent } from '@ghostfolio/ui/fear-and-greed-index'; import { CommonModule } from '@angular/common'; import { diff --git a/apps/client/src/app/pages/api/api-page.html b/apps/client/src/app/pages/api/api-page.html index b2d9d03ac..2153fba1e 100644 --- a/apps/client/src/app/pages/api/api-page.html +++ b/apps/client/src/app/pages/api/api-page.html @@ -179,16 +179,12 @@ @if (isFetchFailure(marketDataOfMarkets)) { 🔴 {{ marketDataOfMarkets.fetchError }} - } @else if (marketDataOfMarkets) { + } @else { - } @else { - } @@ -203,17 +199,13 @@ @if (isFetchFailure(marketDataOfMarkets)) { 🔴 {{ marketDataOfMarkets.fetchError }} - } @else if (marketDataOfMarkets) { + } @else { - } @else { - } diff --git a/apps/client/src/app/pages/demo/demo-page.component.ts b/apps/client/src/app/pages/demo/demo-page.component.ts index a4482e36c..871efcd73 100644 --- a/apps/client/src/app/pages/demo/demo-page.component.ts +++ b/apps/client/src/app/pages/demo/demo-page.component.ts @@ -10,7 +10,6 @@ import { Router } from '@angular/router'; changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'page' }, selector: 'gf-demo-page', - standalone: true, templateUrl: './demo-page.html' }) export class GfDemoPageComponent { 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 574286c82..4ef7741de 100644 --- a/apps/client/src/app/pages/home/home-page.component.ts +++ b/apps/client/src/app/pages/home/home-page.component.ts @@ -1,7 +1,6 @@ import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { GfPageTabsComponent, @@ -73,18 +72,8 @@ export class GfHomePageComponent implements OnInit { }, { iconName: 'newspaper-outline', - label: hasPermission( - this.user?.permissions, - permissions.readMarketDataOfMarkets - ) - ? internalRoutes.home.subRoutes.marketsPremium.title - : internalRoutes.home.subRoutes.markets.title, - routerLink: hasPermission( - this.user?.permissions, - permissions.readMarketDataOfMarkets - ) - ? internalRoutes.home.subRoutes.marketsPremium.routerLink - : internalRoutes.home.subRoutes.markets.routerLink + label: internalRoutes.home.subRoutes.markets.title, + routerLink: internalRoutes.home.subRoutes.markets.routerLink } ]; } diff --git a/apps/client/src/app/pages/home/home-page.routes.ts b/apps/client/src/app/pages/home/home-page.routes.ts index 82ef1e521..cc444c2b0 100644 --- a/apps/client/src/app/pages/home/home-page.routes.ts +++ b/apps/client/src/app/pages/home/home-page.routes.ts @@ -1,5 +1,4 @@ import { GfHomeHoldingsComponent } from '@ghostfolio/client/components/home-holdings/home-holdings.component'; -import { GfHomeMarketComponent } from '@ghostfolio/client/components/home-market/home-market.component'; import { GfHomeOverviewComponent } from '@ghostfolio/client/components/home-overview/home-overview.component'; import { GfHomeSummaryComponent } from '@ghostfolio/client/components/home-summary/home-summary.component'; import { GfHomeWatchlistComponent } from '@ghostfolio/client/components/home-watchlist/home-watchlist.component'; @@ -31,13 +30,8 @@ export const routes: Routes = [ }, { path: internalRoutes.home.subRoutes.markets.path, - component: GfHomeMarketComponent, - title: internalRoutes.home.subRoutes.markets.title - }, - { - path: internalRoutes.home.subRoutes.marketsPremium.path, component: GfMarketsComponent, - title: internalRoutes.home.subRoutes.marketsPremium.title + title: internalRoutes.home.subRoutes.markets.title }, { path: internalRoutes.home.subRoutes.watchlist.path, diff --git a/apps/client/src/app/pages/i18n/i18n-page.component.ts b/apps/client/src/app/pages/i18n/i18n-page.component.ts index c1f394b00..0cf305bf9 100644 --- a/apps/client/src/app/pages/i18n/i18n-page.component.ts +++ b/apps/client/src/app/pages/i18n/i18n-page.component.ts @@ -4,7 +4,6 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'page' }, selector: 'gf-i18n-page', - standalone: true, styleUrls: ['./i18n-page.scss'], templateUrl: './i18n-page.html' }) diff --git a/apps/client/src/app/pages/markets/markets-page.component.ts b/apps/client/src/app/pages/markets/markets-page.component.ts index 9a7576a95..bf35c5556 100644 --- a/apps/client/src/app/pages/markets/markets-page.component.ts +++ b/apps/client/src/app/pages/markets/markets-page.component.ts @@ -1,11 +1,11 @@ -import { GfHomeMarketComponent } from '@ghostfolio/client/components/home-market/home-market.component'; +import { GfMarketsComponent } from '@ghostfolio/client/components/markets/markets.component'; import { ChangeDetectionStrategy, Component } from '@angular/core'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'page' }, - imports: [GfHomeMarketComponent], + imports: [GfMarketsComponent], selector: 'gf-markets-page', styleUrls: ['./markets-page.scss'], templateUrl: './markets-page.html' diff --git a/apps/client/src/app/pages/markets/markets-page.html b/apps/client/src/app/pages/markets/markets-page.html index 16457b8cd..0ff0170d7 100644 --- a/apps/client/src/app/pages/markets/markets-page.html +++ b/apps/client/src/app/pages/markets/markets-page.html @@ -1,7 +1,7 @@
- +
diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts index 3362dc5d5..0ff4168ac 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts @@ -10,7 +10,6 @@ import { } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; -import { DateRange } from '@ghostfolio/common/types'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfFabComponent } from '@ghostfolio/ui/fab'; import { DataService } from '@ghostfolio/ui/services'; @@ -92,8 +91,14 @@ export class GfActivitiesPageComponent implements OnInit { .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((state) => { if (state?.user) { + const previousDateRange = this.getDateRange(); + this.updateUser(state.user); + if (previousDateRange !== this.getDateRange()) { + this.pageIndex = 0; + } + this.fetchActivities(); this.changeDetectorRef.markForCheck(); @@ -120,7 +125,11 @@ export class GfActivitiesPageComponent implements OnInit { protected onDeleteActivities() { this.dataService .deleteActivities({ - filters: this.userService.getFilters() + activityTypes: this.activityTypesFilter.length + ? this.activityTypesFilter + : undefined, + filters: this.userService.getFilters(), + range: this.getDateRange() }) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(() => { @@ -159,7 +168,8 @@ export class GfActivitiesPageComponent implements OnInit { activityTypes: this.activityTypesFilter.length ? this.activityTypesFilter : undefined, - filters: this.userService.getFilters() + filters: this.userService.getFilters(), + range: this.getDateRange() }; } @@ -167,10 +177,6 @@ export class GfActivitiesPageComponent implements OnInit { .fetchExport(fetchExportParams) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((data) => { - for (const activity of data.activities) { - delete (activity as Omit & { id?: string }).id; - } - downloadAsFile({ content: data, fileName: `ghostfolio-export-${format( @@ -184,7 +190,7 @@ export class GfActivitiesPageComponent implements OnInit { protected onExportDrafts(activityIds?: string[]) { this.dataService - .fetchExport({ activityIds }) + .fetchExport({ activityIds, withActivityIds: true }) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((data) => { downloadAsFile({ @@ -277,16 +283,13 @@ export class GfActivitiesPageComponent implements OnInit { this.dataSource = undefined; this.totalItems = undefined; - const dateRange = this.user?.settings?.dateRange; - const range = this.isCalendarYear(dateRange) ? dateRange : undefined; - this.dataService .fetchActivities({ - range, activityTypes: this.activityTypesFilter.length ? this.activityTypesFilter : undefined, filters: this.userService.getFilters(), + range: this.getDateRange(), skip: this.pageIndex * this.pageSize, sortColumn: this.sortColumn, sortDirection: this.sortDirection, @@ -311,12 +314,16 @@ export class GfActivitiesPageComponent implements OnInit { }); } - private isCalendarYear(dateRange?: DateRange) { - if (!dateRange) { - return false; + private getDateRange() { + const dateRange = this.user?.settings?.dateRange; + + // Omit the date ranges which do not apply to activities: '1d' spans today + // only, while 'max' would exclude drafts dated in the future + if (!dateRange || ['1d', 'max'].includes(dateRange)) { + return undefined; } - return /^\d{4}$/.test(dateRange); + return dateRange; } private updateUser(aUser: User) { diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts index 632db1cd4..07f596711 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts @@ -1,7 +1,10 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { ASSET_CLASS_MAPPING, DEFAULT_LOCALE } from '@ghostfolio/common/config'; import { CreateOrderDto, UpdateOrderDto } from '@ghostfolio/common/dtos'; -import { getDateFormatString } from '@ghostfolio/common/helper'; +import { + getDateFormatString, + getStringOrNull +} from '@ghostfolio/common/helper'; import { AssetClassSelectorOption, LookupItem @@ -118,6 +121,12 @@ export class GfCreateOrUpdateActivityDialogComponent { addIcons({ calendarClearOutline, refreshOutline }); } + protected get selectedAccount() { + return this.data.accounts.find(({ id }) => { + return id === this.activityForm.get('accountId')?.value; + }); + } + public ngOnInit() { this.currencyOfAssetProfile = this.data.activity?.assetProfile?.currency; this.hasPermissionToCreateOwnTag = hasPermission( @@ -471,7 +480,7 @@ export class GfCreateOrUpdateActivityDialogComponent { accountId: this.activityForm.get('accountId')?.value, assetClass: this.activityForm.get('assetClass')?.value, assetSubClass: this.activityForm.get('assetSubClass')?.value, - comment: this.activityForm.get('comment')?.value ?? null, + comment: getStringOrNull(this.activityForm.get('comment')?.value), currency: this.activityForm.get('currency')?.value, customCurrency: this.activityForm.get('currencyOfUnitPrice')?.value, dataSource: ['FEE', 'INTEREST', 'LIABILITY', 'VALUABLE'].includes( diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html index b5dbf4669..9455a9dd6 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -85,18 +85,31 @@ > Account + +
+ @if (selectedAccount) { + + } + {{ selectedAccount?.name }} +
+
+ @for (account of data.accounts; track account) {
- @if (account.platform?.url) { - - } + {{ account.name }}
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 a3d58f8eb..7faed5312 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 @@ -1,9 +1,8 @@ import { Activity, User } from '@ghostfolio/common/interfaces'; - -import { Account } from '@prisma/client'; +import { AccountWithPlatform } from '@ghostfolio/common/types'; export interface CreateOrUpdateActivityDialogParams { - accounts: Account[]; + accounts: AccountWithPlatform[]; activity: Partial> & { assetProfile: Activity['assetProfile'] | null; id: string | null; 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 77d889b1a..48f1d5abd 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 @@ -4,6 +4,7 @@ import { DEFAULT_DATE_RANGE } from '@ghostfolio/common/config'; import { CreateAccountWithBalancesDto, CreateAssetProfileWithMarketDataDto, + CreatePlatformDto, CreateTagDto } from '@ghostfolio/common/dtos'; import { Activity, PortfolioPosition } from '@ghostfolio/common/interfaces'; @@ -107,6 +108,7 @@ export class GfImportActivitiesDialogComponent { private accounts: CreateAccountWithBalancesDto[] = []; private activities: Activity[] = []; private assetProfiles: CreateAssetProfileWithMarketDataDto[] = []; + private platforms: CreatePlatformDto[] = []; private tags: CreateTagDto[] = []; private readonly changeDetectorRef = inject(ChangeDetectorRef); @@ -173,6 +175,7 @@ export class GfImportActivitiesDialogComponent { accounts: this.accounts, activities: this.selectedActivities, assetProfiles: this.assetProfiles, + platforms: this.platforms, tags: this.tags }); @@ -304,6 +307,7 @@ export class GfImportActivitiesDialogComponent { this.accounts = content.accounts; this.assetProfiles = content.assetProfiles; + this.platforms = content.platforms; this.tags = content.tags; if (!isArray(content.activities)) { @@ -337,6 +341,7 @@ export class GfImportActivitiesDialogComponent { activities: content.activities, assetProfiles: content.assetProfiles, isDryRun: true, + platforms: content.platforms, tags: content.tags }); 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 dd2c62f98..be7d49bea 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 @@ -17,7 +17,11 @@ import { PortfolioPosition, User } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { + hasPermission, + hasReadRestrictedAccessPermission, + permissions +} from '@ghostfolio/common/permissions'; import { MarketAdvanced } from '@ghostfolio/common/types'; import { translate } from '@ghostfolio/ui/i18n'; import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart'; @@ -85,7 +89,6 @@ export class GfAllocationsPageComponent implements OnInit { protected readonly deviceType = computed( () => this.deviceDetectorService.deviceInfo().deviceType ); - protected hasImpersonationId: boolean; protected holdings: { [symbol: string]: Pick< PortfolioPosition['assetProfile'], @@ -95,8 +98,9 @@ export class GfAllocationsPageComponent implements OnInit { | 'assetSubClassLabel' | 'currency' | 'name' - > & { etfProvider: string; exchange?: string; value: number }; + > & { etfProvider: string; value: number }; }; + protected impersonationId: string | null; protected isLoading = false; protected markets: PortfolioDetails['markets']; protected marketsAdvanced: { @@ -169,7 +173,7 @@ export class GfAllocationsPageComponent implements OnInit { .onChangeHasImpersonation() .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((impersonationId) => { - this.hasImpersonationId = !!impersonationId; + this.impersonationId = impersonationId; this.changeDetectorRef.markForCheck(); }); @@ -224,7 +228,12 @@ export class GfAllocationsPageComponent implements OnInit { } protected showValuesInPercentage() { - return this.hasImpersonationId || this.user?.settings?.isRestrictedView; + return ( + hasReadRestrictedAccessPermission({ + accesses: this.user?.access, + impersonationId: this.impersonationId + }) || this.user?.settings?.isRestrictedView + ); } private extractCurrency({ @@ -381,7 +390,6 @@ export class GfAllocationsPageComponent implements OnInit { assetSubClass: position.assetProfile.assetSubClass, name: position.assetProfile.name }), - exchange: position.exchange, name: position.assetProfile.name, value: this.showValuesInPercentage() ? position.allocationInPercentage @@ -619,11 +627,11 @@ export class GfAllocationsPageComponent implements OnInit { data: { accountId: aAccountId, deviceType: this.deviceType(), - hasImpersonationId: this.hasImpersonationId, hasPermissionToCreateActivity: - !this.hasImpersonationId && + !this.impersonationId && hasPermission(this.user?.permissions, permissions.createActivity) && - !this.user?.settings?.isRestrictedView + !this.user?.settings?.isRestrictedView, + impersonationId: this.impersonationId }, height: this.deviceType() === 'mobile' ? '98vh' : '80vh', width: this.deviceType() === 'mobile' ? '100vw' : '50rem' diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html index d5c765958..902d04cde 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html @@ -14,12 +14,9 @@ @@ -213,6 +210,7 @@ Developed MarketsEmerging MarketsOther MarketsNo data available { - this.hasImpersonationId = !!impersonationId; + this.impersonationId = impersonationId; this.changeDetectorRef.markForCheck(); }); @@ -241,6 +241,15 @@ export class GfAnalysisPageComponent implements OnInit { }); } + protected showValuesInPercentage() { + return ( + hasReadRestrictedAccessPermission({ + accesses: this.user?.access, + impersonationId: this.impersonationId + }) || this.user?.settings?.isRestrictedView + ); + } + private fetchDividendsAndInvestments() { this.isLoadingDividendTimelineChart = true; this.isLoadingInvestmentTimelineChart = true; @@ -267,8 +276,9 @@ export class GfAnalysisPageComponent implements OnInit { range: this.user?.settings?.dateRange ?? DEFAULT_DATE_RANGE }) .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(({ investments, streaks }) => { + .subscribe(({ investments, savingsRate, streaks }) => { this.investmentsByGroup = investments; + this.savingsRatePerMonth = savingsRate; this.streaks = streaks; this.unitCurrentStreak = this.mode() === 'year' diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html index ec90fccec..82751b882 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -83,14 +83,11 @@ i18n size="large" [isCurrency]="true" + [isLoading]="isLoadingInvestmentChart" [locale]="user?.settings?.locale" [precision]="precision" [unit]="user?.settings?.baseCurrency" - [value]=" - isLoadingInvestmentChart - ? undefined - : performance?.currentValueInBaseCurrency - " + [value]="performance?.currentValueInBaseCurrency" >Total amount @@ -104,14 +101,11 @@ size="large" [colorizeSign]="true" [isCurrency]="true" + [isLoading]="isLoadingInvestmentChart" [locale]="user?.settings?.locale" [precision]="precision" [unit]="user?.settings?.baseCurrency" - [value]=" - isLoadingInvestmentChart - ? undefined - : performance?.netPerformanceWithCurrencyEffect - " + [value]="performance?.netPerformanceWithCurrencyEffect" >Change with currency effect @@ -124,13 +118,10 @@ i18n size="large" [colorizeSign]="true" + [isLoading]="isLoadingInvestmentChart" [isPercent]="true" [locale]="user?.settings?.locale" - [value]=" - isLoadingInvestmentChart - ? undefined - : performance?.netPerformancePercentageWithCurrencyEffect - " + [value]="performance?.netPerformancePercentageWithCurrencyEffect" >Performance with currency effect @@ -173,13 +164,10 @@ class="justify-content-end" position="end" [isCurrency]="true" + [isLoading]="isLoadingInvestmentChart" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" - [value]=" - isLoadingInvestmentChart - ? undefined - : performance?.netPerformance - " + [value]="performance?.netPerformance" />
@@ -192,13 +180,10 @@ class="justify-content-end" position="end" [colorizeSign]="true" + [isLoading]="isLoadingInvestmentChart" [isPercent]="true" [locale]="user?.settings?.locale" - [value]=" - isLoadingInvestmentChart - ? undefined - : performance?.netPerformancePercentage - " + [value]="performance?.netPerformancePercentage" /> @@ -216,15 +201,14 @@ class="justify-content-end" position="end" [isCurrency]="true" + [isLoading]="isLoadingInvestmentChart" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" [value]=" - isLoadingInvestmentChart - ? undefined - : performance?.netPerformance === null - ? null - : performance?.netPerformanceWithCurrencyEffect - - performance?.netPerformance + performance?.netPerformance === null + ? null + : performance?.netPerformanceWithCurrencyEffect - + performance?.netPerformance " /> @@ -238,15 +222,14 @@ class="justify-content-end" position="end" [colorizeSign]="true" + [isLoading]="isLoadingInvestmentChart" [isPercent]="true" [locale]="user?.settings?.locale" [value]=" - isLoadingInvestmentChart - ? undefined - : performance?.netPerformancePercentage === null - ? null - : performance?.netPerformancePercentageWithCurrencyEffect - - performance?.netPerformancePercentage + performance?.netPerformancePercentage === null + ? null + : performance?.netPerformancePercentageWithCurrencyEffect - + performance?.netPerformancePercentage " /> @@ -261,13 +244,10 @@ class="justify-content-end" position="end" [isCurrency]="true" + [isLoading]="isLoadingInvestmentChart" [locale]="user?.settings?.locale" [unit]="user?.settings?.baseCurrency" - [value]=" - isLoadingInvestmentChart - ? undefined - : performance?.netPerformanceWithCurrencyEffect - " + [value]="performance?.netPerformanceWithCurrencyEffect" /> @@ -280,12 +260,11 @@ class="justify-content-end" position="end" [colorizeSign]="true" + [isLoading]="isLoadingInvestmentChart" [isPercent]="true" [locale]="user?.settings?.locale" [value]=" - isLoadingInvestmentChart - ? undefined - : performance?.netPerformancePercentageWithCurrencyEffect + performance?.netPerformancePercentageWithCurrencyEffect " /> @@ -419,9 +398,7 @@ [benchmarkDataLabel]="portfolioEvolutionDataLabel" [currency]="user?.settings?.baseCurrency" [historicalDataItems]="performanceDataItems" - [isInPercentage]=" - hasImpersonationId || user.settings.isRestrictedView - " + [isInPercentage]="showValuesInPercentage()" [isLoading]="isLoadingInvestmentChart" [locale]="user?.settings?.locale" /> @@ -477,9 +454,7 @@ [benchmarkDataLabel]="investmentTimelineDataLabel" [currency]="user?.settings?.baseCurrency" [groupBy]="mode()" - [isInPercentage]=" - hasImpersonationId || user.settings.isRestrictedView - " + [isInPercentage]="showValuesInPercentage()" [isLoading]="isLoadingInvestmentTimelineChart" [locale]="user?.settings?.locale" [savingsRate]="savingsRate" @@ -514,9 +489,7 @@ [benchmarkDataLabel]="dividendTimelineDataLabel" [currency]="user?.settings?.baseCurrency" [groupBy]="mode()" - [isInPercentage]=" - hasImpersonationId || user.settings.isRestrictedView - " + [isInPercentage]="showValuesInPercentage()" [isLoading]="isLoadingDividendTimelineChart" [locale]="user?.settings?.locale" /> diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.html b/apps/client/src/app/pages/portfolio/fire/fire-page.html index 7315f10cb..13693a15a 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.html +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -21,7 +21,7 @@ [locale]="user?.settings?.locale" [projectedTotalAmount]="user?.settings?.projectedTotalAmount" [retirementDate]="user?.settings?.retirementDate" - [savingsRate]="user?.settings?.savingsRate" + [savingsRate]="hasImpersonationId ? 0 : user?.settings?.savingsRate" [style.opacity]=" user?.subscription?.type === 'Basic' ? '0.67' : 'initial' " diff --git a/apps/client/src/app/pages/public/public-page.component.ts b/apps/client/src/app/pages/public/public-page.component.ts index 3b149cd08..e354f8a1b 100644 --- a/apps/client/src/app/pages/public/public-page.component.ts +++ b/apps/client/src/app/pages/public/public-page.component.ts @@ -69,6 +69,7 @@ export class GfPublicPageComponent implements OnInit { protected hasPermissionForSubscription: boolean; protected holdings: PublicPortfolioResponse['holdings'][string][]; protected info: InfoItem; + protected isLoading = true; protected latestActivitiesDataSource: MatTableDataSource< PublicPortfolioResponse['latestActivities'][0] >; @@ -138,6 +139,8 @@ export class GfPublicPageComponent implements OnInit { this.publicPortfolioDetails.latestActivities ); + this.isLoading = false; + this.changeDetectorRef.markForCheck(); }); } diff --git a/apps/client/src/app/pages/public/public-page.html b/apps/client/src/app/pages/public/public-page.html index 57bc1e95f..e0e855585 100644 --- a/apps/client/src/app/pages/public/public-page.html +++ b/apps/client/src/app/pages/public/public-page.html @@ -15,11 +15,11 @@ i18n size="large" [colorizeSign]="true" + [isLoading]="isLoading" [isPercent]="true" [precision]="2" [value]=" - publicPortfolioDetails?.performance?.['1d']?.relativeChange ?? - undefined + publicPortfolioDetails?.performance?.['1d']?.relativeChange " >Today
@@ -33,11 +33,11 @@ i18n size="large" [colorizeSign]="true" + [isLoading]="isLoading" [isPercent]="true" [precision]="2" [value]=" - publicPortfolioDetails?.performance?.['ytd']?.relativeChange ?? - undefined + publicPortfolioDetails?.performance?.['ytd']?.relativeChange " >This year
@@ -51,11 +51,11 @@ i18n size="large" [colorizeSign]="true" + [isLoading]="isLoading" [isPercent]="true" [precision]="2" [value]=" - publicPortfolioDetails?.performance?.['max']?.relativeChange ?? - undefined + publicPortfolioDetails?.performance?.['max']?.relativeChange " >From the beginning
diff --git a/apps/client/src/app/services/import-activities.service.ts b/apps/client/src/app/services/import-activities.service.ts index ff5679718..b73676252 100644 --- a/apps/client/src/app/services/import-activities.service.ts +++ b/apps/client/src/app/services/import-activities.service.ts @@ -1,10 +1,15 @@ +import { NON_INVESTMENT_ACTIVITY_TYPES } from '@ghostfolio/common/config'; import { CreateAccountWithBalancesDto, CreateAssetProfileWithMarketDataDto, CreateOrderDto, + CreatePlatformDto, CreateTagDto } from '@ghostfolio/common/dtos'; -import { parseDate as parseDateHelper } from '@ghostfolio/common/helper'; +import { + isValidCustomAssetProfileSymbol, + parseDate as parseDateHelper +} from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { HttpClient } from '@angular/common/http'; @@ -13,6 +18,7 @@ import { Account, DataSource, Type as ActivityType } from '@prisma/client'; import { isFinite, isNumber, isString } from 'lodash'; import { parse as csvToJson } from 'papaparse'; import { firstValueFrom } from 'rxjs'; +import { v4 as uuidv4 } from 'uuid'; @Injectable({ providedIn: 'root' @@ -56,13 +62,58 @@ export class ImportActivitiesService { const activities: CreateOrderDto[] = []; const assetProfiles: CreateAssetProfileWithMarketDataDto[] = []; + const assetProfileSymbolMapping = new Map(); 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 }); + let dataSource = this.parseDataSource({ item }); + let symbol = this.parseSymbol({ content, index, item }); + + if (!dataSource && NON_INVESTMENT_ACTIVITY_TYPES.includes(type)) { + // Apply the same data source as the import service + dataSource = DataSource.MANUAL; + } + + if (dataSource === DataSource.MANUAL) { + const name = symbol; + + if (!isValidCustomAssetProfileSymbol(symbol)) { + // Generate a symbol and keep the free text as the name + symbol = assetProfileSymbolMapping.get(name) ?? uuidv4(); + assetProfileSymbolMapping.set(name, symbol); + } + + const isExistingAssetProfile = assetProfiles.some((assetProfile) => { + return assetProfile.symbol === symbol; + }); + + if (!isExistingAssetProfile) { + // Create synthetic asset profile for MANUAL data source + assetProfiles.push({ + currency, + name, + symbol, + assetClass: undefined, + assetSubClass: undefined, + comment: undefined, + countries: [], + cusip: undefined, + dataSource: DataSource.MANUAL, + figi: undefined, + figiComposite: undefined, + figiShareClass: undefined, + holdings: [], + isActive: true, + isin: undefined, + marketData: [], + sectors: [], + url: undefined + }); + } + } + activities.push({ currency, dataSource, @@ -76,30 +127,6 @@ export class ImportActivitiesService { 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: undefined, - assetSubClass: undefined, - comment: undefined, - countries: [], - cusip: undefined, - dataSource: DataSource.MANUAL, - figi: undefined, - figiComposite: undefined, - figiShareClass: undefined, - holdings: [], - isActive: true, - isin: undefined, - marketData: [], - name: symbol, - sectors: [], - url: undefined - }); - } } const result = await this.importJson({ @@ -115,12 +142,14 @@ export class ImportActivitiesService { activities, assetProfiles, isDryRun = false, + platforms, tags }: { activities: CreateOrderDto[]; accounts?: CreateAccountWithBalancesDto[]; assetProfiles?: CreateAssetProfileWithMarketDataDto[]; isDryRun?: boolean; + platforms?: CreatePlatformDto[]; tags?: CreateTagDto[]; }): Promise<{ activities: Activity[]; @@ -131,6 +160,7 @@ export class ImportActivitiesService { accounts, activities, assetProfiles, + platforms, tags }, isDryRun @@ -142,11 +172,13 @@ export class ImportActivitiesService { accounts, activities, assetProfiles, + platforms, tags }: { accounts?: CreateAccountWithBalancesDto[]; activities: Activity[]; assetProfiles?: CreateAssetProfileWithMarketDataDto[]; + platforms?: CreatePlatformDto[]; tags?: CreateTagDto[]; }): Promise<{ activities: Activity[]; @@ -158,6 +190,7 @@ export class ImportActivitiesService { return this.importJson({ accounts, assetProfiles, + platforms, tags, activities: importData }); @@ -457,6 +490,7 @@ export class ImportActivitiesService { accounts?: CreateAccountWithBalancesDto[]; activities: CreateOrderDto[]; assetProfiles?: CreateAssetProfileWithMarketDataDto[]; + platforms?: CreatePlatformDto[]; tags?: CreateTagDto[]; }, aIsDryRun = false diff --git a/apps/client/src/index.html b/apps/client/src/index.html index 61953bca8..105e7bcae 100644 --- a/apps/client/src/index.html +++ b/apps/client/src/index.html @@ -1,5 +1,5 @@ - + Ghostfolio diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 95a13a072..ed890ccb1 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -1,6 +1,14 @@ + + Invalid API key + Invalid API key + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 112 + + Features Característiques @@ -18,7 +26,7 @@ libs/common/src/lib/routes/routes.ts - 276 + 271 @@ -26,7 +34,7 @@ Internacionalització libs/common/src/lib/routes/routes.ts - 119 + 114 @@ -107,31 +115,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 196 + 191 libs/common/src/lib/routes/routes.ts - 197 + 192 libs/common/src/lib/routes/routes.ts - 202 + 197 libs/common/src/lib/routes/routes.ts - 210 + 205 libs/common/src/lib/routes/routes.ts - 218 + 213 libs/common/src/lib/routes/routes.ts - 226 + 221 libs/common/src/lib/routes/routes.ts - 234 + 229 @@ -140,11 +148,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 208 + 203 libs/common/src/lib/routes/routes.ts - 211 + 206 @@ -153,11 +161,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 224 + 219 libs/common/src/lib/routes/routes.ts - 227 + 222 @@ -166,19 +174,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 249 libs/common/src/lib/routes/routes.ts - 255 + 250 libs/common/src/lib/routes/routes.ts - 259 + 254 libs/common/src/lib/routes/routes.ts - 265 + 260 @@ -187,11 +195,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 274 + 269 libs/common/src/lib/routes/routes.ts - 275 + 270 @@ -200,11 +208,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 279 + 274 libs/common/src/lib/routes/routes.ts - 280 + 275 @@ -213,11 +221,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 289 + 284 libs/common/src/lib/routes/routes.ts - 290 + 285 @@ -226,11 +234,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 299 + 294 libs/common/src/lib/routes/routes.ts - 300 + 295 @@ -239,31 +247,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 299 libs/common/src/lib/routes/routes.ts - 305 + 300 libs/common/src/lib/routes/routes.ts - 310 + 305 libs/common/src/lib/routes/routes.ts - 318 + 313 libs/common/src/lib/routes/routes.ts - 326 + 321 libs/common/src/lib/routes/routes.ts - 334 + 329 libs/common/src/lib/routes/routes.ts - 342 + 337 @@ -375,7 +383,7 @@ Balanç de Caixa apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 43 + 55 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -391,7 +399,7 @@ Plataforma apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 113 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -407,7 +415,7 @@ Balanç de Caixa apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 143 + 170 @@ -431,7 +439,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 332 + 333 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -467,7 +475,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 161 + 175 libs/ui/src/lib/benchmark/benchmark.component.html @@ -507,11 +515,11 @@ Divisa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 216 + 217 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 339 + 340 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -531,7 +539,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 303 + 317 @@ -567,11 +575,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 284 + 298 libs/ui/src/lib/activities-table/activities-table.component.html - 320 + 334 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -611,7 +619,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 483 + 497 @@ -627,7 +635,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 235 + 238 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -637,6 +645,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 100 + + apps/client/src/app/components/admin-users/admin-users.html + 254 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 27 @@ -651,7 +663,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 513 + 527 libs/ui/src/lib/benchmark/benchmark.component.html @@ -671,7 +683,7 @@ Paid apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 129 + 136 @@ -687,7 +699,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 166 + 174 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -695,11 +707,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 5 + 7 libs/ui/src/lib/activities-table/activities-table.component.html - 183 + 197 @@ -719,7 +731,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 486 + 487 @@ -735,7 +747,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 198 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -754,6 +766,14 @@ 96 + + Unknown + Unknown + + libs/ui/src/lib/i18n.ts + 88 + + Attempts Intents @@ -814,6 +834,14 @@ 208 + + Splits + Splits + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 512 + + View Stacktrace Veure Stacktrace @@ -851,12 +879,20 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 447 + 448 Date Data + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 521 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 560 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 156 @@ -867,7 +903,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 206 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -891,7 +927,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 113 + 114 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -903,7 +939,7 @@ Punts de referència apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 128 @@ -911,7 +947,7 @@ Divises apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 133 apps/client/src/app/pages/public/public-page.html @@ -931,7 +967,7 @@ ETFs sense País apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 138 @@ -939,7 +975,7 @@ ETFs sense Sector apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 143 @@ -947,7 +983,7 @@ An error occurred while converting the data source to . apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 482 + 522 @@ -955,7 +991,7 @@ Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 365 + 377 @@ -967,11 +1003,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 235 + 236 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 221 + 222 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -983,7 +1019,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 467 + 468 @@ -1027,7 +1063,7 @@ Subscription History apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 141 + 149 @@ -1055,11 +1091,11 @@ Realment vol eliminar el perfil d’aquest actiu? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 28 + 29 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 66 + 71 @@ -1075,7 +1111,7 @@ Healthcare libs/ui/src/lib/i18n.ts - 96 + 97 @@ -1083,7 +1119,7 @@ El preu de mercat actual és apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 766 + 850 @@ -1123,11 +1159,11 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 280 + 281 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 270 + 271 @@ -1135,7 +1171,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 296 apps/client/src/app/components/admin-users/admin-users.html @@ -1143,11 +1179,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 284 + 285 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 88 + 96 @@ -1155,15 +1191,15 @@ Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 301 + 302 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 421 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 290 + 291 apps/client/src/app/pages/public/public-page.html @@ -1175,15 +1211,15 @@ Països apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 312 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 431 + 432 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 302 + 303 @@ -1191,7 +1227,7 @@ Mapatge de Símbols apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 410 @@ -1199,7 +1235,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 146 + 141 @@ -1207,7 +1243,7 @@ Technology libs/ui/src/lib/i18n.ts - 100 + 101 @@ -1223,7 +1259,7 @@ Total apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 160 + 168 @@ -1231,7 +1267,7 @@ Configuració del Proveïdor de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 509 + 628 @@ -1239,7 +1275,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 606 + 725 @@ -1247,11 +1283,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 443 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 707 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1267,7 +1303,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 665 + 748 @@ -1275,7 +1311,7 @@ Notes apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 455 + 456 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1291,7 +1327,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 370 + 384 @@ -1315,7 +1351,7 @@ Industrials libs/ui/src/lib/i18n.ts - 97 + 98 @@ -1331,7 +1367,7 @@ Nom, símbol o ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 133 + 134 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1351,7 +1387,7 @@ Consumer Cyclical libs/ui/src/lib/i18n.ts - 92 + 93 @@ -1359,7 +1395,7 @@ Està segur qeu vol eliminar aquest cupó? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 242 + 247 @@ -1367,7 +1403,7 @@ Està segur que vol eliminar aquest missatge del sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 255 + 260 @@ -1375,7 +1411,7 @@ Està segur que vol depurar el cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 279 + 290 @@ -1383,7 +1419,7 @@ Si us plau, afegeixi el seu missatge del sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 299 + 310 @@ -1399,7 +1435,7 @@ per Usuari apps/client/src/app/components/admin-overview/admin-overview.component.ts - 178 + 181 @@ -1423,7 +1459,7 @@ Mode Només Lecutra apps/client/src/app/components/admin-overview/admin-overview.html - 64 + 63 @@ -1431,7 +1467,7 @@ Recollida de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 629 + 748 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1443,7 +1479,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 449 @@ -1451,7 +1487,7 @@ Missatge del Sistema apps/client/src/app/components/admin-overview/admin-overview.html - 88 + 89 @@ -1459,7 +1495,7 @@ Estableix el Missatge apps/client/src/app/components/admin-overview/admin-overview.html - 110 + 113 @@ -1467,15 +1503,19 @@ Coupons apps/client/src/app/components/admin-overview/admin-overview.html - 148 + 151 Add Afegir + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 615 + apps/client/src/app/components/admin-overview/admin-overview.html - 298 + 301 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1487,7 +1527,7 @@ Ordre apps/client/src/app/components/admin-overview/admin-overview.html - 117 + 120 @@ -1495,7 +1535,7 @@ Depurar el Cache apps/client/src/app/components/admin-overview/admin-overview.html - 133 + 136 @@ -1535,7 +1575,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 @@ -1546,12 +1586,20 @@ 10 + + Cache has been flushed. + Cache has been flushed. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 281 + + Platforms Plataformes apps/client/src/app/components/admin-settings/admin-settings.component.html - 212 + 221 @@ -1559,7 +1607,7 @@ Etiquetes apps/client/src/app/components/admin-settings/admin-settings.component.html - 218 + 227 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1567,7 +1615,7 @@ libs/ui/src/lib/tags-selector/tags-selector.component.html - 25 + 23 @@ -1643,7 +1691,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 124 + 132 @@ -1662,24 +1710,16 @@ 228 - - Delete User - Eliminar Usuari - - apps/client/src/app/components/admin-users/admin-users.html - 254 - - Could not validate form Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 641 + 724 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 644 + 727 @@ -1703,7 +1743,7 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 139 + 140 apps/client/src/app/components/header/header.component.html @@ -1719,7 +1759,7 @@ libs/common/src/lib/routes/routes.ts - 172 + 167 @@ -1727,19 +1767,19 @@ Punt de Referència apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 401 + 402 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 151 + 152 Current Market Mood Sentiment del Mercat - apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html - 12 + libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html + 23 @@ -1811,7 +1851,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 215 + 230 @@ -1819,7 +1859,7 @@ Preu Mínim apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 131 + 132 @@ -1827,7 +1867,7 @@ Preu Màxim apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 149 + 150 @@ -1835,7 +1875,7 @@ Quantitat apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 159 + 160 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -1843,7 +1883,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 227 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1855,7 +1895,7 @@ Rendiment del Dividend apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 198 + 199 @@ -1863,7 +1903,7 @@ Comissions apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -1873,9 +1913,13 @@ Activity Activitat + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 101 + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 231 + 232 @@ -1883,7 +1927,7 @@ Informar d’un Problema amb les Dades apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 462 + 464 @@ -1926,12 +1970,20 @@ 64 + + Split Ratio + Split Ratio + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 526 + + Fear Por apps/client/src/app/components/markets/markets.component.ts - 46 + 58 libs/ui/src/lib/i18n.ts @@ -1943,7 +1995,7 @@ Cobdícia apps/client/src/app/components/markets/markets.component.ts - 47 + 59 libs/ui/src/lib/i18n.ts @@ -1955,7 +2007,7 @@ Últims Dies apps/client/src/app/components/markets/markets.html - 17 + 24 @@ -2043,7 +2095,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 @@ -2063,7 +2115,7 @@ Import total apps/client/src/app/components/investment-chart/investment-chart.component.ts - 143 + 144 @@ -2071,7 +2123,7 @@ Code apps/client/src/app/components/admin-overview/admin-overview.html - 159 + 162 @@ -2079,7 +2131,7 @@ Taxa d’estalvi apps/client/src/app/components/investment-chart/investment-chart.component.ts - 201 + 193 @@ -2115,7 +2167,7 @@ o apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 167 + 168 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -2163,7 +2215,7 @@ Energy libs/ui/src/lib/i18n.ts - 94 + 95 @@ -2251,7 +2303,7 @@ Poder adquisitiu apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 196 + 256 @@ -2259,7 +2311,7 @@ Exclòs de l’anàlisi apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 270 + 286 @@ -2267,7 +2319,7 @@ Passius apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 298 + 315 apps/client/src/app/pages/features/features-page.html @@ -2279,7 +2331,7 @@ Valor net apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 320 + 337 @@ -2287,7 +2339,7 @@ Rendiment anualitzat apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 334 + 351 @@ -2295,7 +2347,7 @@ Definiu l’import del vostre fons d’emergència. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 135 + 145 @@ -2447,7 +2499,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 366 @@ -2455,11 +2507,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -2467,11 +2519,11 @@ 1 any apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -2487,11 +2539,11 @@ 5 anys apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -2507,11 +2559,11 @@ Màx apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 244 + 276 libs/ui/src/lib/assistant/assistant.component.ts - 415 + 416 @@ -2587,7 +2639,7 @@ Introduïu el vostre codi de cupó. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 214 + 203 @@ -2595,7 +2647,7 @@ No s’ha pogut bescanviar el codi de cupó apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 178 + 181 @@ -2603,7 +2655,7 @@ Consumer Defensive libs/ui/src/lib/i18n.ts - 93 + 94 @@ -2611,15 +2663,7 @@ El codi del cupó s’ha bescanviat apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 191 - - - - Reload - Torna a carregar - - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 194 @@ -2655,7 +2699,7 @@ Automàtic apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 74 + 77 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2667,7 +2711,7 @@ De debò vols tancar el teu compte de Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 229 + 244 @@ -2675,7 +2719,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 450 @@ -2683,7 +2727,7 @@ De debò vols eliminar aquest mètode d’inici de sessió? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 303 + 314 @@ -2691,7 +2735,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 134 + 129 @@ -2699,7 +2743,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 399 + 400 @@ -2707,7 +2751,7 @@ Ups! Hi ha hagut un error en configurar l’autenticació biomètrica. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 352 + 363 @@ -2715,7 +2759,7 @@ Utilities libs/ui/src/lib/i18n.ts - 101 + 102 @@ -2747,7 +2791,7 @@ Coupon apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 134 + 141 @@ -2771,7 +2815,7 @@ Localització apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 666 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2850,6 +2894,14 @@ 221 + + Investments + Investments + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 197 + + Biometric Authentication Autenticació biomètrica @@ -2967,7 +3019,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 244 @@ -2999,7 +3051,7 @@ libs/common/src/lib/routes/routes.ts - 240 + 235 @@ -3015,7 +3067,7 @@ libs/common/src/lib/routes/routes.ts - 205 + 200 @@ -3031,7 +3083,7 @@ libs/common/src/lib/routes/routes.ts - 213 + 208 @@ -3047,7 +3099,7 @@ libs/common/src/lib/routes/routes.ts - 229 + 224 @@ -3107,11 +3159,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 384 + 396 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 101 + 109 apps/client/src/app/pages/accounts/accounts-page.html @@ -3131,7 +3183,7 @@ Vaja, la transferència del saldo en efectiu ha fallat. apps/client/src/app/pages/accounts/accounts-page.component.ts - 358 + 355 @@ -3155,7 +3207,7 @@ ID del compte apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 103 + 98 @@ -3163,7 +3215,7 @@ Financial Planning libs/ui/src/lib/i18n.ts - 108 + 109 @@ -3223,7 +3275,7 @@ Dades de mercat apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 406 + 418 libs/common/src/lib/routes/routes.ts @@ -3261,9 +3313,13 @@ Overview Visió general + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 42 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 115 apps/client/src/app/components/header/header.component.html @@ -3275,7 +3331,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 47 + 48 apps/client/src/app/pages/admin/admin-page.component.ts @@ -3287,11 +3343,11 @@ libs/common/src/lib/routes/routes.ts - 113 + 108 libs/common/src/lib/routes/routes.ts - 190 + 185 @@ -3403,7 +3459,7 @@ libs/common/src/lib/routes/routes.ts - 245 + 240 @@ -3411,11 +3467,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 589 + 672 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 592 + 675 @@ -3431,7 +3487,7 @@ Com que ja has iniciat sessió, no pots accedir al compte de demostració. apps/client/src/app/pages/demo/demo-page.component.ts - 33 + 32 @@ -3447,7 +3503,7 @@ Duration apps/client/src/app/components/admin-overview/admin-overview.html - 172 + 175 @@ -3467,7 +3523,7 @@ libs/common/src/lib/routes/routes.ts - 271 + 266 @@ -3487,7 +3543,7 @@ libs/common/src/lib/routes/routes.ts - 260 + 255 @@ -3499,7 +3555,7 @@ libs/common/src/lib/routes/routes.ts - 268 + 263 @@ -3508,11 +3564,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 263 + 258 libs/common/src/lib/routes/routes.ts - 266 + 261 @@ -3664,11 +3720,11 @@ Creation apps/client/src/app/components/admin-overview/admin-overview.html - 185 + 188 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 150 + 158 @@ -3676,7 +3732,7 @@ Explotacions apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 100 + 127 apps/client/src/app/components/home-holdings/home-holdings.html @@ -3684,7 +3740,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 168 apps/client/src/app/pages/public/public-page.html @@ -3696,7 +3752,7 @@ libs/common/src/lib/routes/routes.ts - 187 + 182 libs/ui/src/lib/assistant/assistant.html @@ -3720,7 +3776,7 @@ libs/common/src/lib/routes/routes.ts - 105 + 100 @@ -3728,7 +3784,7 @@ Mercats apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 403 + 404 apps/client/src/app/components/footer/footer.component.html @@ -3738,10 +3794,6 @@ apps/client/src/app/components/header/header.component.html 408 - - apps/client/src/app/components/home-market/home-market.html - 2 - apps/client/src/app/components/markets/markets.html 2 @@ -3760,15 +3812,11 @@ libs/common/src/lib/routes/routes.ts - 100 - - - libs/common/src/lib/routes/routes.ts - 281 + 276 libs/common/src/lib/routes/routes.ts - 329 + 324 @@ -3912,7 +3960,7 @@ Basic Materials libs/ui/src/lib/i18n.ts - 90 + 91 @@ -3939,6 +3987,14 @@ 84 + + Do you really want to delete these activities? + Do you really want to delete these activities? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 334 + + Why Ghostfolio? Per què Ghostfolio? @@ -4040,7 +4096,7 @@ Oops! Could not delete the asset profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 52 + 56 @@ -4112,7 +4168,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 139 + 134 @@ -4188,7 +4244,7 @@ Convert to apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 174 + 175 @@ -4264,15 +4320,15 @@ Activitats apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 84 + 103 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 111 + 138 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 244 + 245 apps/client/src/app/components/admin-overview/admin-overview.html @@ -4288,15 +4344,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 233 + 234 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 350 + 362 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 110 + 118 apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -4304,7 +4360,7 @@ libs/common/src/lib/routes/routes.ts - 149 + 144 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -4388,7 +4444,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 237 + 251 @@ -4400,11 +4456,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 30 libs/ui/src/lib/activities-table/activities-table.component.html - 406 + 420 @@ -4416,11 +4472,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 52 + 54 libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 434 @@ -4523,6 +4579,14 @@ 118 + + Shares After + Shares After + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 584 + + Back Enrere @@ -4540,7 +4604,7 @@ Price apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 176 + 184 @@ -4548,7 +4612,7 @@ Do you really want to convert this asset profile to ()? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 723 + 806 @@ -4564,7 +4628,7 @@ libs/common/src/lib/routes/routes.ts - 154 + 149 @@ -4648,16 +4712,12 @@ Trial apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 133 + 140 Exclude from Analysis Excluir de l’anàlisi - - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 97 - libs/ui/src/lib/i18n.ts 22 @@ -4756,7 +4816,7 @@ libs/common/src/lib/routes/routes.ts - 159 + 154 @@ -4772,15 +4832,15 @@ Dividend apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 79 + 91 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 188 + 189 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 419 + 437 apps/client/src/app/pages/features/features-page.html @@ -4802,18 +4862,6 @@ Investment Inversió - - apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 173 - - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 60 - - - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 85 - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 101 @@ -4852,7 +4900,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 449 + 451 @@ -4988,7 +5036,7 @@ libs/common/src/lib/routes/routes.ts - 291 + 286 @@ -5028,7 +5076,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 248 @@ -5140,7 +5188,7 @@ Expiration apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 209 + 217 @@ -5164,11 +5212,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 758 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 678 + 761 @@ -5228,7 +5276,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 296 @@ -5260,7 +5308,7 @@ libs/common/src/lib/routes/routes.ts - 349 + 344 @@ -5269,11 +5317,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 340 + 335 libs/common/src/lib/routes/routes.ts - 344 + 339 @@ -5308,6 +5356,14 @@ 43 + + Data gathering has been started. + Data gathering has been started. + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 413 + + Global Global @@ -5397,7 +5453,7 @@ Coupon has been created apps/client/src/app/components/admin-overview/admin-overview.component.ts - 224 + 229 @@ -5537,7 +5593,7 @@ Stock Tracking libs/ui/src/lib/i18n.ts - 111 + 112 @@ -5561,7 +5617,7 @@ Web libs/ui/src/lib/i18n.ts - 120 + 121 @@ -5593,7 +5649,7 @@ libs/common/src/lib/routes/routes.ts - 352 + 347 @@ -5601,7 +5657,7 @@ Pertinença apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 78 + 82 libs/common/src/lib/routes/routes.ts @@ -5677,11 +5733,11 @@ Activitats d’exportació libs/ui/src/lib/activities-table/activities-table.component.html - 64 + 72 libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 448 @@ -5689,11 +5745,11 @@ Exporta esborranys com a ICS libs/ui/src/lib/activities-table/activities-table.component.html - 77 + 86 libs/ui/src/lib/activities-table/activities-table.component.html - 447 + 461 @@ -5701,7 +5757,7 @@ Suprimeix les activitats libs/ui/src/lib/activities-table/activities-table.component.html - 92 + 105 @@ -5709,7 +5765,7 @@ Esborrany libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 181 @@ -5717,7 +5773,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 492 + 506 @@ -5725,15 +5781,7 @@ Exporta l’esborrany com a ICS libs/ui/src/lib/activities-table/activities-table.component.html - 502 - - - - Do you really want to delete these activities? - De veritat vols suprimir aquestes activitats? - - libs/ui/src/lib/activities-table/activities-table.component.ts - 317 + 516 @@ -5741,7 +5789,11 @@ Realment vols suprimir aquesta activitat? libs/ui/src/lib/activities-table/activities-table.component.ts - 327 + 333 + + + libs/ui/src/lib/activities-table/activities-table.component.ts + 344 @@ -5749,7 +5801,7 @@ Setmana fins avui libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -5757,11 +5809,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -5769,7 +5821,7 @@ Mes fins a la data libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -5777,11 +5829,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -5797,7 +5849,7 @@ Any fins a la data libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -5805,7 +5857,7 @@ any apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5817,7 +5869,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -5825,11 +5877,11 @@ anys apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -5837,7 +5889,7 @@ Perfils d’actius apps/client/src/app/components/admin-settings/admin-settings.component.html - 123 + 128 libs/ui/src/lib/assistant/assistant.html @@ -5993,11 +6045,11 @@ Interès apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 67 + 79 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 406 + 424 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -6061,7 +6113,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 335 + 349 libs/ui/src/lib/i18n.ts @@ -6089,15 +6141,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 254 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 349 + 350 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 244 + 245 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -6121,15 +6173,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 262 + 263 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 365 + 366 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 253 + 254 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -6177,15 +6229,15 @@ Fons d’emergència apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 254 + 270 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 356 + 373 apps/client/src/app/pages/features/features-page.html @@ -6253,7 +6305,7 @@ libs/ui/src/lib/i18n.ts - 98 + 99 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -6281,7 +6333,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 148 @@ -6321,7 +6373,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 186 + 187 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6329,13 +6381,21 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 322 + 323 libs/ui/src/lib/i18n.ts 35 + + Export + Export + + libs/ui/src/lib/activities-table/activities-table.component.html + 68 + + Tag Etiqueta @@ -6405,7 +6465,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 275 libs/ui/src/lib/i18n.ts @@ -6445,7 +6505,7 @@ Efectiu apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 168 + 227 libs/ui/src/lib/i18n.ts @@ -6465,7 +6525,7 @@ Patrimoni apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 55 + 67 libs/ui/src/lib/i18n.ts @@ -6497,7 +6557,7 @@ libs/ui/src/lib/i18n.ts - 99 + 100 @@ -6505,7 +6565,7 @@ Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 65 + 67 @@ -6585,7 +6645,7 @@ Communication Services libs/ui/src/lib/i18n.ts - 91 + 92 @@ -6620,6 +6680,22 @@ 79 + + Invested Capital + Invested Capital + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 174 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 85 + + South America Amèrica del Sud @@ -6729,7 +6805,7 @@ Pressupost libs/ui/src/lib/i18n.ts - 104 + 105 @@ -6797,7 +6873,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 51 + 55 @@ -6805,7 +6881,7 @@ Oficina familiar libs/ui/src/lib/i18n.ts - 107 + 108 @@ -6885,7 +6961,7 @@ Wealth Management libs/ui/src/lib/i18n.ts - 113 + 114 @@ -6893,7 +6969,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 487 @@ -6901,7 +6977,7 @@ Do you really want to delete these asset profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 67 + 72 @@ -6909,7 +6985,7 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 757 + 841 @@ -6949,11 +7025,11 @@ Cancel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 162 + 163 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 753 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6977,7 +7053,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 112 + 107 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7005,7 +7081,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 636 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7037,11 +7113,11 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 244 + 252 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 114 + 109 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7057,7 +7133,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 44 + 45 @@ -7081,7 +7157,7 @@ Tax Reporting libs/ui/src/lib/i18n.ts - 112 + 113 @@ -7097,7 +7173,7 @@ Change with currency effect Change apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 63 + 64 @@ -7113,7 +7189,7 @@ Performance with currency effect Performance apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 83 + 84 @@ -7161,7 +7237,7 @@ has been copied to the clipboard apps/client/src/app/components/admin-overview/admin-overview.component.ts - 223 + 228 libs/ui/src/lib/value/value.component.ts @@ -7229,7 +7305,7 @@ Financial Services libs/ui/src/lib/i18n.ts - 95 + 96 @@ -7259,6 +7335,10 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 270 + + libs/ui/src/lib/activities-table/activities-table.component.html + 101 + cannot be self-hosted @@ -7284,6 +7364,14 @@ 278 + + Shares Before + Shares Before + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 597 + + cannot be used anonymously cannot be used anonymously @@ -7313,7 +7401,7 @@ Dividend Tracking libs/ui/src/lib/i18n.ts - 105 + 106 @@ -7357,7 +7445,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 188 + 197 @@ -7373,7 +7461,7 @@ Investment Research libs/ui/src/lib/i18n.ts - 109 + 110 @@ -7397,7 +7485,7 @@ libs/common/src/lib/routes/routes.ts - 313 + 308 @@ -7413,7 +7501,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 316 @@ -7422,11 +7510,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 316 + 311 libs/common/src/lib/routes/routes.ts - 319 + 314 @@ -7435,11 +7523,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 308 + 303 libs/common/src/lib/routes/routes.ts - 311 + 306 @@ -7463,7 +7551,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 152 + 157 @@ -7471,7 +7559,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 154 + 159 @@ -7479,7 +7567,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 178 + 187 @@ -7487,7 +7575,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 143 + 144 @@ -7507,7 +7595,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 141 @@ -7579,7 +7667,7 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 645 + 764 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7599,7 +7687,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 133 + 143 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7611,7 +7699,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 123 + 118 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7655,7 +7743,7 @@ Net Worth Tracking libs/ui/src/lib/i18n.ts - 110 + 111 @@ -7663,7 +7751,7 @@ Please enter your Ghostfolio API key. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 162 + 163 @@ -7695,7 +7783,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7703,7 +7791,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7711,7 +7799,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 638 @@ -7719,7 +7807,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 556 + 675 @@ -7727,7 +7815,7 @@ Do you really want to convert the data source to ? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 485 + 525 @@ -7735,7 +7823,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 572 + 691 @@ -7743,7 +7831,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 651 @@ -7751,7 +7839,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7759,7 +7847,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7775,7 +7863,7 @@ Create libs/ui/src/lib/tags-selector/tags-selector.component.html - 64 + 62 @@ -7940,11 +8028,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 232 + 227 libs/common/src/lib/routes/routes.ts - 235 + 230 @@ -7956,7 +8044,7 @@ libs/common/src/lib/routes/routes.ts - 237 + 232 @@ -7972,7 +8060,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 718 + 801 @@ -7980,7 +8068,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 721 + 804 @@ -7988,7 +8076,7 @@ Apply apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 155 @@ -8068,7 +8156,7 @@ libs/common/src/lib/routes/routes.ts - 110 + 105 @@ -8079,6 +8167,18 @@ 142 + + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 102 + + Log out Log out @@ -8090,13 +8190,9 @@ Calculations are based on delayed market data and may not be displayed in real-time. Calculations are based on delayed market data and may not be displayed in real-time. - - apps/client/src/app/components/home-market/home-market.html - 28 - apps/client/src/app/components/markets/markets.html - 54 + 64 @@ -8105,11 +8201,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 200 + 195 libs/common/src/lib/routes/routes.ts - 203 + 198 @@ -8117,7 +8213,7 @@ ETF Tracking libs/ui/src/lib/i18n.ts - 106 + 107 @@ -8125,7 +8221,7 @@ Demo user account has been synced. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 323 + 334 @@ -8133,7 +8229,7 @@ Sync Demo User Account apps/client/src/app/components/admin-overview/admin-overview.html - 128 + 131 @@ -8205,7 +8301,7 @@ libs/common/src/lib/routes/routes.ts - 251 + 246 @@ -8213,7 +8309,7 @@ Open Source Alternative to libs/common/src/lib/routes/routes.ts - 346 + 341 @@ -8246,15 +8342,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 332 + 327 libs/common/src/lib/routes/routes.ts - 335 + 330 libs/common/src/lib/routes/routes.ts - 343 + 338 @@ -8263,11 +8359,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 324 + 319 libs/common/src/lib/routes/routes.ts - 327 + 322 @@ -8347,7 +8443,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 @@ -8492,11 +8588,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 356 + 351 libs/common/src/lib/routes/routes.ts - 357 + 352 @@ -8528,7 +8624,7 @@ Stocks apps/client/src/app/components/markets/markets.component.ts - 51 + 54 apps/client/src/app/pages/features/features-page.html @@ -8540,7 +8636,7 @@ Cryptocurrencies apps/client/src/app/components/markets/markets.component.ts - 52 + 55 apps/client/src/app/pages/features/features-page.html @@ -8552,7 +8648,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 479 @@ -8580,7 +8676,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 101 + 102 @@ -8984,7 +9080,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 56 + 58 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index ca976d3ae..06b0a7d49 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -58,7 +58,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 166 + 174 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -66,11 +66,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 5 + 7 libs/ui/src/lib/activities-table/activities-table.component.html - 183 + 197 @@ -114,7 +114,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 332 + 333 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -150,7 +150,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 161 + 175 libs/ui/src/lib/benchmark/benchmark.component.html @@ -210,11 +210,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 284 + 298 libs/ui/src/lib/activities-table/activities-table.component.html - 320 + 334 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -254,7 +254,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 483 + 497 @@ -270,7 +270,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 235 + 238 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -280,6 +280,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 100 + + apps/client/src/app/components/admin-users/admin-users.html + 254 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 27 @@ -294,7 +298,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 513 + 527 libs/ui/src/lib/benchmark/benchmark.component.html @@ -314,7 +318,7 @@ Bezahlt apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 129 + 136 @@ -338,7 +342,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 198 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -349,6 +353,14 @@ 20 + + Unknown + Unbekannt + + libs/ui/src/lib/i18n.ts + 88 + + Attempts Versuche @@ -398,7 +410,7 @@ Anlageprofile apps/client/src/app/components/admin-settings/admin-settings.component.html - 123 + 128 libs/ui/src/lib/assistant/assistant.html @@ -414,7 +426,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 486 + 487 @@ -425,6 +437,14 @@ 208 + + Splits + Splits + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 512 + + View Stacktrace Stacktrace anzeigen @@ -454,12 +474,20 @@ Finde ein Konto... libs/ui/src/lib/assistant/assistant.component.ts - 447 + 448 Date Datum + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 521 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 560 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 156 @@ -470,7 +498,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 206 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -494,7 +522,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 113 + 114 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -510,11 +538,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 235 + 236 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 221 + 222 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -538,7 +566,7 @@ Möchtest du diesen Gutscheincode wirklich löschen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 242 + 247 @@ -546,7 +574,7 @@ Möchtest du den Cache wirklich leeren? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 279 + 290 @@ -554,7 +582,7 @@ Bitte gebe deine Systemmeldung ein: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 299 + 310 @@ -562,7 +590,7 @@ pro Benutzer apps/client/src/app/components/admin-overview/admin-overview.component.ts - 178 + 181 @@ -606,7 +634,7 @@ Systemmeldung apps/client/src/app/components/admin-overview/admin-overview.html - 88 + 89 @@ -614,7 +642,7 @@ Systemmeldung setzen apps/client/src/app/components/admin-overview/admin-overview.html - 110 + 113 @@ -622,7 +650,7 @@ Lese-Modus apps/client/src/app/components/admin-overview/admin-overview.html - 64 + 63 @@ -630,15 +658,19 @@ Gutscheincodes apps/client/src/app/components/admin-overview/admin-overview.html - 148 + 151 Add Hinzufügen + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 615 + apps/client/src/app/components/admin-overview/admin-overview.html - 298 + 301 libs/ui/src/lib/account-balances/account-balances.component.html @@ -650,7 +682,7 @@ Verwaltung apps/client/src/app/components/admin-overview/admin-overview.html - 117 + 120 @@ -658,7 +690,7 @@ Cache leeren apps/client/src/app/components/admin-overview/admin-overview.html - 133 + 136 @@ -702,7 +734,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 124 + 132 @@ -717,8 +749,8 @@ Current Market Mood Aktuelle Marktstimmung - apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html - 12 + libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html + 23 @@ -770,11 +802,11 @@ Erstellung apps/client/src/app/components/admin-overview/admin-overview.html - 185 + 188 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 150 + 158 @@ -810,7 +842,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 215 + 230 @@ -821,12 +853,20 @@ 64 + + Split Ratio + Split-Verhältnis + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 526 + + Last Days Letzte Tage apps/client/src/app/components/markets/markets.html - 17 + 24 @@ -862,7 +902,7 @@ oder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 167 + 168 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -910,7 +950,7 @@ Energie libs/ui/src/lib/i18n.ts - 94 + 95 @@ -974,7 +1014,7 @@ Kaufkraft apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 196 + 256 @@ -982,7 +1022,7 @@ Gesamtvermögen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 320 + 337 @@ -990,7 +1030,7 @@ Performance pro Jahr apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 334 + 351 @@ -998,7 +1038,7 @@ Bitte setze den Betrag deines Notfallfonds. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 135 + 145 @@ -1006,15 +1046,15 @@ Sektoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 301 + 302 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 421 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 290 + 291 apps/client/src/app/pages/public/public-page.html @@ -1026,15 +1066,15 @@ Länder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 312 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 431 + 432 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 302 + 303 @@ -1042,7 +1082,7 @@ Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 218 + 227 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1050,7 +1090,7 @@ libs/ui/src/lib/tags-selector/tags-selector.component.html - 25 + 23 @@ -1058,7 +1098,7 @@ Datenfehler melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 462 + 464 @@ -1106,7 +1146,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 366 @@ -1114,11 +1154,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -1126,11 +1166,11 @@ 1J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -1146,11 +1186,11 @@ 5J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -1166,11 +1206,11 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 244 + 276 libs/ui/src/lib/assistant/assistant.component.ts - 415 + 416 @@ -1206,7 +1246,7 @@ libs/common/src/lib/routes/routes.ts - 240 + 235 @@ -1222,7 +1262,7 @@ libs/common/src/lib/routes/routes.ts - 229 + 224 @@ -1242,7 +1282,7 @@ Bitte gebe deinen Gutscheincode ein. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 214 + 203 @@ -1250,7 +1290,7 @@ Gutscheincode konnte nicht eingelöst werden apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 178 + 181 @@ -1258,7 +1298,7 @@ Defensive Konsumgüter libs/ui/src/lib/i18n.ts - 93 + 94 @@ -1266,15 +1306,7 @@ Gutscheincode wurde eingelöst apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 191 - - - - Reload - Neu laden - - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 194 @@ -1282,7 +1314,7 @@ Möchtest du diese Anmeldemethode wirklich löschen? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 303 + 314 @@ -1318,7 +1350,7 @@ Versorgungsbetriebe libs/ui/src/lib/i18n.ts - 101 + 102 @@ -1342,7 +1374,7 @@ Gutschein apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 134 + 141 @@ -1350,7 +1382,7 @@ Lokalität apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 666 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1462,11 +1494,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 384 + 396 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 101 + 109 apps/client/src/app/pages/accounts/accounts-page.html @@ -1510,11 +1542,11 @@ Währung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 216 + 217 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 339 + 340 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1534,7 +1566,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 303 + 317 @@ -1542,7 +1574,7 @@ Cash-Bestand apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 43 + 55 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1558,7 +1590,7 @@ Plattform apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 113 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1574,7 +1606,7 @@ Konto ID apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 103 + 98 @@ -1582,7 +1614,7 @@ Finanzplanung libs/ui/src/lib/i18n.ts - 108 + 109 @@ -1710,7 +1742,7 @@ libs/common/src/lib/routes/routes.ts - 245 + 240 @@ -1718,7 +1750,7 @@ Da du bereits eingeloggt bist, kannst du nicht auf die Live Demo zugreifen. apps/client/src/app/pages/demo/demo-page.component.ts - 33 + 32 @@ -1734,7 +1766,7 @@ Dauer apps/client/src/app/components/admin-overview/admin-overview.html - 172 + 175 @@ -1754,7 +1786,15 @@ libs/common/src/lib/routes/routes.ts - 271 + 266 + + + + Invalid API key + Ungültiger API-Schlüssel + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 112 @@ -1774,15 +1814,19 @@ libs/common/src/lib/routes/routes.ts - 276 + 271 Overview Übersicht + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 42 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 115 apps/client/src/app/components/header/header.component.html @@ -1794,7 +1838,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 47 + 48 apps/client/src/app/pages/admin/admin-page.component.ts @@ -1806,11 +1850,11 @@ libs/common/src/lib/routes/routes.ts - 113 + 108 libs/common/src/lib/routes/routes.ts - 190 + 185 @@ -1818,7 +1862,7 @@ Märkte apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 403 + 404 apps/client/src/app/components/footer/footer.component.html @@ -1828,10 +1872,6 @@ apps/client/src/app/components/header/header.component.html 408 - - apps/client/src/app/components/home-market/home-market.html - 2 - apps/client/src/app/components/markets/markets.html 2 @@ -1850,15 +1890,11 @@ libs/common/src/lib/routes/routes.ts - 100 - - - libs/common/src/lib/routes/routes.ts - 281 + 276 libs/common/src/lib/routes/routes.ts - 329 + 324 @@ -1874,7 +1910,7 @@ libs/common/src/lib/routes/routes.ts - 154 + 149 @@ -1950,7 +1986,7 @@ Testphase apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 133 + 140 @@ -1962,7 +1998,7 @@ libs/common/src/lib/routes/routes.ts - 159 + 154 @@ -2010,7 +2046,7 @@ Positionen apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 100 + 127 apps/client/src/app/components/home-holdings/home-holdings.html @@ -2018,7 +2054,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 168 apps/client/src/app/pages/public/public-page.html @@ -2030,7 +2066,7 @@ libs/common/src/lib/routes/routes.ts - 187 + 182 libs/ui/src/lib/assistant/assistant.html @@ -2050,7 +2086,7 @@ Aktuelle Woche apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 @@ -2082,7 +2118,7 @@ Name, Symbol oder ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 133 + 134 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2102,7 +2138,7 @@ Zyklische Konsumgüter libs/ui/src/lib/i18n.ts - 92 + 93 @@ -2110,7 +2146,7 @@ Anzahl apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 159 + 160 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -2118,7 +2154,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 227 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2134,7 +2170,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 237 + 251 @@ -2142,7 +2178,7 @@ Kommentar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 455 + 456 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2158,7 +2194,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 370 + 384 @@ -2166,15 +2202,15 @@ Aktivitäten apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 84 + 103 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 111 + 138 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 244 + 245 apps/client/src/app/components/admin-overview/admin-overview.html @@ -2190,15 +2226,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 233 + 234 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 350 + 362 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 110 + 118 apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -2206,7 +2242,7 @@ libs/common/src/lib/routes/routes.ts - 149 + 144 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2266,7 +2302,7 @@ libs/common/src/lib/routes/routes.ts - 291 + 286 @@ -2274,7 +2310,7 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 139 + 140 apps/client/src/app/components/header/header.component.html @@ -2290,7 +2326,7 @@ libs/common/src/lib/routes/routes.ts - 172 + 167 @@ -2326,7 +2362,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 296 @@ -2370,7 +2406,7 @@ libs/common/src/lib/routes/routes.ts - 352 + 347 @@ -2402,7 +2438,7 @@ Geplant libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 181 @@ -2414,11 +2450,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 30 libs/ui/src/lib/activities-table/activities-table.component.html - 406 + 420 @@ -2426,11 +2462,11 @@ Aktivitäten exportieren libs/ui/src/lib/activities-table/activities-table.component.html - 64 + 72 libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 448 @@ -2438,11 +2474,11 @@ Geplante Aktivitäten als ICS exportieren libs/ui/src/lib/activities-table/activities-table.component.html - 77 + 86 libs/ui/src/lib/activities-table/activities-table.component.html - 447 + 461 @@ -2450,7 +2486,7 @@ Kopieren libs/ui/src/lib/activities-table/activities-table.component.html - 492 + 506 @@ -2458,7 +2494,7 @@ Geplante Aktivität als ICS exportieren libs/ui/src/lib/activities-table/activities-table.component.html - 502 + 516 @@ -2466,7 +2502,11 @@ Möchtest du diese Aktivität wirklich löschen? libs/ui/src/lib/activities-table/activities-table.component.ts - 327 + 333 + + + libs/ui/src/lib/activities-table/activities-table.component.ts + 344 @@ -2566,7 +2606,7 @@ Minimum Preis apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 131 + 132 @@ -2574,7 +2614,7 @@ Maximum Preis apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 149 + 150 @@ -2590,11 +2630,11 @@ Sektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 280 + 281 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 270 + 271 @@ -2602,7 +2642,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 296 apps/client/src/app/components/admin-users/admin-users.html @@ -2610,20 +2650,16 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 284 + 285 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 88 + 96 Exclude from Analysis Aus Analyse ausschliessen - - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 97 - libs/ui/src/lib/i18n.ts 22 @@ -2702,11 +2738,11 @@ Verzinsung apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 67 + 79 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 406 + 424 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2754,7 +2790,7 @@ Verlauf der Mitgliedschaft apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 141 + 149 @@ -2762,7 +2798,7 @@ Angst apps/client/src/app/components/markets/markets.component.ts - 46 + 58 libs/ui/src/lib/i18n.ts @@ -2774,7 +2810,7 @@ Gier apps/client/src/app/components/markets/markets.component.ts - 47 + 59 libs/ui/src/lib/i18n.ts @@ -2786,7 +2822,7 @@ Filtern nach... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 365 + 377 @@ -2822,11 +2858,11 @@ Das Formular konnte nicht validiert werden apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 641 + 724 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 644 + 727 @@ -2842,11 +2878,11 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 401 + 402 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 151 + 152 @@ -2862,7 +2898,7 @@ Von der Analyse ausgenommen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 270 + 286 @@ -2870,7 +2906,7 @@ Automatisch apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 74 + 77 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2926,7 +2962,7 @@ Gesamtbetrag apps/client/src/app/components/investment-chart/investment-chart.component.ts - 143 + 144 @@ -2942,7 +2978,7 @@ Code apps/client/src/app/components/admin-overview/admin-overview.html - 159 + 162 @@ -2950,7 +2986,7 @@ Sparrate apps/client/src/app/components/investment-chart/investment-chart.component.ts - 201 + 193 @@ -2962,7 +2998,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 335 + 349 libs/ui/src/lib/i18n.ts @@ -2982,15 +3018,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 254 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 349 + 350 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 244 + 245 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -3018,7 +3054,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 186 + 187 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3026,13 +3062,21 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 322 + 323 libs/ui/src/lib/i18n.ts 35 + + Export + exportieren + + libs/ui/src/lib/activities-table/activities-table.component.html + 68 + + Tag Tag @@ -3050,7 +3094,7 @@ Bargeld apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 168 + 227 libs/ui/src/lib/i18n.ts @@ -3070,7 +3114,7 @@ Beteiligungskapital apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 55 + 67 libs/ui/src/lib/i18n.ts @@ -3094,7 +3138,7 @@ libs/ui/src/lib/i18n.ts - 99 + 100 @@ -3102,7 +3146,7 @@ Authentifizierung apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 65 + 67 @@ -3166,15 +3210,15 @@ Notfallfonds apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 254 + 270 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 356 + 373 apps/client/src/app/pages/features/features-page.html @@ -3194,7 +3238,7 @@ libs/ui/src/lib/i18n.ts - 98 + 99 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -3258,7 +3302,7 @@ Kommunikationsdienste libs/ui/src/lib/i18n.ts - 91 + 92 @@ -3285,6 +3329,22 @@ 79 + + Invested Capital + Investiertes Kapital + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 174 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 85 + + South America Südamerika @@ -3318,7 +3378,7 @@ Preis apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 176 + 184 @@ -3326,7 +3386,7 @@ Möchtest du dieses Anlageprofil wirklich in () umwandeln? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 723 + 806 @@ -3334,7 +3394,7 @@ Häufigkeit der Datensynchronisierung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 467 + 468 @@ -3358,7 +3418,7 @@ Symbol Zuordnung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 410 @@ -3382,15 +3442,15 @@ Dividenden apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 79 + 91 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 188 + 189 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 419 + 437 apps/client/src/app/pages/features/features-page.html @@ -3418,15 +3478,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 262 + 263 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 365 + 366 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 253 + 254 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -3474,7 +3534,7 @@ Marktdaten apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 406 + 418 libs/common/src/lib/routes/routes.ts @@ -3510,7 +3570,7 @@ libs/common/src/lib/routes/routes.ts - 105 + 100 @@ -3550,11 +3610,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 52 + 54 libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 434 @@ -3606,7 +3666,7 @@ Keine Aktivitäten apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 148 @@ -3649,6 +3709,14 @@ 221 + + Investments + Investitionen + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 197 + + Sneak peek at upcoming functionality Vorschau auf kommende Funktionalität @@ -3790,7 +3858,7 @@ Stündlich apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 248 @@ -3882,7 +3950,7 @@ Ablauf apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 209 + 217 @@ -3898,11 +3966,11 @@ Das Anlageprofil konnte nicht gespeichert werden apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 758 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 678 + 761 @@ -3918,7 +3986,7 @@ Gebühren apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -4081,22 +4149,6 @@ 228 - - Delete User - Benutzer löschen - - apps/client/src/app/components/admin-users/admin-users.html - 254 - - - - Do you really want to delete these activities? - Möchtest du diese Aktivitäten wirklich löschen? - - libs/ui/src/lib/activities-table/activities-table.component.ts - 317 - - By ETF Provider Nach ETF-Anbieter @@ -4126,7 +4178,7 @@ Aktuelles Jahr apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 @@ -4137,16 +4189,24 @@ 10 + + Cache has been flushed. + Der Cache wurde geleert. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 281 + + Url Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 443 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 707 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4162,7 +4222,7 @@ Das Anlageprofil wurde gespeichert apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 665 + 748 @@ -4178,7 +4238,7 @@ Plattformen apps/client/src/app/components/admin-settings/admin-settings.component.html - 212 + 221 @@ -4285,6 +4345,14 @@ 118 + + Shares After + Anteile nachher + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 584 + + Frequently Asked Questions (FAQ) Häufig gestellte Fragen (FAQ) @@ -4366,7 +4434,7 @@ Verbindlichkeiten apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 298 + 315 apps/client/src/app/pages/features/features-page.html @@ -4386,7 +4454,7 @@ libs/common/src/lib/routes/routes.ts - 205 + 200 @@ -4402,7 +4470,7 @@ libs/common/src/lib/routes/routes.ts - 213 + 208 @@ -4522,7 +4590,7 @@ Aktivität bearbeiten libs/common/src/lib/routes/routes.ts - 146 + 141 @@ -4530,7 +4598,7 @@ Technologie libs/ui/src/lib/i18n.ts - 100 + 101 @@ -4546,7 +4614,7 @@ Gesamt apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 160 + 168 @@ -4554,7 +4622,7 @@ Scraper Konfiguration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 509 + 628 @@ -4574,7 +4642,7 @@ libs/common/src/lib/routes/routes.ts - 349 + 344 @@ -4622,7 +4690,7 @@ Gutschein wurde erstellt apps/client/src/app/components/admin-overview/admin-overview.component.ts - 224 + 229 @@ -4750,7 +4818,7 @@ Web libs/ui/src/lib/i18n.ts - 120 + 121 @@ -4830,7 +4898,7 @@ ETFs ohne Länder apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 138 @@ -4838,7 +4906,7 @@ ETFs ohne Sektoren apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 143 @@ -4846,7 +4914,7 @@ Beim Umwandeln der Datenquelle in ist ein Fehler aufgetreten. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 482 + 522 @@ -5066,7 +5134,7 @@ Währungen apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 133 apps/client/src/app/pages/public/public-page.html @@ -5118,11 +5186,11 @@ Die Scraper Konfiguration konnte nicht geparsed werden apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 589 + 672 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 592 + 675 @@ -5218,7 +5286,7 @@ Grundstoffe libs/ui/src/lib/i18n.ts - 90 + 91 @@ -5245,6 +5313,14 @@ 84 + + Do you really want to delete these activities? + Möchtest du diese Aktivitäten wirklich löschen? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 334 + + Why Ghostfolio? Warum Ghostfolio? @@ -5346,7 +5422,7 @@ Ups! Die Anlageprofile konnten nicht gelöscht werden. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 52 + 56 @@ -5402,7 +5478,7 @@ Aktivität hinzufügen libs/common/src/lib/routes/routes.ts - 139 + 134 @@ -5451,19 +5527,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 249 libs/common/src/lib/routes/routes.ts - 255 + 250 libs/common/src/lib/routes/routes.ts - 259 + 254 libs/common/src/lib/routes/routes.ts - 265 + 260 @@ -5472,11 +5548,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 274 + 269 libs/common/src/lib/routes/routes.ts - 275 + 270 @@ -5485,31 +5561,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 196 + 191 libs/common/src/lib/routes/routes.ts - 197 + 192 libs/common/src/lib/routes/routes.ts - 202 + 197 libs/common/src/lib/routes/routes.ts - 210 + 205 libs/common/src/lib/routes/routes.ts - 218 + 213 libs/common/src/lib/routes/routes.ts - 226 + 221 libs/common/src/lib/routes/routes.ts - 234 + 229 @@ -5518,11 +5594,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 224 + 219 libs/common/src/lib/routes/routes.ts - 227 + 222 @@ -5531,11 +5607,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 208 + 203 libs/common/src/lib/routes/routes.ts - 211 + 206 @@ -5544,11 +5620,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 279 + 274 libs/common/src/lib/routes/routes.ts - 280 + 275 @@ -5557,11 +5633,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 289 + 284 libs/common/src/lib/routes/routes.ts - 290 + 285 @@ -5570,11 +5646,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 299 + 294 libs/common/src/lib/routes/routes.ts - 300 + 295 @@ -5583,31 +5659,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 299 libs/common/src/lib/routes/routes.ts - 305 + 300 libs/common/src/lib/routes/routes.ts - 310 + 305 libs/common/src/lib/routes/routes.ts - 318 + 313 libs/common/src/lib/routes/routes.ts - 326 + 321 libs/common/src/lib/routes/routes.ts - 334 + 329 libs/common/src/lib/routes/routes.ts - 342 + 337 @@ -5672,11 +5748,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 340 + 335 libs/common/src/lib/routes/routes.ts - 344 + 339 @@ -5684,7 +5760,7 @@ Aktien-Tracking libs/ui/src/lib/i18n.ts - 111 + 112 @@ -5703,6 +5779,14 @@ 369 + + Data gathering has been started. + Finanzmarktdaten synchronisieren wurde gestartet. + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 413 + + Global Weltweit @@ -5744,7 +5828,7 @@ In umwandeln apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 174 + 175 @@ -5816,7 +5900,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 275 libs/ui/src/lib/i18n.ts @@ -5912,7 +5996,7 @@ Mitgliedschaft apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 78 + 82 libs/common/src/lib/routes/routes.ts @@ -5952,11 +6036,11 @@ Möchtest du dieses Anlageprofil wirklich löschen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 28 + 29 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 66 + 71 @@ -5972,7 +6056,7 @@ Industrie libs/ui/src/lib/i18n.ts - 97 + 98 @@ -6028,7 +6112,7 @@ Ups, der Cash-Bestand Transfer ist fehlgeschlagen. apps/client/src/app/pages/accounts/accounts-page.component.ts - 358 + 355 @@ -6068,7 +6152,7 @@ Gesundheitswesen libs/ui/src/lib/i18n.ts - 96 + 97 @@ -6076,7 +6160,7 @@ Möchtest du diese Systemmeldung wirklich löschen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 255 + 260 @@ -6108,7 +6192,7 @@ Cash-Bestände apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 143 + 170 @@ -6144,7 +6228,7 @@ Der aktuelle Marktpreis ist apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 766 + 850 @@ -6152,7 +6236,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 606 + 725 @@ -6226,18 +6310,6 @@ Investment Investition - - apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 173 - - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 60 - - - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 85 - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 101 @@ -6260,7 +6332,7 @@ Position abschliessen apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 449 + 451 @@ -6300,7 +6372,7 @@ Seit Wochenbeginn libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6308,11 +6380,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6320,7 +6392,7 @@ Seit Monatsbeginn libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6328,11 +6400,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6348,7 +6420,7 @@ Seit Jahresbeginn libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -6392,7 +6464,7 @@ Jahr apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6404,7 +6476,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -6412,11 +6484,11 @@ Jahre apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -6432,7 +6504,7 @@ Finanzmarktdaten synchronisieren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 629 + 748 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6444,7 +6516,7 @@ Finde eine Position... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 449 @@ -6464,7 +6536,7 @@ libs/common/src/lib/routes/routes.ts - 260 + 255 @@ -6476,7 +6548,7 @@ libs/common/src/lib/routes/routes.ts - 268 + 263 @@ -6485,11 +6557,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 263 + 258 libs/common/src/lib/routes/routes.ts - 266 + 261 @@ -6497,7 +6569,7 @@ Täglich apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 244 @@ -6535,9 +6607,13 @@ Activity Aktivität + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 101 + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 231 + 232 @@ -6545,7 +6621,7 @@ Dividendenrendite apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 198 + 199 @@ -6601,7 +6677,7 @@ Aktivitäten löschen libs/ui/src/lib/activities-table/activities-table.component.html - 92 + 105 @@ -6609,7 +6685,7 @@ Internationalisierung libs/common/src/lib/routes/routes.ts - 119 + 114 @@ -6617,7 +6693,7 @@ Möchtest du dieses Ghostfolio Konto wirklich schliessen? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 229 + 244 @@ -6625,7 +6701,7 @@ Springe zu einer Seite... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 450 @@ -6673,7 +6749,7 @@ Aktivität kopieren libs/common/src/lib/routes/routes.ts - 134 + 129 @@ -6681,7 +6757,7 @@ Berücksichtigen in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 399 + 400 @@ -6689,7 +6765,7 @@ Ups! Beim Einrichten der biometrischen Authentifizierung ist ein Fehler aufgetreten. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 352 + 363 @@ -6705,7 +6781,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 128 @@ -6753,7 +6829,7 @@ Budgetierung libs/ui/src/lib/i18n.ts - 104 + 105 @@ -6821,7 +6897,7 @@ Ups! Das Anlageprofil konnte nicht gelöscht werden. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 51 + 55 @@ -6829,7 +6905,7 @@ Family Office libs/ui/src/lib/i18n.ts - 107 + 108 @@ -6909,7 +6985,7 @@ Vermögensverwaltung libs/ui/src/lib/i18n.ts - 113 + 114 @@ -6917,7 +6993,7 @@ Position ansehen libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 487 @@ -6925,7 +7001,7 @@ Möchtest du diese Anlageprofile wirklich löschen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 67 + 72 @@ -6933,7 +7009,7 @@ Fehler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 757 + 841 @@ -6973,11 +7049,11 @@ Abbrechen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 162 + 163 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 753 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7001,7 +7077,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 112 + 107 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7029,7 +7105,7 @@ Schliessen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 636 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7061,11 +7137,11 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 244 + 252 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 114 + 109 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7081,7 +7157,7 @@ Rolle apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 44 + 45 @@ -7105,7 +7181,7 @@ Steuerreporting libs/ui/src/lib/i18n.ts - 112 + 113 @@ -7121,7 +7197,7 @@ Änderung mit Währungseffekt Änderung apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 63 + 64 @@ -7137,7 +7213,7 @@ Performance mit Währungseffekt Performance apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 83 + 84 @@ -7185,7 +7261,7 @@ wurde in die Zwischenablage kopiert apps/client/src/app/components/admin-overview/admin-overview.component.ts - 223 + 228 libs/ui/src/lib/value/value.component.ts @@ -7253,7 +7329,7 @@ Finanzdienstleistungen libs/ui/src/lib/i18n.ts - 95 + 96 @@ -7283,6 +7359,10 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 270 + + libs/ui/src/lib/activities-table/activities-table.component.html + 101 + cannot be self-hosted @@ -7308,6 +7388,14 @@ 278 + + Shares Before + Anteile vorher + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 597 + + cannot be used anonymously kann nicht anonym genutzt werden @@ -7337,7 +7425,7 @@ Dividenden-Tracking libs/ui/src/lib/i18n.ts - 105 + 106 @@ -7381,7 +7469,7 @@ API-Schlüssel setzen apps/client/src/app/components/admin-settings/admin-settings.component.html - 188 + 197 @@ -7397,7 +7485,7 @@ Investment Research libs/ui/src/lib/i18n.ts - 109 + 110 @@ -7421,7 +7509,7 @@ libs/common/src/lib/routes/routes.ts - 313 + 308 @@ -7437,7 +7525,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 316 @@ -7446,11 +7534,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 316 + 311 libs/common/src/lib/routes/routes.ts - 319 + 314 @@ -7459,11 +7547,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 308 + 303 libs/common/src/lib/routes/routes.ts - 311 + 306 @@ -7487,7 +7575,7 @@ von apps/client/src/app/components/admin-settings/admin-settings.component.html - 152 + 157 @@ -7495,7 +7583,7 @@ täglichen Anfragen apps/client/src/app/components/admin-settings/admin-settings.component.html - 154 + 159 @@ -7503,7 +7591,7 @@ API-Schlüssel löschen apps/client/src/app/components/admin-settings/admin-settings.component.html - 178 + 187 @@ -7511,7 +7599,7 @@ Möchtest du den API-Schlüssel wirklich löschen? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 143 + 144 @@ -7531,7 +7619,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 141 @@ -7603,7 +7691,7 @@ Speichern apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 645 + 764 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7623,7 +7711,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 133 + 143 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7635,7 +7723,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 123 + 118 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7679,7 +7767,7 @@ Vermögens-Tracking libs/ui/src/lib/i18n.ts - 110 + 111 @@ -7687,7 +7775,7 @@ Bitte gebe deinen Ghostfolio API-Schlüssel ein. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 162 + 163 @@ -7719,7 +7807,7 @@ Verzögert apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7727,7 +7815,7 @@ Sofort apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7735,7 +7823,7 @@ Standardmarktpreis apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 638 @@ -7743,7 +7831,7 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 556 + 675 @@ -7751,7 +7839,7 @@ Möchtest du die Datenquelle wirklich in umwandeln? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 485 + 525 @@ -7759,7 +7847,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 572 + 691 @@ -7767,7 +7855,7 @@ HTTP Request-Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 651 @@ -7775,7 +7863,7 @@ Tagesende apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7783,7 +7871,7 @@ in Echtzeit apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7799,7 +7887,7 @@ Erstelle libs/ui/src/lib/tags-selector/tags-selector.component.html - 64 + 62 @@ -7964,11 +8052,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 232 + 227 libs/common/src/lib/routes/routes.ts - 235 + 230 @@ -7980,7 +8068,7 @@ libs/common/src/lib/routes/routes.ts - 237 + 232 @@ -7996,7 +8084,7 @@ () wird bereits verwendet. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 718 + 801 @@ -8004,7 +8092,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 - 721 + 804 @@ -8012,7 +8100,7 @@ Übernehmen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 155 @@ -8068,7 +8156,7 @@ libs/common/src/lib/routes/routes.ts - 110 + 105 @@ -8079,6 +8167,18 @@ 142 + + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + {VAR_PLURAL, plural, =1 {Aktivität} other {Aktivitäten}} + + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 102 + + Log out Ausloggen @@ -8090,13 +8190,9 @@ Calculations are based on delayed market data and may not be displayed in real-time. Berechnungen basieren auf verzögerten Marktdaten und werden nicht in Echtzeit angezeigt. - - apps/client/src/app/components/home-market/home-market.html - 28 - apps/client/src/app/components/markets/markets.html - 54 + 64 @@ -8105,11 +8201,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 200 + 195 libs/common/src/lib/routes/routes.ts - 203 + 198 @@ -8117,7 +8213,7 @@ ETF-Tracking libs/ui/src/lib/i18n.ts - 106 + 107 @@ -8125,7 +8221,7 @@ Demo Benutzerkonto wurde synchronisiert. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 323 + 334 @@ -8133,7 +8229,7 @@ Synchronisiere Demo Benutzerkonto apps/client/src/app/components/admin-overview/admin-overview.html - 128 + 131 @@ -8205,7 +8301,7 @@ libs/common/src/lib/routes/routes.ts - 251 + 246 @@ -8213,7 +8309,7 @@ Open Source Alternative zu libs/common/src/lib/routes/routes.ts - 346 + 341 @@ -8246,15 +8342,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 332 + 327 libs/common/src/lib/routes/routes.ts - 335 + 330 libs/common/src/lib/routes/routes.ts - 343 + 338 @@ -8263,11 +8359,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 324 + 319 libs/common/src/lib/routes/routes.ts - 327 + 322 @@ -8347,7 +8443,7 @@ Aktueller Monat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 @@ -8492,11 +8588,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 356 + 351 libs/common/src/lib/routes/routes.ts - 357 + 352 @@ -8528,7 +8624,7 @@ Aktien apps/client/src/app/components/markets/markets.component.ts - 51 + 54 apps/client/src/app/pages/features/features-page.html @@ -8540,7 +8636,7 @@ Kryptowährungen apps/client/src/app/components/markets/markets.component.ts - 52 + 55 apps/client/src/app/pages/features/features-page.html @@ -8552,7 +8648,7 @@ Anlageprofil verwalten apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 479 @@ -8580,7 +8676,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 101 + 102 @@ -8984,7 +9080,7 @@ Registrierungsdatum apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 56 + 58 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 5ea8880d2..866dac527 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -59,7 +59,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 166 + 174 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -67,11 +67,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 5 + 7 libs/ui/src/lib/activities-table/activities-table.component.html - 183 + 197 @@ -115,7 +115,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 332 + 333 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -151,7 +151,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 161 + 175 libs/ui/src/lib/benchmark/benchmark.component.html @@ -211,11 +211,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 284 + 298 libs/ui/src/lib/activities-table/activities-table.component.html - 320 + 334 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -255,7 +255,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 483 + 497 @@ -271,7 +271,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 235 + 238 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -281,6 +281,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 100 + + apps/client/src/app/components/admin-users/admin-users.html + 254 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 27 @@ -295,7 +299,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 513 + 527 libs/ui/src/lib/benchmark/benchmark.component.html @@ -312,10 +316,10 @@ Paid - Paid + Pagado apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 129 + 136 @@ -339,7 +343,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 198 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -350,6 +354,14 @@ 20 + + Unknown + Desconocido + + libs/ui/src/lib/i18n.ts + 88 + + Attempts Intentos @@ -388,7 +400,7 @@ and is driven by the efforts of its contributors - y es impulsado por los esfuerzos de sus colaboradores + y es impulsado por los esfuerzos de sus colaboradores apps/client/src/app/pages/about/overview/about-overview-page.html 50 @@ -399,7 +411,7 @@ Perfiles de activos apps/client/src/app/components/admin-settings/admin-settings.component.html - 123 + 128 libs/ui/src/lib/assistant/assistant.html @@ -415,7 +427,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 486 + 487 @@ -426,6 +438,14 @@ 208 + + Splits + Desdoblamientos + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 512 + + View Stacktrace Ver Stacktrace @@ -455,12 +475,20 @@ Buscar una cuenta... libs/ui/src/lib/assistant/assistant.component.ts - 447 + 448 Date Fecha + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 521 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 560 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 156 @@ -471,7 +499,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 206 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -480,7 +508,7 @@ Watch the Ghostfol.io Trailer on YouTube - Watch the Ghostfol.io Trailer on YouTube + Ver el tráiler de Ghostfol.io en YouTube apps/client/src/app/pages/landing/landing-page.html 19 @@ -495,7 +523,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 113 + 114 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -511,11 +539,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 235 + 236 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 221 + 222 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -539,7 +567,7 @@ ¿Seguro que quieres eliminar este cupón? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 242 + 247 @@ -547,7 +575,7 @@ ¿Seguro que quieres limpiar la caché? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 279 + 290 @@ -555,7 +583,7 @@ Por favor, establece tu mensaje del sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 299 + 310 @@ -563,7 +591,7 @@ por usuario apps/client/src/app/components/admin-overview/admin-overview.component.ts - 178 + 181 @@ -591,7 +619,7 @@ Mensaje del sistema apps/client/src/app/components/admin-overview/admin-overview.html - 88 + 89 @@ -599,7 +627,7 @@ Establecer mensaje apps/client/src/app/components/admin-overview/admin-overview.html - 110 + 113 @@ -607,7 +635,7 @@ Modo de solo lectura apps/client/src/app/components/admin-overview/admin-overview.html - 64 + 63 @@ -615,15 +643,19 @@ Cupones apps/client/src/app/components/admin-overview/admin-overview.html - 148 + 151 Add Añadir + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 615 + apps/client/src/app/components/admin-overview/admin-overview.html - 298 + 301 libs/ui/src/lib/account-balances/account-balances.component.html @@ -635,7 +667,7 @@ Limpieza del sistema apps/client/src/app/components/admin-overview/admin-overview.html - 117 + 120 @@ -643,7 +675,7 @@ Limpiar caché apps/client/src/app/components/admin-overview/admin-overview.html - 133 + 136 @@ -687,7 +719,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 124 + 132 @@ -702,8 +734,8 @@ Current Market Mood Sentimiento del mercado - apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html - 12 + libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html + 23 @@ -752,14 +784,14 @@ Creation - Creation + Creación apps/client/src/app/components/admin-overview/admin-overview.html - 185 + 188 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 150 + 158 @@ -795,7 +827,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 215 + 230 @@ -806,12 +838,20 @@ 64 + + Split Ratio + Relación de desdoblamiento + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 526 + + Last Days Últimos días apps/client/src/app/components/markets/markets.html - 17 + 24 @@ -847,7 +887,7 @@ o apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 167 + 168 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -895,7 +935,7 @@ Energía libs/ui/src/lib/i18n.ts - 94 + 95 @@ -959,7 +999,7 @@ Poder adquisitivo apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 196 + 256 @@ -967,7 +1007,7 @@ Patrimonio neto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 320 + 337 @@ -975,7 +1015,7 @@ Rendimiento anualizado apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 334 + 351 @@ -983,7 +1023,7 @@ Por favor, ingresa la cantidad de tu fondo de emergencia. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 135 + 145 @@ -991,15 +1031,15 @@ Sectores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 301 + 302 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 421 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 290 + 291 apps/client/src/app/pages/public/public-page.html @@ -1011,15 +1051,15 @@ Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 312 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 431 + 432 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 302 + 303 @@ -1027,7 +1067,7 @@ Etiquetas apps/client/src/app/components/admin-settings/admin-settings.component.html - 218 + 227 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1035,7 +1075,7 @@ libs/ui/src/lib/tags-selector/tags-selector.component.html - 25 + 23 @@ -1043,7 +1083,7 @@ Reportar anomalía en los datos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 462 + 464 @@ -1091,7 +1131,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 366 @@ -1099,11 +1139,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -1111,16 +1151,16 @@ 1 año apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 Ghostfolio in Numbers: Monthly Active Users (MAU) - Ghostfolio in Numbers: Monthly Active Users (MAU) + Ghostfolio en cifras: usuarios activos mensuales (MAU) apps/client/src/app/pages/landing/landing-page.html 63 @@ -1131,11 +1171,11 @@ 5 años apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -1151,11 +1191,11 @@ Máximo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 244 + 276 libs/ui/src/lib/assistant/assistant.component.ts - 415 + 416 @@ -1191,7 +1231,7 @@ libs/common/src/lib/routes/routes.ts - 240 + 235 @@ -1207,7 +1247,7 @@ libs/common/src/lib/routes/routes.ts - 229 + 224 @@ -1227,7 +1267,7 @@ Por favor, ingresa tu código de cupón. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 214 + 203 @@ -1235,7 +1275,7 @@ No se pudo canjear el código de cupón apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 178 + 181 @@ -1243,7 +1283,7 @@ Consumo Básico libs/ui/src/lib/i18n.ts - 93 + 94 @@ -1251,15 +1291,7 @@ El código del cupón ha sido canjeado apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 191 - - - - Reload - Recargar - - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 194 @@ -1267,7 +1299,7 @@ ¿Seguro que quieres eliminar este método de acceso? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 303 + 314 @@ -1303,7 +1335,7 @@ Servicios Públicos libs/ui/src/lib/i18n.ts - 101 + 102 @@ -1324,10 +1356,10 @@ Coupon - Coupon + Cupón apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 134 + 141 @@ -1335,7 +1367,7 @@ Configuración regional apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 666 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1396,7 +1428,7 @@ The value has been copied to the clipboard - The value has been copied to the clipboard + El valor ha sido copiado al portapapeles libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 @@ -1447,11 +1479,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 384 + 396 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 101 + 109 apps/client/src/app/pages/accounts/accounts-page.html @@ -1484,7 +1516,7 @@ Copy - Copy + Copiar libs/ui/src/lib/notifications/alert-dialog/alert-dialog.html 20 @@ -1495,11 +1527,11 @@ Divisa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 216 + 217 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 339 + 340 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1519,7 +1551,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 303 + 317 @@ -1527,7 +1559,7 @@ Saldo en efectivo apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 43 + 55 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1543,7 +1575,7 @@ Plataforma apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 113 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1559,15 +1591,15 @@ ID de cuenta apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 103 + 98 Financial Planning - Financial Planning + Planificación financiera libs/ui/src/lib/i18n.ts - 108 + 109 @@ -1695,7 +1727,7 @@ libs/common/src/lib/routes/routes.ts - 245 + 240 @@ -1703,12 +1735,12 @@ Como estás conectado, no puedes acceder a la cuenta de demostración. apps/client/src/app/pages/demo/demo-page.component.ts - 33 + 32 popular - popular + popular apps/client/src/app/components/admin-settings/admin-settings.component.html 79 @@ -1719,7 +1751,7 @@ Duración apps/client/src/app/components/admin-overview/admin-overview.html - 172 + 175 @@ -1739,7 +1771,15 @@ libs/common/src/lib/routes/routes.ts - 271 + 266 + + + + Invalid API key + Clave de API no válida + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 112 @@ -1759,15 +1799,19 @@ libs/common/src/lib/routes/routes.ts - 276 + 271 Overview Visión general + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 42 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 115 apps/client/src/app/components/header/header.component.html @@ -1779,7 +1823,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 47 + 48 apps/client/src/app/pages/admin/admin-page.component.ts @@ -1791,11 +1835,11 @@ libs/common/src/lib/routes/routes.ts - 113 + 108 libs/common/src/lib/routes/routes.ts - 190 + 185 @@ -1803,7 +1847,7 @@ Mercados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 403 + 404 apps/client/src/app/components/footer/footer.component.html @@ -1813,10 +1857,6 @@ apps/client/src/app/components/header/header.component.html 408 - - apps/client/src/app/components/home-market/home-market.html - 2 - apps/client/src/app/components/markets/markets.html 2 @@ -1835,15 +1875,11 @@ libs/common/src/lib/routes/routes.ts - 100 - - - libs/common/src/lib/routes/routes.ts - 281 + 276 libs/common/src/lib/routes/routes.ts - 329 + 324 @@ -1859,7 +1895,7 @@ libs/common/src/lib/routes/routes.ts - 154 + 149 @@ -1932,10 +1968,10 @@ Trial - Trial + Prueba apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 133 + 140 @@ -1947,7 +1983,7 @@ libs/common/src/lib/routes/routes.ts - 159 + 154 @@ -1995,7 +2031,7 @@ Posiciones apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 100 + 127 apps/client/src/app/components/home-holdings/home-holdings.html @@ -2003,7 +2039,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 168 apps/client/src/app/pages/public/public-page.html @@ -2015,7 +2051,7 @@ libs/common/src/lib/routes/routes.ts - 187 + 182 libs/ui/src/lib/assistant/assistant.html @@ -2035,7 +2071,7 @@ Semana actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 @@ -2067,7 +2103,7 @@ Nombre, símbolo o ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 133 + 134 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2087,7 +2123,7 @@ Consumo Discrecional libs/ui/src/lib/i18n.ts - 92 + 93 @@ -2095,7 +2131,7 @@ Cantidad apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 159 + 160 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -2103,7 +2139,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 227 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2119,7 +2155,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 237 + 251 @@ -2127,7 +2163,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 455 + 456 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2143,7 +2179,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 370 + 384 @@ -2151,15 +2187,15 @@ Operaciones apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 84 + 103 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 111 + 138 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 244 + 245 apps/client/src/app/components/admin-overview/admin-overview.html @@ -2175,15 +2211,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 233 + 234 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 350 + 362 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 110 + 118 apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -2191,7 +2227,7 @@ libs/common/src/lib/routes/routes.ts - 149 + 144 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2251,7 +2287,7 @@ libs/common/src/lib/routes/routes.ts - 291 + 286 @@ -2259,7 +2295,7 @@ Cartera apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 139 + 140 apps/client/src/app/components/header/header.component.html @@ -2275,7 +2311,7 @@ libs/common/src/lib/routes/routes.ts - 172 + 167 @@ -2311,7 +2347,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 296 @@ -2355,7 +2391,7 @@ libs/common/src/lib/routes/routes.ts - 352 + 347 @@ -2387,7 +2423,7 @@ Borrador libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 181 @@ -2399,11 +2435,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 30 libs/ui/src/lib/activities-table/activities-table.component.html - 406 + 420 @@ -2411,11 +2447,11 @@ Exportar operaciones libs/ui/src/lib/activities-table/activities-table.component.html - 64 + 72 libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 448 @@ -2423,11 +2459,11 @@ Exportar borrador como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 77 + 86 libs/ui/src/lib/activities-table/activities-table.component.html - 447 + 461 @@ -2435,7 +2471,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 492 + 506 @@ -2443,7 +2479,7 @@ Exportar borrador como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 502 + 516 @@ -2451,7 +2487,11 @@ ¿Seguro que quieres eliminar esta operación? libs/ui/src/lib/activities-table/activities-table.component.ts - 327 + 333 + + + libs/ui/src/lib/activities-table/activities-table.component.ts + 344 @@ -2480,7 +2520,7 @@ {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} - {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + {VAR_PLURAL, plural, =1 {Perfil} other {Perfiles}} apps/client/src/app/components/admin-market-data/admin-market-data.html 275 @@ -2549,10 +2589,6 @@ Exclude from Analysis Excluir del análisis - - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 97 - libs/ui/src/lib/i18n.ts 22 @@ -2583,7 +2619,7 @@ Precio máximo apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 149 + 150 @@ -2623,11 +2659,11 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 280 + 281 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 270 + 271 @@ -2635,7 +2671,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 296 apps/client/src/app/components/admin-users/admin-users.html @@ -2643,11 +2679,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 284 + 285 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 88 + 96 @@ -2655,7 +2691,7 @@ Precio mínimo apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 131 + 132 @@ -2679,11 +2715,11 @@ Interés apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 67 + 79 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 406 + 424 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2720,7 +2756,7 @@ Apply current market price - Apply current market price + Aplicar el precio de mercado actual apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 238 @@ -2728,10 +2764,10 @@ Subscription History - Subscription History + Historial de suscripción apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 141 + 149 @@ -2747,7 +2783,7 @@ Miedo apps/client/src/app/components/markets/markets.component.ts - 46 + 58 libs/ui/src/lib/i18n.ts @@ -2759,7 +2795,7 @@ Codicia apps/client/src/app/components/markets/markets.component.ts - 47 + 59 libs/ui/src/lib/i18n.ts @@ -2771,7 +2807,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 365 + 377 @@ -2807,11 +2843,11 @@ Índice de referencia apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 401 + 402 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 151 + 152 @@ -2819,11 +2855,11 @@ No se pudo validar el formulario apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 641 + 724 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 644 + 727 @@ -2847,7 +2883,7 @@ Excluido del análisis apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 270 + 286 @@ -2855,7 +2891,7 @@ Automático apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 74 + 77 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2864,7 +2900,7 @@ Close Account - Close Account + Cerrar cuenta apps/client/src/app/components/user-account-settings/user-account-settings.html 337 @@ -2884,7 +2920,7 @@ Contributors to Ghostfolio - Contributors to Ghostfolio + Colaboradores de Ghostfolio apps/client/src/app/pages/about/overview/about-overview-page.html 54 @@ -2911,7 +2947,7 @@ Importe total apps/client/src/app/components/investment-chart/investment-chart.component.ts - 143 + 144 @@ -2927,7 +2963,7 @@ Código apps/client/src/app/components/admin-overview/admin-overview.html - 159 + 162 @@ -2935,7 +2971,7 @@ Tasa de ahorro apps/client/src/app/components/investment-chart/investment-chart.component.ts - 201 + 193 @@ -2947,7 +2983,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 335 + 349 libs/ui/src/lib/i18n.ts @@ -2967,15 +3003,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 254 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 349 + 350 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 244 + 245 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -3003,7 +3039,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 186 + 187 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3011,13 +3047,21 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 322 + 323 libs/ui/src/lib/i18n.ts 35 + + Export + Exportar + + libs/ui/src/lib/activities-table/activities-table.component.html + 68 + + Tag Etiqueta @@ -3035,7 +3079,7 @@ Efectivo apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 168 + 227 libs/ui/src/lib/i18n.ts @@ -3055,7 +3099,7 @@ Renta variable apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 55 + 67 libs/ui/src/lib/i18n.ts @@ -3079,7 +3123,7 @@ libs/ui/src/lib/i18n.ts - 99 + 100 @@ -3087,7 +3131,7 @@ Autenticación apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 65 + 67 @@ -3151,15 +3195,15 @@ Fondo de emergencia apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 254 + 270 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 356 + 373 apps/client/src/app/pages/features/features-page.html @@ -3179,7 +3223,7 @@ libs/ui/src/lib/i18n.ts - 98 + 99 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -3243,7 +3287,7 @@ Servicios de Comunicación libs/ui/src/lib/i18n.ts - 91 + 92 @@ -3270,6 +3314,22 @@ 79 + + Invested Capital + Capital invertido + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 174 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 85 + + South America América del Sur @@ -3300,26 +3360,26 @@ Price - Price + Precio apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 176 + 184 Do you really want to convert this asset profile to ()? - Do you really want to convert this asset profile to ()? + ¿Seguro que quieres convertir este perfil de activo a ()? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 723 + 806 Data Gathering Frequency - Data Gathering Frequency + Frecuencia de recopilación de datos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 467 + 468 @@ -3343,7 +3403,7 @@ Mapeo de símbolos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 410 @@ -3359,15 +3419,15 @@ Dividendo apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 79 + 91 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 188 + 189 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 419 + 437 apps/client/src/app/pages/features/features-page.html @@ -3403,15 +3463,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 262 + 263 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 365 + 366 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 253 + 254 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -3459,7 +3519,7 @@ Datos del mercado apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 406 + 418 libs/common/src/lib/routes/routes.ts @@ -3480,7 +3540,7 @@ just now - just now + justo ahora apps/client/src/app/components/admin-users/admin-users.component.ts 221 @@ -3495,7 +3555,7 @@ libs/common/src/lib/routes/routes.ts - 105 + 100 @@ -3535,11 +3595,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 52 + 54 libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 434 @@ -3591,7 +3651,7 @@ Sin operaciones apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 148 @@ -3634,6 +3694,14 @@ 221 + + Investments + Inversiones + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 197 + + Sneak peek at upcoming functionality Un adelanto de las próximas funciones @@ -3772,10 +3840,10 @@ Hourly - Hourly + Horaria apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 248 @@ -3864,10 +3932,10 @@ Expiration - Expiration + Caducidad apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 209 + 217 @@ -3883,11 +3951,11 @@ No se pudo guardar el perfil del activo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 758 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 678 + 761 @@ -3903,7 +3971,7 @@ Comisiones apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -4058,22 +4126,6 @@ 228 - - Delete User - Eliminar usuario - - apps/client/src/app/components/admin-users/admin-users.html - 254 - - - - Do you really want to delete these activities? - ¿Seguro que quieres eliminar estas operaciones? - - libs/ui/src/lib/activities-table/activities-table.component.ts - 317 - - By ETF Provider Por proveedor de ETF @@ -4103,7 +4155,7 @@ Año actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 @@ -4114,16 +4166,24 @@ 10 + + Cache has been flushed. + Caché vaciada. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 281 + + Url Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 443 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 707 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4139,7 +4199,7 @@ Perfil del activo guardado apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 665 + 748 @@ -4155,7 +4215,7 @@ Plataformas apps/client/src/app/components/admin-settings/admin-settings.component.html - 212 + 221 @@ -4262,6 +4322,14 @@ 118 + + Shares After + Acciones después + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 584 + + Frequently Asked Questions (FAQ) Preguntas frecuentes (FAQ) @@ -4343,7 +4411,7 @@ Pasivos apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 298 + 315 apps/client/src/app/pages/features/features-page.html @@ -4363,7 +4431,7 @@ libs/common/src/lib/routes/routes.ts - 205 + 200 @@ -4379,7 +4447,7 @@ libs/common/src/lib/routes/routes.ts - 213 + 208 @@ -4392,7 +4460,7 @@ For security reasons, please delete all activities and accounts first before your Ghostfolio account can be closed. - For security reasons, please delete all activities and accounts first before your Ghostfolio account can be closed. + Por razones de seguridad, elimina primero todas las operaciones y cuentas antes de poder cerrar tu cuenta de Ghostfolio. apps/client/src/app/components/user-account-settings/user-account-settings.html 348 @@ -4496,10 +4564,10 @@ Update Activity - Update Activity + Actualizar operación libs/common/src/lib/routes/routes.ts - 146 + 141 @@ -4507,7 +4575,7 @@ Tecnología libs/ui/src/lib/i18n.ts - 100 + 101 @@ -4520,10 +4588,10 @@ Total - Total + Total apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 160 + 168 @@ -4531,7 +4599,7 @@ Configuración del scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 509 + 628 @@ -4551,7 +4619,7 @@ libs/common/src/lib/routes/routes.ts - 349 + 344 @@ -4596,10 +4664,10 @@ Coupon has been created - Coupon has been created + El cupón ha sido creado apps/client/src/app/components/admin-overview/admin-overview.component.ts - 224 + 229 @@ -4648,7 +4716,7 @@ Upgrade to Ghostfolio Premium - Upgrade to Ghostfolio Premium + Actualizar a Ghostfolio Premium libs/ui/src/lib/premium-indicator/premium-indicator.component.html 4 @@ -4724,10 +4792,10 @@ Web - Web + Web libs/ui/src/lib/i18n.ts - 120 + 121 @@ -4796,7 +4864,7 @@ Category - Category + Categoría apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 77 @@ -4807,7 +4875,7 @@ ETFs sin países apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 138 @@ -4815,20 +4883,20 @@ ETFs sin sectores apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 143 An error occurred while converting the data source to . - An error occurred while converting the data source to . + Se produjo un error al convertir la fuente de datos a . apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 482 + 522 Ghostfolio in Numbers: Pulls on Docker Hub - Ghostfolio in Numbers: Pulls on Docker Hub + Ghostfolio en cifras: descargas en Docker Hub apps/client/src/app/pages/landing/landing-page.html 101 @@ -4868,7 +4936,7 @@ The source code is fully available as open source software (OSS) under the AGPL-3.0 license - El código fuente está disponible como software de código abierto (OSS) bajo la licencia AGPL-3.0 + El código fuente está disponible como software de código abierto (OSS) bajo la licencia AGPL-3.0 apps/client/src/app/pages/about/overview/about-overview-page.html 16 @@ -4948,7 +5016,7 @@ At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software (OSS) under the AGPL-3.0 license and we openly share aggregated key metrics of the platform’s operational status. - En Ghostfolio, la transparencia está en el centro de nuestros valores. Publicamos el código fuente como software de código abierto (OSS) bajo la Licencia AGPL-3.0 y compartimos abiertamente métricas clave agregadas sobre el estado operativo de la plataforma. + En Ghostfolio, la transparencia está en el centro de nuestros valores. Publicamos el código fuente como software de código abierto (OSS) bajo la licencia AGPL-3.0 y compartimos abiertamente métricas clave agregadas sobre el estado operativo de la plataforma. apps/client/src/app/pages/open/open-page.html 7 @@ -5043,7 +5111,7 @@ Divisas apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 133 apps/client/src/app/pages/public/public-page.html @@ -5095,11 +5163,11 @@ No se pudo analizar la configuración del scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 589 + 672 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 592 + 675 @@ -5195,7 +5263,7 @@ Materiales Básicos libs/ui/src/lib/i18n.ts - 90 + 91 @@ -5222,6 +5290,14 @@ 84 + + Do you really want to delete these activities? + ¿De verdad quieres eliminar estas actividades? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 334 + + Why Ghostfolio? ¿Por qué Ghostfolio? @@ -5320,10 +5396,10 @@ Oops! Could not delete the asset profiles. - Oops! Could not delete the asset profiles. + ¡Ups! No se pudieron eliminar los perfiles de activos. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 52 + 56 @@ -5376,10 +5452,10 @@ Add Activity - Add Activity + Añadir operación libs/common/src/lib/routes/routes.ts - 139 + 134 @@ -5428,19 +5504,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 249 libs/common/src/lib/routes/routes.ts - 255 + 250 libs/common/src/lib/routes/routes.ts - 259 + 254 libs/common/src/lib/routes/routes.ts - 265 + 260 @@ -5449,11 +5525,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 274 + 269 libs/common/src/lib/routes/routes.ts - 275 + 270 @@ -5462,31 +5538,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 196 + 191 libs/common/src/lib/routes/routes.ts - 197 + 192 libs/common/src/lib/routes/routes.ts - 202 + 197 libs/common/src/lib/routes/routes.ts - 210 + 205 libs/common/src/lib/routes/routes.ts - 218 + 213 libs/common/src/lib/routes/routes.ts - 226 + 221 libs/common/src/lib/routes/routes.ts - 234 + 229 @@ -5495,11 +5571,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 224 + 219 libs/common/src/lib/routes/routes.ts - 227 + 222 @@ -5508,11 +5584,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 208 + 203 libs/common/src/lib/routes/routes.ts - 211 + 206 @@ -5521,11 +5597,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 279 + 274 libs/common/src/lib/routes/routes.ts - 280 + 275 @@ -5534,11 +5610,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 289 + 284 libs/common/src/lib/routes/routes.ts - 290 + 285 @@ -5547,11 +5623,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 299 + 294 libs/common/src/lib/routes/routes.ts - 300 + 295 @@ -5560,31 +5636,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 299 libs/common/src/lib/routes/routes.ts - 305 + 300 libs/common/src/lib/routes/routes.ts - 310 + 305 libs/common/src/lib/routes/routes.ts - 318 + 313 libs/common/src/lib/routes/routes.ts - 326 + 321 libs/common/src/lib/routes/routes.ts - 334 + 329 libs/common/src/lib/routes/routes.ts - 342 + 337 @@ -5649,19 +5725,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 340 + 335 libs/common/src/lib/routes/routes.ts - 344 + 339 Stock Tracking - Stock Tracking + Seguimiento de acciones libs/ui/src/lib/i18n.ts - 111 + 112 @@ -5680,6 +5756,14 @@ 369 + + Data gathering has been started. + La recopilación de datos ha comenzado. + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 413 + + Global Global @@ -5718,10 +5802,10 @@ Convert to - Convert to + Convertir a apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 174 + 175 @@ -5738,7 +5822,7 @@ Available on - Available on + Disponible en apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 130 @@ -5793,7 +5877,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 275 libs/ui/src/lib/i18n.ts @@ -5889,7 +5973,7 @@ Membresía apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 78 + 82 libs/common/src/lib/routes/routes.ts @@ -5929,11 +6013,11 @@ ¿Seguro que quieres eliminar este perfil de activo? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 28 + 29 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 66 + 71 @@ -5949,7 +6033,7 @@ Industriales libs/ui/src/lib/i18n.ts - 97 + 98 @@ -6005,7 +6089,7 @@ ¡Vaya! La transferencia del saldo de efectivo ha fallado. apps/client/src/app/pages/accounts/accounts-page.component.ts - 358 + 355 @@ -6045,7 +6129,7 @@ Salud libs/ui/src/lib/i18n.ts - 96 + 97 @@ -6053,12 +6137,12 @@ ¿Seguro que quieres eliminar este mensaje del sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 255 + 260 Portfolio Filters - Portfolio Filters + Filtros de cartera apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 63 @@ -6085,7 +6169,7 @@ Saldos de efectivo apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 143 + 170 @@ -6121,7 +6205,7 @@ El precio actual de mercado es apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 766 + 850 @@ -6129,7 +6213,7 @@ Prueba apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 606 + 725 @@ -6203,18 +6287,6 @@ Investment Inversión - - apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 173 - - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 60 - - - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 85 - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 101 @@ -6237,7 +6309,7 @@ Cerrar posición apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 449 + 451 @@ -6277,7 +6349,7 @@ Semana hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6285,11 +6357,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6297,7 +6369,7 @@ Mes hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6305,16 +6377,16 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 Expires () - Expires () + Caduca () apps/client/src/app/components/admin-users/admin-users.html 34 @@ -6325,7 +6397,7 @@ Año hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -6342,7 +6414,7 @@ Fetch market price - Fetch market price + Obtener precio de mercado libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html 40 @@ -6369,7 +6441,7 @@ año apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6381,7 +6453,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -6389,11 +6461,11 @@ años apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -6409,7 +6481,7 @@ Recopilación de datos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 629 + 748 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6421,7 +6493,7 @@ Buscar una posición... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 449 @@ -6441,7 +6513,7 @@ libs/common/src/lib/routes/routes.ts - 260 + 255 @@ -6453,7 +6525,7 @@ libs/common/src/lib/routes/routes.ts - 268 + 263 @@ -6462,19 +6534,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 263 + 258 libs/common/src/lib/routes/routes.ts - 266 + 261 Daily - Daily + Diaria apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 244 @@ -6512,9 +6584,13 @@ Activity Operación + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 101 + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 231 + 232 @@ -6522,7 +6598,7 @@ Rendimiento por dividendo apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 198 + 199 @@ -6578,7 +6654,7 @@ Eliminar operaciones libs/ui/src/lib/activities-table/activities-table.component.html - 92 + 105 @@ -6586,7 +6662,7 @@ Internacionalización libs/common/src/lib/routes/routes.ts - 119 + 114 @@ -6594,7 +6670,7 @@ ¿Seguro que quieres eliminar tu cuenta de Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 229 + 244 @@ -6602,7 +6678,7 @@ Saltar a una página... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 450 @@ -6647,10 +6723,10 @@ Clone Activity - Clone Activity + Clonar operación libs/common/src/lib/routes/routes.ts - 134 + 129 @@ -6658,7 +6734,7 @@ Incluir en apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 399 + 400 @@ -6666,7 +6742,7 @@ ¡Vaya! Hubo un error al configurar la autenticación biométrica. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 352 + 363 @@ -6682,7 +6758,7 @@ Índices de referencia apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 128 @@ -6730,7 +6806,7 @@ Presupuestos libs/ui/src/lib/i18n.ts - 104 + 105 @@ -6795,10 +6871,10 @@ Oops! Could not delete the asset profile. - Oops! Could not delete the asset profile. + ¡Ups! No se pudo eliminar el perfil de activo. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 51 + 55 @@ -6806,7 +6882,7 @@ Family Office libs/ui/src/lib/i18n.ts - 107 + 108 @@ -6886,7 +6962,7 @@ Gestión de patrimonios libs/ui/src/lib/i18n.ts - 113 + 114 @@ -6894,15 +6970,15 @@ Ver posición libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 487 Do you really want to delete these asset profiles? - Do you really want to delete these asset profiles? + ¿Seguro que quieres eliminar estos perfiles de activos? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 67 + 72 @@ -6910,7 +6986,7 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 757 + 841 @@ -6950,11 +7026,11 @@ Cancelar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 162 + 163 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 753 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6978,7 +7054,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 112 + 107 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7006,7 +7082,7 @@ Cerrar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 636 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7038,11 +7114,11 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 244 + 252 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 114 + 109 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7058,7 +7134,7 @@ Rol apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 44 + 45 @@ -7079,10 +7155,10 @@ Tax Reporting - Tax Reporting + Informes fiscales libs/ui/src/lib/i18n.ts - 112 + 113 @@ -7095,10 +7171,10 @@ Change with currency effect Change - Cambio con el efecto de la divisa Cambio + Cambio con el efecto de la divisa Cambio apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 63 + 64 @@ -7111,10 +7187,10 @@ Performance with currency effect Performance - Rendimiento con el efecto de la divisa Rendimiento + Rendimiento con el efecto de la divisa Rendimiento apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 83 + 84 @@ -7159,10 +7235,10 @@ has been copied to the clipboard - ha sido copiado al portapapeles + ha sido copiado al portapapeles apps/client/src/app/components/admin-overview/admin-overview.component.ts - 223 + 228 libs/ui/src/lib/value/value.component.ts @@ -7179,7 +7255,7 @@ Compare Ghostfolio to - - Compare Ghostfolio to - + Compara Ghostfolio con - apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html 32 @@ -7230,7 +7306,7 @@ Servicios Financieros libs/ui/src/lib/i18n.ts - 95 + 96 @@ -7255,11 +7331,15 @@ Delete - Delete + Eliminar apps/client/src/app/components/admin-market-data/admin-market-data.html 270 + + libs/ui/src/lib/activities-table/activities-table.component.html + 101 + cannot be self-hosted @@ -7285,6 +7365,14 @@ 278 + + Shares Before + Acciones antes + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 597 + + cannot be used anonymously no se puede usar de forma anónima @@ -7311,10 +7399,10 @@ Dividend Tracking - Dividend Tracking + Seguimiento de dividendos libs/ui/src/lib/i18n.ts - 105 + 106 @@ -7358,7 +7446,7 @@ Configurar clave API apps/client/src/app/components/admin-settings/admin-settings.component.html - 188 + 197 @@ -7371,10 +7459,10 @@ Investment Research - Investment Research + Investigación de inversiones libs/ui/src/lib/i18n.ts - 109 + 110 @@ -7398,7 +7486,7 @@ libs/common/src/lib/routes/routes.ts - 313 + 308 @@ -7414,7 +7502,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 316 @@ -7423,11 +7511,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 316 + 311 libs/common/src/lib/routes/routes.ts - 319 + 314 @@ -7436,11 +7524,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 308 + 303 libs/common/src/lib/routes/routes.ts - 311 + 306 @@ -7464,7 +7552,7 @@ de apps/client/src/app/components/admin-settings/admin-settings.component.html - 152 + 157 @@ -7472,7 +7560,7 @@ solicitudes diarias apps/client/src/app/components/admin-settings/admin-settings.component.html - 154 + 159 @@ -7480,7 +7568,7 @@ Eliminar clave API apps/client/src/app/components/admin-settings/admin-settings.component.html - 178 + 187 @@ -7488,7 +7576,7 @@ ¿Seguro que quieres eliminar la clave API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 143 + 144 @@ -7508,7 +7596,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 141 @@ -7580,7 +7668,7 @@ Guardar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 645 + 764 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7600,7 +7688,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 133 + 143 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7612,7 +7700,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 123 + 118 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7653,10 +7741,10 @@ Net Worth Tracking - Net Worth Tracking + Seguimiento del patrimonio neto libs/ui/src/lib/i18n.ts - 110 + 111 @@ -7664,7 +7752,7 @@ Por favor, ingresa tu clave API de Ghostfolio. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 162 + 163 @@ -7696,7 +7784,7 @@ Bajo demanda apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7704,7 +7792,7 @@ Instantáneo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7712,7 +7800,7 @@ Precio de mercado por defecto apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 638 @@ -7720,15 +7808,15 @@ Modo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 556 + 675 Do you really want to convert the data source to ? - Do you really want to convert the data source to ? + ¿Seguro que quieres convertir la fuente de datos a ? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 485 + 525 @@ -7736,7 +7824,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 572 + 691 @@ -7744,7 +7832,7 @@ Encabezados de solicitud HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 651 @@ -7752,7 +7840,7 @@ final del día apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7760,7 +7848,7 @@ en tiempo real apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7776,7 +7864,7 @@ Crear libs/ui/src/lib/tags-selector/tags-selector.component.html - 64 + 62 @@ -7793,7 +7881,7 @@ Ghostfolio in Numbers: Stars on GitHub - Ghostfolio in Numbers: Stars on GitHub + Ghostfolio en cifras: estrellas en GitHub apps/client/src/app/pages/landing/landing-page.html 82 @@ -7941,11 +8029,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 232 + 227 libs/common/src/lib/routes/routes.ts - 235 + 230 @@ -7957,7 +8045,7 @@ libs/common/src/lib/routes/routes.ts - 237 + 232 @@ -7973,7 +8061,7 @@ () ya está en uso. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 718 + 801 @@ -7981,7 +8069,7 @@ Ocurrió un error al actualizar a (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 721 + 804 @@ -7989,7 +8077,7 @@ Aplicar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 155 @@ -8069,7 +8157,7 @@ libs/common/src/lib/routes/routes.ts - 110 + 105 @@ -8080,6 +8168,18 @@ 142 + + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + {VAR_PLURAL, plural, =1 {Actividad} other {Actividades}} + + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 102 + + Log out Cerrar sesión @@ -8091,13 +8191,9 @@ Calculations are based on delayed market data and may not be displayed in real-time. Los cálculos se basan en datos de mercado con retraso y es posible que no se muestren en tiempo real. - - apps/client/src/app/components/home-market/home-market.html - 28 - apps/client/src/app/components/markets/markets.html - 54 + 64 @@ -8106,19 +8202,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 200 + 195 libs/common/src/lib/routes/routes.ts - 203 + 198 ETF Tracking - ETF Tracking + Seguimiento de ETFs libs/ui/src/lib/i18n.ts - 106 + 107 @@ -8126,7 +8222,7 @@ La cuenta de usuario de demostración se ha sincronizado. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 323 + 334 @@ -8134,7 +8230,7 @@ Sincronizar cuenta de usuario de demostración apps/client/src/app/components/admin-overview/admin-overview.html - 128 + 131 @@ -8206,7 +8302,7 @@ libs/common/src/lib/routes/routes.ts - 251 + 246 @@ -8214,7 +8310,7 @@ Alternativa de software de código abierto a libs/common/src/lib/routes/routes.ts - 346 + 341 @@ -8247,15 +8343,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 332 + 327 libs/common/src/lib/routes/routes.ts - 335 + 330 libs/common/src/lib/routes/routes.ts - 343 + 338 @@ -8264,11 +8360,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 324 + 319 libs/common/src/lib/routes/routes.ts - 327 + 322 @@ -8281,7 +8377,7 @@ Post to Ghostfolio on X (formerly Twitter) - Post to Ghostfolio on X (formerly Twitter) + Publicar en Ghostfolio en X (antes Twitter) apps/client/src/app/pages/about/overview/about-overview-page.html 85 @@ -8348,7 +8444,7 @@ Mes actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 @@ -8493,11 +8589,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 356 + 351 libs/common/src/lib/routes/routes.ts - 357 + 352 @@ -8518,7 +8614,7 @@ If you encounter a bug, would like to suggest an improvement or a new feature, please join the Ghostfolio Slack community, post to @ghostfolio_ - Si encuentras un error, deseas sugerir una mejora o una nueva funcionalidad, por favor únete a la comunidad de Ghostfolio en Slack y publica en @ghostfolio_ + Si encuentras un error, deseas sugerir una mejora o una nueva funcionalidad, por favor únete a la comunidad de Ghostfolio en Slack y publica en @ghostfolio_ apps/client/src/app/pages/about/overview/about-overview-page.html 71 @@ -8529,7 +8625,7 @@ Acciones apps/client/src/app/components/markets/markets.component.ts - 51 + 54 apps/client/src/app/pages/features/features-page.html @@ -8541,7 +8637,7 @@ Criptomonedas apps/client/src/app/components/markets/markets.component.ts - 52 + 55 apps/client/src/app/pages/features/features-page.html @@ -8553,7 +8649,7 @@ Gestionar perfil de activo apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 479 @@ -8581,7 +8677,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 101 + 102 @@ -8985,7 +9081,7 @@ Fecha de registro apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 56 + 58 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 450a94f26..6ed02eed8 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -50,7 +50,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 166 + 174 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -58,11 +58,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 5 + 7 libs/ui/src/lib/activities-table/activities-table.component.html - 183 + 197 @@ -102,7 +102,7 @@ Plateforme apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 113 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -122,7 +122,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 332 + 333 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -158,7 +158,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 161 + 175 libs/ui/src/lib/benchmark/benchmark.component.html @@ -198,11 +198,11 @@ Devise apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 216 + 217 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 339 + 340 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -222,7 +222,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 303 + 317 @@ -230,7 +230,7 @@ Balance Cash apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 43 + 55 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -274,11 +274,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 284 + 298 libs/ui/src/lib/activities-table/activities-table.component.html - 320 + 334 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -318,7 +318,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 483 + 497 @@ -334,7 +334,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 235 + 238 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -344,6 +344,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 100 + + apps/client/src/app/components/admin-users/admin-users.html + 254 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 27 @@ -358,7 +362,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 513 + 527 libs/ui/src/lib/benchmark/benchmark.component.html @@ -378,7 +382,7 @@ Paid apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 129 + 136 @@ -394,7 +398,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 198 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -405,6 +409,14 @@ 20 + + Unknown + Unknown + + libs/ui/src/lib/i18n.ts + 88 + + Attempts Tentatives @@ -462,7 +474,7 @@ Profils d’Actifs apps/client/src/app/components/admin-settings/admin-settings.component.html - 123 + 128 libs/ui/src/lib/assistant/assistant.html @@ -478,7 +490,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 486 + 487 @@ -489,6 +501,14 @@ 208 + + Splits + Splits + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 512 + + View Stacktrace Voir la Stacktrace @@ -518,12 +538,20 @@ Rechercher un compte... libs/ui/src/lib/assistant/assistant.component.ts - 447 + 448 Date Date + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 521 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 560 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 156 @@ -534,7 +562,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 206 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -558,7 +586,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 113 + 114 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -570,7 +598,7 @@ Filtrer par... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 365 + 377 @@ -582,11 +610,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 235 + 236 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 221 + 222 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -598,7 +626,7 @@ Fréquence de collecte des données apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 467 + 468 @@ -642,7 +670,7 @@ Historique de l’abonnement apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 141 + 149 @@ -686,11 +714,11 @@ Secteur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 280 + 281 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 270 + 271 @@ -698,7 +726,7 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 296 apps/client/src/app/components/admin-users/admin-users.html @@ -706,11 +734,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 284 + 285 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 88 + 96 @@ -718,15 +746,15 @@ Secteurs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 301 + 302 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 421 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 290 + 291 apps/client/src/app/pages/public/public-page.html @@ -738,15 +766,15 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 312 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 431 + 432 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 302 + 303 @@ -754,7 +782,7 @@ Équivalence de Symboles apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 410 @@ -762,7 +790,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 455 + 456 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -778,7 +806,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 370 + 384 @@ -786,7 +814,7 @@ Voulez-vous vraiment supprimer ce code promotionnel ? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 242 + 247 @@ -794,7 +822,7 @@ Voulez-vous vraiment vider le cache ? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 279 + 290 @@ -802,7 +830,7 @@ Veuillez définir votre message système : apps/client/src/app/components/admin-overview/admin-overview.component.ts - 299 + 310 @@ -810,7 +838,7 @@ par Utilisateur apps/client/src/app/components/admin-overview/admin-overview.component.ts - 178 + 181 @@ -826,7 +854,7 @@ Étiquettes apps/client/src/app/components/admin-settings/admin-settings.component.html - 218 + 227 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -834,7 +862,7 @@ libs/ui/src/lib/tags-selector/tags-selector.component.html - 25 + 23 @@ -850,7 +878,7 @@ Mode Lecture Seule apps/client/src/app/components/admin-overview/admin-overview.html - 64 + 63 @@ -858,7 +886,7 @@ Message Système apps/client/src/app/components/admin-overview/admin-overview.html - 88 + 89 @@ -866,7 +894,7 @@ Définir Message apps/client/src/app/components/admin-overview/admin-overview.html - 110 + 113 @@ -874,15 +902,19 @@ Codes promotionnels apps/client/src/app/components/admin-overview/admin-overview.html - 148 + 151 Add Ajouter + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 615 + apps/client/src/app/components/admin-overview/admin-overview.html - 298 + 301 libs/ui/src/lib/account-balances/account-balances.component.html @@ -894,7 +926,7 @@ Maintenance apps/client/src/app/components/admin-overview/admin-overview.html - 117 + 120 @@ -902,7 +934,7 @@ Vider le Cache apps/client/src/app/components/admin-overview/admin-overview.html - 133 + 136 @@ -946,7 +978,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 124 + 132 @@ -962,11 +994,11 @@ Le formulaire n’a pas pu être validé apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 641 + 724 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 644 + 727 @@ -982,7 +1014,7 @@ Portefeuille apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 139 + 140 apps/client/src/app/components/header/header.component.html @@ -998,7 +1030,7 @@ libs/common/src/lib/routes/routes.ts - 172 + 167 @@ -1006,19 +1038,19 @@ Référence apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 401 + 402 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 151 + 152 Current Market Mood Sentiment actuel du marché - apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html - 12 + libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html + 23 @@ -1066,7 +1098,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 215 + 230 @@ -1077,12 +1109,20 @@ 64 + + Split Ratio + Split Ratio + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 526 + + Fear Peur apps/client/src/app/components/markets/markets.component.ts - 46 + 58 libs/ui/src/lib/i18n.ts @@ -1094,7 +1134,7 @@ Avidité apps/client/src/app/components/markets/markets.component.ts - 47 + 59 libs/ui/src/lib/i18n.ts @@ -1106,7 +1146,7 @@ derniers jours apps/client/src/app/components/markets/markets.html - 17 + 24 @@ -1114,7 +1154,7 @@ Montant Total apps/client/src/app/components/investment-chart/investment-chart.component.ts - 143 + 144 @@ -1122,7 +1162,7 @@ Code apps/client/src/app/components/admin-overview/admin-overview.html - 159 + 162 @@ -1130,7 +1170,7 @@ Taux d’Épargne apps/client/src/app/components/investment-chart/investment-chart.component.ts - 201 + 193 @@ -1166,7 +1206,7 @@ ou apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 167 + 168 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -1214,7 +1254,7 @@ Énergie libs/ui/src/lib/i18n.ts - 94 + 95 @@ -1278,7 +1318,7 @@ Pouvoir d’Achat apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 196 + 256 @@ -1286,7 +1326,7 @@ Exclus de l’Analyse apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 270 + 286 @@ -1294,7 +1334,7 @@ Fortune apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 320 + 337 @@ -1302,7 +1342,7 @@ Performance annualisée apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 334 + 351 @@ -1310,7 +1350,7 @@ Veuillez entrer le montant de votre fonds d’urgence : apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 135 + 145 @@ -1318,7 +1358,7 @@ Prix Minimum apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 131 + 132 @@ -1326,7 +1366,7 @@ Prix Maximum apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 149 + 150 @@ -1334,7 +1374,7 @@ Quantité apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 159 + 160 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -1342,7 +1382,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 227 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1354,7 +1394,7 @@ Signaler une Erreur de Données apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 462 + 464 @@ -1366,7 +1406,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 366 @@ -1374,11 +1414,11 @@ CDA apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -1386,11 +1426,11 @@ 1A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -1406,11 +1446,11 @@ 5A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -1426,11 +1466,11 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 244 + 276 libs/ui/src/lib/assistant/assistant.component.ts - 415 + 416 @@ -1502,7 +1542,7 @@ libs/common/src/lib/routes/routes.ts - 240 + 235 @@ -1518,7 +1558,7 @@ libs/common/src/lib/routes/routes.ts - 229 + 224 @@ -1538,7 +1578,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 74 + 77 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1550,7 +1590,7 @@ Veuillez entrer votre code promotionnel. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 214 + 203 @@ -1558,7 +1598,7 @@ Le code promotionnel n’a pas pu être appliqué apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 178 + 181 @@ -1566,7 +1606,7 @@ Consommation de Base libs/ui/src/lib/i18n.ts - 93 + 94 @@ -1574,15 +1614,7 @@ Le code promotionnel a été appliqué apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 191 - - - - Reload - Rafraîchir - - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 194 @@ -1590,7 +1622,7 @@ Voulez-vous vraiment supprimer cette méthode de connexion ? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 303 + 314 @@ -1626,7 +1658,7 @@ Services aux Collectivités libs/ui/src/lib/i18n.ts - 101 + 102 @@ -1650,7 +1682,7 @@ Coupon apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 134 + 141 @@ -1666,7 +1698,7 @@ Paramètres régionaux apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 666 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1830,11 +1862,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 384 + 396 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 101 + 109 apps/client/src/app/pages/accounts/accounts-page.html @@ -1870,7 +1902,7 @@ ID du compte apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 103 + 98 @@ -1878,7 +1910,7 @@ Planification Financière libs/ui/src/lib/i18n.ts - 108 + 109 @@ -1886,7 +1918,7 @@ Données du marché apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 406 + 418 libs/common/src/lib/routes/routes.ts @@ -2030,7 +2062,7 @@ libs/common/src/lib/routes/routes.ts - 245 + 240 @@ -2038,7 +2070,7 @@ Puisque vous êtes déjà connecté·e, vous ne pouvez pas accéder au compte de démonstration. apps/client/src/app/pages/demo/demo-page.component.ts - 33 + 32 @@ -2054,7 +2086,7 @@ Durée apps/client/src/app/components/admin-overview/admin-overview.html - 172 + 175 @@ -2074,7 +2106,15 @@ libs/common/src/lib/routes/routes.ts - 271 + 266 + + + + Invalid API key + Invalid API key + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 112 @@ -2094,7 +2134,7 @@ libs/common/src/lib/routes/routes.ts - 276 + 271 @@ -2102,7 +2142,7 @@ Positions apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 100 + 127 apps/client/src/app/components/home-holdings/home-holdings.html @@ -2110,7 +2150,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 168 apps/client/src/app/pages/public/public-page.html @@ -2122,7 +2162,7 @@ libs/common/src/lib/routes/routes.ts - 187 + 182 libs/ui/src/lib/assistant/assistant.html @@ -2146,7 +2186,7 @@ libs/common/src/lib/routes/routes.ts - 105 + 100 @@ -2154,7 +2194,7 @@ Marchés apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 403 + 404 apps/client/src/app/components/footer/footer.component.html @@ -2164,10 +2204,6 @@ apps/client/src/app/components/header/header.component.html 408 - - apps/client/src/app/components/home-market/home-market.html - 2 - apps/client/src/app/components/markets/markets.html 2 @@ -2186,15 +2222,11 @@ libs/common/src/lib/routes/routes.ts - 100 - - - libs/common/src/lib/routes/routes.ts - 281 + 276 libs/common/src/lib/routes/routes.ts - 329 + 324 @@ -2202,15 +2234,15 @@ Activités apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 84 + 103 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 111 + 138 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 244 + 245 apps/client/src/app/components/admin-overview/admin-overview.html @@ -2226,15 +2258,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 233 + 234 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 350 + 362 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 110 + 118 apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -2242,7 +2274,7 @@ libs/common/src/lib/routes/routes.ts - 149 + 144 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2262,7 +2294,7 @@ Semaine en cours apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 @@ -2294,7 +2326,7 @@ Nom, symbole, ou ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 133 + 134 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2314,7 +2346,7 @@ Consommation Discrétionnaire libs/ui/src/lib/i18n.ts - 92 + 93 @@ -2326,7 +2358,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 237 + 251 @@ -2386,7 +2418,7 @@ Prix apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 176 + 184 @@ -2394,7 +2426,7 @@ Do you really want to convert this asset profile to ()? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 723 + 806 @@ -2426,7 +2458,7 @@ libs/common/src/lib/routes/routes.ts - 154 + 149 @@ -2510,16 +2542,12 @@ Essai apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 133 + 140 Exclude from Analysis Exclure de l’analyse - - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 97 - libs/ui/src/lib/i18n.ts 22 @@ -2578,7 +2606,7 @@ libs/common/src/lib/routes/routes.ts - 159 + 154 @@ -2594,15 +2622,15 @@ Dividende apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 79 + 91 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 188 + 189 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 419 + 437 apps/client/src/app/pages/features/features-page.html @@ -2722,7 +2750,7 @@ libs/common/src/lib/routes/routes.ts - 291 + 286 @@ -2794,11 +2822,11 @@ Création apps/client/src/app/components/admin-overview/admin-overview.html - 185 + 188 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 150 + 158 @@ -2810,7 +2838,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 296 @@ -2874,7 +2902,7 @@ libs/common/src/lib/routes/routes.ts - 352 + 347 @@ -2904,9 +2932,13 @@ Overview Aperçu + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 42 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 115 apps/client/src/app/components/header/header.component.html @@ -2918,7 +2950,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 47 + 48 apps/client/src/app/pages/admin/admin-page.component.ts @@ -2930,11 +2962,11 @@ libs/common/src/lib/routes/routes.ts - 113 + 108 libs/common/src/lib/routes/routes.ts - 190 + 185 @@ -2942,7 +2974,7 @@ Brouillon libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 181 @@ -2954,11 +2986,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 30 libs/ui/src/lib/activities-table/activities-table.component.html - 406 + 420 @@ -2966,11 +2998,11 @@ Exporter Activités libs/ui/src/lib/activities-table/activities-table.component.html - 64 + 72 libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 448 @@ -2978,11 +3010,11 @@ Exporter Brouillons sous ICS libs/ui/src/lib/activities-table/activities-table.component.html - 77 + 86 libs/ui/src/lib/activities-table/activities-table.component.html - 447 + 461 @@ -2990,7 +3022,7 @@ Dupliquer libs/ui/src/lib/activities-table/activities-table.component.html - 492 + 506 @@ -2998,7 +3030,7 @@ Exporter Brouillon sous ICS libs/ui/src/lib/activities-table/activities-table.component.html - 502 + 516 @@ -3006,7 +3038,11 @@ Voulez-vous vraiment supprimer cette activité ? libs/ui/src/lib/activities-table/activities-table.component.ts - 327 + 333 + + + libs/ui/src/lib/activities-table/activities-table.component.ts + 344 @@ -3062,11 +3098,11 @@ Intérêt apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 67 + 79 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 406 + 424 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -3130,7 +3166,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 335 + 349 libs/ui/src/lib/i18n.ts @@ -3150,15 +3186,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 254 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 349 + 350 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 244 + 245 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -3182,15 +3218,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 262 + 263 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 365 + 366 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 253 + 254 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -3206,15 +3242,15 @@ Fonds d’Urgence apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 254 + 270 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 356 + 373 apps/client/src/app/pages/features/features-page.html @@ -3234,7 +3270,7 @@ libs/ui/src/lib/i18n.ts - 98 + 99 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -3254,7 +3290,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 186 + 187 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3262,13 +3298,21 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 322 + 323 libs/ui/src/lib/i18n.ts 35 + + Export + Export + + libs/ui/src/lib/activities-table/activities-table.component.html + 68 + + Tag Étiquette @@ -3286,7 +3330,7 @@ Cash apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 168 + 227 libs/ui/src/lib/i18n.ts @@ -3306,7 +3350,7 @@ Capital apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 55 + 67 libs/ui/src/lib/i18n.ts @@ -3330,7 +3374,7 @@ libs/ui/src/lib/i18n.ts - 99 + 100 @@ -3338,7 +3382,7 @@ Authentification apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 65 + 67 @@ -3418,7 +3462,7 @@ Services de Communication libs/ui/src/lib/i18n.ts - 91 + 92 @@ -3453,6 +3497,22 @@ 79 + + Invested Capital + Invested Capital + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 174 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 85 + + South America Amérique du Sud @@ -3534,11 +3594,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 52 + 54 libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 434 @@ -3590,7 +3650,7 @@ Aucune Activité apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 148 @@ -3633,6 +3693,14 @@ 221 + + Investments + Investments + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 197 + + Sneak peek at upcoming functionality Avant-première de fonctionnalités futures @@ -3774,7 +3842,7 @@ Toutes les heures apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 248 @@ -3866,7 +3934,7 @@ Expiration apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 209 + 217 @@ -3882,11 +3950,11 @@ Le profil d’actif n’a pas pu être enregistré apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 758 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 678 + 761 @@ -3902,7 +3970,7 @@ Frais apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -4057,22 +4125,6 @@ 228 - - Delete User - Supprimer l’Utilisateur - - apps/client/src/app/components/admin-users/admin-users.html - 254 - - - - Do you really want to delete these activities? - Voulez-vous vraiment supprimer toutes vos activités ? - - libs/ui/src/lib/activities-table/activities-table.component.ts - 317 - - By ETF Provider Par Émetteur d’ETF @@ -4102,7 +4154,7 @@ Année en cours apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 @@ -4113,16 +4165,24 @@ 10 + + Cache has been flushed. + Cache has been flushed. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 281 + + Url Lien apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 443 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 707 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4138,7 +4198,7 @@ Le profil d’actif a été enregistré apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 665 + 748 @@ -4154,7 +4214,7 @@ Platformes apps/client/src/app/components/admin-settings/admin-settings.component.html - 212 + 221 @@ -4261,6 +4321,14 @@ 118 + + Shares After + Shares After + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 584 + + Frequently Asked Questions (FAQ) Questions Fréquentes (FAQ) @@ -4342,7 +4410,7 @@ Dettes apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 298 + 315 apps/client/src/app/pages/features/features-page.html @@ -4362,7 +4430,7 @@ libs/common/src/lib/routes/routes.ts - 205 + 200 @@ -4378,7 +4446,7 @@ libs/common/src/lib/routes/routes.ts - 213 + 208 @@ -4498,7 +4566,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 146 + 141 @@ -4506,7 +4574,7 @@ Technologie libs/ui/src/lib/i18n.ts - 100 + 101 @@ -4522,7 +4590,7 @@ Total apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 160 + 168 @@ -4530,7 +4598,7 @@ Configuration du Scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 509 + 628 @@ -4550,7 +4618,7 @@ libs/common/src/lib/routes/routes.ts - 349 + 344 @@ -4598,7 +4666,7 @@ Coupon has been created apps/client/src/app/components/admin-overview/admin-overview.component.ts - 224 + 229 @@ -4726,7 +4794,7 @@ Web libs/ui/src/lib/i18n.ts - 120 + 121 @@ -4806,7 +4874,7 @@ ETF sans Pays apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 138 @@ -4814,7 +4882,7 @@ ETF sans Secteurs apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 143 @@ -4822,7 +4890,7 @@ An error occurred while converting the data source to . apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 482 + 522 @@ -5042,7 +5110,7 @@ Devises apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 133 apps/client/src/app/pages/public/public-page.html @@ -5094,11 +5162,11 @@ La configuration du scraper n’a pas pu être analysée apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 589 + 672 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 592 + 675 @@ -5194,7 +5262,7 @@ Matériaux de Base libs/ui/src/lib/i18n.ts - 90 + 91 @@ -5221,6 +5289,14 @@ 84 + + Do you really want to delete these activities? + Do you really want to delete these activities? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 334 + + Why Ghostfolio? Pourquoi Ghostfolio? @@ -5322,7 +5398,7 @@ Oops! Could not delete the asset profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 52 + 56 @@ -5378,7 +5454,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 139 + 134 @@ -5427,19 +5503,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 249 libs/common/src/lib/routes/routes.ts - 255 + 250 libs/common/src/lib/routes/routes.ts - 259 + 254 libs/common/src/lib/routes/routes.ts - 265 + 260 @@ -5448,11 +5524,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 274 + 269 libs/common/src/lib/routes/routes.ts - 275 + 270 @@ -5461,31 +5537,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 196 + 191 libs/common/src/lib/routes/routes.ts - 197 + 192 libs/common/src/lib/routes/routes.ts - 202 + 197 libs/common/src/lib/routes/routes.ts - 210 + 205 libs/common/src/lib/routes/routes.ts - 218 + 213 libs/common/src/lib/routes/routes.ts - 226 + 221 libs/common/src/lib/routes/routes.ts - 234 + 229 @@ -5494,11 +5570,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 224 + 219 libs/common/src/lib/routes/routes.ts - 227 + 222 @@ -5507,11 +5583,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 208 + 203 libs/common/src/lib/routes/routes.ts - 211 + 206 @@ -5520,11 +5596,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 279 + 274 libs/common/src/lib/routes/routes.ts - 280 + 275 @@ -5533,11 +5609,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 289 + 284 libs/common/src/lib/routes/routes.ts - 290 + 285 @@ -5546,11 +5622,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 299 + 294 libs/common/src/lib/routes/routes.ts - 300 + 295 @@ -5559,31 +5635,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 299 libs/common/src/lib/routes/routes.ts - 305 + 300 libs/common/src/lib/routes/routes.ts - 310 + 305 libs/common/src/lib/routes/routes.ts - 318 + 313 libs/common/src/lib/routes/routes.ts - 326 + 321 libs/common/src/lib/routes/routes.ts - 334 + 329 libs/common/src/lib/routes/routes.ts - 342 + 337 @@ -5648,11 +5724,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 340 + 335 libs/common/src/lib/routes/routes.ts - 344 + 339 @@ -5660,7 +5736,7 @@ Suivi des Actions libs/ui/src/lib/i18n.ts - 111 + 112 @@ -5679,6 +5755,14 @@ 369 + + Data gathering has been started. + Data gathering has been started. + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 413 + + Global Mondial @@ -5720,7 +5804,7 @@ Convert to apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 174 + 175 @@ -5792,7 +5876,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 275 libs/ui/src/lib/i18n.ts @@ -5888,7 +5972,7 @@ Statut apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 78 + 82 libs/common/src/lib/routes/routes.ts @@ -5928,11 +6012,11 @@ Confirmez la suppressoion de ce profil d’actif? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 28 + 29 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 66 + 71 @@ -5948,7 +6032,7 @@ Industrie libs/ui/src/lib/i18n.ts - 97 + 98 @@ -6004,7 +6088,7 @@ Oops, échec du transfert de la cash balance. apps/client/src/app/pages/accounts/accounts-page.component.ts - 358 + 355 @@ -6044,7 +6128,7 @@ Santé libs/ui/src/lib/i18n.ts - 96 + 97 @@ -6052,7 +6136,7 @@ Confirmer la suppresion de ce message système? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 255 + 260 @@ -6084,7 +6168,7 @@ Cash Balances apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 143 + 170 @@ -6120,7 +6204,7 @@ Le prix actuel du marché est apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 766 + 850 @@ -6128,7 +6212,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 606 + 725 @@ -6202,18 +6286,6 @@ Investment Investissement - - apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 173 - - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 60 - - - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 85 - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 101 @@ -6236,7 +6308,7 @@ Clôturer la Position apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 449 + 451 @@ -6276,7 +6348,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6284,11 +6356,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6296,7 +6368,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6304,11 +6376,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6324,7 +6396,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -6368,7 +6440,7 @@ année apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6380,7 +6452,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -6388,11 +6460,11 @@ années apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -6408,7 +6480,7 @@ Collecter les données apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 629 + 748 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6420,7 +6492,7 @@ Rechercher une position... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 449 @@ -6440,7 +6512,7 @@ libs/common/src/lib/routes/routes.ts - 260 + 255 @@ -6452,7 +6524,7 @@ libs/common/src/lib/routes/routes.ts - 268 + 263 @@ -6461,11 +6533,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 263 + 258 libs/common/src/lib/routes/routes.ts - 266 + 261 @@ -6473,7 +6545,7 @@ Tous les jours apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 244 @@ -6511,9 +6583,13 @@ Activity Activitées + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 101 + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 231 + 232 @@ -6521,7 +6597,7 @@ Rendement en Dividende apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 198 + 199 @@ -6577,7 +6653,7 @@ Supprimer les Activitées libs/ui/src/lib/activities-table/activities-table.component.html - 92 + 105 @@ -6585,7 +6661,7 @@ Internationalisation libs/common/src/lib/routes/routes.ts - 119 + 114 @@ -6593,7 +6669,7 @@ Confirmer la suppresion de votre compte Ghostfolio ? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 229 + 244 @@ -6601,7 +6677,7 @@ Aller à une page... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 450 @@ -6649,7 +6725,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 134 + 129 @@ -6657,7 +6733,7 @@ Inclure dans apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 399 + 400 @@ -6665,7 +6741,7 @@ Oops! Une erreur s’est produite lors de la configuration de l’authentification biométrique. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 352 + 363 @@ -6681,7 +6757,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 128 @@ -6729,7 +6805,7 @@ Budget libs/ui/src/lib/i18n.ts - 104 + 105 @@ -6797,7 +6873,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 51 + 55 @@ -6805,7 +6881,7 @@ Family Office libs/ui/src/lib/i18n.ts - 107 + 108 @@ -6885,7 +6961,7 @@ Gestion de Patrimoine libs/ui/src/lib/i18n.ts - 113 + 114 @@ -6893,7 +6969,7 @@ Voir la Position libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 487 @@ -6901,7 +6977,7 @@ Voulez-vous vraiment supprimer ces profils d’actifs ? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 67 + 72 @@ -6909,7 +6985,7 @@ Erreur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 757 + 841 @@ -6949,11 +7025,11 @@ Annuler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 162 + 163 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 753 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6977,7 +7053,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 112 + 107 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7005,7 +7081,7 @@ Fermer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 636 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7037,11 +7113,11 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 244 + 252 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 114 + 109 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7057,7 +7133,7 @@ Rôle apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 44 + 45 @@ -7081,7 +7157,7 @@ Déclaration Fiscale libs/ui/src/lib/i18n.ts - 112 + 113 @@ -7097,7 +7173,7 @@ Variation avec taux de change appliqué Variation apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 63 + 64 @@ -7113,7 +7189,7 @@ Performance avec taux de change appliqué Performance apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 83 + 84 @@ -7161,7 +7237,7 @@ a été copié dans le presse-papiers apps/client/src/app/components/admin-overview/admin-overview.component.ts - 223 + 228 libs/ui/src/lib/value/value.component.ts @@ -7229,7 +7305,7 @@ Services Financiers libs/ui/src/lib/i18n.ts - 95 + 96 @@ -7259,6 +7335,10 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 270 + + libs/ui/src/lib/activities-table/activities-table.component.html + 101 + cannot be self-hosted @@ -7284,6 +7364,14 @@ 278 + + Shares Before + Shares Before + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 597 + + cannot be used anonymously ne peut pas être utilisé de manière anonyme @@ -7313,7 +7401,7 @@ Suivi des Dividendes libs/ui/src/lib/i18n.ts - 105 + 106 @@ -7357,7 +7445,7 @@ Définir clé API apps/client/src/app/components/admin-settings/admin-settings.component.html - 188 + 197 @@ -7373,7 +7461,7 @@ Recherche d’Investissement libs/ui/src/lib/i18n.ts - 109 + 110 @@ -7397,7 +7485,7 @@ libs/common/src/lib/routes/routes.ts - 313 + 308 @@ -7413,7 +7501,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 316 @@ -7422,11 +7510,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 316 + 311 libs/common/src/lib/routes/routes.ts - 319 + 314 @@ -7435,11 +7523,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 308 + 303 libs/common/src/lib/routes/routes.ts - 311 + 306 @@ -7463,7 +7551,7 @@ sur apps/client/src/app/components/admin-settings/admin-settings.component.html - 152 + 157 @@ -7471,7 +7559,7 @@ requêtes journalières apps/client/src/app/components/admin-settings/admin-settings.component.html - 154 + 159 @@ -7479,7 +7567,7 @@ Retirer la clé API apps/client/src/app/components/admin-settings/admin-settings.component.html - 178 + 187 @@ -7487,7 +7575,7 @@ Voulez-vous vraiment supprimer la clé API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 143 + 144 @@ -7507,7 +7595,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 141 @@ -7579,7 +7667,7 @@ Sauvegarder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 645 + 764 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7599,7 +7687,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 133 + 143 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7611,7 +7699,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 123 + 118 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7655,7 +7743,7 @@ Suivi du Patrimoine Net libs/ui/src/lib/i18n.ts - 110 + 111 @@ -7663,7 +7751,7 @@ Veuillez saisir votre clé API Ghostfolio. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 162 + 163 @@ -7695,7 +7783,7 @@ Paresseux apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7703,7 +7791,7 @@ Instantané apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7711,7 +7799,7 @@ Prix du marché par défaut apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 638 @@ -7719,7 +7807,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 556 + 675 @@ -7727,7 +7815,7 @@ Do you really want to convert the data source to ? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 485 + 525 @@ -7735,7 +7823,7 @@ Selecteur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 572 + 691 @@ -7743,7 +7831,7 @@ En-têtes de requête HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 651 @@ -7751,7 +7839,7 @@ fin de journée apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7759,7 +7847,7 @@ temps réel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7775,7 +7863,7 @@ Créer libs/ui/src/lib/tags-selector/tags-selector.component.html - 64 + 62 @@ -7940,11 +8028,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 232 + 227 libs/common/src/lib/routes/routes.ts - 235 + 230 @@ -7956,7 +8044,7 @@ libs/common/src/lib/routes/routes.ts - 237 + 232 @@ -7972,7 +8060,7 @@ () est déjà utilisé. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 718 + 801 @@ -7980,7 +8068,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 - 721 + 804 @@ -7988,7 +8076,7 @@ Appliquer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 155 @@ -8068,7 +8156,7 @@ libs/common/src/lib/routes/routes.ts - 110 + 105 @@ -8079,6 +8167,18 @@ 142 + + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 102 + + Log out Se déconnecter @@ -8090,13 +8190,9 @@ Calculations are based on delayed market data and may not be displayed in real-time. Les calculs sont basés sur des données de marché retardées et peuvent ne pas être affichés en temps réel. - - apps/client/src/app/components/home-market/home-market.html - 28 - apps/client/src/app/components/markets/markets.html - 54 + 64 @@ -8105,11 +8201,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 200 + 195 libs/common/src/lib/routes/routes.ts - 203 + 198 @@ -8117,7 +8213,7 @@ Suivi des ETF libs/ui/src/lib/i18n.ts - 106 + 107 @@ -8125,7 +8221,7 @@ Le compte utilisateur de démonstration a été synchronisé. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 323 + 334 @@ -8133,7 +8229,7 @@ Synchroniser le compte utilisateur de démonstration apps/client/src/app/components/admin-overview/admin-overview.html - 128 + 131 @@ -8205,7 +8301,7 @@ libs/common/src/lib/routes/routes.ts - 251 + 246 @@ -8213,7 +8309,7 @@ Solutions open source alternatives à libs/common/src/lib/routes/routes.ts - 346 + 341 @@ -8246,15 +8342,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 332 + 327 libs/common/src/lib/routes/routes.ts - 335 + 330 libs/common/src/lib/routes/routes.ts - 343 + 338 @@ -8263,11 +8359,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 324 + 319 libs/common/src/lib/routes/routes.ts - 327 + 322 @@ -8347,7 +8443,7 @@ Mois en cours apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 @@ -8492,11 +8588,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 356 + 351 libs/common/src/lib/routes/routes.ts - 357 + 352 @@ -8528,7 +8624,7 @@ Actions apps/client/src/app/components/markets/markets.component.ts - 51 + 54 apps/client/src/app/pages/features/features-page.html @@ -8540,7 +8636,7 @@ Crypto-monnaies apps/client/src/app/components/markets/markets.component.ts - 52 + 55 apps/client/src/app/pages/features/features-page.html @@ -8552,7 +8648,7 @@ Gérer le profil d’actif apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 479 @@ -8580,7 +8676,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 101 + 102 @@ -8984,7 +9080,7 @@ Date d’Inscription apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 56 + 58 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 49026ae6a..260a4d68a 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -59,7 +59,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 166 + 174 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -67,11 +67,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 5 + 7 libs/ui/src/lib/activities-table/activities-table.component.html - 183 + 197 @@ -115,7 +115,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 332 + 333 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -151,7 +151,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 161 + 175 libs/ui/src/lib/benchmark/benchmark.component.html @@ -211,11 +211,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 284 + 298 libs/ui/src/lib/activities-table/activities-table.component.html - 320 + 334 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -255,7 +255,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 483 + 497 @@ -271,7 +271,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 235 + 238 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -281,6 +281,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 100 + + apps/client/src/app/components/admin-users/admin-users.html + 254 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 27 @@ -295,7 +299,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 513 + 527 libs/ui/src/lib/benchmark/benchmark.component.html @@ -315,7 +319,7 @@ Paid apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 129 + 136 @@ -339,7 +343,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 198 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -350,6 +354,14 @@ 20 + + Unknown + Unknown + + libs/ui/src/lib/i18n.ts + 88 + + Attempts Tentativi @@ -399,7 +411,7 @@ Profilo dell’asset apps/client/src/app/components/admin-settings/admin-settings.component.html - 123 + 128 libs/ui/src/lib/assistant/assistant.html @@ -415,7 +427,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 486 + 487 @@ -426,6 +438,14 @@ 208 + + Splits + Splits + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 512 + + View Stacktrace Visualizza Stacktrace @@ -455,12 +475,20 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 447 + 448 Date Data + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 521 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 560 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 156 @@ -471,7 +499,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 206 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -495,7 +523,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 113 + 114 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -511,11 +539,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 235 + 236 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 221 + 222 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -539,7 +567,7 @@ Vuoi davvero eliminare questo buono? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 242 + 247 @@ -547,7 +575,7 @@ Vuoi davvero svuotare la cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 279 + 290 @@ -555,7 +583,7 @@ Imposta il messaggio di sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 299 + 310 @@ -563,7 +591,7 @@ per utente apps/client/src/app/components/admin-overview/admin-overview.component.ts - 178 + 181 @@ -591,7 +619,7 @@ Messaggio di sistema apps/client/src/app/components/admin-overview/admin-overview.html - 88 + 89 @@ -599,7 +627,7 @@ Imposta messaggio apps/client/src/app/components/admin-overview/admin-overview.html - 110 + 113 @@ -607,7 +635,7 @@ Modalità di sola lettura apps/client/src/app/components/admin-overview/admin-overview.html - 64 + 63 @@ -615,15 +643,19 @@ Buoni sconto apps/client/src/app/components/admin-overview/admin-overview.html - 148 + 151 Add Aggiungi + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 615 + apps/client/src/app/components/admin-overview/admin-overview.html - 298 + 301 libs/ui/src/lib/account-balances/account-balances.component.html @@ -635,7 +667,7 @@ Bilancio domestico apps/client/src/app/components/admin-overview/admin-overview.html - 117 + 120 @@ -643,7 +675,7 @@ Svuota la cache apps/client/src/app/components/admin-overview/admin-overview.html - 133 + 136 @@ -687,7 +719,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 124 + 132 @@ -702,8 +734,8 @@ Current Market Mood Stato d’animo attuale del mercato - apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html - 12 + libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html + 23 @@ -755,11 +787,11 @@ Creation apps/client/src/app/components/admin-overview/admin-overview.html - 185 + 188 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 150 + 158 @@ -795,7 +827,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 215 + 230 @@ -806,12 +838,20 @@ 64 + + Split Ratio + Split Ratio + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 526 + + Last Days Ultimi giorni apps/client/src/app/components/markets/markets.html - 17 + 24 @@ -847,7 +887,7 @@ oppure apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 167 + 168 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -895,7 +935,7 @@ Energy libs/ui/src/lib/i18n.ts - 94 + 95 @@ -959,7 +999,7 @@ Potere d’acquisto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 196 + 256 @@ -967,7 +1007,7 @@ Patrimonio netto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 320 + 337 @@ -975,7 +1015,7 @@ Prestazioni annualizzate apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 334 + 351 @@ -983,7 +1023,7 @@ Inserisci l’importo del tuo fondo di emergenza: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 135 + 145 @@ -991,15 +1031,15 @@ Settori apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 301 + 302 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 421 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 290 + 291 apps/client/src/app/pages/public/public-page.html @@ -1011,15 +1051,15 @@ Paesi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 312 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 431 + 432 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 302 + 303 @@ -1027,7 +1067,7 @@ Tag apps/client/src/app/components/admin-settings/admin-settings.component.html - 218 + 227 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1035,7 +1075,7 @@ libs/ui/src/lib/tags-selector/tags-selector.component.html - 25 + 23 @@ -1043,7 +1083,7 @@ Segnala un’anomalia dei dati apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 462 + 464 @@ -1091,7 +1131,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 366 @@ -1099,11 +1139,11 @@ anno corrente apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -1111,11 +1151,11 @@ 1 anno apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -1131,11 +1171,11 @@ 5 anni apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -1151,11 +1191,11 @@ Massimo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 244 + 276 libs/ui/src/lib/assistant/assistant.component.ts - 415 + 416 @@ -1191,7 +1231,7 @@ libs/common/src/lib/routes/routes.ts - 240 + 235 @@ -1207,7 +1247,7 @@ libs/common/src/lib/routes/routes.ts - 229 + 224 @@ -1227,7 +1267,7 @@ Inserisci il tuo codice del buono: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 214 + 203 @@ -1235,7 +1275,7 @@ Impossibile riscattare il codice del buono apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 178 + 181 @@ -1243,7 +1283,7 @@ Consumer Defensive libs/ui/src/lib/i18n.ts - 93 + 94 @@ -1251,15 +1291,7 @@ Il codice del buono è stato riscattato apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 191 - - - - Reload - Ricarica - - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 194 @@ -1267,7 +1299,7 @@ Vuoi davvero rimuovere questo metodo di accesso? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 303 + 314 @@ -1303,7 +1335,7 @@ Utilities libs/ui/src/lib/i18n.ts - 101 + 102 @@ -1327,7 +1359,7 @@ Coupon apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 134 + 141 @@ -1335,7 +1367,7 @@ Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 666 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1447,11 +1479,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 384 + 396 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 101 + 109 apps/client/src/app/pages/accounts/accounts-page.html @@ -1495,11 +1527,11 @@ Valuta apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 216 + 217 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 339 + 340 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1519,7 +1551,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 303 + 317 @@ -1527,7 +1559,7 @@ Saldo di cassa apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 43 + 55 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1543,7 +1575,7 @@ Piattaforma apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 113 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1559,7 +1591,7 @@ ID account apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 103 + 98 @@ -1567,7 +1599,7 @@ Financial Planning libs/ui/src/lib/i18n.ts - 108 + 109 @@ -1695,7 +1727,7 @@ libs/common/src/lib/routes/routes.ts - 245 + 240 @@ -1703,7 +1735,7 @@ Poiché hai già effettuato l’accesso, non puoi accedere all’account demo. apps/client/src/app/pages/demo/demo-page.component.ts - 33 + 32 @@ -1719,7 +1751,7 @@ Duration apps/client/src/app/components/admin-overview/admin-overview.html - 172 + 175 @@ -1739,7 +1771,15 @@ libs/common/src/lib/routes/routes.ts - 271 + 266 + + + + Invalid API key + Invalid API key + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 112 @@ -1759,15 +1799,19 @@ libs/common/src/lib/routes/routes.ts - 276 + 271 Overview Panoramica + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 42 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 115 apps/client/src/app/components/header/header.component.html @@ -1779,7 +1823,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 47 + 48 apps/client/src/app/pages/admin/admin-page.component.ts @@ -1791,11 +1835,11 @@ libs/common/src/lib/routes/routes.ts - 113 + 108 libs/common/src/lib/routes/routes.ts - 190 + 185 @@ -1803,7 +1847,7 @@ Mercati apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 403 + 404 apps/client/src/app/components/footer/footer.component.html @@ -1813,10 +1857,6 @@ apps/client/src/app/components/header/header.component.html 408 - - apps/client/src/app/components/home-market/home-market.html - 2 - apps/client/src/app/components/markets/markets.html 2 @@ -1835,15 +1875,11 @@ libs/common/src/lib/routes/routes.ts - 100 - - - libs/common/src/lib/routes/routes.ts - 281 + 276 libs/common/src/lib/routes/routes.ts - 329 + 324 @@ -1859,7 +1895,7 @@ libs/common/src/lib/routes/routes.ts - 154 + 149 @@ -1935,7 +1971,7 @@ Trial apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 133 + 140 @@ -1947,7 +1983,7 @@ libs/common/src/lib/routes/routes.ts - 159 + 154 @@ -1995,7 +2031,7 @@ Partecipazioni apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 100 + 127 apps/client/src/app/components/home-holdings/home-holdings.html @@ -2003,7 +2039,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 168 apps/client/src/app/pages/public/public-page.html @@ -2015,7 +2051,7 @@ libs/common/src/lib/routes/routes.ts - 187 + 182 libs/ui/src/lib/assistant/assistant.html @@ -2035,7 +2071,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 @@ -2067,7 +2103,7 @@ Nome, simbolo o ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 133 + 134 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2087,7 +2123,7 @@ Consumer Cyclical libs/ui/src/lib/i18n.ts - 92 + 93 @@ -2095,7 +2131,7 @@ Quantità apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 159 + 160 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -2103,7 +2139,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 227 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2119,7 +2155,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 237 + 251 @@ -2127,7 +2163,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 455 + 456 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2143,7 +2179,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 370 + 384 @@ -2151,15 +2187,15 @@ Attività apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 84 + 103 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 111 + 138 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 244 + 245 apps/client/src/app/components/admin-overview/admin-overview.html @@ -2175,15 +2211,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 233 + 234 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 350 + 362 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 110 + 118 apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -2191,7 +2227,7 @@ libs/common/src/lib/routes/routes.ts - 149 + 144 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2251,7 +2287,7 @@ libs/common/src/lib/routes/routes.ts - 291 + 286 @@ -2259,7 +2295,7 @@ Portafoglio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 139 + 140 apps/client/src/app/components/header/header.component.html @@ -2275,7 +2311,7 @@ libs/common/src/lib/routes/routes.ts - 172 + 167 @@ -2311,7 +2347,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 296 @@ -2355,7 +2391,7 @@ libs/common/src/lib/routes/routes.ts - 352 + 347 @@ -2387,7 +2423,7 @@ Bozza libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 181 @@ -2399,11 +2435,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 30 libs/ui/src/lib/activities-table/activities-table.component.html - 406 + 420 @@ -2411,11 +2447,11 @@ Esporta le attività libs/ui/src/lib/activities-table/activities-table.component.html - 64 + 72 libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 448 @@ -2423,11 +2459,11 @@ Esporta le bozze come ICS libs/ui/src/lib/activities-table/activities-table.component.html - 77 + 86 libs/ui/src/lib/activities-table/activities-table.component.html - 447 + 461 @@ -2435,7 +2471,7 @@ Clona libs/ui/src/lib/activities-table/activities-table.component.html - 492 + 506 @@ -2443,7 +2479,7 @@ Esporta la bozza come ICS libs/ui/src/lib/activities-table/activities-table.component.html - 502 + 516 @@ -2451,7 +2487,11 @@ Vuoi davvero eliminare questa attività? libs/ui/src/lib/activities-table/activities-table.component.ts - 327 + 333 + + + libs/ui/src/lib/activities-table/activities-table.component.ts + 344 @@ -2549,10 +2589,6 @@ Exclude from Analysis Exclude from Analysis - - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 97 - libs/ui/src/lib/i18n.ts 22 @@ -2583,7 +2619,7 @@ Prezzo massimo apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 149 + 150 @@ -2623,11 +2659,11 @@ Settore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 280 + 281 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 270 + 271 @@ -2635,7 +2671,7 @@ Paese apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 296 apps/client/src/app/components/admin-users/admin-users.html @@ -2643,11 +2679,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 284 + 285 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 88 + 96 @@ -2655,7 +2691,7 @@ Prezzo minimo apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 131 + 132 @@ -2679,11 +2715,11 @@ Interesse apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 67 + 79 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 406 + 424 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2731,7 +2767,7 @@ Subscription History apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 141 + 149 @@ -2747,7 +2783,7 @@ Paura apps/client/src/app/components/markets/markets.component.ts - 46 + 58 libs/ui/src/lib/i18n.ts @@ -2759,7 +2795,7 @@ Avidità apps/client/src/app/components/markets/markets.component.ts - 47 + 59 libs/ui/src/lib/i18n.ts @@ -2771,7 +2807,7 @@ Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 365 + 377 @@ -2807,11 +2843,11 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 401 + 402 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 151 + 152 @@ -2819,11 +2855,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 641 + 724 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 644 + 727 @@ -2847,7 +2883,7 @@ Escluso dall’analisi apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 270 + 286 @@ -2855,7 +2891,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 74 + 77 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2911,7 +2947,7 @@ Importo totale apps/client/src/app/components/investment-chart/investment-chart.component.ts - 143 + 144 @@ -2927,7 +2963,7 @@ Code apps/client/src/app/components/admin-overview/admin-overview.html - 159 + 162 @@ -2935,7 +2971,7 @@ Tasso di risparmio apps/client/src/app/components/investment-chart/investment-chart.component.ts - 201 + 193 @@ -2947,7 +2983,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 335 + 349 libs/ui/src/lib/i18n.ts @@ -2967,15 +3003,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 254 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 349 + 350 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 244 + 245 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -3003,7 +3039,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 186 + 187 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3011,13 +3047,21 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 322 + 323 libs/ui/src/lib/i18n.ts 35 + + Export + Export + + libs/ui/src/lib/activities-table/activities-table.component.html + 68 + + Tag Etichetta @@ -3035,7 +3079,7 @@ Contanti apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 168 + 227 libs/ui/src/lib/i18n.ts @@ -3055,7 +3099,7 @@ Azione ordinaria apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 55 + 67 libs/ui/src/lib/i18n.ts @@ -3079,7 +3123,7 @@ libs/ui/src/lib/i18n.ts - 99 + 100 @@ -3087,7 +3131,7 @@ Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 65 + 67 @@ -3151,15 +3195,15 @@ Fondo di emergenza apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 254 + 270 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 356 + 373 apps/client/src/app/pages/features/features-page.html @@ -3179,7 +3223,7 @@ libs/ui/src/lib/i18n.ts - 98 + 99 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -3243,7 +3287,7 @@ Communication Services libs/ui/src/lib/i18n.ts - 91 + 92 @@ -3270,6 +3314,22 @@ 79 + + Invested Capital + Invested Capital + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 174 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 85 + + South America Sud America @@ -3303,7 +3363,7 @@ Price apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 176 + 184 @@ -3311,7 +3371,7 @@ Do you really want to convert this asset profile to ()? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 723 + 806 @@ -3319,7 +3379,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 467 + 468 @@ -3343,7 +3403,7 @@ Mappatura dei simboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 410 @@ -3359,15 +3419,15 @@ Dividendi apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 79 + 91 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 188 + 189 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 419 + 437 apps/client/src/app/pages/features/features-page.html @@ -3403,15 +3463,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 262 + 263 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 365 + 366 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 253 + 254 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -3459,7 +3519,7 @@ Dati del mercato apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 406 + 418 libs/common/src/lib/routes/routes.ts @@ -3495,7 +3555,7 @@ libs/common/src/lib/routes/routes.ts - 105 + 100 @@ -3535,11 +3595,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 52 + 54 libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 434 @@ -3591,7 +3651,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 148 @@ -3634,6 +3694,14 @@ 221 + + Investments + Investments + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 197 + + Sneak peek at upcoming functionality Un’anteprima delle funzionalità in arrivo @@ -3775,7 +3843,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 248 @@ -3867,7 +3935,7 @@ Expiration apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 209 + 217 @@ -3883,11 +3951,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 758 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 678 + 761 @@ -3903,7 +3971,7 @@ Commissioni apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -4058,22 +4126,6 @@ 228 - - Delete User - Elimina l’utente - - apps/client/src/app/components/admin-users/admin-users.html - 254 - - - - Do you really want to delete these activities? - Vuoi davvero eliminare tutte le tue attività? - - libs/ui/src/lib/activities-table/activities-table.component.ts - 317 - - By ETF Provider Per fornitore di ETF @@ -4103,7 +4155,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 @@ -4114,16 +4166,24 @@ 10 + + Cache has been flushed. + Cache has been flushed. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 281 + + Url Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 443 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 707 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4139,7 +4199,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 665 + 748 @@ -4155,7 +4215,7 @@ Piattaforme apps/client/src/app/components/admin-settings/admin-settings.component.html - 212 + 221 @@ -4262,6 +4322,14 @@ 118 + + Shares After + Shares After + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 584 + + Frequently Asked Questions (FAQ) Domande più frequenti (FAQ) @@ -4343,7 +4411,7 @@ Passività apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 298 + 315 apps/client/src/app/pages/features/features-page.html @@ -4363,7 +4431,7 @@ libs/common/src/lib/routes/routes.ts - 205 + 200 @@ -4379,7 +4447,7 @@ libs/common/src/lib/routes/routes.ts - 213 + 208 @@ -4499,7 +4567,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 146 + 141 @@ -4507,7 +4575,7 @@ Technology libs/ui/src/lib/i18n.ts - 100 + 101 @@ -4523,7 +4591,7 @@ Total apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 160 + 168 @@ -4531,7 +4599,7 @@ Configurazione dello scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 509 + 628 @@ -4551,7 +4619,7 @@ libs/common/src/lib/routes/routes.ts - 349 + 344 @@ -4599,7 +4667,7 @@ Coupon has been created apps/client/src/app/components/admin-overview/admin-overview.component.ts - 224 + 229 @@ -4727,7 +4795,7 @@ Web libs/ui/src/lib/i18n.ts - 120 + 121 @@ -4807,7 +4875,7 @@ ETF senza paesi apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 138 @@ -4815,7 +4883,7 @@ ETF senza settori apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 143 @@ -4823,7 +4891,7 @@ An error occurred while converting the data source to . apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 482 + 522 @@ -5043,7 +5111,7 @@ Valute apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 133 apps/client/src/app/pages/public/public-page.html @@ -5095,11 +5163,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 589 + 672 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 592 + 675 @@ -5195,7 +5263,7 @@ Basic Materials libs/ui/src/lib/i18n.ts - 90 + 91 @@ -5222,6 +5290,14 @@ 84 + + Do you really want to delete these activities? + Do you really want to delete these activities? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 334 + + Why Ghostfolio? Perché Ghostfolio? @@ -5323,7 +5399,7 @@ Oops! Could not delete the asset profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 52 + 56 @@ -5379,7 +5455,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 139 + 134 @@ -5428,19 +5504,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 249 libs/common/src/lib/routes/routes.ts - 255 + 250 libs/common/src/lib/routes/routes.ts - 259 + 254 libs/common/src/lib/routes/routes.ts - 265 + 260 @@ -5449,11 +5525,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 274 + 269 libs/common/src/lib/routes/routes.ts - 275 + 270 @@ -5462,31 +5538,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 196 + 191 libs/common/src/lib/routes/routes.ts - 197 + 192 libs/common/src/lib/routes/routes.ts - 202 + 197 libs/common/src/lib/routes/routes.ts - 210 + 205 libs/common/src/lib/routes/routes.ts - 218 + 213 libs/common/src/lib/routes/routes.ts - 226 + 221 libs/common/src/lib/routes/routes.ts - 234 + 229 @@ -5495,11 +5571,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 224 + 219 libs/common/src/lib/routes/routes.ts - 227 + 222 @@ -5508,11 +5584,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 208 + 203 libs/common/src/lib/routes/routes.ts - 211 + 206 @@ -5521,11 +5597,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 279 + 274 libs/common/src/lib/routes/routes.ts - 280 + 275 @@ -5534,11 +5610,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 289 + 284 libs/common/src/lib/routes/routes.ts - 290 + 285 @@ -5547,11 +5623,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 299 + 294 libs/common/src/lib/routes/routes.ts - 300 + 295 @@ -5560,31 +5636,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 299 libs/common/src/lib/routes/routes.ts - 305 + 300 libs/common/src/lib/routes/routes.ts - 310 + 305 libs/common/src/lib/routes/routes.ts - 318 + 313 libs/common/src/lib/routes/routes.ts - 326 + 321 libs/common/src/lib/routes/routes.ts - 334 + 329 libs/common/src/lib/routes/routes.ts - 342 + 337 @@ -5649,11 +5725,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 340 + 335 libs/common/src/lib/routes/routes.ts - 344 + 339 @@ -5661,7 +5737,7 @@ Stock Tracking libs/ui/src/lib/i18n.ts - 111 + 112 @@ -5680,6 +5756,14 @@ 369 + + Data gathering has been started. + Data gathering has been started. + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 413 + + Global Globale @@ -5721,7 +5805,7 @@ Convert to apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 174 + 175 @@ -5793,7 +5877,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 275 libs/ui/src/lib/i18n.ts @@ -5889,7 +5973,7 @@ Iscrizione apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 78 + 82 libs/common/src/lib/routes/routes.ts @@ -5929,11 +6013,11 @@ Vuoi veramente eliminare il profilo di questo asset? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 28 + 29 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 66 + 71 @@ -5949,7 +6033,7 @@ Industrials libs/ui/src/lib/i18n.ts - 97 + 98 @@ -6005,7 +6089,7 @@ Ops, il trasferimento del saldo di cassa è fallito. apps/client/src/app/pages/accounts/accounts-page.component.ts - 358 + 355 @@ -6045,7 +6129,7 @@ Healthcare libs/ui/src/lib/i18n.ts - 96 + 97 @@ -6053,7 +6137,7 @@ Confermi di voler cancellare questo messaggio di sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 255 + 260 @@ -6085,7 +6169,7 @@ Saldi di cassa apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 143 + 170 @@ -6121,7 +6205,7 @@ L’attuale prezzo di mercato è apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 766 + 850 @@ -6129,7 +6213,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 606 + 725 @@ -6203,18 +6287,6 @@ Investment Investimento - - apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 173 - - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 60 - - - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 85 - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 101 @@ -6237,7 +6309,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 449 + 451 @@ -6277,7 +6349,7 @@ Da inizio settimana libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6285,11 +6357,11 @@ Settimana corrente apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6297,7 +6369,7 @@ Da inizio mese libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6305,11 +6377,11 @@ Mese corrente apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6325,7 +6397,7 @@ Da inizio anno libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -6369,7 +6441,7 @@ anno apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6381,7 +6453,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -6389,11 +6461,11 @@ anni apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -6409,7 +6481,7 @@ Raccolta Dati apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 629 + 748 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6421,7 +6493,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 449 @@ -6441,7 +6513,7 @@ libs/common/src/lib/routes/routes.ts - 260 + 255 @@ -6453,7 +6525,7 @@ libs/common/src/lib/routes/routes.ts - 268 + 263 @@ -6462,11 +6534,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 263 + 258 libs/common/src/lib/routes/routes.ts - 266 + 261 @@ -6474,7 +6546,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 244 @@ -6512,9 +6584,13 @@ Activity Attività + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 101 + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 231 + 232 @@ -6522,7 +6598,7 @@ Rendimento da Dividendi apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 198 + 199 @@ -6578,7 +6654,7 @@ Elimina le attività libs/ui/src/lib/activities-table/activities-table.component.html - 92 + 105 @@ -6586,7 +6662,7 @@ Internazionalizzazione libs/common/src/lib/routes/routes.ts - 119 + 114 @@ -6594,7 +6670,7 @@ Confermi di voler chiudere il tuo account Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 229 + 244 @@ -6602,7 +6678,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 450 @@ -6650,7 +6726,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 134 + 129 @@ -6658,7 +6734,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 399 + 400 @@ -6666,7 +6742,7 @@ Ops! C’è stato un errore impostando l’autenticazione biometrica. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 352 + 363 @@ -6682,7 +6758,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 128 @@ -6730,7 +6806,7 @@ Budgeting libs/ui/src/lib/i18n.ts - 104 + 105 @@ -6798,7 +6874,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 51 + 55 @@ -6806,7 +6882,7 @@ Ufficio familiare libs/ui/src/lib/i18n.ts - 107 + 108 @@ -6886,7 +6962,7 @@ Gestione Patrimoniale libs/ui/src/lib/i18n.ts - 113 + 114 @@ -6894,7 +6970,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 487 @@ -6902,7 +6978,7 @@ Do you really want to delete these asset profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 67 + 72 @@ -6910,7 +6986,7 @@ Errore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 757 + 841 @@ -6950,11 +7026,11 @@ Annulla apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 162 + 163 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 753 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6978,7 +7054,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 112 + 107 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7006,7 +7082,7 @@ Chiudi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 636 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7038,11 +7114,11 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 244 + 252 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 114 + 109 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7058,7 +7134,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 44 + 45 @@ -7082,7 +7158,7 @@ Tax Reporting libs/ui/src/lib/i18n.ts - 112 + 113 @@ -7098,7 +7174,7 @@ Cambio con effetto valuta Cambia apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 63 + 64 @@ -7114,7 +7190,7 @@ Prestazioni con effetto valuta Prestazioni apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 83 + 84 @@ -7162,7 +7238,7 @@ has been copied to the clipboard apps/client/src/app/components/admin-overview/admin-overview.component.ts - 223 + 228 libs/ui/src/lib/value/value.component.ts @@ -7230,7 +7306,7 @@ Financial Services libs/ui/src/lib/i18n.ts - 95 + 96 @@ -7260,6 +7336,10 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 270 + + libs/ui/src/lib/activities-table/activities-table.component.html + 101 + cannot be self-hosted @@ -7285,6 +7365,14 @@ 278 + + Shares Before + Shares Before + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 597 + + cannot be used anonymously non può essere usato anonimamente @@ -7314,7 +7402,7 @@ Dividend Tracking libs/ui/src/lib/i18n.ts - 105 + 106 @@ -7358,7 +7446,7 @@ Imposta API Key apps/client/src/app/components/admin-settings/admin-settings.component.html - 188 + 197 @@ -7374,7 +7462,7 @@ Investment Research libs/ui/src/lib/i18n.ts - 109 + 110 @@ -7398,7 +7486,7 @@ libs/common/src/lib/routes/routes.ts - 313 + 308 @@ -7414,7 +7502,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 316 @@ -7423,11 +7511,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 316 + 311 libs/common/src/lib/routes/routes.ts - 319 + 314 @@ -7436,11 +7524,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 308 + 303 libs/common/src/lib/routes/routes.ts - 311 + 306 @@ -7464,7 +7552,7 @@ di apps/client/src/app/components/admin-settings/admin-settings.component.html - 152 + 157 @@ -7472,7 +7560,7 @@ richieste giornaliere apps/client/src/app/components/admin-settings/admin-settings.component.html - 154 + 159 @@ -7480,7 +7568,7 @@ Rimuovi API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 178 + 187 @@ -7488,7 +7576,7 @@ Vuoi davvero eliminare l’API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 143 + 144 @@ -7508,7 +7596,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 141 @@ -7580,7 +7668,7 @@ Salva apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 645 + 764 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7600,7 +7688,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 133 + 143 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7612,7 +7700,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 123 + 118 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7656,7 +7744,7 @@ Net Worth Tracking libs/ui/src/lib/i18n.ts - 110 + 111 @@ -7664,7 +7752,7 @@ Inserisci la tua API key di Ghostfolio. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 162 + 163 @@ -7696,7 +7784,7 @@ Pigro apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7704,7 +7792,7 @@ Istantaneo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7712,7 +7800,7 @@ Prezzo di mercato predefinito apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 638 @@ -7720,7 +7808,7 @@ Modalità apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 556 + 675 @@ -7728,7 +7816,7 @@ Do you really want to convert the data source to ? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 485 + 525 @@ -7736,7 +7824,7 @@ Selettore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 572 + 691 @@ -7744,7 +7832,7 @@ Intestazioni della richiesta HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 651 @@ -7752,7 +7840,7 @@ fine giornata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7760,7 +7848,7 @@ in tempo reale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7776,7 +7864,7 @@ Creare libs/ui/src/lib/tags-selector/tags-selector.component.html - 64 + 62 @@ -7941,11 +8029,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 232 + 227 libs/common/src/lib/routes/routes.ts - 235 + 230 @@ -7957,7 +8045,7 @@ libs/common/src/lib/routes/routes.ts - 237 + 232 @@ -7973,7 +8061,7 @@ () e gia in uso. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 718 + 801 @@ -7981,7 +8069,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 - 721 + 804 @@ -7989,7 +8077,7 @@ Applica apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 155 @@ -8069,7 +8157,7 @@ libs/common/src/lib/routes/routes.ts - 110 + 105 @@ -8080,6 +8168,18 @@ 142 + + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 102 + + Log out Esci @@ -8091,13 +8191,9 @@ Calculations are based on delayed market data and may not be displayed in real-time. I calcoli sono basati su dati di mercato ritardati e potrebbero non essere visualizzati in tempo reale. - - apps/client/src/app/components/home-market/home-market.html - 28 - apps/client/src/app/components/markets/markets.html - 54 + 64 @@ -8106,11 +8202,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 200 + 195 libs/common/src/lib/routes/routes.ts - 203 + 198 @@ -8118,7 +8214,7 @@ ETF Tracking libs/ui/src/lib/i18n.ts - 106 + 107 @@ -8126,7 +8222,7 @@ L’account utente demo è stato sincronizzato. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 323 + 334 @@ -8134,7 +8230,7 @@ Sincronizza l’account utente demo apps/client/src/app/components/admin-overview/admin-overview.html - 128 + 131 @@ -8206,7 +8302,7 @@ libs/common/src/lib/routes/routes.ts - 251 + 246 @@ -8214,7 +8310,7 @@ L’alternativa open source a libs/common/src/lib/routes/routes.ts - 346 + 341 @@ -8247,15 +8343,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 332 + 327 libs/common/src/lib/routes/routes.ts - 335 + 330 libs/common/src/lib/routes/routes.ts - 343 + 338 @@ -8264,11 +8360,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 324 + 319 libs/common/src/lib/routes/routes.ts - 327 + 322 @@ -8348,7 +8444,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 @@ -8493,11 +8589,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 356 + 351 libs/common/src/lib/routes/routes.ts - 357 + 352 @@ -8529,7 +8625,7 @@ Azioni apps/client/src/app/components/markets/markets.component.ts - 51 + 54 apps/client/src/app/pages/features/features-page.html @@ -8541,7 +8637,7 @@ criptovalute apps/client/src/app/components/markets/markets.component.ts - 52 + 55 apps/client/src/app/pages/features/features-page.html @@ -8553,7 +8649,7 @@ Gestisci profilo risorsa apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 479 @@ -8581,7 +8677,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 101 + 102 @@ -8985,7 +9081,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 56 + 58 diff --git a/apps/client/src/locales/messages.ja.xlf b/apps/client/src/locales/messages.ja.xlf index 656891a9e..b0e5ecd0a 100644 --- a/apps/client/src/locales/messages.ja.xlf +++ b/apps/client/src/locales/messages.ja.xlf @@ -8,31 +8,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 196 + 191 libs/common/src/lib/routes/routes.ts - 197 + 192 libs/common/src/lib/routes/routes.ts - 202 + 197 libs/common/src/lib/routes/routes.ts - 210 + 205 libs/common/src/lib/routes/routes.ts - 218 + 213 libs/common/src/lib/routes/routes.ts - 226 + 221 libs/common/src/lib/routes/routes.ts - 234 + 229 @@ -41,19 +41,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 249 libs/common/src/lib/routes/routes.ts - 255 + 250 libs/common/src/lib/routes/routes.ts - 259 + 254 libs/common/src/lib/routes/routes.ts - 265 + 260 @@ -62,11 +62,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 274 + 269 libs/common/src/lib/routes/routes.ts - 275 + 270 @@ -75,11 +75,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 208 + 203 libs/common/src/lib/routes/routes.ts - 211 + 206 @@ -88,11 +88,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 279 + 274 libs/common/src/lib/routes/routes.ts - 280 + 275 @@ -101,11 +101,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 289 + 284 libs/common/src/lib/routes/routes.ts - 290 + 285 @@ -114,11 +114,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 224 + 219 libs/common/src/lib/routes/routes.ts - 227 + 222 @@ -127,11 +127,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 299 + 294 libs/common/src/lib/routes/routes.ts - 300 + 295 @@ -140,31 +140,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 299 libs/common/src/lib/routes/routes.ts - 305 + 300 libs/common/src/lib/routes/routes.ts - 310 + 305 libs/common/src/lib/routes/routes.ts - 318 + 313 libs/common/src/lib/routes/routes.ts - 326 + 321 libs/common/src/lib/routes/routes.ts - 334 + 329 libs/common/src/lib/routes/routes.ts - 342 + 337 @@ -260,7 +260,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 166 + 174 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -268,11 +268,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 5 + 7 libs/ui/src/lib/activities-table/activities-table.component.html - 183 + 197 @@ -312,7 +312,7 @@ 現金残高 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 43 + 55 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -328,7 +328,7 @@ プラットフォーム apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 113 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -344,7 +344,7 @@ 現金残高 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 143 + 170 @@ -368,7 +368,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 332 + 333 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -404,7 +404,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 161 + 175 libs/ui/src/lib/benchmark/benchmark.component.html @@ -444,11 +444,11 @@ 通貨 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 216 + 217 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 339 + 340 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -468,7 +468,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 303 + 317 @@ -504,11 +504,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 284 + 298 libs/ui/src/lib/activities-table/activities-table.component.html - 320 + 334 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -548,7 +548,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 483 + 497 @@ -564,7 +564,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 235 + 238 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -574,6 +574,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 100 + + apps/client/src/app/components/admin-users/admin-users.html + 254 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 27 @@ -588,7 +592,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 513 + 527 libs/ui/src/lib/benchmark/benchmark.component.html @@ -608,7 +612,7 @@ 支払い済み apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 129 + 136 @@ -628,7 +632,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 486 + 487 @@ -644,7 +648,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 198 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -655,6 +659,14 @@ 20 + + Unknown + Unknown + + libs/ui/src/lib/i18n.ts + 88 + + Attempts 試み @@ -715,6 +727,14 @@ 208 + + Splits + Splits + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 512 + + View Stacktrace スタックトレースを表示 @@ -744,12 +764,20 @@ アカウントを検索... libs/ui/src/lib/assistant/assistant.component.ts - 447 + 448 Date 日付 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 521 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 560 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 156 @@ -760,7 +788,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 206 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -784,7 +812,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 113 + 114 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -796,7 +824,7 @@ 通貨 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 133 apps/client/src/app/pages/public/public-page.html @@ -816,7 +844,7 @@ 国に縛られないETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 138 @@ -824,7 +852,7 @@ セクター別ではないETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 143 @@ -832,7 +860,7 @@ An error occurred while converting the data source to . apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 482 + 522 @@ -840,11 +868,11 @@ この資産プロファイルを削除してもよろしいですか? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 28 + 29 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 66 + 71 @@ -852,7 +880,7 @@ 絞り込み... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 365 + 377 @@ -864,11 +892,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 235 + 236 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 221 + 222 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -880,7 +908,7 @@ データ収集頻度 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 467 + 468 @@ -924,7 +952,7 @@ サブスクリプション履歴 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 141 + 149 @@ -976,7 +1004,7 @@ Healthcare libs/ui/src/lib/i18n.ts - 96 + 97 @@ -1024,11 +1052,11 @@ セクター apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 280 + 281 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 270 + 271 @@ -1036,7 +1064,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 296 apps/client/src/app/components/admin-users/admin-users.html @@ -1044,11 +1072,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 284 + 285 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 88 + 96 @@ -1056,15 +1084,15 @@ セクター apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 301 + 302 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 421 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 290 + 291 apps/client/src/app/pages/public/public-page.html @@ -1076,15 +1104,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 312 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 431 + 432 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 302 + 303 @@ -1092,7 +1120,7 @@ シンボルマッピング apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 410 @@ -1100,7 +1128,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 146 + 141 @@ -1108,7 +1136,7 @@ テクノロジー libs/ui/src/lib/i18n.ts - 100 + 101 @@ -1124,7 +1152,7 @@ 合計 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 160 + 168 @@ -1132,7 +1160,7 @@ スクレイパーの設定 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 509 + 628 @@ -1140,7 +1168,7 @@ メモ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 455 + 456 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1156,7 +1184,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 370 + 384 @@ -1180,7 +1208,7 @@ Industrials libs/ui/src/lib/i18n.ts - 97 + 98 @@ -1196,7 +1224,7 @@ 名称、シンボル、またはISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 133 + 134 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1216,7 +1244,7 @@ 景気敏感消費財 libs/ui/src/lib/i18n.ts - 92 + 93 @@ -1224,7 +1252,7 @@ このクーポンを削除してもよろしいですか? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 242 + 247 @@ -1232,7 +1260,7 @@ 本当にこのシステムメッセージを削除しますか? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 255 + 260 @@ -1240,7 +1268,7 @@ キャッシュをクリアしてもよろしいですか? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 279 + 290 @@ -1248,7 +1276,7 @@ システムメッセージを設定してください: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 299 + 310 @@ -1264,7 +1292,7 @@ ユーザーあたり apps/client/src/app/components/admin-overview/admin-overview.component.ts - 178 + 181 @@ -1288,7 +1316,7 @@ 読み取り専用モード apps/client/src/app/components/admin-overview/admin-overview.html - 64 + 63 @@ -1296,7 +1324,7 @@ システムメッセージ apps/client/src/app/components/admin-overview/admin-overview.html - 88 + 89 @@ -1304,7 +1332,7 @@ メッセージを設定 apps/client/src/app/components/admin-overview/admin-overview.html - 110 + 113 @@ -1312,15 +1340,19 @@ クーポン apps/client/src/app/components/admin-overview/admin-overview.html - 148 + 151 Add 追加 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 615 + apps/client/src/app/components/admin-overview/admin-overview.html - 298 + 301 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1332,7 +1364,7 @@ メンテナンス apps/client/src/app/components/admin-overview/admin-overview.html - 117 + 120 @@ -1340,7 +1372,7 @@ キャッシュをクリア apps/client/src/app/components/admin-overview/admin-overview.html - 133 + 136 @@ -1356,11 +1388,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 443 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 707 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1376,7 +1408,7 @@ 資産プロファイルを保存しました apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 665 + 748 @@ -1408,7 +1440,7 @@ 現在の年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 @@ -1419,12 +1451,20 @@ 10 + + Cache has been flushed. + Cache has been flushed. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 281 + + Platforms プラットフォーム apps/client/src/app/components/admin-settings/admin-settings.component.html - 212 + 221 @@ -1432,7 +1472,7 @@ タグ apps/client/src/app/components/admin-settings/admin-settings.component.html - 218 + 227 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1440,7 +1480,7 @@ libs/ui/src/lib/tags-selector/tags-selector.component.html - 25 + 23 @@ -1516,7 +1556,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 124 + 132 @@ -1535,24 +1575,16 @@ 228 - - Delete User - ユーザーを削除 - - apps/client/src/app/components/admin-users/admin-users.html - 254 - - Could not validate form フォームを検証できませんでした apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 641 + 724 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 644 + 727 @@ -1576,7 +1608,7 @@ ポートフォリオ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 139 + 140 apps/client/src/app/components/header/header.component.html @@ -1592,7 +1624,7 @@ libs/common/src/lib/routes/routes.ts - 172 + 167 @@ -1600,19 +1632,19 @@ ベンチマーク apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 401 + 402 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 151 + 152 Current Market Mood 現在の市場心理 - apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html - 12 + libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html + 23 @@ -1660,7 +1692,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 215 + 230 @@ -1671,12 +1703,20 @@ 64 + + Split Ratio + Split Ratio + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 526 + + Fear 恐怖 apps/client/src/app/components/markets/markets.component.ts - 46 + 58 libs/ui/src/lib/i18n.ts @@ -1688,7 +1728,7 @@ Greed apps/client/src/app/components/markets/markets.component.ts - 47 + 59 libs/ui/src/lib/i18n.ts @@ -1700,7 +1740,7 @@ 過去日間 apps/client/src/app/components/markets/markets.html - 17 + 24 @@ -1788,7 +1828,7 @@ 今週 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 @@ -1808,7 +1848,7 @@ 合計金額 apps/client/src/app/components/investment-chart/investment-chart.component.ts - 143 + 144 @@ -1816,7 +1856,7 @@ コード apps/client/src/app/components/admin-overview/admin-overview.html - 159 + 162 @@ -1824,7 +1864,7 @@ 貯蓄率 apps/client/src/app/components/investment-chart/investment-chart.component.ts - 201 + 193 @@ -1860,7 +1900,7 @@ または apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 167 + 168 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -1908,7 +1948,7 @@ エネルギー libs/ui/src/lib/i18n.ts - 94 + 95 @@ -1940,7 +1980,7 @@ 手数料 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -1984,7 +2024,7 @@ 購買力 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 196 + 256 @@ -1992,7 +2032,7 @@ 分析から除外 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 270 + 286 @@ -2000,7 +2040,7 @@ 負債 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 298 + 315 apps/client/src/app/pages/features/features-page.html @@ -2012,7 +2052,7 @@ 純資産(ネットワース) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 320 + 337 @@ -2020,7 +2060,7 @@ 年率換算パフォーマンス apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 334 + 351 @@ -2028,7 +2068,7 @@ 緊急用資金の金額を設定してください。 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 135 + 145 @@ -2036,7 +2076,7 @@ 最低価格 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 131 + 132 @@ -2044,7 +2084,7 @@ 最高価格 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 149 + 150 @@ -2052,7 +2092,7 @@ 数量 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 159 + 160 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -2060,7 +2100,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 227 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2072,7 +2112,7 @@ データグリッチの報告 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 462 + 464 @@ -2252,7 +2292,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 366 @@ -2260,11 +2300,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -2272,11 +2312,11 @@ 1年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -2292,11 +2332,11 @@ 5年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -2312,11 +2352,11 @@ マックス apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 244 + 276 libs/ui/src/lib/assistant/assistant.component.ts - 415 + 416 @@ -2360,7 +2400,7 @@ クーポンコードを入力してください。 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 214 + 203 @@ -2368,7 +2408,7 @@ クーポンコードを引き換えられませんでした apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 178 + 181 @@ -2376,7 +2416,7 @@ 消費者ディフェンシブ libs/ui/src/lib/i18n.ts - 93 + 94 @@ -2384,15 +2424,7 @@ クーポンコードが引き換えられました apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 191 - - - - Reload - 再読み込み - - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 194 @@ -2428,7 +2460,7 @@ オート apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 74 + 77 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2440,7 +2472,7 @@ このサインイン方法を本当に削除しますか? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 303 + 314 @@ -2448,7 +2480,7 @@ ユーティリティ libs/ui/src/lib/i18n.ts - 101 + 102 @@ -2480,7 +2512,7 @@ クーポン apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 134 + 141 @@ -2496,7 +2528,7 @@ ロケール apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 666 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2575,6 +2607,14 @@ 221 + + Investments + Investments + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 197 + + Biometric Authentication 生体認証 @@ -2700,7 +2740,7 @@ libs/common/src/lib/routes/routes.ts - 240 + 235 @@ -2716,7 +2756,7 @@ libs/common/src/lib/routes/routes.ts - 205 + 200 @@ -2732,7 +2772,7 @@ libs/common/src/lib/routes/routes.ts - 213 + 208 @@ -2748,7 +2788,7 @@ libs/common/src/lib/routes/routes.ts - 229 + 224 @@ -2808,11 +2848,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 384 + 396 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 101 + 109 apps/client/src/app/pages/accounts/accounts-page.html @@ -2832,7 +2872,7 @@ おっと、現金残高の振替に失敗しました。 apps/client/src/app/pages/accounts/accounts-page.component.ts - 358 + 355 @@ -2856,7 +2896,7 @@ 口座ID apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 103 + 98 @@ -2864,7 +2904,7 @@ Financial Planning libs/ui/src/lib/i18n.ts - 108 + 109 @@ -2912,7 +2952,7 @@ マーケットデータ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 406 + 418 libs/common/src/lib/routes/routes.ts @@ -2950,9 +2990,13 @@ Overview 概要 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 42 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 115 apps/client/src/app/components/header/header.component.html @@ -2964,7 +3008,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 47 + 48 apps/client/src/app/pages/admin/admin-page.component.ts @@ -2976,11 +3020,11 @@ libs/common/src/lib/routes/routes.ts - 113 + 108 libs/common/src/lib/routes/routes.ts - 190 + 185 @@ -3092,7 +3136,7 @@ libs/common/src/lib/routes/routes.ts - 245 + 240 @@ -3100,11 +3144,11 @@ スクレイパー設定を解析できませんでした apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 589 + 672 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 592 + 675 @@ -3120,7 +3164,7 @@ すでにログインしているため、デモアカウントにアクセスできません。 apps/client/src/app/pages/demo/demo-page.component.ts - 33 + 32 @@ -3136,7 +3180,7 @@ 持続時間 apps/client/src/app/components/admin-overview/admin-overview.html - 172 + 175 @@ -3156,7 +3200,15 @@ libs/common/src/lib/routes/routes.ts - 271 + 266 + + + + Invalid API key + Invalid API key + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 112 @@ -3176,7 +3228,7 @@ libs/common/src/lib/routes/routes.ts - 276 + 271 @@ -3328,11 +3380,11 @@ 創造 apps/client/src/app/components/admin-overview/admin-overview.html - 185 + 188 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 150 + 158 @@ -3340,7 +3392,7 @@ 保有資産 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 100 + 127 apps/client/src/app/components/home-holdings/home-holdings.html @@ -3348,7 +3400,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 168 apps/client/src/app/pages/public/public-page.html @@ -3360,7 +3412,7 @@ libs/common/src/lib/routes/routes.ts - 187 + 182 libs/ui/src/lib/assistant/assistant.html @@ -3384,7 +3436,7 @@ libs/common/src/lib/routes/routes.ts - 105 + 100 @@ -3392,7 +3444,7 @@ マーケット apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 403 + 404 apps/client/src/app/components/footer/footer.component.html @@ -3402,10 +3454,6 @@ apps/client/src/app/components/header/header.component.html 408 - - apps/client/src/app/components/home-market/home-market.html - 2 - apps/client/src/app/components/markets/markets.html 2 @@ -3424,15 +3472,11 @@ libs/common/src/lib/routes/routes.ts - 100 - - - libs/common/src/lib/routes/routes.ts - 281 + 276 libs/common/src/lib/routes/routes.ts - 329 + 324 @@ -3568,7 +3612,7 @@ 基本材料 libs/ui/src/lib/i18n.ts - 90 + 91 @@ -3595,6 +3639,14 @@ 84 + + Do you really want to delete these activities? + Do you really want to delete these activities? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 334 + + Why Ghostfolio? なぜGhostfolioなのか? @@ -3704,7 +3756,7 @@ おっと!資産プロファイルを削除できませんでした。 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 52 + 56 @@ -3776,7 +3828,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 139 + 134 @@ -3844,7 +3896,7 @@ Convert to apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 174 + 175 @@ -3920,15 +3972,15 @@ アクティビティ apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 84 + 103 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 111 + 138 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 244 + 245 apps/client/src/app/components/admin-overview/admin-overview.html @@ -3944,15 +3996,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 233 + 234 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 350 + 362 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 110 + 118 apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -3960,21 +4012,13 @@ libs/common/src/lib/routes/routes.ts - 149 + 144 libs/ui/src/lib/accounts-table/accounts-table.component.html 126 - - Do you really want to delete these activities? - 本当にこれらのアクティビティを削除したいですか? - - libs/ui/src/lib/activities-table/activities-table.component.ts - 317 - - Update activity アクティビティを更新 @@ -4052,7 +4096,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 237 + 251 @@ -4064,11 +4108,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 30 libs/ui/src/lib/activities-table/activities-table.component.html - 406 + 420 @@ -4080,11 +4124,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 52 + 54 libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 434 @@ -4187,6 +4231,14 @@ 118 + + Shares After + Shares After + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 584 + + Back 戻る @@ -4204,7 +4256,7 @@ 価格 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 176 + 184 @@ -4212,7 +4264,7 @@ Do you really want to convert this asset profile to ()? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 723 + 806 @@ -4228,7 +4280,7 @@ libs/common/src/lib/routes/routes.ts - 154 + 149 @@ -4312,16 +4364,12 @@ トライアル apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 133 + 140 Exclude from Analysis 分析から除外する - - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 97 - libs/ui/src/lib/i18n.ts 22 @@ -4404,7 +4452,7 @@ libs/common/src/lib/routes/routes.ts - 159 + 154 @@ -4420,15 +4468,15 @@ 配当金 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 79 + 91 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 188 + 189 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 419 + 437 apps/client/src/app/pages/features/features-page.html @@ -4572,7 +4620,7 @@ libs/common/src/lib/routes/routes.ts - 291 + 286 @@ -4612,7 +4660,7 @@ 時間ごと apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 248 @@ -4724,7 +4772,7 @@ 有効期限 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 209 + 217 @@ -4764,11 +4812,11 @@ 資産プロフィールを保存できませんでした apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 758 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 678 + 761 @@ -4820,7 +4868,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 296 @@ -4852,7 +4900,7 @@ libs/common/src/lib/routes/routes.ts - 349 + 344 @@ -4861,11 +4909,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 340 + 335 libs/common/src/lib/routes/routes.ts - 344 + 339 @@ -4977,7 +5025,7 @@ Coupon has been created apps/client/src/app/components/admin-overview/admin-overview.component.ts - 224 + 229 @@ -5117,7 +5165,7 @@ Stock Tracking libs/ui/src/lib/i18n.ts - 111 + 112 @@ -5141,7 +5189,7 @@ Web libs/ui/src/lib/i18n.ts - 120 + 121 @@ -5152,6 +5200,14 @@ 373 + + Data gathering has been started. + Data gathering has been started. + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 413 + + Global グローバル @@ -5185,7 +5241,7 @@ libs/common/src/lib/routes/routes.ts - 352 + 347 @@ -5193,7 +5249,7 @@ メンバーシップ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 78 + 82 libs/common/src/lib/routes/routes.ts @@ -5269,11 +5325,11 @@ アクティビティをエクスポート libs/ui/src/lib/activities-table/activities-table.component.html - 64 + 72 libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 448 @@ -5281,11 +5337,11 @@ ドラフトをICSとしてエクスポート libs/ui/src/lib/activities-table/activities-table.component.html - 77 + 86 libs/ui/src/lib/activities-table/activities-table.component.html - 447 + 461 @@ -5293,7 +5349,7 @@ ドラフト libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 181 @@ -5301,7 +5357,7 @@ クローン libs/ui/src/lib/activities-table/activities-table.component.html - 492 + 506 @@ -5309,7 +5365,7 @@ ドラフトをICSとしてエクスポート libs/ui/src/lib/activities-table/activities-table.component.html - 502 + 516 @@ -5317,7 +5373,11 @@ 本当にこのアクティビティを削除したいですか? libs/ui/src/lib/activities-table/activities-table.component.ts - 327 + 333 + + + libs/ui/src/lib/activities-table/activities-table.component.ts + 344 @@ -5325,7 +5385,7 @@ 資産プロファイル apps/client/src/app/components/admin-settings/admin-settings.component.html - 123 + 128 libs/ui/src/lib/assistant/assistant.html @@ -5449,11 +5509,11 @@ 利息 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 67 + 79 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 406 + 424 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5517,7 +5577,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 335 + 349 libs/ui/src/lib/i18n.ts @@ -5545,15 +5605,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 254 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 349 + 350 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 244 + 245 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -5577,15 +5637,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 262 + 263 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 365 + 366 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 253 + 254 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -5625,15 +5685,15 @@ 緊急資金 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 254 + 270 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 356 + 373 apps/client/src/app/pages/features/features-page.html @@ -5701,7 +5761,7 @@ libs/ui/src/lib/i18n.ts - 98 + 99 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -5729,7 +5789,7 @@ アクティビティなし apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 148 @@ -5761,7 +5821,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 186 + 187 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5769,13 +5829,21 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 322 + 323 libs/ui/src/lib/i18n.ts 35 + + Export + Export + + libs/ui/src/lib/activities-table/activities-table.component.html + 68 + + Tag タグ @@ -5845,7 +5913,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 275 libs/ui/src/lib/i18n.ts @@ -5885,7 +5953,7 @@ 現金 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 168 + 227 libs/ui/src/lib/i18n.ts @@ -5905,7 +5973,7 @@ 株式 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 55 + 67 libs/ui/src/lib/i18n.ts @@ -5929,7 +5997,7 @@ libs/ui/src/lib/i18n.ts - 99 + 100 @@ -5937,7 +6005,7 @@ 認証 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 65 + 67 @@ -6017,7 +6085,7 @@ 通信サービス libs/ui/src/lib/i18n.ts - 91 + 92 @@ -6052,6 +6120,22 @@ 79 + + Invested Capital + Invested Capital + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 174 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 85 + + South America 南米 @@ -6153,7 +6237,7 @@ 現在の市場価格は apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 766 + 850 @@ -6161,7 +6245,7 @@ テスト apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 606 + 725 @@ -6237,7 +6321,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 449 + 451 @@ -6251,18 +6335,6 @@ Investment 投資 - - apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 173 - - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 60 - - - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 85 - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 101 @@ -6301,7 +6373,7 @@ 年初来 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -6309,7 +6381,7 @@ 週初来 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6317,7 +6389,7 @@ 月初来 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6325,11 +6397,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6345,11 +6417,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6393,7 +6465,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6405,7 +6477,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -6413,11 +6485,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -6434,11 +6506,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 263 + 258 libs/common/src/lib/routes/routes.ts - 266 + 261 @@ -6450,7 +6522,7 @@ libs/common/src/lib/routes/routes.ts - 268 + 263 @@ -6458,7 +6530,7 @@ データ収集 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 629 + 748 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6470,7 +6542,7 @@ 保有資産を検索... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 449 @@ -6490,7 +6562,7 @@ libs/common/src/lib/routes/routes.ts - 260 + 255 @@ -6498,7 +6570,7 @@ 毎日 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 244 @@ -6536,9 +6608,13 @@ Activity アクティビティ + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 101 + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 231 + 232 @@ -6546,7 +6622,7 @@ 配当利回り apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 198 + 199 @@ -6602,7 +6678,7 @@ アクティビティを削除する libs/ui/src/lib/activities-table/activities-table.component.html - 92 + 105 @@ -6610,7 +6686,7 @@ 国際化 libs/common/src/lib/routes/routes.ts - 119 + 114 @@ -6626,7 +6702,7 @@ Ghostfolioアカウントを本当に閉鎖しますか? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 229 + 244 @@ -6634,7 +6710,7 @@ ページにジャンプ... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 450 @@ -6674,7 +6750,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 134 + 129 @@ -6682,7 +6758,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 399 + 400 @@ -6690,7 +6766,7 @@ Oops! There was an error setting up biometric authentication. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 352 + 363 @@ -6706,7 +6782,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 128 @@ -6806,7 +6882,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 51 + 55 @@ -6846,7 +6922,7 @@ Wealth Management libs/ui/src/lib/i18n.ts - 113 + 114 @@ -6854,7 +6930,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 487 @@ -6870,7 +6946,7 @@ Family Office libs/ui/src/lib/i18n.ts - 107 + 108 @@ -6898,7 +6974,7 @@ Budgeting libs/ui/src/lib/i18n.ts - 104 + 105 @@ -6926,7 +7002,7 @@ Do you really want to delete these asset profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 67 + 72 @@ -6934,7 +7010,7 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 757 + 841 @@ -6942,11 +7018,11 @@ キャンセル apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 162 + 163 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 753 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6970,7 +7046,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 112 + 107 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -6998,7 +7074,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 44 + 45 @@ -7022,7 +7098,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 636 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7054,11 +7130,11 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 244 + 252 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 114 + 109 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7146,7 +7222,7 @@ Performance with currency effect Performance apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 83 + 84 @@ -7162,7 +7238,7 @@ Tax Reporting libs/ui/src/lib/i18n.ts - 112 + 113 @@ -7170,7 +7246,7 @@ Change with currency effect Change apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 63 + 64 @@ -7202,7 +7278,7 @@ has been copied to the clipboard apps/client/src/app/components/admin-overview/admin-overview.component.ts - 223 + 228 libs/ui/src/lib/value/value.component.ts @@ -7226,7 +7302,7 @@ Dividend Tracking libs/ui/src/lib/i18n.ts - 105 + 106 @@ -7254,7 +7330,7 @@ Financial Services libs/ui/src/lib/i18n.ts - 95 + 96 @@ -7284,6 +7360,10 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 270 + + libs/ui/src/lib/activities-table/activities-table.component.html + 101 + cannot be self-hosted @@ -7309,6 +7389,14 @@ 278 + + Shares Before + Shares Before + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 597 + + cannot be used anonymously cannot be used anonymously @@ -7374,7 +7462,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 188 + 197 @@ -7398,7 +7486,7 @@ Investment Research libs/ui/src/lib/i18n.ts - 109 + 110 @@ -7422,7 +7510,7 @@ libs/common/src/lib/routes/routes.ts - 313 + 308 @@ -7431,11 +7519,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 308 + 303 libs/common/src/lib/routes/routes.ts - 311 + 306 @@ -7451,7 +7539,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 316 @@ -7460,11 +7548,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 316 + 311 libs/common/src/lib/routes/routes.ts - 319 + 314 @@ -7496,7 +7584,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 152 + 157 @@ -7504,7 +7592,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 143 + 144 @@ -7512,7 +7600,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 178 + 187 @@ -7520,7 +7608,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 154 + 159 @@ -7548,7 +7636,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 141 @@ -7604,7 +7692,7 @@ 保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 645 + 764 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7624,7 +7712,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 133 + 143 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7636,7 +7724,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 123 + 118 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7680,7 +7768,7 @@ Net Worth Tracking libs/ui/src/lib/i18n.ts - 110 + 111 @@ -7688,7 +7776,7 @@ Please enter your Ghostfolio API key. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 162 + 163 @@ -7720,7 +7808,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 556 + 675 @@ -7728,7 +7816,7 @@ Do you really want to convert the data source to ? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 485 + 525 @@ -7736,7 +7824,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 638 @@ -7744,7 +7832,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 572 + 691 @@ -7752,7 +7840,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7760,7 +7848,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7768,7 +7856,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 651 @@ -7776,7 +7864,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7784,7 +7872,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7800,7 +7888,7 @@ Create libs/ui/src/lib/tags-selector/tags-selector.component.html - 64 + 62 @@ -7960,7 +8048,7 @@ libs/common/src/lib/routes/routes.ts - 237 + 232 @@ -7969,11 +8057,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 232 + 227 libs/common/src/lib/routes/routes.ts - 235 + 230 @@ -7997,7 +8085,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 718 + 801 @@ -8005,7 +8093,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 721 + 804 @@ -8013,7 +8101,7 @@ Apply apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 155 @@ -8069,7 +8157,7 @@ libs/common/src/lib/routes/routes.ts - 110 + 105 @@ -8080,6 +8168,18 @@ 142 + + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 102 + + Log out Log out @@ -8091,13 +8191,9 @@ Calculations are based on delayed market data and may not be displayed in real-time. Calculations are based on delayed market data and may not be displayed in real-time. - - apps/client/src/app/components/home-market/home-market.html - 28 - apps/client/src/app/components/markets/markets.html - 54 + 64 @@ -8106,11 +8202,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 200 + 195 libs/common/src/lib/routes/routes.ts - 203 + 198 @@ -8118,7 +8214,7 @@ Sync Demo User Account apps/client/src/app/components/admin-overview/admin-overview.html - 128 + 131 @@ -8126,7 +8222,7 @@ ETF Tracking libs/ui/src/lib/i18n.ts - 106 + 107 @@ -8134,7 +8230,7 @@ Demo user account has been synced. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 323 + 334 @@ -8206,7 +8302,7 @@ libs/common/src/lib/routes/routes.ts - 251 + 246 @@ -8214,7 +8310,7 @@ Open Source Alternative to libs/common/src/lib/routes/routes.ts - 346 + 341 @@ -8247,15 +8343,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 332 + 327 libs/common/src/lib/routes/routes.ts - 335 + 330 libs/common/src/lib/routes/routes.ts - 343 + 338 @@ -8264,11 +8360,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 324 + 319 libs/common/src/lib/routes/routes.ts - 327 + 322 @@ -8348,7 +8444,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 @@ -8493,11 +8589,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 356 + 351 libs/common/src/lib/routes/routes.ts - 357 + 352 @@ -8529,7 +8625,7 @@ Cryptocurrencies apps/client/src/app/components/markets/markets.component.ts - 52 + 55 apps/client/src/app/pages/features/features-page.html @@ -8541,7 +8637,7 @@ Stocks apps/client/src/app/components/markets/markets.component.ts - 51 + 54 apps/client/src/app/pages/features/features-page.html @@ -8553,7 +8649,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 479 @@ -8581,7 +8677,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 101 + 102 @@ -8981,7 +9077,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 56 + 58 diff --git a/apps/client/src/locales/messages.ko.xlf b/apps/client/src/locales/messages.ko.xlf index 00cb62538..4219d0859 100644 --- a/apps/client/src/locales/messages.ko.xlf +++ b/apps/client/src/locales/messages.ko.xlf @@ -8,31 +8,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 196 + 191 libs/common/src/lib/routes/routes.ts - 197 + 192 libs/common/src/lib/routes/routes.ts - 202 + 197 libs/common/src/lib/routes/routes.ts - 210 + 205 libs/common/src/lib/routes/routes.ts - 218 + 213 libs/common/src/lib/routes/routes.ts - 226 + 221 libs/common/src/lib/routes/routes.ts - 234 + 229 @@ -41,19 +41,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 249 libs/common/src/lib/routes/routes.ts - 255 + 250 libs/common/src/lib/routes/routes.ts - 259 + 254 libs/common/src/lib/routes/routes.ts - 265 + 260 @@ -62,11 +62,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 274 + 269 libs/common/src/lib/routes/routes.ts - 275 + 270 @@ -75,11 +75,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 208 + 203 libs/common/src/lib/routes/routes.ts - 211 + 206 @@ -88,11 +88,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 279 + 274 libs/common/src/lib/routes/routes.ts - 280 + 275 @@ -101,11 +101,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 289 + 284 libs/common/src/lib/routes/routes.ts - 290 + 285 @@ -114,11 +114,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 224 + 219 libs/common/src/lib/routes/routes.ts - 227 + 222 @@ -127,11 +127,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 299 + 294 libs/common/src/lib/routes/routes.ts - 300 + 295 @@ -140,31 +140,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 299 libs/common/src/lib/routes/routes.ts - 305 + 300 libs/common/src/lib/routes/routes.ts - 310 + 305 libs/common/src/lib/routes/routes.ts - 318 + 313 libs/common/src/lib/routes/routes.ts - 326 + 321 libs/common/src/lib/routes/routes.ts - 334 + 329 libs/common/src/lib/routes/routes.ts - 342 + 337 @@ -260,7 +260,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 166 + 174 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -268,11 +268,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 5 + 7 libs/ui/src/lib/activities-table/activities-table.component.html - 183 + 197 @@ -312,7 +312,7 @@ 현금 잔액 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 43 + 55 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -328,7 +328,7 @@ 플랫폼 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 113 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -344,7 +344,7 @@ 현금 잔액 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 143 + 170 @@ -368,7 +368,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 332 + 333 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -404,7 +404,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 161 + 175 libs/ui/src/lib/benchmark/benchmark.component.html @@ -444,11 +444,11 @@ 통화 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 216 + 217 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 339 + 340 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -468,7 +468,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 303 + 317 @@ -504,11 +504,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 284 + 298 libs/ui/src/lib/activities-table/activities-table.component.html - 320 + 334 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -548,7 +548,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 483 + 497 @@ -564,7 +564,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 235 + 238 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -574,6 +574,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 100 + + apps/client/src/app/components/admin-users/admin-users.html + 254 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 27 @@ -588,7 +592,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 513 + 527 libs/ui/src/lib/benchmark/benchmark.component.html @@ -608,7 +612,7 @@ 유료 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 129 + 136 @@ -628,7 +632,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 486 + 487 @@ -644,7 +648,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 198 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -655,6 +659,14 @@ 20 + + Unknown + Unknown + + libs/ui/src/lib/i18n.ts + 88 + + Attempts 시도 횟수 @@ -715,6 +727,14 @@ 208 + + Splits + Splits + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 512 + + View Stacktrace 스택트레이스 보기 @@ -744,12 +764,20 @@ 계좌 검색... libs/ui/src/lib/assistant/assistant.component.ts - 447 + 448 Date 날짜 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 521 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 560 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 156 @@ -760,7 +788,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 206 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -784,7 +812,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 113 + 114 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -796,7 +824,7 @@ 통화 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 133 apps/client/src/app/pages/public/public-page.html @@ -816,7 +844,7 @@ 국가 정보 없는 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 138 @@ -824,7 +852,7 @@ 섹터 정보 없는 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 143 @@ -832,7 +860,7 @@ An error occurred while converting the data source to . apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 482 + 522 @@ -840,11 +868,11 @@ 이 자산 프로필을 정말 삭제하시겠습니까? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 28 + 29 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 66 + 71 @@ -852,7 +880,7 @@ 다음 기준으로 필터... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 365 + 377 @@ -864,11 +892,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 235 + 236 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 221 + 222 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -880,7 +908,7 @@ 데이터 수집 빈도 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 467 + 468 @@ -924,7 +952,7 @@ 구독 내역 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 141 + 149 @@ -976,7 +1004,7 @@ 헬스케어 libs/ui/src/lib/i18n.ts - 96 + 97 @@ -1024,11 +1052,11 @@ 섹터 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 280 + 281 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 270 + 271 @@ -1036,7 +1064,7 @@ 국가 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 296 apps/client/src/app/components/admin-users/admin-users.html @@ -1044,11 +1072,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 284 + 285 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 88 + 96 @@ -1056,15 +1084,15 @@ 섹터 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 301 + 302 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 421 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 290 + 291 apps/client/src/app/pages/public/public-page.html @@ -1076,15 +1104,15 @@ 국가 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 312 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 431 + 432 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 302 + 303 @@ -1092,7 +1120,7 @@ 심볼 매핑 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 410 @@ -1100,7 +1128,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 146 + 141 @@ -1108,7 +1136,7 @@ 기술 libs/ui/src/lib/i18n.ts - 100 + 101 @@ -1124,7 +1152,7 @@ 합계 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 160 + 168 @@ -1132,7 +1160,7 @@ 스크래퍼 설정 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 509 + 628 @@ -1140,7 +1168,7 @@ 메모 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 455 + 456 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1156,7 +1184,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 370 + 384 @@ -1180,7 +1208,7 @@ 산업재 libs/ui/src/lib/i18n.ts - 97 + 98 @@ -1196,7 +1224,7 @@ 이름, 심볼 또는 ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 133 + 134 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1216,7 +1244,7 @@ 임의소비재 libs/ui/src/lib/i18n.ts - 92 + 93 @@ -1224,7 +1252,7 @@ 이 쿠폰을 정말 삭제하시겠습니까? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 242 + 247 @@ -1232,7 +1260,7 @@ 이 시스템 메시지를 정말 삭제하시겠습니까? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 255 + 260 @@ -1240,7 +1268,7 @@ 정말로 캐시를 플러시하시겠습니까? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 279 + 290 @@ -1248,7 +1276,7 @@ 시스템 메시지를 설정하십시오: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 299 + 310 @@ -1264,7 +1292,7 @@ 사용자당 apps/client/src/app/components/admin-overview/admin-overview.component.ts - 178 + 181 @@ -1288,7 +1316,7 @@ 읽기 전용 모드 apps/client/src/app/components/admin-overview/admin-overview.html - 64 + 63 @@ -1296,7 +1324,7 @@ 시스템 메시지 apps/client/src/app/components/admin-overview/admin-overview.html - 88 + 89 @@ -1304,7 +1332,7 @@ 메시지 설정 apps/client/src/app/components/admin-overview/admin-overview.html - 110 + 113 @@ -1312,15 +1340,19 @@ 쿠폰 apps/client/src/app/components/admin-overview/admin-overview.html - 148 + 151 Add 추가 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 615 + apps/client/src/app/components/admin-overview/admin-overview.html - 298 + 301 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1332,7 +1364,7 @@ 유지 관리 apps/client/src/app/components/admin-overview/admin-overview.html - 117 + 120 @@ -1340,7 +1372,7 @@ 캐시 플러시 apps/client/src/app/components/admin-overview/admin-overview.html - 133 + 136 @@ -1356,11 +1388,11 @@ 링크 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 443 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 707 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1376,7 +1408,7 @@ 자산 정보가 저장되었습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 665 + 748 @@ -1408,7 +1440,7 @@ 올해 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 @@ -1419,12 +1451,20 @@ 10 + + Cache has been flushed. + Cache has been flushed. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 281 + + Platforms 플랫폼 apps/client/src/app/components/admin-settings/admin-settings.component.html - 212 + 221 @@ -1432,7 +1472,7 @@ 태그 apps/client/src/app/components/admin-settings/admin-settings.component.html - 218 + 227 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1440,7 +1480,7 @@ libs/ui/src/lib/tags-selector/tags-selector.component.html - 25 + 23 @@ -1516,7 +1556,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 124 + 132 @@ -1535,24 +1575,16 @@ 228 - - Delete User - 사용자 삭제 - - apps/client/src/app/components/admin-users/admin-users.html - 254 - - Could not validate form 양식 유효성 검사에 실패했습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 641 + 724 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 644 + 727 @@ -1576,7 +1608,7 @@ 포트폴리오 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 139 + 140 apps/client/src/app/components/header/header.component.html @@ -1592,7 +1624,7 @@ libs/common/src/lib/routes/routes.ts - 172 + 167 @@ -1600,19 +1632,19 @@ 기준 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 401 + 402 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 151 + 152 Current Market Mood 현재 시장 분위기 - apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html - 12 + libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html + 23 @@ -1660,7 +1692,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 215 + 230 @@ -1671,12 +1703,20 @@ 64 + + Split Ratio + Split Ratio + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 526 + + Fear 두려움 apps/client/src/app/components/markets/markets.component.ts - 46 + 58 libs/ui/src/lib/i18n.ts @@ -1688,7 +1728,7 @@ 탐욕 apps/client/src/app/components/markets/markets.component.ts - 47 + 59 libs/ui/src/lib/i18n.ts @@ -1700,7 +1740,7 @@ 지난 apps/client/src/app/components/markets/markets.html - 17 + 24 @@ -1788,7 +1828,7 @@ 이번주 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 @@ -1808,7 +1848,7 @@ 총액 apps/client/src/app/components/investment-chart/investment-chart.component.ts - 143 + 144 @@ -1816,7 +1856,7 @@ 코드 apps/client/src/app/components/admin-overview/admin-overview.html - 159 + 162 @@ -1824,7 +1864,7 @@ 저축률 apps/client/src/app/components/investment-chart/investment-chart.component.ts - 201 + 193 @@ -1860,7 +1900,7 @@ 또는 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 167 + 168 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -1908,7 +1948,7 @@ 에너지 libs/ui/src/lib/i18n.ts - 94 + 95 @@ -1940,7 +1980,7 @@ 수수료 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -1984,7 +2024,7 @@ 매수 가능 금액 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 196 + 256 @@ -1992,7 +2032,7 @@ 분석에서 제외됨 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 270 + 286 @@ -2000,7 +2040,7 @@ 부채 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 298 + 315 apps/client/src/app/pages/features/features-page.html @@ -2012,7 +2052,7 @@ 순자산 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 320 + 337 @@ -2020,7 +2060,7 @@ 연환산 성과 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 334 + 351 @@ -2028,7 +2068,7 @@ 비상금 금액을 설정해 주세요. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 135 + 145 @@ -2036,7 +2076,7 @@ 최저가 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 131 + 132 @@ -2044,7 +2084,7 @@ 최고가 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 149 + 150 @@ -2052,7 +2092,7 @@ 수량 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 159 + 160 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -2060,7 +2100,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 227 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2072,7 +2112,7 @@ 데이터 결함 보고 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 462 + 464 @@ -2252,7 +2292,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 366 @@ -2260,11 +2300,11 @@ 연초 대비 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -2272,11 +2312,11 @@ 1년 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -2292,11 +2332,11 @@ 5년 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -2312,11 +2352,11 @@ 맥스 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 244 + 276 libs/ui/src/lib/assistant/assistant.component.ts - 415 + 416 @@ -2360,7 +2400,7 @@ 쿠폰 코드를 입력해주세요. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 214 + 203 @@ -2368,7 +2408,7 @@ 쿠폰 코드를 사용할 수 없습니다. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 178 + 181 @@ -2376,7 +2416,7 @@ 필수소비재 libs/ui/src/lib/i18n.ts - 93 + 94 @@ -2384,15 +2424,7 @@ 쿠폰 코드가 사용되었습니다. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 191 - - - - Reload - 새로고침 - - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 194 @@ -2428,7 +2460,7 @@ 자동 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 74 + 77 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2440,7 +2472,7 @@ 이 로그인 방법을 정말로 제거하시겠습니까? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 303 + 314 @@ -2448,7 +2480,7 @@ 유틸리티 libs/ui/src/lib/i18n.ts - 101 + 102 @@ -2480,7 +2512,7 @@ 쿠폰 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 134 + 141 @@ -2496,7 +2528,7 @@ 장소 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 666 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2575,6 +2607,14 @@ 221 + + Investments + Investments + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 197 + + Biometric Authentication 생체인증 @@ -2700,7 +2740,7 @@ libs/common/src/lib/routes/routes.ts - 240 + 235 @@ -2716,7 +2756,7 @@ libs/common/src/lib/routes/routes.ts - 205 + 200 @@ -2732,7 +2772,7 @@ libs/common/src/lib/routes/routes.ts - 213 + 208 @@ -2748,7 +2788,7 @@ libs/common/src/lib/routes/routes.ts - 229 + 224 @@ -2808,11 +2848,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 384 + 396 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 101 + 109 apps/client/src/app/pages/accounts/accounts-page.html @@ -2832,7 +2872,7 @@ 죄송합니다. 현금 잔액 이체가 실패했습니다. apps/client/src/app/pages/accounts/accounts-page.component.ts - 358 + 355 @@ -2856,7 +2896,7 @@ 계좌 ID apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 103 + 98 @@ -2864,7 +2904,7 @@ 재무 설계 libs/ui/src/lib/i18n.ts - 108 + 109 @@ -2912,7 +2952,7 @@ 시장 데이터 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 406 + 418 libs/common/src/lib/routes/routes.ts @@ -2950,9 +2990,13 @@ Overview 개요 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 42 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 115 apps/client/src/app/components/header/header.component.html @@ -2964,7 +3008,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 47 + 48 apps/client/src/app/pages/admin/admin-page.component.ts @@ -2976,11 +3020,11 @@ libs/common/src/lib/routes/routes.ts - 113 + 108 libs/common/src/lib/routes/routes.ts - 190 + 185 @@ -3092,7 +3136,7 @@ libs/common/src/lib/routes/routes.ts - 245 + 240 @@ -3100,11 +3144,11 @@ 스크래퍼 설정을 파싱할 수 없습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 589 + 672 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 592 + 675 @@ -3120,7 +3164,7 @@ 이미 로그인되어 있으므로 데모 계정에 접근할 수 없습니다. apps/client/src/app/pages/demo/demo-page.component.ts - 33 + 32 @@ -3136,7 +3180,7 @@ 기간 apps/client/src/app/components/admin-overview/admin-overview.html - 172 + 175 @@ -3156,7 +3200,15 @@ libs/common/src/lib/routes/routes.ts - 271 + 266 + + + + Invalid API key + Invalid API key + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 112 @@ -3176,7 +3228,7 @@ libs/common/src/lib/routes/routes.ts - 276 + 271 @@ -3328,11 +3380,11 @@ 생성 apps/client/src/app/components/admin-overview/admin-overview.html - 185 + 188 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 150 + 158 @@ -3340,7 +3392,7 @@ 보유 종목 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 100 + 127 apps/client/src/app/components/home-holdings/home-holdings.html @@ -3348,7 +3400,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 168 apps/client/src/app/pages/public/public-page.html @@ -3360,7 +3412,7 @@ libs/common/src/lib/routes/routes.ts - 187 + 182 libs/ui/src/lib/assistant/assistant.html @@ -3384,7 +3436,7 @@ libs/common/src/lib/routes/routes.ts - 105 + 100 @@ -3392,7 +3444,7 @@ 시장 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 403 + 404 apps/client/src/app/components/footer/footer.component.html @@ -3402,10 +3454,6 @@ apps/client/src/app/components/header/header.component.html 408 - - apps/client/src/app/components/home-market/home-market.html - 2 - apps/client/src/app/components/markets/markets.html 2 @@ -3424,15 +3472,11 @@ libs/common/src/lib/routes/routes.ts - 100 - - - libs/common/src/lib/routes/routes.ts - 281 + 276 libs/common/src/lib/routes/routes.ts - 329 + 324 @@ -3568,7 +3612,7 @@ 기초소재 libs/ui/src/lib/i18n.ts - 90 + 91 @@ -3595,6 +3639,14 @@ 84 + + Do you really want to delete these activities? + Do you really want to delete these activities? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 334 + + Why Ghostfolio? Ghostfolio인가요? @@ -3696,7 +3748,7 @@ 이런! 자산 프로필을 삭제할 수 없습니다. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 52 + 56 @@ -3768,7 +3820,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 139 + 134 @@ -3836,7 +3888,7 @@ Convert to apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 174 + 175 @@ -3912,15 +3964,15 @@ 거래 내역 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 84 + 103 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 111 + 138 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 244 + 245 apps/client/src/app/components/admin-overview/admin-overview.html @@ -3936,15 +3988,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 233 + 234 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 350 + 362 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 110 + 118 apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -3952,21 +4004,13 @@ libs/common/src/lib/routes/routes.ts - 149 + 144 libs/ui/src/lib/accounts-table/accounts-table.component.html 126 - - Do you really want to delete these activities? - 정말로 이 거래들을 삭제하시겠습니까? - - libs/ui/src/lib/activities-table/activities-table.component.ts - 317 - - Update activity 거래 수정 @@ -4044,7 +4088,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 237 + 251 @@ -4056,11 +4100,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 30 libs/ui/src/lib/activities-table/activities-table.component.html - 406 + 420 @@ -4072,11 +4116,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 52 + 54 libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 434 @@ -4179,6 +4223,14 @@ 118 + + Shares After + Shares After + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 584 + + Back 뒤쪽에 @@ -4196,7 +4248,7 @@ 가격 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 176 + 184 @@ -4204,7 +4256,7 @@ Do you really want to convert this asset profile to ()? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 723 + 806 @@ -4220,7 +4272,7 @@ libs/common/src/lib/routes/routes.ts - 154 + 149 @@ -4304,16 +4356,12 @@ 체험판 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 133 + 140 Exclude from Analysis 분석에서 제외 - - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 97 - libs/ui/src/lib/i18n.ts 22 @@ -4396,7 +4444,7 @@ libs/common/src/lib/routes/routes.ts - 159 + 154 @@ -4412,15 +4460,15 @@ 배당금 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 79 + 91 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 188 + 189 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 419 + 437 apps/client/src/app/pages/features/features-page.html @@ -4564,7 +4612,7 @@ libs/common/src/lib/routes/routes.ts - 291 + 286 @@ -4604,7 +4652,7 @@ 매시간 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 248 @@ -4716,7 +4764,7 @@ 만료 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 209 + 217 @@ -4756,11 +4804,11 @@ 자산 정보를 저장할 수 없습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 758 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 678 + 761 @@ -4812,7 +4860,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 296 @@ -4844,7 +4892,7 @@ libs/common/src/lib/routes/routes.ts - 349 + 344 @@ -4853,11 +4901,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 340 + 335 libs/common/src/lib/routes/routes.ts - 344 + 339 @@ -4969,7 +5017,7 @@ Coupon has been created apps/client/src/app/components/admin-overview/admin-overview.component.ts - 224 + 229 @@ -5109,7 +5157,7 @@ 주식 추적 libs/ui/src/lib/i18n.ts - 111 + 112 @@ -5133,7 +5181,7 @@ libs/ui/src/lib/i18n.ts - 120 + 121 @@ -5144,6 +5192,14 @@ 373 + + Data gathering has been started. + Data gathering has been started. + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 413 + + Global 글로벌 @@ -5177,7 +5233,7 @@ libs/common/src/lib/routes/routes.ts - 352 + 347 @@ -5185,7 +5241,7 @@ 멤버십 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 78 + 82 libs/common/src/lib/routes/routes.ts @@ -5261,11 +5317,11 @@ 거래 내역 내보내기 libs/ui/src/lib/activities-table/activities-table.component.html - 64 + 72 libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 448 @@ -5273,11 +5329,11 @@ 초안을 달력 파일로 내보내기 libs/ui/src/lib/activities-table/activities-table.component.html - 77 + 86 libs/ui/src/lib/activities-table/activities-table.component.html - 447 + 461 @@ -5285,7 +5341,7 @@ 초안 libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 181 @@ -5293,7 +5349,7 @@ 클론 libs/ui/src/lib/activities-table/activities-table.component.html - 492 + 506 @@ -5301,7 +5357,7 @@ 초안을 달력 파일로 내보내기 libs/ui/src/lib/activities-table/activities-table.component.html - 502 + 516 @@ -5309,7 +5365,11 @@ 정말로 이 거래를 삭제하시겠습니까? libs/ui/src/lib/activities-table/activities-table.component.ts - 327 + 333 + + + libs/ui/src/lib/activities-table/activities-table.component.ts + 344 @@ -5317,7 +5377,7 @@ 자산 프로필 apps/client/src/app/components/admin-settings/admin-settings.component.html - 123 + 128 libs/ui/src/lib/assistant/assistant.html @@ -5441,11 +5501,11 @@ 관심 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 67 + 79 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 406 + 424 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5509,7 +5569,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 335 + 349 libs/ui/src/lib/i18n.ts @@ -5537,15 +5597,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 254 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 349 + 350 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 244 + 245 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -5569,15 +5629,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 262 + 263 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 365 + 366 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 253 + 254 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -5617,15 +5677,15 @@ 비상자금 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 254 + 270 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 356 + 373 apps/client/src/app/pages/features/features-page.html @@ -5693,7 +5753,7 @@ libs/ui/src/lib/i18n.ts - 98 + 99 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -5721,7 +5781,7 @@ 거래 내역 없음 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 148 @@ -5761,7 +5821,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 186 + 187 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5769,13 +5829,21 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 322 + 323 libs/ui/src/lib/i18n.ts 35 + + Export + Export + + libs/ui/src/lib/activities-table/activities-table.component.html + 68 + + Tag 꼬리표 @@ -5845,7 +5913,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 275 libs/ui/src/lib/i18n.ts @@ -5885,7 +5953,7 @@ 현금 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 168 + 227 libs/ui/src/lib/i18n.ts @@ -5905,7 +5973,7 @@ 주식 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 55 + 67 libs/ui/src/lib/i18n.ts @@ -5929,7 +5997,7 @@ libs/ui/src/lib/i18n.ts - 99 + 100 @@ -5937,7 +6005,7 @@ 입증 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 65 + 67 @@ -6017,7 +6085,7 @@ 커뮤니케이션 서비스 libs/ui/src/lib/i18n.ts - 91 + 92 @@ -6052,6 +6120,22 @@ 79 + + Invested Capital + Invested Capital + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 174 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 85 + + South America 남아메리카 @@ -6153,7 +6237,7 @@ 현재 시장가격은 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 766 + 850 @@ -6161,7 +6245,7 @@ 시험 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 606 + 725 @@ -6237,7 +6321,7 @@ 보유 포지션 종료 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 449 + 451 @@ -6251,18 +6335,6 @@ Investment 투자 - - apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 173 - - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 60 - - - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 85 - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 101 @@ -6301,7 +6373,7 @@ 연초 현재 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -6309,7 +6381,7 @@ 이번주 현재까지 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6317,7 +6389,7 @@ 월간 누계 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6325,11 +6397,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6345,11 +6417,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6393,7 +6465,7 @@ 년도 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6405,7 +6477,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -6413,11 +6485,11 @@ 연령 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -6434,11 +6506,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 263 + 258 libs/common/src/lib/routes/routes.ts - 266 + 261 @@ -6450,7 +6522,7 @@ libs/common/src/lib/routes/routes.ts - 268 + 263 @@ -6458,7 +6530,7 @@ 데이터 수집 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 629 + 748 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6470,7 +6542,7 @@ 보유 종목 검색... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 449 @@ -6490,7 +6562,7 @@ libs/common/src/lib/routes/routes.ts - 260 + 255 @@ -6498,7 +6570,7 @@ 매일 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 244 @@ -6536,9 +6608,13 @@ Activity 거래 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 101 + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 231 + 232 @@ -6546,7 +6622,7 @@ 배당수익률 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 198 + 199 @@ -6602,7 +6678,7 @@ 거래 삭제 libs/ui/src/lib/activities-table/activities-table.component.html - 92 + 105 @@ -6610,7 +6686,7 @@ 국제화 libs/common/src/lib/routes/routes.ts - 119 + 114 @@ -6626,7 +6702,7 @@ 정말로 Ghostfolio 계정을 폐쇄하시겠습니까? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 229 + 244 @@ -6634,7 +6710,7 @@ 페이지 이동... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 450 @@ -6674,7 +6750,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 134 + 129 @@ -6682,7 +6758,7 @@ 포함 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 399 + 400 @@ -6690,7 +6766,7 @@ 이런! 생체 인증을 설정하는 중에 오류가 발생했습니다. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 352 + 363 @@ -6706,7 +6782,7 @@ 벤치마크 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 128 @@ -6806,7 +6882,7 @@ 이런! 자산 프로필을 삭제할 수 없습니다. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 51 + 55 @@ -6846,7 +6922,7 @@ 자산관리 libs/ui/src/lib/i18n.ts - 113 + 114 @@ -6854,7 +6930,7 @@ 보유 종목 보기 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 487 @@ -6870,7 +6946,7 @@ 패밀리오피스 libs/ui/src/lib/i18n.ts - 107 + 108 @@ -6898,7 +6974,7 @@ 예산 편성 libs/ui/src/lib/i18n.ts - 104 + 105 @@ -6926,7 +7002,7 @@ 개의 자산 프로필을 정말 삭제하시겠습니까? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 67 + 72 @@ -6934,7 +7010,7 @@ 오류 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 757 + 841 @@ -6942,11 +7018,11 @@ 취소 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 162 + 163 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 753 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6970,7 +7046,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 112 + 107 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -6998,7 +7074,7 @@ 역할 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 44 + 45 @@ -7022,7 +7098,7 @@ 닫다 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 636 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7054,11 +7130,11 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 244 + 252 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 114 + 109 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7146,7 +7222,7 @@ 환율 효과 반영 수익률 수익률 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 83 + 84 @@ -7162,7 +7238,7 @@ 세금 보고 libs/ui/src/lib/i18n.ts - 112 + 113 @@ -7170,7 +7246,7 @@ 환율 효과 반영 변동 변동 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 63 + 64 @@ -7202,7 +7278,7 @@ 가 클립보드에 복사되었습니다. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 223 + 228 libs/ui/src/lib/value/value.component.ts @@ -7226,7 +7302,7 @@ 배당 추적 libs/ui/src/lib/i18n.ts - 105 + 106 @@ -7254,7 +7330,7 @@ 금융 서비스 libs/ui/src/lib/i18n.ts - 95 + 96 @@ -7284,6 +7360,10 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 270 + + libs/ui/src/lib/activities-table/activities-table.component.html + 101 + cannot be self-hosted @@ -7309,6 +7389,14 @@ 278 + + Shares Before + Shares Before + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 597 + + cannot be used anonymously 은(는) 익명으로 사용할 수 없습니다. @@ -7374,7 +7462,7 @@ API 키 설정 apps/client/src/app/components/admin-settings/admin-settings.component.html - 188 + 197 @@ -7398,7 +7486,7 @@ 투자 리서치 libs/ui/src/lib/i18n.ts - 109 + 110 @@ -7422,7 +7510,7 @@ libs/common/src/lib/routes/routes.ts - 313 + 308 @@ -7431,11 +7519,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 308 + 303 libs/common/src/lib/routes/routes.ts - 311 + 306 @@ -7451,7 +7539,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 316 @@ -7460,11 +7548,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 316 + 311 libs/common/src/lib/routes/routes.ts - 319 + 314 @@ -7496,7 +7584,7 @@ ~의 apps/client/src/app/components/admin-settings/admin-settings.component.html - 152 + 157 @@ -7504,7 +7592,7 @@ API 키를 정말로 삭제하시겠습니까? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 143 + 144 @@ -7512,7 +7600,7 @@ API 키 제거 apps/client/src/app/components/admin-settings/admin-settings.component.html - 178 + 187 @@ -7520,7 +7608,7 @@ 일일 요청 apps/client/src/app/components/admin-settings/admin-settings.component.html - 154 + 159 @@ -7548,7 +7636,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 141 @@ -7604,7 +7692,7 @@ 구하다 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 645 + 764 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7624,7 +7712,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 133 + 143 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7636,7 +7724,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 123 + 118 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7680,7 +7768,7 @@ 순자산 추적 libs/ui/src/lib/i18n.ts - 110 + 111 @@ -7688,7 +7776,7 @@ Ghostfolio API 키를 입력하세요. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 162 + 163 @@ -7720,7 +7808,7 @@ 방법 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 556 + 675 @@ -7728,7 +7816,7 @@ Do you really want to convert the data source to ? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 485 + 525 @@ -7736,7 +7824,7 @@ 기본 시장 가격 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 638 @@ -7744,7 +7832,7 @@ 선택자 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 572 + 691 @@ -7752,7 +7840,7 @@ 즉각적인 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7760,7 +7848,7 @@ 게으른 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7768,7 +7856,7 @@ HTTP 요청 헤더 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 651 @@ -7776,7 +7864,7 @@ 실시간 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7784,7 +7872,7 @@ 하루의 끝 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7800,7 +7888,7 @@ 만들다 libs/ui/src/lib/tags-selector/tags-selector.component.html - 64 + 62 @@ -7960,7 +8048,7 @@ libs/common/src/lib/routes/routes.ts - 237 + 232 @@ -7969,11 +8057,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 232 + 227 libs/common/src/lib/routes/routes.ts - 235 + 230 @@ -7997,7 +8085,7 @@ ()은(는) 이미 사용 중입니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 718 + 801 @@ -8005,7 +8093,7 @@ ()로 업데이트하는 동안 오류가 발생했습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 721 + 804 @@ -8013,7 +8101,7 @@ 적용하다 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 155 @@ -8069,7 +8157,7 @@ libs/common/src/lib/routes/routes.ts - 110 + 105 @@ -8080,6 +8168,18 @@ 142 + + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 102 + + Log out 로그아웃 @@ -8091,13 +8191,9 @@ Calculations are based on delayed market data and may not be displayed in real-time. 계산은 지연된 시장 데이터를 기반으로 하며 실시간으로 표시되지 않을 수 있습니다. - - apps/client/src/app/components/home-market/home-market.html - 28 - apps/client/src/app/components/markets/markets.html - 54 + 64 @@ -8106,11 +8202,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 200 + 195 libs/common/src/lib/routes/routes.ts - 203 + 198 @@ -8118,7 +8214,7 @@ 데모 사용자 계정 동기화 apps/client/src/app/components/admin-overview/admin-overview.html - 128 + 131 @@ -8126,7 +8222,7 @@ ETF 추적 libs/ui/src/lib/i18n.ts - 106 + 107 @@ -8134,7 +8230,7 @@ 데모 사용자 계정이 동기화되었습니다. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 323 + 334 @@ -8206,7 +8302,7 @@ libs/common/src/lib/routes/routes.ts - 251 + 246 @@ -8214,7 +8310,7 @@ 오픈 소스 대안 libs/common/src/lib/routes/routes.ts - 346 + 341 @@ -8247,15 +8343,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 332 + 327 libs/common/src/lib/routes/routes.ts - 335 + 330 libs/common/src/lib/routes/routes.ts - 343 + 338 @@ -8264,11 +8360,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 324 + 319 libs/common/src/lib/routes/routes.ts - 327 + 322 @@ -8348,7 +8444,7 @@ 이번 달 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 @@ -8493,11 +8589,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 356 + 351 libs/common/src/lib/routes/routes.ts - 357 + 352 @@ -8529,7 +8625,7 @@ 암호화폐 apps/client/src/app/components/markets/markets.component.ts - 52 + 55 apps/client/src/app/pages/features/features-page.html @@ -8541,7 +8637,7 @@ 주식 apps/client/src/app/components/markets/markets.component.ts - 51 + 54 apps/client/src/app/pages/features/features-page.html @@ -8553,7 +8649,7 @@ 자산 프로필 관리 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 479 @@ -8581,7 +8677,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 101 + 102 @@ -8981,7 +9077,7 @@ 등록일 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 56 + 58 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 39e8e4931..2b7ab89ac 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -58,7 +58,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 166 + 174 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -66,11 +66,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 5 + 7 libs/ui/src/lib/activities-table/activities-table.component.html - 183 + 197 @@ -114,7 +114,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 332 + 333 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -150,7 +150,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 161 + 175 libs/ui/src/lib/benchmark/benchmark.component.html @@ -210,11 +210,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 284 + 298 libs/ui/src/lib/activities-table/activities-table.component.html - 320 + 334 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -254,7 +254,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 483 + 497 @@ -270,7 +270,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 235 + 238 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -280,6 +280,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 100 + + apps/client/src/app/components/admin-users/admin-users.html + 254 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 27 @@ -294,7 +298,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 513 + 527 libs/ui/src/lib/benchmark/benchmark.component.html @@ -314,7 +318,7 @@ Betaald apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 129 + 136 @@ -338,7 +342,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 198 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -349,6 +353,14 @@ 20 + + Unknown + Unknown + + libs/ui/src/lib/i18n.ts + 88 + + Attempts Pogingen @@ -398,7 +410,7 @@ Activa Profiel apps/client/src/app/components/admin-settings/admin-settings.component.html - 123 + 128 libs/ui/src/lib/assistant/assistant.html @@ -414,7 +426,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 486 + 487 @@ -425,6 +437,14 @@ 208 + + Splits + Splits + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 512 + + View Stacktrace Bekijk Stacktrace @@ -454,12 +474,20 @@ Zoek een account... libs/ui/src/lib/assistant/assistant.component.ts - 447 + 448 Date Datum + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 521 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 560 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 156 @@ -470,7 +498,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 206 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -494,7 +522,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 113 + 114 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -510,11 +538,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 235 + 236 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 221 + 222 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -538,7 +566,7 @@ Wil je deze coupon echt verwijderen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 242 + 247 @@ -546,7 +574,7 @@ Wil je echt de cache legen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 279 + 290 @@ -554,7 +582,7 @@ Stel je systeemboodschap in: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 299 + 310 @@ -562,7 +590,7 @@ per gebruiker apps/client/src/app/components/admin-overview/admin-overview.component.ts - 178 + 181 @@ -590,7 +618,7 @@ Systeembericht apps/client/src/app/components/admin-overview/admin-overview.html - 88 + 89 @@ -598,7 +626,7 @@ Bericht instellen apps/client/src/app/components/admin-overview/admin-overview.html - 110 + 113 @@ -606,7 +634,7 @@ Alleen lezen apps/client/src/app/components/admin-overview/admin-overview.html - 64 + 63 @@ -614,15 +642,19 @@ Coupons apps/client/src/app/components/admin-overview/admin-overview.html - 148 + 151 Add Toevoegen + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 615 + apps/client/src/app/components/admin-overview/admin-overview.html - 298 + 301 libs/ui/src/lib/account-balances/account-balances.component.html @@ -634,7 +666,7 @@ Huishouding apps/client/src/app/components/admin-overview/admin-overview.html - 117 + 120 @@ -642,7 +674,7 @@ Cache legen apps/client/src/app/components/admin-overview/admin-overview.html - 133 + 136 @@ -686,7 +718,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 124 + 132 @@ -701,8 +733,8 @@ Current Market Mood Huidig marktsentiment - apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html - 12 + libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html + 23 @@ -754,11 +786,11 @@ Aanmaakdatum apps/client/src/app/components/admin-overview/admin-overview.html - 185 + 188 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 150 + 158 @@ -794,7 +826,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 215 + 230 @@ -805,12 +837,20 @@ 64 + + Split Ratio + Split Ratio + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 526 + + Last Days Laatste Dagen apps/client/src/app/components/markets/markets.html - 17 + 24 @@ -846,7 +886,7 @@ of apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 167 + 168 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -894,7 +934,7 @@ Energie libs/ui/src/lib/i18n.ts - 94 + 95 @@ -958,7 +998,7 @@ Koopkracht apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 196 + 256 @@ -966,7 +1006,7 @@ Netto waarde apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 320 + 337 @@ -974,7 +1014,7 @@ Rendement per jaar apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 334 + 351 @@ -982,7 +1022,7 @@ Voer het bedrag van je noodfonds in: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 135 + 145 @@ -990,15 +1030,15 @@ Sectoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 301 + 302 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 421 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 290 + 291 apps/client/src/app/pages/public/public-page.html @@ -1010,15 +1050,15 @@ Landen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 312 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 431 + 432 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 302 + 303 @@ -1026,7 +1066,7 @@ Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 218 + 227 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1034,7 +1074,7 @@ libs/ui/src/lib/tags-selector/tags-selector.component.html - 25 + 23 @@ -1042,7 +1082,7 @@ Gegevensstoring melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 462 + 464 @@ -1090,7 +1130,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 366 @@ -1098,11 +1138,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -1110,11 +1150,11 @@ 1J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -1130,11 +1170,11 @@ 5J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -1150,11 +1190,11 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 244 + 276 libs/ui/src/lib/assistant/assistant.component.ts - 415 + 416 @@ -1190,7 +1230,7 @@ libs/common/src/lib/routes/routes.ts - 240 + 235 @@ -1206,7 +1246,7 @@ libs/common/src/lib/routes/routes.ts - 229 + 224 @@ -1226,7 +1266,7 @@ Voer je couponcode in: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 214 + 203 @@ -1234,7 +1274,7 @@ Kon je kortingscode niet inwisselen apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 178 + 181 @@ -1242,7 +1282,7 @@ Basisconsumptiegoederen libs/ui/src/lib/i18n.ts - 93 + 94 @@ -1250,15 +1290,7 @@ Je couponcode is ingewisseld apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 191 - - - - Reload - Herladen - - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 194 @@ -1266,7 +1298,7 @@ Wil je deze aanmeldingsmethode echt verwijderen? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 303 + 314 @@ -1302,7 +1334,7 @@ Nutsbedrijven libs/ui/src/lib/i18n.ts - 101 + 102 @@ -1326,7 +1358,7 @@ Coupon apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 134 + 141 @@ -1334,7 +1366,7 @@ Locatie apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 666 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1446,11 +1478,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 384 + 396 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 101 + 109 apps/client/src/app/pages/accounts/accounts-page.html @@ -1494,11 +1526,11 @@ Valuta apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 216 + 217 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 339 + 340 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1518,7 +1550,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 303 + 317 @@ -1526,7 +1558,7 @@ Saldo apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 43 + 55 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1542,7 +1574,7 @@ Platform apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 113 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1558,7 +1590,7 @@ Rekening-ID apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 103 + 98 @@ -1566,7 +1598,7 @@ Financiële planning libs/ui/src/lib/i18n.ts - 108 + 109 @@ -1694,7 +1726,7 @@ libs/common/src/lib/routes/routes.ts - 245 + 240 @@ -1702,7 +1734,7 @@ Aangezien je al ingelogd bent, heb je geen toegang tot de demo-account. apps/client/src/app/pages/demo/demo-page.component.ts - 33 + 32 @@ -1718,7 +1750,7 @@ Looptijd apps/client/src/app/components/admin-overview/admin-overview.html - 172 + 175 @@ -1738,7 +1770,15 @@ libs/common/src/lib/routes/routes.ts - 271 + 266 + + + + Invalid API key + Invalid API key + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 112 @@ -1758,15 +1798,19 @@ libs/common/src/lib/routes/routes.ts - 276 + 271 Overview Overzicht + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 42 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 115 apps/client/src/app/components/header/header.component.html @@ -1778,7 +1822,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 47 + 48 apps/client/src/app/pages/admin/admin-page.component.ts @@ -1790,11 +1834,11 @@ libs/common/src/lib/routes/routes.ts - 113 + 108 libs/common/src/lib/routes/routes.ts - 190 + 185 @@ -1802,7 +1846,7 @@ Markten apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 403 + 404 apps/client/src/app/components/footer/footer.component.html @@ -1812,10 +1856,6 @@ apps/client/src/app/components/header/header.component.html 408 - - apps/client/src/app/components/home-market/home-market.html - 2 - apps/client/src/app/components/markets/markets.html 2 @@ -1834,15 +1874,11 @@ libs/common/src/lib/routes/routes.ts - 100 - - - libs/common/src/lib/routes/routes.ts - 281 + 276 libs/common/src/lib/routes/routes.ts - 329 + 324 @@ -1858,7 +1894,7 @@ libs/common/src/lib/routes/routes.ts - 154 + 149 @@ -1934,7 +1970,7 @@ Proefperiode apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 133 + 140 @@ -1946,7 +1982,7 @@ libs/common/src/lib/routes/routes.ts - 159 + 154 @@ -1994,7 +2030,7 @@ Posities apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 100 + 127 apps/client/src/app/components/home-holdings/home-holdings.html @@ -2002,7 +2038,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 168 apps/client/src/app/pages/public/public-page.html @@ -2014,7 +2050,7 @@ libs/common/src/lib/routes/routes.ts - 187 + 182 libs/ui/src/lib/assistant/assistant.html @@ -2034,7 +2070,7 @@ Huidige week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 @@ -2066,7 +2102,7 @@ Naam, symbool of ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 133 + 134 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2086,7 +2122,7 @@ Cyclische consumptiegoederen libs/ui/src/lib/i18n.ts - 92 + 93 @@ -2094,7 +2130,7 @@ Hoeveelheid apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 159 + 160 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -2102,7 +2138,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 227 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2118,7 +2154,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 237 + 251 @@ -2126,7 +2162,7 @@ Opmerking apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 455 + 456 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2142,7 +2178,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 370 + 384 @@ -2150,15 +2186,15 @@ Activiteiten apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 84 + 103 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 111 + 138 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 244 + 245 apps/client/src/app/components/admin-overview/admin-overview.html @@ -2174,15 +2210,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 233 + 234 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 350 + 362 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 110 + 118 apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -2190,7 +2226,7 @@ libs/common/src/lib/routes/routes.ts - 149 + 144 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2250,7 +2286,7 @@ libs/common/src/lib/routes/routes.ts - 291 + 286 @@ -2258,7 +2294,7 @@ Portefeuille apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 139 + 140 apps/client/src/app/components/header/header.component.html @@ -2274,7 +2310,7 @@ libs/common/src/lib/routes/routes.ts - 172 + 167 @@ -2310,7 +2346,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 296 @@ -2354,7 +2390,7 @@ libs/common/src/lib/routes/routes.ts - 352 + 347 @@ -2386,7 +2422,7 @@ Concept libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 181 @@ -2398,11 +2434,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 30 libs/ui/src/lib/activities-table/activities-table.component.html - 406 + 420 @@ -2410,11 +2446,11 @@ Activiteiten exporteren libs/ui/src/lib/activities-table/activities-table.component.html - 64 + 72 libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 448 @@ -2422,11 +2458,11 @@ Concept exporteren als ICS libs/ui/src/lib/activities-table/activities-table.component.html - 77 + 86 libs/ui/src/lib/activities-table/activities-table.component.html - 447 + 461 @@ -2434,7 +2470,7 @@ Kloon libs/ui/src/lib/activities-table/activities-table.component.html - 492 + 506 @@ -2442,7 +2478,7 @@ Concept exporteren als ICS libs/ui/src/lib/activities-table/activities-table.component.html - 502 + 516 @@ -2450,7 +2486,11 @@ Wil je deze activiteit echt verwijderen? libs/ui/src/lib/activities-table/activities-table.component.ts - 327 + 333 + + + libs/ui/src/lib/activities-table/activities-table.component.ts + 344 @@ -2548,10 +2588,6 @@ Exclude from Analysis Uitsluiten van analyse - - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 97 - libs/ui/src/lib/i18n.ts 22 @@ -2582,7 +2618,7 @@ Maximale prijs apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 149 + 150 @@ -2622,11 +2658,11 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 280 + 281 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 270 + 271 @@ -2634,7 +2670,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 296 apps/client/src/app/components/admin-users/admin-users.html @@ -2642,11 +2678,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 284 + 285 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 88 + 96 @@ -2654,7 +2690,7 @@ Minimale prijs apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 131 + 132 @@ -2678,11 +2714,11 @@ Rente apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 67 + 79 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 406 + 424 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2730,7 +2766,7 @@ Abonnementsgeschiedenis apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 141 + 149 @@ -2746,7 +2782,7 @@ Angst apps/client/src/app/components/markets/markets.component.ts - 46 + 58 libs/ui/src/lib/i18n.ts @@ -2758,7 +2794,7 @@ Hebzucht apps/client/src/app/components/markets/markets.component.ts - 47 + 59 libs/ui/src/lib/i18n.ts @@ -2770,7 +2806,7 @@ Filter op... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 365 + 377 @@ -2806,11 +2842,11 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 401 + 402 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 151 + 152 @@ -2818,11 +2854,11 @@ Het formulier kon niet worden gevalideerd. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 641 + 724 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 644 + 727 @@ -2846,7 +2882,7 @@ Uitgesloten van analyse apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 270 + 286 @@ -2854,7 +2890,7 @@ Automatisch apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 74 + 77 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2910,7 +2946,7 @@ Totaalbedrag apps/client/src/app/components/investment-chart/investment-chart.component.ts - 143 + 144 @@ -2926,7 +2962,7 @@ Code apps/client/src/app/components/admin-overview/admin-overview.html - 159 + 162 @@ -2934,7 +2970,7 @@ Spaarrente apps/client/src/app/components/investment-chart/investment-chart.component.ts - 201 + 193 @@ -2946,7 +2982,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 335 + 349 libs/ui/src/lib/i18n.ts @@ -2966,15 +3002,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 254 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 349 + 350 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 244 + 245 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -3002,7 +3038,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 186 + 187 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3010,13 +3046,21 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 322 + 323 libs/ui/src/lib/i18n.ts 35 + + Export + Export + + libs/ui/src/lib/activities-table/activities-table.component.html + 68 + + Tag Label @@ -3034,7 +3078,7 @@ Contant geld apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 168 + 227 libs/ui/src/lib/i18n.ts @@ -3054,7 +3098,7 @@ Equity apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 55 + 67 libs/ui/src/lib/i18n.ts @@ -3078,7 +3122,7 @@ libs/ui/src/lib/i18n.ts - 99 + 100 @@ -3086,7 +3130,7 @@ Authenticatie apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 65 + 67 @@ -3150,15 +3194,15 @@ Noodfonds apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 254 + 270 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 356 + 373 apps/client/src/app/pages/features/features-page.html @@ -3178,7 +3222,7 @@ libs/ui/src/lib/i18n.ts - 98 + 99 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -3242,7 +3286,7 @@ Communicatiediensten libs/ui/src/lib/i18n.ts - 91 + 92 @@ -3269,6 +3313,22 @@ 79 + + Invested Capital + Invested Capital + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 174 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 85 + + South America Zuid-Amerika @@ -3302,7 +3362,7 @@ Prijs apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 176 + 184 @@ -3310,7 +3370,7 @@ Do you really want to convert this asset profile to ()? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 723 + 806 @@ -3318,7 +3378,7 @@ Frequentie van gegevensverzameling apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 467 + 468 @@ -3342,7 +3402,7 @@ Symbool toewijzen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 410 @@ -3358,15 +3418,15 @@ Dividend apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 79 + 91 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 188 + 189 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 419 + 437 apps/client/src/app/pages/features/features-page.html @@ -3402,15 +3462,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 262 + 263 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 365 + 366 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 253 + 254 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -3458,7 +3518,7 @@ Marktgegevens apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 406 + 418 libs/common/src/lib/routes/routes.ts @@ -3494,7 +3554,7 @@ libs/common/src/lib/routes/routes.ts - 105 + 100 @@ -3534,11 +3594,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 52 + 54 libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 434 @@ -3590,7 +3650,7 @@ Geen activiteiten apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 148 @@ -3633,6 +3693,14 @@ 221 + + Investments + Investments + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 197 + + Sneak peek at upcoming functionality Voorproefje van nieuwe functionaliteit @@ -3774,7 +3842,7 @@ Elk uur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 248 @@ -3866,7 +3934,7 @@ Vervaldatum apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 209 + 217 @@ -3882,11 +3950,11 @@ Kon het assetprofiel niet opslaan apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 758 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 678 + 761 @@ -3902,7 +3970,7 @@ Kosten apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -4057,22 +4125,6 @@ 228 - - Delete User - Gebruiker verwijderen - - apps/client/src/app/components/admin-users/admin-users.html - 254 - - - - Do you really want to delete these activities? - Weet je zeker dat je alle activiteiten wilt verwijderen? - - libs/ui/src/lib/activities-table/activities-table.component.ts - 317 - - By ETF Provider Per ETF-aanbieder @@ -4102,7 +4154,7 @@ Huidig jaar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 @@ -4113,16 +4165,24 @@ 10 + + Cache has been flushed. + Cache has been flushed. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 281 + + Url Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 443 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 707 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4138,7 +4198,7 @@ Het activaprofiel is opgeslagen. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 665 + 748 @@ -4154,7 +4214,7 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 212 + 221 @@ -4261,6 +4321,14 @@ 118 + + Shares After + Shares After + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 584 + + Frequently Asked Questions (FAQ) Veelgestelde Vragen @@ -4342,7 +4410,7 @@ Verplichtingen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 298 + 315 apps/client/src/app/pages/features/features-page.html @@ -4362,7 +4430,7 @@ libs/common/src/lib/routes/routes.ts - 205 + 200 @@ -4378,7 +4446,7 @@ libs/common/src/lib/routes/routes.ts - 213 + 208 @@ -4498,7 +4566,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 146 + 141 @@ -4506,7 +4574,7 @@ Technologie libs/ui/src/lib/i18n.ts - 100 + 101 @@ -4522,7 +4590,7 @@ Totaal apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 160 + 168 @@ -4530,7 +4598,7 @@ Scraper instellingen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 509 + 628 @@ -4550,7 +4618,7 @@ libs/common/src/lib/routes/routes.ts - 349 + 344 @@ -4598,7 +4666,7 @@ Coupon has been created apps/client/src/app/components/admin-overview/admin-overview.component.ts - 224 + 229 @@ -4726,7 +4794,7 @@ Web libs/ui/src/lib/i18n.ts - 120 + 121 @@ -4806,7 +4874,7 @@ ETF’s zonder Landen apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 138 @@ -4814,7 +4882,7 @@ ETF’s zonder Sectoren apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 143 @@ -4822,7 +4890,7 @@ An error occurred while converting the data source to . apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 482 + 522 @@ -5042,7 +5110,7 @@ Valuta apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 133 apps/client/src/app/pages/public/public-page.html @@ -5094,11 +5162,11 @@ De scraperconfiguratie kon niet worden geparseerd apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 589 + 672 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 592 + 675 @@ -5194,7 +5262,7 @@ Basismaterialen libs/ui/src/lib/i18n.ts - 90 + 91 @@ -5221,6 +5289,14 @@ 84 + + Do you really want to delete these activities? + Do you really want to delete these activities? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 334 + + Why Ghostfolio? Waarom Ghostfolio? @@ -5322,7 +5398,7 @@ Oeps! De activaprofielen konden niet worden verwijderd. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 52 + 56 @@ -5378,7 +5454,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 139 + 134 @@ -5427,19 +5503,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 249 libs/common/src/lib/routes/routes.ts - 255 + 250 libs/common/src/lib/routes/routes.ts - 259 + 254 libs/common/src/lib/routes/routes.ts - 265 + 260 @@ -5448,11 +5524,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 274 + 269 libs/common/src/lib/routes/routes.ts - 275 + 270 @@ -5461,31 +5537,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 196 + 191 libs/common/src/lib/routes/routes.ts - 197 + 192 libs/common/src/lib/routes/routes.ts - 202 + 197 libs/common/src/lib/routes/routes.ts - 210 + 205 libs/common/src/lib/routes/routes.ts - 218 + 213 libs/common/src/lib/routes/routes.ts - 226 + 221 libs/common/src/lib/routes/routes.ts - 234 + 229 @@ -5494,11 +5570,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 224 + 219 libs/common/src/lib/routes/routes.ts - 227 + 222 @@ -5507,11 +5583,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 208 + 203 libs/common/src/lib/routes/routes.ts - 211 + 206 @@ -5520,11 +5596,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 279 + 274 libs/common/src/lib/routes/routes.ts - 280 + 275 @@ -5533,11 +5609,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 289 + 284 libs/common/src/lib/routes/routes.ts - 290 + 285 @@ -5546,11 +5622,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 299 + 294 libs/common/src/lib/routes/routes.ts - 300 + 295 @@ -5559,31 +5635,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 299 libs/common/src/lib/routes/routes.ts - 305 + 300 libs/common/src/lib/routes/routes.ts - 310 + 305 libs/common/src/lib/routes/routes.ts - 318 + 313 libs/common/src/lib/routes/routes.ts - 326 + 321 libs/common/src/lib/routes/routes.ts - 334 + 329 libs/common/src/lib/routes/routes.ts - 342 + 337 @@ -5648,11 +5724,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 340 + 335 libs/common/src/lib/routes/routes.ts - 344 + 339 @@ -5660,7 +5736,7 @@ Aandelen volgen libs/ui/src/lib/i18n.ts - 111 + 112 @@ -5679,6 +5755,14 @@ 369 + + Data gathering has been started. + Data gathering has been started. + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 413 + + Global Wereldwijd @@ -5720,7 +5804,7 @@ Convert to apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 174 + 175 @@ -5792,7 +5876,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 275 libs/ui/src/lib/i18n.ts @@ -5888,7 +5972,7 @@ Lidmaatschap apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 78 + 82 libs/common/src/lib/routes/routes.ts @@ -5928,11 +6012,11 @@ Weet u zeker dat u dit bezittingen profiel wilt verwijderen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 28 + 29 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 66 + 71 @@ -5948,7 +6032,7 @@ Industrie libs/ui/src/lib/i18n.ts - 97 + 98 @@ -6004,7 +6088,7 @@ Oeps, geldoverdracht is mislukt. apps/client/src/app/pages/accounts/accounts-page.component.ts - 358 + 355 @@ -6044,7 +6128,7 @@ Gezondheidszorg libs/ui/src/lib/i18n.ts - 96 + 97 @@ -6052,7 +6136,7 @@ Wilt u dit systeembericht echt verwijderen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 255 + 260 @@ -6084,7 +6168,7 @@ Contant Saldo apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 143 + 170 @@ -6120,7 +6204,7 @@ De huidige markt waarde is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 766 + 850 @@ -6128,7 +6212,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 606 + 725 @@ -6202,18 +6286,6 @@ Investment Investering - - apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 173 - - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 60 - - - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 85 - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 101 @@ -6236,7 +6308,7 @@ Sluit Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 449 + 451 @@ -6276,7 +6348,7 @@ Week tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6284,11 +6356,11 @@ Week tot nu toe apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6296,7 +6368,7 @@ Maand tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6304,11 +6376,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6324,7 +6396,7 @@ Jaar tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -6368,7 +6440,7 @@ jaar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6380,7 +6452,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -6388,11 +6460,11 @@ jaren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -6408,7 +6480,7 @@ Data Verzamelen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 629 + 748 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6420,7 +6492,7 @@ Zoek een positie... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 449 @@ -6440,7 +6512,7 @@ libs/common/src/lib/routes/routes.ts - 260 + 255 @@ -6452,7 +6524,7 @@ libs/common/src/lib/routes/routes.ts - 268 + 263 @@ -6461,11 +6533,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 263 + 258 libs/common/src/lib/routes/routes.ts - 266 + 261 @@ -6473,7 +6545,7 @@ Dagelijks apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 244 @@ -6511,9 +6583,13 @@ Activity Activiteit + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 101 + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 231 + 232 @@ -6521,7 +6597,7 @@ Dividendrendement apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 198 + 199 @@ -6577,7 +6653,7 @@ Verwijder Activiteiten libs/ui/src/lib/activities-table/activities-table.component.html - 92 + 105 @@ -6585,7 +6661,7 @@ Internationalizering libs/common/src/lib/routes/routes.ts - 119 + 114 @@ -6593,7 +6669,7 @@ Wilt u uw Ghostfolio account echt sluiten? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 229 + 244 @@ -6601,7 +6677,7 @@ Ga naar een pagina... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 450 @@ -6649,7 +6725,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 134 + 129 @@ -6657,7 +6733,7 @@ Opnemen in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 399 + 400 @@ -6665,7 +6741,7 @@ Oeps! Er is een fout opgetreden met het instellen van de biometrische authenticatie. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 352 + 363 @@ -6681,7 +6757,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 128 @@ -6729,7 +6805,7 @@ Budgetteren libs/ui/src/lib/i18n.ts - 104 + 105 @@ -6797,7 +6873,7 @@ Oeps! Het activaprofiel kon niet worden verwijderd. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 51 + 55 @@ -6805,7 +6881,7 @@ Familiekantoor libs/ui/src/lib/i18n.ts - 107 + 108 @@ -6885,7 +6961,7 @@ Vermogensbeheer libs/ui/src/lib/i18n.ts - 113 + 114 @@ -6893,7 +6969,7 @@ Bekijk Holding libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 487 @@ -6901,7 +6977,7 @@ Wil je deze activaprofielen echt verwijderen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 67 + 72 @@ -6909,7 +6985,7 @@ Fout apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 757 + 841 @@ -6949,11 +7025,11 @@ Annuleren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 162 + 163 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 753 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6977,7 +7053,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 112 + 107 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7005,7 +7081,7 @@ Sluiten apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 636 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7037,11 +7113,11 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 244 + 252 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 114 + 109 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7057,7 +7133,7 @@ Rol apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 44 + 45 @@ -7081,7 +7157,7 @@ Belastingrapportage libs/ui/src/lib/i18n.ts - 112 + 113 @@ -7097,7 +7173,7 @@ Verandering met valuta-effect Verandering apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 63 + 64 @@ -7113,7 +7189,7 @@ Prestaties met valuta-effect Prestaties apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 83 + 84 @@ -7161,7 +7237,7 @@ is naar het klembord gekopieerd apps/client/src/app/components/admin-overview/admin-overview.component.ts - 223 + 228 libs/ui/src/lib/value/value.component.ts @@ -7229,7 +7305,7 @@ Financiële diensten libs/ui/src/lib/i18n.ts - 95 + 96 @@ -7259,6 +7335,10 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 270 + + libs/ui/src/lib/activities-table/activities-table.component.html + 101 + cannot be self-hosted @@ -7284,6 +7364,14 @@ 278 + + Shares Before + Shares Before + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 597 + + cannot be used anonymously kan niet anoniem gebruik worden @@ -7313,7 +7401,7 @@ Dividend volgen libs/ui/src/lib/i18n.ts - 105 + 106 @@ -7357,7 +7445,7 @@ API-sleutel instellen apps/client/src/app/components/admin-settings/admin-settings.component.html - 188 + 197 @@ -7373,7 +7461,7 @@ Beleggingsonderzoek libs/ui/src/lib/i18n.ts - 109 + 110 @@ -7397,7 +7485,7 @@ libs/common/src/lib/routes/routes.ts - 313 + 308 @@ -7413,7 +7501,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 316 @@ -7422,11 +7510,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 316 + 311 libs/common/src/lib/routes/routes.ts - 319 + 314 @@ -7435,11 +7523,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 308 + 303 libs/common/src/lib/routes/routes.ts - 311 + 306 @@ -7463,7 +7551,7 @@ van apps/client/src/app/components/admin-settings/admin-settings.component.html - 152 + 157 @@ -7471,7 +7559,7 @@ dagelijkse verzoeken apps/client/src/app/components/admin-settings/admin-settings.component.html - 154 + 159 @@ -7479,7 +7567,7 @@ Verwijder API-sleutel apps/client/src/app/components/admin-settings/admin-settings.component.html - 178 + 187 @@ -7487,7 +7575,7 @@ Wilt u de API-sleutel echt verwijderen? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 143 + 144 @@ -7507,7 +7595,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 141 @@ -7579,7 +7667,7 @@ Opslaan apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 645 + 764 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7599,7 +7687,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 133 + 143 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7611,7 +7699,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 123 + 118 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7655,7 +7743,7 @@ Netto waarde volgen libs/ui/src/lib/i18n.ts - 110 + 111 @@ -7663,7 +7751,7 @@ Voer uw Ghostfolio API-sleutel in. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 162 + 163 @@ -7695,7 +7783,7 @@ Lui apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7703,7 +7791,7 @@ Direct apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7711,7 +7799,7 @@ Standaard Marktprijs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 638 @@ -7719,7 +7807,7 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 556 + 675 @@ -7727,7 +7815,7 @@ Do you really want to convert the data source to ? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 485 + 525 @@ -7735,7 +7823,7 @@ Kiezer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 572 + 691 @@ -7743,7 +7831,7 @@ HTTP Verzoek Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 651 @@ -7751,7 +7839,7 @@ eind van de dag apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7759,7 +7847,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7775,7 +7863,7 @@ Nieuw libs/ui/src/lib/tags-selector/tags-selector.component.html - 64 + 62 @@ -7940,11 +8028,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 232 + 227 libs/common/src/lib/routes/routes.ts - 235 + 230 @@ -7956,7 +8044,7 @@ libs/common/src/lib/routes/routes.ts - 237 + 232 @@ -7972,7 +8060,7 @@ () is al in gebruik. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 718 + 801 @@ -7980,7 +8068,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 - 721 + 804 @@ -7988,7 +8076,7 @@ Toepassen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 155 @@ -8068,7 +8156,7 @@ libs/common/src/lib/routes/routes.ts - 110 + 105 @@ -8079,6 +8167,18 @@ 142 + + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 102 + + Log out Uitloggen @@ -8090,13 +8190,9 @@ Calculations are based on delayed market data and may not be displayed in real-time. Berekeningen zijn gebaseerd op vertraagde marktgegevens en worden mogelijk niet in realtime weergegeven. - - apps/client/src/app/components/home-market/home-market.html - 28 - apps/client/src/app/components/markets/markets.html - 54 + 64 @@ -8105,11 +8201,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 200 + 195 libs/common/src/lib/routes/routes.ts - 203 + 198 @@ -8117,7 +8213,7 @@ ETF’s volgen libs/ui/src/lib/i18n.ts - 106 + 107 @@ -8125,7 +8221,7 @@ Demo-gebruikersaccount is gesynchroniseerd. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 323 + 334 @@ -8133,7 +8229,7 @@ Synchroniseer demo-gebruikersaccount apps/client/src/app/components/admin-overview/admin-overview.html - 128 + 131 @@ -8205,7 +8301,7 @@ libs/common/src/lib/routes/routes.ts - 251 + 246 @@ -8213,7 +8309,7 @@ Open Source alternatief voor libs/common/src/lib/routes/routes.ts - 346 + 341 @@ -8246,15 +8342,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 332 + 327 libs/common/src/lib/routes/routes.ts - 335 + 330 libs/common/src/lib/routes/routes.ts - 343 + 338 @@ -8263,11 +8359,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 324 + 319 libs/common/src/lib/routes/routes.ts - 327 + 322 @@ -8347,7 +8443,7 @@ Huidige maand apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 @@ -8492,11 +8588,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 356 + 351 libs/common/src/lib/routes/routes.ts - 357 + 352 @@ -8528,7 +8624,7 @@ Aandelen apps/client/src/app/components/markets/markets.component.ts - 51 + 54 apps/client/src/app/pages/features/features-page.html @@ -8540,7 +8636,7 @@ Cryptovaluta apps/client/src/app/components/markets/markets.component.ts - 52 + 55 apps/client/src/app/pages/features/features-page.html @@ -8552,7 +8648,7 @@ Beheer activaprofiel apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 479 @@ -8580,7 +8676,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 101 + 102 @@ -8984,7 +9080,7 @@ Registratiedatum apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 56 + 58 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 1aac9ae83..4182139a7 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -7,31 +7,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 196 + 191 libs/common/src/lib/routes/routes.ts - 197 + 192 libs/common/src/lib/routes/routes.ts - 202 + 197 libs/common/src/lib/routes/routes.ts - 210 + 205 libs/common/src/lib/routes/routes.ts - 218 + 213 libs/common/src/lib/routes/routes.ts - 226 + 221 libs/common/src/lib/routes/routes.ts - 234 + 229 @@ -40,19 +40,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 249 libs/common/src/lib/routes/routes.ts - 255 + 250 libs/common/src/lib/routes/routes.ts - 259 + 254 libs/common/src/lib/routes/routes.ts - 265 + 260 @@ -61,11 +61,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 274 + 269 libs/common/src/lib/routes/routes.ts - 275 + 270 @@ -74,11 +74,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 208 + 203 libs/common/src/lib/routes/routes.ts - 211 + 206 @@ -87,11 +87,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 279 + 274 libs/common/src/lib/routes/routes.ts - 280 + 275 @@ -100,11 +100,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 289 + 284 libs/common/src/lib/routes/routes.ts - 290 + 285 @@ -113,11 +113,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 224 + 219 libs/common/src/lib/routes/routes.ts - 227 + 222 @@ -126,11 +126,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 299 + 294 libs/common/src/lib/routes/routes.ts - 300 + 295 @@ -139,31 +139,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 299 libs/common/src/lib/routes/routes.ts - 305 + 300 libs/common/src/lib/routes/routes.ts - 310 + 305 libs/common/src/lib/routes/routes.ts - 318 + 313 libs/common/src/lib/routes/routes.ts - 326 + 321 libs/common/src/lib/routes/routes.ts - 334 + 329 libs/common/src/lib/routes/routes.ts - 342 + 337 @@ -259,7 +259,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 166 + 174 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -267,11 +267,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 5 + 7 libs/ui/src/lib/activities-table/activities-table.component.html - 183 + 197 @@ -311,7 +311,7 @@ Saldo Gotówkowe apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 43 + 55 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -327,7 +327,7 @@ Platforma apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 113 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -359,7 +359,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 332 + 333 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -395,7 +395,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 161 + 175 libs/ui/src/lib/benchmark/benchmark.component.html @@ -435,11 +435,11 @@ Waluta apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 216 + 217 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 339 + 340 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -459,7 +459,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 303 + 317 @@ -495,11 +495,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 284 + 298 libs/ui/src/lib/activities-table/activities-table.component.html - 320 + 334 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -539,7 +539,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 483 + 497 @@ -555,7 +555,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 235 + 238 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -565,6 +565,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 100 + + apps/client/src/app/components/admin-users/admin-users.html + 254 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 27 @@ -579,7 +583,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 513 + 527 libs/ui/src/lib/benchmark/benchmark.component.html @@ -599,7 +603,7 @@ Paid apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 129 + 136 @@ -619,7 +623,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 486 + 487 @@ -635,7 +639,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 198 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -646,6 +650,14 @@ 20 + + Unknown + Unknown + + libs/ui/src/lib/i18n.ts + 88 + + Attempts Próby @@ -706,6 +718,14 @@ 208 + + Splits + Splits + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 512 + + View Stacktrace Wyświetl Stos Wywołań @@ -735,12 +755,20 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 447 + 448 Date Data + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 521 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 560 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 156 @@ -751,7 +779,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 206 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -775,7 +803,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 113 + 114 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -787,7 +815,7 @@ Waluty apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 133 apps/client/src/app/pages/public/public-page.html @@ -807,7 +835,7 @@ ETF-y bez Krajów apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 138 @@ -815,7 +843,7 @@ ETF-y bez Sektorów apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 143 @@ -823,7 +851,7 @@ An error occurred while converting the data source to . apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 482 + 522 @@ -831,11 +859,11 @@ Czy na pewno chcesz usunąć ten profil aktywów? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 28 + 29 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 66 + 71 @@ -843,7 +871,7 @@ Filtruj według... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 365 + 377 @@ -855,11 +883,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 235 + 236 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 221 + 222 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -871,7 +899,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 467 + 468 @@ -915,7 +943,7 @@ Subscription History apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 141 + 149 @@ -951,7 +979,7 @@ Healthcare libs/ui/src/lib/i18n.ts - 96 + 97 @@ -991,11 +1019,11 @@ Sektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 280 + 281 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 270 + 271 @@ -1003,7 +1031,7 @@ Kraj apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 296 apps/client/src/app/components/admin-users/admin-users.html @@ -1011,11 +1039,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 284 + 285 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 88 + 96 @@ -1023,15 +1051,15 @@ Sektory apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 301 + 302 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 421 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 290 + 291 apps/client/src/app/pages/public/public-page.html @@ -1043,15 +1071,15 @@ Kraje apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 312 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 431 + 432 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 302 + 303 @@ -1059,7 +1087,7 @@ Mapowanie Symboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 410 @@ -1067,7 +1095,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 146 + 141 @@ -1075,7 +1103,7 @@ Technology libs/ui/src/lib/i18n.ts - 100 + 101 @@ -1091,7 +1119,7 @@ Total apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 160 + 168 @@ -1099,7 +1127,7 @@ Konfiguracja Scrapera apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 509 + 628 @@ -1107,7 +1135,7 @@ Notatka apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 455 + 456 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1123,7 +1151,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 370 + 384 @@ -1147,7 +1175,7 @@ Industrials libs/ui/src/lib/i18n.ts - 97 + 98 @@ -1163,7 +1191,7 @@ Nazwa, symbol lub ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 133 + 134 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1183,7 +1211,7 @@ Consumer Cyclical libs/ui/src/lib/i18n.ts - 92 + 93 @@ -1191,7 +1219,7 @@ Czy naprawdę chcesz usunąć ten kupon? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 242 + 247 @@ -1199,7 +1227,7 @@ Czy naprawdę chcesz usunąć tę wiadomość systemową? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 255 + 260 @@ -1207,7 +1235,7 @@ Czy naprawdę chcesz wyczyścić pamięć podręczną? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 279 + 290 @@ -1215,7 +1243,7 @@ Proszę ustawić swoją wiadomość systemową: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 299 + 310 @@ -1231,7 +1259,7 @@ na Użytkownika apps/client/src/app/components/admin-overview/admin-overview.component.ts - 178 + 181 @@ -1255,7 +1283,7 @@ Tryb Tylko do Odczytu apps/client/src/app/components/admin-overview/admin-overview.html - 64 + 63 @@ -1263,7 +1291,7 @@ Wiadomość Systemowa apps/client/src/app/components/admin-overview/admin-overview.html - 88 + 89 @@ -1271,7 +1299,7 @@ Ustaw Wiadomość apps/client/src/app/components/admin-overview/admin-overview.html - 110 + 113 @@ -1279,15 +1307,19 @@ Kupony apps/client/src/app/components/admin-overview/admin-overview.html - 148 + 151 Add Dodaj + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 615 + apps/client/src/app/components/admin-overview/admin-overview.html - 298 + 301 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1299,7 +1331,7 @@ Konserwacja apps/client/src/app/components/admin-overview/admin-overview.html - 117 + 120 @@ -1307,7 +1339,7 @@ Wyczyszczenie pamięci podręcznej apps/client/src/app/components/admin-overview/admin-overview.html - 133 + 136 @@ -1323,11 +1355,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 443 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 707 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1343,7 +1375,7 @@ Profil zasobu został zapisany apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 665 + 748 @@ -1375,7 +1407,7 @@ Obecny rok apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 @@ -1386,12 +1418,20 @@ 10 + + Cache has been flushed. + Cache has been flushed. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 281 + + Platforms Platformy apps/client/src/app/components/admin-settings/admin-settings.component.html - 212 + 221 @@ -1399,7 +1439,7 @@ Tagi apps/client/src/app/components/admin-settings/admin-settings.component.html - 218 + 227 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1407,7 +1447,7 @@ libs/ui/src/lib/tags-selector/tags-selector.component.html - 25 + 23 @@ -1483,7 +1523,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 124 + 132 @@ -1502,24 +1542,16 @@ 228 - - Delete User - Usuń Użytkownika - - apps/client/src/app/components/admin-users/admin-users.html - 254 - - Could not validate form Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 641 + 724 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 644 + 727 @@ -1543,7 +1575,7 @@ Portfel apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 139 + 140 apps/client/src/app/components/header/header.component.html @@ -1559,7 +1591,7 @@ libs/common/src/lib/routes/routes.ts - 172 + 167 @@ -1567,19 +1599,19 @@ Poziom Odniesienia (Benchmark) apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 401 + 402 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 151 + 152 Current Market Mood Obecny Nastrój Rynkowy - apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html - 12 + libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html + 23 @@ -1627,7 +1659,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 215 + 230 @@ -1638,12 +1670,20 @@ 64 + + Split Ratio + Split Ratio + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 526 + + Fear Zagrożenie apps/client/src/app/components/markets/markets.component.ts - 46 + 58 libs/ui/src/lib/i18n.ts @@ -1655,7 +1695,7 @@ Zachłanność apps/client/src/app/components/markets/markets.component.ts - 47 + 59 libs/ui/src/lib/i18n.ts @@ -1667,7 +1707,7 @@ Ostatnie Dni apps/client/src/app/components/markets/markets.html - 17 + 24 @@ -1755,7 +1795,7 @@ Obecny tydzień apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 @@ -1775,7 +1815,7 @@ Całkowita Kwota apps/client/src/app/components/investment-chart/investment-chart.component.ts - 143 + 144 @@ -1783,7 +1823,7 @@ Code apps/client/src/app/components/admin-overview/admin-overview.html - 159 + 162 @@ -1791,7 +1831,7 @@ Stopa Oszczędności apps/client/src/app/components/investment-chart/investment-chart.component.ts - 201 + 193 @@ -1827,7 +1867,7 @@ lub apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 167 + 168 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -1875,7 +1915,7 @@ Energy libs/ui/src/lib/i18n.ts - 94 + 95 @@ -1907,7 +1947,7 @@ Opłaty apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -1951,7 +1991,7 @@ Siła Nabywcza apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 196 + 256 @@ -1959,7 +1999,7 @@ Wykluczone z Analizy apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 270 + 286 @@ -1967,7 +2007,7 @@ Pasywa (Zobowiązania Finansowe) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 298 + 315 apps/client/src/app/pages/features/features-page.html @@ -1979,7 +2019,7 @@ Wartość Netto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 320 + 337 @@ -1987,7 +2027,7 @@ Osiągi w Ujęciu Rocznym apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 334 + 351 @@ -1995,7 +2035,7 @@ Wprowadź wysokość funduszu rezerwowego: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 135 + 145 @@ -2003,7 +2043,7 @@ Cena Minimalna apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 131 + 132 @@ -2011,7 +2051,7 @@ Cena Maksymalna apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 149 + 150 @@ -2019,7 +2059,7 @@ Ilość apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 159 + 160 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -2027,7 +2067,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 227 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2039,7 +2079,7 @@ Zgłoś Błąd Danych apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 462 + 464 @@ -2219,7 +2259,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 366 @@ -2227,11 +2267,11 @@ Liczony od początku roku (year-to-date) apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -2239,11 +2279,11 @@ 1 rok apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -2259,11 +2299,11 @@ 5 lat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -2279,11 +2319,11 @@ Maksimum apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 244 + 276 libs/ui/src/lib/assistant/assistant.component.ts - 415 + 416 @@ -2327,7 +2367,7 @@ Wpisz kod kuponu: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 214 + 203 @@ -2335,7 +2375,7 @@ Nie udało się zrealizować kodu kuponu apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 178 + 181 @@ -2343,7 +2383,7 @@ Consumer Defensive libs/ui/src/lib/i18n.ts - 93 + 94 @@ -2351,15 +2391,7 @@ Kupon został zrealizowany apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 191 - - - - Reload - Odśwież - - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 194 @@ -2395,7 +2427,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 74 + 77 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2407,7 +2439,7 @@ Czy na pewno chcesz usunąć tą metode logowania? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 303 + 314 @@ -2415,7 +2447,7 @@ Utilities libs/ui/src/lib/i18n.ts - 101 + 102 @@ -2447,7 +2479,7 @@ Coupon apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 134 + 141 @@ -2463,7 +2495,7 @@ Ustawienia Regionalne apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 666 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2542,6 +2574,14 @@ 221 + + Investments + Investments + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 197 + + Biometric Authentication Uwierzytelnianie Biometryczne @@ -2667,7 +2707,7 @@ libs/common/src/lib/routes/routes.ts - 240 + 235 @@ -2683,7 +2723,7 @@ libs/common/src/lib/routes/routes.ts - 205 + 200 @@ -2699,7 +2739,7 @@ libs/common/src/lib/routes/routes.ts - 213 + 208 @@ -2715,7 +2755,7 @@ libs/common/src/lib/routes/routes.ts - 229 + 224 @@ -2775,11 +2815,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 384 + 396 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 101 + 109 apps/client/src/app/pages/accounts/accounts-page.html @@ -2799,7 +2839,7 @@ Ups, transfer salda nie powiódł się. apps/client/src/app/pages/accounts/accounts-page.component.ts - 358 + 355 @@ -2823,7 +2863,7 @@ ID konta apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 103 + 98 @@ -2831,7 +2871,7 @@ Financial Planning libs/ui/src/lib/i18n.ts - 108 + 109 @@ -2879,7 +2919,7 @@ Dane Rynkowe apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 406 + 418 libs/common/src/lib/routes/routes.ts @@ -2917,9 +2957,13 @@ Overview Przegląd + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 42 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 115 apps/client/src/app/components/header/header.component.html @@ -2931,7 +2975,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 47 + 48 apps/client/src/app/pages/admin/admin-page.component.ts @@ -2943,11 +2987,11 @@ libs/common/src/lib/routes/routes.ts - 113 + 108 libs/common/src/lib/routes/routes.ts - 190 + 185 @@ -3059,7 +3103,7 @@ libs/common/src/lib/routes/routes.ts - 245 + 240 @@ -3067,11 +3111,11 @@ Nie udało się przetworzyć konfiguracji scrapera apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 589 + 672 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 592 + 675 @@ -3087,7 +3131,7 @@ Ponieważ jesteś już zalogowany, nie możesz uzyskać dostępu do konta demo. apps/client/src/app/pages/demo/demo-page.component.ts - 33 + 32 @@ -3103,7 +3147,7 @@ Duration apps/client/src/app/components/admin-overview/admin-overview.html - 172 + 175 @@ -3123,7 +3167,15 @@ libs/common/src/lib/routes/routes.ts - 271 + 266 + + + + Invalid API key + Invalid API key + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 112 @@ -3143,7 +3195,7 @@ libs/common/src/lib/routes/routes.ts - 276 + 271 @@ -3295,11 +3347,11 @@ Creation apps/client/src/app/components/admin-overview/admin-overview.html - 185 + 188 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 150 + 158 @@ -3307,7 +3359,7 @@ Inwestycje apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 100 + 127 apps/client/src/app/components/home-holdings/home-holdings.html @@ -3315,7 +3367,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 168 apps/client/src/app/pages/public/public-page.html @@ -3327,7 +3379,7 @@ libs/common/src/lib/routes/routes.ts - 187 + 182 libs/ui/src/lib/assistant/assistant.html @@ -3351,7 +3403,7 @@ libs/common/src/lib/routes/routes.ts - 105 + 100 @@ -3359,7 +3411,7 @@ Rynki apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 403 + 404 apps/client/src/app/components/footer/footer.component.html @@ -3369,10 +3421,6 @@ apps/client/src/app/components/header/header.component.html 408 - - apps/client/src/app/components/home-market/home-market.html - 2 - apps/client/src/app/components/markets/markets.html 2 @@ -3391,15 +3439,11 @@ libs/common/src/lib/routes/routes.ts - 100 - - - libs/common/src/lib/routes/routes.ts - 281 + 276 libs/common/src/lib/routes/routes.ts - 329 + 324 @@ -3535,7 +3579,7 @@ Basic Materials libs/ui/src/lib/i18n.ts - 90 + 91 @@ -3562,6 +3606,14 @@ 84 + + Do you really want to delete these activities? + Do you really want to delete these activities? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 334 + + Why Ghostfolio? Dlaczego Ghostfolio? @@ -3663,7 +3715,7 @@ Oops! Could not delete the asset profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 52 + 56 @@ -3735,7 +3787,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 139 + 134 @@ -3803,7 +3855,7 @@ Convert to apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 174 + 175 @@ -3879,15 +3931,15 @@ Aktywności apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 84 + 103 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 111 + 138 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 244 + 245 apps/client/src/app/components/admin-overview/admin-overview.html @@ -3903,15 +3955,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 233 + 234 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 350 + 362 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 110 + 118 apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -3919,21 +3971,13 @@ libs/common/src/lib/routes/routes.ts - 149 + 144 libs/ui/src/lib/accounts-table/accounts-table.component.html 126 - - Do you really want to delete these activities? - Czy na pewno chcesz usunąć te aktywności? - - libs/ui/src/lib/activities-table/activities-table.component.ts - 317 - - Update activity Aktualizuj aktywność @@ -4011,7 +4055,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 237 + 251 @@ -4023,11 +4067,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 30 libs/ui/src/lib/activities-table/activities-table.component.html - 406 + 420 @@ -4039,11 +4083,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 52 + 54 libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 434 @@ -4146,6 +4190,14 @@ 118 + + Shares After + Shares After + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 584 + + Back Wróc @@ -4163,7 +4215,7 @@ Price apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 176 + 184 @@ -4171,7 +4223,7 @@ Do you really want to convert this asset profile to ()? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 723 + 806 @@ -4187,7 +4239,7 @@ libs/common/src/lib/routes/routes.ts - 154 + 149 @@ -4271,16 +4323,12 @@ Trial apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 133 + 140 Exclude from Analysis Wyklucz z analizy - - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 97 - libs/ui/src/lib/i18n.ts 22 @@ -4363,7 +4411,7 @@ libs/common/src/lib/routes/routes.ts - 159 + 154 @@ -4379,15 +4427,15 @@ Dywidenda apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 79 + 91 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 188 + 189 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 419 + 437 apps/client/src/app/pages/features/features-page.html @@ -4531,7 +4579,7 @@ libs/common/src/lib/routes/routes.ts - 291 + 286 @@ -4571,7 +4619,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 248 @@ -4683,7 +4731,7 @@ Expiration apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 209 + 217 @@ -4723,11 +4771,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 758 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 678 + 761 @@ -4779,7 +4827,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 296 @@ -4811,7 +4859,7 @@ libs/common/src/lib/routes/routes.ts - 349 + 344 @@ -4820,11 +4868,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 340 + 335 libs/common/src/lib/routes/routes.ts - 344 + 339 @@ -4936,7 +4984,7 @@ Coupon has been created apps/client/src/app/components/admin-overview/admin-overview.component.ts - 224 + 229 @@ -5064,7 +5112,7 @@ Stock Tracking libs/ui/src/lib/i18n.ts - 111 + 112 @@ -5088,7 +5136,7 @@ Web libs/ui/src/lib/i18n.ts - 120 + 121 @@ -5099,6 +5147,14 @@ 373 + + Data gathering has been started. + Data gathering has been started. + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 413 + + Global Globalny @@ -5132,7 +5188,7 @@ libs/common/src/lib/routes/routes.ts - 352 + 347 @@ -5140,7 +5196,7 @@ Członkostwo apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 78 + 82 libs/common/src/lib/routes/routes.ts @@ -5208,11 +5264,11 @@ Eksportuj Działalności libs/ui/src/lib/activities-table/activities-table.component.html - 64 + 72 libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 448 @@ -5220,11 +5276,11 @@ Eksportuj Wersje Robocze jako ICS libs/ui/src/lib/activities-table/activities-table.component.html - 77 + 86 libs/ui/src/lib/activities-table/activities-table.component.html - 447 + 461 @@ -5232,7 +5288,7 @@ Przygotuj Wstępną Wersję libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 181 @@ -5240,7 +5296,7 @@ Sklonuj libs/ui/src/lib/activities-table/activities-table.component.html - 492 + 506 @@ -5248,7 +5304,7 @@ Eksportuj Wersję Roboczą jako ICS libs/ui/src/lib/activities-table/activities-table.component.html - 502 + 516 @@ -5256,7 +5312,11 @@ Czy na pewno chcesz usunąć tę działalność? libs/ui/src/lib/activities-table/activities-table.component.ts - 327 + 333 + + + libs/ui/src/lib/activities-table/activities-table.component.ts + 344 @@ -5264,7 +5324,7 @@ Profile aktywów apps/client/src/app/components/admin-settings/admin-settings.component.html - 123 + 128 libs/ui/src/lib/assistant/assistant.html @@ -5364,11 +5424,11 @@ Odsetki apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 67 + 79 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 406 + 424 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5432,7 +5492,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 335 + 349 libs/ui/src/lib/i18n.ts @@ -5460,15 +5520,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 254 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 349 + 350 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 244 + 245 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -5492,15 +5552,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 262 + 263 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 365 + 366 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 253 + 254 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -5540,15 +5600,15 @@ Fundusz Rezerwowy apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 254 + 270 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 356 + 373 apps/client/src/app/pages/features/features-page.html @@ -5616,7 +5676,7 @@ libs/ui/src/lib/i18n.ts - 98 + 99 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -5644,7 +5704,7 @@ Brak transakcji apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 148 @@ -5684,7 +5744,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 186 + 187 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5692,13 +5752,21 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 322 + 323 libs/ui/src/lib/i18n.ts 35 + + Export + Export + + libs/ui/src/lib/activities-table/activities-table.component.html + 68 + + Tag Tag @@ -5768,7 +5836,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 275 libs/ui/src/lib/i18n.ts @@ -5808,7 +5876,7 @@ Gotówka apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 168 + 227 libs/ui/src/lib/i18n.ts @@ -5828,7 +5896,7 @@ Kapitał apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 55 + 67 libs/ui/src/lib/i18n.ts @@ -5852,7 +5920,7 @@ libs/ui/src/lib/i18n.ts - 99 + 100 @@ -5860,7 +5928,7 @@ Uwierzytelnianie apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 65 + 67 @@ -5940,7 +6008,7 @@ Communication Services libs/ui/src/lib/i18n.ts - 91 + 92 @@ -5975,6 +6043,22 @@ 79 + + Invested Capital + Invested Capital + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 174 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 85 + + South America Ameryka Południowa @@ -6084,7 +6168,7 @@ Salda Gotówkowe apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 143 + 170 @@ -6120,7 +6204,7 @@ Obecna cena rynkowa wynosi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 766 + 850 @@ -6128,7 +6212,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 606 + 725 @@ -6202,18 +6286,6 @@ Investment Inwestycje - - apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 173 - - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 60 - - - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 85 - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 101 @@ -6236,7 +6308,7 @@ Zamknij pozycję apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 449 + 451 @@ -6276,7 +6348,7 @@ Dotychczasowy tydzień libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6284,11 +6356,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6296,7 +6368,7 @@ Od początku miesiąca libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6304,11 +6376,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6324,7 +6396,7 @@ Od początku roku libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -6368,7 +6440,7 @@ rok apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6380,7 +6452,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -6388,11 +6460,11 @@ lata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -6408,7 +6480,7 @@ Gromadzenie Danych apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 629 + 748 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6420,7 +6492,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 449 @@ -6440,7 +6512,7 @@ libs/common/src/lib/routes/routes.ts - 260 + 255 @@ -6452,7 +6524,7 @@ libs/common/src/lib/routes/routes.ts - 268 + 263 @@ -6461,11 +6533,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 263 + 258 libs/common/src/lib/routes/routes.ts - 266 + 261 @@ -6473,7 +6545,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 244 @@ -6511,9 +6583,13 @@ Activity Aktywność + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 101 + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 231 + 232 @@ -6521,7 +6597,7 @@ Dochód z Dywidendy apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 198 + 199 @@ -6577,7 +6653,7 @@ Usuń aktywności libs/ui/src/lib/activities-table/activities-table.component.html - 92 + 105 @@ -6585,7 +6661,7 @@ Internacjonalizacja libs/common/src/lib/routes/routes.ts - 119 + 114 @@ -6593,7 +6669,7 @@ Czy na pewno chcesz zamknąć swoje konto Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 229 + 244 @@ -6601,7 +6677,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 450 @@ -6649,7 +6725,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 134 + 129 @@ -6657,7 +6733,7 @@ Uwzględnij w apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 399 + 400 @@ -6665,7 +6741,7 @@ Ups! Wystąpił błąd podczas konfigurowania uwierzytelniania biometrycznego. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 352 + 363 @@ -6681,7 +6757,7 @@ Punkty Odniesienia apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 128 @@ -6729,7 +6805,7 @@ Budżetowanie libs/ui/src/lib/i18n.ts - 104 + 105 @@ -6797,7 +6873,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 51 + 55 @@ -6805,7 +6881,7 @@ Biuro Rodzinne libs/ui/src/lib/i18n.ts - 107 + 108 @@ -6885,7 +6961,7 @@ Zarządzanie Majątkiem libs/ui/src/lib/i18n.ts - 113 + 114 @@ -6893,7 +6969,7 @@ Podgląd inwestycji libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 487 @@ -6901,7 +6977,7 @@ Do you really want to delete these asset profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 67 + 72 @@ -6909,7 +6985,7 @@ Błąd apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 757 + 841 @@ -6949,11 +7025,11 @@ Anuluj apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 162 + 163 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 753 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6977,7 +7053,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 112 + 107 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7005,7 +7081,7 @@ Zamknij apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 636 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7037,11 +7113,11 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 244 + 252 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 114 + 109 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7057,7 +7133,7 @@ Rola apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 44 + 45 @@ -7081,7 +7157,7 @@ Tax Reporting libs/ui/src/lib/i18n.ts - 112 + 113 @@ -7097,7 +7173,7 @@ Zmiana z efektem walutowym Zmiana apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 63 + 64 @@ -7113,7 +7189,7 @@ Wydajność z efektem walutowym Wydajność apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 83 + 84 @@ -7161,7 +7237,7 @@ has been copied to the clipboard apps/client/src/app/components/admin-overview/admin-overview.component.ts - 223 + 228 libs/ui/src/lib/value/value.component.ts @@ -7229,7 +7305,7 @@ Financial Services libs/ui/src/lib/i18n.ts - 95 + 96 @@ -7259,6 +7335,10 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 270 + + libs/ui/src/lib/activities-table/activities-table.component.html + 101 + cannot be self-hosted @@ -7284,6 +7364,14 @@ 278 + + Shares Before + Shares Before + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 597 + + cannot be used anonymously nie może być używana anonimowo @@ -7313,7 +7401,7 @@ Dividend Tracking libs/ui/src/lib/i18n.ts - 105 + 106 @@ -7357,7 +7445,7 @@ Skonfiguruj klucz API apps/client/src/app/components/admin-settings/admin-settings.component.html - 188 + 197 @@ -7373,7 +7461,7 @@ Investment Research libs/ui/src/lib/i18n.ts - 109 + 110 @@ -7397,7 +7485,7 @@ libs/common/src/lib/routes/routes.ts - 313 + 308 @@ -7413,7 +7501,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 316 @@ -7422,11 +7510,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 316 + 311 libs/common/src/lib/routes/routes.ts - 319 + 314 @@ -7435,11 +7523,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 308 + 303 libs/common/src/lib/routes/routes.ts - 311 + 306 @@ -7463,7 +7551,7 @@ z apps/client/src/app/components/admin-settings/admin-settings.component.html - 152 + 157 @@ -7471,7 +7559,7 @@ codzienne żądania apps/client/src/app/components/admin-settings/admin-settings.component.html - 154 + 159 @@ -7479,7 +7567,7 @@ Usuń klucz API apps/client/src/app/components/admin-settings/admin-settings.component.html - 178 + 187 @@ -7487,7 +7575,7 @@ Czy na pewno chcesz usunąć klucz API?? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 143 + 144 @@ -7507,7 +7595,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 141 @@ -7579,7 +7667,7 @@ Zapisz apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 645 + 764 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7599,7 +7687,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 133 + 143 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7611,7 +7699,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 123 + 118 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7655,7 +7743,7 @@ Net Worth Tracking libs/ui/src/lib/i18n.ts - 110 + 111 @@ -7663,7 +7751,7 @@ Wprowadź swój klucz API Ghostfolio. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 162 + 163 @@ -7695,7 +7783,7 @@ Leniwy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7703,7 +7791,7 @@ Natychmiastowy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7711,7 +7799,7 @@ Domyślna cena rynkowa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 638 @@ -7719,7 +7807,7 @@ Tryb apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 556 + 675 @@ -7727,7 +7815,7 @@ Do you really want to convert the data source to ? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 485 + 525 @@ -7735,7 +7823,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 572 + 691 @@ -7743,7 +7831,7 @@ Nagłówki żądań HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 651 @@ -7751,7 +7839,7 @@ koniec dnia apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7759,7 +7847,7 @@ w czasie rzeczywistym apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7775,7 +7863,7 @@ Stwórz libs/ui/src/lib/tags-selector/tags-selector.component.html - 64 + 62 @@ -7940,11 +8028,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 232 + 227 libs/common/src/lib/routes/routes.ts - 235 + 230 @@ -7956,7 +8044,7 @@ libs/common/src/lib/routes/routes.ts - 237 + 232 @@ -7972,7 +8060,7 @@ () jest już w użyciu. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 718 + 801 @@ -7980,7 +8068,7 @@ Wystąpił błąd podczas aktualizacji do (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 721 + 804 @@ -7988,7 +8076,7 @@ Zatwierdź apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 155 @@ -8068,7 +8156,7 @@ libs/common/src/lib/routes/routes.ts - 110 + 105 @@ -8079,6 +8167,18 @@ 142 + + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 102 + + Log out Wyloguj się @@ -8090,13 +8190,9 @@ Calculations are based on delayed market data and may not be displayed in real-time. Obliczenia opierają się na opóźnionych danych rynkowych i mogą nie być wyświetlane w czasie rzeczywistym. - - apps/client/src/app/components/home-market/home-market.html - 28 - apps/client/src/app/components/markets/markets.html - 54 + 64 @@ -8105,11 +8201,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 200 + 195 libs/common/src/lib/routes/routes.ts - 203 + 198 @@ -8117,7 +8213,7 @@ ETF Tracking libs/ui/src/lib/i18n.ts - 106 + 107 @@ -8125,7 +8221,7 @@ Konto użytkownika demonstracyjnego zostało zsynchronizowane. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 323 + 334 @@ -8133,7 +8229,7 @@ Synchronizuj konto użytkownika demonstracyjnego apps/client/src/app/components/admin-overview/admin-overview.html - 128 + 131 @@ -8205,7 +8301,7 @@ libs/common/src/lib/routes/routes.ts - 251 + 246 @@ -8213,7 +8309,7 @@ Alternatywa Open Source dla libs/common/src/lib/routes/routes.ts - 346 + 341 @@ -8246,15 +8342,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 332 + 327 libs/common/src/lib/routes/routes.ts - 335 + 330 libs/common/src/lib/routes/routes.ts - 343 + 338 @@ -8263,11 +8359,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 324 + 319 libs/common/src/lib/routes/routes.ts - 327 + 322 @@ -8347,7 +8443,7 @@ Bieżący miesiąc apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 @@ -8492,11 +8588,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 356 + 351 libs/common/src/lib/routes/routes.ts - 357 + 352 @@ -8528,7 +8624,7 @@ Akcje apps/client/src/app/components/markets/markets.component.ts - 51 + 54 apps/client/src/app/pages/features/features-page.html @@ -8540,7 +8636,7 @@ Kryptowaluty apps/client/src/app/components/markets/markets.component.ts - 52 + 55 apps/client/src/app/pages/features/features-page.html @@ -8552,7 +8648,7 @@ Zarządzaj profilem aktywów apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 479 @@ -8580,7 +8676,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 101 + 102 @@ -8984,7 +9080,7 @@ Data rejestracji apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 56 + 58 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 74434fb9f..c697ed603 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -50,7 +50,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 166 + 174 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -58,11 +58,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 5 + 7 libs/ui/src/lib/activities-table/activities-table.component.html - 183 + 197 @@ -102,7 +102,7 @@ Plataforma apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 113 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -122,7 +122,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 332 + 333 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -158,7 +158,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 161 + 175 libs/ui/src/lib/benchmark/benchmark.component.html @@ -198,11 +198,11 @@ Moeda apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 216 + 217 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 339 + 340 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -222,7 +222,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 303 + 317 @@ -230,7 +230,7 @@ Saldo disponível em dinheiro apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 43 + 55 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -274,11 +274,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 284 + 298 libs/ui/src/lib/activities-table/activities-table.component.html - 320 + 334 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -318,7 +318,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 483 + 497 @@ -334,7 +334,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 235 + 238 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -344,6 +344,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 100 + + apps/client/src/app/components/admin-users/admin-users.html + 254 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 27 @@ -358,7 +362,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 513 + 527 libs/ui/src/lib/benchmark/benchmark.component.html @@ -378,7 +382,7 @@ Paid apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 129 + 136 @@ -394,7 +398,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 198 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -405,6 +409,14 @@ 20 + + Unknown + Unknown + + libs/ui/src/lib/i18n.ts + 88 + + Attempts Tentativas @@ -462,7 +474,7 @@ Perfil de Ativos apps/client/src/app/components/admin-settings/admin-settings.component.html - 123 + 128 libs/ui/src/lib/assistant/assistant.html @@ -478,7 +490,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 486 + 487 @@ -489,6 +501,14 @@ 208 + + Splits + Splits + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 512 + + View Stacktrace Ver Stacktrace @@ -518,12 +538,20 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 447 + 448 Date Data + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 521 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 560 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 156 @@ -534,7 +562,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 206 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -558,7 +586,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 113 + 114 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -570,7 +598,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 365 + 377 @@ -582,11 +610,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 235 + 236 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 221 + 222 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -634,7 +662,7 @@ Subscription History apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 141 + 149 @@ -654,7 +682,7 @@ Deseja realmente eliminar este cupão? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 242 + 247 @@ -662,7 +690,7 @@ Deseja realmente limpar a cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 279 + 290 @@ -670,7 +698,7 @@ Por favor, defina a sua mensagem do sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 299 + 310 @@ -678,7 +706,7 @@ por Utilizador apps/client/src/app/components/admin-overview/admin-overview.component.ts - 178 + 181 @@ -694,7 +722,7 @@ Mensagem de Sistema apps/client/src/app/components/admin-overview/admin-overview.html - 88 + 89 @@ -702,7 +730,7 @@ Definir Mensagem apps/client/src/app/components/admin-overview/admin-overview.html - 110 + 113 @@ -710,7 +738,7 @@ Modo Somente Leitura apps/client/src/app/components/admin-overview/admin-overview.html - 64 + 63 @@ -718,15 +746,19 @@ Cupões apps/client/src/app/components/admin-overview/admin-overview.html - 148 + 151 Add Adicionar + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 615 + apps/client/src/app/components/admin-overview/admin-overview.html - 298 + 301 libs/ui/src/lib/account-balances/account-balances.component.html @@ -738,7 +770,7 @@ Manutenção apps/client/src/app/components/admin-overview/admin-overview.html - 117 + 120 @@ -746,7 +778,7 @@ Limpar Cache apps/client/src/app/components/admin-overview/admin-overview.html - 133 + 136 @@ -790,7 +822,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 124 + 132 @@ -806,11 +838,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 641 + 724 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 644 + 727 @@ -826,7 +858,7 @@ Portefólio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 139 + 140 apps/client/src/app/components/header/header.component.html @@ -842,7 +874,7 @@ libs/common/src/lib/routes/routes.ts - 172 + 167 @@ -850,19 +882,19 @@ Referência apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 401 + 402 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 151 + 152 Current Market Mood Tom do Mercado Atual - apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html - 12 + libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html + 23 @@ -910,7 +942,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 215 + 230 @@ -921,12 +953,20 @@ 64 + + Split Ratio + Split Ratio + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 526 + + Fear Medo apps/client/src/app/components/markets/markets.component.ts - 46 + 58 libs/ui/src/lib/i18n.ts @@ -938,7 +978,7 @@ Ganância apps/client/src/app/components/markets/markets.component.ts - 47 + 59 libs/ui/src/lib/i18n.ts @@ -950,7 +990,7 @@ Últimos Dias apps/client/src/app/components/markets/markets.html - 17 + 24 @@ -966,7 +1006,7 @@ Valor Total apps/client/src/app/components/investment-chart/investment-chart.component.ts - 143 + 144 @@ -974,7 +1014,7 @@ Code apps/client/src/app/components/admin-overview/admin-overview.html - 159 + 162 @@ -982,7 +1022,7 @@ Taxa de Poupança apps/client/src/app/components/investment-chart/investment-chart.component.ts - 201 + 193 @@ -1018,7 +1058,7 @@ ou apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 167 + 168 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -1066,7 +1106,7 @@ Energy libs/ui/src/lib/i18n.ts - 94 + 95 @@ -1130,7 +1170,7 @@ Poder de Compra apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 196 + 256 @@ -1138,7 +1178,7 @@ Excluído da Análise apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 270 + 286 @@ -1146,7 +1186,7 @@ Valor Líquido apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 320 + 337 @@ -1154,7 +1194,7 @@ Desempenho Anual apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 334 + 351 @@ -1162,7 +1202,7 @@ Por favor, insira o valor do seu fundo de emergência: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 135 + 145 @@ -1170,7 +1210,7 @@ Preço Mínimo apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 131 + 132 @@ -1178,7 +1218,7 @@ Preço Máximo apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 149 + 150 @@ -1186,7 +1226,7 @@ Quantidade apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 159 + 160 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -1194,7 +1234,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 227 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1214,11 +1254,11 @@ Setor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 280 + 281 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 270 + 271 @@ -1226,7 +1266,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 296 apps/client/src/app/components/admin-users/admin-users.html @@ -1234,11 +1274,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 284 + 285 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 88 + 96 @@ -1246,15 +1286,15 @@ Setores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 301 + 302 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 421 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 290 + 291 apps/client/src/app/pages/public/public-page.html @@ -1266,15 +1306,15 @@ Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 312 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 431 + 432 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 302 + 303 @@ -1282,7 +1322,7 @@ Marcadores apps/client/src/app/components/admin-settings/admin-settings.component.html - 218 + 227 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1290,7 +1330,7 @@ libs/ui/src/lib/tags-selector/tags-selector.component.html - 25 + 23 @@ -1298,7 +1338,7 @@ Dados do Relatório com Problema apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 462 + 464 @@ -1346,7 +1386,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 366 @@ -1354,11 +1394,11 @@ AATD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -1366,11 +1406,11 @@ 1A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -1386,11 +1426,11 @@ 5A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -1406,11 +1446,11 @@ Máx apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 244 + 276 libs/ui/src/lib/assistant/assistant.component.ts - 415 + 416 @@ -1482,7 +1522,7 @@ libs/common/src/lib/routes/routes.ts - 240 + 235 @@ -1498,7 +1538,7 @@ libs/common/src/lib/routes/routes.ts - 229 + 224 @@ -1518,7 +1558,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 74 + 77 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1530,7 +1570,7 @@ Por favor, insira o seu código de cupão: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 214 + 203 @@ -1538,7 +1578,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 - 178 + 181 @@ -1546,7 +1586,7 @@ Consumer Defensive libs/ui/src/lib/i18n.ts - 93 + 94 @@ -1554,15 +1594,7 @@ Código de cupão foi resgatado apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 191 - - - - Reload - Atualizar - - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 194 @@ -1570,7 +1602,7 @@ Deseja realmente remover este método de início de sessão? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 303 + 314 @@ -1606,7 +1638,7 @@ Utilities libs/ui/src/lib/i18n.ts - 101 + 102 @@ -1630,7 +1662,7 @@ Coupon apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 134 + 141 @@ -1658,7 +1690,7 @@ Localidade apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 666 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1822,11 +1854,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 384 + 396 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 101 + 109 apps/client/src/app/pages/accounts/accounts-page.html @@ -1862,7 +1894,7 @@ ID da Conta apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 103 + 98 @@ -1870,7 +1902,7 @@ Financial Planning libs/ui/src/lib/i18n.ts - 108 + 109 @@ -1998,7 +2030,7 @@ libs/common/src/lib/routes/routes.ts - 245 + 240 @@ -2006,7 +2038,7 @@ Como já tem sessão iniciada, não pode aceder à conta de demonstração. apps/client/src/app/pages/demo/demo-page.component.ts - 33 + 32 @@ -2022,7 +2054,7 @@ Duration apps/client/src/app/components/admin-overview/admin-overview.html - 172 + 175 @@ -2042,7 +2074,15 @@ libs/common/src/lib/routes/routes.ts - 271 + 266 + + + + Invalid API key + Invalid API key + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 112 @@ -2062,15 +2102,19 @@ libs/common/src/lib/routes/routes.ts - 276 + 271 Overview Visão geral + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 42 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 115 apps/client/src/app/components/header/header.component.html @@ -2082,7 +2126,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 47 + 48 apps/client/src/app/pages/admin/admin-page.component.ts @@ -2094,11 +2138,11 @@ libs/common/src/lib/routes/routes.ts - 113 + 108 libs/common/src/lib/routes/routes.ts - 190 + 185 @@ -2106,7 +2150,7 @@ Mercados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 403 + 404 apps/client/src/app/components/footer/footer.component.html @@ -2116,10 +2160,6 @@ apps/client/src/app/components/header/header.component.html 408 - - apps/client/src/app/components/home-market/home-market.html - 2 - apps/client/src/app/components/markets/markets.html 2 @@ -2138,15 +2178,11 @@ libs/common/src/lib/routes/routes.ts - 100 - - - libs/common/src/lib/routes/routes.ts - 281 + 276 libs/common/src/lib/routes/routes.ts - 329 + 324 @@ -2154,15 +2190,15 @@ Atividades apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 84 + 103 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 111 + 138 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 244 + 245 apps/client/src/app/components/admin-overview/admin-overview.html @@ -2178,15 +2214,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 233 + 234 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 350 + 362 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 110 + 118 apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -2194,7 +2230,7 @@ libs/common/src/lib/routes/routes.ts - 149 + 144 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2214,7 +2250,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 @@ -2246,7 +2282,7 @@ Nome, símbolo or ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 133 + 134 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2266,7 +2302,7 @@ Consumer Cyclical libs/ui/src/lib/i18n.ts - 92 + 93 @@ -2278,7 +2314,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 237 + 251 @@ -2286,7 +2322,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 455 + 456 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2302,7 +2338,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 370 + 384 @@ -2354,7 +2390,7 @@ Price apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 176 + 184 @@ -2362,7 +2398,7 @@ Do you really want to convert this asset profile to ()? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 723 + 806 @@ -2378,7 +2414,7 @@ libs/common/src/lib/routes/routes.ts - 154 + 149 @@ -2462,16 +2498,12 @@ Trial apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 133 + 140 Exclude from Analysis Excluir da Análise - - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 97 - libs/ui/src/lib/i18n.ts 22 @@ -2530,7 +2562,7 @@ libs/common/src/lib/routes/routes.ts - 159 + 154 @@ -2594,7 +2626,7 @@ Posições apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 100 + 127 apps/client/src/app/components/home-holdings/home-holdings.html @@ -2602,7 +2634,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 168 apps/client/src/app/pages/public/public-page.html @@ -2614,7 +2646,7 @@ libs/common/src/lib/routes/routes.ts - 187 + 182 libs/ui/src/lib/assistant/assistant.html @@ -2650,7 +2682,7 @@ libs/common/src/lib/routes/routes.ts - 291 + 286 @@ -2722,11 +2754,11 @@ Creation apps/client/src/app/components/admin-overview/admin-overview.html - 185 + 188 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 150 + 158 @@ -2738,7 +2770,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 296 @@ -2802,7 +2834,7 @@ libs/common/src/lib/routes/routes.ts - 352 + 347 @@ -2834,7 +2866,7 @@ Rascunho libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 181 @@ -2846,11 +2878,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 30 libs/ui/src/lib/activities-table/activities-table.component.html - 406 + 420 @@ -2858,11 +2890,11 @@ Exportar Atividades libs/ui/src/lib/activities-table/activities-table.component.html - 64 + 72 libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 448 @@ -2870,11 +2902,11 @@ Exportar Rascunhos como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 77 + 86 libs/ui/src/lib/activities-table/activities-table.component.html - 447 + 461 @@ -2882,7 +2914,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 492 + 506 @@ -2890,7 +2922,7 @@ Exportar Rascunho como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 502 + 516 @@ -2898,7 +2930,11 @@ Deseja realmente eliminar esta atividade? libs/ui/src/lib/activities-table/activities-table.component.ts - 327 + 333 + + + libs/ui/src/lib/activities-table/activities-table.component.ts + 344 @@ -2954,11 +2990,11 @@ Juros apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 67 + 79 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 406 + 424 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2986,7 +3022,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 335 + 349 libs/ui/src/lib/i18n.ts @@ -3006,15 +3042,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 254 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 349 + 350 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 244 + 245 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -3034,15 +3070,15 @@ Fundo de Emergência apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 254 + 270 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 356 + 373 apps/client/src/app/pages/features/features-page.html @@ -3062,7 +3098,7 @@ libs/ui/src/lib/i18n.ts - 98 + 99 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -3082,7 +3118,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 186 + 187 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3090,13 +3126,21 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 322 + 323 libs/ui/src/lib/i18n.ts 35 + + Export + Export + + libs/ui/src/lib/activities-table/activities-table.component.html + 68 + + Tag Marcador @@ -3114,7 +3158,7 @@ Dinheiro apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 168 + 227 libs/ui/src/lib/i18n.ts @@ -3134,7 +3178,7 @@ Ações apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 55 + 67 libs/ui/src/lib/i18n.ts @@ -3158,7 +3202,7 @@ libs/ui/src/lib/i18n.ts - 99 + 100 @@ -3166,7 +3210,7 @@ Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 65 + 67 @@ -3246,7 +3290,7 @@ Communication Services libs/ui/src/lib/i18n.ts - 91 + 92 @@ -3281,6 +3325,22 @@ 79 + + Invested Capital + Invested Capital + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 174 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 85 + + South America América do Sul @@ -3330,7 +3390,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 467 + 468 @@ -3354,7 +3414,7 @@ Mapeamento de Símbolo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 410 @@ -3370,7 +3430,7 @@ Dados de Mercado apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 406 + 418 libs/common/src/lib/routes/routes.ts @@ -3394,7 +3454,7 @@ libs/common/src/lib/routes/routes.ts - 105 + 100 @@ -3434,15 +3494,15 @@ Dividendos apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 79 + 91 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 188 + 189 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 419 + 437 apps/client/src/app/pages/features/features-page.html @@ -3478,15 +3538,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 262 + 263 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 365 + 366 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 253 + 254 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -3534,11 +3594,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 52 + 54 libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 434 @@ -3590,7 +3650,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 148 @@ -3633,6 +3693,14 @@ 221 + + Investments + Investments + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 197 + + Sneak peek at upcoming functionality Acesso antecipado a funcionalidades futuras @@ -3774,7 +3842,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 248 @@ -3866,7 +3934,7 @@ Expiration apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 209 + 217 @@ -3882,11 +3950,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 758 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 678 + 761 @@ -3902,7 +3970,7 @@ Taxas apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -4057,22 +4125,6 @@ 228 - - Delete User - Apagar Utilizador - - apps/client/src/app/components/admin-users/admin-users.html - 254 - - - - Do you really want to delete these activities? - Deseja mesmo eliminar estas atividades? - - libs/ui/src/lib/activities-table/activities-table.component.ts - 317 - - By ETF Provider Por Prestador de ETF @@ -4102,7 +4154,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 @@ -4113,16 +4165,24 @@ 10 + + Cache has been flushed. + Cache has been flushed. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 281 + + Url Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 443 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 707 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4138,7 +4198,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 665 + 748 @@ -4154,7 +4214,7 @@ Plataformas apps/client/src/app/components/admin-settings/admin-settings.component.html - 212 + 221 @@ -4261,6 +4321,14 @@ 118 + + Shares After + Shares After + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 584 + + Frequently Asked Questions (FAQ) Perguntas Frequentes (FAQ) @@ -4342,7 +4410,7 @@ Responsabilidades apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 298 + 315 apps/client/src/app/pages/features/features-page.html @@ -4362,7 +4430,7 @@ libs/common/src/lib/routes/routes.ts - 205 + 200 @@ -4378,7 +4446,7 @@ libs/common/src/lib/routes/routes.ts - 213 + 208 @@ -4498,7 +4566,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 146 + 141 @@ -4506,7 +4574,7 @@ Technology libs/ui/src/lib/i18n.ts - 100 + 101 @@ -4522,7 +4590,7 @@ Total apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 160 + 168 @@ -4530,7 +4598,7 @@ Configuração do raspador apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 509 + 628 @@ -4550,7 +4618,7 @@ libs/common/src/lib/routes/routes.ts - 349 + 344 @@ -4598,7 +4666,7 @@ Coupon has been created apps/client/src/app/components/admin-overview/admin-overview.component.ts - 224 + 229 @@ -4726,7 +4794,7 @@ Web libs/ui/src/lib/i18n.ts - 120 + 121 @@ -4806,7 +4874,7 @@ ETFs sem países apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 138 @@ -4814,7 +4882,7 @@ ETFs sem setores apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 143 @@ -4822,7 +4890,7 @@ An error occurred while converting the data source to . apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 482 + 522 @@ -5042,7 +5110,7 @@ Moedas apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 133 apps/client/src/app/pages/public/public-page.html @@ -5094,11 +5162,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 589 + 672 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 592 + 675 @@ -5194,7 +5262,7 @@ Basic Materials libs/ui/src/lib/i18n.ts - 90 + 91 @@ -5221,6 +5289,14 @@ 84 + + Do you really want to delete these activities? + Do you really want to delete these activities? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 334 + + Why Ghostfolio? Por que Ghostfolio? @@ -5322,7 +5398,7 @@ Oops! Could not delete the asset profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 52 + 56 @@ -5378,7 +5454,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 139 + 134 @@ -5427,19 +5503,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 249 libs/common/src/lib/routes/routes.ts - 255 + 250 libs/common/src/lib/routes/routes.ts - 259 + 254 libs/common/src/lib/routes/routes.ts - 265 + 260 @@ -5448,11 +5524,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 274 + 269 libs/common/src/lib/routes/routes.ts - 275 + 270 @@ -5461,31 +5537,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 196 + 191 libs/common/src/lib/routes/routes.ts - 197 + 192 libs/common/src/lib/routes/routes.ts - 202 + 197 libs/common/src/lib/routes/routes.ts - 210 + 205 libs/common/src/lib/routes/routes.ts - 218 + 213 libs/common/src/lib/routes/routes.ts - 226 + 221 libs/common/src/lib/routes/routes.ts - 234 + 229 @@ -5494,11 +5570,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 224 + 219 libs/common/src/lib/routes/routes.ts - 227 + 222 @@ -5507,11 +5583,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 208 + 203 libs/common/src/lib/routes/routes.ts - 211 + 206 @@ -5520,11 +5596,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 279 + 274 libs/common/src/lib/routes/routes.ts - 280 + 275 @@ -5533,11 +5609,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 289 + 284 libs/common/src/lib/routes/routes.ts - 290 + 285 @@ -5546,11 +5622,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 299 + 294 libs/common/src/lib/routes/routes.ts - 300 + 295 @@ -5559,31 +5635,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 299 libs/common/src/lib/routes/routes.ts - 305 + 300 libs/common/src/lib/routes/routes.ts - 310 + 305 libs/common/src/lib/routes/routes.ts - 318 + 313 libs/common/src/lib/routes/routes.ts - 326 + 321 libs/common/src/lib/routes/routes.ts - 334 + 329 libs/common/src/lib/routes/routes.ts - 342 + 337 @@ -5648,11 +5724,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 340 + 335 libs/common/src/lib/routes/routes.ts - 344 + 339 @@ -5660,7 +5736,7 @@ Stock Tracking libs/ui/src/lib/i18n.ts - 111 + 112 @@ -5679,6 +5755,14 @@ 369 + + Data gathering has been started. + Data gathering has been started. + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 413 + + Global Global @@ -5720,7 +5804,7 @@ Convert to apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 174 + 175 @@ -5792,7 +5876,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 275 libs/ui/src/lib/i18n.ts @@ -5888,7 +5972,7 @@ Associação apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 78 + 82 libs/common/src/lib/routes/routes.ts @@ -5928,11 +6012,11 @@ Você realmente deseja excluir este perfil de ativo? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 28 + 29 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 66 + 71 @@ -5948,7 +6032,7 @@ Industrials libs/ui/src/lib/i18n.ts - 97 + 98 @@ -6004,7 +6088,7 @@ Ops, a transferência do saldo em dinheiro falhou. apps/client/src/app/pages/accounts/accounts-page.component.ts - 358 + 355 @@ -6044,7 +6128,7 @@ Healthcare libs/ui/src/lib/i18n.ts - 96 + 97 @@ -6052,7 +6136,7 @@ Você realmente deseja excluir esta mensagem do sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 255 + 260 @@ -6084,7 +6168,7 @@ Saldos de caixa apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 143 + 170 @@ -6120,7 +6204,7 @@ O preço de mercado atual é apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 766 + 850 @@ -6128,7 +6212,7 @@ Teste apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 606 + 725 @@ -6202,18 +6286,6 @@ Investment Investimento - - apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 173 - - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 60 - - - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 85 - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 101 @@ -6236,7 +6308,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 449 + 451 @@ -6276,7 +6348,7 @@ Semana até agora libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6284,11 +6356,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6296,7 +6368,7 @@ Do mês até a data libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6304,11 +6376,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6324,7 +6396,7 @@ No acumulado do ano libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -6368,7 +6440,7 @@ ano apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6380,7 +6452,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -6388,11 +6460,11 @@ anos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -6408,7 +6480,7 @@ Coleta de dados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 629 + 748 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6420,7 +6492,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 449 @@ -6440,7 +6512,7 @@ libs/common/src/lib/routes/routes.ts - 260 + 255 @@ -6452,7 +6524,7 @@ libs/common/src/lib/routes/routes.ts - 268 + 263 @@ -6461,11 +6533,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 263 + 258 libs/common/src/lib/routes/routes.ts - 266 + 261 @@ -6473,7 +6545,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 244 @@ -6511,9 +6583,13 @@ Activity Atividade + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 101 + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 231 + 232 @@ -6521,7 +6597,7 @@ Rendimento de dividendos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 198 + 199 @@ -6577,7 +6653,7 @@ Excluir atividades libs/ui/src/lib/activities-table/activities-table.component.html - 92 + 105 @@ -6585,7 +6661,7 @@ Internacionalização libs/common/src/lib/routes/routes.ts - 119 + 114 @@ -6593,7 +6669,7 @@ Você realmente deseja encerrar sua conta Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 229 + 244 @@ -6601,7 +6677,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 450 @@ -6649,7 +6725,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 134 + 129 @@ -6657,7 +6733,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 399 + 400 @@ -6665,7 +6741,7 @@ Ops! Ocorreu um erro ao configurar a autenticação biométrica. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 352 + 363 @@ -6681,7 +6757,7 @@ Referências apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 128 @@ -6729,7 +6805,7 @@ Orçamento libs/ui/src/lib/i18n.ts - 104 + 105 @@ -6797,7 +6873,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 51 + 55 @@ -6805,7 +6881,7 @@ Escritório Familiar libs/ui/src/lib/i18n.ts - 107 + 108 @@ -6885,7 +6961,7 @@ Gestão de patrimônio libs/ui/src/lib/i18n.ts - 113 + 114 @@ -6893,7 +6969,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 487 @@ -6901,7 +6977,7 @@ Do you really want to delete these asset profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 67 + 72 @@ -6909,7 +6985,7 @@ Erro apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 757 + 841 @@ -6949,11 +7025,11 @@ Cancelar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 162 + 163 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 753 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6977,7 +7053,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 112 + 107 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7005,7 +7081,7 @@ Fechar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 636 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7037,11 +7113,11 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 244 + 252 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 114 + 109 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7057,7 +7133,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 44 + 45 @@ -7081,7 +7157,7 @@ Tax Reporting libs/ui/src/lib/i18n.ts - 112 + 113 @@ -7097,7 +7173,7 @@ Change with currency effect Change apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 63 + 64 @@ -7113,7 +7189,7 @@ Performance with currency effect Performance apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 83 + 84 @@ -7161,7 +7237,7 @@ has been copied to the clipboard apps/client/src/app/components/admin-overview/admin-overview.component.ts - 223 + 228 libs/ui/src/lib/value/value.component.ts @@ -7229,7 +7305,7 @@ Financial Services libs/ui/src/lib/i18n.ts - 95 + 96 @@ -7259,6 +7335,10 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 270 + + libs/ui/src/lib/activities-table/activities-table.component.html + 101 + cannot be self-hosted @@ -7284,6 +7364,14 @@ 278 + + Shares Before + Shares Before + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 597 + + cannot be used anonymously não pode ser usado anonimamente @@ -7313,7 +7401,7 @@ Dividend Tracking libs/ui/src/lib/i18n.ts - 105 + 106 @@ -7357,7 +7445,7 @@ Definir chave de API apps/client/src/app/components/admin-settings/admin-settings.component.html - 188 + 197 @@ -7373,7 +7461,7 @@ Investment Research libs/ui/src/lib/i18n.ts - 109 + 110 @@ -7397,7 +7485,7 @@ libs/common/src/lib/routes/routes.ts - 313 + 308 @@ -7413,7 +7501,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 316 @@ -7422,11 +7510,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 316 + 311 libs/common/src/lib/routes/routes.ts - 319 + 314 @@ -7435,11 +7523,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 308 + 303 libs/common/src/lib/routes/routes.ts - 311 + 306 @@ -7463,7 +7551,7 @@ de apps/client/src/app/components/admin-settings/admin-settings.component.html - 152 + 157 @@ -7471,7 +7559,7 @@ solicitações diárias apps/client/src/app/components/admin-settings/admin-settings.component.html - 154 + 159 @@ -7479,7 +7567,7 @@ Remover chave de API apps/client/src/app/components/admin-settings/admin-settings.component.html - 178 + 187 @@ -7487,7 +7575,7 @@ Você realmente deseja excluir a chave de API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 143 + 144 @@ -7507,7 +7595,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 141 @@ -7579,7 +7667,7 @@ Guardar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 645 + 764 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7599,7 +7687,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 133 + 143 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7611,7 +7699,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 123 + 118 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7655,7 +7743,7 @@ Net Worth Tracking libs/ui/src/lib/i18n.ts - 110 + 111 @@ -7663,7 +7751,7 @@ Please enter your Ghostfolio API key. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 162 + 163 @@ -7695,7 +7783,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7703,7 +7791,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7711,7 +7799,7 @@ Preço de mercado padrão apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 638 @@ -7719,7 +7807,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 556 + 675 @@ -7727,7 +7815,7 @@ Do you really want to convert the data source to ? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 485 + 525 @@ -7735,7 +7823,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 572 + 691 @@ -7743,7 +7831,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 651 @@ -7751,7 +7839,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7759,7 +7847,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7775,7 +7863,7 @@ Criar libs/ui/src/lib/tags-selector/tags-selector.component.html - 64 + 62 @@ -7940,11 +8028,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 232 + 227 libs/common/src/lib/routes/routes.ts - 235 + 230 @@ -7956,7 +8044,7 @@ libs/common/src/lib/routes/routes.ts - 237 + 232 @@ -7972,7 +8060,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 718 + 801 @@ -7980,7 +8068,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 721 + 804 @@ -7988,7 +8076,7 @@ Apply apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 155 @@ -8068,7 +8156,7 @@ libs/common/src/lib/routes/routes.ts - 110 + 105 @@ -8079,6 +8167,18 @@ 142 + + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 102 + + Log out Log out @@ -8090,13 +8190,9 @@ Calculations are based on delayed market data and may not be displayed in real-time. Calculations are based on delayed market data and may not be displayed in real-time. - - apps/client/src/app/components/home-market/home-market.html - 28 - apps/client/src/app/components/markets/markets.html - 54 + 64 @@ -8105,11 +8201,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 200 + 195 libs/common/src/lib/routes/routes.ts - 203 + 198 @@ -8117,7 +8213,7 @@ ETF Tracking libs/ui/src/lib/i18n.ts - 106 + 107 @@ -8125,7 +8221,7 @@ Demo user account has been synced. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 323 + 334 @@ -8133,7 +8229,7 @@ Sync Demo User Account apps/client/src/app/components/admin-overview/admin-overview.html - 128 + 131 @@ -8205,7 +8301,7 @@ libs/common/src/lib/routes/routes.ts - 251 + 246 @@ -8213,7 +8309,7 @@ Alternativa de software livre ao libs/common/src/lib/routes/routes.ts - 346 + 341 @@ -8246,15 +8342,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 332 + 327 libs/common/src/lib/routes/routes.ts - 335 + 330 libs/common/src/lib/routes/routes.ts - 343 + 338 @@ -8263,11 +8359,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 324 + 319 libs/common/src/lib/routes/routes.ts - 327 + 322 @@ -8347,7 +8443,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 @@ -8492,11 +8588,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 356 + 351 libs/common/src/lib/routes/routes.ts - 357 + 352 @@ -8528,7 +8624,7 @@ Stocks apps/client/src/app/components/markets/markets.component.ts - 51 + 54 apps/client/src/app/pages/features/features-page.html @@ -8540,7 +8636,7 @@ Criptomoedas apps/client/src/app/components/markets/markets.component.ts - 52 + 55 apps/client/src/app/pages/features/features-page.html @@ -8552,7 +8648,7 @@ Gerenciar perfil de ativos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 479 @@ -8580,7 +8676,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 101 + 102 @@ -8984,7 +9080,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 56 + 58 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index dedde6a2e..84863a774 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -7,31 +7,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 196 + 191 libs/common/src/lib/routes/routes.ts - 197 + 192 libs/common/src/lib/routes/routes.ts - 202 + 197 libs/common/src/lib/routes/routes.ts - 210 + 205 libs/common/src/lib/routes/routes.ts - 218 + 213 libs/common/src/lib/routes/routes.ts - 226 + 221 libs/common/src/lib/routes/routes.ts - 234 + 229 @@ -40,19 +40,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 249 libs/common/src/lib/routes/routes.ts - 255 + 250 libs/common/src/lib/routes/routes.ts - 259 + 254 libs/common/src/lib/routes/routes.ts - 265 + 260 @@ -61,11 +61,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 274 + 269 libs/common/src/lib/routes/routes.ts - 275 + 270 @@ -74,11 +74,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 208 + 203 libs/common/src/lib/routes/routes.ts - 211 + 206 @@ -87,11 +87,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 279 + 274 libs/common/src/lib/routes/routes.ts - 280 + 275 @@ -100,11 +100,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 289 + 284 libs/common/src/lib/routes/routes.ts - 290 + 285 @@ -113,11 +113,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 224 + 219 libs/common/src/lib/routes/routes.ts - 227 + 222 @@ -126,11 +126,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 299 + 294 libs/common/src/lib/routes/routes.ts - 300 + 295 @@ -139,31 +139,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 299 libs/common/src/lib/routes/routes.ts - 305 + 300 libs/common/src/lib/routes/routes.ts - 310 + 305 libs/common/src/lib/routes/routes.ts - 318 + 313 libs/common/src/lib/routes/routes.ts - 326 + 321 libs/common/src/lib/routes/routes.ts - 334 + 329 libs/common/src/lib/routes/routes.ts - 342 + 337 @@ -231,7 +231,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 166 + 174 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -239,11 +239,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 5 + 7 libs/ui/src/lib/activities-table/activities-table.component.html - 183 + 197 @@ -283,7 +283,7 @@ Nakit Bakiye apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 43 + 55 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -299,7 +299,7 @@ Platform apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 113 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -319,7 +319,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 332 + 333 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -355,7 +355,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 161 + 175 libs/ui/src/lib/benchmark/benchmark.component.html @@ -395,11 +395,11 @@ Para Birimi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 216 + 217 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 339 + 340 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -419,7 +419,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 303 + 317 @@ -455,11 +455,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 284 + 298 libs/ui/src/lib/activities-table/activities-table.component.html - 320 + 334 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -499,7 +499,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 483 + 497 @@ -515,7 +515,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 235 + 238 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -525,6 +525,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 100 + + apps/client/src/app/components/admin-users/admin-users.html + 254 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 27 @@ -539,7 +543,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 513 + 527 libs/ui/src/lib/benchmark/benchmark.component.html @@ -559,7 +563,7 @@ Paid apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 129 + 136 @@ -575,7 +579,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 198 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -586,6 +590,14 @@ 20 + + Unknown + Unknown + + libs/ui/src/lib/i18n.ts + 88 + + Attempts Deneme @@ -643,7 +655,7 @@ Varlık Profili apps/client/src/app/components/admin-settings/admin-settings.component.html - 123 + 128 libs/ui/src/lib/assistant/assistant.html @@ -659,7 +671,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 486 + 487 @@ -670,6 +682,14 @@ 208 + + Splits + Splits + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 512 + + View Stacktrace Hata İzini Görüntüle @@ -699,12 +719,20 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 447 + 448 Date Tarih + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 521 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 560 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 156 @@ -715,7 +743,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 206 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -739,7 +767,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 113 + 114 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -751,7 +779,7 @@ Para Birimleri apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 133 apps/client/src/app/pages/public/public-page.html @@ -771,7 +799,7 @@ Ülkesi Olmayan ETF’ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 138 @@ -779,7 +807,7 @@ Sektörü Olmayan ETF’ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 143 @@ -787,7 +815,7 @@ An error occurred while converting the data source to . apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 482 + 522 @@ -795,7 +823,7 @@ Filtrele... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 365 + 377 @@ -807,11 +835,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 235 + 236 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 221 + 222 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -823,7 +851,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 467 + 468 @@ -867,7 +895,7 @@ Subscription History apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 141 + 149 @@ -911,11 +939,11 @@ Sektör apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 280 + 281 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 270 + 271 @@ -923,7 +951,7 @@ Ülke apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 296 apps/client/src/app/components/admin-users/admin-users.html @@ -931,11 +959,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 284 + 285 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 88 + 96 @@ -943,15 +971,15 @@ Sektörler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 301 + 302 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 421 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 290 + 291 apps/client/src/app/pages/public/public-page.html @@ -963,15 +991,15 @@ Ülkeler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 312 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 431 + 432 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 302 + 303 @@ -979,7 +1007,7 @@ Sembol Eşleştirme apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 410 @@ -987,7 +1015,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 146 + 141 @@ -995,7 +1023,7 @@ Technology libs/ui/src/lib/i18n.ts - 100 + 101 @@ -1011,7 +1039,7 @@ Total apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 160 + 168 @@ -1019,7 +1047,7 @@ Veri Toplayıcı Yapılandırması apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 509 + 628 @@ -1027,7 +1055,7 @@ Not apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 455 + 456 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1043,7 +1071,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 370 + 384 @@ -1059,7 +1087,7 @@ Ad, sembol ya da ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 133 + 134 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1079,7 +1107,7 @@ Consumer Cyclical libs/ui/src/lib/i18n.ts - 92 + 93 @@ -1087,7 +1115,7 @@ Bu kuponu gerçekten silmek istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 242 + 247 @@ -1095,7 +1123,7 @@ Önbelleği temizlemeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 279 + 290 @@ -1103,7 +1131,7 @@ Lütfen sistem mesajınızı belirleyin: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 299 + 310 @@ -1111,7 +1139,7 @@ Kullanıcı başına apps/client/src/app/components/admin-overview/admin-overview.component.ts - 178 + 181 @@ -1127,7 +1155,7 @@ Etiketler apps/client/src/app/components/admin-settings/admin-settings.component.html - 218 + 227 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1135,7 +1163,7 @@ libs/ui/src/lib/tags-selector/tags-selector.component.html - 25 + 23 @@ -1151,7 +1179,7 @@ Salt okunur mod apps/client/src/app/components/admin-overview/admin-overview.html - 64 + 63 @@ -1159,7 +1187,7 @@ Sistem Mesajı apps/client/src/app/components/admin-overview/admin-overview.html - 88 + 89 @@ -1167,7 +1195,7 @@ Mesaj Belirle apps/client/src/app/components/admin-overview/admin-overview.html - 110 + 113 @@ -1175,15 +1203,19 @@ Kupon apps/client/src/app/components/admin-overview/admin-overview.html - 148 + 151 Add Ekle + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 615 + apps/client/src/app/components/admin-overview/admin-overview.html - 298 + 301 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1195,7 +1227,7 @@ Genel Ayarlar apps/client/src/app/components/admin-overview/admin-overview.html - 117 + 120 @@ -1203,7 +1235,7 @@ Önbelleği temizle apps/client/src/app/components/admin-overview/admin-overview.html - 133 + 136 @@ -1219,11 +1251,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 443 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 707 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1239,7 +1271,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 665 + 748 @@ -1271,7 +1303,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 @@ -1282,12 +1314,20 @@ 10 + + Cache has been flushed. + Cache has been flushed. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 281 + + Platforms Platformlar apps/client/src/app/components/admin-settings/admin-settings.component.html - 212 + 221 @@ -1331,7 +1371,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 124 + 132 @@ -1350,24 +1390,16 @@ 228 - - Delete User - Kullanıcıyı Sil - - apps/client/src/app/components/admin-users/admin-users.html - 254 - - Could not validate form Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 641 + 724 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 644 + 727 @@ -1391,7 +1423,7 @@ Portföy apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 139 + 140 apps/client/src/app/components/header/header.component.html @@ -1407,7 +1439,7 @@ libs/common/src/lib/routes/routes.ts - 172 + 167 @@ -1415,19 +1447,19 @@ Karşılaştırma Ölçütü apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 401 + 402 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 151 + 152 Current Market Mood Piyasa Psikolojisi - apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html - 12 + libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html + 23 @@ -1475,7 +1507,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 215 + 230 @@ -1486,12 +1518,20 @@ 64 + + Split Ratio + Split Ratio + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 526 + + Fear Korku apps/client/src/app/components/markets/markets.component.ts - 46 + 58 libs/ui/src/lib/i18n.ts @@ -1503,7 +1543,7 @@ Açgözlülük apps/client/src/app/components/markets/markets.component.ts - 47 + 59 libs/ui/src/lib/i18n.ts @@ -1515,7 +1555,7 @@ Son Gün apps/client/src/app/components/markets/markets.html - 17 + 24 @@ -1603,7 +1643,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 @@ -1623,7 +1663,7 @@ Toplam Tutar apps/client/src/app/components/investment-chart/investment-chart.component.ts - 143 + 144 @@ -1631,7 +1671,7 @@ Code apps/client/src/app/components/admin-overview/admin-overview.html - 159 + 162 @@ -1639,7 +1679,7 @@ Tasarruf Oranı apps/client/src/app/components/investment-chart/investment-chart.component.ts - 201 + 193 @@ -1675,7 +1715,7 @@ veya apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 167 + 168 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -1723,7 +1763,7 @@ Energy libs/ui/src/lib/i18n.ts - 94 + 95 @@ -1787,7 +1827,7 @@ Alım Limiti apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 196 + 256 @@ -1795,7 +1835,7 @@ Analize Dahil Edilmemiştir. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 270 + 286 @@ -1803,7 +1843,7 @@ Yükümlülükler apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 298 + 315 apps/client/src/app/pages/features/features-page.html @@ -1815,7 +1855,7 @@ Toplam Varlık apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 320 + 337 @@ -1823,7 +1863,7 @@ Yıllıklandırılmış Performans apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 334 + 351 @@ -1831,7 +1871,7 @@ Lütfen acil durum yedeği meblağını giriniz: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 135 + 145 @@ -1839,7 +1879,7 @@ Asgari Fiyat apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 131 + 132 @@ -1847,7 +1887,7 @@ Azami Fiyat apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 149 + 150 @@ -1855,7 +1895,7 @@ Miktar apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 159 + 160 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -1863,7 +1903,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 227 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1875,7 +1915,7 @@ Komisyon apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -1887,7 +1927,7 @@ Rapor Veri Sorunu apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 462 + 464 @@ -2067,7 +2107,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 366 @@ -2075,11 +2115,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -2087,11 +2127,11 @@ 1Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -2107,11 +2147,11 @@ 5Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -2127,11 +2167,11 @@ Maks. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 244 + 276 libs/ui/src/lib/assistant/assistant.component.ts - 415 + 416 @@ -2203,7 +2243,7 @@ libs/common/src/lib/routes/routes.ts - 240 + 235 @@ -2219,7 +2259,7 @@ libs/common/src/lib/routes/routes.ts - 205 + 200 @@ -2235,7 +2275,7 @@ libs/common/src/lib/routes/routes.ts - 213 + 208 @@ -2251,7 +2291,7 @@ libs/common/src/lib/routes/routes.ts - 229 + 224 @@ -2311,11 +2351,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 384 + 396 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 101 + 109 apps/client/src/app/pages/accounts/accounts-page.html @@ -2351,7 +2391,7 @@ Hesap Kimliği apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 103 + 98 @@ -2359,7 +2399,7 @@ Financial Planning libs/ui/src/lib/i18n.ts - 108 + 109 @@ -2383,7 +2423,7 @@ Piyasa Verileri apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 406 + 418 libs/common/src/lib/routes/routes.ts @@ -2421,9 +2461,13 @@ Overview Özet + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 42 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 115 apps/client/src/app/components/header/header.component.html @@ -2435,7 +2479,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 47 + 48 apps/client/src/app/pages/admin/admin-page.component.ts @@ -2447,11 +2491,11 @@ libs/common/src/lib/routes/routes.ts - 113 + 108 libs/common/src/lib/routes/routes.ts - 190 + 185 @@ -2563,7 +2607,7 @@ libs/common/src/lib/routes/routes.ts - 245 + 240 @@ -2571,11 +2615,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 589 + 672 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 592 + 675 @@ -2591,7 +2635,7 @@ Oturum açmış olduğunuz için demo hesabına erişemezsiniz. apps/client/src/app/pages/demo/demo-page.component.ts - 33 + 32 @@ -2607,7 +2651,7 @@ Duration apps/client/src/app/components/admin-overview/admin-overview.html - 172 + 175 @@ -2627,7 +2671,15 @@ libs/common/src/lib/routes/routes.ts - 271 + 266 + + + + Invalid API key + Invalid API key + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 112 @@ -2647,7 +2699,7 @@ libs/common/src/lib/routes/routes.ts - 276 + 271 @@ -2811,11 +2863,11 @@ Creation apps/client/src/app/components/admin-overview/admin-overview.html - 185 + 188 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 150 + 158 @@ -2823,7 +2875,7 @@ Varlıklar apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 100 + 127 apps/client/src/app/components/home-holdings/home-holdings.html @@ -2831,7 +2883,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 168 apps/client/src/app/pages/public/public-page.html @@ -2843,7 +2895,7 @@ libs/common/src/lib/routes/routes.ts - 187 + 182 libs/ui/src/lib/assistant/assistant.html @@ -2867,7 +2919,7 @@ libs/common/src/lib/routes/routes.ts - 105 + 100 @@ -2875,7 +2927,7 @@ Piyasalar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 403 + 404 apps/client/src/app/components/footer/footer.component.html @@ -2885,10 +2937,6 @@ apps/client/src/app/components/header/header.component.html 408 - - apps/client/src/app/components/home-market/home-market.html - 2 - apps/client/src/app/components/markets/markets.html 2 @@ -2907,15 +2955,11 @@ libs/common/src/lib/routes/routes.ts - 100 - - - libs/common/src/lib/routes/routes.ts - 281 + 276 libs/common/src/lib/routes/routes.ts - 329 + 324 @@ -3027,7 +3071,7 @@ Basic Materials libs/ui/src/lib/i18n.ts - 90 + 91 @@ -3054,6 +3098,14 @@ 84 + + Do you really want to delete these activities? + Do you really want to delete these activities? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 334 + + Why Ghostfolio? Neden Ghostfolio? @@ -3155,7 +3207,7 @@ Oops! Could not delete the asset profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 52 + 56 @@ -3227,7 +3279,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 139 + 134 @@ -3311,15 +3363,15 @@ İşlemler apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 84 + 103 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 111 + 138 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 244 + 245 apps/client/src/app/components/admin-overview/admin-overview.html @@ -3335,15 +3387,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 233 + 234 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 350 + 362 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 110 + 118 apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -3351,21 +3403,13 @@ libs/common/src/lib/routes/routes.ts - 149 + 144 libs/ui/src/lib/accounts-table/accounts-table.component.html 126 - - Do you really want to delete these activities? - Tüm işlemlerinizi silmeyi gerçekten istiyor musunuz? - - libs/ui/src/lib/activities-table/activities-table.component.ts - 317 - - Update activity İşlemi Güncelle @@ -3419,7 +3463,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 237 + 251 @@ -3431,11 +3475,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 30 libs/ui/src/lib/activities-table/activities-table.component.html - 406 + 420 @@ -3447,11 +3491,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 52 + 54 libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 434 @@ -3546,6 +3590,14 @@ 118 + + Shares After + Shares After + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 584 + + Back Geri @@ -3563,7 +3615,7 @@ Price apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 176 + 184 @@ -3571,7 +3623,7 @@ Do you really want to convert this asset profile to ()? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 723 + 806 @@ -3603,7 +3655,7 @@ libs/common/src/lib/routes/routes.ts - 154 + 149 @@ -3687,16 +3739,12 @@ Trial apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 133 + 140 Exclude from Analysis Exclude from Analysis - - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 97 - libs/ui/src/lib/i18n.ts 22 @@ -3779,7 +3827,7 @@ libs/common/src/lib/routes/routes.ts - 159 + 154 @@ -3795,15 +3843,15 @@ Temettü apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 79 + 91 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 188 + 189 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 419 + 437 apps/client/src/app/pages/features/features-page.html @@ -3947,7 +3995,7 @@ libs/common/src/lib/routes/routes.ts - 291 + 286 @@ -3987,7 +4035,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 248 @@ -4099,7 +4147,7 @@ Expiration apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 209 + 217 @@ -4139,11 +4187,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 758 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 678 + 761 @@ -4195,7 +4243,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 296 @@ -4247,7 +4295,7 @@ libs/common/src/lib/routes/routes.ts - 349 + 344 @@ -4256,11 +4304,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 340 + 335 libs/common/src/lib/routes/routes.ts - 344 + 339 @@ -4364,7 +4412,7 @@ Coupon has been created apps/client/src/app/components/admin-overview/admin-overview.component.ts - 224 + 229 @@ -4492,7 +4540,7 @@ Stock Tracking libs/ui/src/lib/i18n.ts - 111 + 112 @@ -4516,7 +4564,7 @@ Web libs/ui/src/lib/i18n.ts - 120 + 121 @@ -4527,6 +4575,14 @@ 373 + + Data gathering has been started. + Data gathering has been started. + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 413 + + Global Küresel @@ -4560,7 +4616,7 @@ libs/common/src/lib/routes/routes.ts - 352 + 347 @@ -4608,7 +4664,7 @@ Otomatik apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 74 + 77 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -4620,7 +4676,7 @@ Lütfen kupon kodunuzu girin: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 214 + 203 @@ -4628,7 +4684,7 @@ Kupon kodu kullanılamadı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 178 + 181 @@ -4636,7 +4692,7 @@ Consumer Defensive libs/ui/src/lib/i18n.ts - 93 + 94 @@ -4644,15 +4700,7 @@ Kupon kodu kullanıldı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 191 - - - - Reload - Yeniden Yükle - - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 194 @@ -4660,7 +4708,7 @@ Bu giriş yöntemini kaldırmayı gerçekten istiyor musunuz? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 303 + 314 @@ -4708,7 +4756,7 @@ Utilities libs/ui/src/lib/i18n.ts - 101 + 102 @@ -4740,7 +4788,7 @@ Coupon apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 134 + 141 @@ -4756,7 +4804,7 @@ Yerel Ayarlar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 666 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -4823,6 +4871,14 @@ 221 + + Investments + Investments + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 197 + + Biometric Authentication Biyometrik Kimlik Doğrulama @@ -4916,11 +4972,11 @@ İşlemleri Dışa Aktar libs/ui/src/lib/activities-table/activities-table.component.html - 64 + 72 libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 448 @@ -4928,11 +4984,11 @@ Taslakları ICS Olarak Dışa Aktar libs/ui/src/lib/activities-table/activities-table.component.html - 77 + 86 libs/ui/src/lib/activities-table/activities-table.component.html - 447 + 461 @@ -4940,7 +4996,7 @@ Taslak libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 181 @@ -4948,7 +5004,7 @@ Klonla libs/ui/src/lib/activities-table/activities-table.component.html - 492 + 506 @@ -4956,7 +5012,7 @@ Taslakları ICS Olarak Dışa Aktar libs/ui/src/lib/activities-table/activities-table.component.html - 502 + 516 @@ -4964,7 +5020,11 @@ TBu işlemi silmeyi gerçekten istiyor musunuz? libs/ui/src/lib/activities-table/activities-table.component.ts - 327 + 333 + + + libs/ui/src/lib/activities-table/activities-table.component.ts + 344 @@ -5052,11 +5112,11 @@ Faiz apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 67 + 79 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 406 + 424 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5120,7 +5180,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 335 + 349 libs/ui/src/lib/i18n.ts @@ -5148,15 +5208,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 254 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 349 + 350 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 244 + 245 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -5180,15 +5240,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 262 + 263 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 365 + 366 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 253 + 254 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -5228,15 +5288,15 @@ Acil Durum Fonu apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 254 + 270 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 356 + 373 apps/client/src/app/pages/features/features-page.html @@ -5304,7 +5364,7 @@ libs/ui/src/lib/i18n.ts - 98 + 99 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -5332,7 +5392,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 148 @@ -5372,7 +5432,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 186 + 187 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5380,13 +5440,21 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 322 + 323 libs/ui/src/lib/i18n.ts 35 + + Export + Export + + libs/ui/src/lib/activities-table/activities-table.component.html + 68 + + Tag Etiket @@ -5480,7 +5548,7 @@ Nakit apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 168 + 227 libs/ui/src/lib/i18n.ts @@ -5500,7 +5568,7 @@ Menkul Kıymet apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 55 + 67 libs/ui/src/lib/i18n.ts @@ -5524,7 +5592,7 @@ libs/ui/src/lib/i18n.ts - 99 + 100 @@ -5532,7 +5600,7 @@ Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 65 + 67 @@ -5612,7 +5680,7 @@ Communication Services libs/ui/src/lib/i18n.ts - 91 + 92 @@ -5647,6 +5715,22 @@ 79 + + Invested Capital + Invested Capital + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 174 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 85 + + South America Güney Amerika @@ -5728,7 +5812,7 @@ Convert to apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 174 + 175 @@ -5800,7 +5884,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 275 libs/ui/src/lib/i18n.ts @@ -5888,7 +5972,7 @@ Üyelik apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 78 + 82 libs/common/src/lib/routes/routes.ts @@ -5928,11 +6012,11 @@ Bu varlık profilini silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 28 + 29 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 66 + 71 @@ -5948,7 +6032,7 @@ Industrials libs/ui/src/lib/i18n.ts - 97 + 98 @@ -6004,7 +6088,7 @@ Hay Allah, Nakit bakiyesi tranferi başarısız oldu. apps/client/src/app/pages/accounts/accounts-page.component.ts - 358 + 355 @@ -6044,7 +6128,7 @@ Healthcare libs/ui/src/lib/i18n.ts - 96 + 97 @@ -6052,7 +6136,7 @@ Bu sistem mesajını silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 255 + 260 @@ -6084,7 +6168,7 @@ Nakit Bakiyeleri apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 143 + 170 @@ -6120,7 +6204,7 @@ Şu anki piyasa fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 766 + 850 @@ -6128,7 +6212,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 606 + 725 @@ -6202,18 +6286,6 @@ Investment Yatırım - - apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 173 - - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 60 - - - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 85 - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 101 @@ -6236,7 +6308,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 449 + 451 @@ -6276,7 +6348,7 @@ Hafta içi libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6284,11 +6356,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6296,7 +6368,7 @@ Ay içi libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6304,11 +6376,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6324,7 +6396,7 @@ Yıl içi libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -6368,7 +6440,7 @@ Yıl apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6380,7 +6452,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -6388,11 +6460,11 @@ Yıllar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -6408,7 +6480,7 @@ Veri Toplama apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 629 + 748 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6420,7 +6492,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 449 @@ -6440,7 +6512,7 @@ libs/common/src/lib/routes/routes.ts - 260 + 255 @@ -6452,7 +6524,7 @@ libs/common/src/lib/routes/routes.ts - 268 + 263 @@ -6461,11 +6533,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 263 + 258 libs/common/src/lib/routes/routes.ts - 266 + 261 @@ -6473,7 +6545,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 244 @@ -6511,9 +6583,13 @@ Activity Etkinlik + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 101 + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 231 + 232 @@ -6521,7 +6597,7 @@ Temettü Getiri apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 198 + 199 @@ -6577,7 +6653,7 @@ Etkinlikleri Sil libs/ui/src/lib/activities-table/activities-table.component.html - 92 + 105 @@ -6585,7 +6661,7 @@ İnternasyonalizasyon libs/common/src/lib/routes/routes.ts - 119 + 114 @@ -6593,7 +6669,7 @@ Ghostfolio hesabınızı kapatmak istediğinize emin misiniz? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 229 + 244 @@ -6601,7 +6677,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 450 @@ -6649,7 +6725,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 134 + 129 @@ -6657,7 +6733,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 399 + 400 @@ -6665,7 +6741,7 @@ Oops! Biyometrik kimlik doğrulama ayarlanırken bir hata oluştu. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 352 + 363 @@ -6681,7 +6757,7 @@ Kıyaslamalar apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 128 @@ -6729,7 +6805,7 @@ Bütçeleme libs/ui/src/lib/i18n.ts - 104 + 105 @@ -6797,7 +6873,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 51 + 55 @@ -6805,7 +6881,7 @@ Aile Ofisi libs/ui/src/lib/i18n.ts - 107 + 108 @@ -6885,7 +6961,7 @@ Zenginlik Yönetimi libs/ui/src/lib/i18n.ts - 113 + 114 @@ -6893,7 +6969,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 487 @@ -6901,7 +6977,7 @@ Do you really want to delete these asset profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 67 + 72 @@ -6909,7 +6985,7 @@ Hata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 757 + 841 @@ -6949,11 +7025,11 @@ İptal Et apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 162 + 163 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 753 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6977,7 +7053,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 112 + 107 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7005,7 +7081,7 @@ Kapat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 636 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7037,11 +7113,11 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 244 + 252 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 114 + 109 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7057,7 +7133,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 44 + 45 @@ -7081,7 +7157,7 @@ Tax Reporting libs/ui/src/lib/i18n.ts - 112 + 113 @@ -7097,7 +7173,7 @@ Kur farkı etkisiyle değişim Değişim apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 63 + 64 @@ -7113,7 +7189,7 @@ Kur farkı etkisiyle performans Performans apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 83 + 84 @@ -7161,7 +7237,7 @@ has been copied to the clipboard apps/client/src/app/components/admin-overview/admin-overview.component.ts - 223 + 228 libs/ui/src/lib/value/value.component.ts @@ -7229,7 +7305,7 @@ Financial Services libs/ui/src/lib/i18n.ts - 95 + 96 @@ -7259,6 +7335,10 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 270 + + libs/ui/src/lib/activities-table/activities-table.component.html + 101 + cannot be self-hosted @@ -7284,6 +7364,14 @@ 278 + + Shares Before + Shares Before + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 597 + + cannot be used anonymously gizli kullanımda kullanılmaz @@ -7313,7 +7401,7 @@ Dividend Tracking libs/ui/src/lib/i18n.ts - 105 + 106 @@ -7357,7 +7445,7 @@ API anahtarını ayarla apps/client/src/app/components/admin-settings/admin-settings.component.html - 188 + 197 @@ -7373,7 +7461,7 @@ Investment Research libs/ui/src/lib/i18n.ts - 109 + 110 @@ -7397,7 +7485,7 @@ libs/common/src/lib/routes/routes.ts - 313 + 308 @@ -7413,7 +7501,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 316 @@ -7422,11 +7510,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 316 + 311 libs/common/src/lib/routes/routes.ts - 319 + 314 @@ -7435,11 +7523,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 308 + 303 libs/common/src/lib/routes/routes.ts - 311 + 306 @@ -7463,7 +7551,7 @@ ın apps/client/src/app/components/admin-settings/admin-settings.component.html - 152 + 157 @@ -7471,7 +7559,7 @@ günlük istekler apps/client/src/app/components/admin-settings/admin-settings.component.html - 154 + 159 @@ -7479,7 +7567,7 @@ API anahtarını kaldır apps/client/src/app/components/admin-settings/admin-settings.component.html - 178 + 187 @@ -7487,7 +7575,7 @@ API anahtarını silmek istediğinize emin misiniz? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 143 + 144 @@ -7507,7 +7595,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 141 @@ -7579,7 +7667,7 @@ Kaydet apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 645 + 764 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7599,7 +7687,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 133 + 143 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7611,7 +7699,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 123 + 118 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7655,7 +7743,7 @@ Net Worth Tracking libs/ui/src/lib/i18n.ts - 110 + 111 @@ -7663,7 +7751,7 @@ Lütfen Ghostfolio API anahtarınızı girin. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 162 + 163 @@ -7695,7 +7783,7 @@ Tembel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7703,7 +7791,7 @@ Anında apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7711,7 +7799,7 @@ Varsayılan Piyasa Fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 638 @@ -7719,7 +7807,7 @@ Mod apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 556 + 675 @@ -7727,7 +7815,7 @@ Do you really want to convert the data source to ? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 485 + 525 @@ -7735,7 +7823,7 @@ Seçici apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 572 + 691 @@ -7743,7 +7831,7 @@ HTTP İstek Başlıkları apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 651 @@ -7751,7 +7839,7 @@ gün sonu apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7759,7 +7847,7 @@ gerçek zamanlı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7775,7 +7863,7 @@ Oluştur libs/ui/src/lib/tags-selector/tags-selector.component.html - 64 + 62 @@ -7940,11 +8028,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 232 + 227 libs/common/src/lib/routes/routes.ts - 235 + 230 @@ -7956,7 +8044,7 @@ libs/common/src/lib/routes/routes.ts - 237 + 232 @@ -7972,7 +8060,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 718 + 801 @@ -7980,7 +8068,7 @@ Güncelleştirilirken bir hata oluştu (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 721 + 804 @@ -7988,7 +8076,7 @@ Uygula apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 155 @@ -8068,7 +8156,7 @@ libs/common/src/lib/routes/routes.ts - 110 + 105 @@ -8079,6 +8167,18 @@ 142 + + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 102 + + Log out Oturumu kapat @@ -8090,13 +8190,9 @@ Calculations are based on delayed market data and may not be displayed in real-time. Hesaplamalar gecikmeli piyasa verilerine dayanmaktadır ve gerçek zamanlı olarak görüntülenemeyebilir. - - apps/client/src/app/components/home-market/home-market.html - 28 - apps/client/src/app/components/markets/markets.html - 54 + 64 @@ -8105,11 +8201,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 200 + 195 libs/common/src/lib/routes/routes.ts - 203 + 198 @@ -8117,7 +8213,7 @@ ETF Tracking libs/ui/src/lib/i18n.ts - 106 + 107 @@ -8125,7 +8221,7 @@ Demo kullanıcı hesabı senkronize edildi. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 323 + 334 @@ -8133,7 +8229,7 @@ Demo Kullanıcı Hesabını Senkronize Et apps/client/src/app/components/admin-overview/admin-overview.html - 128 + 131 @@ -8205,7 +8301,7 @@ libs/common/src/lib/routes/routes.ts - 251 + 246 @@ -8213,7 +8309,7 @@ Açık Kaynak Alternatifi libs/common/src/lib/routes/routes.ts - 346 + 341 @@ -8246,15 +8342,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 332 + 327 libs/common/src/lib/routes/routes.ts - 335 + 330 libs/common/src/lib/routes/routes.ts - 343 + 338 @@ -8263,11 +8359,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 324 + 319 libs/common/src/lib/routes/routes.ts - 327 + 322 @@ -8347,7 +8443,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 @@ -8492,11 +8588,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 356 + 351 libs/common/src/lib/routes/routes.ts - 357 + 352 @@ -8528,7 +8624,7 @@ Stocks apps/client/src/app/components/markets/markets.component.ts - 51 + 54 apps/client/src/app/pages/features/features-page.html @@ -8540,7 +8636,7 @@ Cryptocurrencies apps/client/src/app/components/markets/markets.component.ts - 52 + 55 apps/client/src/app/pages/features/features-page.html @@ -8552,7 +8648,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 479 @@ -8580,7 +8676,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 101 + 102 @@ -8984,7 +9080,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 56 + 58 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index a4ef1f24e..78284be35 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -1,6 +1,14 @@ + + Invalid API key + Invalid API key + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 112 + + Features Функції @@ -18,7 +26,7 @@ libs/common/src/lib/routes/routes.ts - 276 + 271 @@ -26,7 +34,7 @@ Інтернаціоналізація libs/common/src/lib/routes/routes.ts - 119 + 114 @@ -107,31 +115,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 196 + 191 libs/common/src/lib/routes/routes.ts - 197 + 192 libs/common/src/lib/routes/routes.ts - 202 + 197 libs/common/src/lib/routes/routes.ts - 210 + 205 libs/common/src/lib/routes/routes.ts - 218 + 213 libs/common/src/lib/routes/routes.ts - 226 + 221 libs/common/src/lib/routes/routes.ts - 234 + 229 @@ -140,11 +148,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 208 + 203 libs/common/src/lib/routes/routes.ts - 211 + 206 @@ -153,11 +161,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 224 + 219 libs/common/src/lib/routes/routes.ts - 227 + 222 @@ -166,19 +174,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 249 libs/common/src/lib/routes/routes.ts - 255 + 250 libs/common/src/lib/routes/routes.ts - 259 + 254 libs/common/src/lib/routes/routes.ts - 265 + 260 @@ -187,11 +195,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 274 + 269 libs/common/src/lib/routes/routes.ts - 275 + 270 @@ -200,11 +208,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 279 + 274 libs/common/src/lib/routes/routes.ts - 280 + 275 @@ -213,11 +221,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 289 + 284 libs/common/src/lib/routes/routes.ts - 290 + 285 @@ -226,11 +234,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 299 + 294 libs/common/src/lib/routes/routes.ts - 300 + 295 @@ -239,31 +247,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 299 libs/common/src/lib/routes/routes.ts - 305 + 300 libs/common/src/lib/routes/routes.ts - 310 + 305 libs/common/src/lib/routes/routes.ts - 318 + 313 libs/common/src/lib/routes/routes.ts - 326 + 321 libs/common/src/lib/routes/routes.ts - 334 + 329 libs/common/src/lib/routes/routes.ts - 342 + 337 @@ -320,7 +328,7 @@ Fetch market price - Fetch market price + Отримати ринкову ціну libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html 40 @@ -356,10 +364,10 @@ Tax Reporting - Tax Reporting + Податкова звітність libs/ui/src/lib/i18n.ts - 112 + 113 @@ -399,7 +407,7 @@ Баланс готівки apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 43 + 55 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -415,7 +423,7 @@ Платформа apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 113 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -431,7 +439,7 @@ Баланс готівки apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 143 + 170 @@ -455,7 +463,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 332 + 333 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -491,7 +499,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 161 + 175 libs/ui/src/lib/benchmark/benchmark.component.html @@ -520,7 +528,7 @@ Copy - Copy + Копіювати libs/ui/src/lib/notifications/alert-dialog/alert-dialog.html 20 @@ -531,11 +539,11 @@ Валюта apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 216 + 217 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 339 + 340 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -555,7 +563,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 303 + 317 @@ -591,11 +599,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 284 + 298 libs/ui/src/lib/activities-table/activities-table.component.html - 320 + 334 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -635,7 +643,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 483 + 497 @@ -651,7 +659,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 235 + 238 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -661,6 +669,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 100 + + apps/client/src/app/components/admin-users/admin-users.html + 254 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 27 @@ -675,7 +687,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 513 + 527 libs/ui/src/lib/benchmark/benchmark.component.html @@ -695,7 +707,7 @@ Платний apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 129 + 136 @@ -711,7 +723,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 166 + 174 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -719,11 +731,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 5 + 7 libs/ui/src/lib/activities-table/activities-table.component.html - 183 + 197 @@ -743,7 +755,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 486 + 487 @@ -767,7 +779,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 198 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -786,6 +798,14 @@ 96 + + Unknown + Unknown + + libs/ui/src/lib/i18n.ts + 88 + + Attempts Спроби @@ -824,7 +844,7 @@ and is driven by the efforts of its contributors - і розвивається завдяки зусиллям своїх учасників + і розвивається завдяки зусиллям своїх учасників apps/client/src/app/pages/about/overview/about-overview-page.html 50 @@ -846,6 +866,14 @@ 208 + + Splits + Splits + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 512 + + View Stacktrace Переглянути трасування @@ -875,7 +903,7 @@ Порівняльні показники apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 128 @@ -883,7 +911,7 @@ Валюти apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 133 apps/client/src/app/pages/public/public-page.html @@ -892,7 +920,7 @@ Category - Category + Категорія apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 77 @@ -903,7 +931,7 @@ ETF без країн apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 138 @@ -911,15 +939,15 @@ ETF без секторів apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 143 An error occurred while converting the data source to . - An error occurred while converting the data source to . + Під час конвертації джерела даних на сталася помилка. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 482 + 522 @@ -927,12 +955,12 @@ Фільтрувати за... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 365 + 377 Watch the Ghostfol.io Trailer on YouTube - Watch the Ghostfol.io Trailer on YouTube + Подивіться трейлер Ghostfol.io на YouTube apps/client/src/app/pages/landing/landing-page.html 19 @@ -947,7 +975,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 113 + 114 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -963,11 +991,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 235 + 236 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 221 + 222 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -979,7 +1007,7 @@ Частота збору даних apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 467 + 468 @@ -1012,7 +1040,7 @@ Apply current market price - Apply current market price + Застосувати поточну ринкову ціну apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 238 @@ -1023,7 +1051,7 @@ Історія підписок apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 141 + 149 @@ -1051,11 +1079,11 @@ Ви дійсно хочете видалити цей профіль активу? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 28 + 29 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 66 + 71 @@ -1063,7 +1091,7 @@ Ви справді хочете видалити ці профілі активів? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 67 + 72 @@ -1071,7 +1099,7 @@ Помилка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 757 + 841 @@ -1079,7 +1107,7 @@ Поточна ринкова ціна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 766 + 850 @@ -1103,11 +1131,11 @@ Сектор apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 280 + 281 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 270 + 271 @@ -1115,7 +1143,7 @@ Країна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 296 apps/client/src/app/components/admin-users/admin-users.html @@ -1123,11 +1151,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 284 + 285 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 88 + 96 @@ -1135,15 +1163,15 @@ Сектори apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 301 + 302 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 421 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 290 + 291 apps/client/src/app/pages/public/public-page.html @@ -1155,15 +1183,15 @@ Країни apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 312 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 431 + 432 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 302 + 303 @@ -1171,7 +1199,7 @@ Зіставлення символів apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 410 @@ -1179,7 +1207,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 146 + 141 @@ -1187,7 +1215,7 @@ Технологія libs/ui/src/lib/i18n.ts - 100 + 101 @@ -1203,7 +1231,7 @@ Усього apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 160 + 168 @@ -1211,7 +1239,7 @@ Конфігурація скребка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 509 + 628 @@ -1219,7 +1247,7 @@ Тест apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 606 + 725 @@ -1227,11 +1255,11 @@ URL apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 443 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 707 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1247,7 +1275,7 @@ Профіль активу було збережено apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 665 + 748 @@ -1255,7 +1283,7 @@ Примітка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 455 + 456 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1271,7 +1299,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 370 + 384 @@ -1295,7 +1323,7 @@ Промисловість libs/ui/src/lib/i18n.ts - 97 + 98 @@ -1319,7 +1347,7 @@ Назва, символ або ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 133 + 134 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1339,7 +1367,7 @@ Споживчі товари циклічного попиту libs/ui/src/lib/i18n.ts - 92 + 93 @@ -1355,7 +1383,7 @@ Ви дійсно хочете видалити цей купон? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 242 + 247 @@ -1363,7 +1391,7 @@ Ви дійсно хочете видалити це системне повідомлення? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 255 + 260 @@ -1371,7 +1399,7 @@ Ви дійсно хочете очистити кеш? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 279 + 290 @@ -1379,7 +1407,7 @@ Будь ласка, встановіть ваше системне повідомлення: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 299 + 310 @@ -1395,7 +1423,7 @@ на користувача apps/client/src/app/components/admin-overview/admin-overview.component.ts - 178 + 181 @@ -1411,7 +1439,7 @@ Режим лише для читання apps/client/src/app/components/admin-overview/admin-overview.html - 64 + 63 @@ -1419,7 +1447,7 @@ Збір даних apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 629 + 748 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1431,7 +1459,7 @@ Знайти актив... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 449 @@ -1439,7 +1467,7 @@ Системне повідомлення apps/client/src/app/components/admin-overview/admin-overview.html - 88 + 89 @@ -1447,7 +1475,7 @@ Встановити повідомлення apps/client/src/app/components/admin-overview/admin-overview.html - 110 + 113 @@ -1455,15 +1483,19 @@ Купони apps/client/src/app/components/admin-overview/admin-overview.html - 148 + 151 Add Додати + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 615 + apps/client/src/app/components/admin-overview/admin-overview.html - 298 + 301 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1475,7 +1507,7 @@ Прибирання apps/client/src/app/components/admin-overview/admin-overview.html - 117 + 120 @@ -1483,7 +1515,7 @@ Очистити кеш apps/client/src/app/components/admin-overview/admin-overview.html - 133 + 136 @@ -1523,7 +1555,7 @@ Поточний рік apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 @@ -1534,6 +1566,14 @@ 10 + + Cache has been flushed. + Cache has been flushed. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 281 + + Data Providers Постачальники даних @@ -1559,7 +1599,7 @@ з apps/client/src/app/components/admin-settings/admin-settings.component.html - 152 + 157 @@ -1567,7 +1607,7 @@ щоденних запитів apps/client/src/app/components/admin-settings/admin-settings.component.html - 154 + 159 @@ -1575,7 +1615,7 @@ Вилучити ключ API apps/client/src/app/components/admin-settings/admin-settings.component.html - 178 + 187 @@ -1583,7 +1623,7 @@ Встановити ключ API apps/client/src/app/components/admin-settings/admin-settings.component.html - 188 + 197 @@ -1591,7 +1631,7 @@ Платформи apps/client/src/app/components/admin-settings/admin-settings.component.html - 212 + 221 @@ -1599,7 +1639,7 @@ Теги apps/client/src/app/components/admin-settings/admin-settings.component.html - 218 + 227 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1607,7 +1647,7 @@ libs/ui/src/lib/tags-selector/tags-selector.component.html - 25 + 23 @@ -1615,15 +1655,15 @@ Ви дійсно хочете видалити ключ API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 143 + 144 Net Worth Tracking - Net Worth Tracking + Відстеження чистого капіталу libs/ui/src/lib/i18n.ts - 110 + 111 @@ -1631,7 +1671,7 @@ Будь ласка, введіть ваш ключ API Ghostfolio. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 162 + 163 @@ -1639,7 +1679,7 @@ або apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 167 + 168 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -1747,7 +1787,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 124 + 132 @@ -1759,7 +1799,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 141 @@ -1778,24 +1818,16 @@ 228 - - Delete User - Видалити користувача - - apps/client/src/app/components/admin-users/admin-users.html - 254 - - Could not validate form Не вдалося перевірити форму apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 641 + 724 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 644 + 727 @@ -1819,7 +1851,7 @@ Портфель apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 139 + 140 apps/client/src/app/components/header/header.component.html @@ -1835,7 +1867,7 @@ libs/common/src/lib/routes/routes.ts - 172 + 167 @@ -1843,19 +1875,19 @@ Порівняльний показник apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 401 + 402 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 151 + 152 Current Market Mood Поточний ринковий настрій - apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html - 12 + libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html + 23 @@ -1927,7 +1959,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 215 + 230 @@ -1935,7 +1967,7 @@ Зміна з урахуванням валютного ефекту Зміна apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 63 + 64 @@ -1951,7 +1983,7 @@ Прибутковість з урахуванням валютного ефекту валюти Прибутковість apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 83 + 84 @@ -1959,7 +1991,7 @@ Мінімальна ціна apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 131 + 132 @@ -1967,7 +1999,7 @@ Максимальна ціна apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 149 + 150 @@ -1975,7 +2007,7 @@ Кількість apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 159 + 160 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -1983,7 +2015,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 227 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1995,7 +2027,7 @@ Дохідність дивіденду apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 198 + 199 @@ -2003,7 +2035,7 @@ Комісії apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -2013,9 +2045,13 @@ Activity Активність + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 101 + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 231 + 232 @@ -2023,7 +2059,7 @@ Повідомити про збій даних apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 462 + 464 @@ -2066,12 +2102,20 @@ 64 + + Split Ratio + Split Ratio + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 526 + + Fear Страх apps/client/src/app/components/markets/markets.component.ts - 46 + 58 libs/ui/src/lib/i18n.ts @@ -2083,7 +2127,7 @@ Жадібність apps/client/src/app/components/markets/markets.component.ts - 47 + 59 libs/ui/src/lib/i18n.ts @@ -2095,7 +2139,7 @@ Останні днів apps/client/src/app/components/markets/markets.html - 17 + 24 @@ -2116,7 +2160,7 @@ The source code is fully available as open source software (OSS) under the AGPL-3.0 license - Вихідний код повністю доступний як програмне забезпечення з відкритим вихідним кодом (OSS) за ліцензією AGPL-3.0 + Вихідний код повністю доступний як програмне забезпечення з відкритим вихідним кодом (OSS) за ліцензією AGPL-3.0 apps/client/src/app/pages/about/overview/about-overview-page.html 16 @@ -2183,7 +2227,7 @@ Поточний тиждень apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 @@ -2203,7 +2247,7 @@ Загальна сума apps/client/src/app/components/investment-chart/investment-chart.component.ts - 143 + 144 @@ -2211,7 +2255,7 @@ Код apps/client/src/app/components/admin-overview/admin-overview.html - 159 + 162 @@ -2219,7 +2263,7 @@ Ставка заощаджень apps/client/src/app/components/investment-chart/investment-chart.component.ts - 201 + 193 @@ -2263,7 +2307,7 @@ Енергетика libs/ui/src/lib/i18n.ts - 94 + 95 @@ -2351,7 +2395,7 @@ Купівельна спроможність apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 196 + 256 @@ -2359,7 +2403,7 @@ Виключено з аналізу apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 270 + 286 @@ -2367,7 +2411,7 @@ Зобов’язання apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 298 + 315 apps/client/src/app/pages/features/features-page.html @@ -2379,7 +2423,7 @@ Чиста вартість apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 320 + 337 @@ -2387,7 +2431,7 @@ Річна доходність apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 334 + 351 @@ -2395,7 +2439,7 @@ Зберегти apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 645 + 764 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2415,7 +2459,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 133 + 143 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -2427,7 +2471,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 123 + 118 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -2443,7 +2487,7 @@ Будь ласка, встановіть суму вашого резервного фонду. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 135 + 145 @@ -2652,10 +2696,10 @@ Investment Research - Investment Research + Інвестиційні дослідження libs/ui/src/lib/i18n.ts - 109 + 110 @@ -2675,7 +2719,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 366 @@ -2683,11 +2727,11 @@ З початку року apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -2695,16 +2739,16 @@ 1 рік apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 Ghostfolio in Numbers: Monthly Active Users (MAU) - Ghostfolio in Numbers: Monthly Active Users (MAU) + Ghostfolio у цифрах: щомісячні активні користувачі (MAU) apps/client/src/app/pages/landing/landing-page.html 63 @@ -2715,11 +2759,11 @@ 5 років apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -2735,11 +2779,11 @@ Максимум apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 244 + 276 libs/ui/src/lib/assistant/assistant.component.ts - 415 + 416 @@ -2752,7 +2796,7 @@ The value has been copied to the clipboard - The value has been copied to the clipboard + Значення скопійовано в буфер обміну libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 @@ -2887,7 +2931,7 @@ Не вдалося обміняти код купона apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 178 + 181 @@ -2895,7 +2939,7 @@ Споживчі товари першої необхідності libs/ui/src/lib/i18n.ts - 93 + 94 @@ -2903,15 +2947,7 @@ Код купона був обміняний apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 191 - - - - Reload - Перезавантажити - - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 194 @@ -2919,7 +2955,7 @@ Будь ласка, введіть ваш код купона. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 214 + 203 @@ -2955,7 +2991,7 @@ Автоматичний apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 74 + 77 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2967,7 +3003,7 @@ Ви дійсно хочете закрити ваш обліковий запис Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 229 + 244 @@ -2975,7 +3011,7 @@ Перейти до сторінки... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 450 @@ -2983,7 +3019,7 @@ Ви дійсно хочете вилучити цей спосіб входу? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 303 + 314 @@ -2991,7 +3027,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 134 + 129 @@ -2999,7 +3035,7 @@ Включити до apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 399 + 400 @@ -3007,7 +3043,7 @@ Упс! Виникла помилка під час налаштування біометричної автентифікації. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 352 + 363 @@ -3015,7 +3051,7 @@ Комунальні послуги libs/ui/src/lib/i18n.ts - 101 + 102 @@ -3047,7 +3083,7 @@ Купон apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 134 + 141 @@ -3071,7 +3107,7 @@ Локалізація apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 666 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -3108,7 +3144,7 @@ Contributors to Ghostfolio - Contributors to Ghostfolio + Учасники Ghostfolio apps/client/src/app/pages/about/overview/about-overview-page.html 54 @@ -3150,6 +3186,14 @@ 221 + + Investments + Інвестиції + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 197 + + Biometric Authentication Біометрична аутентифікація @@ -3255,7 +3299,7 @@ Щодня apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 244 @@ -3287,7 +3331,7 @@ libs/common/src/lib/routes/routes.ts - 240 + 235 @@ -3303,7 +3347,7 @@ libs/common/src/lib/routes/routes.ts - 205 + 200 @@ -3319,7 +3363,7 @@ libs/common/src/lib/routes/routes.ts - 213 + 208 @@ -3335,7 +3379,7 @@ libs/common/src/lib/routes/routes.ts - 229 + 224 @@ -3395,11 +3439,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 384 + 396 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 101 + 109 apps/client/src/app/pages/accounts/accounts-page.html @@ -3419,7 +3463,7 @@ Упс, перенесення балансу готівки не вдалося. apps/client/src/app/pages/accounts/accounts-page.component.ts - 358 + 355 @@ -3443,15 +3487,15 @@ Ідентифікатор облікового запису apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 103 + 98 Financial Planning - Financial Planning + Фінансове планування libs/ui/src/lib/i18n.ts - 108 + 109 @@ -3511,7 +3555,7 @@ Ринкові дані apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 406 + 418 libs/common/src/lib/routes/routes.ts @@ -3549,9 +3593,13 @@ Overview Огляд + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 42 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 115 apps/client/src/app/components/header/header.component.html @@ -3563,7 +3611,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 47 + 48 apps/client/src/app/pages/admin/admin-page.component.ts @@ -3575,11 +3623,11 @@ libs/common/src/lib/routes/routes.ts - 113 + 108 libs/common/src/lib/routes/routes.ts - 190 + 185 @@ -3699,7 +3747,7 @@ libs/common/src/lib/routes/routes.ts - 245 + 240 @@ -3707,11 +3755,11 @@ Не вдалося розібрати конфігурацію скрапера apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 589 + 672 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 592 + 675 @@ -3727,12 +3775,12 @@ Оскільки ви вже ввійшли, ви не можете отримати доступ до демонстраційного обліковий запис. apps/client/src/app/pages/demo/demo-page.component.ts - 33 + 32 popular - popular + популярний apps/client/src/app/components/admin-settings/admin-settings.component.html 79 @@ -3743,7 +3791,7 @@ Тривалість apps/client/src/app/components/admin-overview/admin-overview.html - 172 + 175 @@ -3763,7 +3811,7 @@ libs/common/src/lib/routes/routes.ts - 271 + 266 @@ -3783,7 +3831,7 @@ libs/common/src/lib/routes/routes.ts - 260 + 255 @@ -3795,7 +3843,7 @@ libs/common/src/lib/routes/routes.ts - 268 + 263 @@ -3804,11 +3852,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 263 + 258 libs/common/src/lib/routes/routes.ts - 266 + 261 @@ -3960,11 +4008,11 @@ Створення apps/client/src/app/components/admin-overview/admin-overview.html - 185 + 188 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 150 + 158 @@ -3972,7 +4020,7 @@ Активи apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 100 + 127 apps/client/src/app/components/home-holdings/home-holdings.html @@ -3980,7 +4028,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 168 apps/client/src/app/pages/public/public-page.html @@ -3992,7 +4040,7 @@ libs/common/src/lib/routes/routes.ts - 187 + 182 libs/ui/src/lib/assistant/assistant.html @@ -4001,7 +4049,7 @@ just now - just now + щойно apps/client/src/app/components/admin-users/admin-users.component.ts 221 @@ -4016,7 +4064,7 @@ libs/common/src/lib/routes/routes.ts - 105 + 100 @@ -4024,7 +4072,7 @@ Ринки apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 403 + 404 apps/client/src/app/components/footer/footer.component.html @@ -4034,10 +4082,6 @@ apps/client/src/app/components/header/header.component.html 408 - - apps/client/src/app/components/home-market/home-market.html - 2 - apps/client/src/app/components/markets/markets.html 2 @@ -4056,15 +4100,11 @@ libs/common/src/lib/routes/routes.ts - 100 - - - libs/common/src/lib/routes/routes.ts - 281 + 276 libs/common/src/lib/routes/routes.ts - 329 + 324 @@ -4208,7 +4248,7 @@ Основні матеріали libs/ui/src/lib/i18n.ts - 90 + 91 @@ -4235,6 +4275,14 @@ 84 + + Do you really want to delete these activities? + Do you really want to delete these activities? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 334 + + Why Ghostfolio? Чому Ghostfolio? @@ -4336,7 +4384,7 @@ Упс! Не вдалося видалити профілі активів. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 52 + 56 @@ -4408,7 +4456,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 139 + 134 @@ -4437,7 +4485,7 @@ At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software (OSS) under the AGPL-3.0 license and we openly share aggregated key metrics of the platform’s operational status. - У Ghostfolio прозорість є основою наших цінностей. Ми публікуємо вихідний код як відкрите програмне забезпечення (OSS) під AGPL-3.0 ліцензією та відкрито ділимося агрегованими ключовими метриками операційного стану платформи. + У Ghostfolio прозорість є основою наших цінностей. Ми публікуємо вихідний код як програмне забезпечення з відкритим вихідним кодом (OSS) за ліцензією AGPL-3.0 і відкрито ділимося агрегованими ключовими показниками роботи платформи. apps/client/src/app/pages/open/open-page.html 7 @@ -4481,10 +4529,10 @@ Convert to - Convert to + Конвертувати в apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 174 + 175 @@ -4517,7 +4565,7 @@ Job ID - Job ID + Ідентифікатор завдання apps/client/src/app/components/admin-jobs/admin-jobs.html 34 @@ -4533,7 +4581,7 @@ Available on - Available on + Доступно в apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 130 @@ -4560,15 +4608,15 @@ Активності apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 84 + 103 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 111 + 138 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 244 + 245 apps/client/src/app/components/admin-overview/admin-overview.html @@ -4584,15 +4632,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 233 + 234 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 350 + 362 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 110 + 118 apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -4600,7 +4648,7 @@ libs/common/src/lib/routes/routes.ts - 149 + 144 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -4677,15 +4725,23 @@ Find an account... - Find an account... + Знайти рахунок... libs/ui/src/lib/assistant/assistant.component.ts - 447 + 448 Date Дата + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 521 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 560 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 156 @@ -4696,7 +4752,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 206 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -4712,7 +4768,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 237 + 251 @@ -4724,11 +4780,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 30 libs/ui/src/lib/activities-table/activities-table.component.html - 406 + 420 @@ -4740,11 +4796,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 52 + 54 libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 434 @@ -4765,7 +4821,7 @@ or start a discussion at - or start a discussion at + або почати обговорення на apps/client/src/app/pages/about/overview/about-overview-page.html 98 @@ -4847,6 +4903,14 @@ 118 + + Shares After + Shares After + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 584 + + Back Назад @@ -4861,18 +4925,18 @@ Price - Price + Ціна apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 176 + 184 Do you really want to convert this asset profile to ()? - Do you really want to convert this asset profile to ()? + Ви дійсно бажаєте конвертувати цей профіль активу в ()? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 723 + 806 @@ -4904,7 +4968,7 @@ libs/common/src/lib/routes/routes.ts - 154 + 149 @@ -4985,19 +5049,15 @@ Trial - Trial + Пробний період apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 133 + 140 Exclude from Analysis - Exclude from Analysis - - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 97 - + Виключити з аналізу libs/ui/src/lib/i18n.ts 22 @@ -5096,12 +5156,12 @@ libs/common/src/lib/routes/routes.ts - 159 + 154 Looking for a student discount? - Looking for a student discount? + Шукаєте студентську знижку? apps/client/src/app/pages/pricing/pricing-page.html 342 @@ -5112,15 +5172,15 @@ Дивіденди apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 79 + 91 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 188 + 189 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 419 + 437 apps/client/src/app/pages/features/features-page.html @@ -5134,26 +5194,14 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 81 - - libs/ui/src/lib/i18n.ts - 43 - - - - Investment - Інвестиції - - apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 173 - - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 60 - - - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 85 + + libs/ui/src/lib/i18n.ts + 43 + + + Investment + Інвестиції apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 101 @@ -5189,10 +5237,10 @@ Close Holding - Close Holding + Закрити позицію apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 449 + 451 @@ -5360,7 +5408,7 @@ libs/common/src/lib/routes/routes.ts - 291 + 286 @@ -5397,10 +5445,10 @@ Hourly - Hourly + Щогодини apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 248 @@ -5509,10 +5557,10 @@ Expiration - Expiration + Термін дії apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 209 + 217 @@ -5533,14 +5581,14 @@ Could not save asset profile - Could not save asset profile + Не вдалося зберегти профіль активу apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 758 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 678 + 761 @@ -5569,10 +5617,10 @@ has been copied to the clipboard - has been copied to the clipboard + скопійовано в буфер обміну apps/client/src/app/components/admin-overview/admin-overview.component.ts - 223 + 228 libs/ui/src/lib/value/value.component.ts @@ -5589,7 +5637,7 @@ Compare Ghostfolio to - - Compare Ghostfolio to - + Порівняйте Ghostfolio з - apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html 32 @@ -5613,7 +5661,7 @@ Sustainable retirement income - Sustainable retirement income + Стабільний дохід на пенсії apps/client/src/app/pages/portfolio/fire/fire-page.html 42 @@ -5636,7 +5684,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 296 @@ -5672,7 +5720,7 @@ libs/common/src/lib/routes/routes.ts - 313 + 308 @@ -5688,7 +5736,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 316 @@ -5697,11 +5745,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 316 + 311 libs/common/src/lib/routes/routes.ts - 319 + 314 @@ -5710,11 +5758,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 308 + 303 libs/common/src/lib/routes/routes.ts - 311 + 306 @@ -5726,7 +5774,7 @@ libs/common/src/lib/routes/routes.ts - 349 + 344 @@ -5735,11 +5783,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 340 + 335 libs/common/src/lib/routes/routes.ts - 344 + 339 @@ -5774,6 +5822,14 @@ 43 + + Data gathering has been started. + Data gathering has been started. + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 413 + + Global Глобальний @@ -5807,7 +5863,7 @@ Бюджетування libs/ui/src/lib/i18n.ts - 104 + 105 @@ -5872,10 +5928,10 @@ Oops! Could not delete the asset profile. - Oops! Could not delete the asset profile. + От халепа! Не вдалося видалити профіль активу. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 51 + 55 @@ -5883,7 +5939,7 @@ Сімейний офіс libs/ui/src/lib/i18n.ts - 107 + 108 @@ -5963,7 +6019,7 @@ Управління багатством libs/ui/src/lib/i18n.ts - 113 + 114 @@ -6016,7 +6072,7 @@ Website of Thomas Kaul - Website of Thomas Kaul + Вебсайт Томаса Кауля apps/client/src/app/pages/about/overview/about-overview-page.html 45 @@ -6048,10 +6104,10 @@ Coupon has been created - Coupon has been created + Купон створено apps/client/src/app/components/admin-overview/admin-overview.component.ts - 224 + 229 @@ -6124,7 +6180,7 @@ Upgrade to Ghostfolio Premium - Upgrade to Ghostfolio Premium + Перейти на Ghostfolio Premium libs/ui/src/lib/premium-indicator/premium-indicator.component.html 4 @@ -6176,15 +6232,15 @@ Financial Services - Financial Services + Фінансові послуги libs/ui/src/lib/i18n.ts - 95 + 96 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 + щоб скористатися нашим реферальним посиланням і отримати підписку Ghostfolio Premium на один рік apps/client/src/app/pages/pricing/pricing-page.html 340 @@ -6204,11 +6260,15 @@ Delete - Delete + Видалити apps/client/src/app/components/admin-market-data/admin-market-data.html 270 + + libs/ui/src/lib/activities-table/activities-table.component.html + 101 + cannot be self-hosted @@ -6242,6 +6302,14 @@ 278 + + Shares Before + Shares Before + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 597 + + cannot be used anonymously не може використовуватися анонімно @@ -6276,10 +6344,10 @@ Dividend Tracking - Dividend Tracking + Відстеження дивідендів libs/ui/src/lib/i18n.ts - 105 + 106 @@ -6296,7 +6364,7 @@ Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. - Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. + Ghostfolio — це легкий застосунок для управління статками, який допомагає приватним особам відстежувати акції, ETF або криптовалюти та приймати обґрунтовані, засновані на даних інвестиційні рішення. apps/client/src/app/pages/about/overview/about-overview-page.html 10 @@ -6324,10 +6392,10 @@ Stock Tracking - Stock Tracking + Відстеження акцій libs/ui/src/lib/i18n.ts - 111 + 112 @@ -6348,10 +6416,10 @@ Web - Web + Веб libs/ui/src/lib/i18n.ts - 120 + 121 @@ -6383,7 +6451,7 @@ libs/common/src/lib/routes/routes.ts - 352 + 347 @@ -6391,7 +6459,7 @@ Членство apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 78 + 82 libs/common/src/lib/routes/routes.ts @@ -6467,11 +6535,11 @@ Експорт активності libs/ui/src/lib/activities-table/activities-table.component.html - 64 + 72 libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 448 @@ -6479,11 +6547,11 @@ Експортувати чернетки як ICS libs/ui/src/lib/activities-table/activities-table.component.html - 77 + 86 libs/ui/src/lib/activities-table/activities-table.component.html - 447 + 461 @@ -6491,7 +6559,7 @@ Видалити активності libs/ui/src/lib/activities-table/activities-table.component.html - 92 + 105 @@ -6499,7 +6567,7 @@ Чернетка libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 181 @@ -6507,7 +6575,7 @@ Клонувати libs/ui/src/lib/activities-table/activities-table.component.html - 492 + 506 @@ -6515,15 +6583,7 @@ Експортувати чернетку як ICS libs/ui/src/lib/activities-table/activities-table.component.html - 502 - - - - Do you really want to delete these activities? - Ви дійсно хочете видалити ці дії? - - libs/ui/src/lib/activities-table/activities-table.component.ts - 317 + 516 @@ -6531,7 +6591,11 @@ Ви дійсно хочете видалити цю активність? libs/ui/src/lib/activities-table/activities-table.component.ts - 327 + 333 + + + libs/ui/src/lib/activities-table/activities-table.component.ts + 344 @@ -6539,7 +6603,7 @@ Тиждень до дати libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6547,11 +6611,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6559,7 +6623,7 @@ Місяць до дати libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6567,16 +6631,16 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 Expires () - Expires () + Закінчується () apps/client/src/app/components/admin-users/admin-users.html 34 @@ -6587,7 +6651,7 @@ Рік до дати libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -6595,7 +6659,7 @@ рік apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6607,7 +6671,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -6615,11 +6679,11 @@ роки apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -6627,7 +6691,7 @@ Профілі активів apps/client/src/app/components/admin-settings/admin-settings.component.html - 123 + 128 libs/ui/src/lib/assistant/assistant.html @@ -6660,7 +6724,7 @@ Portfolio Filters - Portfolio Filters + Фільтри портфеля apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 63 @@ -6700,7 +6764,7 @@ contact us - contact us + зв'яжіться з нами apps/client/src/app/pages/pricing/pricing-page.html 336 @@ -6783,11 +6847,11 @@ Відсотки apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 67 + 79 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 406 + 424 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -6824,10 +6888,10 @@ Healthcare - Healthcare + Охорона здоров'я libs/ui/src/lib/i18n.ts - 96 + 97 @@ -6875,7 +6939,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 335 + 349 libs/ui/src/lib/i18n.ts @@ -6903,15 +6967,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 254 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 349 + 350 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 244 + 245 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -6935,15 +6999,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 262 + 263 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 365 + 366 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 253 + 254 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -6967,11 +7031,11 @@ Скасувати apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 162 + 163 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 753 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6995,7 +7059,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 112 + 107 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7031,7 +7095,7 @@ Закрити apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 636 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7063,11 +7127,11 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 244 + 252 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 114 + 109 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7099,15 +7163,15 @@ Резервний фонд apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 254 + 270 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 356 + 373 apps/client/src/app/pages/features/features-page.html @@ -7175,7 +7239,7 @@ libs/ui/src/lib/i18n.ts - 98 + 99 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -7192,7 +7256,7 @@ Ghostfolio in Numbers: Pulls on Docker Hub - Ghostfolio in Numbers: Pulls on Docker Hub + Ghostfolio у цифрах: завантаження на Docker Hub apps/client/src/app/pages/landing/landing-page.html 101 @@ -7211,7 +7275,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 148 @@ -7224,7 +7288,7 @@ Everything in Basic, plus - Everything in Basic, plus + Усе, що входить у Базовий, плюс apps/client/src/app/pages/pricing/pricing-page.html 199 @@ -7251,7 +7315,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 186 + 187 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7259,13 +7323,21 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 322 + 323 libs/ui/src/lib/i18n.ts 35 + + Export + Export + + libs/ui/src/lib/activities-table/activities-table.component.html + 68 + + Tag Тег @@ -7288,7 +7360,7 @@ View Details - View Details + Переглянути деталі apps/client/src/app/components/admin-users/admin-users.html 220 @@ -7311,7 +7383,7 @@ Роль apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 44 + 45 @@ -7324,7 +7396,7 @@ Sign in with OpenID Connect - Sign in with OpenID Connect + Увійти через OpenID Connect apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html 57 @@ -7351,7 +7423,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 275 libs/ui/src/lib/i18n.ts @@ -7391,7 +7463,7 @@ Готівка apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 168 + 227 libs/ui/src/lib/i18n.ts @@ -7411,7 +7483,7 @@ Капітал apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 55 + 67 libs/ui/src/lib/i18n.ts @@ -7443,7 +7515,7 @@ libs/ui/src/lib/i18n.ts - 99 + 100 @@ -7451,7 +7523,7 @@ Автентифікація apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 65 + 67 @@ -7528,10 +7600,10 @@ Communication Services - Communication Services + Комунікаційні послуги libs/ui/src/lib/i18n.ts - 91 + 92 @@ -7552,7 +7624,7 @@ If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of - If you retire today, you would be able to withdraw на рік або per month, based on your total assets of та безпечним рівнем зняття коштів (SWR) у розмірі + Якщо ви вийдете на пенсію сьогодні, ви зможете знімати на рік або на місяць, виходячи із загальної суми ваших активів у розмірі та безпечної норми зняття коштів (SWR) у розмірі apps/client/src/app/pages/portfolio/fire/fire-page.html 69 @@ -7566,6 +7638,22 @@ 79 + + Invested Capital + Інвестований капітал + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 174 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 85 + + South America Південна Америка @@ -7576,10 +7664,10 @@ View Holding - View Holding + Переглянути позицію libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 487 @@ -7695,7 +7783,7 @@ Лінивий apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7703,15 +7791,15 @@ Миттєвий apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 Default Market Price - Default Market Price + Стандартна ринкова ціна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 638 @@ -7719,15 +7807,15 @@ Режим apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 556 + 675 Do you really want to convert the data source to ? - Do you really want to convert the data source to ? + Ви дійсно бажаєте конвертувати джерело даних на ? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 485 + 525 @@ -7735,23 +7823,23 @@ Селектор apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 572 + 691 HTTP Request Headers - HTTP Request Headers + Заголовки HTTP-запиту apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 651 end of day - end of day + кінець дня apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7759,12 +7847,12 @@ реальний час apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 Open Duck.ai - Open Duck.ai + Відкрити Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 219 @@ -7775,7 +7863,7 @@ Створити libs/ui/src/lib/tags-selector/tags-selector.component.html - 64 + 62 @@ -7792,7 +7880,7 @@ Ghostfolio in Numbers: Stars on GitHub - Ghostfolio in Numbers: Stars on GitHub + Ghostfolio у цифрах: зірки на GitHub apps/client/src/app/pages/landing/landing-page.html 82 @@ -7828,7 +7916,7 @@ The project has been initiated by - The project has been initiated by + Проєкт було започатковано apps/client/src/app/pages/about/overview/about-overview-page.html 41 @@ -7836,7 +7924,7 @@ Copy portfolio data to clipboard for AI prompt - Copy portfolio data to clipboard for AI prompt + Скопіювати дані портфеля в буфер обміну для запиту ШІ apps/client/src/app/pages/portfolio/analysis/analysis-page.html 42 @@ -7844,7 +7932,7 @@ Copy AI prompt to clipboard for analysis - Copy AI prompt to clipboard for analysis + Скопіювати запит ШІ в буфер обміну для аналізу apps/client/src/app/pages/portfolio/analysis/analysis-page.html 67 @@ -7852,7 +7940,7 @@ Total amount - Total amount + Загальна сума apps/client/src/app/pages/portfolio/analysis/analysis-page.html 94 @@ -7860,7 +7948,7 @@ Terms and Conditions - Terms and Conditions + Умови та положення apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html 15 @@ -7868,7 +7956,7 @@ Please keep your security token safe. If you lose it, you will not be able to recover your account. - Please keep your security token safe. If you lose it, you will not be able to recover your account. + Будь ласка, зберігайте свій токен безпеки в надійному місці. Якщо ви його втратите, ви не зможете відновити свій обліковий запис. apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html 18 @@ -7876,7 +7964,7 @@ I understand that if I lose my security token, I cannot recover my account - I understand that if I lose my security token, I cannot recover my account + Я розумію, що якщо я втрачу свій токен безпеки, я не зможу відновити свій обліковий запис apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html 28 @@ -7892,7 +7980,7 @@ Here is your security token. It is only visible once, please store and keep it in a safe place. - Here is your security token. It is only visible once, please store and keep it in a safe place. + Ось ваш токен безпеки. Він відображається лише один раз, будь ласка, збережіть його в надійному місці. apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html 67 @@ -7900,7 +7988,7 @@ Security token - Security token + Токен безпеки apps/client/src/app/components/admin-users/admin-users.component.ts 273 @@ -7912,7 +8000,7 @@ Do you really want to generate a new security token for this user? - Do you really want to generate a new security token for this user? + Ви дійсно бажаєте згенерувати новий токен безпеки для цього користувача? apps/client/src/app/components/admin-users/admin-users.component.ts 278 @@ -7920,7 +8008,7 @@ Generate Security Token - Generate Security Token + Згенерувати токен безпеки apps/client/src/app/components/admin-users/admin-users.html 238 @@ -7928,7 +8016,7 @@ Terms of Service - Terms of Service + Умови надання послуг apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.html 5 @@ -7940,28 +8028,28 @@ kebab-case libs/common/src/lib/routes/routes.ts - 232 + 227 libs/common/src/lib/routes/routes.ts - 235 + 230 Terms of Service - Terms of Service + Умови надання послуг apps/client/src/app/components/footer/footer.component.html 62 libs/common/src/lib/routes/routes.ts - 237 + 232 and I agree to the Terms of Service. - and I agree to the Terms of Service. + і я погоджуюсь з Умовами надання послуг. apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html 34 @@ -7969,18 +8057,18 @@ () is already in use. - () is already in use. + () вже використовується. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 718 + 801 An error occurred while updating to (). - An error occurred while updating to (). + Під час оновлення до () сталася помилка. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 721 + 804 @@ -7988,12 +8076,12 @@ Застосувати apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 155 with API access for - with API access for + з доступом до API на apps/client/src/app/pages/pricing/pricing-page.html 235 @@ -8001,7 +8089,7 @@ Gather Recent Historical Market Data - Gather Recent Historical Market Data + Зібрати останні історичні ринкові дані apps/client/src/app/components/admin-market-data/admin-market-data.html 251 @@ -8009,7 +8097,7 @@ Gather All Historical Market Data - Gather All Historical Market Data + Зібрати всі історичні ринкові дані apps/client/src/app/components/admin-market-data/admin-market-data.html 256 @@ -8017,7 +8105,7 @@ Gather Historical Market Data - Gather Historical Market Data + Зібрати історичні ринкові дані apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 34 @@ -8025,7 +8113,7 @@ Data Gathering is off - Data Gathering is off + Збір даних вимкнено apps/client/src/app/components/admin-market-data/admin-market-data.html 38 @@ -8033,7 +8121,7 @@ Performance Calculation - Performance Calculation + Розрахунок прибутковості apps/client/src/app/components/user-account-settings/user-account-settings.html 31 @@ -8049,7 +8137,7 @@ Add asset to watchlist - Add asset to watchlist + Додати актив до списку спостереження apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html 7 @@ -8068,20 +8156,32 @@ libs/common/src/lib/routes/routes.ts - 110 + 105 Do you really want to delete this item? - Do you really want to delete this item? + Ви дійсно бажаєте видалити цей елемент? libs/ui/src/lib/benchmark/benchmark.component.ts 142 + + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 102 + + Log out - Log out + Вийти apps/client/src/app/components/header/header.component.html 330 @@ -8089,14 +8189,10 @@ Calculations are based on delayed market data and may not be displayed in real-time. - Calculations are based on delayed market data and may not be displayed in real-time. - - apps/client/src/app/components/home-market/home-market.html - 28 - + Розрахунки базуються на затриманих ринкових даних і можуть не відображатися в реальному часі. apps/client/src/app/components/markets/markets.html - 54 + 64 @@ -8105,40 +8201,40 @@ kebab-case libs/common/src/lib/routes/routes.ts - 200 + 195 libs/common/src/lib/routes/routes.ts - 203 + 198 ETF Tracking - ETF Tracking + Відстеження ETF libs/ui/src/lib/i18n.ts - 106 + 107 Demo user account has been synced. - Demo user account has been synced. + Обліковий запис демо-користувача синхронізовано. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 323 + 334 Sync Demo User Account - Sync Demo User Account + Синхронізувати обліковий запис демо-користувача apps/client/src/app/components/admin-overview/admin-overview.html - 128 + 131 Set up - Set up + Налаштування apps/client/src/app/pages/i18n/i18n-page.html 145 @@ -8146,7 +8242,7 @@ No emergency fund has been set up - No emergency fund has been set up + Резервний фонд не створено apps/client/src/app/pages/i18n/i18n-page.html 147 @@ -8154,7 +8250,7 @@ An emergency fund has been set up - An emergency fund has been set up + Резервний фонд створено apps/client/src/app/pages/i18n/i18n-page.html 150 @@ -8162,7 +8258,7 @@ Fee Ratio - Fee Ratio + Коефіцієнт комісій apps/client/src/app/pages/i18n/i18n-page.html 152 @@ -8170,7 +8266,7 @@ The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%) - The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%) + Комісії перевищують ${thresholdMax}% від загального обсягу ваших інвестицій (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 154 @@ -8178,7 +8274,7 @@ The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%) - The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%) + Комісії не перевищують ${thresholdMax}% від загального обсягу ваших інвестицій (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 158 @@ -8186,7 +8282,7 @@ Quick Links - Quick Links + Швидкі посилання libs/ui/src/lib/assistant/assistant.html 58 @@ -8194,7 +8290,7 @@ Live Demo - Live Demo + Демоверсія apps/client/src/app/pages/landing/landing-page.html 49 @@ -8205,7 +8301,7 @@ libs/common/src/lib/routes/routes.ts - 251 + 246 @@ -8213,12 +8309,12 @@ Альтернатива з відкритим кодом для libs/common/src/lib/routes/routes.ts - 346 + 341 Single Account - Single Account + Єдиний рахунок apps/client/src/app/pages/i18n/i18n-page.html 28 @@ -8226,7 +8322,7 @@ Your net worth is managed by a single account - Your net worth is managed by a single account + Ваш чистий капітал керується єдиним рахунком apps/client/src/app/pages/i18n/i18n-page.html 30 @@ -8234,7 +8330,7 @@ Your net worth is managed by ${accountsLength} accounts - Your net worth is managed by ${accountsLength} accounts + Ваш чистий капітал керується ${accountsLength} рахунками apps/client/src/app/pages/i18n/i18n-page.html 36 @@ -8246,15 +8342,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 332 + 327 libs/common/src/lib/routes/routes.ts - 335 + 330 libs/common/src/lib/routes/routes.ts - 343 + 338 @@ -8263,16 +8359,16 @@ kebab-case libs/common/src/lib/routes/routes.ts - 324 + 319 libs/common/src/lib/routes/routes.ts - 327 + 322 Fuel your self-hosted Ghostfolio with a powerful data provider to access 80,000+ tickers from over 50 exchanges worldwide. - Fuel your self-hosted Ghostfolio with a powerful data provider to access 80,000+ tickers from over 50 exchanges worldwide. + Підживіть свій самостійно розміщений Ghostfolio за допомогою потужного постачальника даних, щоб отримати доступ до понад 80 000 тікерів з понад 50 бірж по всьому світу. apps/client/src/app/components/admin-settings/admin-settings.component.html 16 @@ -8280,7 +8376,7 @@ Post to Ghostfolio on X (formerly Twitter) - Post to Ghostfolio on X (formerly Twitter) + Опублікувати в Ghostfolio на X (колишній Twitter) apps/client/src/app/pages/about/overview/about-overview-page.html 85 @@ -8288,7 +8384,7 @@ Get Access - Get Access + Отримати доступ apps/client/src/app/components/admin-settings/admin-settings.component.html 27 @@ -8296,7 +8392,7 @@ Learn more - Learn more + Дізнатися більше apps/client/src/app/components/admin-settings/admin-settings.component.html 38 @@ -8304,7 +8400,7 @@ Limited Offer! - Limited Offer! + Обмежена пропозиція! apps/client/src/app/components/user-account-membership/user-account-membership.html 41 @@ -8316,7 +8412,7 @@ Get extra - Get extra + Отримайте додатково apps/client/src/app/components/user-account-membership/user-account-membership.html 44 @@ -8344,10 +8440,10 @@ Current month - Current month + Поточний місяць apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 @@ -8360,7 +8456,7 @@ Over ${thresholdMax}% of your current investment is at ${maxAccountName} (${maxInvestmentRatio}%) - Over ${thresholdMax}% of your current investment is at ${maxAccountName} (${maxInvestmentRatio}%) + Понад ${thresholdMax}% ваших поточних інвестицій зосереджено на ${maxAccountName} (${maxInvestmentRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 17 @@ -8368,7 +8464,7 @@ The major part of your current investment is at ${maxAccountName} (${maxInvestmentRatio}%) and does not exceed ${thresholdMax}% - The major part of your current investment is at ${maxAccountName} (${maxInvestmentRatio}%) and does not exceed ${thresholdMax}% + Основна частина ваших поточних інвестицій знаходиться на ${maxAccountName} (${maxInvestmentRatio}%) і не перевищує ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 24 @@ -8384,7 +8480,7 @@ The equity contribution of your current investment (${equityValueRatio}%) exceeds ${thresholdMax}% - The equity contribution of your current investment (${equityValueRatio}%) exceeds ${thresholdMax}% + Частка акцій у ваших поточних інвестиціях (${equityValueRatio}%) перевищує ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 43 @@ -8392,7 +8488,7 @@ The equity contribution of your current investment (${equityValueRatio}%) is below ${thresholdMin}% - The equity contribution of your current investment (${equityValueRatio}%) is below ${thresholdMin}% + Частка акцій у ваших поточних інвестиціях (${equityValueRatio}%) нижча за ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 47 @@ -8400,7 +8496,7 @@ The equity contribution of your current investment (${equityValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - The equity contribution of your current investment (${equityValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + Частка акцій у ваших поточних інвестиціях (${equityValueRatio}%) перебуває в межах від ${thresholdMin}% до ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 51 @@ -8408,7 +8504,7 @@ Fixed Income - Fixed Income + Фіксований дохід apps/client/src/app/pages/i18n/i18n-page.html 55 @@ -8416,7 +8512,7 @@ The fixed income contribution of your current investment (${fixedIncomeValueRatio}%) exceeds ${thresholdMax}% - The fixed income contribution of your current investment (${fixedIncomeValueRatio}%) exceeds ${thresholdMax}% + Частка інструментів з фіксованим доходом у ваших поточних інвестиціях (${fixedIncomeValueRatio}%) перевищує ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 57 @@ -8424,7 +8520,7 @@ The fixed income contribution of your current investment (${fixedIncomeValueRatio}%) is below ${thresholdMin}% - The fixed income contribution of your current investment (${fixedIncomeValueRatio}%) is below ${thresholdMin}% + Частка інструментів з фіксованим доходом у ваших поточних інвестиціях (${fixedIncomeValueRatio}%) нижча за ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 61 @@ -8432,7 +8528,7 @@ The fixed income contribution of your current investment (${fixedIncomeValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - The fixed income contribution of your current investment (${fixedIncomeValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + Частка інструментів з фіксованим доходом у ваших поточних інвестиціях (${fixedIncomeValueRatio}%) перебуває в межах від ${thresholdMin}% до ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 66 @@ -8440,7 +8536,7 @@ Investment: Base Currency - Investment: Base Currency + Інвестиції: базова валюта apps/client/src/app/pages/i18n/i18n-page.html 85 @@ -8448,7 +8544,7 @@ The major part of your current investment is not in your base currency (${baseCurrencyValueRatio}% in ${baseCurrency}) - The major part of your current investment is not in your base currency (${baseCurrencyValueRatio}% in ${baseCurrency}) + Основна частина ваших поточних інвестицій не в базовій валюті (${baseCurrencyValueRatio}% у ${baseCurrency}) apps/client/src/app/pages/i18n/i18n-page.html 88 @@ -8456,7 +8552,7 @@ The major part of your current investment is in your base currency (${baseCurrencyValueRatio}% in ${baseCurrency}) - The major part of your current investment is in your base currency (${baseCurrencyValueRatio}% in ${baseCurrency}) + Основна частина ваших поточних інвестицій у базовій валюті (${baseCurrencyValueRatio}% у ${baseCurrency}) apps/client/src/app/pages/i18n/i18n-page.html 92 @@ -8472,7 +8568,7 @@ Over ${thresholdMax}% of your current investment is in ${currency} (${maxValueRatio}%) - Over ${thresholdMax}% of your current investment is in ${currency} (${maxValueRatio}%) + Понад ${thresholdMax}% ваших поточних інвестицій у ${currency} (${maxValueRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 97 @@ -8480,7 +8576,7 @@ The major part of your current investment is in ${currency} (${maxValueRatio}%) and does not exceed ${thresholdMax}% - The major part of your current investment is in ${currency} (${maxValueRatio}%) and does not exceed ${thresholdMax}% + Основна частина ваших поточних інвестицій у ${currency} (${maxValueRatio}%) і не перевищує ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 101 @@ -8492,16 +8588,16 @@ kebab-case libs/common/src/lib/routes/routes.ts - 356 + 351 libs/common/src/lib/routes/routes.ts - 357 + 352 Do you really want to generate a new security token? - Do you really want to generate a new security token? + Ви дійсно бажаєте згенерувати новий токен безпеки? apps/client/src/app/components/user-account-access/user-account-access.component.ts 184 @@ -8517,7 +8613,7 @@ If you encounter a bug, would like to suggest an improvement or a new feature, please join the Ghostfolio Slack community, post to @ghostfolio_ - If you encounter a bug, would like to suggest an improvement or a new feature, please join the Ghostfolio Slack community, post to @ghostfolio_ + Якщо ви виявили помилку, хочете запропонувати покращення чи нову функцію, будь ласка, приєднуйтесь до спільноти Ghostfolio в Slack або напишіть у @ghostfolio_ apps/client/src/app/pages/about/overview/about-overview-page.html 71 @@ -8528,7 +8624,7 @@ Акції apps/client/src/app/components/markets/markets.component.ts - 51 + 54 apps/client/src/app/pages/features/features-page.html @@ -8540,7 +8636,7 @@ Криптовалюти apps/client/src/app/components/markets/markets.component.ts - 52 + 55 apps/client/src/app/pages/features/features-page.html @@ -8549,15 +8645,15 @@ Manage Asset Profile - Manage Asset Profile + Керувати профілем активу apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 479 Alternative Investment - Alternative Investment + Альтернативні інвестиції libs/ui/src/lib/i18n.ts 51 @@ -8573,19 +8669,19 @@ Average Unit Price - Average Unit Price + Середня ціна за одиницю apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts 140 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 101 + 102 Account Cluster Risks - Account Cluster Risks + Ризики концентрації рахунків apps/client/src/app/pages/i18n/i18n-page.html 14 @@ -8593,7 +8689,7 @@ Asset Class Cluster Risks - Asset Class Cluster Risks + Ризики концентрації класів активів apps/client/src/app/pages/i18n/i18n-page.html 39 @@ -8601,7 +8697,7 @@ Currency Cluster Risks - Currency Cluster Risks + Ризики концентрації валют apps/client/src/app/pages/i18n/i18n-page.html 83 @@ -8609,7 +8705,7 @@ Economic Market Cluster Risks - Economic Market Cluster Risks + Ризики концентрації економічних ринків apps/client/src/app/pages/i18n/i18n-page.html 106 @@ -8617,7 +8713,7 @@ Emergency Fund - Emergency Fund + Резервний фонд apps/client/src/app/pages/i18n/i18n-page.html 144 @@ -8641,7 +8737,7 @@ Buying Power - Buying Power + Купівельна спроможність apps/client/src/app/pages/i18n/i18n-page.html 71 @@ -8649,7 +8745,7 @@ Your buying power is below ${thresholdMin} ${baseCurrency} - Your buying power is below ${thresholdMin} ${baseCurrency} + Ваша купівельна спроможність нижча за ${thresholdMin} ${baseCurrency} apps/client/src/app/pages/i18n/i18n-page.html 73 @@ -8657,7 +8753,7 @@ Your buying power is 0 ${baseCurrency} - Your buying power is 0 ${baseCurrency} + Ваша купівельна спроможність становить 0 ${baseCurrency} apps/client/src/app/pages/i18n/i18n-page.html 77 @@ -8665,7 +8761,7 @@ Your buying power exceeds ${thresholdMin} ${baseCurrency} - Your buying power exceeds ${thresholdMin} ${baseCurrency} + Ваша купівельна спроможність перевищує ${thresholdMin} ${baseCurrency} apps/client/src/app/pages/i18n/i18n-page.html 80 @@ -8673,7 +8769,7 @@ Regional Market Cluster Risks - Regional Market Cluster Risks + Ризики концентрації регіональних ринків apps/client/src/app/pages/i18n/i18n-page.html 163 @@ -8681,7 +8777,7 @@ No results found... - No results found... + Результатів не знайдено... libs/ui/src/lib/assistant/assistant.html 51 @@ -8697,7 +8793,7 @@ The developed markets contribution of your current investment (${developedMarketsValueRatio}%) exceeds ${thresholdMax}% - The developed markets contribution of your current investment (${developedMarketsValueRatio}%) exceeds ${thresholdMax}% + Частка розвинених ринків у ваших поточних інвестиціях (${developedMarketsValueRatio}%) перевищує ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 112 @@ -8705,7 +8801,7 @@ The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is below ${thresholdMin}% - The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is below ${thresholdMin}% + Частка розвинених ринків у ваших поточних інвестиціях (${developedMarketsValueRatio}%) нижча за ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 117 @@ -8713,7 +8809,7 @@ The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + Частка розвинених ринків у ваших поточних інвестиціях (${developedMarketsValueRatio}%) перебуває в межах від ${thresholdMin}% до ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 122 @@ -8721,7 +8817,7 @@ Emerging Markets - Emerging Markets + Ринки, що розвиваються apps/client/src/app/pages/i18n/i18n-page.html 127 @@ -8729,7 +8825,7 @@ The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) exceeds ${thresholdMax}% - The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) exceeds ${thresholdMax}% + Частка ринків, що розвиваються, у ваших поточних інвестиціях (${emergingMarketsValueRatio}%) перевищує ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 130 @@ -8737,7 +8833,7 @@ The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is below ${thresholdMin}% - The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is below ${thresholdMin}% + Частка ринків, що розвиваються, у ваших поточних інвестиціях (${emergingMarketsValueRatio}%) нижча за ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 135 @@ -8745,7 +8841,7 @@ The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + Частка ринків, що розвиваються, у ваших поточних інвестиціях (${emergingMarketsValueRatio}%) перебуває в межах від ${thresholdMin}% до ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 140 @@ -8753,7 +8849,7 @@ No accounts have been set up - No accounts have been set up + Жодного рахунку не налаштовано apps/client/src/app/pages/i18n/i18n-page.html 21 @@ -8761,7 +8857,7 @@ Your net worth is managed by 0 accounts - Your net worth is managed by 0 accounts + Ваш чистий капітал керується 0 рахунками apps/client/src/app/pages/i18n/i18n-page.html 33 @@ -8777,7 +8873,7 @@ The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% - The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% + Частка азійсько-тихоокеанського ринку у ваших поточних інвестиціях (${valueRatio}%) перевищує ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 167 @@ -8785,7 +8881,7 @@ The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% - The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% + Частка азійсько-тихоокеанського ринку у ваших поточних інвестиціях (${valueRatio}%) нижча за ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 171 @@ -8793,7 +8889,7 @@ The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + Частка азійсько-тихоокеанського ринку у ваших поточних інвестиціях (${valueRatio}%) перебуває в межах від ${thresholdMin}% до ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 175 @@ -8801,7 +8897,7 @@ Emerging Markets - Emerging Markets + Ринки, що розвиваються apps/client/src/app/pages/i18n/i18n-page.html 180 @@ -8809,7 +8905,7 @@ The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% - The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% + Частка ринків, що розвиваються, у ваших поточних інвестиціях (${valueRatio}%) перевищує ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 183 @@ -8817,7 +8913,7 @@ The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% - The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% + Частка ринків, що розвиваються, у ваших поточних інвестиціях (${valueRatio}%) нижча за ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 187 @@ -8825,7 +8921,7 @@ The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + Частка ринків, що розвиваються, у ваших поточних інвестиціях (${valueRatio}%) перебуває в межах від ${thresholdMin}% до ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 191 @@ -8841,7 +8937,7 @@ The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% - The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% + Частка європейського ринку у ваших поточних інвестиціях (${valueRatio}%) перевищує ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 197 @@ -8849,7 +8945,7 @@ The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% - The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% + Частка європейського ринку у ваших поточних інвестиціях (${valueRatio}%) нижча за ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 201 @@ -8857,7 +8953,7 @@ The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + Частка європейського ринку у ваших поточних інвестиціях (${valueRatio}%) перебуває в межах від ${thresholdMin}% до ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 205 @@ -8873,7 +8969,7 @@ The Japan market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% - The Japan market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% + Частка японського ринку у ваших поточних інвестиціях (${valueRatio}%) перевищує ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 211 @@ -8881,7 +8977,7 @@ The Japan market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% - The Japan market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% + Частка японського ринку у ваших поточних інвестиціях (${valueRatio}%) нижча за ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 215 @@ -8889,7 +8985,7 @@ The Japan market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - The Japan market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + Частка японського ринку у ваших поточних інвестиціях (${valueRatio}%) перебуває в межах від ${thresholdMin}% до ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 219 @@ -8897,7 +8993,7 @@ North America - North America + Північна Америка apps/client/src/app/pages/i18n/i18n-page.html 223 @@ -8905,7 +9001,7 @@ The North America market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% - The North America market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% + Частка північноамериканського ринку у ваших поточних інвестиціях (${valueRatio}%) перевищує ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 225 @@ -8913,7 +9009,7 @@ The North America market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% - The North America market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% + Частка північноамериканського ринку у ваших поточних інвестиціях (${valueRatio}%) нижча за ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 229 @@ -8921,7 +9017,7 @@ The North America market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - The North America market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + Частка північноамериканського ринку у ваших поточних інвестиціях (${valueRatio}%) перебуває в межах від ${thresholdMin}% до ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 233 @@ -8929,7 +9025,7 @@ Find Ghostfolio on GitHub - Find Ghostfolio on GitHub + Знайти Ghostfolio на GitHub apps/client/src/app/pages/about/overview/about-overview-page.html 20 @@ -8949,7 +9045,7 @@ Join the Ghostfolio Slack community - Join the Ghostfolio Slack community + Приєднатися до спільноти Ghostfolio в Slack apps/client/src/app/pages/about/overview/about-overview-page.html 78 @@ -8961,7 +9057,7 @@ Follow Ghostfolio on X (formerly Twitter) - Follow Ghostfolio on X (formerly Twitter) + Стежити за Ghostfolio в X (колишній Twitter) apps/client/src/app/pages/about/overview/about-overview-page.html 122 @@ -8969,7 +9065,7 @@ Send an e-mail - Send an e-mail + Надіслати електронний лист apps/client/src/app/pages/about/overview/about-overview-page.html 93 @@ -8981,15 +9077,15 @@ Registration Date - Registration Date + Дата реєстрації apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 56 + 58 Follow Ghostfolio on LinkedIn - Follow Ghostfolio on LinkedIn + Стежити за Ghostfolio в LinkedIn apps/client/src/app/pages/about/overview/about-overview-page.html 151 @@ -8997,7 +9093,7 @@ Ghostfolio is an independent & bootstrapped business - Ghostfolio is an independent & bootstrapped business + Ghostfolio — незалежний бізнес, що розвивається без зовнішнього фінансування apps/client/src/app/pages/about/overview/about-overview-page.html 161 @@ -9005,7 +9101,7 @@ Support Ghostfolio - Support Ghostfolio + Підтримати Ghostfolio apps/client/src/app/pages/about/overview/about-overview-page.html 170 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index c91f285a1..c674ae6fd 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -7,31 +7,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 196 + 191 libs/common/src/lib/routes/routes.ts - 197 + 192 libs/common/src/lib/routes/routes.ts - 202 + 197 libs/common/src/lib/routes/routes.ts - 210 + 205 libs/common/src/lib/routes/routes.ts - 218 + 213 libs/common/src/lib/routes/routes.ts - 226 + 221 libs/common/src/lib/routes/routes.ts - 234 + 229 @@ -39,19 +39,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 249 libs/common/src/lib/routes/routes.ts - 255 + 250 libs/common/src/lib/routes/routes.ts - 259 + 254 libs/common/src/lib/routes/routes.ts - 265 + 260 @@ -59,11 +59,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 274 + 269 libs/common/src/lib/routes/routes.ts - 275 + 270 @@ -71,11 +71,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 208 + 203 libs/common/src/lib/routes/routes.ts - 211 + 206 @@ -83,11 +83,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 279 + 274 libs/common/src/lib/routes/routes.ts - 280 + 275 @@ -95,11 +95,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 289 + 284 libs/common/src/lib/routes/routes.ts - 290 + 285 @@ -107,11 +107,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 224 + 219 libs/common/src/lib/routes/routes.ts - 227 + 222 @@ -119,11 +119,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 299 + 294 libs/common/src/lib/routes/routes.ts - 300 + 295 @@ -131,31 +131,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 299 libs/common/src/lib/routes/routes.ts - 305 + 300 libs/common/src/lib/routes/routes.ts - 310 + 305 libs/common/src/lib/routes/routes.ts - 318 + 313 libs/common/src/lib/routes/routes.ts - 326 + 321 libs/common/src/lib/routes/routes.ts - 334 + 329 libs/common/src/lib/routes/routes.ts - 342 + 337 @@ -243,7 +243,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 166 + 174 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -251,11 +251,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 5 + 7 libs/ui/src/lib/activities-table/activities-table.component.html - 183 + 197 @@ -290,7 +290,7 @@ Cash Balance apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 43 + 55 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -305,7 +305,7 @@ Platform apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 113 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -320,7 +320,7 @@ Cash Balances apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 143 + 170 @@ -342,7 +342,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 332 + 333 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -378,7 +378,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 161 + 175 libs/ui/src/lib/benchmark/benchmark.component.html @@ -415,11 +415,11 @@ Currency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 216 + 217 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 339 + 340 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -439,7 +439,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 303 + 317 @@ -474,11 +474,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 284 + 298 libs/ui/src/lib/activities-table/activities-table.component.html - 320 + 334 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -517,7 +517,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 483 + 497 @@ -532,7 +532,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 235 + 238 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -542,6 +542,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 100 + + apps/client/src/app/components/admin-users/admin-users.html + 254 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 27 @@ -556,7 +560,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 513 + 527 libs/ui/src/lib/benchmark/benchmark.component.html @@ -574,7 +578,7 @@ Paid apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 129 + 136 @@ -592,7 +596,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 486 + 487 @@ -607,7 +611,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 198 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -618,6 +622,13 @@ 20 + + Unknown + + libs/ui/src/lib/i18n.ts + 88 + + Attempts @@ -671,6 +682,13 @@ 208 + + Splits + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 512 + + View Stacktrace @@ -696,11 +714,19 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 447 + 448 Date + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 521 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 560 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 156 @@ -711,7 +737,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 206 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -733,7 +759,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 113 + 114 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -744,7 +770,7 @@ Currencies apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 133 apps/client/src/app/pages/public/public-page.html @@ -762,39 +788,39 @@ ETFs without Countries apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 138 ETFs without Sectors apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 143 An error occurred while converting the data source to . apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 482 + 522 Do you really want to delete this asset profile? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 28 + 29 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 66 + 71 Filter by... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 365 + 377 @@ -805,11 +831,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 235 + 236 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 221 + 222 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -820,7 +846,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 467 + 468 @@ -859,7 +885,7 @@ Subscription History apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 141 + 149 @@ -905,7 +931,7 @@ Healthcare libs/ui/src/lib/i18n.ts - 96 + 97 @@ -948,18 +974,18 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 280 + 281 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 270 + 271 Country apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 296 apps/client/src/app/components/admin-users/admin-users.html @@ -967,26 +993,26 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 284 + 285 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 88 + 96 Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 301 + 302 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 421 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 290 + 291 apps/client/src/app/pages/public/public-page.html @@ -997,36 +1023,36 @@ Countries apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 312 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 431 + 432 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 302 + 303 Symbol Mapping apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 410 Update Activity libs/common/src/lib/routes/routes.ts - 146 + 141 Technology libs/ui/src/lib/i18n.ts - 100 + 101 @@ -1040,21 +1066,21 @@ Total apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 160 + 168 Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 509 + 628 Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 455 + 456 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1070,7 +1096,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 370 + 384 @@ -1091,7 +1117,7 @@ Industrials libs/ui/src/lib/i18n.ts - 97 + 98 @@ -1105,7 +1131,7 @@ Name, symbol or ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 133 + 134 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1124,35 +1150,35 @@ Consumer Cyclical libs/ui/src/lib/i18n.ts - 92 + 93 Do you really want to delete this coupon? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 242 + 247 Do you really want to delete this system message? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 255 + 260 Do you really want to flush the cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 279 + 290 Please set your system message: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 299 + 310 @@ -1166,7 +1192,7 @@ per User apps/client/src/app/components/admin-overview/admin-overview.component.ts - 178 + 181 @@ -1187,35 +1213,39 @@ Read-only Mode apps/client/src/app/components/admin-overview/admin-overview.html - 64 + 63 System Message apps/client/src/app/components/admin-overview/admin-overview.html - 88 + 89 Set Message apps/client/src/app/components/admin-overview/admin-overview.html - 110 + 113 Coupons apps/client/src/app/components/admin-overview/admin-overview.html - 148 + 151 Add + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 615 + apps/client/src/app/components/admin-overview/admin-overview.html - 298 + 301 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1226,14 +1256,14 @@ Housekeeping apps/client/src/app/components/admin-overview/admin-overview.html - 117 + 120 Flush Cache apps/client/src/app/components/admin-overview/admin-overview.html - 133 + 136 @@ -1247,11 +1277,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 443 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 707 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1266,7 +1296,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 665 + 748 @@ -1294,7 +1324,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 @@ -1304,18 +1334,25 @@ 10 + + Cache has been flushed. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 281 + + Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 212 + 221 Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 218 + 227 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1323,7 +1360,7 @@ libs/ui/src/lib/tags-selector/tags-selector.component.html - 25 + 23 @@ -1391,7 +1428,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 124 + 132 @@ -1408,22 +1445,15 @@ 228 - - Delete User - - apps/client/src/app/components/admin-users/admin-users.html - 254 - - Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 641 + 724 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 644 + 727 @@ -1444,7 +1474,7 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 139 + 140 apps/client/src/app/components/header/header.component.html @@ -1460,25 +1490,25 @@ libs/common/src/lib/routes/routes.ts - 172 + 167 Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 401 + 402 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 151 + 152 Current Market Mood - apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html - 12 + libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html + 23 @@ -1523,7 +1553,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 215 + 230 @@ -1533,11 +1563,18 @@ 64 + + Split Ratio + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 526 + + Fear apps/client/src/app/components/markets/markets.component.ts - 46 + 58 libs/ui/src/lib/i18n.ts @@ -1548,7 +1585,7 @@ Greed apps/client/src/app/components/markets/markets.component.ts - 47 + 59 libs/ui/src/lib/i18n.ts @@ -1559,7 +1596,7 @@ Last Days apps/client/src/app/components/markets/markets.html - 17 + 24 @@ -1636,7 +1673,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 @@ -1654,21 +1691,21 @@ Total Amount apps/client/src/app/components/investment-chart/investment-chart.component.ts - 143 + 144 Code apps/client/src/app/components/admin-overview/admin-overview.html - 159 + 162 Savings Rate apps/client/src/app/components/investment-chart/investment-chart.component.ts - 201 + 193 @@ -1702,7 +1739,7 @@ or apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 167 + 168 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -1748,7 +1785,7 @@ Energy libs/ui/src/lib/i18n.ts - 94 + 95 @@ -1776,7 +1813,7 @@ Fees apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -1816,21 +1853,21 @@ Buying Power apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 196 + 256 Excluded from Analysis apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 270 + 286 Liabilities apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 298 + 315 apps/client/src/app/pages/features/features-page.html @@ -1841,42 +1878,42 @@ Net Worth apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 320 + 337 Annualized Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 334 + 351 Please set the amount of your emergency fund. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 135 + 145 Minimum Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 131 + 132 Maximum Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 149 + 150 Quantity apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 159 + 160 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -1884,7 +1921,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 227 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1895,7 +1932,7 @@ Report Data Glitch apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 462 + 464 @@ -2063,29 +2100,29 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 366 YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 1Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -2099,11 +2136,11 @@ 5Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -2117,11 +2154,11 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 244 + 276 libs/ui/src/lib/assistant/assistant.component.ts - 415 + 416 @@ -2160,35 +2197,28 @@ Please enter your coupon code. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 214 + 203 Could not redeem coupon code apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 178 + 181 Consumer Defensive libs/ui/src/lib/i18n.ts - 93 + 94 Coupon code has been redeemed apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 191 - - - - Reload - - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 194 @@ -2220,7 +2250,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 74 + 77 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2231,14 +2261,14 @@ Do you really want to remove this sign in method? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 303 + 314 Utilities libs/ui/src/lib/i18n.ts - 101 + 102 @@ -2266,7 +2296,7 @@ Coupon apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 134 + 141 @@ -2280,7 +2310,7 @@ Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 666 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2351,6 +2381,13 @@ 221 + + Investments + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 197 + + Biometric Authentication @@ -2465,7 +2502,7 @@ libs/common/src/lib/routes/routes.ts - 240 + 235 @@ -2480,7 +2517,7 @@ libs/common/src/lib/routes/routes.ts - 205 + 200 @@ -2495,7 +2532,7 @@ libs/common/src/lib/routes/routes.ts - 213 + 208 @@ -2510,7 +2547,7 @@ libs/common/src/lib/routes/routes.ts - 229 + 224 @@ -2565,11 +2602,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 384 + 396 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 101 + 109 apps/client/src/app/pages/accounts/accounts-page.html @@ -2588,7 +2625,7 @@ Oops, cash balance transfer has failed. apps/client/src/app/pages/accounts/accounts-page.component.ts - 358 + 355 @@ -2609,14 +2646,14 @@ Account ID apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 103 + 98 Financial Planning libs/ui/src/lib/i18n.ts - 108 + 109 @@ -2659,7 +2696,7 @@ Market Data apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 406 + 418 libs/common/src/lib/routes/routes.ts @@ -2694,9 +2731,13 @@ Overview + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 42 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 115 apps/client/src/app/components/header/header.component.html @@ -2708,7 +2749,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 47 + 48 apps/client/src/app/pages/admin/admin-page.component.ts @@ -2720,11 +2761,11 @@ libs/common/src/lib/routes/routes.ts - 113 + 108 libs/common/src/lib/routes/routes.ts - 190 + 185 @@ -2835,18 +2876,18 @@ libs/common/src/lib/routes/routes.ts - 245 + 240 Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 589 + 672 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 592 + 675 @@ -2860,7 +2901,7 @@ As you are already logged in, you cannot access the demo account. apps/client/src/app/pages/demo/demo-page.component.ts - 33 + 32 @@ -2874,7 +2915,7 @@ Duration apps/client/src/app/components/admin-overview/admin-overview.html - 172 + 175 @@ -2893,7 +2934,14 @@ libs/common/src/lib/routes/routes.ts - 271 + 266 + + + + Invalid API key + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 112 @@ -2912,7 +2960,7 @@ libs/common/src/lib/routes/routes.ts - 276 + 271 @@ -3048,18 +3096,18 @@ Creation apps/client/src/app/components/admin-overview/admin-overview.html - 185 + 188 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 150 + 158 Holdings apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 100 + 127 apps/client/src/app/components/home-holdings/home-holdings.html @@ -3067,7 +3115,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 168 apps/client/src/app/pages/public/public-page.html @@ -3079,7 +3127,7 @@ libs/common/src/lib/routes/routes.ts - 187 + 182 libs/ui/src/lib/assistant/assistant.html @@ -3101,14 +3149,14 @@ libs/common/src/lib/routes/routes.ts - 105 + 100 Markets apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 403 + 404 apps/client/src/app/components/footer/footer.component.html @@ -3118,10 +3166,6 @@ apps/client/src/app/components/header/header.component.html 408 - - apps/client/src/app/components/home-market/home-market.html - 2 - apps/client/src/app/components/markets/markets.html 2 @@ -3140,15 +3184,11 @@ libs/common/src/lib/routes/routes.ts - 100 - - - libs/common/src/lib/routes/routes.ts - 281 + 276 libs/common/src/lib/routes/routes.ts - 329 + 324 @@ -3268,7 +3308,7 @@ Basic Materials libs/ui/src/lib/i18n.ts - 90 + 91 @@ -3292,6 +3332,13 @@ 84 + + Do you really want to delete these activities? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 334 + + Why Ghostfolio? @@ -3387,7 +3434,7 @@ Oops! Could not delete the asset profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 52 + 56 @@ -3450,7 +3497,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 139 + 134 @@ -3510,7 +3557,7 @@ Convert to apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 174 + 175 @@ -3577,15 +3624,15 @@ Activities apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 84 + 103 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 111 + 138 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 244 + 245 apps/client/src/app/components/admin-overview/admin-overview.html @@ -3601,15 +3648,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 233 + 234 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 350 + 362 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 110 + 118 apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -3617,20 +3664,13 @@ libs/common/src/lib/routes/routes.ts - 149 + 144 libs/ui/src/lib/accounts-table/accounts-table.component.html 126 - - Do you really want to delete these activities? - - libs/ui/src/lib/activities-table/activities-table.component.ts - 317 - - Update activity @@ -3699,7 +3739,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 237 + 251 @@ -3710,11 +3750,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 30 libs/ui/src/lib/activities-table/activities-table.component.html - 406 + 420 @@ -3725,11 +3765,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 52 + 54 libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 434 @@ -3820,6 +3860,13 @@ 118 + + Shares After + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 584 + + Back @@ -3835,14 +3882,14 @@ Price apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 176 + 184 Do you really want to convert this asset profile to ()? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 723 + 806 @@ -3857,7 +3904,7 @@ libs/common/src/lib/routes/routes.ts - 154 + 149 @@ -3931,15 +3978,11 @@ Trial apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 133 + 140 Exclude from Analysis - - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 97 - libs/ui/src/lib/i18n.ts 22 @@ -4014,7 +4057,7 @@ libs/common/src/lib/routes/routes.ts - 159 + 154 @@ -4028,15 +4071,15 @@ Dividend apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 79 + 91 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 188 + 189 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 419 + 437 apps/client/src/app/pages/features/features-page.html @@ -4167,7 +4210,7 @@ libs/common/src/lib/routes/routes.ts - 291 + 286 @@ -4202,7 +4245,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 248 @@ -4303,7 +4346,7 @@ Expiration apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 209 + 217 @@ -4339,11 +4382,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 758 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 678 + 761 @@ -4389,7 +4432,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 296 @@ -4418,7 +4461,7 @@ libs/common/src/lib/routes/routes.ts - 349 + 344 @@ -4426,11 +4469,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 340 + 335 libs/common/src/lib/routes/routes.ts - 344 + 339 @@ -4528,7 +4571,7 @@ Coupon has been created apps/client/src/app/components/admin-overview/admin-overview.component.ts - 224 + 229 @@ -4658,7 +4701,7 @@ Stock Tracking libs/ui/src/lib/i18n.ts - 111 + 112 @@ -4679,7 +4722,7 @@ Web libs/ui/src/lib/i18n.ts - 120 + 121 @@ -4689,6 +4732,13 @@ 373 + + Data gathering has been started. + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 413 + + Global @@ -4720,14 +4770,14 @@ libs/common/src/lib/routes/routes.ts - 352 + 347 Membership apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 78 + 82 libs/common/src/lib/routes/routes.ts @@ -4795,57 +4845,61 @@ Export Activities libs/ui/src/lib/activities-table/activities-table.component.html - 64 + 72 libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 448 Export Drafts as ICS libs/ui/src/lib/activities-table/activities-table.component.html - 77 + 86 libs/ui/src/lib/activities-table/activities-table.component.html - 447 + 461 Draft libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 181 Clone libs/ui/src/lib/activities-table/activities-table.component.html - 492 + 506 Export Draft as ICS libs/ui/src/lib/activities-table/activities-table.component.html - 502 + 516 Do you really want to delete this activity? libs/ui/src/lib/activities-table/activities-table.component.ts - 327 + 333 + + + libs/ui/src/lib/activities-table/activities-table.component.ts + 344 Asset Profiles apps/client/src/app/components/admin-settings/admin-settings.component.html - 123 + 128 libs/ui/src/lib/assistant/assistant.html @@ -4954,11 +5008,11 @@ Interest apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 67 + 79 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 406 + 424 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5018,7 +5072,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 335 + 349 libs/ui/src/lib/i18n.ts @@ -5044,15 +5098,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 254 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 349 + 350 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 244 + 245 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -5075,15 +5129,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 262 + 263 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 365 + 366 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 253 + 254 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -5119,15 +5173,15 @@ Emergency Fund apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 254 + 270 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 356 + 373 apps/client/src/app/pages/features/features-page.html @@ -5188,7 +5242,7 @@ libs/ui/src/lib/i18n.ts - 98 + 99 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -5213,7 +5267,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 148 @@ -5242,7 +5296,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 186 + 187 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5250,13 +5304,20 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 322 + 323 libs/ui/src/lib/i18n.ts 35 + + Export + + libs/ui/src/lib/activities-table/activities-table.component.html + 68 + + Tag @@ -5319,7 +5380,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 275 libs/ui/src/lib/i18n.ts @@ -5355,7 +5416,7 @@ Cash apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 168 + 227 libs/ui/src/lib/i18n.ts @@ -5373,7 +5434,7 @@ Equity apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 55 + 67 libs/ui/src/lib/i18n.ts @@ -5395,14 +5456,14 @@ libs/ui/src/lib/i18n.ts - 99 + 100 Authentication apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 65 + 67 @@ -5472,7 +5533,7 @@ Communication Services libs/ui/src/lib/i18n.ts - 91 + 92 @@ -5503,6 +5564,21 @@ 79 + + Invested Capital + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 174 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 85 + + South America @@ -5594,14 +5670,14 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 766 + 850 Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 606 + 725 @@ -5669,7 +5745,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 449 + 451 @@ -5681,18 +5757,6 @@ Investment - - apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 173 - - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 60 - - - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 85 - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 101 @@ -5727,32 +5791,32 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 Week to date libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 Month to date libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -5766,11 +5830,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -5809,7 +5873,7 @@ year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5821,18 +5885,18 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 years apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -5847,11 +5911,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 263 + 258 libs/common/src/lib/routes/routes.ts - 266 + 261 @@ -5862,14 +5926,14 @@ libs/common/src/lib/routes/routes.ts - 268 + 263 Data Gathering apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 629 + 748 apps/client/src/app/components/admin-overview/admin-overview.html @@ -5880,7 +5944,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 449 @@ -5898,14 +5962,14 @@ libs/common/src/lib/routes/routes.ts - 260 + 255 Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 244 @@ -5938,16 +6002,20 @@ Activity + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 101 + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 231 + 232 Dividend Yield apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 198 + 199 @@ -5996,14 +6064,14 @@ Delete Activities libs/ui/src/lib/activities-table/activities-table.component.html - 92 + 105 Internationalization libs/common/src/lib/routes/routes.ts - 119 + 114 @@ -6017,14 +6085,14 @@ Do you really want to close your Ghostfolio account? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 229 + 244 Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 450 @@ -6059,21 +6127,21 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 134 + 129 Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 399 + 400 Oops! There was an error setting up biometric authentication. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 352 + 363 @@ -6087,7 +6155,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 128 @@ -6181,7 +6249,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 51 + 55 @@ -6216,14 +6284,14 @@ Wealth Management libs/ui/src/lib/i18n.ts - 113 + 114 View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 487 @@ -6237,7 +6305,7 @@ Family Office libs/ui/src/lib/i18n.ts - 107 + 108 @@ -6262,7 +6330,7 @@ Budgeting libs/ui/src/lib/i18n.ts - 104 + 105 @@ -6287,25 +6355,25 @@ Do you really want to delete these asset profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 67 + 72 Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 757 + 841 Cancel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 162 + 163 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 753 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6329,7 +6397,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 112 + 107 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -6356,7 +6424,7 @@ Role apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 44 + 45 @@ -6377,7 +6445,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 636 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6409,11 +6477,11 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 244 + 252 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 114 + 109 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -6491,7 +6559,7 @@ Performance with currency effect Performance apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 83 + 84 @@ -6505,14 +6573,14 @@ Tax Reporting libs/ui/src/lib/i18n.ts - 112 + 113 Change with currency effect Change apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 63 + 64 @@ -6540,7 +6608,7 @@ has been copied to the clipboard apps/client/src/app/components/admin-overview/admin-overview.component.ts - 223 + 228 libs/ui/src/lib/value/value.component.ts @@ -6562,7 +6630,7 @@ Dividend Tracking libs/ui/src/lib/i18n.ts - 105 + 106 @@ -6587,7 +6655,7 @@ Financial Services libs/ui/src/lib/i18n.ts - 95 + 96 @@ -6614,6 +6682,10 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 270 + + libs/ui/src/lib/activities-table/activities-table.component.html + 101 + cannot be self-hosted @@ -6637,6 +6709,13 @@ 278 + + Shares Before + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 597 + + cannot be used anonymously @@ -6695,7 +6774,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 188 + 197 @@ -6716,7 +6795,7 @@ Investment Research libs/ui/src/lib/i18n.ts - 109 + 110 @@ -6738,7 +6817,7 @@ libs/common/src/lib/routes/routes.ts - 313 + 308 @@ -6746,11 +6825,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 308 + 303 libs/common/src/lib/routes/routes.ts - 311 + 306 @@ -6765,7 +6844,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 316 @@ -6773,11 +6852,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 316 + 311 libs/common/src/lib/routes/routes.ts - 319 + 314 @@ -6805,28 +6884,28 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 152 + 157 Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 143 + 144 Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 178 + 187 daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 154 + 159 @@ -6851,7 +6930,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 141 @@ -6900,7 +6979,7 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 645 + 764 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6920,7 +6999,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 133 + 143 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -6932,7 +7011,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 123 + 118 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -6972,14 +7051,14 @@ Net Worth Tracking libs/ui/src/lib/i18n.ts - 110 + 111 Please enter your Ghostfolio API key. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 162 + 163 @@ -7007,63 +7086,63 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 556 + 675 Do you really want to convert the data source to ? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 485 + 525 Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 638 Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 572 + 691 Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 651 real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7077,7 +7156,7 @@ Create libs/ui/src/lib/tags-selector/tags-selector.component.html - 64 + 62 @@ -7221,7 +7300,7 @@ libs/common/src/lib/routes/routes.ts - 237 + 232 @@ -7229,11 +7308,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 232 + 227 libs/common/src/lib/routes/routes.ts - 235 + 230 @@ -7254,21 +7333,21 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 718 + 801 An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 721 + 804 Apply apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 155 @@ -7318,7 +7397,7 @@ libs/common/src/lib/routes/routes.ts - 110 + 105 @@ -7328,6 +7407,17 @@ 142 + + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 102 + + Log out @@ -7337,13 +7427,9 @@ Calculations are based on delayed market data and may not be displayed in real-time. - - apps/client/src/app/components/home-market/home-market.html - 28 - apps/client/src/app/components/markets/markets.html - 54 + 64 @@ -7351,32 +7437,32 @@ kebab-case libs/common/src/lib/routes/routes.ts - 200 + 195 libs/common/src/lib/routes/routes.ts - 203 + 198 Sync Demo User Account apps/client/src/app/components/admin-overview/admin-overview.html - 128 + 131 ETF Tracking libs/ui/src/lib/i18n.ts - 106 + 107 Demo user account has been synced. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 323 + 334 @@ -7440,14 +7526,14 @@ libs/common/src/lib/routes/routes.ts - 251 + 246 Open Source Alternative to libs/common/src/lib/routes/routes.ts - 346 + 341 @@ -7476,15 +7562,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 332 + 327 libs/common/src/lib/routes/routes.ts - 335 + 330 libs/common/src/lib/routes/routes.ts - 343 + 338 @@ -7492,11 +7578,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 324 + 319 libs/common/src/lib/routes/routes.ts - 327 + 322 @@ -7567,7 +7653,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 @@ -7694,11 +7780,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 356 + 351 libs/common/src/lib/routes/routes.ts - 357 + 352 @@ -7726,7 +7812,7 @@ Cryptocurrencies apps/client/src/app/components/markets/markets.component.ts - 52 + 55 apps/client/src/app/pages/features/features-page.html @@ -7737,7 +7823,7 @@ Stocks apps/client/src/app/components/markets/markets.component.ts - 51 + 54 apps/client/src/app/pages/features/features-page.html @@ -7748,7 +7834,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 479 @@ -7773,7 +7859,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 101 + 102 @@ -8125,7 +8211,7 @@ Registration Date apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 56 + 58 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 06cc8c09e..b9bd4d51f 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -8,31 +8,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 196 + 191 libs/common/src/lib/routes/routes.ts - 197 + 192 libs/common/src/lib/routes/routes.ts - 202 + 197 libs/common/src/lib/routes/routes.ts - 210 + 205 libs/common/src/lib/routes/routes.ts - 218 + 213 libs/common/src/lib/routes/routes.ts - 226 + 221 libs/common/src/lib/routes/routes.ts - 234 + 229 @@ -41,19 +41,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 249 libs/common/src/lib/routes/routes.ts - 255 + 250 libs/common/src/lib/routes/routes.ts - 259 + 254 libs/common/src/lib/routes/routes.ts - 265 + 260 @@ -62,11 +62,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 274 + 269 libs/common/src/lib/routes/routes.ts - 275 + 270 @@ -75,11 +75,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 208 + 203 libs/common/src/lib/routes/routes.ts - 211 + 206 @@ -88,11 +88,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 279 + 274 libs/common/src/lib/routes/routes.ts - 280 + 275 @@ -101,11 +101,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 289 + 284 libs/common/src/lib/routes/routes.ts - 290 + 285 @@ -114,11 +114,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 224 + 219 libs/common/src/lib/routes/routes.ts - 227 + 222 @@ -127,11 +127,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 299 + 294 libs/common/src/lib/routes/routes.ts - 300 + 295 @@ -140,31 +140,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 299 libs/common/src/lib/routes/routes.ts - 305 + 300 libs/common/src/lib/routes/routes.ts - 310 + 305 libs/common/src/lib/routes/routes.ts - 318 + 313 libs/common/src/lib/routes/routes.ts - 326 + 321 libs/common/src/lib/routes/routes.ts - 334 + 329 libs/common/src/lib/routes/routes.ts - 342 + 337 @@ -260,7 +260,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 166 + 174 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -268,11 +268,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 5 + 7 libs/ui/src/lib/activities-table/activities-table.component.html - 183 + 197 @@ -312,7 +312,7 @@ 现金余额 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 43 + 55 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -328,7 +328,7 @@ 平台 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 88 + 113 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -344,7 +344,7 @@ 现金余额 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 143 + 170 @@ -368,7 +368,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 332 + 333 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -404,7 +404,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 161 + 175 libs/ui/src/lib/benchmark/benchmark.component.html @@ -433,7 +433,7 @@ Copy - Copy + 复制 libs/ui/src/lib/notifications/alert-dialog/alert-dialog.html 20 @@ -444,11 +444,11 @@ 货币 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 216 + 217 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 339 + 340 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -468,7 +468,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 303 + 317 @@ -504,11 +504,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 284 + 298 libs/ui/src/lib/activities-table/activities-table.component.html - 320 + 334 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -548,7 +548,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 483 + 497 @@ -564,7 +564,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 235 + 238 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -574,6 +574,10 @@ apps/client/src/app/components/admin-tag/admin-tag.component.html 100 + + apps/client/src/app/components/admin-users/admin-users.html + 254 + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 27 @@ -588,7 +592,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 513 + 527 libs/ui/src/lib/benchmark/benchmark.component.html @@ -605,10 +609,10 @@ Paid - Paid + 付费 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 129 + 136 @@ -628,7 +632,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 486 + 487 @@ -644,7 +648,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 197 + 198 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -655,6 +659,14 @@ 20 + + Unknown + 未知 + + libs/ui/src/lib/i18n.ts + 88 + + Attempts 尝试次数 @@ -693,7 +705,7 @@ and is driven by the efforts of its contributors - 并且得益于其 贡献者 + 并且得益于其 贡献者 apps/client/src/app/pages/about/overview/about-overview-page.html 50 @@ -715,6 +727,14 @@ 208 + + Splits + Splits + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 512 + + View Stacktrace 查看堆栈跟踪 @@ -741,15 +761,23 @@ Find an account... - Find an account... + 查找账户... libs/ui/src/lib/assistant/assistant.component.ts - 447 + 448 Date 日期 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 521 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 560 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 156 @@ -760,7 +788,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 206 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -769,7 +797,7 @@ Watch the Ghostfol.io Trailer on YouTube - Watch the Ghostfol.io Trailer on YouTube + 在 YouTube 上观看 Ghostfol.io 预告片 apps/client/src/app/pages/landing/landing-page.html 19 @@ -784,7 +812,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 113 + 114 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -796,7 +824,7 @@ 货币 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 133 apps/client/src/app/pages/public/public-page.html @@ -805,7 +833,7 @@ Category - Category + 类别 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 77 @@ -816,7 +844,7 @@ 没有国家的 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 138 @@ -824,15 +852,15 @@ 无行业类别的 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 143 An error occurred while converting the data source to . - An error occurred while converting the data source to . + 将数据源转换为 时发生错误。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 482 + 522 @@ -840,11 +868,11 @@ 您确实要删除此资产配置文件吗? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 28 + 29 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 66 + 71 @@ -852,7 +880,7 @@ 过滤... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 365 + 377 @@ -864,11 +892,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 235 + 236 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 221 + 222 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -877,10 +905,10 @@ Data Gathering Frequency - Data Gathering Frequency + 数据采集频率 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 467 + 468 @@ -913,7 +941,7 @@ Apply current market price - Apply current market price + 应用当前市场价格 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 238 @@ -921,10 +949,10 @@ Subscription History - Subscription History + 订阅历史 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 141 + 149 @@ -957,10 +985,10 @@ Healthcare - Healthcare + 医疗保健 libs/ui/src/lib/i18n.ts - 96 + 97 @@ -1000,11 +1028,11 @@ 行业 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 280 + 281 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 270 + 271 @@ -1012,7 +1040,7 @@ 国家 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 295 + 296 apps/client/src/app/components/admin-users/admin-users.html @@ -1020,11 +1048,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 284 + 285 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 88 + 96 @@ -1032,15 +1060,15 @@ 行业 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 301 + 302 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 421 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 290 + 291 apps/client/src/app/pages/public/public-page.html @@ -1052,15 +1080,15 @@ 国家 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 312 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 431 + 432 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 302 + 303 @@ -1068,23 +1096,23 @@ 代码映射 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 410 Update Activity - Update Activity + 更新活动 libs/common/src/lib/routes/routes.ts - 146 + 141 Technology - Technology + 科技 libs/ui/src/lib/i18n.ts - 100 + 101 @@ -1097,10 +1125,10 @@ Total - Total + 总计 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 160 + 168 @@ -1108,7 +1136,7 @@ 刮削配置 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 509 + 628 @@ -1116,7 +1144,7 @@ 笔记 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 455 + 456 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1132,7 +1160,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 370 + 384 @@ -1153,10 +1181,10 @@ Industrials - Industrials + 工业 libs/ui/src/lib/i18n.ts - 97 + 98 @@ -1172,7 +1200,7 @@ 名称、代码或 ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 133 + 134 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1189,10 +1217,10 @@ Consumer Cyclical - Consumer Cyclical + 非必需消费品 libs/ui/src/lib/i18n.ts - 92 + 93 @@ -1200,7 +1228,7 @@ 您确实要删除此优惠券吗? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 242 + 247 @@ -1208,7 +1236,7 @@ 您真的要删除这条系统消息吗? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 255 + 260 @@ -1216,7 +1244,7 @@ 您真的要刷新缓存吗? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 279 + 290 @@ -1224,7 +1252,7 @@ 请设置您的系统消息: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 299 + 310 @@ -1240,7 +1268,7 @@ 每位用户 apps/client/src/app/components/admin-overview/admin-overview.component.ts - 178 + 181 @@ -1264,7 +1292,7 @@ 只读模式 apps/client/src/app/components/admin-overview/admin-overview.html - 64 + 63 @@ -1272,7 +1300,7 @@ 系统信息 apps/client/src/app/components/admin-overview/admin-overview.html - 88 + 89 @@ -1280,7 +1308,7 @@ 设置留言 apps/client/src/app/components/admin-overview/admin-overview.html - 110 + 113 @@ -1288,15 +1316,19 @@ 优惠券 apps/client/src/app/components/admin-overview/admin-overview.html - 148 + 151 Add 添加 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 615 + apps/client/src/app/components/admin-overview/admin-overview.html - 298 + 301 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1308,7 +1340,7 @@ 维护 apps/client/src/app/components/admin-overview/admin-overview.html - 117 + 120 @@ -1316,7 +1348,7 @@ 刷新缓存 apps/client/src/app/components/admin-overview/admin-overview.html - 133 + 136 @@ -1332,11 +1364,11 @@ 网址 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 443 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 588 + 707 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1352,7 +1384,7 @@ 资产概况已保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 665 + 748 @@ -1384,7 +1416,7 @@ 当前年份 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 @@ -1395,12 +1427,20 @@ 10 + + Cache has been flushed. + Cache has been flushed. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 281 + + Platforms 平台 apps/client/src/app/components/admin-settings/admin-settings.component.html - 212 + 221 @@ -1408,7 +1448,7 @@ 标签 apps/client/src/app/components/admin-settings/admin-settings.component.html - 218 + 227 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1416,7 +1456,7 @@ libs/ui/src/lib/tags-selector/tags-selector.component.html - 25 + 23 @@ -1492,7 +1532,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 124 + 132 @@ -1511,24 +1551,16 @@ 228 - - Delete User - 删除用户 - - apps/client/src/app/components/admin-users/admin-users.html - 254 - - Could not validate form 无法验证表单 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 641 + 724 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 644 + 727 @@ -1552,7 +1584,7 @@ 投资组合 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 139 + 140 apps/client/src/app/components/header/header.component.html @@ -1568,7 +1600,7 @@ libs/common/src/lib/routes/routes.ts - 172 + 167 @@ -1576,19 +1608,19 @@ 基准 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 401 + 402 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 151 + 152 Current Market Mood 当前市场情绪 - apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html - 12 + libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html + 23 @@ -1636,7 +1668,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 215 + 230 @@ -1647,12 +1679,20 @@ 64 + + Split Ratio + Split Ratio + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 526 + + Fear 恐惧 apps/client/src/app/components/markets/markets.component.ts - 46 + 58 libs/ui/src/lib/i18n.ts @@ -1664,7 +1704,7 @@ 贪婪 apps/client/src/app/components/markets/markets.component.ts - 47 + 59 libs/ui/src/lib/i18n.ts @@ -1676,7 +1716,7 @@ 最后的 apps/client/src/app/components/markets/markets.html - 17 + 24 @@ -1697,7 +1737,7 @@ The source code is fully available as open source software (OSS) under the AGPL-3.0 license - 源代码完全可用,作为开源软件 (OSS),遵循AGPL-3.0许可证 + 源代码完全可用,作为开源软件 (OSS),遵循AGPL-3.0许可证 apps/client/src/app/pages/about/overview/about-overview-page.html 16 @@ -1764,7 +1804,7 @@ 当前周 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 @@ -1784,7 +1824,7 @@ 总金额 apps/client/src/app/components/investment-chart/investment-chart.component.ts - 143 + 144 @@ -1792,7 +1832,7 @@ 代码 apps/client/src/app/components/admin-overview/admin-overview.html - 159 + 162 @@ -1800,7 +1840,7 @@ 储蓄率 apps/client/src/app/components/investment-chart/investment-chart.component.ts - 201 + 193 @@ -1836,7 +1876,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 167 + 168 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -1881,10 +1921,10 @@ Energy - Energy + 能源 libs/ui/src/lib/i18n.ts - 94 + 95 @@ -1916,7 +1956,7 @@ 费用 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -1960,7 +2000,7 @@ 购买力 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 196 + 256 @@ -1968,7 +2008,7 @@ 从分析中排除 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 270 + 286 @@ -1976,7 +2016,7 @@ 负债 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 298 + 315 apps/client/src/app/pages/features/features-page.html @@ -1988,7 +2028,7 @@ 净值 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 320 + 337 @@ -1996,7 +2036,7 @@ 年化业绩 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 334 + 351 @@ -2004,7 +2044,7 @@ 请输入您的应急基金金额。 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 135 + 145 @@ -2012,7 +2052,7 @@ 最低价格 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 131 + 132 @@ -2020,7 +2060,7 @@ 最高价格 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 149 + 150 @@ -2028,7 +2068,7 @@ 数量 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 159 + 160 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -2036,7 +2076,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 227 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2048,7 +2088,7 @@ 报告数据故障 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 462 + 464 @@ -2228,7 +2268,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 366 @@ -2236,11 +2276,11 @@ 年初至今 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 264 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -2248,16 +2288,16 @@ 1年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 Ghostfolio in Numbers: Monthly Active Users (MAU) - Ghostfolio in Numbers: Monthly Active Users (MAU) + Ghostfolio 数据:月活跃用户数 (MAU) apps/client/src/app/pages/landing/landing-page.html 63 @@ -2268,11 +2308,11 @@ 5年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -2288,16 +2328,16 @@ 最大限度 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 244 + 276 libs/ui/src/lib/assistant/assistant.component.ts - 415 + 416 The value has been copied to the clipboard - The value has been copied to the clipboard + 该值已复制到剪贴板 libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 @@ -2336,7 +2376,7 @@ 请输入您的优惠券代码。 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 214 + 203 @@ -2344,15 +2384,15 @@ 无法兑换优惠券代码 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 178 + 181 Consumer Defensive - Consumer Defensive + 必需消费品 libs/ui/src/lib/i18n.ts - 93 + 94 @@ -2360,15 +2400,7 @@ 优惠券代码已被兑换 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 191 - - - - Reload - 重新加载 - - apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 194 @@ -2404,7 +2436,7 @@ 自动 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 74 + 77 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2416,15 +2448,15 @@ 您确实要删除此登录方法吗? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 303 + 314 Utilities - Utilities + 公用事业 libs/ui/src/lib/i18n.ts - 101 + 102 @@ -2453,10 +2485,10 @@ Coupon - Coupon + 优惠券 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 134 + 141 @@ -2472,7 +2504,7 @@ 语言环境 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 666 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2489,7 +2521,7 @@ Close Account - Close Account + 关闭账户 apps/client/src/app/components/user-account-settings/user-account-settings.html 337 @@ -2509,7 +2541,7 @@ Contributors to Ghostfolio - Contributors to Ghostfolio + Ghostfolio 贡献者 apps/client/src/app/pages/about/overview/about-overview-page.html 54 @@ -2551,6 +2583,14 @@ 221 + + Investments + 投资 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 197 + + Biometric Authentication 生物识别认证 @@ -2676,7 +2716,7 @@ libs/common/src/lib/routes/routes.ts - 240 + 235 @@ -2692,7 +2732,7 @@ libs/common/src/lib/routes/routes.ts - 205 + 200 @@ -2708,7 +2748,7 @@ libs/common/src/lib/routes/routes.ts - 213 + 208 @@ -2724,7 +2764,7 @@ libs/common/src/lib/routes/routes.ts - 229 + 224 @@ -2784,11 +2824,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 384 + 396 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 101 + 109 apps/client/src/app/pages/accounts/accounts-page.html @@ -2808,7 +2848,7 @@ 糟糕,现金余额转账失败。 apps/client/src/app/pages/accounts/accounts-page.component.ts - 358 + 355 @@ -2832,15 +2872,15 @@ 帐户ID apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 103 + 98 Financial Planning - Financial Planning + 财务规划 libs/ui/src/lib/i18n.ts - 108 + 109 @@ -2888,7 +2928,7 @@ 市场数据 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 406 + 418 libs/common/src/lib/routes/routes.ts @@ -2926,9 +2966,13 @@ Overview 概述 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 42 + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 114 + 115 apps/client/src/app/components/header/header.component.html @@ -2940,7 +2984,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 47 + 48 apps/client/src/app/pages/admin/admin-page.component.ts @@ -2952,11 +2996,11 @@ libs/common/src/lib/routes/routes.ts - 113 + 108 libs/common/src/lib/routes/routes.ts - 190 + 185 @@ -3068,7 +3112,7 @@ libs/common/src/lib/routes/routes.ts - 245 + 240 @@ -3076,11 +3120,11 @@ 无法解析抓取器配置 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 589 + 672 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 592 + 675 @@ -3096,12 +3140,12 @@ 由于您已经登录,因此无法访问模拟帐户。 apps/client/src/app/pages/demo/demo-page.component.ts - 33 + 32 popular - popular + 热门 apps/client/src/app/components/admin-settings/admin-settings.component.html 79 @@ -3112,7 +3156,7 @@ 持续时间 apps/client/src/app/components/admin-overview/admin-overview.html - 172 + 175 @@ -3132,7 +3176,15 @@ libs/common/src/lib/routes/routes.ts - 271 + 266 + + + + Invalid API key + 无效的 API 密钥 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 112 @@ -3152,7 +3204,7 @@ libs/common/src/lib/routes/routes.ts - 276 + 271 @@ -3173,7 +3225,7 @@ For security reasons, please delete all activities and accounts first before your Ghostfolio account can be closed. - For security reasons, please delete all activities and accounts first before your Ghostfolio account can be closed. + 出于安全原因,在关闭您的 Ghostfolio 账户之前,请先删除所有活动和账户。 apps/client/src/app/components/user-account-settings/user-account-settings.html 348 @@ -3301,14 +3353,14 @@ Creation - Creation + 创建时间 apps/client/src/app/components/admin-overview/admin-overview.html - 185 + 188 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 150 + 158 @@ -3316,7 +3368,7 @@ 持仓 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 100 + 127 apps/client/src/app/components/home-holdings/home-holdings.html @@ -3324,7 +3376,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 226 + 168 apps/client/src/app/pages/public/public-page.html @@ -3336,7 +3388,7 @@ libs/common/src/lib/routes/routes.ts - 187 + 182 libs/ui/src/lib/assistant/assistant.html @@ -3345,7 +3397,7 @@ just now - just now + 刚刚 apps/client/src/app/components/admin-users/admin-users.component.ts 221 @@ -3360,7 +3412,7 @@ libs/common/src/lib/routes/routes.ts - 105 + 100 @@ -3368,7 +3420,7 @@ 市场 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 403 + 404 apps/client/src/app/components/footer/footer.component.html @@ -3378,10 +3430,6 @@ apps/client/src/app/components/header/header.component.html 408 - - apps/client/src/app/components/home-market/home-market.html - 2 - apps/client/src/app/components/markets/markets.html 2 @@ -3400,15 +3448,11 @@ libs/common/src/lib/routes/routes.ts - 100 - - - libs/common/src/lib/routes/routes.ts - 281 + 276 libs/common/src/lib/routes/routes.ts - 329 + 324 @@ -3541,10 +3585,10 @@ Basic Materials - Basic Materials + 基础材料 libs/ui/src/lib/i18n.ts - 90 + 91 @@ -3571,6 +3615,14 @@ 84 + + Do you really want to delete these activities? + Do you really want to delete these activities? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 334 + + Why Ghostfolio? 为什么使用Ghostfolio @@ -3677,10 +3729,10 @@ Oops! Could not delete the asset profiles. - Oops! Could not delete the asset profiles. + 哎呀!无法删除资产概况。 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 52 + 56 @@ -3749,10 +3801,10 @@ Add Activity - Add Activity + 添加活动 libs/common/src/lib/routes/routes.ts - 139 + 134 @@ -3773,7 +3825,7 @@ At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software (OSS) under the AGPL-3.0 license and we openly share aggregated key metrics of the platform’s operational status. - 在 Ghostfolio,透明度是我们价值观的核心。我们将源代码发布为开源软件(OSS)下AGPL-3.0许可证我们公开分享平台运营状态的汇总关键指标。 + 在 Ghostfolio,透明度是我们价值观的核心。我们将源代码发布为开源软件(OSS)下AGPL-3.0许可证我们公开分享平台运营状态的汇总关键指标。 apps/client/src/app/pages/open/open-page.html 7 @@ -3817,10 +3869,10 @@ Convert to - Convert to + 转换为 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 174 + 175 @@ -3869,7 +3921,7 @@ Available on - Available on + 适用于 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 130 @@ -3896,15 +3948,15 @@ 活动 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 84 + 103 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 111 + 138 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 244 + 245 apps/client/src/app/components/admin-overview/admin-overview.html @@ -3920,15 +3972,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 233 + 234 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 350 + 362 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 110 + 118 apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -3936,21 +3988,13 @@ libs/common/src/lib/routes/routes.ts - 149 + 144 libs/ui/src/lib/accounts-table/accounts-table.component.html 126 - - Do you really want to delete these activities? - 您确定要删除这些活动吗? - - libs/ui/src/lib/activities-table/activities-table.component.ts - 317 - - Update activity 更新活动 @@ -4028,7 +4072,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 237 + 251 @@ -4040,11 +4084,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 30 libs/ui/src/lib/activities-table/activities-table.component.html - 406 + 420 @@ -4056,11 +4100,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 52 + 54 libs/ui/src/lib/activities-table/activities-table.component.html - 420 + 434 @@ -4163,6 +4207,14 @@ 118 + + Shares After + Shares After + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 584 + + Back 后退 @@ -4177,18 +4229,18 @@ Price - Price + 价格 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 176 + 184 Do you really want to convert this asset profile to ()? - Do you really want to convert this asset profile to ()? + 您确定要把此资产概况转换为 () 吗? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 723 + 806 @@ -4204,7 +4256,7 @@ libs/common/src/lib/routes/routes.ts - 154 + 149 @@ -4285,19 +4337,15 @@ Trial - Trial + 试用 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts - 133 + 140 Exclude from Analysis 排除在分析之外 - - apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 97 - libs/ui/src/lib/i18n.ts 22 @@ -4380,7 +4428,7 @@ libs/common/src/lib/routes/routes.ts - 159 + 154 @@ -4396,15 +4444,15 @@ 股息 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 79 + 91 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 188 + 189 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 419 + 437 apps/client/src/app/pages/features/features-page.html @@ -4548,7 +4596,7 @@ libs/common/src/lib/routes/routes.ts - 291 + 286 @@ -4585,10 +4633,10 @@ Hourly - Hourly + 每小时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 248 @@ -4697,10 +4745,10 @@ Expiration - Expiration + 到期时间 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 209 + 217 @@ -4740,11 +4788,11 @@ 无法保存资产概况 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 758 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 678 + 761 @@ -4796,7 +4844,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 296 @@ -4828,7 +4876,7 @@ libs/common/src/lib/routes/routes.ts - 349 + 344 @@ -4837,11 +4885,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 340 + 335 libs/common/src/lib/routes/routes.ts - 344 + 339 @@ -4950,10 +4998,10 @@ Coupon has been created - Coupon has been created + 优惠券 已创建 apps/client/src/app/components/admin-overview/admin-overview.component.ts - 224 + 229 @@ -5002,7 +5050,7 @@ Upgrade to Ghostfolio Premium - Upgrade to Ghostfolio Premium + 升级至 Ghostfolio Premium libs/ui/src/lib/premium-indicator/premium-indicator.component.html 4 @@ -5090,10 +5138,10 @@ Stock Tracking - Stock Tracking + 股票追踪 libs/ui/src/lib/i18n.ts - 111 + 112 @@ -5114,10 +5162,10 @@ Web - Web + 网页 libs/ui/src/lib/i18n.ts - 120 + 121 @@ -5128,6 +5176,14 @@ 373 + + Data gathering has been started. + Data gathering has been started. + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 413 + + Global 全球的 @@ -5161,7 +5217,7 @@ libs/common/src/lib/routes/routes.ts - 352 + 347 @@ -5169,7 +5225,7 @@ 会员资格 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 78 + 82 libs/common/src/lib/routes/routes.ts @@ -5245,11 +5301,11 @@ 导出活动记录 libs/ui/src/lib/activities-table/activities-table.component.html - 64 + 72 libs/ui/src/lib/activities-table/activities-table.component.html - 434 + 448 @@ -5257,11 +5313,11 @@ 将汇票导出为 ICS libs/ui/src/lib/activities-table/activities-table.component.html - 77 + 86 libs/ui/src/lib/activities-table/activities-table.component.html - 447 + 461 @@ -5269,7 +5325,7 @@ 草稿 libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 181 @@ -5277,7 +5333,7 @@ 克隆 libs/ui/src/lib/activities-table/activities-table.component.html - 492 + 506 @@ -5285,7 +5341,7 @@ 将汇票导出为 ICS libs/ui/src/lib/activities-table/activities-table.component.html - 502 + 516 @@ -5293,7 +5349,11 @@ 您确实要删除此活动吗? libs/ui/src/lib/activities-table/activities-table.component.ts - 327 + 333 + + + libs/ui/src/lib/activities-table/activities-table.component.ts + 344 @@ -5301,7 +5361,7 @@ 资产概况 apps/client/src/app/components/admin-settings/admin-settings.component.html - 123 + 128 libs/ui/src/lib/assistant/assistant.html @@ -5310,7 +5370,7 @@ Portfolio Filters - Portfolio Filters + 组合筛选器 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 63 @@ -5366,7 +5426,7 @@ {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} - {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + {VAR_PLURAL, plural, =1 {个资产概况} other {个资产概况}} apps/client/src/app/components/admin-market-data/admin-market-data.html 275 @@ -5425,11 +5485,11 @@ 利息 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 67 + 79 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 406 + 424 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5493,7 +5553,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 335 + 349 libs/ui/src/lib/i18n.ts @@ -5521,15 +5581,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 253 + 254 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 349 + 350 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 244 + 245 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -5553,15 +5613,15 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 262 + 263 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 365 + 366 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 253 + 254 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -5601,15 +5661,15 @@ 应急基金 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 210 + 211 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 254 + 270 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 356 + 373 apps/client/src/app/pages/features/features-page.html @@ -5677,7 +5737,7 @@ libs/ui/src/lib/i18n.ts - 98 + 99 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -5686,7 +5746,7 @@ Ghostfolio in Numbers: Pulls on Docker Hub - Ghostfolio in Numbers: Pulls on Docker Hub + Ghostfolio 数据:Docker Hub 下载量 apps/client/src/app/pages/landing/landing-page.html 101 @@ -5705,7 +5765,7 @@ 暂无活动 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 148 @@ -5737,7 +5797,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 186 + 187 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5745,13 +5805,21 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 322 + 323 libs/ui/src/lib/i18n.ts 35 + + Export + Export + + libs/ui/src/lib/activities-table/activities-table.component.html + 68 + + Tag 标签 @@ -5821,7 +5889,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 261 + 275 libs/ui/src/lib/i18n.ts @@ -5861,7 +5929,7 @@ 现金 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 168 + 227 libs/ui/src/lib/i18n.ts @@ -5881,7 +5949,7 @@ 股权 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 55 + 67 libs/ui/src/lib/i18n.ts @@ -5905,7 +5973,7 @@ libs/ui/src/lib/i18n.ts - 99 + 100 @@ -5913,7 +5981,7 @@ 认证 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 65 + 67 @@ -5990,10 +6058,10 @@ Communication Services - Communication Services + 通信服务 libs/ui/src/lib/i18n.ts - 91 + 92 @@ -6028,6 +6096,22 @@ 79 + + Invested Capital + 投入资本 + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 174 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 85 + + South America 南美洲 @@ -6129,7 +6213,7 @@ 当前市场价格为 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 766 + 850 @@ -6137,7 +6221,7 @@ 测试 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 606 + 725 @@ -6213,7 +6297,7 @@ 关闭持仓 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 449 + 451 @@ -6227,18 +6311,6 @@ Investment 投资 - - apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 173 - - - apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 60 - - - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 85 - apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 101 @@ -6277,7 +6349,7 @@ 今年迄今为止 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 378 @@ -6285,7 +6357,7 @@ 本周至今 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6293,7 +6365,7 @@ 本月至今 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 @@ -6301,16 +6373,16 @@ 本月至今 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 374 Expires () - Expires () + 到期时间 () apps/client/src/app/components/admin-users/admin-users.html 34 @@ -6321,11 +6393,11 @@ 本周至今 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 256 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 370 @@ -6350,7 +6422,7 @@ Fetch market price - Fetch market price + 获取市场价格 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html 40 @@ -6369,7 +6441,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 268 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6381,7 +6453,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 388 @@ -6389,11 +6461,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 272 libs/ui/src/lib/assistant/assistant.component.ts - 409 + 410 @@ -6410,11 +6482,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 263 + 258 libs/common/src/lib/routes/routes.ts - 266 + 261 @@ -6426,7 +6498,7 @@ libs/common/src/lib/routes/routes.ts - 268 + 263 @@ -6434,7 +6506,7 @@ 数据收集 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 629 + 748 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6443,10 +6515,10 @@ Find a holding... - Find a holding... + 查找持仓... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 449 @@ -6466,15 +6538,15 @@ libs/common/src/lib/routes/routes.ts - 260 + 255 Daily - Daily + 每天 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 244 @@ -6512,9 +6584,13 @@ Activity 活动 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 101 + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 231 + 232 @@ -6522,7 +6598,7 @@ 股息收益率 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 198 + 199 @@ -6578,7 +6654,7 @@ 删除活动 libs/ui/src/lib/activities-table/activities-table.component.html - 92 + 105 @@ -6586,7 +6662,7 @@ 国际化 libs/common/src/lib/routes/routes.ts - 119 + 114 @@ -6594,15 +6670,15 @@ 您确定要关闭您的 Ghostfolio 账户吗? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 229 + 244 Jump to a page... - Jump to a page... + 跳转到页面... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 450 @@ -6647,10 +6723,10 @@ Clone Activity - Clone Activity + 克隆活动 libs/common/src/lib/routes/routes.ts - 134 + 129 @@ -6658,7 +6734,7 @@ 包含在 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 399 + 400 @@ -6666,7 +6742,7 @@ 哎呀!设置生物识别认证时发生错误。 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 352 + 363 @@ -6682,7 +6758,7 @@ 基准 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 128 @@ -6730,7 +6806,7 @@ 预算管理 libs/ui/src/lib/i18n.ts - 104 + 105 @@ -6795,10 +6871,10 @@ Oops! Could not delete the asset profile. - Oops! Could not delete the asset profile. + 哎呀!无法删除资产概况。 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 51 + 55 @@ -6806,7 +6882,7 @@ 家族办公室 libs/ui/src/lib/i18n.ts - 107 + 108 @@ -6886,7 +6962,7 @@ 财富管理 libs/ui/src/lib/i18n.ts - 113 + 114 @@ -6894,15 +6970,15 @@ 查看持仓 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 487 Do you really want to delete these asset profiles? - Do you really want to delete these asset profiles? + 您确定要删除这 个资产概况吗? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 67 + 72 @@ -6910,7 +6986,7 @@ 错误 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 757 + 841 @@ -6950,11 +7026,11 @@ 取消 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 162 + 163 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 753 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6978,7 +7054,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 112 + 107 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7006,7 +7082,7 @@ 关闭 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 636 + 755 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7038,11 +7114,11 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 244 + 252 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 114 + 109 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7058,7 +7134,7 @@ 角色 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 44 + 45 @@ -7079,10 +7155,10 @@ Tax Reporting - Tax Reporting + 税务报告 libs/ui/src/lib/i18n.ts - 112 + 113 @@ -7095,10 +7171,10 @@ Change with currency effect Change - 含货币影响的涨跌 涨跌 + 含货币影响的涨跌 涨跌 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 63 + 64 @@ -7111,10 +7187,10 @@ Performance with currency effect Performance - 含货币影响的表现 表现 + 含货币影响的表现 表现 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 83 + 84 @@ -7159,10 +7235,10 @@ has been copied to the clipboard - 已复制到剪贴板 + 已复制到剪贴板 apps/client/src/app/components/admin-overview/admin-overview.component.ts - 223 + 228 libs/ui/src/lib/value/value.component.ts @@ -7179,7 +7255,7 @@ Compare Ghostfolio to - - Compare Ghostfolio to - + 对比 Ghostfolio 与 - apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html 32 @@ -7227,10 +7303,10 @@ Financial Services - Financial Services + 金融服务 libs/ui/src/lib/i18n.ts - 95 + 96 @@ -7255,11 +7331,15 @@ Delete - Delete + 删除 apps/client/src/app/components/admin-market-data/admin-market-data.html 270 + + libs/ui/src/lib/activities-table/activities-table.component.html + 101 + cannot be self-hosted @@ -7285,6 +7365,14 @@ 278 + + Shares Before + Shares Before + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 597 + + cannot be used anonymously 无法匿名使用 @@ -7311,10 +7399,10 @@ Dividend Tracking - Dividend Tracking + 股息追踪 libs/ui/src/lib/i18n.ts - 105 + 106 @@ -7358,7 +7446,7 @@ 设置 API 密钥 apps/client/src/app/components/admin-settings/admin-settings.component.html - 188 + 197 @@ -7371,10 +7459,10 @@ Investment Research - Investment Research + 投资研究 libs/ui/src/lib/i18n.ts - 109 + 110 @@ -7398,7 +7486,7 @@ libs/common/src/lib/routes/routes.ts - 313 + 308 @@ -7414,7 +7502,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 316 @@ -7423,11 +7511,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 316 + 311 libs/common/src/lib/routes/routes.ts - 319 + 314 @@ -7436,11 +7524,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 308 + 303 libs/common/src/lib/routes/routes.ts - 311 + 306 @@ -7464,7 +7552,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html - 152 + 157 @@ -7472,7 +7560,7 @@ 每日请求 apps/client/src/app/components/admin-settings/admin-settings.component.html - 154 + 159 @@ -7480,7 +7568,7 @@ 移除 API 密钥 apps/client/src/app/components/admin-settings/admin-settings.component.html - 178 + 187 @@ -7488,7 +7576,7 @@ 您确定要删除此 API 密钥吗? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 143 + 144 @@ -7508,7 +7596,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 141 @@ -7580,7 +7668,7 @@ 保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 645 + 764 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7600,7 +7688,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 133 + 143 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7612,7 +7700,7 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 123 + 118 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -7653,10 +7741,10 @@ Net Worth Tracking - Net Worth Tracking + 净资产追踪 libs/ui/src/lib/i18n.ts - 110 + 111 @@ -7664,7 +7752,7 @@ 请输入您的 Ghostfolio API 密钥。 apps/client/src/app/components/admin-settings/admin-settings.component.ts - 162 + 163 @@ -7696,7 +7784,7 @@ 延迟 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7704,7 +7792,7 @@ 即时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7712,7 +7800,7 @@ 默认市场价格 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 638 @@ -7720,15 +7808,15 @@ 模式 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 556 + 675 Do you really want to convert the data source to ? - Do you really want to convert the data source to ? + 您确定要把数据源转换为 吗? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 485 + 525 @@ -7736,7 +7824,7 @@ 选择器 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 572 + 691 @@ -7744,7 +7832,7 @@ HTTP 请求标头 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 651 @@ -7752,7 +7840,7 @@ 收盘 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 292 @@ -7760,7 +7848,7 @@ 实时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 263 + 296 @@ -7776,7 +7864,7 @@ 创建 libs/ui/src/lib/tags-selector/tags-selector.component.html - 64 + 62 @@ -7793,7 +7881,7 @@ Ghostfolio in Numbers: Stars on GitHub - Ghostfolio in Numbers: Stars on GitHub + Ghostfolio 数据:GitHub Stars 数量 apps/client/src/app/pages/landing/landing-page.html 82 @@ -7941,11 +8029,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 232 + 227 libs/common/src/lib/routes/routes.ts - 235 + 230 @@ -7957,7 +8045,7 @@ libs/common/src/lib/routes/routes.ts - 237 + 232 @@ -7973,7 +8061,7 @@ () 已在使用中。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 718 + 801 @@ -7981,7 +8069,7 @@ 在更新到 () 时发生错误。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 721 + 804 @@ -7989,7 +8077,7 @@ 应用 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 155 @@ -8069,7 +8157,7 @@ libs/common/src/lib/routes/routes.ts - 110 + 105 @@ -8080,6 +8168,18 @@ 142 + + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 102 + + Log out 登出 @@ -8091,13 +8191,9 @@ Calculations are based on delayed market data and may not be displayed in real-time. 计算基于延迟的市场数据,可能无法实时显示。 - - apps/client/src/app/components/home-market/home-market.html - 28 - apps/client/src/app/components/markets/markets.html - 54 + 64 @@ -8106,19 +8202,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 200 + 195 libs/common/src/lib/routes/routes.ts - 203 + 198 ETF Tracking - ETF Tracking + ETF 追踪 libs/ui/src/lib/i18n.ts - 106 + 107 @@ -8126,7 +8222,7 @@ 演示用户账户已同步。 apps/client/src/app/components/admin-overview/admin-overview.component.ts - 323 + 334 @@ -8134,7 +8230,7 @@ 同步演示用户账户 apps/client/src/app/components/admin-overview/admin-overview.html - 128 + 131 @@ -8206,7 +8302,7 @@ libs/common/src/lib/routes/routes.ts - 251 + 246 @@ -8214,7 +8310,7 @@ 开源替代方案 libs/common/src/lib/routes/routes.ts - 346 + 341 @@ -8247,15 +8343,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 332 + 327 libs/common/src/lib/routes/routes.ts - 335 + 330 libs/common/src/lib/routes/routes.ts - 343 + 338 @@ -8264,11 +8360,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 324 + 319 libs/common/src/lib/routes/routes.ts - 327 + 322 @@ -8281,7 +8377,7 @@ Post to Ghostfolio on X (formerly Twitter) - Post to Ghostfolio on X (formerly Twitter) + 在 X (前身为 Twitter) 上发布给 Ghostfolio apps/client/src/app/pages/about/overview/about-overview-page.html 85 @@ -8348,7 +8444,7 @@ 当前月份 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 260 @@ -8493,11 +8589,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 356 + 351 libs/common/src/lib/routes/routes.ts - 357 + 352 @@ -8518,7 +8614,7 @@ If you encounter a bug, would like to suggest an improvement or a new feature, please join the Ghostfolio Slack community, post to @ghostfolio_ - 如果您遇到错误,想要建议改进或新功能,请加入 Ghostfolio Slack 社区,发布到 @ghostfolio_ + 如果您遇到错误,想要建议改进或新功能,请加入 Ghostfolio Slack 社区,发布到 @ghostfolio_ apps/client/src/app/pages/about/overview/about-overview-page.html 71 @@ -8529,7 +8625,7 @@ 股票 apps/client/src/app/components/markets/markets.component.ts - 51 + 54 apps/client/src/app/pages/features/features-page.html @@ -8541,7 +8637,7 @@ 加密货币 apps/client/src/app/components/markets/markets.component.ts - 52 + 55 apps/client/src/app/pages/features/features-page.html @@ -8553,7 +8649,7 @@ 管理资产概况 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 477 + 479 @@ -8581,7 +8677,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 101 + 102 @@ -8985,7 +9081,7 @@ 注册日期 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 56 + 58 diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss index 6ef55cb32..739af30ae 100644 --- a/apps/client/src/styles.scss +++ b/apps/client/src/styles.scss @@ -411,6 +411,17 @@ ngx-skeleton-loader { .mdc-dialog__content { --mat-dialog-supporting-text-color: rgba(var(--dark-primary-text)); } + + @media (max-width: 575.98px) { + // Tabs fill the available width on mobile + .mat-mdc-tab-group { + .mat-mdc-tab { + flex-grow: 1; + min-width: unset; + padding: 0 0.5rem; + } + } + } } .mat-mdc-fab, diff --git a/apps/client/src/styles/theme.scss b/apps/client/src/styles/theme.scss index 75ecc210d..3f8125011 100644 --- a/apps/client/src/styles/theme.scss +++ b/apps/client/src/styles/theme.scss @@ -364,6 +364,12 @@ $gf-typography: ( ) ); + @include mat.pseudo-checkbox-overrides( + ( + full-selected-icon-color: var(--gf-theme-primary-500) + ) + ); + @include mat.slide-toggle-overrides( ( selected-focus-handle-color: var(--gf-theme-primary-500), diff --git a/libs/common/src/lib/calculation-helper.spec.ts b/libs/common/src/lib/calculation-helper.spec.ts index 69621ec0a..75a24edba 100644 --- a/libs/common/src/lib/calculation-helper.spec.ts +++ b/libs/common/src/lib/calculation-helper.spec.ts @@ -1,8 +1,30 @@ import { Big } from 'big.js'; +import { format } from 'date-fns'; -import { getAnnualizedPerformancePercent } from './calculation-helper'; +import { + getAnnualizedPerformancePercent, + getIntervalFromDateRange +} from './calculation-helper'; +import { DATE_FORMAT } from './helper'; describe('CalculationHelper', () => { + describe('interval from date range', () => { + it('Get interval of a calendar year', async () => { + const { endDate, startDate } = getIntervalFromDateRange({ + dateRange: '2024' + }); + + // The boundaries are expressed in the local time zone, therefore the + // calendar days must hold independently of the time zone the tests run in + expect(format(startDate, DATE_FORMAT)).toEqual('2023-12-31'); + expect(format(endDate, DATE_FORMAT)).toEqual('2024-12-31'); + + // The start date is exclusive, hence the first instant of the year is + // part of the interval + expect(startDate.getTime()).toEqual(new Date(2024, 0, 1).getTime() - 1); + }); + }); + describe('annualized performance percentage', () => { it('Get annualized performance', async () => { expect( diff --git a/libs/common/src/lib/calculation-helper.ts b/libs/common/src/lib/calculation-helper.ts index 2097fa52a..d49663d6c 100644 --- a/libs/common/src/lib/calculation-helper.ts +++ b/libs/common/src/lib/calculation-helper.ts @@ -7,6 +7,7 @@ import { startOfWeek, startOfYear, subDays, + subMilliseconds, subYears } from 'date-fns'; import { isFinite, isNumber } from 'lodash'; @@ -75,10 +76,16 @@ export function getIntervalFromDateRange(params: { break; case 'max': break; - default: + default: { // '2024', '2023', '2022', etc. - endDate = endOfYear(new Date(dateRange)); - startDate = max([startDate, new Date(dateRange)]); + const yearStartDate = new Date(Number(dateRange), 0, 1); + + // Derive the boundaries of the calendar year in the local time zone, as + // the consumers apply local time zone semantics. As the start date is + // exclusive, the last millisecond of the preceding year is used. + endDate = endOfYear(yearStartDate); + startDate = max([startDate, subMilliseconds(yearStartDate, 1)]); + } } return { endDate, startDate }; diff --git a/libs/common/src/lib/chart-helper.ts b/libs/common/src/lib/chart-helper.ts index 1f385e901..23a00ca97 100644 --- a/libs/common/src/lib/chart-helper.ts +++ b/libs/common/src/lib/chart-helper.ts @@ -1,13 +1,17 @@ import type { ElementRef } from '@angular/core'; import type { Chart, + ChartOptions, ChartType, ControllerDatasetOptions, Plugin, Point, + ScaleOptions, + Tick, TooltipOptions, TooltipPosition } from 'chart.js'; +import type { AnnotationOptions } from 'chartjs-plugin-annotation'; import { format } from 'date-fns'; import { @@ -15,6 +19,7 @@ import { DATE_FORMAT_MONTHLY, DATE_FORMAT_YEARLY, getBackgroundColor, + getDateFormatString, getLocale, getTextColor } from './helper'; @@ -36,6 +41,53 @@ export function formatGroupedDate({ return format(date, DATE_FORMAT); } +export function getChartBorderColor(colorScheme: ColorScheme) { + return `rgba(${getTextColor(colorScheme)}, 0.1)`; +} + +export function getChartElementsOptions( + colorScheme: ColorScheme +): ChartOptions<'bar' | 'line'>['elements'] { + return { + line: { + tension: 0 + }, + point: { + hoverBackgroundColor: getBackgroundColor(colorScheme), + hoverRadius: 2, + radius: 0 + } + }; +} + +export function getTimeAxisOptions({ + borderWidth = 1, + colorScheme, + display = true, + locale = getLocale() +}: { + borderWidth?: number; + colorScheme: ColorScheme; + display?: boolean; + locale?: string; +}): ScaleOptions<'time'> { + return { + display, + border: { + color: getChartBorderColor(colorScheme), + width: borderWidth + }, + grid: { + display: false + }, + time: { + tooltipFormat: getDateFormatString(locale), + unit: 'year' + }, + type: 'time' + }; +} + export function getTooltipOptions({ colorScheme, currency = '', @@ -53,7 +105,7 @@ export function getTooltipOptions({ backgroundColor: getBackgroundColor(colorScheme), bodyColor: `rgb(${getTextColor(colorScheme)})`, borderWidth: 1, - borderColor: `rgba(${getTextColor(colorScheme)}, 0.1)`, + borderColor: getChartBorderColor(colorScheme), // @ts-expect-error: no need to set all attributes in callbacks callbacks: { label: (context) => { @@ -116,6 +168,50 @@ export function getTooltipPositionerMapTop( }; } +export function getValueAxisOptions({ + colorScheme, + display = true, + highlightedValues = [], + tickCallback +}: { + colorScheme: ColorScheme; + display?: boolean; + highlightedValues?: number[]; + tickCallback: ( + tickValue: number | string, + index: number, + ticks: Tick[] + ) => string; +}): ScaleOptions<'linear'> { + return { + display, + border: { + display: false + }, + grid: { + color: ({ scale, tick }) => { + if ( + tick.value === 0 || + tick.value === scale.max || + tick.value === scale.min || + highlightedValues.includes(tick.value) + ) { + return getChartBorderColor(colorScheme); + } + + return 'transparent'; + } + }, + position: 'right', + ticks: { + display, + callback: tickCallback, + mirror: true, + z: 1 + } + }; +} + export function getVerticalHoverLinePlugin( chartCanvas: ElementRef, colorScheme: ColorScheme @@ -152,6 +248,18 @@ export function getVerticalHoverLinePlugin( }; } +export function getZeroLineAnnotation( + colorScheme: ColorScheme +): AnnotationOptions<'line'> { + return { + borderColor: getChartBorderColor(colorScheme), + borderWidth: 1, + scaleID: 'y', + type: 'line', + value: 0 + }; +} + export function transformTickToAbbreviation(value: number) { if (value === 0) { return '0'; diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 6b070755f..23c8aab69 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -67,6 +67,20 @@ export const DATA_GATHERING_QUEUE_PRIORITY_MEDIUM = Math.round( DATA_GATHERING_QUEUE_PRIORITY_LOW / 2 ); +/** + * The named date ranges, complemented by the calendar years like '2024', + * '2023', '2022', etc. + */ +export const DATE_RANGES = [ + '1d', + '1y', + '5y', + 'max', + 'mtd', + 'wtd', + 'ytd' +] as const; + export const PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE = 'PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE'; export const PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_HIGH = 1; @@ -101,7 +115,6 @@ export const DEFAULT_REDACTED_PATHS = [ 'accounts[*].interestInBaseCurrency', 'accounts[*].value', 'accounts[*].valueInBaseCurrency', - 'activities[*].account.balance', 'activities[*].account.comment', 'activities[*].assetProfile.symbolMapping', 'activities[*].assetProfile.watchedByCount', @@ -114,7 +127,6 @@ export const DEFAULT_REDACTED_PATHS = [ 'activities[*].valueInBaseCurrency', 'balance', 'balanceInBaseCurrency', - 'balances[*].account.balance', 'balances[*].account.comment', 'balances[*].value', 'balances[*].valueInBaseCurrency', @@ -217,6 +229,12 @@ export const INVESTMENT_ACTIVITY_TYPES = [ Type.SELL ] as Type[]; +export const NON_INVESTMENT_ACTIVITY_TYPES = Object.values(Type).filter( + (type) => { + return !INVESTMENT_ACTIVITY_TYPES.includes(type); + } +); + export const PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME = 'PORTFOLIO'; export const PORTFOLIO_SNAPSHOT_PROCESS_JOB_OPTIONS: JobOptions = { removeOnComplete: true @@ -253,6 +271,7 @@ export const PROPERTY_DEMO_USER_ID = 'DEMO_USER_ID'; export const PROPERTY_IS_DATA_GATHERING_ENABLED = 'IS_DATA_GATHERING_ENABLED'; export const PROPERTY_IS_READ_ONLY_MODE = 'IS_READ_ONLY_MODE'; export const PROPERTY_IS_USER_SIGNUP_ENABLED = 'IS_USER_SIGNUP_ENABLED'; +export const PROPERTY_MAX_DAILY_REQUESTS = 'MAX_DAILY_REQUESTS'; export const PROPERTY_OPENROUTER_MODEL = 'OPENROUTER_MODEL'; export const PROPERTY_OPENROUTER_MODEL_WEB_FETCH = 'OPENROUTER_MODEL_WEB_FETCH'; export const PROPERTY_PROXY_ROUTES = 'PROXY_ROUTES'; @@ -287,6 +306,8 @@ export const REPLACE_NAME_PARTS = [ 'Xtrackers (IE) Plc -' ]; +export const SEARCH_QUERY_MINIMUM_LENGTH = 2; + export const SECTORS = [ 'Basic Materials', 'Communication Services', @@ -321,11 +342,19 @@ export const SUPPORTED_LANGUAGE_CODES = [ 'zh' ] as const; +export const TAG_ID_DEMO = 'efa08cb3-9b9d-4974-ac68-db13a19c4874'; export const TAG_ID_EMERGENCY_FUND = '4452656d-9fa4-4bd0-ba38-70492e31d180'; export const TAG_ID_EXCLUDE_FROM_ANALYSIS = 'f2e868af-8333-459f-b161-cbc6544c24bd'; -export const TAG_ID_DEMO = 'efa08cb3-9b9d-4974-ac68-db13a19c4874'; +export const TAG_IDS_SYSTEM = [ + TAG_ID_DEMO, + TAG_ID_EMERGENCY_FUND, + TAG_ID_EXCLUDE_FROM_ANALYSIS +]; + +export const THROTTLE_DAILY_KEY = 'daily'; +export const THROTTLE_DAILY_TTL = ms('1 day'); export const THROTTLE_DEFAULT_LIMIT = 10; export const THROTTLE_DEFAULT_TTL = ms('1 minute'); export const THROTTLE_SIGNUP_LIMIT = 5; diff --git a/libs/common/src/lib/dtos/create-account-with-balances.dto.ts b/libs/common/src/lib/dtos/create-account-with-balances.dto.ts index 2d1d3ed2a..8fc6f78e4 100644 --- a/libs/common/src/lib/dtos/create-account-with-balances.dto.ts +++ b/libs/common/src/lib/dtos/create-account-with-balances.dto.ts @@ -1,6 +1,6 @@ import { AccountBalance } from '@ghostfolio/common/interfaces'; -import { IsArray, IsOptional } from 'class-validator'; +import { IsArray, IsBoolean, IsOptional } from 'class-validator'; import { CreateAccountDto } from './create-account.dto'; @@ -8,4 +8,12 @@ export class CreateAccountWithBalancesDto extends CreateAccountDto { @IsArray() @IsOptional() balances?: AccountBalance[]; + + /** + * @deprecated Accepted for backward compatibility with old export files + * and mapped to the "Exclude from Analysis" tag (`TAG_ID_EXCLUDE_FROM_ANALYSIS`) + */ + @IsBoolean() + @IsOptional() + isExcluded?: boolean; } diff --git a/libs/common/src/lib/dtos/create-account.dto.ts b/libs/common/src/lib/dtos/create-account.dto.ts index b04193020..ccadff5f9 100644 --- a/libs/common/src/lib/dtos/create-account.dto.ts +++ b/libs/common/src/lib/dtos/create-account.dto.ts @@ -4,7 +4,6 @@ import { Transform, TransformFnParams } from 'class-transformer'; import { ArrayUnique, IsArray, - IsBoolean, IsNumber, IsOptional, IsString, @@ -13,15 +12,20 @@ import { import { isString } from 'lodash'; export class CreateAccountDto { + /** + * The initial balance, stored as the account balance of today. + * Optional because callers may instead supply the full history via `balances`. + */ @IsNumber() - balance: number; + @IsOptional() + balance?: number; @IsOptional() @IsString() @Transform(({ value }: TransformFnParams) => isString(value) ? value.trim() : value ) - comment?: string; + comment?: string | null; @IsCurrencyCode() currency: string; @@ -30,13 +34,6 @@ export class CreateAccountDto { @IsString() id?: string; - /** - * @deprecated Use the "Exclude from Analysis" tag (`TAG_ID_EXCLUDE_FROM_ANALYSIS`) instead - */ - @IsBoolean() - @IsOptional() - isExcluded?: boolean; - @IsString() name: string; diff --git a/libs/common/src/lib/dtos/create-asset-profile-split.dto.ts b/libs/common/src/lib/dtos/create-asset-profile-split.dto.ts new file mode 100644 index 000000000..a68f00883 --- /dev/null +++ b/libs/common/src/lib/dtos/create-asset-profile-split.dto.ts @@ -0,0 +1,39 @@ +import { IsAfter1970Constraint } from '@ghostfolio/common/validator-constraints/is-after-1970'; +import { IsSplitRatioConstraint } from '@ghostfolio/common/validator-constraints/is-split-ratio'; + +import { IsInt, IsISO8601, Validate } from 'class-validator'; + +export class CreateAssetProfileSplitDto { + /** + * The date the split becomes effective. Activities before this date are + * adjusted by the ratio. + */ + @IsISO8601() + @Validate(IsAfter1970Constraint) + date: string; + + /** + * The number of shares held before the split, for example 1 for a 4:1 split + * or 10 for a 1:10 reverse split. + */ + @IsInt() + denominator: number; + + /** + * The number of shares held after the split, for example 4 for a 4:1 split + * or 1 for a 1:10 reverse split. + * + * The resulting split factor is numerator / denominator. Both parts are kept + * so that the ratio stays exact, for example 1/3 for a 1:3 reverse split. + * + * Activities are adjusted by this ratio: the quantity is multiplied by it and + * the unit price divided by it, so that the total value of an activity stays + * the same. + * + * Market data is already split-adjusted by the data providers and must not be + * adjusted again. + */ + @IsInt() + @Validate(IsSplitRatioConstraint) + numerator: number; +} diff --git a/libs/common/src/lib/dtos/create-order.dto.ts b/libs/common/src/lib/dtos/create-order.dto.ts index 36365b7be..c70b66b02 100644 --- a/libs/common/src/lib/dtos/create-order.dto.ts +++ b/libs/common/src/lib/dtos/create-order.dto.ts @@ -35,7 +35,7 @@ export class CreateOrderDto { @Transform(({ value }: TransformFnParams) => isString(value) ? value.trim() : value ) - comment?: string; + comment?: string | null; @IsCurrencyCode() currency: string; diff --git a/libs/common/src/lib/dtos/create-platform.dto.ts b/libs/common/src/lib/dtos/create-platform.dto.ts index e482dd241..5c6453f84 100644 --- a/libs/common/src/lib/dtos/create-platform.dto.ts +++ b/libs/common/src/lib/dtos/create-platform.dto.ts @@ -1,6 +1,10 @@ -import { IsString, IsUrl } from 'class-validator'; +import { IsOptional, IsString, IsUrl } from 'class-validator'; export class CreatePlatformDto { + @IsOptional() + @IsString() + id?: string; + @IsString() name: string; diff --git a/libs/common/src/lib/dtos/index.ts b/libs/common/src/lib/dtos/index.ts index 785115356..7cf385cd7 100644 --- a/libs/common/src/lib/dtos/index.ts +++ b/libs/common/src/lib/dtos/index.ts @@ -4,6 +4,7 @@ import { CreateAccessDto } from './create-access.dto'; import { CreateAccountBalanceDto } from './create-account-balance.dto'; import { CreateAccountWithBalancesDto } from './create-account-with-balances.dto'; import { CreateAccountDto } from './create-account.dto'; +import { CreateAssetProfileSplitDto } from './create-asset-profile-split.dto'; import { CreateAssetProfileWithMarketDataDto } from './create-asset-profile-with-market-data.dto'; import { CreateAssetProfileDto } from './create-asset-profile.dto'; import { CreateOrderDto } from './create-order.dto'; @@ -36,6 +37,7 @@ export { CreateAccountDto, CreateAccountWithBalancesDto, CreateAssetProfileDto, + CreateAssetProfileSplitDto, CreateAssetProfileWithMarketDataDto, CreateOrderDto, CreatePlatformDto, diff --git a/libs/common/src/lib/dtos/update-account.dto.ts b/libs/common/src/lib/dtos/update-account.dto.ts index 7a33da2df..4e1570aad 100644 --- a/libs/common/src/lib/dtos/update-account.dto.ts +++ b/libs/common/src/lib/dtos/update-account.dto.ts @@ -4,7 +4,6 @@ import { Transform, TransformFnParams } from 'class-transformer'; import { ArrayUnique, IsArray, - IsBoolean, IsNumber, IsOptional, IsString, @@ -13,15 +12,20 @@ import { import { isString } from 'lodash'; export class UpdateAccountDto { + /** + * The balance, stored as the account balance of today. + * Optional because the account balances are the source of truth. + */ @IsNumber() - balance: number; + @IsOptional() + balance?: number; @IsOptional() @IsString() @Transform(({ value }: TransformFnParams) => isString(value) ? value.trim() : value ) - comment?: string; + comment?: string | null; @IsCurrencyCode() currency: string; @@ -29,13 +33,6 @@ export class UpdateAccountDto { @IsString() id: string; - /** - * @deprecated Use the "Exclude from Analysis" tag (`TAG_ID_EXCLUDE_FROM_ANALYSIS`) instead - */ - @IsBoolean() - @IsOptional() - isExcluded?: boolean; - @IsString() name: string; diff --git a/libs/common/src/lib/dtos/update-asset-profile.dto.ts b/libs/common/src/lib/dtos/update-asset-profile.dto.ts index a6e2230e8..a8eaad608 100644 --- a/libs/common/src/lib/dtos/update-asset-profile.dto.ts +++ b/libs/common/src/lib/dtos/update-asset-profile.dto.ts @@ -35,7 +35,7 @@ export class UpdateAssetProfileDto { @IsOptional() @IsString() - comment?: string; + comment?: string | null; @IsArray() @IsOptional() @@ -96,5 +96,5 @@ export class UpdateAssetProfileDto { protocols: ['http', 'https'], require_protocol: true }) - url?: string; + url?: string | null; } diff --git a/libs/common/src/lib/dtos/update-order.dto.ts b/libs/common/src/lib/dtos/update-order.dto.ts index 991479bc8..d8fdbe66b 100644 --- a/libs/common/src/lib/dtos/update-order.dto.ts +++ b/libs/common/src/lib/dtos/update-order.dto.ts @@ -34,7 +34,7 @@ export class UpdateOrderDto { @Transform(({ value }: TransformFnParams) => isString(value) ? value.trim() : value ) - comment?: string; + comment?: string | null; @IsCurrencyCode() currency: string; diff --git a/libs/common/src/lib/helper.spec.ts b/libs/common/src/lib/helper.spec.ts index d33f10452..6cc090170 100644 --- a/libs/common/src/lib/helper.spec.ts +++ b/libs/common/src/lib/helper.spec.ts @@ -1,8 +1,18 @@ +import { + TAG_ID_EMERGENCY_FUND, + TAG_ID_EXCLUDE_FROM_ANALYSIS +} from '@ghostfolio/common/config'; import { extractNumberFromString, + getCountryCodeFromCurrency, getNumberFormatGroup, + getStringOrNull, + getStringOrUndefined, + isAccountExcluded, isCurrency, - isCurrencySymbol + isCurrencySymbol, + isSplitRatio, + isValidCustomAssetProfileSymbol } from '@ghostfolio/common/helper'; describe('Helper', () => { @@ -68,6 +78,30 @@ describe('Helper', () => { }); }); + describe('Get country code from currency', () => { + it('ISO 4217 currency code', () => { + expect(getCountryCodeFromCurrency('CHF')).toEqual('CH'); + expect(getCountryCodeFromCurrency('USD')).toEqual('US'); + }); + + it('Currency of the European Union', () => { + expect(getCountryCodeFromCurrency('EUR')).toEqual('EU'); + }); + + it('Derived currency', () => { + expect(getCountryCodeFromCurrency('GBp')).toEqual('GB'); + }); + + it('Supranational currency', () => { + expect(getCountryCodeFromCurrency('XAU')).toEqual(''); + expect(getCountryCodeFromCurrency('XOF')).toEqual(''); + }); + + it('Empty currency', () => { + expect(getCountryCodeFromCurrency('')).toEqual(''); + }); + }); + describe('Get number format group', () => { let languageGetter: jest.SpyInstance; @@ -139,6 +173,84 @@ describe('Helper', () => { }); }); + describe('Get string or null', () => { + it('String', () => { + expect(getStringOrNull('https://ghostfol.io')).toEqual( + 'https://ghostfol.io' + ); + }); + + it('String (with spaces)', () => { + expect(getStringOrNull(' https://ghostfol.io ')).toEqual( + 'https://ghostfol.io' + ); + }); + + it('Empty string', () => { + expect(getStringOrNull('')).toEqual(null); + }); + + it('Blank string', () => { + expect(getStringOrNull(' ')).toEqual(null); + }); + + it('Null', () => { + expect(getStringOrNull(null)).toEqual(null); + }); + + it('Undefined', () => { + expect(getStringOrNull(undefined)).toEqual(null); + }); + }); + + describe('Get string or undefined', () => { + it('String', () => { + expect(getStringOrUndefined('de-DE')).toEqual('de-DE'); + }); + + it('String (with spaces)', () => { + expect(getStringOrUndefined(' de-DE ')).toEqual('de-DE'); + }); + + it('Empty string', () => { + expect(getStringOrUndefined('')).toEqual(undefined); + }); + + it('Blank string', () => { + expect(getStringOrUndefined(' ')).toEqual(undefined); + }); + + it('Null', () => { + expect(getStringOrUndefined(null)).toEqual(undefined); + }); + + it('Undefined', () => { + expect(getStringOrUndefined(undefined)).toEqual(undefined); + }); + }); + + describe('Is account excluded', () => { + it('Account with Exclude from Analysis tag', () => { + expect( + isAccountExcluded({ tags: [{ id: TAG_ID_EXCLUDE_FROM_ANALYSIS }] }) + ).toEqual(true); + }); + + it('Account with another tag', () => { + expect( + isAccountExcluded({ tags: [{ id: TAG_ID_EMERGENCY_FUND }] }) + ).toEqual(false); + }); + + it('Account without tags', () => { + expect(isAccountExcluded({ tags: [] })).toEqual(false); + }); + + it('Undefined account', () => { + expect(isAccountExcluded(undefined)).toEqual(false); + }); + }); + describe('Is currency', () => { it('ISO 4217 currency code', () => { expect(isCurrency('USD')).toEqual(true); @@ -195,4 +307,77 @@ describe('Helper', () => { expect(isCurrencySymbol('')).toEqual(false); }); }); + + describe('Is split ratio', () => { + it('Forward split', () => { + expect(isSplitRatio({ denominator: 1, numerator: 2 })).toEqual(true); + expect(isSplitRatio({ denominator: 1, numerator: 4 })).toEqual(true); + expect(isSplitRatio({ denominator: 2, numerator: 3 })).toEqual(true); + }); + + it('Reverse split', () => { + expect(isSplitRatio({ denominator: 10, numerator: 1 })).toEqual(true); + expect(isSplitRatio({ denominator: 3, numerator: 1 })).toEqual(true); + }); + + it('Ratio without effect', () => { + expect(isSplitRatio({ denominator: 1, numerator: 1 })).toEqual(false); + expect(isSplitRatio({ denominator: 3, numerator: 3 })).toEqual(false); + }); + + it('Zero or negative ratio', () => { + expect(isSplitRatio({ denominator: 1, numerator: 0 })).toEqual(false); + expect(isSplitRatio({ denominator: 0, numerator: 1 })).toEqual(false); + expect(isSplitRatio({ denominator: 1, numerator: -2 })).toEqual(false); + expect(isSplitRatio({ denominator: -2, numerator: 1 })).toEqual(false); + }); + + it('Non-integer ratio', () => { + expect(isSplitRatio({ denominator: 1, numerator: 1.5 })).toEqual(false); + expect(isSplitRatio({ denominator: 2.5, numerator: 1 })).toEqual(false); + expect(isSplitRatio({ denominator: 1, numerator: Number.NaN })).toEqual( + false + ); + expect( + isSplitRatio({ denominator: 1, numerator: Number.POSITIVE_INFINITY }) + ).toEqual(false); + }); + + it('Missing ratio', () => { + expect( + isSplitRatio({ denominator: undefined, numerator: undefined }) + ).toEqual(false); + expect(isSplitRatio({ denominator: null, numerator: null })).toEqual( + false + ); + }); + }); + + describe('Is valid custom asset profile symbol', () => { + it('Empty symbol', () => { + expect(isValidCustomAssetProfileSymbol('')).toEqual(false); + }); + + it('Free-text symbol', () => { + expect(isValidCustomAssetProfileSymbol('Penthouse Apartment')).toEqual( + false + ); + }); + + it('Stock symbol', () => { + expect(isValidCustomAssetProfileSymbol('AAPL')).toEqual(false); + }); + + it('Symbol with Ghostfolio prefix', () => { + expect(isValidCustomAssetProfileSymbol('GF_PENTHOUSE_APARTMENT')).toEqual( + true + ); + }); + + it('UUID', () => { + expect( + isValidCustomAssetProfileSymbol('7e91b7d4-1430-4212-8380-289a06c9bbc1') + ).toEqual(true); + }); + }); }); diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index 5d1ff538e..44fd89aa2 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -8,7 +8,7 @@ import { SymbolProfile } from '@prisma/client'; import { Big } from 'big.js'; -import { isISO4217CurrencyCode } from 'class-validator'; +import { isISO4217CurrencyCode, isUUID } from 'class-validator'; import { getDate, getMonth, @@ -41,7 +41,10 @@ import { DERIVED_CURRENCIES, ghostfolioFearAndGreedIndexSymbolCryptocurrencies, ghostfolioFearAndGreedIndexSymbolStocks, - TAG_ID_EXCLUDE_FROM_ANALYSIS + ghostfolioPrefix, + SEARCH_QUERY_MINIMUM_LENGTH, + TAG_ID_EXCLUDE_FROM_ANALYSIS, + TAG_IDS_SYSTEM } from './config'; import { AssetProfileIdentifier, @@ -276,6 +279,17 @@ export function getCurrencyFromSymbol(aSymbol = '') { return aSymbol.replace(DEFAULT_CURRENCY, ''); } +export function getCountryCodeFromCurrency(aCurrency = '') { + // An ISO 4217 currency code is composed of the ISO 3166-1 alpha-2 country + // code and the initial of the currency itself, except for the supranational + // currencies, which are prefixed with X (like XAU or XOF) + if (aCurrency.startsWith('X')) { + return ''; + } + + return aCurrency.slice(0, 2).toUpperCase(); +} + export function getCountryName({ code }: { code: string }): string { try { return ( @@ -396,6 +410,26 @@ export function getStartOfUtcDate(aDate: Date) { return date; } +export function getStringOrNull(aString: string | null | undefined) { + const trimmedString = aString?.trim(); + + if (trimmedString) { + return trimmedString; + } + + return null; +} + +export function getStringOrUndefined(aString: string | null | undefined) { + const trimmedString = aString?.trim(); + + if (trimmedString) { + return trimmedString; + } + + return undefined; +} + export function getSum(aArray: Big[]) { if (aArray?.length > 0) { return aArray.reduce((a, b) => a.plus(b), new Big(0)); @@ -445,6 +479,14 @@ export function getYesterday() { return subDays(new Date(Date.UTC(year, month, day)), 1); } +export function hasGhostfolioPrefix(aSymbol: string) { + if (!aSymbol) { + return false; + } + + return aSymbol.startsWith(`${ghostfolioPrefix}_`); +} + export function interpolate(template: string, context: any) { return template?.replace(/[$]{([^}]+)}/g, (_, objectPath) => { const properties = objectPath.split('.'); @@ -455,13 +497,9 @@ export function interpolate(template: string, context: any) { }); } -export function isAccountExcluded(account: { - isExcluded: boolean; - tags?: { id: string }[]; -}) { +export function isAccountExcluded(account?: { tags?: { id: string }[] }) { return ( - account.isExcluded || - account.tags?.some(({ id }) => { + account?.tags?.some(({ id }) => { return id === TAG_ID_EXCLUDE_FROM_ANALYSIS; }) === true ); @@ -509,6 +547,42 @@ export function isRootCurrency(aCurrency: string) { }); } +/** + * Validates the ratio of a stock split, expressed as the number of shares held + * after the split (numerator) per number of shares held before (denominator), + * for example 4 and 1 for a 4:1 split or 1 and 10 for a 1:10 reverse split. An + * equal numerator and denominator would be a no-op. + */ +export function isSplitRatio({ + denominator, + numerator +}: { + denominator: number; + numerator: number; +}) { + return ( + Number.isSafeInteger(numerator) && + Number.isSafeInteger(denominator) && + numerator > 0 && + denominator > 0 && + numerator !== denominator + ); +} + +export function isSystemTag(tag?: { id: string }) { + return TAG_IDS_SYSTEM.some((id) => { + return id === tag?.id; + }); +} + +export function isValidCustomAssetProfileSymbol(aSymbol: string) { + return hasGhostfolioPrefix(aSymbol) || isUUID(aSymbol); +} + +export function isValidSearchQuery(aQuery: string) { + return aQuery?.trim().length >= SEARCH_QUERY_MINIMUM_LENGTH; +} + export function parseDate(date: string): Date | undefined { if (!date) { return undefined; @@ -560,8 +634,10 @@ export function resetHours(aDate: Date) { return new Date(Date.UTC(year, month, day)); } -export function resolveFearAndGreedIndex(aValue: number) { - if (aValue <= 25) { +export function resolveFearAndGreedIndex(aValue?: number) { + if (isNil(aValue)) { + return { emoji: '⚪', key: 'UNKNOWN', text: 'Unknown' }; + } else if (aValue <= 25) { return { emoji: '🥵', key: 'EXTREME_FEAR', text: 'Extreme Fear' }; } else if (aValue <= 45) { return { emoji: '😨', key: 'FEAR', text: 'Fear' }; diff --git a/libs/common/src/lib/interfaces/admin-market-data-details.interface.ts b/libs/common/src/lib/interfaces/admin-market-data-details.interface.ts index dc44d0382..8cfe70f9c 100644 --- a/libs/common/src/lib/interfaces/admin-market-data-details.interface.ts +++ b/libs/common/src/lib/interfaces/admin-market-data-details.interface.ts @@ -1,8 +1,9 @@ -import { MarketData } from '@prisma/client'; +import { AssetProfileSplit, MarketData } from '@prisma/client'; import { EnhancedAssetProfile } from './enhanced-asset-profile.interface'; export interface AdminMarketDataDetails { assetProfile: Partial; marketData: MarketData[]; + splits: AssetProfileSplit[]; } diff --git a/libs/common/src/lib/interfaces/portfolio-position.interface.ts b/libs/common/src/lib/interfaces/portfolio-position.interface.ts index cf71b20ca..65d7ea140 100644 --- a/libs/common/src/lib/interfaces/portfolio-position.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-position.interface.ts @@ -15,6 +15,7 @@ export interface PortfolioPosition { | 'currency' | 'dataSource' | 'holdings' + | 'isin' | 'name' | 'sectors' | 'symbol' @@ -25,7 +26,6 @@ export interface PortfolioPosition { }; dateOfFirstActivity: Date; dividend: number; - exchange?: string; grossPerformance: number; grossPerformancePercent: number; grossPerformancePercentWithCurrencyEffect: number; diff --git a/libs/common/src/lib/interfaces/responses/asset-profile-response.interface.ts b/libs/common/src/lib/interfaces/responses/asset-profile-response.interface.ts index d76188c73..26082c2c4 100644 --- a/libs/common/src/lib/interfaces/responses/asset-profile-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/asset-profile-response.interface.ts @@ -1,8 +1,9 @@ -import { MarketData } from '@prisma/client'; +import { AssetProfileSplit, MarketData } from '@prisma/client'; import { EnhancedAssetProfile } from '../enhanced-asset-profile.interface'; export interface AssetProfileResponse { assetProfile: Partial; marketData: MarketData[]; + splits: AssetProfileSplit[]; } diff --git a/libs/common/src/lib/interfaces/responses/portfolio-investments.interface.ts b/libs/common/src/lib/interfaces/responses/portfolio-investments.interface.ts index 6d0d60002..30ac53765 100644 --- a/libs/common/src/lib/interfaces/responses/portfolio-investments.interface.ts +++ b/libs/common/src/lib/interfaces/responses/portfolio-investments.interface.ts @@ -2,5 +2,6 @@ import { InvestmentItem } from '../investment-item.interface'; export interface PortfolioInvestmentsResponse { investments: InvestmentItem[]; + savingsRate?: number; streaks: { currentStreak: number; longestStreak: number }; } diff --git a/libs/common/src/lib/interfaces/responses/portfolio-performance-response.interface.ts b/libs/common/src/lib/interfaces/responses/portfolio-performance-response.interface.ts index 104302de3..8177bd533 100644 --- a/libs/common/src/lib/interfaces/responses/portfolio-performance-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/portfolio-performance-response.interface.ts @@ -5,11 +5,5 @@ import { ResponseError } from './errors.interface'; export interface PortfolioPerformanceResponse extends ResponseError { chart?: HistoricalDataItem[]; dateOfFirstActivity: Date; - - /** - * @deprecated Use `dateOfFirstActivity` instead - */ - firstOrderDate: Date; - performance: PortfolioPerformance; } diff --git a/libs/common/src/lib/permissions.ts b/libs/common/src/lib/permissions.ts index 428de1788..96533a9e7 100644 --- a/libs/common/src/lib/permissions.ts +++ b/libs/common/src/lib/permissions.ts @@ -1,6 +1,6 @@ import { UserWithSettings } from '@ghostfolio/common/types'; -import { Role } from '@prisma/client'; +import { Access, Role } from '@prisma/client'; export const permissions = { accessAdminControl: 'accessAdminControl', @@ -12,6 +12,9 @@ export const permissions = { createAccountBalance: 'createAccountBalance', createActivity: 'createActivity', createApiKey: 'createApiKey', + createAssetProfileSplit: 'createAssetProfileSplit', + createAssetProfileSplitOfOwnAssetProfile: + 'createAssetProfileSplitOfOwnAssetProfile', createMarketData: 'createMarketData', createMarketDataOfOwnAssetProfile: 'createMarketDataOfOwnAssetProfile', createOwnTag: 'createOwnTag', @@ -23,6 +26,9 @@ export const permissions = { deleteAccount: 'deleteAccount', deleteAccountBalance: 'deleteAccountBalance', deleteActivity: 'deleteActivity', + deleteAssetProfileSplit: 'deleteAssetProfileSplit', + deleteAssetProfileSplitOfOwnAssetProfile: + 'deleteAssetProfileSplitOfOwnAssetProfile', deleteAuthDevice: 'deleteAuthDevice', deleteOwnUser: 'deleteOwnUser', deletePlatform: 'deletePlatform', @@ -80,6 +86,8 @@ export function getPermissions(aRole: Role): string[] { permissions.createWatchlistItem, permissions.deleteAccountBalance, permissions.deleteWatchlistItem, + permissions.createAssetProfileSplit, + permissions.createAssetProfileSplitOfOwnAssetProfile, permissions.createMarketData, permissions.createMarketDataOfOwnAssetProfile, permissions.createOwnTag, @@ -88,6 +96,8 @@ export function getPermissions(aRole: Role): string[] { permissions.deleteAccess, permissions.deleteAccount, permissions.deleteActivity, + permissions.deleteAssetProfileSplit, + permissions.deleteAssetProfileSplitOfOwnAssetProfile, permissions.deleteAuthDevice, permissions.deletePlatform, permissions.deleteTag, @@ -128,6 +138,7 @@ export function getPermissions(aRole: Role): string[] { permissions.createAccount, permissions.createAccountBalance, permissions.createActivity, + permissions.createAssetProfileSplitOfOwnAssetProfile, permissions.createMarketDataOfOwnAssetProfile, permissions.createOwnTag, permissions.createWatchlistItem, @@ -135,6 +146,7 @@ export function getPermissions(aRole: Role): string[] { permissions.deleteAccount, permissions.deleteAccountBalance, permissions.deleteActivity, + permissions.deleteAssetProfileSplitOfOwnAssetProfile, permissions.deleteAuthDevice, permissions.deleteWatchlistItem, permissions.readAiPrompt, @@ -186,17 +198,17 @@ export function hasPermission( } export function hasReadRestrictedAccessPermission({ - impersonationId, - user + accesses = [], + impersonationId }: { - impersonationId: string; - user: UserWithSettings; + accesses?: Pick[]; + impersonationId: string | null; }) { if (!impersonationId) { return false; } - const access = user?.accessesGet?.find(({ id }) => { + const access = accesses.find(({ id }) => { return id === impersonationId; }); diff --git a/libs/common/src/lib/routes/routes.ts b/libs/common/src/lib/routes/routes.ts index 86cb2480b..4d40cc5fb 100644 --- a/libs/common/src/lib/routes/routes.ts +++ b/libs/common/src/lib/routes/routes.ts @@ -94,11 +94,6 @@ export const internalRoutes = { routerLink: ['/home', 'markets'], title: $localize`Markets` }, - marketsPremium: { - path: 'markets-premium', - routerLink: ['/home', 'markets-premium'], - title: $localize`Markets` - }, summary: { path: 'summary', routerLink: ['/home', 'summary'], diff --git a/libs/common/src/lib/types/account-with-balance.type.ts b/libs/common/src/lib/types/account-with-balance.type.ts new file mode 100644 index 000000000..72732f3a6 --- /dev/null +++ b/libs/common/src/lib/types/account-with-balance.type.ts @@ -0,0 +1,5 @@ +import { Account as AccountModel } from '@prisma/client'; + +export type AccountWithBalance = AccountModel & { + balance: number; +}; diff --git a/libs/common/src/lib/types/account-with-value.type.ts b/libs/common/src/lib/types/account-with-value.type.ts index a13530632..27b7541dc 100644 --- a/libs/common/src/lib/types/account-with-value.type.ts +++ b/libs/common/src/lib/types/account-with-value.type.ts @@ -1,6 +1,8 @@ -import { Account as AccountModel, Platform, Tag } from '@prisma/client'; +import { Platform, Tag } from '@prisma/client'; -export type AccountWithValue = AccountModel & { +import { AccountWithBalance } from './account-with-balance.type'; + +export type AccountWithValue = AccountWithBalance & { activitiesCount: number; allocationInPercentage: number; balanceInBaseCurrency: number; diff --git a/libs/common/src/lib/types/date-range.type.ts b/libs/common/src/lib/types/date-range.type.ts index 09fa3c15b..5c25cfe39 100644 --- a/libs/common/src/lib/types/date-range.type.ts +++ b/libs/common/src/lib/types/date-range.type.ts @@ -1,9 +1,3 @@ -export type DateRange = - | '1d' - | '1y' - | '5y' - | 'max' - | 'mtd' - | 'wtd' - | 'ytd' - | string; // '2024', '2023', '2022', etc. +import type { DATE_RANGES } from '../config'; + +export type DateRange = (typeof DATE_RANGES)[number] | string; // '2024', '2023', '2022', etc. diff --git a/libs/common/src/lib/types/index.ts b/libs/common/src/lib/types/index.ts index aa6893bc6..f61bfdca7 100644 --- a/libs/common/src/lib/types/index.ts +++ b/libs/common/src/lib/types/index.ts @@ -1,5 +1,6 @@ import type { AccessType } from './access-type.type'; import type { AccessWithGranteeUser } from './access-with-grantee-user.type'; +import type { AccountWithBalance } from './account-with-balance.type'; import type { AccountWithPlatform } from './account-with-platform.type'; import type { AccountWithValue } from './account-with-value.type'; import type { AiPromptMode } from './ai-prompt-mode.type'; @@ -28,6 +29,7 @@ import type { ViewMode } from './view-mode.type'; export type { AccessType, AccessWithGranteeUser, + AccountWithBalance, AccountWithPlatform, AccountWithValue, AiPromptMode, diff --git a/libs/common/src/lib/validator-constraints/is-split-ratio.ts b/libs/common/src/lib/validator-constraints/is-split-ratio.ts new file mode 100644 index 000000000..d3cd454e8 --- /dev/null +++ b/libs/common/src/lib/validator-constraints/is-split-ratio.ts @@ -0,0 +1,18 @@ +import { isSplitRatio } from '@ghostfolio/common/helper'; + +import { + ValidationArguments, + ValidatorConstraint, + ValidatorConstraintInterface +} from 'class-validator'; + +@ValidatorConstraint({ name: 'isSplitRatio' }) +export class IsSplitRatioConstraint implements ValidatorConstraintInterface { + public defaultMessage() { + return 'numerator and denominator must be different positive integers'; + } + + public validate(_: unknown, { object }: ValidationArguments) { + return isSplitRatio(object as { denominator: number; numerator: number }); + } +} 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 d252b1488..1d1cbb296 100644 --- a/libs/ui/src/lib/accounts-table/accounts-table.component.html +++ b/libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -50,13 +50,12 @@ Name - @if (element.platform?.url) { - - } + {{ element.name }} Total @@ -98,13 +97,12 @@ mat-cell >
- @if (element.platform?.url) { - - } + {{ element.platform?.name }}
diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts b/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts index 62a01164f..68da20ec6 100644 --- a/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts +++ b/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts @@ -1,3 +1,5 @@ +import { AccountWithValue } from '@ghostfolio/common/types'; + import { CommonModule } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; import { MatMenuModule } from '@angular/material/menu'; @@ -14,17 +16,18 @@ import { NotificationService } from '../notifications'; import { GfValueComponent } from '../value'; import { GfAccountsTableComponent } from './accounts-table.component'; -const accounts = [ +const accounts: AccountWithValue[] = [ { activitiesCount: 0, - allocationInPercentage: null, + allocationInPercentage: 0.002574748676949956, balance: 278, balanceInBaseCurrency: 278, comment: null, createdAt: new Date('2025-06-01T06:52:49.063Z'), currency: 'USD', + dividendInBaseCurrency: 0, id: '460d7401-ca43-4ed4-b08e-349f1822e9db', - isExcluded: false, + interestInBaseCurrency: 0, name: 'Coinbase Account', platform: { id: '8dc24b88-bb92-4152-af25-fe6a31643e26', @@ -39,14 +42,15 @@ const accounts = [ }, { activitiesCount: 0, - allocationInPercentage: null, + allocationInPercentage: 0.11114023065971035, balance: 12000, balanceInBaseCurrency: 12000, comment: null, createdAt: new Date('2025-06-01T06:48:53.055Z'), currency: 'USD', + dividendInBaseCurrency: 0, id: '6d773e31-0583-4c85-a247-e69870b4f1ee', - isExcluded: false, + interestInBaseCurrency: 0, name: 'Private Banking Account', platform: { id: '43e8fcd1-5b79-4100-b678-d2229bd1660d', @@ -61,14 +65,15 @@ const accounts = [ }, { activitiesCount: 12, - allocationInPercentage: null, + allocationInPercentage: 0.8862850206633397, balance: 150.2, balanceInBaseCurrency: 150.2, comment: null, createdAt: new Date('2025-05-31T13:00:13.940Z'), currency: 'USD', + dividendInBaseCurrency: 0, id: '776bd1e9-b2f6-4f7e-933d-18756c2f0625', - isExcluded: false, + interestInBaseCurrency: 0, name: 'Trading Account', platform: { id: '9da3a8a7-4795-43e3-a6db-ccb914189737', @@ -76,10 +81,10 @@ const accounts = [ url: 'https://interactivebrokers.com' }, platformId: '9da3a8a7-4795-43e3-a6db-ccb914189737', - valueInBaseCurrency: 95693.70321466809, updatedAt: new Date('2025-06-01T06:53:10.569Z'), userId: '081aa387-487d-4438-83a4-3060eb2a016e', - value: 95693.70321466809 + value: 95693.70321466809, + valueInBaseCurrency: 95693.70321466809 } ]; diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.ts b/libs/ui/src/lib/accounts-table/accounts-table.component.ts index 3e531e844..ab49c8cb5 100644 --- a/libs/ui/src/lib/accounts-table/accounts-table.component.ts +++ b/libs/ui/src/lib/accounts-table/accounts-table.component.ts @@ -4,6 +4,7 @@ import { getLowercase, isAccountExcluded } from '@ghostfolio/common/helper'; +import { AccountWithValue } from '@ghostfolio/common/types'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfValueComponent } from '@ghostfolio/ui/value'; @@ -24,7 +25,6 @@ import { MatSort, MatSortModule } from '@angular/material/sort'; import { MatTableDataSource, MatTableModule } from '@angular/material/table'; import { Router, RouterModule } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; -import { Account } from '@prisma/client'; import { addIcons } from 'ionicons'; import { arrowRedoOutline, @@ -55,7 +55,7 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; templateUrl: './accounts-table.component.html' }) export class GfAccountsTableComponent { - public readonly accounts = input.required(); + public readonly accounts = input.required(); public readonly activitiesCount = input(); public readonly baseCurrency = input(); public readonly hasPermissionToOpenDetails = input(true); @@ -71,12 +71,12 @@ export class GfAccountsTableComponent { public readonly totalValueInBaseCurrency = input(); public readonly accountDeleted = output(); - public readonly accountToUpdate = output(); + public readonly accountToUpdate = output(); public readonly transferBalance = output(); public readonly sort = viewChild.required(MatSort); - protected readonly dataSource = new MatTableDataSource([]); + protected readonly dataSource = new MatTableDataSource([]); protected readonly displayedColumns = computed(() => { const columns = ['status', 'account', 'platform']; @@ -141,7 +141,9 @@ export class GfAccountsTableComponent { }); } - protected isExcluded(account: Account & { tags?: { id: string }[] }) { + protected isExcluded( + account: AccountWithValue & { tags?: { id: string }[] } + ) { return isAccountExcluded(account); } @@ -173,7 +175,7 @@ export class GfAccountsTableComponent { this.transferBalance.emit(); } - protected onUpdateAccount(aAccount: Account) { + protected onUpdateAccount(aAccount: AccountWithValue) { this.accountToUpdate.emit(aAccount); } } diff --git a/libs/ui/src/lib/activities-filter/activities-filter.component.html b/libs/ui/src/lib/activities-filter/activities-filter.component.html index 58626351b..3243178c9 100644 --- a/libs/ui/src/lib/activities-filter/activities-filter.component.html +++ b/libs/ui/src/lib/activities-filter/activities-filter.component.html @@ -4,12 +4,11 @@ @for (filter of selectedFilters; track filter) { {{ filter.label }} - diff --git a/libs/ui/src/lib/activities-table/activities-table.component.html b/libs/ui/src/lib/activities-table/activities-table.component.html index 91a67d1cb..7f53da4fa 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.html +++ b/libs/ui/src/lib/activities-table/activities-table.component.html @@ -1,4 +1,6 @@ -
+
@if (hasPermissionToFilterByType) { @@ -56,12 +58,19 @@ } @@ -82,14 +91,19 @@ @@ -196,8 +210,9 @@
@@ -220,8 +235,9 @@
@@ -244,8 +260,9 @@
@@ -268,8 +285,9 @@
@@ -291,8 +309,9 @@
@@ -323,8 +342,9 @@
@@ -336,13 +356,12 @@
- @if (element.account?.platform?.url) { - - } + {{ element.account?.name }} diff --git a/libs/ui/src/lib/activities-table/activities-table.component.scss b/libs/ui/src/lib/activities-table/activities-table.component.scss index 5d4e87f30..4e98f726e 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.scss +++ b/libs/ui/src/lib/activities-table/activities-table.component.scss @@ -1,3 +1,12 @@ +@use '@angular/material' as mat; + :host { display: block; + + @include mat.form-field-overrides( + ( + container-height: 2rem, + container-vertical-padding: 0.33rem + ) + ); } diff --git a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts index 57a8f18b6..929c71787 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts @@ -39,12 +39,10 @@ const activities: Activity[] = [ updatedAt: new Date('2025-05-31T18:43:01.840Z'), userId: '081aa387-487d-4438-83a4-3060eb2a016e', account: { - balance: 150.2, comment: null, createdAt: new Date('2025-05-31T13:00:13.940Z'), currency: 'USD', id: '776bd1e9-b2f6-4f7e-933d-18756c2f0625', - isExcluded: false, name: 'Trading Account', platformId: '9da3a8a7-4795-43e3-a6db-ccb914189737', updatedAt: new Date('2025-06-01T06:53:10.569Z'), @@ -106,12 +104,10 @@ const activities: Activity[] = [ updatedAt: new Date('2025-05-31T18:46:14.175Z'), userId: '081aa387-487d-4438-83a4-3060eb2a016e', account: { - balance: 150.2, comment: null, createdAt: new Date('2025-05-31T13:00:13.940Z'), currency: 'USD', id: '776bd1e9-b2f6-4f7e-933d-18756c2f0625', - isExcluded: false, name: 'Trading Account', platformId: '9da3a8a7-4795-43e3-a6db-ccb914189737', updatedAt: new Date('2025-06-01T06:53:10.569Z'), @@ -173,12 +169,10 @@ const activities: Activity[] = [ updatedAt: new Date('2025-05-31T18:49:54.064Z'), userId: '081aa387-487d-4438-83a4-3060eb2a016e', account: { - balance: 150.2, comment: null, createdAt: new Date('2025-05-31T13:00:13.940Z'), currency: 'USD', id: '776bd1e9-b2f6-4f7e-933d-18756c2f0625', - isExcluded: false, name: 'Trading Account', platformId: '9da3a8a7-4795-43e3-a6db-ccb914189737', updatedAt: new Date('2025-06-01T06:53:10.569Z'), @@ -240,12 +234,10 @@ const activities: Activity[] = [ updatedAt: new Date('2025-05-31T18:48:48.209Z'), userId: '081aa387-487d-4438-83a4-3060eb2a016e', account: { - balance: 150.2, comment: null, createdAt: new Date('2025-05-31T13:00:13.940Z'), currency: 'USD', id: '776bd1e9-b2f6-4f7e-933d-18756c2f0625', - isExcluded: false, name: 'Trading Account', platformId: '9da3a8a7-4795-43e3-a6db-ccb914189737', updatedAt: new Date('2025-06-01T06:53:10.569Z'), @@ -307,12 +299,10 @@ const activities: Activity[] = [ updatedAt: new Date('2025-05-31T18:46:44.616Z'), userId: '081aa387-487d-4438-83a4-3060eb2a016e', account: { - balance: 150.2, comment: null, createdAt: new Date('2025-05-31T13:00:13.940Z'), currency: 'USD', id: '776bd1e9-b2f6-4f7e-933d-18756c2f0625', - isExcluded: false, name: 'Trading Account', platformId: '9da3a8a7-4795-43e3-a6db-ccb914189737', updatedAt: new Date('2025-06-01T06:53:10.569Z'), @@ -494,3 +484,28 @@ export const Actions: Story = { totalItems: activities.length } }; + +export const Toolbar: Story = { + args: { + dataSource, + baseCurrency: 'USD', + deviceType: 'desktop', + hasActivities: true, + hasPermissionToCreateActivity: true, + hasPermissionToDeleteActivity: true, + hasPermissionToExportActivities: true, + hasPermissionToFilterByType: true, + hasPermissionToOpenDetails: false, + locale: 'en-US', + pageIndex: 0, + pageSize: 10, + showAccountColumn: true, + showActions: false, + showCheckbox: false, + showNameColumn: true, + sortColumn: 'date', + sortDirection: 'desc', + sortDisabled: false, + totalItems: activities.length + } +}; diff --git a/libs/ui/src/lib/activities-table/activities-table.component.ts b/libs/ui/src/lib/activities-table/activities-table.component.ts index 573c8c93a..7252b0074 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.ts @@ -282,9 +282,23 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnInit { ); } + public canDeleteActivities() { + return ( + (this.dataSource()?.data.length ?? 0) > 0 && + this.hasPermissionToDeleteActivity + ); + } + + public canExportActivities() { + return ( + (this.dataSource()?.data.length ?? 0) > 0 && + this.hasPermissionToExportActivities + ); + } + public isExcludedFromAnalysis(activity: Activity) { return ( - (activity.account && isAccountExcluded(activity.account)) ?? + isAccountExcluded(activity.account) || activity.tags?.some(({ id }) => { return id === TAG_ID_EXCLUDE_FROM_ANALYSIS; }) === true @@ -314,7 +328,10 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnInit { this.activitiesDeleted.emit(); }, confirmType: ConfirmationDialogType.Warn, - title: $localize`Do you really want to delete these activities?` + title: + this.totalItems === 1 + ? $localize`Do you really want to delete this activity?` + : $localize`Do you really want to delete these ${this.totalItems}:count: activities?` }); } diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts index 471420937..9ef6c9f1c 100644 --- a/libs/ui/src/lib/assistant/assistant.component.ts +++ b/libs/ui/src/lib/assistant/assistant.component.ts @@ -202,6 +202,11 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { this.searchFormControl.valueChanges .pipe( map((searchTerm) => { + return searchTerm?.trim(); + }), + debounceTime(300), + distinctUntilChanged(), + tap(() => { this.isLoading = { accounts: true, assetProfiles: true, @@ -216,11 +221,7 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { }; this.changeDetectorRef.markForCheck(); - - return searchTerm?.trim(); }), - debounceTime(300), - distinctUntilChanged(), switchMap((searchTerm) => { const results = { accounts: [], diff --git a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts index 0c75b5954..8a7e13156 100644 --- a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts +++ b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts @@ -46,6 +46,7 @@ import { BenchmarkDetailDialogParams } from './interfaces/interfaces'; export class GfBenchmarkDetailDialogComponent implements OnInit { public assetProfile: AdminMarketDataDetails['assetProfile']; public historicalDataItems: LineChartItem[]; + public isLoading = true; public value: number; public constructor( @@ -79,6 +80,8 @@ export class GfBenchmarkDetailDialogComponent implements OnInit { } ); + this.isLoading = false; + this.changeDetectorRef.markForCheck(); }); } diff --git a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.html b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.html index a8cf3730c..3ff7f03ab 100644 --- a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.html +++ b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.html @@ -11,6 +11,7 @@
({ + colorScheme, + currency, + groupBy, + locale, + unit +}: { + colorScheme: ColorScheme; + currency?: string; + groupBy?: GroupBy; + locale?: string; + unit?: string; +}): Partial> { + return { + ...getTooltipOptions({ colorScheme, currency, groupBy, locale, unit }), + mode: 'index', + position: 'top', + xAlign: 'center', + yAlign: 'bottom' + }; +} diff --git a/libs/ui/src/lib/chart/index.ts b/libs/ui/src/lib/chart/index.ts index 2a3d3b358..01597c515 100644 --- a/libs/ui/src/lib/chart/index.ts +++ b/libs/ui/src/lib/chart/index.ts @@ -1 +1,2 @@ +export * from './chart.options'; export * from './chart.registry'; diff --git a/libs/ui/src/lib/currency-selector/currency-selector.component.html b/libs/ui/src/lib/currency-selector/currency-selector.component.html index e07101f9a..594515e24 100644 --- a/libs/ui/src/lib/currency-selector/currency-selector.component.html +++ b/libs/ui/src/lib/currency-selector/currency-selector.component.html @@ -1,9 +1,14 @@ +@if (emojiFlagOfSelectedCurrency) { + {{ emojiFlagOfSelectedCurrency }} +} + @for (currency of filteredCurrencies; track currency) { - {{ currency }} + + {{ getEmojiFlagFromCurrency(currency) }} + {{ currency }} + } diff --git a/libs/ui/src/lib/currency-selector/currency-selector.component.scss b/libs/ui/src/lib/currency-selector/currency-selector.component.scss deleted file mode 100644 index 5d4e87f30..000000000 --- a/libs/ui/src/lib/currency-selector/currency-selector.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - display: block; -} diff --git a/libs/ui/src/lib/currency-selector/currency-selector.component.stories.ts b/libs/ui/src/lib/currency-selector/currency-selector.component.stories.ts new file mode 100644 index 000000000..beb63e369 --- /dev/null +++ b/libs/ui/src/lib/currency-selector/currency-selector.component.stories.ts @@ -0,0 +1,99 @@ +import { ANIMATION_MODULE_TYPE } from '@angular/core'; +import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import '@angular/localize/init'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { Meta, moduleMetadata, StoryObj } from '@storybook/angular'; + +import { GfCurrencySelectorComponent } from './currency-selector.component'; + +const CURRENCIES = [ + 'AUD', + 'CHF', + 'EUR', + 'GBP', + 'GBp', + 'JPY', + 'USD', + 'XAU', + 'ZAR' +]; + +const meta: Meta = { + title: 'Currency Selector', + component: GfCurrencySelectorComponent, + decorators: [ + moduleMetadata({ + imports: [ + GfCurrencySelectorComponent, + MatFormFieldModule, + ReactiveFormsModule + ], + providers: [ + { + provide: ANIMATION_MODULE_TYPE, + useValue: 'NoopAnimations' + } + ] + }) + ], + render: ({ currencies, value }) => { + return { + props: { + currencies, + formGroup: new FormGroup({ + currency: new FormControl(value) + }) + }, + template: ` +
+ + Currency + + +
+ ` + }; + } +}; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + args: { + currencies: CURRENCIES, + value: 'CHF' + } +}; + +export const CurrencyOfEuropeanUnion: Story = { + args: { + currencies: CURRENCIES, + value: 'EUR' + } +}; + +export const DerivedCurrency: Story = { + args: { + currencies: CURRENCIES, + value: 'GBp' + } +}; + +export const SupranationalCurrency: Story = { + args: { + currencies: CURRENCIES, + value: 'XAU' + } +}; + +export const WithoutValue: Story = { + args: { + currencies: CURRENCIES, + value: null + } +}; diff --git a/libs/ui/src/lib/currency-selector/currency-selector.component.ts b/libs/ui/src/lib/currency-selector/currency-selector.component.ts index 724e86712..2eda80aba 100644 --- a/libs/ui/src/lib/currency-selector/currency-selector.component.ts +++ b/libs/ui/src/lib/currency-selector/currency-selector.component.ts @@ -1,3 +1,8 @@ +import { + getCountryCodeFromCurrency, + getEmojiFlag +} from '@ghostfolio/common/helper'; + import { FocusMonitor } from '@angular/cdk/a11y'; import { CUSTOM_ELEMENTS_SCHEMA, @@ -24,9 +29,11 @@ import { import { MatAutocomplete, MatAutocompleteModule, + MatAutocompleteOrigin, MatOption } from '@angular/material/autocomplete'; import { + MAT_FORM_FIELD, MatFormFieldControl, MatFormFieldModule } from '@angular/material/form-field'; @@ -39,7 +46,8 @@ import { AbstractMatFormField } from '../shared/abstract-mat-form-field'; changeDetection: ChangeDetectionStrategy.OnPush, host: { '[attr.aria-describedBy]': 'describedBy', - '[id]': 'id' + '[id]': 'id', + class: 'align-items-center d-flex' }, imports: [ FormsModule, @@ -56,7 +64,6 @@ import { AbstractMatFormField } from '../shared/abstract-mat-form-field'; ], schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-currency-selector', - styleUrls: ['./currency-selector.component.scss'], templateUrl: 'currency-selector.component.html' }) export class GfCurrencySelectorComponent @@ -72,6 +79,7 @@ export class GfCurrencySelectorComponent public readonly formControlName = input.required(); private readonly destroyRef = inject(DestroyRef); + private readonly formField = inject(MAT_FORM_FIELD); private readonly input = viewChild.required(MatInput); public constructor( @@ -86,8 +94,20 @@ export class GfCurrencySelectorComponent this.controlType = 'currency-selector'; } + public get autocompleteOrigin(): MatAutocompleteOrigin { + return { elementRef: this.formField.getConnectedOverlayOrigin() }; + } + + public get emojiFlagOfSelectedCurrency() { + const selectedCurrency = this.currencies().find((currency) => { + return currency === this.control.value; + }); + + return this.getEmojiFlagFromCurrency(selectedCurrency); + } + public override get empty() { - return this.input().empty; + return !this.control.value; } public override set value(value: string | null) { @@ -99,6 +119,10 @@ export class GfCurrencySelectorComponent this.input().focus(); } + public getEmojiFlagFromCurrency(aCurrency = '') { + return getEmojiFlag(getCountryCodeFromCurrency(aCurrency)); + } + public ngOnInit() { if (this.disabled) { this.control.disable(); diff --git a/libs/ui/src/lib/entity-logo/entity-logo.component.html b/libs/ui/src/lib/entity-logo/entity-logo.component.html index d8aeba136..0a7ecbcd2 100644 --- a/libs/ui/src/lib/entity-logo/entity-logo.component.html +++ b/libs/ui/src/lib/entity-logo/entity-logo.component.html @@ -1,8 +1,11 @@ -@if (src) { +@if (src && !hasError) { +} @else if (hasPlaceholder) { + } diff --git a/libs/ui/src/lib/entity-logo/entity-logo.component.scss b/libs/ui/src/lib/entity-logo/entity-logo.component.scss index 23bc7a487..051199346 100644 --- a/libs/ui/src/lib/entity-logo/entity-logo.component.scss +++ b/libs/ui/src/lib/entity-logo/entity-logo.component.scss @@ -2,7 +2,7 @@ align-items: center; display: flex; - img { + .logo { border-radius: 0.2rem; height: 0.8rem; width: 0.8rem; @@ -11,5 +11,15 @@ height: 1.4rem; width: 1.4rem; } + + &.placeholder { + border: 1px solid rgba(var(--dark-dividers)); + } + } +} + +:host-context(.theme-dark) { + .placeholder { + border-color: rgba(var(--light-dividers)); } } diff --git a/libs/ui/src/lib/entity-logo/entity-logo.component.stories.ts b/libs/ui/src/lib/entity-logo/entity-logo.component.stories.ts index 45a996294..786d54cbf 100644 --- a/libs/ui/src/lib/entity-logo/entity-logo.component.stories.ts +++ b/libs/ui/src/lib/entity-logo/entity-logo.component.stories.ts @@ -44,3 +44,19 @@ export const LogoByUrl: Story = { url: 'https://ghostfol.io' } }; + +export const Placeholder: Story = { + args: { + hasPlaceholder: true, + size: 'large' + } +}; + +export const PlaceholderOnError: Story = { + args: { + hasPlaceholder: true, + size: 'large', + tooltip: 'Unknown', + url: 'https://unknown.ghostfol.io' + } +}; diff --git a/libs/ui/src/lib/entity-logo/entity-logo.component.ts b/libs/ui/src/lib/entity-logo/entity-logo.component.ts index ba7d64ae0..ef8e72105 100644 --- a/libs/ui/src/lib/entity-logo/entity-logo.component.ts +++ b/libs/ui/src/lib/entity-logo/entity-logo.component.ts @@ -18,18 +18,22 @@ import { DataSource } from '@prisma/client'; }) export class GfEntityLogoComponent implements OnChanges { @Input() dataSource: DataSource; + @Input() hasPlaceholder = false; @Input() size: 'large'; @Input() symbol: string; @Input() tooltip: string; @Input() url: string; - public src: string; + public hasError = false; + public src?: string; public constructor( private readonly imageSourceService: EntityLogoImageSourceService ) {} public ngOnChanges() { + this.hasError = false; + if (this.dataSource && this.symbol) { this.src = this.imageSourceService.getLogoUrlByAssetProfileIdentifier({ dataSource: this.dataSource, @@ -37,6 +41,12 @@ export class GfEntityLogoComponent implements OnChanges { }); } else if (this.url) { this.src = this.imageSourceService.getLogoUrlByUrl(this.url); + } else { + this.src = undefined; } } + + public onError() { + this.hasError = true; + } } diff --git a/libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html b/libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html new file mode 100644 index 000000000..02eed4442 --- /dev/null +++ b/libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.html @@ -0,0 +1,26 @@ +@if (isLoading() && !fearAndGreedIndex()) { + +} @else { +
+
{{ fearAndGreedIndexEmoji() }}
+
+
+ {{ fearAndGreedIndexText() }} + @let value = fearAndGreedIndex() | number: '1.0-0'; + {{ + value ?? placeholder + }}/100 +
+ Current Market Mood +
+
+} diff --git a/apps/client/src/app/components/home-market/home-market.scss b/libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.scss similarity index 100% rename from apps/client/src/app/components/home-market/home-market.scss rename to libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.scss diff --git a/libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.stories.ts b/libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.stories.ts new file mode 100644 index 000000000..b5b2074da --- /dev/null +++ b/libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.stories.ts @@ -0,0 +1,39 @@ +import '@angular/localize/init'; +import { moduleMetadata } from '@storybook/angular'; +import type { Meta, StoryObj } from '@storybook/angular'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; + +import { GfFearAndGreedIndexComponent } from './fear-and-greed-index.component'; + +export default { + title: 'Fear & Greed Index', + component: GfFearAndGreedIndexComponent, + decorators: [ + moduleMetadata({ + imports: [NgxSkeletonLoaderModule] + }) + ] +} as Meta; + +type Story = StoryObj; + +export const Loading: Story = { + args: { + fearAndGreedIndex: undefined, + isLoading: true + } +}; + +export const Default: Story = { + args: { + fearAndGreedIndex: 50, + isLoading: false + } +}; + +export const Unknown: Story = { + args: { + fearAndGreedIndex: undefined, + isLoading: false + } +}; diff --git a/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.ts b/libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.ts similarity index 53% rename from apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.ts rename to libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.ts index b507f0008..4416752b3 100644 --- a/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.ts +++ b/libs/ui/src/lib/fear-and-greed-index/fear-and-greed-index.component.ts @@ -5,8 +5,8 @@ import { DecimalPipe } from '@angular/common'; import { ChangeDetectionStrategy, Component, - Input, - OnChanges + computed, + input } from '@angular/core'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @@ -17,16 +17,17 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; styleUrls: ['./fear-and-greed-index.component.scss'], templateUrl: './fear-and-greed-index.component.html' }) -export class GfFearAndGreedIndexComponent implements OnChanges { - @Input() fearAndGreedIndex: number; +export class GfFearAndGreedIndexComponent { + public readonly fearAndGreedIndex = input(); + public readonly isLoading = input(false); - public fearAndGreedIndexEmoji: string; - public fearAndGreedIndexText: string; + protected readonly placeholder = '—'; - public ngOnChanges() { - const { emoji, key } = resolveFearAndGreedIndex(this.fearAndGreedIndex); + protected readonly fearAndGreedIndexEmoji = computed(() => { + return resolveFearAndGreedIndex(this.fearAndGreedIndex()).emoji; + }); - this.fearAndGreedIndexEmoji = emoji; - this.fearAndGreedIndexText = translate(key); - } + protected readonly fearAndGreedIndexText = computed(() => { + return translate(resolveFearAndGreedIndex(this.fearAndGreedIndex()).key); + }); } diff --git a/libs/ui/src/lib/fear-and-greed-index/index.ts b/libs/ui/src/lib/fear-and-greed-index/index.ts new file mode 100644 index 000000000..0f1db159b --- /dev/null +++ b/libs/ui/src/lib/fear-and-greed-index/index.ts @@ -0,0 +1 @@ +export * from './fear-and-greed-index.component'; diff --git a/libs/ui/src/lib/holdings-table/holdings-table.component.html b/libs/ui/src/lib/holdings-table/holdings-table.component.html index ce5214e78..e66dac725 100644 --- a/libs/ui/src/lib/holdings-table/holdings-table.component.html +++ b/libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -81,8 +81,9 @@
@@ -105,8 +106,9 @@
@@ -125,9 +127,10 @@
@@ -147,10 +150,9 @@
@@ -170,13 +172,10 @@
diff --git a/libs/ui/src/lib/i18n.ts b/libs/ui/src/lib/i18n.ts index 26091be05..9e55a5edb 100644 --- a/libs/ui/src/lib/i18n.ts +++ b/libs/ui/src/lib/i18n.ts @@ -85,6 +85,7 @@ const locales = { FEAR: $localize`Fear`, GREED: $localize`Greed`, NEUTRAL: $localize`Neutral`, + UNKNOWN: $localize`Unknown`, // Sectors 'Basic Materials': $localize`Basic Materials`, diff --git a/libs/ui/src/lib/line-chart/line-chart.component.ts b/libs/ui/src/lib/line-chart/line-chart.component.ts index 92ee8e4ec..edc377fa3 100644 --- a/libs/ui/src/lib/line-chart/line-chart.component.ts +++ b/libs/ui/src/lib/line-chart/line-chart.component.ts @@ -1,14 +1,11 @@ import { - getTooltipOptions, + getChartBorderColor, + getTimeAxisOptions, + getValueAxisOptions, getVerticalHoverLinePlugin } from '@ghostfolio/common/chart-helper'; import { primaryColorRgb, secondaryColorRgb } from '@ghostfolio/common/config'; -import { - getBackgroundColor, - getDateFormatString, - getLocale, - getTextColor -} from '@ghostfolio/common/helper'; +import { getBackgroundColor, getLocale } from '@ghostfolio/common/helper'; import { LineChartItem } from '@ghostfolio/common/interfaces'; import { ColorScheme } from '@ghostfolio/common/types'; @@ -38,7 +35,10 @@ import { import 'chartjs-adapter-date-fns'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; -import { registerChartConfiguration } from '../chart'; +import { + getTimeSeriesTooltipOptions, + registerChartConfiguration +} from '../chart'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -209,49 +209,21 @@ export class GfLineChartComponent }, tooltip: this.getTooltipPluginConfiguration(), verticalHoverLine: { - color: `rgba(${getTextColor(this.colorScheme)}, 0.1)` + color: getChartBorderColor(this.colorScheme) } }, scales: { - x: { - border: { - color: `rgba(${getTextColor(this.colorScheme)}, 0.1)` - }, + x: getTimeAxisOptions({ + colorScheme: this.colorScheme, display: this.showXAxis, - grid: { - display: false - }, - time: { - tooltipFormat: getDateFormatString(this.locale), - unit: 'year' - }, - type: 'time' - }, + locale: this.locale + }), y: { - border: { - width: 0 - }, - display: this.showYAxis, - grid: { - color: ({ scale, tick }) => { - if ( - tick.value === 0 || - tick.value === scale.max || - tick.value === scale.min || - tick.value === this.yMax || - tick.value === this.yMin - ) { - return `rgba(${getTextColor(this.colorScheme)}, 0.1)`; - } - - return 'transparent'; - } - }, - max: this.yMax, - min: this.yMin, - position: 'right', - ticks: { - callback: (tickValue, index, ticks) => { + ...getValueAxisOptions({ + colorScheme: this.colorScheme, + display: this.showYAxis, + highlightedValues: [this.yMax, this.yMin], + tickCallback: (tickValue, index, ticks) => { if (index === 0 || index === ticks.length - 1) { // Only print last and first legend entry @@ -274,11 +246,10 @@ export class GfLineChartComponent } return ''; - }, - display: this.showYAxis, - mirror: true, - z: 1 - }, + } + }), + max: this.yMax, + min: this.yMin, type: 'linear' } }, @@ -321,17 +292,11 @@ export class GfLineChartComponent } private getTooltipPluginConfiguration(): Partial> { - return { - ...getTooltipOptions({ - colorScheme: this.colorScheme, - currency: this.currency, - locale: this.locale, - unit: this.unit - }), - mode: 'index', - position: 'top', - xAlign: 'center', - yAlign: 'bottom' - }; + return getTimeSeriesTooltipOptions<'line'>({ + colorScheme: this.colorScheme, + currency: this.currency, + locale: this.locale, + unit: this.unit + }); } } diff --git a/libs/ui/src/lib/mocks/entity-logo-image-source.service.mock.ts b/libs/ui/src/lib/mocks/entity-logo-image-source.service.mock.ts index 3f4dbbef7..766a4178b 100644 --- a/libs/ui/src/lib/mocks/entity-logo-image-source.service.mock.ts +++ b/libs/ui/src/lib/mocks/entity-logo-image-source.service.mock.ts @@ -2,6 +2,9 @@ import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { DataSource } from '@prisma/client'; +// Resolves like a logo of an unknown entity, but fails to load +const UNAVAILABLE_LOGO_URL = 'data:image/png;base64,unavailable'; + export class EntityLogoImageSourceServiceMock { public getLogoUrlByAssetProfileIdentifier({ dataSource, @@ -11,7 +14,7 @@ export class EntityLogoImageSourceServiceMock { return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAJa0lEQVR4nM2bW2wU1xnHf3vx2t61za5nL/bGKwx2jQnwUh5Q3bqyHYhzIVLUFoIaSKtGSrkkNaQJqlQSKaHQFygQJamUSomaRKpSlYekqSF1HGix6EOktIldOQs0OCEs3ssw48Ve8F77MGuwza4ve2Y3/KR92Ln8z/d9OnPmnG/OZ/jss2FKRA3QCiwDPEAtUAEkgWvAGKAAF4HPgWgpjDIXUdsF3AN0Zn/NVmuFoazMgtlswmw2YTAYyGQgnU6TSqVIpdIkEnFisRsZ4AJwGjgFfAiEi2GkQeceUAn8CPgJ0GG315hsNis2m5XycsuihCYn40xMxJiYiKGq0RRaMP4I/AW4rpfBegXAAfQAu+z2JU6HowabzYbBoIc0ZDIwMTGBokRR1bEI8ApwDO2REUI0AGbgKeB5t1uyS1ItZrNJ1KY5SSZTyPJVQiFZBfYDL6GNIwUhEoDvAr+XJMcaSXIsuouLEo/HiUQUZFkZBHYCA4XoGAu4xwS8APzD5/Ou8Xo9JXcewGKx4PV68Pm8a9DGhxezti2KxfYAF/COJDk63W5n0bv7QkkmU4RCEWRZOQU8wiLeGIvpAY3AgNvt7PR6PXeM8wBmswmv14Pb7exEexQaF3rvQgOwCjhbV+dq8XicBZhYGjweJ3V1rhbgLJrN87KQADQBJ71eT73LJYnYVxJcLgmv11MPnASa57t+vgC4gJP19e4GSXLoYV9JkCQH9fXuBuAEmg95mSsAZcBxt9vZ7HTW6mlfXsbHJzh27CU6Ojppbm7h4sWLBWs5nbW43c5m4DiaLzmZay2wX5Ic7aV65s+dO8fu3U8zNDQEgM1mo7q6WkjT43GSSqXaZVnZD/wq1zX5esD3gGfr6ubsPbpx/vx5tm597KbzAK2tK6itFe95WR+eRfPpNnIFwAy86vN5jUZjIfOkxTE5Ocnu3U8zOjo64/hDD21Ej/aNRiM+n9cIvEqOHp+rhR5Jcqyx22uEG18IfX19DA4OzjhWX1/Pww8/rFsbdnsNkuRYA/xi9rnZAagB9pVq0AN4//3eGf+rq6s5cuSwLt1/Ok6nA+A5NB9vMjsAO10uyW6x5B00dSWRSPDpp/+5+b+lpYW3336LtrY23duyWCy4XJIdbeF0k+nPRCWwR5Lsujeej3Q6zbJly1m6dCnd3d1s27YVs7l4SSpJshMOy3uAo8ANmLkY2mK31/zJ5/Pq1qAsy/T1fcjg4CCKomK1VrJy5Uo6Ojpoalp+2/VDQ0P09X2I33+O8fFrlJdX4PXW09bWRldXJ+Xl5cI2ffVVgLGx6BbgHZgZgL81NjY8UF1dJdxIMpnktdf+wOuvv0EoFLrtfEVFBV1dXWzc+AB33dXA4OAg7733Vz7++GMymUxOzdbWVvbufYb169cL2Xbt2jgjI1/3Ag/CrQC4gMDq1SvMBsE81uTkJDt3PklfX5+QTj4OHjzA1q2PFnx/JpNhaMifBLxAeGoQvMdurxF2PpVK0dOzp2jOA+zb9xx+v7/g+w0GA3Z7jRktY33zLdBls1mFjXvrrbfp7e2d/8ICMRgMHDjwG5qamoR0sr52wa23QGdVlVgAotEoL7/8ipDGfDz//HM8+uiPhXWyAegArQdYgeUWi1he78SJkzkHPL3o7r6Xxx//mS5a2RxmE1BpBJorKsqFJ939/f2iEnkxmUw89dSTumpmff6WEWjVI6s7MvKlsEY+li9fzqpVC8pwLZiszyuMQH1ZmfjsKxodE9bIR3NzEyaTvknY7Iyz3gg49BCfnIwLa+SjslL8DTWbrM8OI1Au+v4HdFm750NRruquaTQaACqMQCrP7HNR2Gw2cZE8DA9/TiwW01Uz63PSCFxLp9PCgnb7EmGNfIyOjnL69GldNbM+jxuBaDqdEhZctmyZsMZcHDlyTNdekPU5agTkZFI8AOvWrRPWmAu/309Pz24SiYQuelmfw0bgcz1G8La271BWVtxM0gcf/J0nntjO5cuXhbWyPp8zAhdu3JgUHgQaGxtZu/bbwobNR39/P5s2PSKsk/X5vBGIAV/E4+K9YMuWLcIaCyGZLHhDCKBtrgC+AK5PvbxPjY+LDzD33deNz+cT1pmPzZs3Cd2f9fUU3MoHfDQxIR4Aq9XKrl07hHXmora2lm3btgppZH2dEYB+VY0m8+XjFsPmzZtZvXq1sE4+duzYjsfjKfj+TCaDqkaTQD/cCkAY6NPjMTCbzezf/0JR0tt3372Sxx7bJqSR9bEPCMHMDyNvqqo+K7q1a9eyd++zumhNUVVl4/DhQ1RWVgrpZH18c+r/9AC8q6rRsF4Tje3bfy78rE5hNps5evSocE4gkUigqtEQ8O5N7WnnrwO/k2X1t3p9Fn/xxReIxa5z/PjxGcdtNhvr199De3s7DQ0NxONx/H4/J06c4JNP/j3j2qoqGwcPHuTeezcI2yPLKsARpm21nb1Nrgb4csWKJl2/D/b29nLmzACJRIKWlhY2bFifc+2QyWQYGBjg7Nl/oSgqdXUeNm58kObmebf6zEs8nsDv/58KLGXaTvRc+wR/KUmOQ15v4SPtnUggEESWlWeAw9OP58piHJNlZUhVS7JdvySoanRqS+2x2edyBSAJ7Lh0KZDWI0/wTZNOp7l0KZBG+yx+2xw6Xx5rADg0OlqUGoWSEgyGAQ6RZzP1XIm8fbKsnAkGI8WwqyQEgxEiEWUAbWdITuYKQAL4YSgUuRCJ6J+ULDaRyFVCocgF4AdA3qXufKncMHD/lSuhr2VZuDijZMiywpUrocvA/cyzc3whuewLwH2BQPBKOCzrYV9RCYdlAoHgFaAbzfY5WWgy/79A2+ho+NydPCYEgxFGR8MXgDY0m+dlMV8zRoD2UChyKhAIokciVS+SyRSBQJBQKHIKrZRnZKH3LvZzTgjYIMvK/uHh8+k7YbKkqlGGh8+ns/uBN5Bd5i4UkaKpduBVSXKsdjprKdXewini8QSRyFVkWRlCm+ScKURHj7K5HuDXLpfkkCQHenxpnotEIoksK4TDsgIcQJvefiNlc9OpAZ4EehyOJW6HYwlWq1XXwslYLIaijKEoYyE0p19Gh/riYpTObgJ+Cnx/qnS2qsrKYrfgxONxxsdnlM7+E6109s/cgaWzufCg7cTqAjqMRmNzRUU5ZWVllJWZMJnyFU8nuHFjknQ6PVU8/VH2FyyGkcUMwGxqgJVoJW11gARYuL18fgQYpkTl8/8HqhBYlUKrXOwAAAAASUVORK5CYII='; } - return ''; + return UNAVAILABLE_LOGO_URL; } public getLogoUrlByUrl(url: string) { @@ -19,6 +22,6 @@ export class EntityLogoImageSourceServiceMock { return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAP1BMVEU2z8v////x/Pspzcn0/Px73drR8/KC3tz6/v6e5eOl5+WM4d7n+PhI08/i9/eu6edV1dJk2NVx2teV4+G87evvttLSAAABDElEQVRYhe2V3Y6EIAyFrQXlTwHd93/WpeBsdiKbtF7tJJwbCKFfDlKO0zQ0NPQJwqrn1ZO2zlk9PWPgusClRcsJmHb4pWUTItDDu4zMBJ5w0yog4HGvB0gCgOoBZrYFdL16AMsmmD5AcQ3ofj3AwbOAX38BIhMw02ZjtQ+tLnht66mCAGA2eka1G3eabUZwD/PLbeuHenKMBODVV0Dru/TTQLgKAc1BvQ/9yAEkOnlon66oehEBIHp7dbSyPoIc0NEADMDnAa4wAvVK+CADRGx/VpNSi+iF3jMTUH4rJQ0aISPmVk+JoJiZeJw1QnaqL2OmWKSFkxnrZWsbXK4TzO5tmS+8TYaGhv6xvgEEfAgHGc7HRgAAAABJRU5ErkJggg=='; } - return ''; + return UNAVAILABLE_LOGO_URL; } } 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 index cda9cab3c..6c8902112 100644 --- 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 @@ -7,13 +7,12 @@ @for (account of accounts(); track account.id) {
- @if (account.platform?.url) { - - } + {{ account.name }}
diff --git a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.util.ts b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.util.ts index ec3114d41..193624c76 100644 --- a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.util.ts +++ b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.util.ts @@ -1,3 +1,4 @@ +import { TAG_ID_EXCLUDE_FROM_ANALYSIS } from '@ghostfolio/common/config'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { Filter, PortfolioPosition } from '@ghostfolio/common/interfaces'; @@ -105,8 +106,8 @@ export function getTagFilters( ): Filter[] { return ( tags - ?.filter(({ isUsed }) => { - return isUsed; + ?.filter(({ id, isUsed }) => { + return id !== TAG_ID_EXCLUDE_FROM_ANALYSIS && isUsed; }) ?.map(({ id, name }) => { return { diff --git a/libs/ui/src/lib/services/admin.service.ts b/libs/ui/src/lib/services/admin.service.ts index 6a06ef76b..8510f1729 100644 --- a/libs/ui/src/lib/services/admin.service.ts +++ b/libs/ui/src/lib/services/admin.service.ts @@ -4,6 +4,7 @@ import { HEADER_KEY_TOKEN } from '@ghostfolio/common/config'; import { + CreateAssetProfileSplitDto, CreatePlatformDto, UpdateAssetProfileDto, UpdatePlatformDto @@ -23,7 +24,7 @@ import { GF_ENVIRONMENT } from '@ghostfolio/ui/environment'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { Injectable, inject } from '@angular/core'; -import { MarketData, Platform } from '@prisma/client'; +import { AssetProfileSplit, MarketData, Platform } from '@prisma/client'; import { JobStatus } from 'bull'; import { isNumber } from 'lodash'; @@ -61,6 +62,16 @@ export class AdminService { return this.http.delete(`/api/v1/platform/${aId}`); } + public deleteAssetProfileSplit({ + dataSource, + id, + symbol + }: AssetProfileIdentifier & { id: string }) { + return this.http.delete( + `/api/v1/asset-profiles/${dataSource}/${encodeURIComponent(symbol)}/splits/${id}` + ); + } + public deleteProfileData({ dataSource, symbol }: AssetProfileIdentifier) { return this.http.delete( `/api/v1/admin/profile-data/${dataSource}/${encodeURIComponent(symbol)}` @@ -217,6 +228,17 @@ export class AdminService { ); } + public postAssetProfileSplit({ + dataSource, + split, + symbol + }: AssetProfileIdentifier & { split: CreateAssetProfileSplitDto }) { + return this.http.post( + `/api/v1/asset-profiles/${dataSource}/${encodeURIComponent(symbol)}/splits`, + split + ); + } + public postPlatform(aPlatform: CreatePlatformDto) { return this.http.post(`/api/v1/platform`, aPlatform); } diff --git a/libs/ui/src/lib/services/data.service.ts b/libs/ui/src/lib/services/data.service.ts index 23c654ae6..7081f9b2c 100644 --- a/libs/ui/src/lib/services/data.service.ts +++ b/libs/ui/src/lib/services/data.service.ts @@ -329,8 +329,24 @@ export class DataService { return this.http.delete(`/api/v1/account-balance/${aId}`); } - public deleteActivities({ filters }: { filters?: Filter[] }) { - const params = this.buildFiltersAsQueryParams({ filters }); + public deleteActivities({ + activityTypes, + filters, + range + }: { + activityTypes?: string[]; + filters?: Filter[]; + range?: DateRange; + }) { + let params = this.buildFiltersAsQueryParams({ filters }); + + if (activityTypes?.length) { + params = params.append('activityTypes', activityTypes.join(',')); + } + + if (range) { + params = params.append('range', range); + } return this.http.delete('/api/v1/activities', { params }); } @@ -459,11 +475,15 @@ export class DataService { public fetchExport({ activityIds, activityTypes, - filters + filters, + range, + withActivityIds = false }: { activityIds?: string[]; activityTypes?: string[]; filters?: Filter[]; + range?: DateRange; + withActivityIds?: boolean; } = {}) { let params = this.buildFiltersAsQueryParams({ filters }); @@ -475,9 +495,26 @@ export class DataService { params = params.append('activityTypes', activityTypes.join(',')); } - return this.http.get('/api/v1/export', { - params - }); + if (range) { + params = params.append('range', range); + } + + return this.http + .get('/api/v1/export', { + params + }) + .pipe( + map((exportResponse) => { + if (!withActivityIds) { + for (const activity of exportResponse.activities) { + delete (activity as Omit & { id?: string }) + .id; + } + } + + return exportResponse; + }) + ); } public fetchHoldingDetail({ @@ -509,8 +546,7 @@ export class DataService { public fetchInfo(): InfoItem { const info = cloneDeep((window as any).info); const utmSource = window.localStorage.getItem('utm_source') as - | 'ios' - | 'trusted-web-activity'; + 'ios' | 'trusted-web-activity'; info.globalPermissions = filterGlobalPermissions( info.globalPermissions, @@ -553,6 +589,10 @@ export class DataService { item.date = parseISO(item.date); } + for (const item of data.splits ?? []) { + item.date = parseISO(item.date); + } + return data; }) ); @@ -691,13 +731,11 @@ export class DataService { public fetchPortfolioPerformance({ filters, range, - withExcludedAccounts = false, - withItems = false + withExcludedAccounts = false }: { filters?: Filter[]; range: DateRange; withExcludedAccounts?: boolean; - withItems?: boolean; }): Observable { let params = this.buildFiltersAsQueryParams({ filters }); params = params.append('range', range); @@ -706,10 +744,6 @@ export class DataService { params = params.append('withExcludedAccounts', withExcludedAccounts); } - if (withItems) { - params = params.append('withItems', withItems); - } - return this.http .get(`/api/v2/portfolio/performance`, { params @@ -949,8 +983,7 @@ export class DataService { public updateInfo() { this.http.get('/api/v1/info').subscribe((info) => { const utmSource = window.localStorage.getItem('utm_source') as - | 'ios' - | 'trusted-web-activity'; + 'ios' | 'trusted-web-activity'; info.globalPermissions = filterGlobalPermissions( info.globalPermissions, diff --git a/libs/ui/src/lib/shared/abstract-mat-form-field.ts b/libs/ui/src/lib/shared/abstract-mat-form-field.ts index 0d547af4e..a6ef16175 100644 --- a/libs/ui/src/lib/shared/abstract-mat-form-field.ts +++ b/libs/ui/src/lib/shared/abstract-mat-form-field.ts @@ -1,7 +1,7 @@ import { FocusMonitor } from '@angular/cdk/a11y'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { - Component, + Directive, DoCheck, ElementRef, HostBinding, @@ -13,10 +13,7 @@ import { ControlValueAccessor, NgControl, Validators } from '@angular/forms'; import { MatFormFieldControl } from '@angular/material/form-field'; import { Subject } from 'rxjs'; -@Component({ - template: '', - standalone: false -}) +@Directive() export abstract class AbstractMatFormField implements ControlValueAccessor, DoCheck, MatFormFieldControl, OnDestroy { diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts index cab911ef2..704c4ed44 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts @@ -41,6 +41,7 @@ import { debounceTime, distinctUntilChanged, filter, + map, switchMap } from 'rxjs/operators'; @@ -128,6 +129,9 @@ export class GfSymbolAutocompleteComponent this.control.valueChanges .pipe( + map((query) => { + return isString(query) ? query.trim() : query; + }), filter((query) => { if (query?.length === 0) { this.showDefaultOptions(); @@ -137,13 +141,13 @@ export class GfSymbolAutocompleteComponent return isString(query); }), + debounceTime(400), + distinctUntilChanged(), tap(() => { this.isLoading = true; this.changeDetectorRef.markForCheck(); }), - debounceTime(400), - distinctUntilChanged(), takeUntilDestroyed(this.destroyRef), switchMap((query: string) => { return this.dataService.fetchSymbols({ diff --git a/libs/ui/src/lib/tags-selector/tags-selector.component.html b/libs/ui/src/lib/tags-selector/tags-selector.component.html index 4f9d82ae9..9bede09a7 100644 --- a/libs/ui/src/lib/tags-selector/tags-selector.component.html +++ b/libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1,24 +1,22 @@
@if (readonly) { -
Tags
+
Tags
@if ( - (tags && tags.length > 0) || (tagsReadOnly && tagsReadOnly.length > 0) + tagsSelected().length > 0 || (tagsReadOnly && tagsReadOnly.length > 0) ) { - + @if (tagsReadOnly) { - @for (tag of tagsReadOnly; track tag) { - {{ tag.name }} + @for (tag of tagsReadOnly; track tag.id) { + {{ tag.name }} } } - @if (tags) { - @for (tag of tags; track tag) { - {{ tag.name }} - } + @for (tag of tagsSelected(); track tag.id) { + {{ tag.name }} } - + } @else { -
-
+
} } @else { diff --git a/libs/ui/src/lib/tags-selector/tags-selector.component.stories.ts b/libs/ui/src/lib/tags-selector/tags-selector.component.stories.ts index 48aeaffe3..e8bdd1873 100644 --- a/libs/ui/src/lib/tags-selector/tags-selector.component.stories.ts +++ b/libs/ui/src/lib/tags-selector/tags-selector.component.stories.ts @@ -87,6 +87,14 @@ export const Readonly: Story = { } }; +export const ReadonlyWithoutValue: Story = { + args: { + readonly: true, + tags: [], + tagsAvailable: OPTIONS + } +}; + export const WithoutValue: Story = { args: { tags: [], 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 c0d5fe6a6..0e97e12fd 100644 --- a/libs/ui/src/lib/tags-selector/tags-selector.component.ts +++ b/libs/ui/src/lib/tags-selector/tags-selector.component.ts @@ -167,7 +167,7 @@ export class GfTagsSelectorComponent return id; }); - return this.tagsAvailable + return (this.tagsAvailable ?? []) .filter(({ id, name }) => { return ( !tagIds.includes(id) && diff --git a/libs/ui/src/lib/value/value.component.html b/libs/ui/src/lib/value/value.component.html index 14ac7154a..3ab711f7e 100644 --- a/libs/ui/src/lib/value/value.component.html +++ b/libs/ui/src/lib/value/value.component.html @@ -27,7 +27,20 @@ } - @if (value || value === 0 || value === null) { + + @if (isLoading() || value === undefined) { + + } @else if (value || value === 0 || value === null) {
} - @if (value === undefined) { - - } - @if (size === 'large') {
diff --git a/libs/ui/src/lib/value/value.component.stories.ts b/libs/ui/src/lib/value/value.component.stories.ts index a5971b252..19139e266 100644 --- a/libs/ui/src/lib/value/value.component.stories.ts +++ b/libs/ui/src/lib/value/value.component.stories.ts @@ -30,6 +30,9 @@ export default { enableCopyToClipboardButton: { control: 'boolean' }, + isLoading: { + control: 'boolean' + }, size: { control: 'select', options: ['small', 'medium', 'large'] @@ -41,7 +44,7 @@ type Story = StoryObj; export const Loading: Story = { args: { - value: undefined + isLoading: true } }; diff --git a/libs/ui/src/lib/value/value.component.ts b/libs/ui/src/lib/value/value.component.ts index 494f7a347..cc08e5a24 100644 --- a/libs/ui/src/lib/value/value.component.ts +++ b/libs/ui/src/lib/value/value.component.ts @@ -62,6 +62,8 @@ export class GfValueComponent implements AfterViewInit, OnChanges, OnDestroy { public readonly copiedTitle = $localize`The value has been copied to the clipboard`; public readonly copyToClipboardTitle = $localize`Copy to clipboard`; + public readonly isLoading = input(false); + public readonly precision = input(); public constructor( private changeDetectorRef: ChangeDetectorRef, @@ -74,8 +76,6 @@ export class GfValueComponent implements AfterViewInit, OnChanges, OnDestroy { }); } - public readonly precision = input(); - private copyToClipboardTimeout: ReturnType; private readonly formatOptions = computed(() => { diff --git a/package-lock.json b/package-lock.json index d2837bde1..ce97c403b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.35.0", + "version": "3.43.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.35.0", + "version": "3.43.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { @@ -32,19 +32,19 @@ "@nest-lab/throttler-storage-redis": "1.2.0", "@nestjs/bull": "11.0.4", "@nestjs/cache-manager": "3.1.3", - "@nestjs/common": "11.1.27", + "@nestjs/common": "11.1.28", "@nestjs/config": "4.0.4", - "@nestjs/core": "11.1.27", + "@nestjs/core": "11.1.28", "@nestjs/event-emitter": "3.1.0", "@nestjs/jwt": "11.0.2", "@nestjs/passport": "11.0.5", - "@nestjs/platform-express": "11.1.27", + "@nestjs/platform-express": "11.1.28", "@nestjs/schedule": "6.1.3", "@nestjs/serve-static": "5.0.5", "@nestjs/throttler": "6.5.0", "@openrouter/ai-sdk-provider": "3.0.0", - "@prisma/adapter-pg": "7.8.0", - "@prisma/client": "7.8.0", + "@prisma/adapter-pg": "7.9.1", + "@prisma/client": "7.9.1", "@simplewebauthn/browser": "13.3.0", "@simplewebauthn/server": "13.3.1", "ai": "7.0.37", @@ -97,6 +97,7 @@ "tablemark": "4.1.0", "twitter-api-v2": "1.29.0", "undici": "8.5.0", + "uuid": "14.0.1", "yahoo-finance2": "4.0.0", "zod": "4.4.3", "zone.js": "0.16.1" @@ -116,7 +117,7 @@ "@eslint/eslintrc": "3.3.1", "@eslint/js": "9.35.0", "@nestjs/schematics": "11.1.0", - "@nestjs/testing": "11.1.27", + "@nestjs/testing": "11.1.28", "@nx/angular": "23.0.2", "@nx/eslint-plugin": "23.0.2", "@nx/jest": "23.0.2", @@ -127,7 +128,7 @@ "@nx/storybook": "23.0.2", "@nx/web": "23.0.2", "@nx/workspace": "23.0.2", - "@prisma/config": "7.8.0", + "@prisma/config": "7.9.1", "@schematics/angular": "21.2.6", "@storybook/addon-docs": "10.1.10", "@storybook/addon-themes": "10.1.10", @@ -157,7 +158,7 @@ "nx": "23.0.2", "prettier": "3.9.6", "prettier-plugin-organize-attributes": "1.0.0", - "prisma": "7.8.0", + "prisma": "7.9.1", "react": "18.2.0", "react-dom": "18.2.0", "replace-in-file": "8.4.0", @@ -3908,33 +3909,33 @@ } }, "node_modules/@electric-sql/pglite": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.4.1.tgz", - "integrity": "sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.4.3.tgz", + "integrity": "sha512-ichuWTgtd4mOM1G4SpyGJa5trT03lWbMypDV0fUXUCXg5hiHqVAz/bZyV68NqmkLB7WcYmj1RMJVSp8HV/v/ZQ==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@electric-sql/pglite-socket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@electric-sql/pglite-socket/-/pglite-socket-0.1.1.tgz", - "integrity": "sha512-p2hoXw3Z3LQHwTeikdZNsFBOvXGqKY2hk51BBw+8NKND8eoH+8LFOtW9Z8CQKmTJ2qqGYu82ipqiyFZOTTXNfw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite-socket/-/pglite-socket-0.1.3.tgz", + "integrity": "sha512-LAciWM0M1dCL8hlsxu2venbVZcdxema0BtDfpWYVqr+Y468UADw0pFWidhKw1M8sfJ8rdLT71tjMmnirf/IZRQ==", "devOptional": true, "license": "Apache-2.0", "bin": { "pglite-server": "dist/scripts/server.js" }, "peerDependencies": { - "@electric-sql/pglite": "0.4.1" + "@electric-sql/pglite": "0.4.3" } }, "node_modules/@electric-sql/pglite-tools": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@electric-sql/pglite-tools/-/pglite-tools-0.3.1.tgz", - "integrity": "sha512-C+T3oivmy9bpQvSxVqXA1UDY8cB9Eb9vZHL9zxWwEUfDixbXv4G3r2LjoTdR33LD8aomR3O9ZXEO3XEwr/cUCA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite-tools/-/pglite-tools-0.3.3.tgz", + "integrity": "sha512-AlzLJTRJ8+UFgK8CmxIpyIpJ0+YaFw02IiOSdYrqxwPXdSyeIShz8aa9Tq+tYFXdPwcaMp/Fc80mQZ1dkOQ/wg==", "devOptional": true, "license": "Apache-2.0", "peerDependencies": { - "@electric-sql/pglite": "0.4.1" + "@electric-sql/pglite": "0.4.3" } }, "node_modules/@emnapi/core": { @@ -7034,9 +7035,9 @@ } }, "node_modules/@nestjs/common": { - "version": "11.1.27", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.27.tgz", - "integrity": "sha512-kEGSzqM2lWr4whh4Ubflw+oPZSEzxvRMu9WL+LveZploJWTjec5bBlCiRVlVzTPg2kIwBiLwWSvCCW7Wnin1gg==", + "version": "11.1.28", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.28.tgz", + "integrity": "sha512-bRImsxibie+AM7xjdwcrm/gr5YeacI65kSBNzTufa1Ib5iwziaY/lqMtRh9THq6pbV4e1HP9aI2ZxGUumnmaoQ==", "license": "MIT", "dependencies": { "file-type": "21.3.4", @@ -7119,9 +7120,9 @@ } }, "node_modules/@nestjs/core": { - "version": "11.1.27", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.27.tgz", - "integrity": "sha512-K6DX7hcqmZdeXkv7tsPakKBRCgqL19a4mtbX4FluY0hWtFdtPKp6lbe+lb8gWPfvLdbOWr/CPScn7BSjBX+Ecg==", + "version": "11.1.28", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.28.tgz", + "integrity": "sha512-06m63xIRj8+l8uOeh/8LnYupGubkyu4f+bPKIadaSui6vK9KpXgoz7HveT1yOVLcEt0M0oCOEW5EuEXZkEmBBQ==", "license": "MIT", "dependencies": { "fast-safe-stringify": "2.1.1", @@ -7194,14 +7195,14 @@ } }, "node_modules/@nestjs/platform-express": { - "version": "11.1.27", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.27.tgz", - "integrity": "sha512-0ZFhz6H6EdGh4xQVbUNwjoAwBuz73P7FvUAl67h9CTdMqQlJDaQYJApBv8pKfVZ1fGjMCbl0m9DcC6pXaZPWSQ==", + "version": "11.1.28", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.28.tgz", + "integrity": "sha512-hU+9Sz4m+onHrR5AmelI59QKmY/Re546bPnygnpqqeQdHDiJpBgjWbL4t6Jr73CBpS60cpyng7WzjgphNB9iwA==", "license": "MIT", "dependencies": { "cors": "2.8.6", "express": "5.2.1", - "multer": "2.1.1", + "multer": "2.2.0", "path-to-regexp": "8.4.2", "tslib": "2.8.1" }, @@ -7477,9 +7478,9 @@ } }, "node_modules/@nestjs/testing": { - "version": "11.1.27", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.27.tgz", - "integrity": "sha512-I35po13UHZZeGenLWJ3QYwh77RsLau5RcFKWBZ4waVHeARpwjtC7v7n7lGh98swLQdGmZgTnbvKaZ0B5dsUIKA==", + "version": "11.1.28", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.28.tgz", + "integrity": "sha512-B+VgRxeLaH7jkOMgAyUP3N3rpFlisQ7JRxixRbgHvG6a0VgKbbkNSofKExexCgKmQQak80undb3+2kE1lUBmRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10041,24 +10042,24 @@ } }, "node_modules/@prisma/adapter-pg": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@prisma/adapter-pg/-/adapter-pg-7.8.0.tgz", - "integrity": "sha512-ygb3UkerK3v8MDpXVgCISdRNDozpxh6+JVJgiIGbSr5KBgz10LLf5ejUskPGoXlsIjxsOu6nuy1JVQr2EKGSlg==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@prisma/adapter-pg/-/adapter-pg-7.9.1.tgz", + "integrity": "sha512-Ho2RK1KanQxLNSC0sR5bpiiVep10sWPLXCcxK+KXfI/Q69TMRbiafSvLPv3V9snimX72rMCqGlyJ4sBO4lKTAw==", "license": "Apache-2.0", "dependencies": { - "@prisma/driver-adapter-utils": "7.8.0", + "@prisma/driver-adapter-utils": "7.9.1", "@types/pg": "^8.16.0", "pg": "^8.16.3", "postgres-array": "3.0.4" } }, "node_modules/@prisma/client": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.8.0.tgz", - "integrity": "sha512-HFp3Dawv/3sU3JtlPha90IB+48lS7zHiH4LKZPjmcE8YH5P9DOXGPvo8dqOtO7MqLDd1p2hOWMcFlRT1DMblHw==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-7.9.1.tgz", + "integrity": "sha512-+xgrh2EhJVF79wC0yX5G4PI1Rdcm7Qn/nekNQ+t/O153wtNggruHal+fXHSa0QE+Tp/Cw5wvxeCEhZZ59xGm8Q==", "license": "Apache-2.0", "dependencies": { - "@prisma/client-runtime-utils": "7.8.0" + "@prisma/client-runtime-utils": "7.9.1" }, "engines": { "node": "^20.19 || ^22.12 || >=24.0" @@ -10077,15 +10078,15 @@ } }, "node_modules/@prisma/client-runtime-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@prisma/client-runtime-utils/-/client-runtime-utils-7.8.0.tgz", - "integrity": "sha512-5NQZztQ0oY/ADFkmd9gPuweH5A1/CCY8YQPorLLO0Mu6a87mY5gsnDkzmFmIHs9NFaLnZojzgddFVN4RpKYrdw==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@prisma/client-runtime-utils/-/client-runtime-utils-7.9.1.tgz", + "integrity": "sha512-mVIBGYdO5CFmK0HvjxrtfIyQQcPdb88pSCeVQriVQPVZyDovIWblpHfOgcS8QO187j3QF0ePArH8qPhp0AU2vg==", "license": "Apache-2.0" }, "node_modules/@prisma/config": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-7.8.0.tgz", - "integrity": "sha512-HFESzd9rx2ZQxlK+TL7tu1HPvCqrHiL6LCxYykI2c34mvaUuIVVl3lYuicJD/MNnzgPnyeBEMlK4WTomJCV5jw==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-7.9.1.tgz", + "integrity": "sha512-4znKhxTmXmuPye9Z6pbIyYb5VZlkZ05qG1L6Dr4g+7oTwc6V50Bs9XirFBDdjWt+H/AabMn9aUnxBcvj8z05aA==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -10096,97 +10097,95 @@ } }, "node_modules/@prisma/debug": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.8.0.tgz", - "integrity": "sha512-p+QZReysDUqXC+mk17q9a+Y/qzh4c2KYliDK30buYUyfrGeTGSyfmc0AIrJRhZJrLHhRiJa9Au/J72h3C+szvA==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.9.1.tgz", + "integrity": "sha512-/cpVZ4itxtcgB8GHBvZtcmuEjq+lWsLrRJxFMbwZrT1RIdtuKmUm7PPGo/wzfbYpBrk+9WmmBE8CHJw2rybKDQ==", "license": "Apache-2.0" }, "node_modules/@prisma/dev": { - "version": "0.24.3", - "resolved": "https://registry.npmjs.org/@prisma/dev/-/dev-0.24.3.tgz", - "integrity": "sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg==", + "version": "0.24.17", + "resolved": "https://registry.npmjs.org/@prisma/dev/-/dev-0.24.17.tgz", + "integrity": "sha512-UvdZzmpFwknnfreh6Jije84ekkYGPYEJhXG1tFzCsCfQyzJifrOo38eZc0qajzvaC6OLUOrN9ML5XfCnEZL9DA==", "devOptional": true, "license": "ISC", "dependencies": { - "@electric-sql/pglite": "0.4.1", - "@electric-sql/pglite-socket": "0.1.1", - "@electric-sql/pglite-tools": "0.3.1", - "@hono/node-server": "1.19.11", + "@electric-sql/pglite": "0.4.3", + "@electric-sql/pglite-socket": "0.1.3", + "@electric-sql/pglite-tools": "0.3.3", "@prisma/get-platform": "7.2.0", "@prisma/query-plan-executor": "7.2.0", - "@prisma/streams-local": "0.1.2", + "@prisma/streams-local": "0.1.11", + "find-my-way": "9.7.0", "foreground-child": "3.3.1", "get-port-please": "3.2.0", - "hono": "^4.12.8", - "http-status-codes": "2.3.0", "pathe": "2.0.3", "proper-lockfile": "4.1.2", "remeda": "2.33.4", "std-env": "3.10.0", - "valibot": "1.2.0", + "valibot": "1.4.2", "zeptomatch": "2.1.0" } }, "node_modules/@prisma/driver-adapter-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-7.8.0.tgz", - "integrity": "sha512-/Q13o0ZT0rjc1Xk0Q9KhZYwuq2EW/vSbWUBKfgEKkaCuB/Sg6bqnjmTZqC5cD4d6y1vfFAEwBRzfzoSMIVJ55A==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-7.9.1.tgz", + "integrity": "sha512-vmHehG7nn/heW32DXXpp13DxxAxVVe6n250oEt3dOL2E/4bt3olktKZN0mzSuxMMronyMSkbeW2uCOn3F4g8RQ==", "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "7.8.0" + "@prisma/debug": "7.9.1" } }, "node_modules/@prisma/engines": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-7.8.0.tgz", - "integrity": "sha512-jx3rCnNNrt5uzbkKlegtQ2GZHxSlihMCzutgT/BP6UIDF1r9tDI39hV/0T/cHZgzJ3ELbuQPXlVZy+Y1n0pcgw==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-7.9.1.tgz", + "integrity": "sha512-UprXSMNXx2NF5ow4pqaQtE8OuBz6K78B0wc0tn2L28G5r933iWp1DR9Do2qWrsNvvFIP3x6mpEWnQtckMO0Uhg==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "7.8.0", - "@prisma/engines-version": "7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a", - "@prisma/fetch-engine": "7.8.0", - "@prisma/get-platform": "7.8.0" + "@prisma/debug": "7.9.1", + "@prisma/engines-version": "7.9.0-1.e922089b7d7502aff4249d5da3420f6fa55fc6ad", + "@prisma/fetch-engine": "7.9.1", + "@prisma/get-platform": "7.9.1" } }, "node_modules/@prisma/engines-version": { - "version": "7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a.tgz", - "integrity": "sha512-fJPQxCkLgA5EayWaW8eArgCvjJ+N+Kz3VyeNKMEeYiQC4alNkxRKFVAGxv/ZUzuJISKqdw+zGeDbS6mn6RCPOA==", + "version": "7.9.0-1.e922089b7d7502aff4249d5da3420f6fa55fc6ad", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.9.0-1.e922089b7d7502aff4249d5da3420f6fa55fc6ad.tgz", + "integrity": "sha512-2BsPPFksz3CQUXG6af3rVCtJKg6+JJGJTtfgu2fU8DdXhOfkBjulCq8mwybCd6ge0/jhZq2kOtLAbmUDMyI1nA==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines/node_modules/@prisma/get-platform": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.8.0.tgz", - "integrity": "sha512-WlxgRGnolL8VH2EmkH1R/DkKNr/mVdS3G2h42IZFFZ3eUrH9OT6t73kIOSlkkrv50wG123Iq8d96ufv5LlZktw==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.9.1.tgz", + "integrity": "sha512-PK8R60YZRQvYxBrGG9i7l2/rFyzy+2MuI1dKtmtrCqPH8YpiJx/MfiC7LRzX5786rZDEv7BngcjfIJW4/9ADuw==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "7.8.0" + "@prisma/debug": "7.9.1" } }, "node_modules/@prisma/fetch-engine": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-7.8.0.tgz", - "integrity": "sha512-gwB0Euiz/DDRyxFRpLXYlK3RfaZUj1c5dAYMuhZYfApg7arknJlcb9bIsOHDppJmbqYaVA+yBIiFMDBfprsNPQ==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-7.9.1.tgz", + "integrity": "sha512-9DwxrNTeT25Orbu9CWh0CZvVlyY1lmscpbaeLZcOnuR7zcuFrt91YSmmOfIm7zJ08YOZ6mVzURKwLoMwEBcK8w==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "7.8.0", - "@prisma/engines-version": "7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a", - "@prisma/get-platform": "7.8.0" + "@prisma/debug": "7.9.1", + "@prisma/engines-version": "7.9.0-1.e922089b7d7502aff4249d5da3420f6fa55fc6ad", + "@prisma/get-platform": "7.9.1" } }, "node_modules/@prisma/fetch-engine/node_modules/@prisma/get-platform": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.8.0.tgz", - "integrity": "sha512-WlxgRGnolL8VH2EmkH1R/DkKNr/mVdS3G2h42IZFFZ3eUrH9OT6t73kIOSlkkrv50wG123Iq8d96ufv5LlZktw==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.9.1.tgz", + "integrity": "sha512-PK8R60YZRQvYxBrGG9i7l2/rFyzy+2MuI1dKtmtrCqPH8YpiJx/MfiC7LRzX5786rZDEv7BngcjfIJW4/9ADuw==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "7.8.0" + "@prisma/debug": "7.9.1" } }, "node_modules/@prisma/get-platform": { @@ -10214,9 +10213,9 @@ "license": "Apache-2.0" }, "node_modules/@prisma/streams-local": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@prisma/streams-local/-/streams-local-0.1.2.tgz", - "integrity": "sha512-l49yTxKKF2odFxaAXTmwmkBKL3+bVQ1tFOooGifu4xkdb9NMNLxHj27XAhTylWZod8I+ISGM5erU1xcl/oBCtg==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@prisma/streams-local/-/streams-local-0.1.11.tgz", + "integrity": "sha512-0TcebL559MByKqTJ+SsrFIEg228iw8UCVRFckzgfRSiJqczhs+MuAgWOF9lnOIV/IVqvu+KMnFTH0eDeTQMpUg==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -10226,7 +10225,7 @@ "proper-lockfile": "^4.1.2" }, "engines": { - "bun": ">=1.3.6", + "bun": ">=1.2.0", "node": ">=22.0.0" } }, @@ -10244,14 +10243,23 @@ } }, "node_modules/@prisma/studio-core": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@prisma/studio-core/-/studio-core-0.27.3.tgz", - "integrity": "sha512-AADjNFPdsrglxHQVTmHFqv6DuKQZ5WY4p5/gVFY017twvNrSwpLJ9lqUbYYxEu2W7nbvVxTZA8deJ8LseNALsw==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@prisma/studio-core/-/studio-core-0.33.0.tgz", + "integrity": "sha512-V2fX/nKEymNTrHXwfP26PGjoLStO35Ogu+ex7CFJbLrMYEcZxxZpiSNOs7px23Hk5mzLWvM5RsqG6Ka+rha+wg==", "devOptional": true, "license": "Apache-2.0", "dependencies": { "@radix-ui/react-toggle": "1.1.10", - "chart.js": "4.5.1" + "@visx/curve": "4.0.1-alpha.0", + "@visx/event": "4.0.1-alpha.0", + "@visx/grid": "4.0.1-alpha.0", + "@visx/group": "4.0.1-alpha.0", + "@visx/responsive": "4.0.1-alpha.0", + "@visx/scale": "4.0.1-alpha.0", + "@visx/shape": "4.0.1-alpha.0", + "d3-array": "3.2.4", + "d3-shape": "3.2.0", + "elkjs": "0.11.1" }, "engines": { "node": "^20.19 || ^22.12 || >=24.0", @@ -12501,9 +12509,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "devOptional": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@types/geojson": "*" } @@ -12531,9 +12538,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "license": "MIT", - "optional": true, - "peer": true + "devOptional": true, + "license": "MIT" }, "node_modules/@types/d3-polygon": { "version": "3.0.2", @@ -12756,9 +12762,8 @@ "version": "7946.0.16", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT", - "optional": true, - "peer": true + "devOptional": true, + "license": "MIT" }, "node_modules/@types/google-spreadsheet": { "version": "3.1.5", @@ -12902,7 +12907,7 @@ "version": "4.17.24", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@types/luxon": { @@ -13056,7 +13061,6 @@ "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -14168,6 +14172,265 @@ "node": ">= 20" } }, + "node_modules/@visx/curve": { + "version": "4.0.1-alpha.0", + "resolved": "https://registry.npmjs.org/@visx/curve/-/curve-4.0.1-alpha.0.tgz", + "integrity": "sha512-jRu61Uz274pV1zyioXmboyrLutYbnKsgjj4njSGCnhdXj5GkZvZbg+ThDb6oOzoAnJOBRLz4rzPlWvNJOzuVMg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@visx/vendor": "4.0.0-alpha.0" + } + }, + "node_modules/@visx/event": { + "version": "4.0.1-alpha.0", + "resolved": "https://registry.npmjs.org/@visx/event/-/event-4.0.1-alpha.0.tgz", + "integrity": "sha512-EQqCMSv/s8NbFjo+hz3FKsvvYfP+2QslsFJ/24/O5l/W+7UC6J6aAvO0ujVwrTwdYbuQ+vhxKi1xdPdKR/qj1g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/react": "*", + "@visx/point": "4.0.1-alpha.0" + } + }, + "node_modules/@visx/grid": { + "version": "4.0.1-alpha.0", + "resolved": "https://registry.npmjs.org/@visx/grid/-/grid-4.0.1-alpha.0.tgz", + "integrity": "sha512-rycutGmTHO+znNdPumheWMglm7YfpffvRwUkVy5zy4WoORIuKTMkDxwnOzHG2xMxU3EE/YCd37xFV5AxA30yeg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/react": "*", + "@visx/curve": "4.0.1-alpha.0", + "@visx/group": "4.0.1-alpha.0", + "@visx/point": "4.0.1-alpha.0", + "@visx/scale": "4.0.1-alpha.0", + "@visx/shape": "4.0.1-alpha.0", + "classnames": "^2.3.1" + }, + "peerDependencies": { + "react": "^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0" + } + }, + "node_modules/@visx/group": { + "version": "4.0.1-alpha.0", + "resolved": "https://registry.npmjs.org/@visx/group/-/group-4.0.1-alpha.0.tgz", + "integrity": "sha512-V19l7iQ7jccBv8kao/EByuI6o4xtxzzLV9nqVI1hRvmdzTVsuLpqlwzYCZUXJaTVvUWf8s4D2SQFjGkj/Nw+0w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/react": "*", + "classnames": "^2.3.1" + }, + "peerDependencies": { + "react": "^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0" + } + }, + "node_modules/@visx/point": { + "version": "4.0.1-alpha.0", + "resolved": "https://registry.npmjs.org/@visx/point/-/point-4.0.1-alpha.0.tgz", + "integrity": "sha512-ijTfr/Nx09f03vIj9nyTr3z4Xth4Y75427UaogJh6dnIRLMEFHQOwNu791sbfiNj0a+ZXuaE32h0vKrFe4/8Qg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@visx/responsive": { + "version": "4.0.1-alpha.0", + "resolved": "https://registry.npmjs.org/@visx/responsive/-/responsive-4.0.1-alpha.0.tgz", + "integrity": "sha512-o+1zGywQZY0+yOx3Iw87wc4bbPJRr/HnIukTwfOz4UVyj9pB1OQNVHB7OORO1+LBHJceWpB31co/ZV9KHncKrA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "^4.17.13", + "@types/react": "*", + "lodash": "^4.17.21" + }, + "peerDependencies": { + "react": "^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0" + } + }, + "node_modules/@visx/scale": { + "version": "4.0.1-alpha.0", + "resolved": "https://registry.npmjs.org/@visx/scale/-/scale-4.0.1-alpha.0.tgz", + "integrity": "sha512-nzjeE87vFSAXGWFiiNfBpNLAf0Q8Qmf6syvKLjqNi4kGZkdhbUll3E/59YsgWXmjM8+llPLWzGsP+JPvo5eq1A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@visx/vendor": "4.0.0-alpha.0" + } + }, + "node_modules/@visx/shape": { + "version": "4.0.1-alpha.0", + "resolved": "https://registry.npmjs.org/@visx/shape/-/shape-4.0.1-alpha.0.tgz", + "integrity": "sha512-62QeiVNmPlterQGwhkEDcbq7M0MqY0lBsK5QKXtM9ZoPZWkuGV3aykA3+Xu20B2FAvyJq4LqJzBc7Sxr+EAdbA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "^4.17.13", + "@types/react": "*", + "@visx/curve": "4.0.1-alpha.0", + "@visx/group": "4.0.1-alpha.0", + "@visx/scale": "4.0.1-alpha.0", + "@visx/vendor": "4.0.0-alpha.0", + "classnames": "^2.3.1", + "lodash": "^4.17.21" + }, + "peerDependencies": { + "react": "^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0" + } + }, + "node_modules/@visx/vendor": { + "version": "4.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@visx/vendor/-/vendor-4.0.0-alpha.0.tgz", + "integrity": "sha512-6I+MuqXBcv9jnlcVowHoHKSdk9gXTWkHLKyqBwRWg7LY6A3Ei8SHfubpqGV5rBUSppxMq2RszPJUS6w+H0YgmQ==", + "devOptional": true, + "license": "MIT and ISC", + "dependencies": { + "@types/d3-array": "3.0.3", + "@types/d3-color": "3.1.0", + "@types/d3-delaunay": "6.0.1", + "@types/d3-format": "3.0.1", + "@types/d3-geo": "3.1.0", + "@types/d3-interpolate": "3.0.1", + "@types/d3-path": "3.1.1", + "@types/d3-scale": "4.0.2", + "@types/d3-shape": "3.1.7", + "@types/d3-time": "3.0.0", + "@types/d3-time-format": "2.1.0", + "d3-array": "3.2.1", + "d3-color": "3.1.0", + "d3-delaunay": "6.0.2", + "d3-format": "3.1.0", + "d3-geo": "3.1.0", + "d3-interpolate": "3.0.1", + "d3-path": "3.1.0", + "d3-scale": "4.0.2", + "d3-shape": "3.2.0", + "d3-time": "3.1.0", + "d3-time-format": "4.1.0", + "internmap": "2.0.3" + } + }, + "node_modules/@visx/vendor/node_modules/@types/d3-array": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.3.tgz", + "integrity": "sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@visx/vendor/node_modules/@types/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@visx/vendor/node_modules/@types/d3-delaunay": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", + "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@visx/vendor/node_modules/@types/d3-format": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@visx/vendor/node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@visx/vendor/node_modules/@types/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@visx/vendor/node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@visx/vendor/node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@visx/vendor/node_modules/@types/d3-time-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.1.0.tgz", + "integrity": "sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@visx/vendor/node_modules/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@visx/vendor/node_modules/d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@visx/vendor/node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "devOptional": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@visx/vendor/node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@vitejs/plugin-basic-ssl": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.4.tgz", @@ -15462,9 +15725,9 @@ } }, "node_modules/better-result": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/better-result/-/better-result-2.8.2.tgz", - "integrity": "sha512-YOf0VSj5nUPI27doTtXF+BBnsiRq3qY7avHqfIWnppxTLGyvkLq1QV2RTxkwoZwJ60ywLfZ0raFF4J/G886i7A==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/better-result/-/better-result-2.10.0.tgz", + "integrity": "sha512-oQhh0y1qo2/ZKdAAEvHZAqKKiHOFU5k/bW96fE2ScgQOVkJRiHwB+nOS1SgFsYqRlxMDWvefXi9Q3px7QvgNDw==", "devOptional": true, "license": "MIT" }, @@ -15723,6 +15986,16 @@ "node": ">=12" } }, + "node_modules/bull/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/bundle-name": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", @@ -16392,6 +16665,13 @@ "validator": "^13.15.22" } }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "devOptional": true, + "license": "MIT" + }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -18049,8 +18329,7 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "devOptional": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/cytoscape": { "version": "3.33.2", @@ -18157,9 +18436,8 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "devOptional": true, "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "internmap": "1 - 2" }, @@ -18214,9 +18492,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "devOptional": true, "license": "ISC", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -18372,9 +18649,8 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "devOptional": true, "license": "ISC", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -18408,9 +18684,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "devOptional": true, "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "d3-color": "1 - 3" }, @@ -18422,9 +18697,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "devOptional": true, "license": "ISC", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -18516,9 +18790,8 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "devOptional": true, "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -18560,9 +18833,8 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "devOptional": true, "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "d3-path": "^3.1.0" }, @@ -18574,9 +18846,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "devOptional": true, "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "d3-array": "2 - 3" }, @@ -18588,9 +18859,8 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "devOptional": true, "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "d3-time": "1 - 3" }, @@ -18943,9 +19213,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "devOptional": true, "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "robust-predicates": "^3.0.2" } @@ -19286,6 +19555,13 @@ "integrity": "sha512-mgjZAz7Jyx1SRCwEpy9wefDS7GvNPazLthHg8eQMJ76wBdGQQDW33TCrUTvQ4wzpmOrv2zrFoD3oNufMdyMpog==", "license": "ISC" }, + "node_modules/elkjs": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.11.1.tgz", + "integrity": "sha512-zxxR9k+rx5ktMwT/FwyLdPCrq7xN6e4VGGHH8hA01vVYKjTFik7nHOxBnAYtrgYUB1RpAiLvA1/U2YraWxyKKg==", + "devOptional": true, + "license": "EPL-2.0" + }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", @@ -20460,6 +20736,13 @@ ], "license": "MIT" }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "devOptional": true, + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -20510,6 +20793,16 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, "node_modules/fast-redact": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", @@ -20898,6 +21191,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-my-way": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.7.0.tgz", + "integrity": "sha512-f2JHn75x2JlwUwLenZypgczR7YWMb/uO9BvUXtus+JMgkbIkLADd38cI4EiV+OQqrGo1Zlq6V8wnqMJ8e62wUQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^5.0.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -21768,9 +22076,9 @@ "license": "ISC" }, "node_modules/grammex": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/grammex/-/grammex-3.1.12.tgz", - "integrity": "sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==", + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/grammex/-/grammex-3.1.13.tgz", + "integrity": "sha512-LnPnhOBLEJEVKS8WFDVaA397L9Kq55Q9oSITJiVLHVdhAclfUkWzQv74KhvZHKL2Q09Pb1XdsrOsZ4LfTFFTEg==", "devOptional": true, "license": "MIT" }, @@ -22645,9 +22953,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "devOptional": true, "license": "ISC", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -26218,9 +26525,9 @@ } }, "node_modules/multer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.1.1.tgz", - "integrity": "sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.2.0.tgz", + "integrity": "sha512-6rdyFg2kLrMh9Jee7/BMPuV9lEAd7lLW2YUpF9/YxR7njyoUwwQ0ZPh3TaIY50Sw6vlyD2HW3wGOkTS4P79xrQ==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", @@ -29188,17 +29495,17 @@ } }, "node_modules/prisma": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.8.0.tgz", - "integrity": "sha512-yfN4yrw7HV9kEJhoy1+jgah0jafEIQsf7uWouSsM8MvJtlubsk+kM7AIBWZ8+GJl74Yj3c+nbYqBkMOxtsZ3Lw==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.9.1.tgz", + "integrity": "sha512-aPqePoZIqwlAchbgbFDO/wHqGB+7H1nj9gaM+OsL9h77S5S3TnLd9BgD3LnoeDikULo7cl2HSUrEyQ55Z7DYbg==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/config": "7.8.0", - "@prisma/dev": "0.24.3", - "@prisma/engines": "7.8.0", - "@prisma/studio-core": "0.27.3", + "@prisma/config": "7.9.1", + "@prisma/dev": "0.24.17", + "@prisma/engines": "7.9.1", + "@prisma/studio-core": "0.33.0", "mysql2": "3.15.3", "postgres": "3.4.7" }, @@ -30152,6 +30459,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ret": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", + "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -30183,9 +30500,8 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", - "license": "Unlicense", - "optional": true, - "peer": true + "devOptional": true, + "license": "Unlicense" }, "node_modules/rolldown": { "version": "1.0.0-rc.4", @@ -30532,6 +30848,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-regex2": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.1.tgz", + "integrity": "sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ret": "~0.5.0" + }, + "bin": { + "safe-regex2": "bin/safe-regex2.js" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -31826,6 +32165,17 @@ "websocket-driver": "^0.7.4" } }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/socks": { "version": "2.8.7", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", @@ -34336,12 +34686,16 @@ } }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", + "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist-node/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { @@ -34374,9 +34728,9 @@ "license": "MIT" }, "node_modules/valibot": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.2.0.tgz", - "integrity": "sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.4.2.tgz", + "integrity": "sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg==", "devOptional": true, "license": "MIT", "peerDependencies": { diff --git a/package.json b/package.json index ccca3f2b1..b13aeab4c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.35.0", + "version": "3.43.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", @@ -76,19 +76,19 @@ "@nest-lab/throttler-storage-redis": "1.2.0", "@nestjs/bull": "11.0.4", "@nestjs/cache-manager": "3.1.3", - "@nestjs/common": "11.1.27", + "@nestjs/common": "11.1.28", "@nestjs/config": "4.0.4", - "@nestjs/core": "11.1.27", + "@nestjs/core": "11.1.28", "@nestjs/event-emitter": "3.1.0", "@nestjs/jwt": "11.0.2", "@nestjs/passport": "11.0.5", - "@nestjs/platform-express": "11.1.27", + "@nestjs/platform-express": "11.1.28", "@nestjs/schedule": "6.1.3", "@nestjs/serve-static": "5.0.5", "@nestjs/throttler": "6.5.0", "@openrouter/ai-sdk-provider": "3.0.0", - "@prisma/adapter-pg": "7.8.0", - "@prisma/client": "7.8.0", + "@prisma/adapter-pg": "7.9.1", + "@prisma/client": "7.9.1", "@simplewebauthn/browser": "13.3.0", "@simplewebauthn/server": "13.3.1", "ai": "7.0.37", @@ -141,6 +141,7 @@ "tablemark": "4.1.0", "twitter-api-v2": "1.29.0", "undici": "8.5.0", + "uuid": "14.0.1", "yahoo-finance2": "4.0.0", "zod": "4.4.3", "zone.js": "0.16.1" @@ -160,7 +161,7 @@ "@eslint/eslintrc": "3.3.1", "@eslint/js": "9.35.0", "@nestjs/schematics": "11.1.0", - "@nestjs/testing": "11.1.27", + "@nestjs/testing": "11.1.28", "@nx/angular": "23.0.2", "@nx/eslint-plugin": "23.0.2", "@nx/jest": "23.0.2", @@ -171,7 +172,7 @@ "@nx/storybook": "23.0.2", "@nx/web": "23.0.2", "@nx/workspace": "23.0.2", - "@prisma/config": "7.8.0", + "@prisma/config": "7.9.1", "@schematics/angular": "21.2.6", "@storybook/addon-docs": "10.1.10", "@storybook/addon-themes": "10.1.10", @@ -201,7 +202,7 @@ "nx": "23.0.2", "prettier": "3.9.6", "prettier-plugin-organize-attributes": "1.0.0", - "prisma": "7.8.0", + "prisma": "7.9.1", "react": "18.2.0", "react-dom": "18.2.0", "replace-in-file": "8.4.0", diff --git a/prisma/migrations/20260801103609_removed_is_excluded_from_account/migration.sql b/prisma/migrations/20260801103609_removed_is_excluded_from_account/migration.sql new file mode 100644 index 000000000..5fb01f5d2 --- /dev/null +++ b/prisma/migrations/20260801103609_removed_is_excluded_from_account/migration.sql @@ -0,0 +1,21 @@ +-- Create the "EXCLUDE_FROM_ANALYSIS" tag if it does not exist yet +INSERT INTO "Tag" ("id", "name") +VALUES ('f2e868af-8333-459f-b161-cbc6544c24bd', 'EXCLUDE_FROM_ANALYSIS') +ON CONFLICT DO NOTHING; + +-- Migrate accounts with "isExcluded" to the "EXCLUDE_FROM_ANALYSIS" tag +INSERT INTO "TagsOnAccounts" ("accountId", "tagId", "updatedAt", "userId") +SELECT + "id", + 'f2e868af-8333-459f-b161-cbc6544c24bd', + CURRENT_TIMESTAMP, + "userId" +FROM "Account" +WHERE "isExcluded" = true +ON CONFLICT DO NOTHING; + +-- DropIndex +DROP INDEX "Account_isExcluded_idx"; + +-- AlterTable +ALTER TABLE "Account" DROP COLUMN "isExcluded"; diff --git a/prisma/migrations/20260802000000_added_asset_profile_split/migration.sql b/prisma/migrations/20260802000000_added_asset_profile_split/migration.sql new file mode 100644 index 000000000..9003916b4 --- /dev/null +++ b/prisma/migrations/20260802000000_added_asset_profile_split/migration.sql @@ -0,0 +1,21 @@ +-- CreateTable +CREATE TABLE "AssetProfileSplit" ( + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "date" TIMESTAMP(3) NOT NULL, + "denominator" INTEGER NOT NULL, + "id" TEXT NOT NULL, + "numerator" INTEGER NOT NULL, + "symbolProfileId" TEXT NOT NULL, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "AssetProfileSplit_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE INDEX "AssetProfileSplit_date_idx" ON "AssetProfileSplit"("date"); + +-- CreateIndex +CREATE UNIQUE INDEX "AssetProfileSplit_symbolProfileId_date_key" ON "AssetProfileSplit"("symbolProfileId", "date"); + +-- AddForeignKey +ALTER TABLE "AssetProfileSplit" ADD CONSTRAINT "AssetProfileSplit_symbolProfileId_fkey" FOREIGN KEY ("symbolProfileId") REFERENCES "SymbolProfile"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20260805120000_removed_balance_from_account/migration.sql b/prisma/migrations/20260805120000_removed_balance_from_account/migration.sql new file mode 100644 index 000000000..2371cb748 --- /dev/null +++ b/prisma/migrations/20260805120000_removed_balance_from_account/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Account" DROP COLUMN "balance"; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 733399506..4451be4e2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -27,14 +27,11 @@ model Access { model Account { activities Order[] - balance Float @default(0) balances AccountBalance[] comment String? createdAt DateTime @default(now()) currency String? id String @default(uuid()) - /// @deprecated Use the "Exclude from Analysis" tag (`TAG_ID_EXCLUDE_FROM_ANALYSIS`) instead - isExcluded Boolean @default(false) name String? platform Platform? @relation(fields: [platformId], references: [id]) platformId String? @@ -46,7 +43,6 @@ model Account { @@id([id, userId]) @@index([currency]) @@index([id]) - @@index([isExcluded]) @@index([name]) @@index([userId]) } @@ -119,6 +115,33 @@ model AssetProfileResolution { @@unique([dataSourceOrigin, symbolOrigin]) } +/// A stock split of an asset profile. The numerator is the number of shares +/// held after the split, the denominator the number of shares held before, for +/// example 4 and 1 for a 4:1 split or 1 and 10 for a 1:10 reverse split. +/// +/// The ratio is stored as two integers instead of the resulting factor, so that +/// it stays exact, for example 1/3 for a 1:3 reverse split. +/// +/// Activities before the date are adjusted by the ratio: the quantity is +/// multiplied by it and the unit price divided by it, so that the total value +/// of an activity stays the same. +/// +/// Market data is already split-adjusted by the data providers and must not be +/// adjusted again. +model AssetProfileSplit { + createdAt DateTime @default(now()) + date DateTime + denominator Int + id String @id @default(uuid()) + numerator Int + symbolProfile SymbolProfile @relation(fields: [symbolProfileId], onDelete: Cascade, references: [id]) + symbolProfileId String + updatedAt DateTime @updatedAt + + @@unique([symbolProfileId, date]) + @@index([date]) +} + model AuthDevice { createdAt DateTime @default(now()) credentialId Bytes @@ -203,6 +226,7 @@ model SymbolProfile { activities Order[] assetClass AssetClass? assetProfileOverrides AssetProfileOverrides? + assetProfileSplits AssetProfileSplit[] assetSubClass AssetSubClass? comment String? countries Json? diff --git a/test/import/not-ok/invalid-platform.json b/test/import/not-ok/invalid-platform.json new file mode 100644 index 000000000..d280228b8 --- /dev/null +++ b/test/import/not-ok/invalid-platform.json @@ -0,0 +1,41 @@ +{ + "meta": { + "date": "2023-02-05T00:00:00.000Z", + "version": "dev" + }, + "accounts": [ + { + "balances": [], + "currency": "USD", + "id": "e62be662-a2c8-4cff-8b79-dc0a46576659", + "name": "Lehman Brothers Account", + "platformId": "2807e8e7-3966-4ced-8d82-0fa2d9c97277" + } + ], + "platforms": [ + { + "id": "2807e8e7-3966-4ced-8d82-0fa2d9c97277", + "name": "Lehman Brothers", + "url": "https://lehmanbrothers.com" + } + ], + "activities": [ + { + "accountId": "e62be662-a2c8-4cff-8b79-dc0a46576659", + "fee": 19, + "quantity": 5, + "type": "BUY", + "unitPrice": 298.58, + "currency": "USD", + "dataSource": "YAHOO", + "date": "2021-09-16T00:00:00.000Z", + "symbol": "MSFT" + } + ], + "user": { + "settings": { + "currency": "USD", + "performanceCalculationType": "ROAI" + } + } +} diff --git a/test/import/not-ok/invalid-symbol-with-manual-data-source.json b/test/import/not-ok/invalid-symbol-with-manual-data-source.json new file mode 100644 index 000000000..08d070e61 --- /dev/null +++ b/test/import/not-ok/invalid-symbol-with-manual-data-source.json @@ -0,0 +1,27 @@ +{ + "meta": { + "date": "2023-02-05T00:00:00.000Z", + "version": "dev" + }, + "activities": [ + { + "accountId": null, + "comment": null, + "currency": "USD", + "dataSource": "MANUAL", + "date": "2022-01-01T00:00:00.000Z", + "fee": 0, + "quantity": 1, + "symbol": "Penthouse Apartment", + "tags": [], + "type": "BUY", + "unitPrice": 500000 + } + ], + "user": { + "settings": { + "currency": "USD", + "performanceCalculationType": "ROAI" + } + } +} diff --git a/test/import/ok/500-activities.json b/test/import/ok/500-activities.json index 2793c695e..3c74d8517 100644 --- a/test/import/ok/500-activities.json +++ b/test/import/ok/500-activities.json @@ -5,10 +5,8 @@ }, "accounts": [ { - "balance": 2000, "currency": "USD", "id": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", - "isExcluded": false, "name": "My Online Trading Account", "platformId": null } diff --git a/test/import/ok/derived-currency.json b/test/import/ok/derived-currency.json index 637ab21b6..100ab6739 100644 --- a/test/import/ok/derived-currency.json +++ b/test/import/ok/derived-currency.json @@ -5,10 +5,8 @@ }, "accounts": [ { - "balance": 2000, "currency": "USD", "id": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", - "isExcluded": false, "name": "My Online Trading Account", "platformId": null } diff --git a/test/import/ok/sample.json b/test/import/ok/sample.json index be385812a..3c75c492b 100644 --- a/test/import/ok/sample.json +++ b/test/import/ok/sample.json @@ -5,7 +5,6 @@ }, "accounts": [ { - "balance": 2000, "balances": [ { "date": "2024-12-31T00:00:00.000Z", @@ -19,7 +18,6 @@ "comment": null, "currency": "USD", "id": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", - "isExcluded": false, "name": "My Online Trading Account", "platformId": "9da3a8a7-4795-43e3-a6db-ccb914189737" } diff --git a/test/import/ok/without-accounts.json b/test/import/ok/without-accounts.json index 2283dd889..cacbe153e 100644 --- a/test/import/ok/without-accounts.json +++ b/test/import/ok/without-accounts.json @@ -3,6 +3,28 @@ "date": "2022-04-01T00:00:00.000Z", "version": "dev" }, + "assetProfiles": [ + { + "assetClass": null, + "assetSubClass": null, + "comment": null, + "countries": [], + "currency": "USD", + "cusip": null, + "dataSource": "MANUAL", + "figi": null, + "figiComposite": null, + "figiShareClass": null, + "holdings": [], + "isActive": true, + "isin": null, + "marketData": [], + "name": "Penthouse Apartment", + "sectors": [], + "symbol": "7e91b7d4-1430-4212-8380-289a06c9bbc1", + "url": null + } + ], "activities": [ { "fee": 0, @@ -22,7 +44,7 @@ "currency": "USD", "dataSource": "MANUAL", "date": "2022-01-01T00:00:00.000Z", - "symbol": "Penthouse Apartment" + "symbol": "7e91b7d4-1430-4212-8380-289a06c9bbc1" }, { "fee": 0,