diff --git a/CHANGELOG.md b/CHANGELOG.md index c8498ad5cc..ed241b336e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,13 +5,88 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 3.70.0 - 2026-09-14 + +### Added + +- Added the holdings table to the overview tab of the home page on desktop (experimental) +- Added a tool to search for asset profiles to the server of the Model Context Protocol (MCP) (experimental) ### Changed -- Restricted the _Restricted view and manage_ permission of the access to share the portfolio to the Model Context Protocol (MCP) (experimental) +- Improved the style of the activity type filter on the activities page (experimental) +- Improved the style of the no activities info component +- Improved the style of the selector in the benchmark comparator +- Improved the language localization for Chinese (`zh`) +- Improved the language localization for German (`de`) +- Upgraded `@codewithdan/observable-store` from version `2.2.15` to `3.0.0` +- Upgraded `bull-board` from version `9.5.0` to `9.8.0` +- Upgraded `papaparse` from version `5.5.3` to `5.7.0` +- Upgraded `zone.js` from version `0.16.2` to `0.16.3` + +### Fixed + - Hardened the authentication with _OpenID Connect_ (`OIDC`) (experimental) + +## 3.69.0 - 2026-09-07 + +### Changed + +- Improved the loading state of the activity count in the portfolio summary +- Migrated the create dialog of the watchlist to a dedicated route +- Changed the holdings endpoint to return active and closed holdings by default and reuse a single snapshot for both types +- Upgraded `countries-and-timezones` from version `3.9.0` to `3.10.0` +- Upgraded `bull-board` from version `9.0.1` to `9.5.0` +- Upgraded `zod` from version `4.4.3` to `4.5.4` + +### Fixed + +- Resolved an issue when opening an asset profile from the watchlist + +## 3.68.0 - 2026-09-06 + +### Added + +- Added a simplified mode to the holdings table component + +### Changed + +- Made the details of holdings excluded from analysis accessible via the activities table +- Migrated the asset profile dialogs of the market data management in the admin control panel to dedicated routes + +## 3.67.1 - 2026-09-05 + +### Added + +- Introduced a DTO for the query parameters of the asset profiles endpoint +- Introduced a DTO for the query parameters of the symbol lookup endpoints + +### Changed + +- Improved the server of the Model Context Protocol (MCP) (experimental) +- Introduced a maximum length for the comment in the API endpoints +- Introduced a maximum length for the search query and the symbol in the API endpoints +- Hardened the validation of the query parameters (`accounts`, `assetClasses`, `dataSource` and `tags`) in the API endpoints with filters +- Upgraded `nestjs` from version `11.1.28` to `11.2.3` +- Upgraded `ngx-skeleton-loader` from version `12.0.0` to `13.0.0` + +### Fixed + +- Fixed the missing icon of the expiration date picker in the create or update access dialog +- Fixed the data provider information in the holding detail dialog +- Fixed the storage of the market data in the data provider service to only include the newly fetched quotes +- Fixed the immediate expiration of a portfolio snapshot with errors +- Fixed the missing country mapping of _Congo (Dem. Rep. of the)_ and _Congo (Rep. of)_ in the _Financial Modeling Prep_ service + +## 3.66.0 - 2026-09-03 + +### Changed + +- Moved the details of the granted access from the table to the dialog on the access page (experimental) +- Restricted the _Restricted view and manage_ permission of the access to share the portfolio to the Model Context Protocol (MCP) (experimental) +- Migrated the transfer cash balance dialog to a dedicated route - Improved the language localization for Italian (`it`) +- Upgraded `@rekog/mcp-nest` from version `2.0.0` to `2.0.2` - Upgraded `prisma` from version `7.9.1` to `7.10.0` ### Fixed diff --git a/apps/api/src/app/account/get-all-accounts.dto.ts b/apps/api/src/app/account/get-all-accounts.dto.ts index 61a2480195..efee3e6839 100644 --- a/apps/api/src/app/account/get-all-accounts.dto.ts +++ b/apps/api/src/app/account/get-all-accounts.dto.ts @@ -1,9 +1,11 @@ import { FilterDto } from '@ghostfolio/api/dtos/filter.dto'; +import { SEARCH_QUERY_MAXIMUM_LENGTH } from '@ghostfolio/common/config'; -import { IsOptional, IsString } from 'class-validator'; +import { IsOptional, IsString, MaxLength } from 'class-validator'; export class GetAllAccountsDto extends FilterDto { @IsOptional() @IsString() + @MaxLength(SEARCH_QUERY_MAXIMUM_LENGTH) query?: string; } diff --git a/apps/api/src/app/activities/activities.service.spec.ts b/apps/api/src/app/activities/activities.service.spec.ts index 4e935efb3e..72d1950294 100644 --- a/apps/api/src/app/activities/activities.service.spec.ts +++ b/apps/api/src/app/activities/activities.service.spec.ts @@ -216,6 +216,26 @@ describe('ActivitiesService', () => { }); }); + it('includes excluded accounts and activities when requested', async () => { + jest.spyOn(activitiesService, 'getActivities').mockResolvedValue({ + activities: [], + count: 0 + }); + + await activitiesService.getActivitiesForPortfolioCalculator({ + userCurrency: 'USD', + userId: 'user-id', + withExcludedAccountsAndActivities: true + }); + + expect(activitiesService.getActivities).toHaveBeenCalledWith({ + filters: undefined, + userCurrency: 'USD', + userId: 'user-id', + withExcludedAccountsAndActivities: true + }); + }); + it('does not adjust synthetic cash activities', async () => { const activity = createActivity({ symbol: 'AAPL' }); const cashActivity = createActivity({ diff --git a/apps/api/src/app/activities/activities.service.ts b/apps/api/src/app/activities/activities.service.ts index a0d9ffef57..7f6cbc8b0c 100644 --- a/apps/api/src/app/activities/activities.service.ts +++ b/apps/api/src/app/activities/activities.service.ts @@ -759,7 +759,8 @@ export class ActivitiesService { filters, userCurrency, userId, - withCash = false + withCash = false, + withExcludedAccountsAndActivities = false }: { /** Optional filters to apply to the activities. */ filters?: Filter[]; @@ -769,13 +770,15 @@ export class ActivitiesService { userId: string; /** Whether to include cash activities in the result. */ withCash?: boolean; + /** Whether to include activities that are excluded from analysis. */ + withExcludedAccountsAndActivities?: boolean; }) { const [activities, splits] = await Promise.all([ this.getActivities({ filters, userCurrency, userId, - withExcludedAccountsAndActivities: false // TODO + withExcludedAccountsAndActivities }), this.assetProfileSplitService.getSplitsByUserId({ userId }) ]); diff --git a/apps/api/src/app/endpoints/ai/ai.controller.ts b/apps/api/src/app/endpoints/ai/ai.controller.ts index 1a3fd3ba2a..9691e211de 100644 --- a/apps/api/src/app/endpoints/ai/ai.controller.ts +++ b/apps/api/src/app/endpoints/ai/ai.controller.ts @@ -1,6 +1,7 @@ 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 { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { AiPromptResponse } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; @@ -12,7 +13,8 @@ import { Inject, Param, Query, - UseGuards + UseGuards, + UseInterceptors } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; @@ -30,6 +32,7 @@ export class AiController { @Get('prompt/:mode') @HasPermission(permissions.readAiPrompt) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + @UseInterceptors(TransformDataSourceInRequestInterceptor) public async getPrompt( @Param('mode') mode: AiPromptMode, @Query() diff --git a/apps/api/src/app/endpoints/ai/ai.module.ts b/apps/api/src/app/endpoints/ai/ai.module.ts index d5cf0e3e95..f46ed1df88 100644 --- a/apps/api/src/app/endpoints/ai/ai.module.ts +++ b/apps/api/src/app/endpoints/ai/ai.module.ts @@ -1,26 +1,8 @@ -import { AccountBalanceService } from '@ghostfolio/api/app/account-balance/account-balance.service'; -import { AccountService } from '@ghostfolio/api/app/account/account.service'; -import { ActivitiesModule } from '@ghostfolio/api/app/activities/activities.module'; -import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; -import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; -import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; -import { RulesService } from '@ghostfolio/api/app/portfolio/rules.service'; -import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; -import { UserModule } from '@ghostfolio/api/app/user/user.module'; +import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { ApiModule } from '@ghostfolio/api/services/api/api.module'; -import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; -import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; -import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; -import { I18nModule } from '@ghostfolio/api/services/i18n/i18n.module'; -import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; -import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; -import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; -import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; +import { PortfolioTableModule } from '@ghostfolio/api/services/portfolio-table/portfolio-table.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; -import { PortfolioSnapshotQueueModule } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.module'; -import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; -import { TagModule } from '@ghostfolio/api/services/tag/tag.module'; import { Module } from '@nestjs/common'; @@ -31,32 +13,12 @@ import { AiService } from './ai.service'; controllers: [AiController], exports: [AiService], imports: [ - ActivitiesModule, ApiModule, - BenchmarkModule, ConfigurationModule, - DataProviderModule, - ExchangeRateDataModule, - I18nModule, - ImpersonationModule, - MarketDataModule, - PortfolioSnapshotQueueModule, - PrismaModule, + PortfolioTableModule, PropertyModule, - RedisCacheModule, - SymbolProfileModule, - TagModule, - UserModule + TransformDataSourceInRequestModule ], - providers: [ - AccountBalanceService, - AccountService, - AiService, - CurrentRateService, - MarketDataService, - PortfolioCalculatorFactory, - PortfolioService, - RulesService - ] + providers: [AiService] }) export class AiModule {} diff --git a/apps/api/src/app/endpoints/ai/ai.service.spec.ts b/apps/api/src/app/endpoints/ai/ai.service.spec.ts deleted file mode 100644 index 6328df1952..0000000000 --- a/apps/api/src/app/endpoints/ai/ai.service.spec.ts +++ /dev/null @@ -1,164 +0,0 @@ -import type { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; -import { TAG_ID_EXCLUDE_FROM_ANALYSIS } from '@ghostfolio/common/config'; -import { AccountWithValue } from '@ghostfolio/common/types'; - -import { AiService } from './ai.service'; - -// The service imports two packages which ship as an ECMAScript module only, -// which Jest cannot transform. The mocks only make the imports resolvable, -// because no test calls them. -jest.mock('@openrouter/ai-sdk-provider', () => { - return { createOpenRouter: jest.fn() }; -}); - -jest.mock('ai', () => { - return { generateText: jest.fn() }; -}); - -/** - * The markdown table is rendered by a package which ships as an ECMAScript - * module only, hence the service loads it with a dynamic import which Jest - * cannot run. The tests replace the method by a simple renderer, so that they - * can read the columns and the rows which the service gives to it. - */ -interface AiServiceWithMarkdownTable { - getMarkdownTable(parameters: { - columnDefinitions: readonly { name: string }[]; - rows: Record[]; - }): Promise; -} - -function createAccount({ - id = 'account-a-id', - isExcluded = false, - name = 'Account A' -}: { - id?: string; - isExcluded?: boolean; - name?: string; -} = {}) { - return { - id, - name, - activitiesCount: 3, - allocationInPercentage: 0.25, - balance: 1000, - currency: 'CHF', - platform: { name: 'Platform A' }, - tags: isExcluded ? [{ id: TAG_ID_EXCLUDE_FROM_ANALYSIS }] : [], - value: 2000 - } as unknown as AccountWithValue; -} - -function createAiService(accounts: AccountWithValue[]) { - const portfolioService = { - getAccountsWithAggregations: jest.fn().mockResolvedValue({ accounts }) - } as unknown as PortfolioService; - - const aiService = new AiService(null, null, null, portfolioService, null); - - jest - .spyOn( - aiService as unknown as AiServiceWithMarkdownTable, - 'getMarkdownTable' - ) - .mockImplementation(async ({ columnDefinitions, rows }) => { - const columnNames = columnDefinitions.map(({ name }) => { - return name; - }); - - return [ - columnNames.join(' | '), - ...rows.map((row) => { - return columnNames - .map((columnName) => { - return row[columnName]; - }) - .join(' | '); - }) - ].join('\n'); - }); - - return aiService; -} - -describe('AiService', () => { - // The tools of the model context protocol are the only callers, and an - // access of that type never grants the scope to read the monetary values, - // hence no table has a column with such a value - describe('getAccountsTableColumnNames', () => { - it('gives no column with a monetary value', () => { - expect(AiService.getAccountsTableColumnNames()).toEqual([ - 'Id', - 'Name', - 'Currency', - 'Platform', - 'Activities Count', - 'Allocation in Percentage', - 'Excluded from Analysis' - ]); - }); - }); - - describe('getActivitiesTableColumnNames', () => { - it('gives no column with a monetary value', () => { - expect(AiService.getActivitiesTableColumnNames()).toEqual([ - 'Date', - 'Type', - 'Name', - 'Symbol', - 'Currency', - 'Unit Price', - 'Account' - ]); - }); - }); - - describe('getAccountsTable', () => { - it('gives no cash balance and no value of an account', async () => { - const aiService = createAiService([createAccount()]); - - const result = await aiService.getAccountsTable({ userId: 'user-id' }); - - expect(result).not.toContain('Cash Balance'); - expect(result).not.toContain('1000'); - expect(result).not.toContain('2000'); - }); - - // The accountIds parameter of the tool takes the identifiers, hence the - // table has to give them - it('gives the identifier of an account', async () => { - const aiService = createAiService([createAccount()]); - - const result = await aiService.getAccountsTable({ userId: 'user-id' }); - - expect(result).toContain('account-a-id'); - }); - - it('marks an account which is excluded from the analysis', async () => { - const aiService = createAiService([ - createAccount({ isExcluded: true }), - createAccount({ id: 'account-b-id', name: 'Account B' }) - ]); - - const result = await aiService.getAccountsTable({ userId: 'user-id' }); - - const [rowOfAccountA, rowOfAccountB] = result - .split('\n') - .filter((line) => { - return line.startsWith('account-'); - }); - - expect(rowOfAccountA).toContain('true'); - expect(rowOfAccountB).toContain('false'); - }); - - it('tells that no accounts are found if the result is empty', async () => { - const aiService = createAiService([]); - - const result = await aiService.getAccountsTable({ userId: 'user-id' }); - - expect(result).toContain('No accounts found.'); - }); - }); -}); diff --git a/apps/api/src/app/endpoints/ai/ai.service.ts b/apps/api/src/app/endpoints/ai/ai.service.ts index 758499c6e6..401bee7d00 100644 --- a/apps/api/src/app/endpoints/ai/ai.service.ts +++ b/apps/api/src/app/endpoints/ai/ai.service.ts @@ -1,122 +1,25 @@ -import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service'; -import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; -import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; +import { PortfolioTableService } from '@ghostfolio/api/services/portfolio-table/portfolio-table.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { PROPERTY_API_KEY_OPENROUTER, PROPERTY_OPENROUTER_MODEL } from '@ghostfolio/common/config'; -import { DATE_FORMAT, isAccountExcluded } from '@ghostfolio/common/helper'; import { Filter } from '@ghostfolio/common/interfaces'; import type { AiPromptMode } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; import { createOpenRouter } from '@openrouter/ai-sdk-provider'; -import { - AssetClass, - AssetSubClass, - Type as ActivityType -} from '@prisma/client'; import { generateText } from 'ai'; -import { format } from 'date-fns'; -import type { ColumnDescriptor } from 'tablemark'; @Injectable() export class AiService { - private static readonly ACCOUNTS_TABLE_COLUMN_DEFINITIONS: ({ - key: - | 'ACTIVITIES_COUNT' - | 'ALLOCATION_PERCENTAGE' - | 'CURRENCY' - | 'EXCLUDED_FROM_ANALYSIS' - | 'ID' - | 'NAME' - | 'PLATFORM'; - } & ColumnDescriptor)[] = [ - { key: 'ID', name: 'Id' }, - { key: 'NAME', name: 'Name' }, - { key: 'CURRENCY', name: 'Currency' }, - { key: 'PLATFORM', name: 'Platform' }, - { align: 'right', key: 'ACTIVITIES_COUNT', name: 'Activities Count' }, - { - align: 'right', - key: 'ALLOCATION_PERCENTAGE', - name: 'Allocation in Percentage' - }, - { key: 'EXCLUDED_FROM_ANALYSIS', name: 'Excluded from Analysis' } - ]; - - private static readonly ACTIVITIES_TABLE_COLUMN_DEFINITIONS: ({ - key: - | 'ACCOUNT' - | 'CURRENCY' - | 'DATE' - | 'NAME' - | 'SYMBOL' - | 'TYPE' - | 'UNIT_PRICE'; - } & ColumnDescriptor)[] = [ - { key: 'DATE', name: 'Date' }, - { key: 'TYPE', name: 'Type' }, - { key: 'NAME', name: 'Name' }, - { key: 'SYMBOL', name: 'Symbol' }, - { key: 'CURRENCY', name: 'Currency' }, - { align: 'right', key: 'UNIT_PRICE', name: 'Unit Price' }, - { key: 'ACCOUNT', name: 'Account' } - ]; - - private static readonly HOLDINGS_TABLE_COLUMN_DEFINITIONS: ({ - key: - | 'ACTIVITIES_COUNT' - | 'ALLOCATION_PERCENTAGE' - | 'ASSET_CLASS' - | 'ASSET_SUB_CLASS' - | 'CURRENCY' - | 'DATE_OF_FIRST_ACTIVITY' - | 'NAME' - | 'SYMBOL'; - } & ColumnDescriptor)[] = [ - { key: 'NAME', name: 'Name' }, - { key: 'SYMBOL', name: 'Symbol' }, - { key: 'CURRENCY', name: 'Currency' }, - { key: 'ASSET_CLASS', name: 'Asset Class' }, - { key: 'ASSET_SUB_CLASS', name: 'Asset Sub Class' }, - { key: 'DATE_OF_FIRST_ACTIVITY', name: 'Date of First Activity' }, - { align: 'right', key: 'ACTIVITIES_COUNT', name: 'Activities Count' }, - { - align: 'right', - key: 'ALLOCATION_PERCENTAGE', - name: 'Allocation in Percentage' - } - ]; - public constructor( - private readonly activitiesService: ActivitiesService, private readonly configurationService: ConfigurationService, - private readonly i18nService: I18nService, - private readonly portfolioService: PortfolioService, + private readonly portfolioTableService: PortfolioTableService, private readonly propertyService: PropertyService ) {} - public static getAccountsTableColumnNames() { - return AiService.ACCOUNTS_TABLE_COLUMN_DEFINITIONS.map(({ name }) => { - return name; - }); - } - - public static getActivitiesTableColumnNames() { - return AiService.ACTIVITIES_TABLE_COLUMN_DEFINITIONS.map(({ name }) => { - return name; - }); - } - - public static getHoldingsTableColumnNames() { - return AiService.HOLDINGS_TABLE_COLUMN_DEFINITIONS.map(({ name }) => { - return name; - }); - } - public async generateText({ prompt, requestTimeout = this.configurationService.get('REQUEST_TIMEOUT') @@ -143,191 +46,6 @@ export class AiService { }); } - public async getAccountsTable({ - filters, - userId - }: { - filters?: Filter[]; - userId: string; - }) { - const { accounts } = - await this.portfolioService.getAccountsWithAggregations({ - filters, - userId, - withExcludedAccounts: true - }); - - const accountsTableRows = accounts.map( - ({ - activitiesCount, - allocationInPercentage, - currency, - id, - name: label, - platform, - tags - }) => { - return AiService.ACCOUNTS_TABLE_COLUMN_DEFINITIONS.reduce( - (row, { key, name }) => { - switch (key) { - case 'ACTIVITIES_COUNT': - row[name] = activitiesCount.toString(); - break; - - case 'ALLOCATION_PERCENTAGE': - row[name] = `${(allocationInPercentage * 100).toFixed(3)}%`; - break; - - case 'CURRENCY': - row[name] = currency ?? ''; - break; - - case 'EXCLUDED_FROM_ANALYSIS': - row[name] = isAccountExcluded({ tags }).toString(); - break; - - case 'ID': - row[name] = id; - break; - - case 'NAME': - row[name] = label ?? ''; - break; - - case 'PLATFORM': - row[name] = platform?.name ?? ''; - break; - - default: - row[name] = ''; - break; - } - - return row; - }, - {} as Record - ); - } - ); - - const accountsSection = ['## Accounts', '']; - - if (accountsTableRows.length > 0) { - accountsSection.push( - await this.getMarkdownTable({ - columnDefinitions: AiService.ACCOUNTS_TABLE_COLUMN_DEFINITIONS, - rows: accountsTableRows - }) - ); - } else { - accountsSection.push('No accounts found.'); - } - - return accountsSection.join('\n'); - } - - public async getActivitiesTable({ - endDate, - filters, - skip = 0, - startDate, - take, - types, - userCurrency, - userId - }: { - endDate?: Date; - filters?: Filter[]; - skip?: number; - startDate?: Date; - take: number; - types?: ActivityType[]; - userCurrency: string; - userId: string; - }) { - const { activities, count } = await this.activitiesService.getActivities({ - endDate, - filters, - skip, - startDate, - take, - types, - userCurrency, - userId, - includeDrafts: true, - sortColumn: 'date', - sortDirection: 'desc', - withExcludedAccountsAndActivities: true - }); - - const activitiesTableRows = activities.map( - ({ account, assetProfile, currency, date, type, unitPrice }) => { - return AiService.ACTIVITIES_TABLE_COLUMN_DEFINITIONS.reduce( - (row, { key, name }) => { - switch (key) { - case 'ACCOUNT': - row[name] = account?.name ?? ''; - break; - - case 'CURRENCY': - row[name] = currency ?? assetProfile.currency; - break; - - case 'DATE': - row[name] = format(date, DATE_FORMAT); - break; - - case 'NAME': - row[name] = assetProfile.name ?? ''; - break; - - case 'SYMBOL': - row[name] = assetProfile.symbol; - break; - - case 'TYPE': - row[name] = type; - break; - - case 'UNIT_PRICE': - row[name] = unitPrice.toString(); - break; - - default: - row[name] = ''; - break; - } - - return row; - }, - {} as Record - ); - } - ); - - const activitiesSection = [ - '## Activities', - '', - this.getActivitiesSummary({ - count, - skip, - numberOfActivities: activities.length - }) - ]; - - if (activitiesTableRows.length > 0) { - activitiesSection.push( - '', - await this.getMarkdownTable({ - columnDefinitions: AiService.ACTIVITIES_TABLE_COLUMN_DEFINITIONS, - rows: activitiesTableRows - }) - ); - } - - return activitiesSection.join('\n'); - } - public async getPrompt({ filters, languageCode, @@ -341,98 +59,12 @@ export class AiService { userCurrency: string; userId: string; }) { - const { holdings } = await this.portfolioService.getDetails({ + const holdingsSection = await this.portfolioTableService.getHoldingsTable({ filters, - userId - }); - - const assetClassTranslations = this.getEnumTranslations({ languageCode, - id: 'assetClass', - values: Object.values(AssetClass) - }); - - const assetSubClassTranslations = this.getEnumTranslations({ - languageCode, - id: 'assetSubClass', - values: Object.values(AssetSubClass) + userId }); - const holdingsTableRows = [...holdings] - .sort((a, b) => { - return b.allocationInPercentage - a.allocationInPercentage; - }) - .map( - ({ - activitiesCount, - allocationInPercentage, - assetProfile: { - assetClass, - assetSubClass, - currency, - name: label, - symbol - }, - dateOfFirstActivity - }) => { - return AiService.HOLDINGS_TABLE_COLUMN_DEFINITIONS.reduce( - (row, { key, name }) => { - switch (key) { - case 'ACTIVITIES_COUNT': - row[name] = activitiesCount.toString(); - break; - - case 'ALLOCATION_PERCENTAGE': - row[name] = `${(allocationInPercentage * 100).toFixed(3)}%`; - break; - - case 'ASSET_CLASS': - row[name] = assetClassTranslations[assetClass] ?? ''; - break; - - case 'ASSET_SUB_CLASS': - row[name] = assetSubClassTranslations[assetSubClass] ?? ''; - break; - - case 'CURRENCY': - row[name] = currency; - break; - - case 'DATE_OF_FIRST_ACTIVITY': - row[name] = dateOfFirstActivity - ? format(dateOfFirstActivity, DATE_FORMAT) - : ''; - break; - - case 'NAME': - row[name] = label; - break; - - case 'SYMBOL': - row[name] = symbol; - break; - - default: - row[name] = ''; - break; - } - - return row; - }, - {} as Record - ); - } - ); - - const holdingsSection = [ - '## Holdings', - '', - await this.getMarkdownTable({ - columnDefinitions: AiService.HOLDINGS_TABLE_COLUMN_DEFINITIONS, - rows: holdingsTableRows - }) - ].join('\n'); - if (mode === 'portfolio') { return holdingsSection; } @@ -451,82 +83,4 @@ export class AiService { `Provide your answer in the following language: ${languageCode}.` ].join('\n'); } - - private getActivitiesSummary({ - count, - numberOfActivities, - skip - }: { - count: number; - numberOfActivities: number; - skip: number; - }) { - if (count === 0) { - return 'No activities found.'; - } - - if (numberOfActivities === 0) { - return `No activities beyond the ${count} which match the parameters, hence lower the skip parameter.`; - } - - if (numberOfActivities === count) { - return `Showing all ${count} activities, the most recent first.`; - } - - const lastActivity = skip + numberOfActivities; - - const summary = `Showing the activities ${ - skip + 1 - } to ${lastActivity} of ${count}, the most recent first.`; - - if (lastActivity === count) { - return summary; - } - - return `${summary} Get the further activities by raising the skip parameter or narrow the result with the other parameters.`; - } - - private getEnumTranslations({ - id, - languageCode, - values - }: { - id: string; - languageCode: string; - values: T[]; - }) { - return values.reduce( - (translations, value) => { - translations[value] = - this.i18nService.getTranslation({ - languageCode, - id: `${id}.${value}` - }) || value; - - return translations; - }, - {} as Record - ); - } - - private async getMarkdownTable({ - columnDefinitions, - rows - }: { - columnDefinitions: readonly ColumnDescriptor[]; - rows: Record[]; - }) { - // Dynamic import to load ESM module from CommonJS context - // eslint-disable-next-line @typescript-eslint/no-implied-eval - const dynamicImport = new Function('s', 'return import(s)') as ( - s: string - ) => Promise; - const { tablemark } = await dynamicImport('tablemark'); - - return tablemark(rows, { - columns: columnDefinitions.map(({ align, name }) => { - return { name, align: align ?? 'left' }; - }) - }); - } } 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 e1452c548d..1db09f95e0 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 @@ -17,7 +17,7 @@ import { } from '@ghostfolio/common/interfaces'; import { hasPermission } from '@ghostfolio/common/permissions'; import { permissions } from '@ghostfolio/common/permissions'; -import { MarketDataPreset, RequestWithUser } from '@ghostfolio/common/types'; +import { RequestWithUser } from '@ghostfolio/common/types'; import { Body, @@ -27,7 +27,6 @@ import { HttpException, Inject, Param, - ParseIntPipe, Patch, Post, Query, @@ -36,11 +35,12 @@ import { } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; -import { AssetProfileSplit, DataSource, Prisma } from '@prisma/client'; +import { AssetProfileSplit, DataSource } from '@prisma/client'; import { parseISO } from 'date-fns'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { AssetProfilesService } from './asset-profiles.service'; +import { GetAssetProfilesDto } from './get-asset-profiles.dto'; @AllowDuringImpersonation() @Controller('asset-profiles') @@ -56,14 +56,17 @@ export class AssetProfilesController { @HasPermission(permissions.accessAdminControl) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getAssetProfiles( - @Query('assetSubClasses') filterByAssetSubClasses?: string, - @Query('dataSource') filterByDataSource?: string, - @Query('presetId') presetId?: MarketDataPreset, - @Query('query') filterBySearchQuery?: string, - @Query('skip', new ParseIntPipe({ optional: true })) skip?: number, - @Query('sortColumn') sortColumn?: string, - @Query('sortDirection') sortDirection?: Prisma.SortOrder, - @Query('take', new ParseIntPipe({ optional: true })) take?: number + @Query() + { + assetSubClasses: filterByAssetSubClasses, + dataSource: filterByDataSource, + presetId, + query: filterBySearchQuery, + skip, + sortColumn, + sortDirection, + take + }: GetAssetProfilesDto ): Promise { const filters = this.apiService.buildFiltersFromQueryParams({ filterByAssetSubClasses, diff --git a/apps/api/src/app/endpoints/asset-profiles/get-asset-profiles.dto.ts b/apps/api/src/app/endpoints/asset-profiles/get-asset-profiles.dto.ts new file mode 100644 index 0000000000..562a753918 --- /dev/null +++ b/apps/api/src/app/endpoints/asset-profiles/get-asset-profiles.dto.ts @@ -0,0 +1,64 @@ +import { SEARCH_QUERY_MAXIMUM_LENGTH } from '@ghostfolio/common/config'; +import { MarketDataPreset } from '@ghostfolio/common/types'; + +import { Prisma } from '@prisma/client'; +import { Type } from 'class-transformer'; +import { + IsIn, + IsInt, + IsOptional, + IsString, + MaxLength, + Min +} from 'class-validator'; + +export class GetAssetProfilesDto { + @IsOptional() + @IsString() + assetSubClasses?: string; + + @IsOptional() + @IsString() + dataSource?: string; + + @IsIn([ + 'BENCHMARKS', + 'CURRENCIES', + 'ETF_WITHOUT_COUNTRIES', + 'ETF_WITHOUT_SECTORS', + 'NO_ACTIVITIES' + ] as MarketDataPreset[]) + @IsOptional() + presetId?: MarketDataPreset; + + @IsOptional() + @IsString() + @MaxLength(SEARCH_QUERY_MAXIMUM_LENGTH) + query?: string; + + @IsInt() + @IsOptional() + @Min(0) + @Type(() => Number) + skip?: number; + + @IsIn([ + 'activitiesCount', + 'assetClass', + 'assetSubClass', + 'dataSource', + 'symbol' + ]) + @IsOptional() + sortColumn?: string; + + @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/endpoints/data-providers/ghostfolio/get-lookup.dto.ts b/apps/api/src/app/endpoints/data-providers/ghostfolio/get-lookup.dto.ts new file mode 100644 index 0000000000..0778d1b5bf --- /dev/null +++ b/apps/api/src/app/endpoints/data-providers/ghostfolio/get-lookup.dto.ts @@ -0,0 +1,16 @@ +import { SEARCH_QUERY_MAXIMUM_LENGTH } from '@ghostfolio/common/config'; + +import { Transform, TransformFnParams } from 'class-transformer'; +import { IsBoolean, IsString, MaxLength } from 'class-validator'; + +export class GetLookupDto { + @IsBoolean() + @Transform(({ value }: TransformFnParams) => { + return value === 'true'; + }) + includeIndices? = false; + + @IsString() + @MaxLength(SEARCH_QUERY_MAXIMUM_LENGTH) + query? = ''; +} 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 4bdb84ea74..cd330f6911 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 @@ -32,6 +32,7 @@ import { getReasonPhrase, StatusCodes } from 'http-status-codes'; import { GetDividendsDto } from './get-dividends.dto'; import { GetHistoricalDto } from './get-historical.dto'; +import { GetLookupDto } from './get-lookup.dto'; import { GetQuotesDto } from './get-quotes.dto'; import { GhostfolioService } from './ghostfolio.service'; @@ -142,10 +143,8 @@ export class GhostfolioController { @UseGuards(AuthGuard('api-key'), HasPermissionGuard) @Version('2') public async lookupSymbol( - @Query('includeIndices') includeIndicesParam = 'false', - @Query('query') query = '' + @Query() { includeIndices, query }: GetLookupDto ): Promise { - const includeIndices = includeIndicesParam === 'true'; await this.validateDailyRequestLimit(); try { diff --git a/apps/api/src/app/endpoints/mcp/mcp.controller.spec.ts b/apps/api/src/app/endpoints/mcp/mcp.controller.spec.ts index b07441e73e..f6e1d04383 100644 --- a/apps/api/src/app/endpoints/mcp/mcp.controller.spec.ts +++ b/apps/api/src/app/endpoints/mcp/mcp.controller.spec.ts @@ -1,285 +1,93 @@ -import { ImportValidationError } from '@ghostfolio/api/app/import/errors/import-validation.error'; -import { ImportService } from '@ghostfolio/api/app/import/import.service'; -import { UserService } from '@ghostfolio/api/app/user/user.service'; import { REQUIRES_SCOPE_KEY } from '@ghostfolio/api/decorators/requires-scope.decorator'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; -import { MCP_MAX_ACTIVITIES } from '@ghostfolio/common/config'; -import { Activity } from '@ghostfolio/common/interfaces'; -import { permissions } from '@ghostfolio/common/permissions'; -import { scopes } from '@ghostfolio/common/scopes'; -import type { - ImpersonationContext, - UserWithSettings -} from '@ghostfolio/common/types'; - -import { HttpException, Logger } from '@nestjs/common'; -import { RpcException } from '@nestjs/microservices'; -import { DataSource, Type as ActivityType } from '@prisma/client'; -import { getReasonPhrase, StatusCodes } from 'http-status-codes'; +import { McpToolExceptionFilter } from '@ghostfolio/api/filters/mcp-tool-exception.filter'; +import { AccessGuard } from '@ghostfolio/api/guards/access.guard'; +import { Scope, scopes } from '@ghostfolio/common/scopes'; import { - GhostfolioMcpController, - IMPORT_ACTIVITIES_PARAMETERS -} from './mcp.controller'; - -// The controller reads the columns of the tables from the AiService, which -// imports two packages which ship as an ECMAScript module only, which Jest -// cannot transform. The mocks only make the imports resolvable, because no -// test calls them. -jest.mock('@openrouter/ai-sdk-provider', () => { - return { createOpenRouter: jest.fn() }; -}); - -jest.mock('ai', () => { - return { generateText: jest.fn() }; -}); + EXCEPTION_FILTERS_METADATA, + GUARDS_METADATA +} from '@nestjs/common/constants'; +import { MCP_TOOL_METADATA_KEY, ToolMetadata } from '@rekog/mcp-nest'; + +import { GhostfolioMcpController } from './mcp.controller'; + +/** + * Gives the metadata which a decorator sets on the method of a tool. The + * prototype is read by the name of the method, hence the type of the metadata + * is given by the caller. + */ +function getMetadataOfMethod(metadataKey: string, methodName: string) { + const methodsByName = GhostfolioMcpController.prototype as unknown as Record< + string, + object + >; + + return Reflect.getMetadata(metadataKey, methodsByName[methodName]) as T; +} -function createActivity(overrides: Record = {}) { - return { - currency: 'USD', - date: '2024-01-01', - fee: 0, - quantity: 1, - symbol: 'AAPL', - type: ActivityType.BUY, - unitPrice: 100, - ...overrides - }; +function getToolMethodNames() { + return Object.getOwnPropertyNames(GhostfolioMcpController.prototype).filter( + (methodName) => { + return Boolean( + getMetadataOfMethod(MCP_TOOL_METADATA_KEY, methodName) + ); + } + ); } describe('GhostfolioMcpController', () => { - const impersonation = { userId: 'user-id' } as ImpersonationContext; - - let configuration: Record; - let configurationService: ConfigurationService; - let controller: GhostfolioMcpController; - let importService: ImportService; - let userService: UserService; + // A tool without the decorator of the scope would be open to every access, + // hence a new tool has to declare its scope + it('Requires a scope of access for each tool', () => { + const toolMethodNames = getToolMethodNames(); - function setupUser(userPermissions: string[]) { - jest.spyOn(userService, 'user').mockResolvedValue({ - permissions: userPermissions - } as UserWithSettings); - } + expect(toolMethodNames.length).toBeGreaterThan(0); - beforeEach(() => { - configuration = { - DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER: [], - ENABLE_FEATURE_SUBSCRIPTION: false - }; - - configurationService = { - get: jest.fn().mockImplementation((key: string) => { - return configuration[key]; - }) - } as unknown as ConfigurationService; - - importService = { - import: jest.fn().mockResolvedValue([]) - } as unknown as ImportService; + const toolMethodNamesWithoutScope = toolMethodNames.filter((methodName) => { + return !getMetadataOfMethod(REQUIRES_SCOPE_KEY, methodName) + ?.length; + }); - userService = { user: jest.fn() } as unknown as UserService; + expect(toolMethodNamesWithoutScope).toEqual([]); + }); - controller = new GhostfolioMcpController( - undefined, - undefined, - configurationService, - importService, - userService + // The decorator RequiresScope sets the same metadata as the decorator + // RequiresScopeOfAccess, but applies AuthGuard('jwt'), which a request of + // an access cannot pass, hence the guards tell the two decorators apart + it('Applies the guard of the access to each tool', () => { + const toolMethodNames = getToolMethodNames(); + + expect(toolMethodNames.length).toBeGreaterThan(0); + + const toolMethodNamesWithoutGuardOfAccess = toolMethodNames.filter( + (methodName) => { + return !getMetadataOfMethod( + GUARDS_METADATA, + methodName + )?.includes(AccessGuard); + } ); - }); - afterEach(() => { - jest.restoreAllMocks(); + expect(toolMethodNamesWithoutGuardOfAccess).toEqual([]); }); - describe('Import activities', () => { - it('Requires the scope to create an activity', () => { - expect( - Reflect.getMetadata( - REQUIRES_SCOPE_KEY, - GhostfolioMcpController.prototype.importActivities - ) - ).toEqual([scopes.activityCreate]); - }); - - it('Refuses a user without the permission to create an activity', async () => { - setupUser([]); - - await expect( - controller.importActivities(impersonation, { - activities: [createActivity()] - }) - ).rejects.toThrow(HttpException); - - expect(importService.import).not.toHaveBeenCalled(); - }); - - it('Gives the number of the imported and of the skipped activities', async () => { - setupUser([permissions.createActivity]); - - jest - .spyOn(importService, 'import') - .mockResolvedValue([{ id: 'activity-id' } as Activity]); - - expect( - await controller.importActivities(impersonation, { - activities: [createActivity(), createActivity({ quantity: 2 })] - }) - ).toEqual({ - content: [ - { - text: 'Imported activities: 1\nSkipped duplicate activities: 1', - type: 'text' - } - ] - }); - }); - - it('Resolves the mask of the data source of the Ghostfolio data provider', async () => { - setupUser([permissions.createActivity]); - - configuration.DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER = [DataSource.YAHOO]; - configuration.ENABLE_FEATURE_SUBSCRIPTION = true; - - await controller.importActivities(impersonation, { - activities: [createActivity({ dataSource: DataSource.GHOSTFOLIO })] - }); - - expect(importService.import).toHaveBeenCalledWith( - expect.objectContaining({ - activitiesDto: [ - expect.objectContaining({ dataSource: DataSource.YAHOO }) - ] - }) - ); - }); - - it('Keeps the data source if the subscription is not enabled', async () => { - setupUser([permissions.createActivity]); - - configuration.DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER = [DataSource.YAHOO]; - configuration.ENABLE_FEATURE_SUBSCRIPTION = false; - - await controller.importActivities(impersonation, { - activities: [createActivity({ dataSource: DataSource.GHOSTFOLIO })] - }); - - expect(importService.import).toHaveBeenCalledWith( - expect.objectContaining({ - activitiesDto: [ - expect.objectContaining({ dataSource: DataSource.GHOSTFOLIO }) - ] - }) - ); - }); - - it('Passes on the message of a validation only', async () => { - setupUser([permissions.createActivity]); - - jest - .spyOn(importService, 'import') - .mockRejectedValue( - new ImportValidationError('activities.0.symbol ("X") is not valid') - ); - - await expect( - controller.importActivities(impersonation, { - activities: [createActivity()] - }) - ).rejects.toThrow( - new RpcException('activities.0.symbol ("X") is not valid') - ); - }); - - it('Hides the message of an unexpected error and writes it to the log', async () => { - setupUser([permissions.createActivity]); - - const error = new Error( - 'Unique constraint failed on the fields: (dataSource)' - ); - - const logError = jest - .spyOn(Logger.prototype, 'error') - .mockImplementation(); - - jest.spyOn(importService, 'import').mockRejectedValue(error); - - await expect( - controller.importActivities(impersonation, { - activities: [createActivity()] - }) - ).rejects.toThrow( - new RpcException(getReasonPhrase(StatusCodes.INTERNAL_SERVER_ERROR)) - ); - - expect(logError).toHaveBeenCalledWith(error); - }); - - it('Does not write the message of a validation to the log', async () => { - setupUser([permissions.createActivity]); - - const logError = jest - .spyOn(Logger.prototype, 'error') - .mockImplementation(); - - jest - .spyOn(importService, 'import') - .mockRejectedValue( - new ImportValidationError('activities.0.accountId ("X") is not valid') - ); - - await expect( - controller.importActivities(impersonation, { - activities: [createActivity({ accountId: 'X' })] - }) - ).rejects.toThrow(RpcException); - - expect(logError).not.toHaveBeenCalled(); - }); + it('Requires the scope to create an activity for the tool to import activities', () => { + expect( + getMetadataOfMethod(REQUIRES_SCOPE_KEY, 'importActivities') + ).toEqual([scopes.activityCreate]); }); - describe('Parameters of the tool to import activities', () => { - function parse(activities: unknown[]) { - return IMPORT_ACTIVITIES_PARAMETERS.safeParse({ activities }).success; - } - - it('Refuses a currency in lower case', () => { - expect(parse([createActivity({ currency: 'usd' })])).toBe(false); - }); - - it('Accepts a currency in upper case', () => { - expect(parse([createActivity({ currency: 'USD' })])).toBe(true); - }); - - it('Refuses a date at or before the epoch', () => { - expect(parse([createActivity({ date: '0000-01-01' })])).toBe(false); - }); - - it('Refuses an empty symbol', () => { - expect(parse([createActivity({ symbol: '' })])).toBe(false); - }); - - it('Refuses an empty identifier of an account', () => { - expect(parse([createActivity({ accountId: '' })])).toBe(false); - }); - - it('Removes a tag, because the tool takes no tag', () => { - expect( - IMPORT_ACTIVITIES_PARAMETERS.parse({ - activities: [createActivity({ tags: ['tag-id'] })] - }).activities[0] - ).not.toHaveProperty('tags'); - }); + it('Requires the scope to create an activity for the tool to search asset profiles', () => { + expect( + getMetadataOfMethod(REQUIRES_SCOPE_KEY, 'searchAssetProfiles') + ).toEqual([scopes.activityCreate]); + }); - it(`Refuses more than ${MCP_MAX_ACTIVITIES} activities`, () => { - expect( - parse( - Array.from({ length: MCP_MAX_ACTIVITIES + 1 }, () => { - return createActivity(); - }) - ) - ).toBe(false); - }); + // The tools have no try and catch, hence the filter is the only guarantee + // that an unexpected exception does not expose internals + it('Applies the filter of the exceptions of the tools', () => { + expect( + Reflect.getMetadata(EXCEPTION_FILTERS_METADATA, GhostfolioMcpController) + ).toEqual([McpToolExceptionFilter]); }); }); diff --git a/apps/api/src/app/endpoints/mcp/mcp.controller.ts b/apps/api/src/app/endpoints/mcp/mcp.controller.ts index baf68659b0..3fe90c4dc3 100644 --- a/apps/api/src/app/endpoints/mcp/mcp.controller.ts +++ b/apps/api/src/app/endpoints/mcp/mcp.controller.ts @@ -1,156 +1,29 @@ -import { AiService } from '@ghostfolio/api/app/endpoints/ai/ai.service'; -import { ImportValidationError } from '@ghostfolio/api/app/import/errors/import-validation.error'; -import { ImportService } from '@ghostfolio/api/app/import/import.service'; -import { UserService } from '@ghostfolio/api/app/user/user.service'; import { Impersonation } from '@ghostfolio/api/decorators/impersonation.decorator'; import { RequiresScopeOfAccess } from '@ghostfolio/api/decorators/requires-scope-of-access.decorator'; -import { DATE_RANGE_PATTERN } from '@ghostfolio/api/dtos/date-range-filter.dto'; import { McpToolExceptionFilter } from '@ghostfolio/api/filters/mcp-tool-exception.filter'; -import { getUnmaskedGhostfolioDataSource } from '@ghostfolio/api/helper/data-source.helper'; -import { ApiService } from '@ghostfolio/api/services/api/api.service'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; -import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper'; -import { - DATE_RANGES, - DEFAULT_LANGUAGE_CODE, - MCP_MAX_ACCOUNTS, - MCP_MAX_ACTIVITIES -} from '@ghostfolio/common/config'; -import { - isValidCurrencyCode, - isValidDateAfter1970 -} from '@ghostfolio/common/helper'; -import { Activity } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { PortfolioTableService } from '@ghostfolio/api/services/portfolio-table/portfolio-table.service'; +import { MCP_MAX_ACTIVITIES } from '@ghostfolio/common/config'; import { scopes } from '@ghostfolio/common/scopes'; import type { ImpersonationContext } from '@ghostfolio/common/types'; -import { HttpException, Logger, UseFilters } from '@nestjs/common'; -import { Payload, RpcException } from '@nestjs/microservices'; -import { AssetClass, DataSource, Type as ActivityType } from '@prisma/client'; +import { UseFilters } from '@nestjs/common'; +import { Payload } from '@nestjs/microservices'; import { McpController, Tool } from '@rekog/mcp-nest'; -import { getReasonPhrase, StatusCodes } from 'http-status-codes'; import { z } from 'zod'; +import 'zod/compile'; -const GET_ACCOUNTS_PARAMETERS = z.object({ - accountIds: z - .array(z.string().min(1)) - .min(1) - .max(MCP_MAX_ACCOUNTS) - .optional() - .describe( - `The identifiers of the accounts to get, at most ${MCP_MAX_ACCOUNTS}` - ), - assetClasses: z - .array(z.enum(AssetClass)) - .min(1) - .optional() - .describe('The asset classes of the accounts to get'), - holding: z - .object({ - dataSource: z - .enum(DataSource) - .describe('The data source of the asset profile'), - symbol: z.string().describe('The symbol of the asset profile') - }) - .optional() - .describe('The asset profile of the accounts to get') -}); - -const GET_ACTIVITIES_PARAMETERS = z.object({ - activityTypes: z - .array(z.enum(ActivityType)) - .min(1) - .optional() - .describe('The types of the activities to get'), - assetClasses: z - .array(z.enum(AssetClass)) - .min(1) - .optional() - .describe('The asset classes of the activities to get'), - holding: z - .object({ - dataSource: z - .enum(DataSource) - .describe('The data source of the asset profile'), - symbol: z.string().describe('The symbol of the asset profile') - }) - .optional() - .describe('The asset profile of the activities to get'), - range: z - .string() - .regex(DATE_RANGE_PATTERN) - .optional() - .describe( - `The date range of the activities to get, either ${DATE_RANGES.join( - ', ' - )} or a calendar year like 2024` - ), - skip: z - .number() - .int() - .min(0) - .optional() - .describe('The number of activities to skip'), - take: z - .number() - .int() - .min(1) - .max(MCP_MAX_ACTIVITIES) - .optional() - .describe(`The number of activities to get, at most ${MCP_MAX_ACTIVITIES}`) -}); - -export const IMPORT_ACTIVITIES_PARAMETERS = z.object({ - activities: z - .array( - z.object({ - accountId: z - .string() - .min(1) - .optional() - .describe('The identifier of the account of the activity'), - comment: z.string().optional().describe('The comment of the activity'), - currency: z - .string() - .refine(isValidCurrencyCode) - .describe( - 'The currency of the fee and of the unit price, as an ISO 4217 code in upper case' - ), - dataSource: z - .enum(DataSource) - .optional() - .describe('The data source of the asset profile'), - date: z - .string() - .refine(isValidDateAfter1970) - .describe( - 'The date of the activity, as an ISO 8601 date or date and time' - ), - fee: z.number().min(0).describe('The fee of the activity'), - quantity: z.number().min(0).describe('The quantity of the activity'), - symbol: z.string().min(1).describe('The symbol of the asset profile'), - type: z.enum(ActivityType).describe('The type of the activity'), - unitPrice: z.number().min(0).describe('The unit price of the activity') - }) - ) - .min(1) - .max(MCP_MAX_ACTIVITIES) - .describe(`The activities to import, at most ${MCP_MAX_ACTIVITIES}`) -}); +import { + GET_ACCOUNTS_PARAMETERS, + GET_ACTIVITIES_PARAMETERS, + IMPORT_ACTIVITIES_PARAMETERS, + SEARCH_ASSET_PROFILES_PARAMETERS +} from './mcp.schemas'; +import { McpService } from './mcp.service'; @McpController() @UseFilters(McpToolExceptionFilter) export class GhostfolioMcpController { - private readonly logger = new Logger(GhostfolioMcpController.name); - - public constructor( - private readonly aiService: AiService, - private readonly apiService: ApiService, - private readonly configurationService: ConfigurationService, - private readonly importService: ImportService, - private readonly userService: UserService - ) {} + public constructor(private readonly mcpService: McpService) {} @RequiresScopeOfAccess(scopes.accountRead) @Tool({ @@ -159,7 +32,7 @@ export class GhostfolioMcpController { readOnlyHint: true, title: 'Get accounts' }, - description: `Gives the accounts of the portfolio with these columns: ${AiService.getAccountsTableColumnNames().join( + description: `Gives the accounts of the portfolio with these columns: ${PortfolioTableService.getAccountsTableColumnNames().join( ', ' )}. The allocation in percentage is relative to the accounts of the result, hence the parameters change it.`, name: 'get-accounts', @@ -167,23 +40,9 @@ export class GhostfolioMcpController { }) public async getAccounts( @Impersonation() { userId }: ImpersonationContext, - @Payload() - { - accountIds, - assetClasses, - holding - }: z.infer + @Payload() parameters: z.infer ) { - const filters = this.apiService.buildFiltersFromQueryParams({ - filterByAccounts: accountIds?.join(','), - filterByAssetClasses: assetClasses?.join(','), - filterByDataSource: holding?.dataSource, - filterBySymbol: holding?.symbol - }); - - const table = await this.aiService.getAccountsTable({ filters, userId }); - - return { content: [{ text: table, type: 'text' as const }] }; + return this.mcpService.getAccounts({ ...parameters, userId }); } @RequiresScopeOfAccess(scopes.activityRead) @@ -193,52 +52,21 @@ export class GhostfolioMcpController { readOnlyHint: true, title: 'Get activities' }, - description: `Gives the activities of the portfolio, the most recent first, with these columns: ${AiService.getActivitiesTableColumnNames().join( + description: `Gives the activities of the portfolio, the most recent first, with these columns: ${PortfolioTableService.getActivitiesTableColumnNames().join( ', ' )}. At most ${MCP_MAX_ACTIVITIES} activities are given per call, hence narrow the result with the parameters or get the further activities with the skip parameter.`, name: 'get-activities', parameters: GET_ACTIVITIES_PARAMETERS }) public async getActivities( - @Impersonation() - { userId, userSettings }: ImpersonationContext, - @Payload() - { - activityTypes, - assetClasses, - holding, - range, - skip, - take - }: z.infer + @Impersonation() { userId, userSettings }: ImpersonationContext, + @Payload() parameters: z.infer ) { - let endDate: Date | undefined; - let startDate: Date | undefined; - - if (range) { - ({ endDate, startDate } = getIntervalFromDateRange({ - dateRange: range - })); - } - - const filters = this.apiService.buildFiltersFromQueryParams({ - filterByAssetClasses: assetClasses?.join(','), - filterByDataSource: holding?.dataSource, - filterBySymbol: holding?.symbol - }); - - const table = await this.aiService.getActivitiesTable({ - endDate, - filters, - skip, - startDate, + return this.mcpService.getActivities({ + ...parameters, userId, - take: take ?? MCP_MAX_ACTIVITIES, - types: activityTypes, userCurrency: userSettings.baseCurrency }); - - return { content: [{ text: table, type: 'text' as const }] }; } @RequiresScopeOfAccess(scopes.portfolioRead) @@ -248,22 +76,13 @@ export class GhostfolioMcpController { readOnlyHint: true, title: 'Get portfolio' }, - description: `Gives the holdings of the portfolio with these columns: ${AiService.getHoldingsTableColumnNames().join( + description: `Gives the holdings of the portfolio with these columns: ${PortfolioTableService.getHoldingsTableColumnNames().join( ', ' )}.`, name: 'get-portfolio' }) - public async getPortfolio( - @Impersonation() { userId, userSettings }: ImpersonationContext - ) { - const prompt = await this.aiService.getPrompt({ - userId, - languageCode: DEFAULT_LANGUAGE_CODE, - mode: 'portfolio', - userCurrency: userSettings.baseCurrency - }); - - return { content: [{ text: prompt, type: 'text' as const }] }; + public async getPortfolio(@Impersonation() { userId }: ImpersonationContext) { + return this.mcpService.getPortfolio({ userId }); } /** @@ -280,73 +99,33 @@ export class GhostfolioMcpController { readOnlyHint: false, title: 'Import activities' }, - description: `Imports activities into the portfolio and gives the number of the imported activities and the number of the skipped activities. An activity is skipped if an equal activity is in the portfolio already, hence send each activity one time only: two equal activities of the same call are both imported. The access needs the permission "Restricted view and manage". At most ${MCP_MAX_ACTIVITIES} activities are imported per call, while the instance can have a lower limit, which an error names. An error does not remove the activities of the same call which are imported already, hence get the activities after an error before you import them again.`, + description: `Imports activities into the portfolio and gives the number of the imported activities and the number of the skipped activities. Use search-asset-profiles first unless the exact symbol and data source are already known. An activity is skipped if an equal activity is in the portfolio already, hence send each activity one time only: two equal activities of the same call are both imported. The access needs the permission "Restricted view and manage". At most ${MCP_MAX_ACTIVITIES} activities are imported per call, while the instance can have a lower limit, which an error names. An error does not remove the activities of the same call which are imported already, hence get the activities after an error before you import them again.`, name: 'import-activities', parameters: IMPORT_ACTIVITIES_PARAMETERS }) public async importActivities( @Impersonation() { userId }: ImpersonationContext, - @Payload() { activities }: z.infer + @Payload() parameters: z.infer ) { - const user = await this.userService.user({ id: userId }); - - if (!hasPermission(user?.permissions, permissions.createActivity)) { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - - const ghostfolioDataSources = this.configurationService.get( - 'ENABLE_FEATURE_SUBSCRIPTION' - ) - ? this.configurationService.get('DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER') - : []; - - const activitiesDto = activities.map((activity) => { - return { - ...activity, - dataSource: getUnmaskedGhostfolioDataSource({ - ghostfolioDataSources, - dataSource: activity.dataSource - }) - }; - }); - - let importedActivities: Activity[]; - - try { - importedActivities = await this.importService.import({ - activitiesDto, - user, - accountsWithBalancesDto: [], - assetProfilesWithMarketDataDto: [], - platformsDto: [], - tagsDto: [] - }); - } catch (error) { - // The message of a validation names the activity which is not valid and - // is written for the caller, hence it is passed on - if (error instanceof ImportValidationError) { - throw new RpcException(error.message); - } - - // Every other message can carry internals of the application, hence it - // is written to the log and the reason phrase is passed on instead - this.logger.error(error); - - throw new RpcException( - getReasonPhrase(StatusCodes.INTERNAL_SERVER_ERROR) - ); - } - - const text = [ - `Imported activities: ${importedActivities.length}`, - `Skipped duplicate activities: ${ - activities.length - importedActivities.length - }` - ].join('\n'); + return this.mcpService.importActivities({ ...parameters, userId }); + } - return { content: [{ text, type: 'text' as const }] }; + @RequiresScopeOfAccess(scopes.activityCreate) + @Tool({ + annotations: { + openWorldHint: true, + readOnlyHint: true, + title: 'Search asset profiles' + }, + description: + 'Searches for financial assets, such as stocks, ETFs, cryptocurrencies, mutual funds and commodities, which are available to the user. Each result is an asset profile that can be used to import an activity. Use this before importing an activity unless the exact symbol and data source are already known. Select the candidate that matches the intended asset and pass its symbol, dataSource and currency unchanged to import-activities.', + name: 'search-asset-profiles', + parameters: SEARCH_ASSET_PROFILES_PARAMETERS + }) + public async searchAssetProfiles( + @Impersonation() { userId }: ImpersonationContext, + @Payload() parameters: z.infer + ) { + return this.mcpService.searchAssetProfiles({ ...parameters, userId }); } } diff --git a/apps/api/src/app/endpoints/mcp/mcp.module.ts b/apps/api/src/app/endpoints/mcp/mcp.module.ts index e2fbce79f3..33cf667118 100644 --- a/apps/api/src/app/endpoints/mcp/mcp.module.ts +++ b/apps/api/src/app/endpoints/mcp/mcp.module.ts @@ -1,10 +1,11 @@ -import { AiModule } from '@ghostfolio/api/app/endpoints/ai/ai.module'; import { ImportModule } from '@ghostfolio/api/app/import/import.module'; +import { SymbolModule } from '@ghostfolio/api/app/symbol/symbol.module'; import { UserModule } from '@ghostfolio/api/app/user/user.module'; import { environment } from '@ghostfolio/api/environments/environment'; import { ApiModule } from '@ghostfolio/api/services/api/api.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { PortfolioTableModule } from '@ghostfolio/api/services/portfolio-table/portfolio-table.module'; import { MCP_ENDPOINT } from '@ghostfolio/common/config'; import { Module } from '@nestjs/common'; @@ -15,11 +16,20 @@ import { } from '@rekog/mcp-nest'; import { GhostfolioMcpController } from './mcp.controller'; +import { McpService } from './mcp.service'; @Module({ controllers: [GhostfolioMcpController], - imports: [AiModule, ApiModule, ConfigurationModule, ImportModule, UserModule], + imports: [ + ApiModule, + ConfigurationModule, + ImportModule, + PortfolioTableModule, + SymbolModule, + UserModule + ], providers: [ + McpService, { inject: [ConfigurationService], provide: MCP_STRATEGY, diff --git a/apps/api/src/app/endpoints/mcp/mcp.schemas.spec.ts b/apps/api/src/app/endpoints/mcp/mcp.schemas.spec.ts new file mode 100644 index 0000000000..c946a9d131 --- /dev/null +++ b/apps/api/src/app/endpoints/mcp/mcp.schemas.spec.ts @@ -0,0 +1,91 @@ +import { + MCP_MAX_ACTIVITIES, + SEARCH_QUERY_MAXIMUM_LENGTH, + SEARCH_QUERY_MINIMUM_LENGTH +} from '@ghostfolio/common/config'; + +import { + IMPORT_ACTIVITIES_PARAMETERS, + SEARCH_ASSET_PROFILES_PARAMETERS +} from './mcp.schemas'; +import { createActivity } from './mcp.test-utils'; + +describe('IMPORT_ACTIVITIES_PARAMETERS', () => { + function parse(activities: unknown[]) { + return IMPORT_ACTIVITIES_PARAMETERS.safeParse({ activities }).success; + } + + it('Refuses a currency in lower case', () => { + expect(parse([createActivity({ currency: 'usd' })])).toBe(false); + }); + + it('Accepts a currency in upper case', () => { + expect(parse([createActivity({ currency: 'USD' })])).toBe(true); + }); + + it('Refuses a date at or before the epoch', () => { + expect(parse([createActivity({ date: '0000-01-01' })])).toBe(false); + }); + + it('Refuses an empty symbol', () => { + expect(parse([createActivity({ symbol: '' })])).toBe(false); + }); + + it('Refuses an empty identifier of an account', () => { + expect(parse([createActivity({ accountId: '' })])).toBe(false); + }); + + it('Removes a tag, because the tool takes no tag', () => { + expect( + IMPORT_ACTIVITIES_PARAMETERS.parse({ + activities: [{ ...createActivity(), tags: ['tag-id'] }] + }).activities[0] + ).not.toHaveProperty('tags'); + }); + + it(`Refuses more than ${MCP_MAX_ACTIVITIES} activities`, () => { + expect( + parse( + Array.from({ length: MCP_MAX_ACTIVITIES + 1 }, () => { + return createActivity(); + }) + ) + ).toBe(false); + }); +}); + +describe('SEARCH_ASSET_PROFILES_PARAMETERS', () => { + it('Refuses a query that contains only spaces', () => { + expect( + SEARCH_ASSET_PROFILES_PARAMETERS.safeParse({ query: ' ' }).success + ).toBe(false); + }); + + it(`Refuses a query shorter than ${SEARCH_QUERY_MINIMUM_LENGTH} characters`, () => { + expect( + SEARCH_ASSET_PROFILES_PARAMETERS.safeParse({ query: 'A' }).success + ).toBe(false); + }); + + it(`Refuses a query longer than ${SEARCH_QUERY_MAXIMUM_LENGTH} characters`, () => { + expect( + SEARCH_ASSET_PROFILES_PARAMETERS.safeParse({ + query: 'A'.repeat(SEARCH_QUERY_MAXIMUM_LENGTH + 1) + }).success + ).toBe(false); + }); + + it('Accepts a name, symbol or ISIN', () => { + for (const query of ['Apple', 'AAPL', 'US0378331005']) { + expect( + SEARCH_ASSET_PROFILES_PARAMETERS.safeParse({ query }).success + ).toBe(true); + } + }); + + it('Removes spaces at the start and the end of a query', () => { + expect( + SEARCH_ASSET_PROFILES_PARAMETERS.parse({ query: ' Apple ' }).query + ).toBe('Apple'); + }); +}); diff --git a/apps/api/src/app/endpoints/mcp/mcp.schemas.ts b/apps/api/src/app/endpoints/mcp/mcp.schemas.ts new file mode 100644 index 0000000000..2eb59264b3 --- /dev/null +++ b/apps/api/src/app/endpoints/mcp/mcp.schemas.ts @@ -0,0 +1,128 @@ +import { DATE_RANGE_PATTERN } from '@ghostfolio/api/dtos/date-range-filter.dto'; +import { + DATE_RANGES, + MCP_MAX_ACCOUNTS, + MCP_MAX_ACTIVITIES, + SEARCH_QUERY_MAXIMUM_LENGTH, + SEARCH_QUERY_MINIMUM_LENGTH +} from '@ghostfolio/common/config'; +import { + isValidCurrencyCode, + isValidDateAfter1970 +} from '@ghostfolio/common/helper'; + +import { AssetClass, DataSource, Type as ActivityType } from '@prisma/client'; +import { z } from 'zod'; + +const HOLDING_PARAMETER = z.object({ + dataSource: z + .enum(DataSource) + .describe('The data source of the asset profile'), + symbol: z.string().describe('The symbol of the asset profile') +}); + +export const GET_ACCOUNTS_PARAMETERS = z.object({ + accountIds: z + .array(z.string().min(1)) + .min(1) + .max(MCP_MAX_ACCOUNTS) + .optional() + .describe( + `The identifiers of the accounts to get, at most ${MCP_MAX_ACCOUNTS}` + ), + assetClasses: z + .array(z.enum(AssetClass)) + .min(1) + .optional() + .describe('The asset classes of the accounts to get'), + holding: HOLDING_PARAMETER.optional().describe( + 'The asset profile of the accounts to get' + ) +}); + +export const GET_ACTIVITIES_PARAMETERS = z.object({ + activityTypes: z + .array(z.enum(ActivityType)) + .min(1) + .optional() + .describe('The types of the activities to get'), + assetClasses: z + .array(z.enum(AssetClass)) + .min(1) + .optional() + .describe('The asset classes of the activities to get'), + holding: HOLDING_PARAMETER.optional().describe( + 'The asset profile of the activities to get' + ), + range: z + .string() + .regex(DATE_RANGE_PATTERN) + .optional() + .describe( + `The date range of the activities to get, either ${DATE_RANGES.join( + ', ' + )} or a calendar year like 2024` + ), + skip: z + .number() + .int() + .min(0) + .optional() + .describe('The number of activities to skip'), + take: z + .number() + .int() + .min(1) + .max(MCP_MAX_ACTIVITIES) + .default(MCP_MAX_ACTIVITIES) + .describe(`The number of activities to get, at most ${MCP_MAX_ACTIVITIES}`) +}); + +export const IMPORT_ACTIVITIES_PARAMETERS = z.object({ + activities: z + .array( + z.object({ + accountId: z + .string() + .min(1) + .optional() + .describe('The identifier of the account of the activity'), + comment: z.string().optional().describe('The comment of the activity'), + currency: z + .string() + .refine(isValidCurrencyCode) + .describe( + 'The currency of the fee and of the unit price, as an ISO 4217 code in upper case' + ), + dataSource: z + .enum(DataSource) + .optional() + .describe('The data source of the asset profile'), + date: z + .string() + .refine(isValidDateAfter1970) + .describe( + 'The date of the activity, as an ISO 8601 date or date and time' + ), + fee: z.number().min(0).describe('The fee of the activity'), + quantity: z.number().min(0).describe('The quantity of the activity'), + symbol: z.string().min(1).describe('The symbol of the asset profile'), + type: z.enum(ActivityType).describe('The type of the activity'), + unitPrice: z.number().min(0).describe('The unit price of the activity') + }) + ) + .min(1) + .max(MCP_MAX_ACTIVITIES) + .describe(`The activities to import, at most ${MCP_MAX_ACTIVITIES}`) +}); + +export const SEARCH_ASSET_PROFILES_PARAMETERS = z.object({ + query: z + .string() + .trim() + .min(SEARCH_QUERY_MINIMUM_LENGTH) + .max(SEARCH_QUERY_MAXIMUM_LENGTH) + .describe( + 'The name, ticker symbol or ISIN of the financial asset, for example Apple, AAPL, Bitcoin or US0378331005' + ) +}); diff --git a/apps/api/src/app/endpoints/mcp/mcp.service.spec.ts b/apps/api/src/app/endpoints/mcp/mcp.service.spec.ts new file mode 100644 index 0000000000..2ec4947c15 --- /dev/null +++ b/apps/api/src/app/endpoints/mcp/mcp.service.spec.ts @@ -0,0 +1,360 @@ +import { ImportValidationError } from '@ghostfolio/api/app/import/errors/import-validation.error'; +import { ImportService } from '@ghostfolio/api/app/import/import.service'; +import { SymbolService } from '@ghostfolio/api/app/symbol/symbol.service'; +import { UserService } from '@ghostfolio/api/app/user/user.service'; +import { ApiService } from '@ghostfolio/api/services/api/api.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { PortfolioTableService } from '@ghostfolio/api/services/portfolio-table/portfolio-table.service'; +import { + DEFAULT_LANGUAGE_CODE, + MCP_MAX_ACTIVITIES +} from '@ghostfolio/common/config'; +import { Activity, Filter } from '@ghostfolio/common/interfaces'; +import { permissions } from '@ghostfolio/common/permissions'; +import type { UserWithSettings } from '@ghostfolio/common/types'; + +import { HttpException } from '@nestjs/common'; +import { + AssetClass, + AssetSubClass, + DataSource, + Type as ActivityType +} from '@prisma/client'; + +import { McpService } from './mcp.service'; +import { createActivity } from './mcp.test-utils'; + +describe('McpService', () => { + const filters: Filter[] = [{ id: 'account-id', type: 'ACCOUNT' }]; + const userCurrency = 'USD'; + const userId = 'user-id'; + + let apiService: ApiService; + let configuration: Record; + let configurationService: ConfigurationService; + let importService: ImportService; + let mcpService: McpService; + let portfolioTableService: PortfolioTableService; + let symbolService: SymbolService; + let userService: UserService; + + function setupUser(userPermissions: string[]) { + const user = { + id: userId, + permissions: userPermissions + } as UserWithSettings; + + jest.spyOn(userService, 'user').mockResolvedValue(user); + + return user; + } + + beforeEach(() => { + configuration = { + DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER: [], + ENABLE_FEATURE_SUBSCRIPTION: false + }; + + configurationService = { + get: jest.fn().mockImplementation((key: string) => { + return configuration[key]; + }) + } as unknown as ConfigurationService; + + apiService = { + buildFiltersFromQueryParams: jest.fn().mockReturnValue(filters) + } as unknown as ApiService; + + importService = { + import: jest.fn().mockResolvedValue([]) + } as unknown as ImportService; + + portfolioTableService = { + getAccountsTable: jest.fn().mockResolvedValue('## Accounts'), + getActivitiesTable: jest.fn().mockResolvedValue('## Activities'), + getHoldingsTable: jest.fn().mockResolvedValue('## Holdings') + } as unknown as PortfolioTableService; + + symbolService = { + lookup: jest.fn().mockResolvedValue({ items: [] }) + } as unknown as SymbolService; + + userService = { user: jest.fn() } as unknown as UserService; + + mcpService = new McpService( + apiService, + configurationService, + importService, + portfolioTableService, + symbolService, + userService + ); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + describe('getAccounts', () => { + it('Maps the parameters of the tool to the filters', async () => { + await mcpService.getAccounts({ + userId, + accountIds: ['account-id'], + assetClasses: [AssetClass.EQUITY], + holding: { dataSource: DataSource.YAHOO, symbol: 'AAPL' } + }); + + expect(apiService.buildFiltersFromQueryParams).toHaveBeenCalledWith({ + filterByAccounts: ['account-id'], + filterByAssetClasses: [AssetClass.EQUITY], + filterByDataSource: DataSource.YAHOO, + filterBySymbol: 'AAPL' + }); + }); + + it('Gives the table of the accounts of the filters', async () => { + expect(await mcpService.getAccounts({ userId })).toEqual({ + content: [{ text: '## Accounts', type: 'text' }] + }); + + expect(portfolioTableService.getAccountsTable).toHaveBeenCalledWith({ + filters, + userId + }); + }); + }); + + describe('getActivities', () => { + function getActivities( + parameters: Partial[0]> = {} + ) { + return mcpService.getActivities({ + userCurrency, + userId, + take: MCP_MAX_ACTIVITIES, + ...parameters + }); + } + + it('Maps the parameters of the tool to the filters', async () => { + await getActivities({ + assetClasses: [AssetClass.EQUITY], + holding: { dataSource: DataSource.YAHOO, symbol: 'AAPL' } + }); + + expect(apiService.buildFiltersFromQueryParams).toHaveBeenCalledWith({ + filterByAssetClasses: [AssetClass.EQUITY], + filterByDataSource: DataSource.YAHOO, + filterBySymbol: 'AAPL' + }); + }); + + it('Changes the range into the start date and the end date', async () => { + await getActivities({ range: '2024' }); + + expect(portfolioTableService.getActivitiesTable).toHaveBeenCalledWith( + expect.objectContaining({ + endDate: new Date('2024-12-31T23:59:59.999Z'), + startDate: new Date('2023-12-31T23:59:59.999Z') + }) + ); + }); + + it('Gives no date if the range is absent', async () => { + await getActivities(); + + expect(portfolioTableService.getActivitiesTable).toHaveBeenCalledWith( + expect.objectContaining({ endDate: undefined, startDate: undefined }) + ); + }); + + it('Gives the table of the activities of the filters', async () => { + expect( + await getActivities({ activityTypes: [ActivityType.BUY], skip: 10 }) + ).toEqual({ content: [{ text: '## Activities', type: 'text' }] }); + + expect(portfolioTableService.getActivitiesTable).toHaveBeenCalledWith({ + filters, + userCurrency, + userId, + endDate: undefined, + skip: 10, + startDate: undefined, + take: MCP_MAX_ACTIVITIES, + types: [ActivityType.BUY] + }); + }); + }); + + describe('getPortfolio', () => { + it('Gives the table of the holdings in the default language', async () => { + expect(await mcpService.getPortfolio({ userId })).toEqual({ + content: [{ text: '## Holdings', type: 'text' }] + }); + + expect(portfolioTableService.getHoldingsTable).toHaveBeenCalledWith({ + userId, + languageCode: DEFAULT_LANGUAGE_CODE + }); + }); + }); + + describe('searchAssetProfiles', () => { + it('Refuses a user without the permission to create an activity', async () => { + setupUser([]); + + await expect( + mcpService.searchAssetProfiles({ query: 'Apple', userId }) + ).rejects.toThrow(HttpException); + + expect(symbolService.lookup).not.toHaveBeenCalled(); + }); + + it('Gives the import-ready asset profiles available to the user', async () => { + const user = setupUser([permissions.createActivity]); + + configuration.DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER = [DataSource.YAHOO]; + configuration.ENABLE_FEATURE_SUBSCRIPTION = true; + + jest.spyOn(symbolService, 'lookup').mockResolvedValue({ + items: [ + { + assetClass: AssetClass.EQUITY, + assetSubClass: AssetSubClass.STOCK, + currency: 'USD', + dataProviderInfo: { isPremium: false }, + dataSource: DataSource.YAHOO, + name: 'Apple Inc.', + symbol: 'AAPL' + }, + { + assetClass: AssetClass.EQUITY, + assetSubClass: AssetSubClass.STOCK, + currency: 'USD', + dataProviderInfo: { isPremium: true }, + dataSource: DataSource.GHOSTFOLIO, + name: 'Premium asset', + symbol: 'PREMIUM' + } + ] + }); + + const result = await mcpService.searchAssetProfiles({ + query: 'Apple', + userId + }); + + expect(symbolService.lookup).toHaveBeenCalledWith({ + query: 'Apple', + user + }); + expect(JSON.parse(result.content[0].text)).toEqual({ + assetProfiles: [ + { + assetClass: AssetClass.EQUITY, + assetSubClass: AssetSubClass.STOCK, + currency: 'USD', + dataSource: DataSource.GHOSTFOLIO, + name: 'Apple Inc.', + symbol: 'AAPL' + } + ] + }); + }); + }); + + describe('importActivities', () => { + it('Refuses a user without the permission to create an activity', async () => { + setupUser([]); + + await expect( + mcpService.importActivities({ + userId, + activities: [createActivity()] + }) + ).rejects.toThrow(HttpException); + + expect(importService.import).not.toHaveBeenCalled(); + }); + + it('Gives the number of the imported and of the skipped activities', async () => { + setupUser([permissions.createActivity]); + + jest + .spyOn(importService, 'import') + .mockResolvedValue([{ id: 'activity-id' } as Activity]); + + expect( + await mcpService.importActivities({ + userId, + activities: [createActivity(), createActivity({ quantity: 2 })] + }) + ).toEqual({ + content: [ + { + text: 'Imported activities: 1\nSkipped duplicate activities: 1', + type: 'text' + } + ] + }); + }); + + it('Resolves the mask of the data source of the Ghostfolio data provider', async () => { + setupUser([permissions.createActivity]); + + configuration.DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER = [DataSource.YAHOO]; + configuration.ENABLE_FEATURE_SUBSCRIPTION = true; + + await mcpService.importActivities({ + userId, + activities: [createActivity({ dataSource: DataSource.GHOSTFOLIO })] + }); + + expect(importService.import).toHaveBeenCalledWith( + expect.objectContaining({ + activitiesDto: [ + expect.objectContaining({ dataSource: DataSource.YAHOO }) + ] + }) + ); + }); + + it('Keeps the data source if the subscription is not enabled', async () => { + setupUser([permissions.createActivity]); + + configuration.DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER = [DataSource.YAHOO]; + configuration.ENABLE_FEATURE_SUBSCRIPTION = false; + + await mcpService.importActivities({ + userId, + activities: [createActivity({ dataSource: DataSource.GHOSTFOLIO })] + }); + + expect(importService.import).toHaveBeenCalledWith( + expect.objectContaining({ + activitiesDto: [ + expect.objectContaining({ dataSource: DataSource.GHOSTFOLIO }) + ] + }) + ); + }); + + // The McpToolExceptionFilter maps the error, hence the tool passes it on + it('Passes on an error of the import', async () => { + setupUser([permissions.createActivity]); + + const error = new ImportValidationError( + 'activities.0.symbol ("X") is not valid' + ); + + jest.spyOn(importService, 'import').mockRejectedValue(error); + + await expect( + mcpService.importActivities({ + userId, + activities: [createActivity()] + }) + ).rejects.toBe(error); + }); + }); +}); diff --git a/apps/api/src/app/endpoints/mcp/mcp.service.ts b/apps/api/src/app/endpoints/mcp/mcp.service.ts new file mode 100644 index 0000000000..1bf25cdcce --- /dev/null +++ b/apps/api/src/app/endpoints/mcp/mcp.service.ts @@ -0,0 +1,232 @@ +import { ImportService } from '@ghostfolio/api/app/import/import.service'; +import { SymbolService } from '@ghostfolio/api/app/symbol/symbol.service'; +import { UserService } from '@ghostfolio/api/app/user/user.service'; +import { + getMaskedGhostfolioDataSource, + getUnmaskedGhostfolioDataSource +} from '@ghostfolio/api/helper/data-source.helper'; +import { ApiService } from '@ghostfolio/api/services/api/api.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { PortfolioTableService } from '@ghostfolio/api/services/portfolio-table/portfolio-table.service'; +import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper'; +import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; + +import { HttpException, Injectable } from '@nestjs/common'; +import { getReasonPhrase, StatusCodes } from 'http-status-codes'; +import { z } from 'zod'; + +import { + GET_ACCOUNTS_PARAMETERS, + GET_ACTIVITIES_PARAMETERS, + IMPORT_ACTIVITIES_PARAMETERS, + SEARCH_ASSET_PROFILES_PARAMETERS +} from './mcp.schemas'; + +@Injectable() +export class McpService { + public constructor( + private readonly apiService: ApiService, + private readonly configurationService: ConfigurationService, + private readonly importService: ImportService, + private readonly portfolioTableService: PortfolioTableService, + private readonly symbolService: SymbolService, + private readonly userService: UserService + ) {} + + public async getAccounts({ + accountIds, + assetClasses, + holding, + userId + }: z.infer & { userId: string }) { + const filters = this.apiService.buildFiltersFromQueryParams({ + filterByAccounts: accountIds, + filterByAssetClasses: assetClasses, + filterByDataSource: holding?.dataSource, + filterBySymbol: holding?.symbol + }); + + const table = await this.portfolioTableService.getAccountsTable({ + filters, + userId + }); + + return this.getTextResult(table); + } + + public async getActivities({ + activityTypes, + assetClasses, + holding, + range, + skip, + take, + userCurrency, + userId + }: z.infer & { + userCurrency: string; + userId: string; + }) { + let endDate: Date | undefined; + let startDate: Date | undefined; + + if (range) { + ({ endDate, startDate } = getIntervalFromDateRange({ + dateRange: range + })); + } + + const filters = this.apiService.buildFiltersFromQueryParams({ + filterByAssetClasses: assetClasses, + filterByDataSource: holding?.dataSource, + filterBySymbol: holding?.symbol + }); + + const table = await this.portfolioTableService.getActivitiesTable({ + endDate, + filters, + skip, + startDate, + take, + userCurrency, + userId, + types: activityTypes + }); + + return this.getTextResult(table); + } + + public async getPortfolio({ userId }: { userId: string }) { + const table = await this.portfolioTableService.getHoldingsTable({ + userId, + languageCode: DEFAULT_LANGUAGE_CODE + }); + + return this.getTextResult(table); + } + + public async importActivities({ + activities, + userId + }: z.infer & { userId: string }) { + const user = await this.getUserWithPermission({ + userId, + permission: permissions.createActivity + }); + + const ghostfolioDataSources = this.configurationService.get( + 'ENABLE_FEATURE_SUBSCRIPTION' + ) + ? this.configurationService.get('DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER') + : []; + + const activitiesDto = activities.map((activity) => { + return { + ...activity, + dataSource: getUnmaskedGhostfolioDataSource({ + ghostfolioDataSources, + dataSource: activity.dataSource + }) + }; + }); + + // The filter passes on the message of a CallerFacingError, which is + // written for the caller, and hides the message of every other error + const importedActivities = await this.importService.import({ + activitiesDto, + user, + accountsWithBalancesDto: [], + assetProfilesWithMarketDataDto: [], + platformsDto: [], + tagsDto: [] + }); + + const text = [ + `Imported activities: ${importedActivities.length}`, + `Skipped duplicate activities: ${ + activities.length - importedActivities.length + }` + ].join('\n'); + + return this.getTextResult(text); + } + + public async searchAssetProfiles({ + query, + userId + }: z.infer & { userId: string }) { + const user = await this.getUserWithPermission({ + userId, + permission: permissions.createActivity + }); + + const { items } = await this.symbolService.lookup({ query, user }); + + const ghostfolioDataSources = this.configurationService.get( + 'ENABLE_FEATURE_SUBSCRIPTION' + ) + ? this.configurationService.get('DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER') + : []; + + const assetProfiles = items.flatMap( + ({ + assetClass, + assetSubClass, + currency, + dataProviderInfo, + dataSource, + name, + symbol + }) => { + if (!dataSource || dataProviderInfo.isPremium) { + return []; + } + + return [ + { + assetClass, + assetSubClass, + currency, + name, + symbol, + dataSource: getMaskedGhostfolioDataSource({ + dataSource, + ghostfolioDataSources + }) + } + ]; + } + ); + + return this.getTextResult(JSON.stringify({ assetProfiles }, null, 2)); + } + + private getTextResult(text: string) { + return { content: [{ text, type: 'text' as const }] }; + } + + /** + * Gives the user of the access, if the role of the user has the permission. + * The scope of the access is evaluated separately by the ScopeGuard, hence a + * tool which changes data has to call this. + */ + private async getUserWithPermission({ + permission, + userId + }: { + permission: string; + userId: string; + }) { + const user = await this.userService.user({ id: userId }); + + if (!hasPermission(user?.permissions, permission)) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + + return user; + } +} diff --git a/apps/api/src/app/endpoints/mcp/mcp.test-utils.ts b/apps/api/src/app/endpoints/mcp/mcp.test-utils.ts new file mode 100644 index 0000000000..84895a64ff --- /dev/null +++ b/apps/api/src/app/endpoints/mcp/mcp.test-utils.ts @@ -0,0 +1,18 @@ +import { Type as ActivityType } from '@prisma/client'; + +import { ActivityToImport } from './types/activity-to-import.type'; + +export function createActivity( + overrides: Partial = {} +): ActivityToImport { + return { + currency: 'USD', + date: '2024-01-01', + fee: 0, + quantity: 1, + symbol: 'AAPL', + type: ActivityType.BUY, + unitPrice: 100, + ...overrides + }; +} diff --git a/apps/api/src/app/endpoints/mcp/types/activity-to-import.type.ts b/apps/api/src/app/endpoints/mcp/types/activity-to-import.type.ts new file mode 100644 index 0000000000..06375d2002 --- /dev/null +++ b/apps/api/src/app/endpoints/mcp/types/activity-to-import.type.ts @@ -0,0 +1,7 @@ +import { z } from 'zod'; + +import { IMPORT_ACTIVITIES_PARAMETERS } from '../mcp.schemas'; + +export type ActivityToImport = z.infer< + typeof IMPORT_ACTIVITIES_PARAMETERS +>['activities'][number]; diff --git a/apps/api/src/app/import/errors/import-validation.error.ts b/apps/api/src/app/import/errors/import-validation.error.ts index a228c99337..4e96ce2339 100644 --- a/apps/api/src/app/import/errors/import-validation.error.ts +++ b/apps/api/src/app/import/errors/import-validation.error.ts @@ -1,4 +1,6 @@ -export class ImportValidationError extends Error { +import { CallerFacingError } from '@ghostfolio/api/errors/caller-facing.error'; + +export class ImportValidationError extends CallerFacingError { public constructor(message: string) { super(message); diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts index 7b5ab1a0df..48ab8f3218 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts @@ -3,6 +3,7 @@ import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.s import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; +import { SubscriptionType } from '@ghostfolio/common/enums'; import { Activity, Filter, @@ -34,6 +35,8 @@ export class PortfolioCalculatorFactory { calculationType, currency, filters = [], + usePortfolioSnapshotCache = true, + subscriptionType, userId }: { accountBalanceItems?: HistoricalDataItem[]; @@ -41,6 +44,8 @@ export class PortfolioCalculatorFactory { calculationType: PerformanceCalculationType; currency: string; filters?: Filter[]; + usePortfolioSnapshotCache?: boolean; + subscriptionType?: SubscriptionType; userId: string; }): PortfolioCalculator { switch (calculationType) { @@ -50,6 +55,8 @@ export class PortfolioCalculatorFactory { activities, currency, filters, + usePortfolioSnapshotCache, + subscriptionType, userId, configurationService: this.configurationService, currentRateService: this.currentRateService, @@ -64,6 +71,8 @@ export class PortfolioCalculatorFactory { activities, currency, filters, + usePortfolioSnapshotCache, + subscriptionType, userId, configurationService: this.configurationService, currentRateService: this.currentRateService, @@ -78,6 +87,8 @@ export class PortfolioCalculatorFactory { activities, currency, filters, + usePortfolioSnapshotCache, + subscriptionType, userId, configurationService: this.configurationService, currentRateService: this.currentRateService, @@ -92,6 +103,8 @@ export class PortfolioCalculatorFactory { activities, currency, filters, + usePortfolioSnapshotCache, + subscriptionType, userId, configurationService: this.configurationService, currentRateService: this.currentRateService, diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index 971d8b5642..dfbe99c8de 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -20,6 +20,7 @@ import { PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_HIGH, PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_LOW } from '@ghostfolio/common/config'; +import { SubscriptionType } from '@ghostfolio/common/enums'; import { DATE_FORMAT, getAssetProfileIdentifier, @@ -89,7 +90,9 @@ export abstract class PortfolioCalculator { private snapshot: PortfolioSnapshot; private snapshotPromise: Promise; private startDate: Date; + private subscriptionType?: SubscriptionType; private transactionPoints: TransactionPoint[]; + private usePortfolioSnapshotCache: boolean; private userId: string; public constructor({ @@ -102,6 +105,8 @@ export abstract class PortfolioCalculator { filters, portfolioSnapshotService, redisCacheService, + usePortfolioSnapshotCache = true, + subscriptionType, userId }: { accountBalanceItems: HistoricalDataItem[]; @@ -113,6 +118,8 @@ export abstract class PortfolioCalculator { filters: Filter[]; portfolioSnapshotService: PortfolioSnapshotService; redisCacheService: RedisCacheService; + usePortfolioSnapshotCache?: boolean; + subscriptionType?: SubscriptionType; userId: string; }) { this.accountBalanceItems = accountBalanceItems; @@ -175,6 +182,8 @@ export abstract class PortfolioCalculator { this.portfolioSnapshotService = portfolioSnapshotService; this.redisCacheService = redisCacheService; + this.usePortfolioSnapshotCache = usePortfolioSnapshotCache; + this.subscriptionType = subscriptionType; this.userId = userId; const { endDate, startDate } = getIntervalFromDateRange({ @@ -187,7 +196,11 @@ export abstract class PortfolioCalculator { this.computeTransactionPoints(); - this.snapshotPromise = this.initialize(); + this.snapshotPromise = this.usePortfolioSnapshotCache + ? this.initialize() + : this.computeSnapshot().then((snapshot) => { + this.snapshot = snapshot; + }); // Mark the rejection as handled to prevent an unhandled promise rejection // in case the snapshot promise is never awaited. Consumers awaiting it @@ -278,7 +291,8 @@ export abstract class PortfolioCalculator { dateQuery: { gte: this.startDate, lt: this.endDate - } + }, + subscriptionType: this.subscriptionType }); this.dataProviderInfos = dataProviderInfos; 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 a6bedc55d1..932a50c7e2 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 @@ -59,7 +59,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 dc22cdbab5..4687fe4df0 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 @@ -59,7 +59,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 9d55a79ddb..f054410ae3 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 @@ -59,7 +59,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 9479352962..eeed8e957e 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 @@ -59,7 +59,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 1143e3bd27..5c78f8a42b 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 @@ -81,7 +81,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 e5b0d69d64..0e62bd0a38 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 @@ -69,7 +69,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 50168468ac..c775e81be7 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 @@ -71,7 +71,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( null, diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-before-first-market-price.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-before-first-market-price.spec.ts index cebb3de944..6b3d9ce6d4 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-before-first-market-price.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-before-first-market-price.spec.ts @@ -57,7 +57,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 93d91c500e..58dc545e49 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 @@ -69,7 +69,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 1fa2d12641..4e7f693fc2 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 @@ -69,7 +69,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 e50b132d24..3a49c91fcd 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 @@ -118,7 +118,6 @@ describe('PortfolioCalculator', () => { currentRateService = new CurrentRateService( null, dataProviderService, - null, null ); 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 000cc59357..6e9a42e3e8 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 @@ -59,7 +59,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 451973a9ff..8a2b1aec18 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 @@ -71,7 +71,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 2cc87934ae..ba2b7d05c6 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 @@ -72,7 +72,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 68572c63e1..370205fc98 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 @@ -59,7 +59,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( null, diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-before-first-market-price.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-before-first-market-price.spec.ts index 70b4016274..135e6f6407 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-before-first-market-price.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-before-first-market-price.spec.ts @@ -57,7 +57,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 53236f007f..228fdd542a 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 @@ -56,7 +56,8 @@ describe('PortfolioCalculator', () => { RedisCacheServiceMock.reset(); configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); + exchangeRateDataService = new ExchangeRateDataService( null, null, diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-from-two-data-sources.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-from-two-data-sources.spec.ts index 0aa3a4be3e..00b3ce4af1 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-from-two-data-sources.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-from-two-data-sources.spec.ts @@ -71,7 +71,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( null, 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 f6598f22b8..39994a8e58 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 @@ -59,7 +59,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 fb7a434771..f248114fe4 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 @@ -54,7 +54,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 8c3858dcd6..3f498ae4f1 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 @@ -72,7 +72,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( 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 f491b5025b..896cb6c991 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 @@ -72,7 +72,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( null, diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-stock-split.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-stock-split.spec.ts index c71a3bda11..e7e2371a4d 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-stock-split.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-stock-split.spec.ts @@ -60,7 +60,8 @@ describe('RoaiPortfolioCalculator stock splits', () => { RedisCacheServiceMock.reset(); configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); + exchangeRateDataService = new ExchangeRateDataService( 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 ce5f90f5c3..7326d551bb 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 @@ -59,7 +59,7 @@ describe('PortfolioCalculator', () => { configurationService = new ConfigurationService(); - currentRateService = new CurrentRateService(null, null, null, null); + currentRateService = new CurrentRateService(null, null, null); exchangeRateDataService = new ExchangeRateDataService( null, @@ -108,10 +108,11 @@ describe('PortfolioCalculator', () => { activities, calculationType: PerformanceCalculationType.ROAI, currency: 'USD', + usePortfolioSnapshotCache: false, userId: userDummyData.id }); - const portfolioSnapshot = await portfolioCalculator.computeSnapshot(); + const portfolioSnapshot = await portfolioCalculator.getSnapshot(); expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big('500000'), @@ -169,6 +170,9 @@ describe('PortfolioCalculator', () => { totalInvestmentValueWithCurrencyEffect: 500000 }) ); + + expect(PortfolioSnapshotServiceMock.jobsStore.size).toBe(0); + expect(RedisCacheServiceMock.cache.size).toBe(0); }); }); }); diff --git a/apps/api/src/app/portfolio/current-rate.service.spec.ts b/apps/api/src/app/portfolio/current-rate.service.spec.ts index ea93e8b4fe..4bb3a1b8cf 100644 --- a/apps/api/src/app/portfolio/current-rate.service.spec.ts +++ b/apps/api/src/app/portfolio/current-rate.service.spec.ts @@ -119,8 +119,7 @@ describe('CurrentRateService', () => { currentRateService = new CurrentRateService( null, dataProviderService, - marketDataService, - null + marketDataService ); }); diff --git a/apps/api/src/app/portfolio/current-rate.service.ts b/apps/api/src/app/portfolio/current-rate.service.ts index 9cfeda3bdc..66119a3c63 100644 --- a/apps/api/src/app/portfolio/current-rate.service.ts +++ b/apps/api/src/app/portfolio/current-rate.service.ts @@ -11,10 +11,8 @@ import { DataProviderInfo, ResponseError } from '@ghostfolio/common/interfaces'; -import type { RequestWithUser } from '@ghostfolio/common/types'; -import { Inject, Injectable } from '@nestjs/common'; -import { REQUEST } from '@nestjs/core'; +import { Injectable } from '@nestjs/common'; import { isBefore, isToday } from 'date-fns'; import { isEmpty, uniqBy } from 'lodash'; @@ -29,15 +27,14 @@ export class CurrentRateService { public constructor( private readonly activitiesService: ActivitiesService, private readonly dataProviderService: DataProviderService, - private readonly marketDataService: MarketDataService, - @Inject(REQUEST) private readonly request: RequestWithUser + private readonly marketDataService: MarketDataService ) {} @LogPerformance - // TODO: Pass user instead of using this.request.user public async getValues({ dataGatheringItems, - dateQuery + dateQuery, + subscriptionType }: GetValuesParams): Promise { const dataProviderInfos: DataProviderInfo[] = []; @@ -52,8 +49,8 @@ export class CurrentRateService { if (includesToday) { const quotes = await this.dataProviderService.getQuotes({ - items: dataGatheringItems, - user: this.request?.user + subscriptionType, + items: dataGatheringItems }); for (const { dataSource, symbol } of dataGatheringItems) { diff --git a/apps/api/src/app/portfolio/get-holdings.dto.ts b/apps/api/src/app/portfolio/get-holdings.dto.ts index b776bfe0d9..6e3d9669e2 100644 --- a/apps/api/src/app/portfolio/get-holdings.dto.ts +++ b/apps/api/src/app/portfolio/get-holdings.dto.ts @@ -1,7 +1,8 @@ import { DateRangeFilterDto } from '@ghostfolio/api/dtos/date-range-filter.dto'; +import { SEARCH_QUERY_MAXIMUM_LENGTH } from '@ghostfolio/common/config'; import { HoldingType } from '@ghostfolio/common/types'; -import { IsIn, IsOptional, IsString } from 'class-validator'; +import { IsIn, IsOptional, IsString, MaxLength } from 'class-validator'; export class GetHoldingsDto extends DateRangeFilterDto { @IsIn(['ACTIVE', 'CLOSED'] as HoldingType[]) @@ -10,5 +11,6 @@ export class GetHoldingsDto extends DateRangeFilterDto { @IsOptional() @IsString() + @MaxLength(SEARCH_QUERY_MAXIMUM_LENGTH) query?: string; } diff --git a/apps/api/src/app/portfolio/interfaces/get-values-params.interface.ts b/apps/api/src/app/portfolio/interfaces/get-values-params.interface.ts index ffb74ee9b2..e74c501be6 100644 --- a/apps/api/src/app/portfolio/interfaces/get-values-params.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/get-values-params.interface.ts @@ -1,8 +1,10 @@ import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; +import { SubscriptionType } from '@ghostfolio/common/enums'; import { DateQuery } from './date-query.interface'; export interface GetValuesParams { dataGatheringItems: DataGatheringItem[]; dateQuery: DateQuery; + subscriptionType?: SubscriptionType; } diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index 431a8da20b..a65186100a 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -357,7 +357,8 @@ export class PortfolioController { const holding = await this.portfolioService.getHolding({ dataSource, symbol, - userId + userId, + withExcludedActivities: true }); if (!holding) { @@ -631,7 +632,8 @@ export class PortfolioController { const holding = await this.portfolioService.getHolding({ dataSource, symbol, - userId + userId, + withExcludedActivities: true }); if (!holding) { diff --git a/apps/api/src/app/portfolio/portfolio.service.spec.ts b/apps/api/src/app/portfolio/portfolio.service.spec.ts index 227262c400..0882ff7e64 100644 --- a/apps/api/src/app/portfolio/portfolio.service.spec.ts +++ b/apps/api/src/app/portfolio/portfolio.service.spec.ts @@ -9,9 +9,14 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/con import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; -import { TAG_ID_EMERGENCY_FUND, UNKNOWN_KEY } from '@ghostfolio/common/config'; +import { + TAG_ID_EMERGENCY_FUND, + TAG_ID_EXCLUDE_FROM_ANALYSIS, + UNKNOWN_KEY +} from '@ghostfolio/common/config'; import { parseDate } from '@ghostfolio/common/helper'; import { + Activity, AssetProfileIdentifier, Filter, PortfolioSummary @@ -350,8 +355,13 @@ describe('PortfolioService', () => { describe('getDetails', () => { const setUpCashOnlyPortfolio = ({ baseCurrency = 'CHF', - emergencyFund - }: { baseCurrency?: string; emergencyFund?: number } = {}) => { + emergencyFund, + quantity = 2000 + }: { + baseCurrency?: string; + emergencyFund?: number; + quantity?: number; + } = {}) => { const cashAccount: AccountWithBalance = { balance: 2000, comment: null, @@ -416,7 +426,7 @@ describe('PortfolioService', () => { netPerformancePercentage: new Big(0), netPerformancePercentageWithCurrencyEffectMap: {}, netPerformanceWithCurrencyEffectMap: {}, - quantity: new Big(2000), + quantity: new Big(quantity), symbol: 'USD', tags: [], timeWeightedInvestment: new Big(0), @@ -488,6 +498,270 @@ describe('PortfolioService', () => { expect(holdings[0].assetProfile.symbol).toBe('USD'); expect(holdings[0].valueInBaseCurrency).toBe(1000); }); + + it('should include closed holdings when all holdings are requested', async () => { + setUpCashOnlyPortfolio({ quantity: 0 }); + + const { holdings } = await portfolioService.getDetails({ + filters: [], + includeAllHoldings: true, + userId: userDummyData.id + }); + + expect(holdings).toHaveLength(1); + expect(holdings[0].quantity).toBe(0); + }); + + it.each([ + { holdingType: 'ACTIVE', quantity: 2000 }, + { holdingType: 'CLOSED', quantity: 0 } + ])( + 'should return $holdingType holdings when the holding type is specified', + async ({ holdingType, quantity }) => { + setUpCashOnlyPortfolio({ quantity }); + + const { holdings } = await portfolioService.getDetails({ + filters: [{ id: holdingType, type: 'HOLDING_TYPE' }], + userId: userDummyData.id + }); + + expect(holdings).toHaveLength(1); + expect(holdings[0].quantity).toBe(quantity); + } + ); + + it('should remove the holding type only from the snapshot filters', async () => { + setUpCashOnlyPortfolio({ quantity: 0 }); + + await portfolioService.getDetails({ + filters: [ + { id: AssetClass.EQUITY, type: 'ASSET_CLASS' }, + { id: 'CLOSED', type: 'HOLDING_TYPE' } + ], + userId: userDummyData.id + }); + + expect(portfolioCalculatorFactory.createCalculator).toHaveBeenCalledWith( + expect.objectContaining({ + filters: [{ id: AssetClass.EQUITY, type: 'ASSET_CLASS' }] + }) + ); + expect( + activitiesService.getActivitiesForPortfolioCalculator + ).toHaveBeenCalledWith({ + filters: [{ id: AssetClass.EQUITY, type: 'ASSET_CLASS' }], + userCurrency: 'CHF', + userId: userDummyData.id + }); + }); + }); + + describe('getHoldings', () => { + const activeHolding = { + assetProfile: { + isin: 'US0378331005', + name: 'Apple', + symbol: 'AAPL' + }, + quantity: 1 + }; + + const closedHolding = { + assetProfile: { + isin: 'US5949181045', + name: 'Microsoft', + symbol: 'MSFT' + }, + quantity: 0 + }; + + beforeEach(() => { + jest.spyOn(portfolioService, 'getDetails').mockResolvedValue({ + holdings: [activeHolding, closedHolding] + } as unknown as Awaited>); + }); + + it('should request all holdings when the holding type is not specified', async () => { + const holdings = await portfolioService.getHoldings({ + dateRange: 'max', + userId: userDummyData.id + }); + + expect(holdings).toEqual([activeHolding, closedHolding]); + expect(portfolioService.getDetails).toHaveBeenCalledWith({ + dateRange: 'max', + filters: undefined, + includeAllHoldings: true, + userId: userDummyData.id + }); + }); + + it('should find a closed holding when the holding type is not specified', async () => { + const holdings = await portfolioService.getHoldings({ + dateRange: 'max', + filters: [{ id: 'Microsoft', type: 'SEARCH_QUERY' }], + userId: userDummyData.id + }); + + expect(holdings).toEqual([closedHolding]); + }); + + it.each(['ACTIVE', 'CLOSED'])( + 'should not request all holdings when the holding type is %s', + async (holdingType) => { + await portfolioService.getHoldings({ + dateRange: 'max', + filters: [{ id: holdingType, type: 'HOLDING_TYPE' }], + userId: userDummyData.id + }); + + expect(portfolioService.getDetails).toHaveBeenCalledWith({ + dateRange: 'max', + filters: [{ id: holdingType, type: 'HOLDING_TYPE' }], + includeAllHoldings: false, + userId: userDummyData.id + }); + } + ); + }); + + describe('getHolding', () => { + const dataSource = DataSource.YAHOO; + const symbol = 'AAPL'; + const includedActivity = { + assetProfile: { dataSource, symbol }, + tags: [] + } as Activity; + + beforeEach(() => { + jest.spyOn(userService, 'user').mockResolvedValue({ + id: userDummyData.id, + settings: { settings: { baseCurrency: 'USD' } } + } as unknown as Awaited>); + + jest + .spyOn(symbolProfileService, 'getSymbolProfiles') + .mockResolvedValue([]); + + jest + .spyOn(portfolioCalculatorFactory, 'createCalculator') + .mockReturnValue({ + getSnapshot: jest.fn().mockResolvedValue({ positions: [] }), + getTransactionPoints: jest.fn().mockReturnValue([]) + } as unknown as PortfolioCalculator); + }); + + it('keeps the cached path when the holding has included and excluded activities', async () => { + const excludedActivity = { + ...includedActivity, + tags: [{ id: TAG_ID_EXCLUDE_FROM_ANALYSIS }] + } as Activity; + const getActivities = jest + .spyOn(activitiesService, 'getActivitiesForPortfolioCalculator') + .mockResolvedValueOnce({ activities: [includedActivity], count: 1 }) + .mockResolvedValue({ + activities: [includedActivity, excludedActivity], + count: 2 + }); + + await portfolioService.getHolding({ + dataSource, + symbol, + userId: userDummyData.id, + withExcludedActivities: true + }); + + expect(getActivities).toHaveBeenCalledTimes(1); + expect(getActivities).toHaveBeenCalledWith({ + userCurrency: 'USD', + userId: userDummyData.id + }); + expect(portfolioCalculatorFactory.createCalculator).toHaveBeenCalledWith( + expect.objectContaining({ + activities: [includedActivity], + filters: undefined, + usePortfolioSnapshotCache: true + }) + ); + }); + + it.each([ + { + account: { tags: [{ id: TAG_ID_EXCLUDE_FROM_ANALYSIS }] }, + name: 'account', + tags: [] + }, + { + account: { tags: [] }, + name: 'activity tag', + tags: [{ id: TAG_ID_EXCLUDE_FROM_ANALYSIS }] + } + ])( + 'uses the direct path for a holding excluded by its $name', + async ({ account, tags }) => { + const excludedActivity = { + ...includedActivity, + account, + tags + } as Activity; + + const getActivities = jest + .spyOn(activitiesService, 'getActivitiesForPortfolioCalculator') + .mockResolvedValueOnce({ activities: [], count: 0 }) + .mockResolvedValueOnce({ + activities: [excludedActivity], + count: 1 + }); + + await portfolioService.getHolding({ + dataSource, + symbol, + userId: userDummyData.id, + withExcludedActivities: true + }); + + expect(getActivities).toHaveBeenCalledTimes(2); + expect(getActivities).toHaveBeenLastCalledWith({ + filters: [ + { id: dataSource, type: 'DATA_SOURCE' }, + { id: symbol, type: 'SYMBOL' } + ], + userCurrency: 'USD', + userId: userDummyData.id, + withExcludedAccountsAndActivities: true + }); + expect( + portfolioCalculatorFactory.createCalculator + ).toHaveBeenCalledWith( + expect.objectContaining({ + activities: [excludedActivity], + filters: [ + { id: dataSource, type: 'DATA_SOURCE' }, + { id: symbol, type: 'SYMBOL' } + ], + usePortfolioSnapshotCache: false + }) + ); + } + ); + + it('does not load excluded activities by default', async () => { + const getActivities = jest + .spyOn(activitiesService, 'getActivitiesForPortfolioCalculator') + .mockResolvedValue({ activities: [], count: 0 }); + + const holding = await portfolioService.getHolding({ + dataSource, + symbol, + userId: userDummyData.id + }); + + expect(holding).toBeUndefined(); + expect(getActivities).toHaveBeenCalledTimes(1); + expect( + portfolioCalculatorFactory.createCalculator + ).not.toHaveBeenCalled(); + }); }); describe('getSummary', () => { diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 3f8ff055a1..fd941286c2 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -477,12 +477,12 @@ export class PortfolioService { filters?: Filter[]; userId: string; }) { - const { SEARCH_QUERY: [filterBySearchQuery] = [] } = groupBy( - filters, - ({ type }) => { - return type; - } - ); + const { + HOLDING_TYPE: [filterByHoldingType] = [], + SEARCH_QUERY: [filterBySearchQuery] = [] + } = groupBy(filters, ({ type }) => { + return type; + }); const filtersWithoutSearchQueryFilter = filters?.filter(({ type }) => { return type !== 'SEARCH_QUERY'; @@ -491,7 +491,8 @@ export class PortfolioService { let { holdings } = await this.getDetails({ dateRange, userId, - filters: filtersWithoutSearchQueryFilter + filters: filtersWithoutSearchQueryFilter, + includeAllHoldings: !filterByHoldingType }); if (filterBySearchQuery) { @@ -545,7 +546,8 @@ export class PortfolioService { filters, userId, calculationType: this.getUserPerformanceCalculationType(user), - currency: userCurrency + currency: userCurrency, + subscriptionType: user.subscription?.type }); const { historicalData } = await portfolioCalculator.getSnapshot(); @@ -592,6 +594,7 @@ export class PortfolioService { public async getDetails({ dateRange = DEFAULT_DATE_RANGE, filters, + includeAllHoldings = false, user: userFromCaller, userId, withExcludedAccounts = false, @@ -600,6 +603,7 @@ export class PortfolioService { }: { dateRange?: DateRange; filters?: Filter[]; + includeAllHoldings?: boolean; user?: UserWithSettings; userId: string; withExcludedAccounts?: boolean; @@ -614,19 +618,24 @@ export class PortfolioService { (user.settings?.settings as UserSettings)?.emergencyFund ?? 0 ); + const portfolioSnapshotFilters = filters?.filter(({ type }) => { + return type !== 'HOLDING_TYPE'; + }); + const { activities } = await this.activitiesService.getActivitiesForPortfolioCalculator({ - filters, userCurrency, - userId + userId, + filters: portfolioSnapshotFilters }); const portfolioCalculator = this.calculatorFactory.createCalculator({ activities, - filters, userId, calculationType: this.getUserPerformanceCalculationType(user), - currency: userCurrency + currency: userCurrency, + filters: portfolioSnapshotFilters, + subscriptionType: user.subscription?.type }); const { createdAt, currentValueInBaseCurrency, hasErrors, positions } = @@ -706,13 +715,13 @@ export class PortfolioService { tags, valueInBaseCurrency } of positions) { - if (isFilteredByClosedHoldings === true) { - if (!quantity.eq(0)) { + if (!includeAllHoldings) { + if (isFilteredByClosedHoldings && !quantity.eq(0)) { // Ignore positions with a quantity continue; } - } else { - if (quantity.eq(0)) { + + if (!isFilteredByClosedHoldings && quantity.eq(0)) { // Ignore positions without any quantity continue; } @@ -888,20 +897,47 @@ export class PortfolioService { public async getHolding({ dataSource, symbol, - userId + userId, + withExcludedActivities = false }: { userId: string; + withExcludedActivities?: boolean; } & AssetProfileIdentifier): Promise { const user = await this.userService.user({ id: userId }); const userCurrency = this.getUserCurrency(user); - const { activities } = + const holdingFilters: Filter[] = [ + { id: dataSource, type: 'DATA_SOURCE' }, + { id: symbol, type: 'SYMBOL' } + ]; + + let { activities } = await this.activitiesService.getActivitiesForPortfolioCalculator({ userCurrency, userId }); - if (activities.length === 0) { + let hasActivitiesOfHolding = activities.some(({ assetProfile }) => { + return ( + assetProfile.dataSource === dataSource && assetProfile.symbol === symbol + ); + }); + + const isExcludedHolding = withExcludedActivities && !hasActivitiesOfHolding; + + if (isExcludedHolding) { + ({ activities } = + await this.activitiesService.getActivitiesForPortfolioCalculator({ + userCurrency, + userId, + filters: holdingFilters, + withExcludedAccountsAndActivities: true + })); + + hasActivitiesOfHolding = activities.length > 0; + } + + if (!hasActivitiesOfHolding) { return undefined; } @@ -927,7 +963,10 @@ export class PortfolioService { activities, userId, calculationType: this.getUserPerformanceCalculationType(user), - currency: userCurrency + currency: userCurrency, + filters: isExcludedHolding ? holdingFilters : undefined, + usePortfolioSnapshotCache: !isExcludedHolding, + subscriptionType: user.subscription?.type }); const transactionPoints = portfolioCalculator.getTransactionPoints(); @@ -1094,7 +1133,9 @@ export class PortfolioService { userId: assetProfile.userId }, averagePrice: averagePrice.toNumber(), - dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0], + dataProviderInfo: this.dataProviderService + .getDataProvider(dataSource) + .getDataProviderInfo(), dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), dividendYieldPercent: dividendYieldPercent.toNumber(), dividendYieldPercentWithCurrencyEffect: @@ -1180,7 +1221,8 @@ export class PortfolioService { filters, userId, calculationType: this.getUserPerformanceCalculationType(user), - currency: userCurrency + currency: userCurrency, + subscriptionType: user.subscription?.type }); const { errors, hasErrors, historicalData } = @@ -2031,12 +2073,7 @@ export class PortfolioService { const nonExcludedActivities: Activity[] = []; for (const activity of activities) { - if ( - (activity.account && isAccountExcluded(activity.account)) || - activity.tags?.some(({ id }) => { - return id === TAG_ID_EXCLUDE_FROM_ANALYSIS; - }) - ) { + if (this.isExcludedFromAnalysis(activity)) { excludedActivities.push(activity); } else { nonExcludedActivities.push(activity); @@ -2416,4 +2453,13 @@ export class PortfolioService { return { accounts, platforms }; } + + private isExcludedFromAnalysis(activity: Activity) { + return ( + isAccountExcluded(activity.account) || + activity.tags?.some(({ id }) => { + return id === TAG_ID_EXCLUDE_FROM_ANALYSIS; + }) === true + ); + } } diff --git a/apps/api/src/app/subscription/subscription.controller.ts b/apps/api/src/app/subscription/subscription.controller.ts index 0cfc4d90e3..778e322433 100644 --- a/apps/api/src/app/subscription/subscription.controller.ts +++ b/apps/api/src/app/subscription/subscription.controller.ts @@ -1,4 +1,5 @@ import { AllowDuringImpersonation } from '@ghostfolio/api/decorators/allow-during-impersonation.decorator'; +import { CustomThrottlerGuard } from '@ghostfolio/api/guards/custom-throttler.guard'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; @@ -46,7 +47,7 @@ export class SubscriptionController { @Post('redeem-coupon') @HttpCode(StatusCodes.OK) - @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + @UseGuards(AuthGuard('jwt'), CustomThrottlerGuard, HasPermissionGuard) public async redeemCoupon(@Body() { couponCode }: { couponCode: string }) { if (!this.request.user) { throw new HttpException( @@ -119,7 +120,7 @@ export class SubscriptionController { } @Post('stripe/checkout-session') - @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + @UseGuards(AuthGuard('jwt'), CustomThrottlerGuard, HasPermissionGuard) public async createStripeCheckoutSession( @Body() { couponId, priceId }: { couponId?: string; priceId: string } ): Promise { diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index aaa4deb5a5..312b8c3aef 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -17,7 +17,7 @@ import { UserWithSettings } from '@ghostfolio/common/types'; -import { Injectable, Logger } from '@nestjs/common'; +import { BadRequestException, Injectable, Logger } from '@nestjs/common'; import { Prisma, Subscription } from '@prisma/client'; import { addMilliseconds, isBefore } from 'date-fns'; import ms, { StringValue } from 'ms'; @@ -64,6 +64,14 @@ export class SubscriptionService { } ); + if (!subscriptionOffer) { + throw new BadRequestException('Invalid priceId'); + } + + if (couponId && couponId !== subscriptionOffer.couponId) { + throw new BadRequestException('Invalid couponId'); + } + const stripeCheckoutSessionCreateParams: Stripe.Checkout.SessionCreateParams = { cancel_url: `${this.configurationService.get('ROOT_URL')}/${ @@ -77,9 +85,7 @@ export class SubscriptionService { } ], locale: this.getStripeLocale(user.settings?.settings?.language), - metadata: subscriptionOffer - ? { subscriptionOffer: JSON.stringify(subscriptionOffer) } - : {}, + metadata: { subscriptionOffer: JSON.stringify(subscriptionOffer) }, mode: 'payment', payment_method_types: ['card'], success_url: `${this.configurationService.get( diff --git a/apps/api/src/app/symbol/get-lookup.dto.ts b/apps/api/src/app/symbol/get-lookup.dto.ts new file mode 100644 index 0000000000..0778d1b5bf --- /dev/null +++ b/apps/api/src/app/symbol/get-lookup.dto.ts @@ -0,0 +1,16 @@ +import { SEARCH_QUERY_MAXIMUM_LENGTH } from '@ghostfolio/common/config'; + +import { Transform, TransformFnParams } from 'class-transformer'; +import { IsBoolean, IsString, MaxLength } from 'class-validator'; + +export class GetLookupDto { + @IsBoolean() + @Transform(({ value }: TransformFnParams) => { + return value === 'true'; + }) + includeIndices? = false; + + @IsString() + @MaxLength(SEARCH_QUERY_MAXIMUM_LENGTH) + query? = ''; +} diff --git a/apps/api/src/app/symbol/symbol.controller.ts b/apps/api/src/app/symbol/symbol.controller.ts index d28362175e..9d8abb47ba 100644 --- a/apps/api/src/app/symbol/symbol.controller.ts +++ b/apps/api/src/app/symbol/symbol.controller.ts @@ -27,6 +27,7 @@ import { isValid, parseISO } from 'date-fns'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { isEmpty } from 'lodash'; +import { GetLookupDto } from './get-lookup.dto'; import { SymbolService } from './symbol.service'; @Controller('symbol') @@ -43,11 +44,8 @@ export class SymbolController { @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async lookupSymbol( - @Query('includeIndices') includeIndicesParam = 'false', - @Query('query') query = '' + @Query() { includeIndices, query }: GetLookupDto ): Promise { - const includeIndices = includeIndicesParam === 'true'; - try { return this.symbolService.lookup({ includeIndices, diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 082aeb7791..d53b3891ac 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -275,7 +275,7 @@ export class UserService { } try { - const { isBlocked } = await this.throttlerStorage.increment( + const { totalHits } = await this.throttlerStorage.increment( `${THROTTLE_DAILY_KEY}-${user.id}`, THROTTLE_DAILY_TTL, maxDailyRequests, @@ -283,7 +283,7 @@ export class UserService { THROTTLE_DAILY_KEY ); - return isBlocked; + return totalHits > maxDailyRequests; } catch (error) { this.logger.error(error); diff --git a/apps/api/src/dtos/filter.dto.ts b/apps/api/src/dtos/filter.dto.ts index cb26d582bc..09206984ab 100644 --- a/apps/api/src/dtos/filter.dto.ts +++ b/apps/api/src/dtos/filter.dto.ts @@ -1,23 +1,44 @@ -import { IsOptional, IsString } from 'class-validator'; +import { SYMBOL_MAXIMUM_LENGTH } from '@ghostfolio/common/config'; + +import { AssetClass, DataSource } from '@prisma/client'; +import { Transform, TransformFnParams } from 'class-transformer'; +import { + IsEnum, + IsOptional, + IsString, + IsUUID, + MaxLength +} from 'class-validator'; +import { isString } from 'lodash'; export class FilterDto { @IsOptional() - @IsString() - accounts?: string; + @IsUUID(undefined, { each: true }) + @Transform(({ value }: TransformFnParams) => { + return isString(value) ? value.split(',') : value; + }) + accounts?: string[]; + @IsEnum(AssetClass, { each: true }) @IsOptional() - @IsString() - assetClasses?: string; + @Transform(({ value }: TransformFnParams) => { + return isString(value) ? value.split(',') : value; + }) + assetClasses?: AssetClass[]; + @IsEnum(DataSource) @IsOptional() - @IsString() - dataSource?: string; + dataSource?: DataSource; @IsOptional() @IsString() + @MaxLength(SYMBOL_MAXIMUM_LENGTH) symbol?: string; @IsOptional() - @IsString() - tags?: string; + @IsUUID(undefined, { each: true }) + @Transform(({ value }: TransformFnParams) => { + return isString(value) ? value.split(',') : value; + }) + tags?: string[]; } diff --git a/apps/api/src/errors/caller-facing.error.ts b/apps/api/src/errors/caller-facing.error.ts new file mode 100644 index 0000000000..5b7687a19a --- /dev/null +++ b/apps/api/src/errors/caller-facing.error.ts @@ -0,0 +1,12 @@ +/** + * An error whose message is written for the caller. A filter passes such a + * message on, while it hides the message of every other error, because that + * message can carry internals of the application. + */ +export class CallerFacingError extends Error { + public constructor(message: string) { + super(message); + + this.name = 'CallerFacingError'; + } +} diff --git a/apps/api/src/filters/mcp-tool-exception.filter.spec.ts b/apps/api/src/filters/mcp-tool-exception.filter.spec.ts new file mode 100644 index 0000000000..23eb6ff92b --- /dev/null +++ b/apps/api/src/filters/mcp-tool-exception.filter.spec.ts @@ -0,0 +1,83 @@ +import { ImportValidationError } from '@ghostfolio/api/app/import/errors/import-validation.error'; +import { PortfolioSnapshotComputationError } from '@ghostfolio/api/app/portfolio/errors/portfolio-snapshot-computation.error'; + +import { ForbiddenException, Logger } from '@nestjs/common'; +import { getReasonPhrase, StatusCodes } from 'http-status-codes'; +import { firstValueFrom } from 'rxjs'; + +import { McpToolExceptionFilter } from './mcp-tool-exception.filter'; + +describe('McpToolExceptionFilter', () => { + let filter: McpToolExceptionFilter; + let logError: jest.SpyInstance; + + async function getErrorOfException(exception: unknown) { + try { + await firstValueFrom(filter.catch(exception)); + } catch (error) { + return error; + } + + throw new Error('The filter gave no error'); + } + + beforeEach(() => { + filter = new McpToolExceptionFilter(); + + logError = jest.spyOn(Logger.prototype, 'error').mockImplementation(); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + it('Passes on the message of an error which is written for the caller', async () => { + const exception = new ImportValidationError( + 'activities.0.symbol ("X") is not valid' + ); + + expect(await getErrorOfException(exception)).toEqual({ + message: 'activities.0.symbol ("X") is not valid', + status: 'error' + }); + + expect(logError).not.toHaveBeenCalled(); + }); + + it('Hides the message of an unexpected error and writes it to the log', async () => { + const exception = new Error( + 'Unique constraint failed on the fields: (dataSource)' + ); + + expect(await getErrorOfException(exception)).toEqual({ + message: getReasonPhrase(StatusCodes.INTERNAL_SERVER_ERROR), + status: 'error' + }); + + expect(logError).toHaveBeenCalledWith(exception); + }); + + // An access without the scope of a tool causes a refused call at each + // attempt, which would fill the log + it('Gives the reason phrase of the status of an HttpException and writes no log', async () => { + expect(await getErrorOfException(new ForbiddenException())).toEqual({ + message: getReasonPhrase(StatusCodes.FORBIDDEN), + status: 'error' + }); + + expect(logError).not.toHaveBeenCalled(); + }); + + it('Gives the reason phrase of a service which is not available if a snapshot cannot be computed', async () => { + const exception = new PortfolioSnapshotComputationError( + 'The snapshot cannot be computed' + ); + + expect(await getErrorOfException(exception)).toEqual({ + message: getReasonPhrase(StatusCodes.SERVICE_UNAVAILABLE), + status: 'error' + }); + + expect(logError).toHaveBeenCalledWith(exception); + }); +}); diff --git a/apps/api/src/filters/mcp-tool-exception.filter.ts b/apps/api/src/filters/mcp-tool-exception.filter.ts index 7525c65598..6630c1c1cf 100644 --- a/apps/api/src/filters/mcp-tool-exception.filter.ts +++ b/apps/api/src/filters/mcp-tool-exception.filter.ts @@ -1,4 +1,5 @@ import { PortfolioSnapshotComputationError } from '@ghostfolio/api/app/portfolio/errors/portfolio-snapshot-computation.error'; +import { CallerFacingError } from '@ghostfolio/api/errors/caller-facing.error'; import { Catch, @@ -6,7 +7,6 @@ import { Logger, RpcExceptionFilter } from '@nestjs/common'; -import { RpcException } from '@nestjs/microservices'; import { getReasonPhrase, StatusCodes } from 'http-status-codes'; import { Observable, throwError } from 'rxjs'; @@ -20,24 +20,32 @@ export class McpToolExceptionFilter implements RpcExceptionFilter { private readonly logger = new Logger(McpToolExceptionFilter.name); public catch(exception: unknown): Observable { - this.logger.error(exception); - - if (exception instanceof RpcException) { + // The message of this exception is written for the caller, hence it is + // passed on and is not written to the log + if (exception instanceof CallerFacingError) { return throwError(() => { - return exception.getError(); + return { message: exception.message, status: 'error' }; }); } - return throwError(() => { - return { message: this.getMessage(exception), status: 'error' }; - }); - } + const statusCode = this.getStatus(exception); + + // An exception which the caller causes, for example a refused call, is + // expected, hence only an exception of the application is written to the + // log + if (statusCode >= StatusCodes.INTERNAL_SERVER_ERROR) { + this.logger.error(exception); + } - private getMessage(exception: unknown) { // The message of an exception can carry internals, for example the // property names of a data transfer object of a failed validation, hence // the reason phrase of the status is passed on instead - return this.getReasonPhraseOfStatus(this.getStatus(exception)); + return throwError(() => { + return { + message: this.getReasonPhraseOfStatus(statusCode), + status: 'error' + }; + }); } private getReasonPhraseOfStatus(statusCode: number) { diff --git a/apps/api/src/helper/interfaces/table-column-definition.interface.ts b/apps/api/src/helper/interfaces/table-column-definition.interface.ts new file mode 100644 index 0000000000..569616623d --- /dev/null +++ b/apps/api/src/helper/interfaces/table-column-definition.interface.ts @@ -0,0 +1,6 @@ +import type { ColumnDescriptor } from 'tablemark'; + +export interface TableColumnDefinition extends ColumnDescriptor { + getValue: (item: T, context: C) => string; + name: string; +} diff --git a/apps/api/src/helper/interfaces/table-parameters.interface.ts b/apps/api/src/helper/interfaces/table-parameters.interface.ts new file mode 100644 index 0000000000..7ab9d7800d --- /dev/null +++ b/apps/api/src/helper/interfaces/table-parameters.interface.ts @@ -0,0 +1,7 @@ +import { TableColumnDefinition } from './table-column-definition.interface'; + +export interface TableParameters { + columnDefinitions: readonly TableColumnDefinition[]; + context?: C; + rows: readonly T[]; +} diff --git a/apps/api/src/helper/markdown-table.helper.spec.ts b/apps/api/src/helper/markdown-table.helper.spec.ts new file mode 100644 index 0000000000..fa1161738b --- /dev/null +++ b/apps/api/src/helper/markdown-table.helper.spec.ts @@ -0,0 +1,77 @@ +import { TableColumnDefinition } from './interfaces/table-column-definition.interface'; +import { getTableInput } from './markdown-table.helper'; + +interface Holding { + name: string; + quantity: number; +} + +interface HoldingContext { + currency: string; +} + +describe('getTableInput', () => { + const holdings: Holding[] = [ + { name: 'Apple', quantity: 2 }, + { name: 'Microsoft', quantity: 30 } + ]; + + const columnDefinitions: TableColumnDefinition[] = [ + { + getValue: ({ name }) => { + return name; + }, + name: 'Name' + }, + { + align: 'right', + getValue: ({ quantity }) => { + return quantity.toString(); + }, + name: 'Quantity' + }, + { + getValue: (_, { currency }) => { + return currency; + }, + name: 'Currency' + } + ]; + + function getInput(rows: Holding[] = holdings) { + return getTableInput({ + columnDefinitions, + rows, + context: { currency: 'USD' } + }); + } + + it('Gives a column for each definition, in the sequence of the definitions', () => { + expect(getInput().columns).toEqual([ + { align: 'left', name: 'Name' }, + { align: 'right', name: 'Quantity' }, + { align: 'left', name: 'Currency' } + ]); + }); + + it('Gives a row for each row, with the name of the column as the key', () => { + expect(getInput().rows).toEqual([ + { Currency: 'USD', Name: 'Apple', Quantity: '2' }, + { Currency: 'USD', Name: 'Microsoft', Quantity: '30' } + ]); + }); + + it('Gives the keys of a row in the sequence of the columns', () => { + const [firstRow] = getInput().rows; + + expect(Object.keys(firstRow)).toEqual( + getInput().columns.map(({ name }) => { + return name; + }) + ); + }); + + it('Gives no row if there is no row', () => { + expect(getInput([]).rows).toEqual([]); + }); +}); diff --git a/apps/api/src/helper/markdown-table.helper.ts b/apps/api/src/helper/markdown-table.helper.ts new file mode 100644 index 0000000000..3bc8a7a8c7 --- /dev/null +++ b/apps/api/src/helper/markdown-table.helper.ts @@ -0,0 +1,44 @@ +import { TableParameters } from './interfaces/table-parameters.interface'; + +/** + * Gives the columns and the rows in the form which the renderer takes, with + * one column per definition, which gives the title of the column and reads + * the value of a row + */ +export function getTableInput({ + columnDefinitions, + context, + rows +}: TableParameters) { + return { + columns: columnDefinitions.map(({ align, name }) => { + return { name, align: align ?? 'left' }; + }), + rows: rows.map((row) => { + return columnDefinitions.reduce( + (tableRow, { getValue, name }) => { + tableRow[name] = getValue(row, context); + + return tableRow; + }, + {} as Record + ); + }) + }; +} + +export async function getMarkdownTable( + parameters: TableParameters +) { + const { columns, rows } = getTableInput(parameters); + + // Dynamic import to load ESM module from CommonJS context + // eslint-disable-next-line @typescript-eslint/no-implied-eval + const dynamicImport = new Function('s', 'return import(s)') as ( + s: string + ) => Promise; + + const { tablemark } = await dynamicImport('tablemark'); + + return tablemark(rows, { columns }); +} 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 cbe5b4363d..31bfb620ed 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 @@ -70,6 +70,8 @@ export class TransformDataSourceInResponseInterceptor< } } + data.dataProviderInfo = undefined; + if (Object.keys(valueMap).length === 0) { return data; } diff --git a/apps/api/src/services/api/api.service.ts b/apps/api/src/services/api/api.service.ts index 11074870ef..9dddff85ee 100644 --- a/apps/api/src/services/api/api.service.ts +++ b/apps/api/src/services/api/api.service.ts @@ -14,23 +14,23 @@ export class ApiService { filterBySymbol, filterByTags }: { - filterByAccounts?: string; - filterByAssetClasses?: string; + filterByAccounts?: string[]; + filterByAssetClasses?: string[]; filterByAssetSubClasses?: string; filterByDataSource?: string; filterByHoldingType?: string; filterBySearchQuery?: string; filterBySymbol?: string; - filterByTags?: string; + filterByTags?: string[]; }): Filter[] { - const accountIds = filterByAccounts?.split(',') ?? []; - const assetClasses = filterByAssetClasses?.split(',') ?? []; + const accountIds = filterByAccounts ?? []; + const assetClasses = filterByAssetClasses ?? []; const assetSubClasses = filterByAssetSubClasses?.split(',') ?? []; const dataSource = filterByDataSource; const holdingType = filterByHoldingType; const searchQuery = filterBySearchQuery?.toLowerCase(); const symbol = filterBySymbol; - const tagIds = filterByTags?.split(',') ?? []; + const tagIds = filterByTags ?? []; const filters = [ ...accountIds.map((accountId) => { @@ -96,11 +96,11 @@ export class ApiService { userSettings: UserSettings; }): Filter[] { return this.buildFiltersFromQueryParams({ - filterByAccounts: userSettings?.['filters.accounts']?.[0], - filterByAssetClasses: userSettings?.['filters.assetClasses']?.[0], + filterByAccounts: userSettings?.['filters.accounts'], + filterByAssetClasses: userSettings?.['filters.assetClasses'], filterByDataSource: userSettings?.['filters.dataSource'], filterBySymbol: userSettings?.['filters.symbol'], - filterByTags: userSettings?.['filters.tags']?.[0] + filterByTags: userSettings?.['filters.tags'] }); } } 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 9366574ac4..87c1e85c61 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -594,13 +594,13 @@ export class DataProviderService implements OnModuleInit { public async getQuotes({ items, requestTimeout, - useCache = true, - user + subscriptionType, + useCache = true }: { items: AssetProfileIdentifier[]; requestTimeout?: number; + subscriptionType?: SubscriptionType; useCache?: boolean; - user?: UserWithSettings; }): Promise<{ [assetProfileIdentifier: string]: DataProviderResponse; }> { @@ -687,7 +687,7 @@ export class DataProviderService implements OnModuleInit { } else if ( dataProvider.getDataProviderInfo().isPremium && this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && - user?.subscription?.type === SubscriptionType.Basic + subscriptionType === SubscriptionType.Basic ) { // Skip symbols of Premium data providers for users without subscription return false; @@ -725,6 +725,10 @@ export class DataProviderService implements OnModuleInit { promises.push( promise.then(async (result) => { + const fetchedQuotes: (DataProviderResponse & { + symbol: string; + })[] = []; + for (const [symbol, dataProviderResponse] of Object.entries( result )) { @@ -739,12 +743,16 @@ export class DataProviderService implements OnModuleInit { continue; } + const quote = { ...dataProviderResponse, symbol }; + + fetchedQuotes.push(quote); + response[ getAssetProfileIdentifier({ symbol, dataSource: DataSource[dataSource] }) - ] = { ...dataProviderResponse, symbol }; + ] = quote; this.redisCacheService.set( this.redisCacheService.getQuoteKey({ @@ -772,15 +780,19 @@ export class DataProviderService implements OnModuleInit { marketState: 'open' }; + const derivedQuote = { + ...derivedDataProviderResponse, + symbol: `${DEFAULT_CURRENCY}${currency}` + }; + + fetchedQuotes.push(derivedQuote); + response[ getAssetProfileIdentifier({ dataSource: DataSource[dataSource], symbol: `${DEFAULT_CURRENCY}${currency}` }) - ] = { - ...derivedDataProviderResponse, - symbol: `${DEFAULT_CURRENCY}${currency}` - }; + ] = derivedQuote; this.redisCacheService.set( this.redisCacheService.getQuoteKey({ @@ -805,7 +817,7 @@ export class DataProviderService implements OnModuleInit { try { await this.marketDataService.updateMany({ - data: Object.values(response) + data: fetchedQuotes .filter(({ marketPrice, marketState }) => { return ( isNumber(marketPrice) && 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 ced4db38a9..7c840b5fc6 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 @@ -54,6 +54,8 @@ export class FinancialModelingPrepService implements DataProviderInterface, OnModuleInit { private static countriesMapping = { + 'Congo (Dem. Rep. of the)': 'CD', + 'Congo (Rep. of)': 'CG', 'Czech Republic': 'CZ', 'Korea (the Republic of)': 'KR', Macau: 'MO', diff --git a/apps/api/src/services/portfolio-table/interfaces/holdings-table-context.interface.ts b/apps/api/src/services/portfolio-table/interfaces/holdings-table-context.interface.ts new file mode 100644 index 0000000000..4364b492e7 --- /dev/null +++ b/apps/api/src/services/portfolio-table/interfaces/holdings-table-context.interface.ts @@ -0,0 +1,6 @@ +import { AssetClass, AssetSubClass } from '@prisma/client'; + +export interface HoldingsTableContext { + assetClassTranslations: Record; + assetSubClassTranslations: Record; +} diff --git a/apps/api/src/services/portfolio-table/portfolio-table.module.ts b/apps/api/src/services/portfolio-table/portfolio-table.module.ts new file mode 100644 index 0000000000..4411bf9c8a --- /dev/null +++ b/apps/api/src/services/portfolio-table/portfolio-table.module.ts @@ -0,0 +1,14 @@ +import { ActivitiesModule } from '@ghostfolio/api/app/activities/activities.module'; +import { PortfolioModule } from '@ghostfolio/api/app/portfolio/portfolio.module'; +import { I18nModule } from '@ghostfolio/api/services/i18n/i18n.module'; + +import { Module } from '@nestjs/common'; + +import { PortfolioTableService } from './portfolio-table.service'; + +@Module({ + exports: [PortfolioTableService], + imports: [ActivitiesModule, I18nModule, PortfolioModule], + providers: [PortfolioTableService] +}) +export class PortfolioTableModule {} diff --git a/apps/api/src/services/portfolio-table/portfolio-table.service.spec.ts b/apps/api/src/services/portfolio-table/portfolio-table.service.spec.ts new file mode 100644 index 0000000000..2d9287051a --- /dev/null +++ b/apps/api/src/services/portfolio-table/portfolio-table.service.spec.ts @@ -0,0 +1,272 @@ +import type { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; +import type { TableParameters } from '@ghostfolio/api/helper/interfaces/table-parameters.interface'; +import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; +import { + DEFAULT_LANGUAGE_CODE, + TAG_ID_EXCLUDE_FROM_ANALYSIS +} from '@ghostfolio/common/config'; +import { PortfolioPosition } from '@ghostfolio/common/interfaces'; +import { AccountWithValue } from '@ghostfolio/common/types'; + +import { AssetClass, AssetSubClass } from '@prisma/client'; + +import { PortfolioTableService } from './portfolio-table.service'; + +/** + * The markdown table is rendered by a package which ships as an ECMAScript + * module only, which Jest cannot run. The mock keeps the mapping of the + * columns and of the rows and writes them in the same shape as the renderer + */ +jest.mock('@ghostfolio/api/helper/markdown-table.helper', () => { + const { getTableInput } = jest.requireActual< + typeof import('@ghostfolio/api/helper/markdown-table.helper') + >('@ghostfolio/api/helper/markdown-table.helper'); + + return { + getTableInput, + getMarkdownTable: jest.fn( + (parameters: TableParameters) => { + const { columns, rows } = getTableInput(parameters); + + const names = columns.map(({ name }) => { + return name; + }); + + return Promise.resolve( + [ + names, + names.map(() => { + return '---'; + }), + ...rows.map((row) => { + return names.map((name) => { + return row[name]; + }); + }) + ] + .map((cells) => { + return `| ${cells.join(' | ')} |`; + }) + .join('\n') + ); + } + ) + }; +}); + +function createAccount({ + id = 'account-a-id', + isExcluded = false, + name = 'Account A' +}: { + id?: string; + isExcluded?: boolean; + name?: string; +} = {}) { + return { + id, + name, + activitiesCount: 3, + allocationInPercentage: 0.25, + balance: 1000, + currency: 'CHF', + platform: { name: 'Platform A' }, + tags: isExcluded ? [{ id: TAG_ID_EXCLUDE_FROM_ANALYSIS }] : [], + value: 2000 + } as unknown as AccountWithValue; +} + +function createHolding({ + allocationInPercentage = 0.75, + assetClass = AssetClass.EQUITY, + assetSubClass = AssetSubClass.STOCK, + symbol = 'AAPL' +}: { + allocationInPercentage?: number; + assetClass?: AssetClass; + assetSubClass?: AssetSubClass; + symbol?: string; +} = {}) { + return { + allocationInPercentage, + activitiesCount: 3, + assetProfile: { + assetClass, + assetSubClass, + symbol, + currency: 'CHF', + name: `Name of ${symbol}` + }, + dateOfFirstActivity: new Date('2024-01-01'), + grossPerformance: 100, + netPerformance: 90, + quantity: 5, + valueInBaseCurrency: 2000 + } as unknown as PortfolioPosition; +} + +function createPortfolioTableService({ + accounts = [], + holdings = [] +}: { + accounts?: AccountWithValue[]; + holdings?: PortfolioPosition[]; +} = {}) { + // The mock gives the identifier of the translation, so that a test can tell + // the translation of the asset class from that of the asset sub class + const i18nService = { + getTranslation: jest.fn(({ id }: { id: string }) => { + return `translation of ${id}`; + }) + } as unknown as I18nService; + + const portfolioService = { + getAccountsWithAggregations: jest.fn().mockResolvedValue({ accounts }), + getDetails: jest.fn().mockResolvedValue({ holdings }) + } as unknown as PortfolioService; + + return new PortfolioTableService(null, i18nService, portfolioService); +} + +describe('PortfolioTableService', () => { + // The tools of the model context protocol are the only callers, and an + // access of that type never grants the scope to read the monetary values, + // hence no table has a column with such a value + describe('getAccountsTableColumnNames', () => { + it('gives no column with a monetary value', () => { + expect(PortfolioTableService.getAccountsTableColumnNames()).toEqual([ + 'Id', + 'Name', + 'Currency', + 'Platform', + 'Activities Count', + 'Allocation in Percentage', + 'Excluded from Analysis' + ]); + }); + }); + + describe('getActivitiesTableColumnNames', () => { + it('gives no column with a monetary value', () => { + expect(PortfolioTableService.getActivitiesTableColumnNames()).toEqual([ + 'Date', + 'Type', + 'Name', + 'Symbol', + 'Currency', + 'Unit Price', + 'Account' + ]); + }); + }); + + describe('getHoldingsTableColumnNames', () => { + it('gives no column with a monetary value', () => { + expect(PortfolioTableService.getHoldingsTableColumnNames()).toEqual([ + 'Name', + 'Symbol', + 'Currency', + 'Asset Class', + 'Asset Sub Class', + 'Date of First Activity', + 'Activities Count', + 'Allocation in Percentage' + ]); + }); + }); + + describe('getAccountsTable', () => { + it('gives no cash balance and no value of an account', async () => { + const portfolioTableService = createPortfolioTableService({ + accounts: [createAccount()] + }); + + const result = await portfolioTableService.getAccountsTable({ + userId: 'user-id' + }); + + expect(result).not.toContain('Cash Balance'); + expect(result).not.toContain('1000'); + expect(result).not.toContain('2000'); + }); + + // The accountIds parameter of the tool takes the identifiers, hence the + // table has to give them + it('gives the identifier of an account', async () => { + const portfolioTableService = createPortfolioTableService({ + accounts: [createAccount()] + }); + + const result = await portfolioTableService.getAccountsTable({ + userId: 'user-id' + }); + + expect(result).toContain('account-a-id'); + }); + + it('marks an account which is excluded from the analysis', async () => { + const portfolioTableService = createPortfolioTableService({ + accounts: [ + createAccount({ isExcluded: true }), + createAccount({ id: 'account-b-id', name: 'Account B' }) + ] + }); + + const result = await portfolioTableService.getAccountsTable({ + userId: 'user-id' + }); + + const [rowOfAccountA, rowOfAccountB] = result + .split('\n') + .filter((line) => { + return line.startsWith('| account-'); + }); + + expect(rowOfAccountA).toContain('true'); + expect(rowOfAccountB).toContain('false'); + }); + + it('tells that no accounts are found if the result is empty', async () => { + const portfolioTableService = createPortfolioTableService(); + + const result = await portfolioTableService.getAccountsTable({ + userId: 'user-id' + }); + + expect(result).toContain('No accounts found.'); + }); + }); + describe('getHoldingsTable', () => { + function getHoldingsTable(holdings: PortfolioPosition[]) { + return createPortfolioTableService({ holdings }).getHoldingsTable({ + languageCode: DEFAULT_LANGUAGE_CODE, + userId: 'user-id' + }); + } + + it('gives the translation of the asset class and of the asset sub class', async () => { + const result = await getHoldingsTable([createHolding()]); + + const [row] = result.split('\n').filter((line) => { + return line.startsWith('| Name of AAPL'); + }); + + expect(row).toContain('translation of assetClass.EQUITY'); + expect(row).toContain('translation of assetSubClass.STOCK'); + }); + + it('gives the holding with the largest allocation first', async () => { + const result = await getHoldingsTable([ + createHolding({ allocationInPercentage: 0.25, symbol: 'MSFT' }), + createHolding({ allocationInPercentage: 0.75, symbol: 'AAPL' }) + ]); + + const [firstRow, secondRow] = result.split('\n').filter((line) => { + return line.startsWith('| Name of'); + }); + + expect(firstRow).toContain('AAPL'); + expect(secondRow).toContain('MSFT'); + }); + }); +}); diff --git a/apps/api/src/services/portfolio-table/portfolio-table.service.ts b/apps/api/src/services/portfolio-table/portfolio-table.service.ts new file mode 100644 index 0000000000..f8cc3cfc67 --- /dev/null +++ b/apps/api/src/services/portfolio-table/portfolio-table.service.ts @@ -0,0 +1,399 @@ +import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service'; +import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; +import { TableColumnDefinition } from '@ghostfolio/api/helper/interfaces/table-column-definition.interface'; +import { getMarkdownTable } from '@ghostfolio/api/helper/markdown-table.helper'; +import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; +import { DATE_FORMAT, isAccountExcluded } from '@ghostfolio/common/helper'; +import { Activity, Filter } from '@ghostfolio/common/interfaces'; +import { AccountWithValue } from '@ghostfolio/common/types'; + +import { Injectable } from '@nestjs/common'; +import { + AssetClass, + AssetSubClass, + Type as ActivityType +} from '@prisma/client'; +import { format } from 'date-fns'; + +import { HoldingsTableColumnDefinition } from './types/holdings-table-column-definition.type'; + +function getAllocationInPercentage(allocationInPercentage: number) { + return `${(allocationInPercentage * 100).toFixed(3)}%`; +} + +/** + * Renders the accounts, the activities and the holdings of a portfolio as a + * markdown table. No table has a column with a quantity or with a monetary + * value, except the unit price of an activity. + */ +@Injectable() +export class PortfolioTableService { + private static readonly ACCOUNTS_TABLE_COLUMN_DEFINITIONS: TableColumnDefinition[] = + [ + { + getValue: ({ id }) => { + return id; + }, + name: 'Id' + }, + { + getValue: ({ name }) => { + return name ?? ''; + }, + name: 'Name' + }, + { + getValue: ({ currency }) => { + return currency ?? ''; + }, + name: 'Currency' + }, + { + getValue: ({ platform }) => { + return platform?.name ?? ''; + }, + name: 'Platform' + }, + { + align: 'right', + getValue: ({ activitiesCount }) => { + return activitiesCount.toString(); + }, + name: 'Activities Count' + }, + { + align: 'right', + getValue: ({ allocationInPercentage }) => { + return getAllocationInPercentage(allocationInPercentage); + }, + name: 'Allocation in Percentage' + }, + { + getValue: ({ tags }) => { + return isAccountExcluded({ tags }).toString(); + }, + name: 'Excluded from Analysis' + } + ]; + + private static readonly ACTIVITIES_TABLE_COLUMN_DEFINITIONS: TableColumnDefinition[] = + [ + { + getValue: ({ date }) => { + return format(date, DATE_FORMAT); + }, + name: 'Date' + }, + { + getValue: ({ type }) => { + return type; + }, + name: 'Type' + }, + { + getValue: ({ assetProfile }) => { + return assetProfile.name ?? ''; + }, + name: 'Name' + }, + { + getValue: ({ assetProfile }) => { + return assetProfile.symbol; + }, + name: 'Symbol' + }, + { + getValue: ({ assetProfile, currency }) => { + return currency ?? assetProfile.currency; + }, + name: 'Currency' + }, + { + align: 'right', + getValue: ({ unitPrice }) => { + return unitPrice.toString(); + }, + name: 'Unit Price' + }, + { + getValue: ({ account }) => { + return account?.name ?? ''; + }, + name: 'Account' + } + ]; + + private static readonly HOLDINGS_TABLE_COLUMN_DEFINITIONS: HoldingsTableColumnDefinition[] = + [ + { + getValue: ({ assetProfile }) => { + return assetProfile.name; + }, + name: 'Name' + }, + { + getValue: ({ assetProfile }) => { + return assetProfile.symbol; + }, + name: 'Symbol' + }, + { + getValue: ({ assetProfile }) => { + return assetProfile.currency; + }, + name: 'Currency' + }, + { + getValue: ({ assetProfile }, { assetClassTranslations }) => { + return assetClassTranslations[assetProfile.assetClass] ?? ''; + }, + name: 'Asset Class' + }, + { + getValue: ({ assetProfile }, { assetSubClassTranslations }) => { + return assetSubClassTranslations[assetProfile.assetSubClass] ?? ''; + }, + name: 'Asset Sub Class' + }, + { + getValue: ({ dateOfFirstActivity }) => { + return dateOfFirstActivity + ? format(dateOfFirstActivity, DATE_FORMAT) + : ''; + }, + name: 'Date of First Activity' + }, + { + align: 'right', + getValue: ({ activitiesCount }) => { + return activitiesCount.toString(); + }, + name: 'Activities Count' + }, + { + align: 'right', + getValue: ({ allocationInPercentage }) => { + return getAllocationInPercentage(allocationInPercentage); + }, + name: 'Allocation in Percentage' + } + ]; + + public constructor( + private readonly activitiesService: ActivitiesService, + private readonly i18nService: I18nService, + private readonly portfolioService: PortfolioService + ) {} + + public static getAccountsTableColumnNames() { + return PortfolioTableService.ACCOUNTS_TABLE_COLUMN_DEFINITIONS.map( + ({ name }) => { + return name; + } + ); + } + + public static getActivitiesTableColumnNames() { + return PortfolioTableService.ACTIVITIES_TABLE_COLUMN_DEFINITIONS.map( + ({ name }) => { + return name; + } + ); + } + + public static getHoldingsTableColumnNames() { + return PortfolioTableService.HOLDINGS_TABLE_COLUMN_DEFINITIONS.map( + ({ name }) => { + return name; + } + ); + } + + public async getAccountsTable({ + filters, + userId + }: { + filters?: Filter[]; + userId: string; + }) { + const { accounts } = + await this.portfolioService.getAccountsWithAggregations({ + filters, + userId, + withExcludedAccounts: true + }); + + const accountsSection = ['## Accounts', '']; + + if (accounts.length > 0) { + accountsSection.push( + await getMarkdownTable({ + columnDefinitions: + PortfolioTableService.ACCOUNTS_TABLE_COLUMN_DEFINITIONS, + rows: accounts + }) + ); + } else { + accountsSection.push('No accounts found.'); + } + + return accountsSection.join('\n'); + } + + public async getActivitiesTable({ + endDate, + filters, + skip = 0, + startDate, + take, + types, + userCurrency, + userId + }: { + endDate?: Date; + filters?: Filter[]; + skip?: number; + startDate?: Date; + take: number; + types?: ActivityType[]; + userCurrency: string; + userId: string; + }) { + const { activities, count } = await this.activitiesService.getActivities({ + endDate, + filters, + skip, + startDate, + take, + types, + userCurrency, + userId, + includeDrafts: true, + sortColumn: 'date', + sortDirection: 'desc', + withExcludedAccountsAndActivities: true + }); + + const activitiesSection = [ + '## Activities', + '', + this.getActivitiesSummary({ + count, + skip, + numberOfActivities: activities.length + }) + ]; + + if (activities.length > 0) { + activitiesSection.push( + '', + await getMarkdownTable({ + columnDefinitions: + PortfolioTableService.ACTIVITIES_TABLE_COLUMN_DEFINITIONS, + rows: activities + }) + ); + } + + return activitiesSection.join('\n'); + } + + public async getHoldingsTable({ + filters, + languageCode, + userId + }: { + filters?: Filter[]; + languageCode: string; + userId: string; + }) { + const { holdings } = await this.portfolioService.getDetails({ + filters, + userId + }); + + const assetClassTranslations = this.getEnumTranslations({ + languageCode, + id: 'assetClass', + values: Object.values(AssetClass) + }); + + const assetSubClassTranslations = this.getEnumTranslations({ + languageCode, + id: 'assetSubClass', + values: Object.values(AssetSubClass) + }); + + const sortedHoldings = [...holdings].sort((a, b) => { + return b.allocationInPercentage - a.allocationInPercentage; + }); + + return [ + '## Holdings', + '', + await getMarkdownTable({ + columnDefinitions: + PortfolioTableService.HOLDINGS_TABLE_COLUMN_DEFINITIONS, + context: { assetClassTranslations, assetSubClassTranslations }, + rows: sortedHoldings + }) + ].join('\n'); + } + + private getActivitiesSummary({ + count, + numberOfActivities, + skip + }: { + count: number; + numberOfActivities: number; + skip: number; + }) { + if (count === 0) { + return 'No activities found.'; + } + + if (numberOfActivities === 0) { + return `No activities beyond the ${count} which match the parameters, hence lower the skip parameter.`; + } + + if (numberOfActivities === count) { + return `Showing all ${count} activities, the most recent first.`; + } + + const lastActivity = skip + numberOfActivities; + + const summary = `Showing the activities ${ + skip + 1 + } to ${lastActivity} of ${count}, the most recent first.`; + + if (lastActivity === count) { + return summary; + } + + return `${summary} Get the further activities by raising the skip parameter or narrow the result with the other parameters.`; + } + + private getEnumTranslations({ + id, + languageCode, + values + }: { + id: string; + languageCode: string; + values: T[]; + }) { + return values.reduce( + (translations, value) => { + translations[value] = + this.i18nService.getTranslation({ + languageCode, + id: `${id}.${value}` + }) || value; + + return translations; + }, + {} as Record + ); + } +} diff --git a/apps/api/src/services/portfolio-table/types/holdings-table-column-definition.type.ts b/apps/api/src/services/portfolio-table/types/holdings-table-column-definition.type.ts new file mode 100644 index 0000000000..a8ad63fe6f --- /dev/null +++ b/apps/api/src/services/portfolio-table/types/holdings-table-column-definition.type.ts @@ -0,0 +1,9 @@ +import { TableColumnDefinition } from '@ghostfolio/api/helper/interfaces/table-column-definition.interface'; +import { PortfolioPosition } from '@ghostfolio/common/interfaces'; + +import { HoldingsTableContext } from '../interfaces/holdings-table-context.interface'; + +export type HoldingsTableColumnDefinition = TableColumnDefinition< + PortfolioPosition, + HoldingsTableContext +>; 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 06b87f733b..a6fdcdd97f 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 @@ -82,9 +82,7 @@ export class PortfolioSnapshotProcessor { const expiration = addMilliseconds( new Date(), - (snapshot?.errors?.length ?? 0) === 0 - ? this.configurationService.get('CACHE_QUOTES_TTL') - : 0 + this.configurationService.get('CACHE_QUOTES_TTL') ); await this.redisCacheService.set( @@ -101,7 +99,9 @@ export class PortfolioSnapshotProcessor { return snapshot; } catch (error) { - this.logger.error(error.message); + this.logger.error( + `Portfolio snapshot calculation of user '${job.data.userId}' has failed: ${error.message}` + ); throw new Error(error); } diff --git a/apps/client/src/app/components/access-table/access-table.component.html b/apps/client/src/app/components/access-table/access-table.component.html index fc324fb872..b8c2f8422d 100644 --- a/apps/client/src/app/components/access-table/access-table.component.html +++ b/apps/client/src/app/components/access-table/access-table.component.html @@ -45,36 +45,6 @@ - - Details - - @if (element.type === 'PUBLIC') { - - @if (user()?.settings?.isExperimentalFeatures) { -
- GET {{ baseUrl }}/api/v1/public/{{ - element.id - }}/portfolio -
- } - } @else if (element.type === 'MCP' && hasPermissionToEnableMcp) { -
- {{ baseUrl }}{{ mcpEndpoint }} -
-
- Authorization: Bearer {{ element.id }} -
- } - -
- @@ -113,14 +83,6 @@ } - @if (element.type === 'MCP' && hasPermissionToEnableMcp) { - - } @if ( (!isReceivedAccess() && user()?.settings?.isExperimentalFeatures) || element.type === 'PUBLIC' || diff --git a/apps/client/src/app/components/access-table/access-table.component.ts b/apps/client/src/app/components/access-table/access-table.component.ts index baf4247e3c..9b666b3b62 100644 --- a/apps/client/src/app/components/access-table/access-table.component.ts +++ b/apps/client/src/app/components/access-table/access-table.component.ts @@ -1,4 +1,3 @@ -import { MCP_ENDPOINT } from '@ghostfolio/common/config'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { getDateFormatString } from '@ghostfolio/common/helper'; import { Access, User } from '@ghostfolio/common/interfaces'; @@ -32,7 +31,6 @@ import { copyOutline, createOutline, ellipsisHorizontal, - linkOutline, removeCircleOutline, trashOutline } from 'ionicons/icons'; @@ -81,14 +79,7 @@ export class GfAccessTableComponent { protected readonly dataSource = new MatTableDataSource(); protected readonly displayedColumns = computed(() => { - const columns = [ - 'alias', - 'grantee', - 'type', - 'lastUsedAt', - 'expiresAt', - 'details' - ]; + const columns = ['alias', 'grantee', 'type', 'lastUsedAt', 'expiresAt']; if (this.showActions()) { columns.push('actions'); @@ -109,8 +100,6 @@ export class GfAccessTableComponent { return !this.accesses(); }); - protected readonly mcpEndpoint = MCP_ENDPOINT; - private readonly clipboard = inject(Clipboard); private readonly dataService = inject(DataService); private readonly notificationService = inject(NotificationService); @@ -121,7 +110,6 @@ export class GfAccessTableComponent { copyOutline, createOutline, ellipsisHorizontal, - linkOutline, removeCircleOutline, trashOutline }); @@ -142,18 +130,6 @@ export class GfAccessTableComponent { return `${this.baseUrl}/${languageCode}/${publicRoutes.public.path}/${aId}`; } - protected onCopyIdToClipboard(aId: string) { - this.clipboard.copy(aId); - - this.snackBar.open( - '✅ ' + $localize`Identifier has been copied to the clipboard`, - undefined, - { - duration: ms('3 seconds') - } - ); - } - protected onCopyUrlToClipboard(aId: string) { this.clipboard.copy(this.getPublicUrl(aId)); 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 518458e8a4..75186b1744 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 @@ -393,8 +393,12 @@ export class GfAccountDetailDialogComponent implements OnInit { .fetchPortfolioHoldings({ filters: [ { - type: 'ACCOUNT', - id: this.data.accountId + id: this.data.accountId, + type: 'ACCOUNT' + }, + { + id: 'ACTIVE', + type: 'HOLDING_TYPE' } ] }) 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 87389f957d..c01932b603 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 @@ -1,9 +1,5 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { - DEFAULT_COLOR_SCHEME, - DEFAULT_LOCALE, - DEFAULT_PAGE_SIZE -} from '@ghostfolio/common/config'; +import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { canDeleteAssetProfile } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, @@ -13,6 +9,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { GfActivitiesFilterComponent } from '@ghostfolio/ui/activities-filter'; import { GfFabComponent } from '@ghostfolio/ui/fab'; import { translate } from '@ghostfolio/ui/i18n'; @@ -27,7 +24,6 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, - computed, DestroyRef, inject, OnInit, @@ -36,7 +32,6 @@ import { import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { MatButtonModule } from '@angular/material/button'; import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatDialog } from '@angular/material/dialog'; import { MatMenuModule } from '@angular/material/menu'; import { MatPaginator, @@ -51,7 +46,7 @@ import { SortDirection } from '@angular/material/sort'; import { MatTableDataSource, MatTableModule } from '@angular/material/table'; -import { ActivatedRoute, Router, RouterModule } from '@angular/router'; +import { Router, RouterModule } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; import { AssetSubClass, DataSource, SymbolProfile } from '@prisma/client'; import { isUUID } from 'class-validator'; @@ -66,16 +61,11 @@ import { trashOutline } from 'ionicons/icons'; import ms from 'ms'; -import { DeviceDetectorService } from 'ngx-device-detector'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject } from 'rxjs'; import { distinctUntilChanged } from 'rxjs/operators'; import { AdminMarketDataService } from './admin-market-data.service'; -import { GfAssetProfileDialogComponent } from './asset-profile-dialog/asset-profile-dialog.component'; -import { AssetProfileDialogParams } from './asset-profile-dialog/interfaces/interfaces'; -import { GfCreateAssetProfileDialogComponent } from './create-asset-profile-dialog/create-asset-profile-dialog.component'; -import { CreateAssetProfileDialogParams } from './create-asset-profile-dialog/interfaces/interfaces'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -154,6 +144,7 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { protected readonly displayedColumns: string[] = []; protected readonly filters$ = new Subject(); protected isLoading = true; + protected readonly internalRoutes = internalRoutes; protected readonly isUUID = isUUID; protected pageSize = DEFAULT_PAGE_SIZE; protected placeholder = ''; @@ -164,9 +155,6 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { private activeFilters: Filter[] = []; private benchmarks: Partial[]; - private readonly deviceType = computed( - () => this.deviceDetectorService.deviceInfo().deviceType - ); private readonly hasPermissionForSubscription: boolean; private readonly info: InfoItem; private readonly paginator = viewChild.required(MatPaginator); @@ -176,9 +164,6 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { private readonly changeDetectorRef = inject(ChangeDetectorRef); private readonly dataService = inject(DataService); private readonly destroyRef = inject(DestroyRef); - private readonly deviceDetectorService = inject(DeviceDetectorService); - 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); @@ -213,21 +198,10 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { this.displayedColumns.push('comment'); this.displayedColumns.push('actions'); - this.route.queryParams + this.adminMarketDataService.refresh$ .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((params) => { - if ( - params['assetProfileDialog'] && - params['dataSource'] && - params['symbol'] - ) { - this.openAssetProfileDialog({ - dataSource: params['dataSource'], - symbol: params['symbol'] - }); - } else if (params['createAssetProfileDialog']) { - this.openCreateAssetProfileDialog(); - } + .subscribe(() => { + this.reloadData(); }); this.userService.stateChanged @@ -341,13 +315,12 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { dataSource, symbol }: AssetProfileIdentifier) { - this.router.navigate([], { - queryParams: { + void this.router.navigate( + internalRoutes.adminControl.subRoutes.marketData.subRoutes.update.routerLink( dataSource, - symbol, - assetProfileDialog: true - } - }); + symbol + ) + ); } private loadData( @@ -418,96 +391,6 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { ); } - private openAssetProfileDialog({ - dataSource, - symbol - }: AssetProfileIdentifier) { - this.userService - .get() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((user) => { - this.user = user; - - const dialogRef = this.dialog.open< - GfAssetProfileDialogComponent, - AssetProfileDialogParams, - AssetProfileIdentifier - >(GfAssetProfileDialogComponent, { - autoFocus: false, - data: { - dataSource, - symbol, - colorScheme: - this.user?.settings.colorScheme ?? DEFAULT_COLOR_SCHEME, - deviceType: this.deviceType(), - locale: this.user?.settings?.locale ?? DEFAULT_LOCALE - } satisfies AssetProfileDialogParams, - height: this.deviceType() === 'mobile' ? '98vh' : '80vh', - width: this.deviceType() === 'mobile' ? '100vw' : '50rem' - }); - - dialogRef - .afterClosed() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((newAssetProfileIdentifier) => { - this.reloadData(); - - if (newAssetProfileIdentifier) { - this.onOpenAssetProfileDialog(newAssetProfileIdentifier); - } else { - this.router.navigate(['.'], { relativeTo: this.route }); - } - }); - }); - } - - private openCreateAssetProfileDialog() { - this.userService - .get() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((user) => { - this.user = user; - - const dialogRef = this.dialog.open< - GfCreateAssetProfileDialogComponent, - CreateAssetProfileDialogParams - >(GfCreateAssetProfileDialogComponent, { - autoFocus: false, - data: { - deviceType: this.deviceType(), - locale: this.user?.settings?.locale ?? DEFAULT_LOCALE - } satisfies CreateAssetProfileDialogParams, - width: this.deviceType() === 'mobile' ? '100vw' : '50rem' - }); - - dialogRef - .afterClosed() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((result) => { - if (!result) { - this.router.navigate(['.'], { relativeTo: this.route }); - - return; - } - - const { addAssetProfile, dataSource, symbol } = result; - - if (addAssetProfile && dataSource && symbol) { - this.adminService - .addAssetProfile({ dataSource, symbol }) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(() => { - this.loadData(); - }); - } else { - this.loadData(); - } - - this.onOpenAssetProfileDialog({ dataSource, symbol }); - }); - }); - } - private reloadData({ pageIndex = this.paginator().pageIndex }: { pageIndex?: number } = {}) { diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.html b/apps/client/src/app/components/admin-market-data/admin-market-data.html index 729ffede3f..9a0cacb5e9 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.html +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -303,12 +303,12 @@ @@ -381,5 +381,12 @@ - + + + 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 73ea1e86fd..f86ba08a71 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 @@ -8,9 +8,15 @@ import { EMPTY, Subject, catchError, finalize, forkJoin } from 'rxjs'; @Service({ autoProvided: false }) export class AdminMarketDataService { + private readonly refreshSubject = new Subject(); + private readonly adminService = inject(AdminService); private readonly notificationService = inject(NotificationService); + public get refresh$() { + return this.refreshSubject.asObservable(); + } + public deleteAssetProfile({ dataSource, symbol }: AssetProfileIdentifier) { const assetProfileDeleted = new Subject(); @@ -72,4 +78,8 @@ export class AdminMarketDataService { return assetProfilesDeleted.asObservable(); } + + public triggerRefresh() { + this.refreshSubject.next(); + } } diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog-host/asset-profile-dialog-host.component.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog-host/asset-profile-dialog-host.component.ts new file mode 100644 index 0000000000..7b03762ff9 --- /dev/null +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog-host/asset-profile-dialog-host.component.ts @@ -0,0 +1,217 @@ +import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { + DEFAULT_COLOR_SCHEME, + DEFAULT_LOCALE +} from '@ghostfolio/common/config'; +import { AssetProfileIdentifier, User } from '@ghostfolio/common/interfaces'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; +import { AdminService } from '@ghostfolio/ui/services'; + +import { + ChangeDetectionStrategy, + Component, + computed, + DestroyRef, + inject, + OnDestroy, + OnInit +} from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { ActivatedRoute, Router } from '@angular/router'; +import { DataSource } from '@prisma/client'; +import { DeviceDetectorService } from 'ngx-device-detector'; +import { Subject } from 'rxjs'; +import { distinctUntilChanged, map, takeUntil, tap } from 'rxjs/operators'; + +import { AdminMarketDataService } from '../admin-market-data.service'; +import { GfAssetProfileDialogComponent } from '../asset-profile-dialog/asset-profile-dialog.component'; +import { AssetProfileDialogParams } from '../asset-profile-dialog/interfaces/interfaces'; +import { GfCreateAssetProfileDialogComponent } from '../create-asset-profile-dialog/create-asset-profile-dialog.component'; +import { CreateAssetProfileDialogParams } from '../create-asset-profile-dialog/interfaces/interfaces'; +import { AssetProfileDialogMode } from './types/asset-profile-dialog-mode.type'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 'gf-asset-profile-dialog-host', + template: '' +}) +export class GfAssetProfileDialogHostComponent implements OnDestroy, OnInit { + private dialogRef: MatDialogRef< + GfAssetProfileDialogComponent | GfCreateAssetProfileDialogComponent + >; + + private readonly deviceType = computed(() => { + return this.deviceDetectorService.deviceInfo().deviceType; + }); + + private readonly dialogClosed = new Subject(); + + private readonly adminMarketDataService = inject(AdminMarketDataService); + private readonly adminService = inject(AdminService); + private readonly destroyRef = inject(DestroyRef); + private readonly deviceDetectorService = inject(DeviceDetectorService); + private readonly dialog = inject(MatDialog); + private readonly route = inject(ActivatedRoute); + private readonly router = inject(Router); + private readonly userService = inject(UserService); + + public ngOnInit() { + const mode = this.route.snapshot.data.mode as AssetProfileDialogMode; + + // The router reuses this component when only the asset profile identifier + // changes, so the parameters are observed instead of read from the + // snapshot once + this.route.paramMap + .pipe( + map((paramMap) => { + return { + dataSource: paramMap.get('dataSource'), + symbol: paramMap.get('symbol') + }; + }), + distinctUntilChanged((previous, current) => { + return ( + previous.dataSource === current.dataSource && + previous.symbol === current.symbol + ); + }), + tap(() => { + this.closeDialog(); + }), + takeUntilDestroyed(this.destroyRef) + ) + .subscribe(({ dataSource, symbol }) => { + this.userService + .get() + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe((user) => { + if (mode === 'create') { + this.openCreateAssetProfileDialog({ user }); + } else if (dataSource && symbol) { + this.openAssetProfileDialog({ + symbol, + user, + dataSource: dataSource as DataSource + }); + } else { + this.navigateBack(); + } + }); + }); + } + + public ngOnDestroy() { + // The dialog lives in an overlay outside of this component, so it needs to + // be closed explicitly when leaving the route (for example via the browser + // navigation) + this.dialogRef?.close(); + + this.dialogClosed.complete(); + } + + private closeDialog() { + // Tear down the subscription of the dialog which is about to be replaced, + // so that its result is not mistaken for the user closing it + this.dialogClosed.next(); + + this.dialogRef?.close(); + } + + private navigateBack() { + void this.router.navigate( + internalRoutes.adminControl.subRoutes.marketData.routerLink + ); + } + + private navigateToAssetProfileDialog({ + dataSource, + symbol + }: AssetProfileIdentifier) { + void this.router.navigate( + internalRoutes.adminControl.subRoutes.marketData.subRoutes.update.routerLink( + dataSource, + symbol + ) + ); + } + + private openAssetProfileDialog({ + dataSource, + symbol, + user + }: AssetProfileIdentifier & { user: User }) { + const dialogRef = this.dialog.open< + GfAssetProfileDialogComponent, + AssetProfileDialogParams, + AssetProfileIdentifier + >(GfAssetProfileDialogComponent, { + autoFocus: false, + data: { + dataSource, + symbol, + colorScheme: user?.settings.colorScheme ?? DEFAULT_COLOR_SCHEME, + deviceType: this.deviceType(), + locale: user?.settings?.locale ?? DEFAULT_LOCALE + } satisfies AssetProfileDialogParams, + height: this.deviceType() === 'mobile' ? '98vh' : '80vh', + width: this.deviceType() === 'mobile' ? '100vw' : '50rem' + }); + + this.dialogRef = dialogRef; + + dialogRef + .afterClosed() + .pipe(takeUntil(this.dialogClosed), takeUntilDestroyed(this.destroyRef)) + .subscribe((newAssetProfileIdentifier) => { + this.adminMarketDataService.triggerRefresh(); + + if (newAssetProfileIdentifier) { + this.navigateToAssetProfileDialog(newAssetProfileIdentifier); + } else { + this.navigateBack(); + } + }); + } + + private openCreateAssetProfileDialog({ user }: { user: User }) { + const dialogRef = this.dialog.open< + GfCreateAssetProfileDialogComponent, + CreateAssetProfileDialogParams, + AssetProfileIdentifier & { addAssetProfile: boolean } + >(GfCreateAssetProfileDialogComponent, { + autoFocus: false, + data: { + deviceType: this.deviceType(), + locale: user?.settings?.locale ?? DEFAULT_LOCALE + } satisfies CreateAssetProfileDialogParams, + width: this.deviceType() === 'mobile' ? '100vw' : '50rem' + }); + + this.dialogRef = dialogRef; + + dialogRef + .afterClosed() + .pipe(takeUntil(this.dialogClosed), takeUntilDestroyed(this.destroyRef)) + .subscribe((result) => { + if (!result) { + this.navigateBack(); + + return; + } + + const { addAssetProfile, dataSource, symbol } = result; + + if (addAssetProfile && dataSource && symbol) { + this.adminService + .addAssetProfile({ dataSource, symbol }) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(() => { + this.navigateToAssetProfileDialog({ dataSource, symbol }); + }); + } else { + this.navigateToAssetProfileDialog({ dataSource, symbol }); + } + }); + } +} diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog-host/types/asset-profile-dialog-mode.type.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog-host/types/asset-profile-dialog-mode.type.ts new file mode 100644 index 0000000000..13460a9aef --- /dev/null +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog-host/types/asset-profile-dialog-mode.type.ts @@ -0,0 +1 @@ +export type AssetProfileDialogMode = 'create' | 'update'; 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 3b9f942a74..b2b2293e1a 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 @@ -2,6 +2,7 @@ import { AdminMarketDataService } from '@ghostfolio/client/components/admin-mark import { UserService } from '@ghostfolio/client/services/user/user.service'; import { ASSET_CLASS_MAPPING, + COMMENT_MAXIMUM_LENGTH, PROPERTY_IS_DATA_GATHERING_ENABLED } from '@ghostfolio/common/config'; import { UpdateAssetProfileDto } from '@ghostfolio/common/dtos'; @@ -229,6 +230,7 @@ export class GfAssetProfileDialogComponent implements OnInit { protected readonly canDeleteAssetProfile = canDeleteAssetProfile; protected canEditAssetProfile = true; + protected readonly COMMENT_MAXIMUM_LENGTH = COMMENT_MAXIMUM_LENGTH; protected countries: { [code: string]: { name: string; value: number }; 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 7e4a0c2f18..6e1336de09 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 @@ -467,6 +467,7 @@ cdkTextareaAutosize formControlName="comment" matInput + [maxlength]="COMMENT_MAXIMUM_LENGTH" (keyup.enter)="$event.stopPropagation()" > 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 cc999629bd..aa44b03666 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.html +++ b/apps/client/src/app/components/admin-overview/admin-overview.html @@ -187,17 +187,12 @@ - + Creation - + @if (element.createdAt) { Compare with... diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.scss b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.scss index 4dc8cf6b5a..e02c91e3db 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.scss +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.scss @@ -1,15 +1,6 @@ -@use '@angular/material' as mat; - :host { display: block; - @include mat.form-field-overrides( - ( - container-height: 2rem, - container-vertical-padding: 0.33rem - ) - ); - .chart-container { aspect-ratio: 16 / 9; 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 b8f5ac5697..d8385d70e2 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 @@ -182,8 +182,9 @@ export class GfHoldingDetailDialogComponent implements OnInit { protected quantityPrecision = 2; protected reportDataGlitchMailHref: string; protected readonly round = round; - protected readonly routerLinkAdminControlMarketData = - internalRoutes.adminControl.subRoutes.marketData.routerLink; + protected readonly routerLinkAdminControlMarketDataUpdate = + internalRoutes.adminControl.subRoutes.marketData.subRoutes.update + .routerLink; protected sectors: { [name: string]: { name: string; value: number }; }; 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 51a0783fc3..2b378a4d60 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 @@ -358,7 +358,7 @@ - @if (dataProviderInfo) { + @if (dataProviderInfo?.name) {

Manage Asset Profile([]); protected readonly hasImpersonationId = signal(false); protected readonly historicalDataItems = signal(null); + protected readonly holdings = signal( + undefined + ); protected readonly isLoadingPerformance = signal(true); protected readonly performance = signal(null); protected readonly performanceLabel = $localize`Performance`; @@ -77,13 +87,24 @@ export class GfHomeOverviewComponent implements OnInit { const user = this.user(); return user - ? !user.settings.isRestrictedView && user.settings.viewMode !== 'ZEN' + ? !user?.settings?.isRestrictedView && user?.settings?.viewMode !== 'ZEN' : false; }); + protected readonly showExperimentalHoldings = computed(() => { + const user = this.user(); + + return ( + user?.settings?.isExperimentalFeatures === true && + user?.settings?.viewMode !== 'ZEN' + ); + }); + protected readonly unit = computed(() => { + const user = this.user(); + return this.showDetails() - ? (this.user()?.settings?.baseCurrency ?? DEFAULT_CURRENCY) + ? (user?.settings?.baseCurrency ?? DEFAULT_CURRENCY) : '%'; }); @@ -94,6 +115,7 @@ export class GfHomeOverviewComponent implements OnInit { ImpersonationStorageService ); private readonly layoutService = inject(LayoutService); + private readonly router = inject(Router); private readonly userService = inject(UserService); public constructor() { @@ -122,10 +144,32 @@ export class GfHomeOverviewComponent implements OnInit { }); } + protected onHoldingClicked({ dataSource, symbol }: AssetProfileIdentifier) { + if (dataSource && symbol) { + this.router.navigate([], { + queryParams: { dataSource, symbol, holdingDetailDialog: true } + }); + } + } + private update() { this.historicalDataItems.set(null); this.isLoadingPerformance.set(true); + if (this.showExperimentalHoldings()) { + this.holdings.set(undefined); + + this.dataService + .fetchPortfolioHoldings({ + filters: [{ id: 'ACTIVE', type: 'HOLDING_TYPE' }], + range: this.user()?.settings?.dateRange + }) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(({ holdings }) => { + this.holdings.set(holdings); + }); + } + this.dataService .fetchPortfolioPerformance({ range: this.user()?.settings?.dateRange ?? DEFAULT_DATE_RANGE diff --git a/apps/client/src/app/components/home-overview/home-overview.html b/apps/client/src/app/components/home-overview/home-overview.html index 90a628a170..7648777463 100644 --- a/apps/client/src/app/components/home-overview/home-overview.html +++ b/apps/client/src/app/components/home-overview/home-overview.html @@ -1,5 +1,5 @@
@if ( !hasImpersonationId() && @@ -61,8 +61,8 @@
} @else { -
-
+
+
+
+
+ +
+
-
-
-
- -
+ @if (showExperimentalHoldings()) { +
+ + + Holdings + + + + + +
+ }
}
diff --git a/apps/client/src/app/components/home-overview/home-overview.scss b/apps/client/src/app/components/home-overview/home-overview.scss index 3a692b28d6..6d0484296f 100644 --- a/apps/client/src/app/components/home-overview/home-overview.scss +++ b/apps/client/src/app/components/home-overview/home-overview.scss @@ -30,6 +30,20 @@ } } + mat-card { + &.holdings { + --mat-card-title-text-size: var(--mat-sys-title-medium-size); + + mat-card-content { + scrollbar-width: none; + + &::-webkit-scrollbar { + display: none; + } + } + } + } + .introduction { max-width: 50rem; } 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 d3a7fb203f..b56d8d66ea 100644 --- a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts @@ -6,6 +6,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { hasScope, scopes } from '@ghostfolio/common/scopes'; import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark'; import { GfFabComponent } from '@ghostfolio/ui/fab'; @@ -23,12 +24,10 @@ import { OnInit } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { MatDialog } from '@angular/material/dialog'; -import { ActivatedRoute, Router, RouterModule } from '@angular/router'; +import { RouterModule } from '@angular/router'; import { DeviceDetectorService } from 'ngx-device-detector'; -import { GfCreateWatchlistItemDialogComponent } from './create-watchlist-item-dialog/create-watchlist-item-dialog.component'; -import { CreateWatchlistItemDialogParams } from './create-watchlist-item-dialog/interfaces/interfaces'; +import { HomeWatchlistService } from './home-watchlist.service'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -38,6 +37,7 @@ import { CreateWatchlistItemDialogParams } from './create-watchlist-item-dialog/ GfPremiumIndicatorComponent, RouterModule ], + providers: [HomeWatchlistService], schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-home-watchlist', styleUrls: ['./home-watchlist.scss'], @@ -45,6 +45,7 @@ import { CreateWatchlistItemDialogParams } from './create-watchlist-item-dialog/ }) export class GfHomeWatchlistComponent implements OnInit { protected readonly DEFAULT_LOCALE = DEFAULT_LOCALE; + protected readonly internalRoutes = internalRoutes; protected hasPermissionToCreateWatchlistItem: boolean; protected hasPermissionToDeleteWatchlistItem: boolean; @@ -59,18 +60,14 @@ export class GfHomeWatchlistComponent implements OnInit { private readonly dataService = inject(DataService); private readonly destroyRef = inject(DestroyRef); private readonly deviceDetectorService = inject(DeviceDetectorService); - private readonly dialog = inject(MatDialog); - private readonly route = inject(ActivatedRoute); - private readonly router = inject(Router); + private readonly homeWatchlistService = inject(HomeWatchlistService); private readonly userService = inject(UserService); public constructor() { - this.route.queryParams + this.homeWatchlistService.refresh$ .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((params) => { - if (params['createWatchlistItemDialog']) { - this.openCreateWatchlistItemDialog(); - } + .subscribe(() => { + this.loadWatchlistData(); }); this.userService.stateChanged @@ -130,49 +127,4 @@ export class GfHomeWatchlistComponent implements OnInit { } }); } - - private openCreateWatchlistItemDialog() { - this.userService - .get() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((user) => { - this.user = user; - - if ( - !hasPermission(user?.permissions, permissions.createWatchlistItem) || - !hasScope(user?.scopes, scopes.watchlistCreate) - ) { - this.router.navigate(['.'], { relativeTo: this.route }); - - return; - } - - const dialogRef = this.dialog.open< - GfCreateWatchlistItemDialogComponent, - CreateWatchlistItemDialogParams - >(GfCreateWatchlistItemDialogComponent, { - data: { - deviceType: this.deviceType(), - locale: this.user?.settings?.locale ?? DEFAULT_LOCALE - }, - width: this.deviceType() === 'mobile' ? '100vw' : '50rem' - }); - - dialogRef - .afterClosed() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(({ dataSource, symbol } = {}) => { - if (dataSource && symbol) { - this.dataService - .postWatchlistItem({ dataSource, symbol }) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe({ - next: () => this.loadWatchlistData() - }); - } - - this.router.navigate(['.'], { relativeTo: this.route }); - }); - }); - } } diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.html b/apps/client/src/app/components/home-watchlist/home-watchlist.html index fdd894de4e..11b2d9c2fe 100644 --- a/apps/client/src/app/components/home-watchlist/home-watchlist.html +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.html @@ -22,5 +22,11 @@
@if (hasPermissionToCreateWatchlistItem) { - + } + + diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.service.ts b/apps/client/src/app/components/home-watchlist/home-watchlist.service.ts new file mode 100644 index 0000000000..47eafe6059 --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.service.ts @@ -0,0 +1,15 @@ +import { Service } from '@angular/core'; +import { Subject } from 'rxjs'; + +@Service({ autoProvided: false }) +export class HomeWatchlistService { + private readonly refreshSubject = new Subject(); + + public get refresh$() { + return this.refreshSubject.asObservable(); + } + + public triggerRefresh() { + this.refreshSubject.next(); + } +} diff --git a/apps/client/src/app/components/home-watchlist/watchlist-dialog-host/watchlist-dialog-host.component.ts b/apps/client/src/app/components/home-watchlist/watchlist-dialog-host/watchlist-dialog-host.component.ts new file mode 100644 index 0000000000..9e1887e278 --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/watchlist-dialog-host/watchlist-dialog-host.component.ts @@ -0,0 +1,114 @@ +import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { DEFAULT_LOCALE } from '@ghostfolio/common/config'; +import { User } from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; +import { hasScope, scopes } from '@ghostfolio/common/scopes'; +import { DataService } from '@ghostfolio/ui/services'; + +import { + ChangeDetectionStrategy, + Component, + DestroyRef, + inject, + OnDestroy, + OnInit +} from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { Router } from '@angular/router'; +import { DeviceDetectorService } from 'ngx-device-detector'; + +import { GfCreateWatchlistItemDialogComponent } from '../create-watchlist-item-dialog/create-watchlist-item-dialog.component'; +import { CreateWatchlistItemDialogParams } from '../create-watchlist-item-dialog/interfaces/interfaces'; +import { HomeWatchlistService } from '../home-watchlist.service'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 'gf-watchlist-dialog-host', + template: '' +}) +export class GfWatchlistDialogHostComponent implements OnDestroy, OnInit { + private dialogRef: MatDialogRef; + + private readonly dataService = inject(DataService); + private readonly destroyRef = inject(DestroyRef); + private readonly deviceDetectorService = inject(DeviceDetectorService); + private readonly dialog = inject(MatDialog); + private readonly homeWatchlistService = inject(HomeWatchlistService); + private readonly router = inject(Router); + private readonly userService = inject(UserService); + + public ngOnInit() { + this.userService + .get() + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe((user) => { + if ( + !hasPermission(user?.permissions, permissions.createWatchlistItem) || + !hasScope(user?.scopes, scopes.watchlistCreate) + ) { + this.navigateBack(); + + return; + } + + this.openDialog(user); + }); + } + + public ngOnDestroy() { + // The dialog lives in an overlay outside of this component, so it needs to + // be closed explicitly when leaving the route (for example via the browser + // navigation) + this.dialogRef?.close(); + } + + private navigateBack() { + void this.router.navigate( + internalRoutes.home.subRoutes.watchlist.routerLink + ); + } + + private openDialog(user: User) { + const deviceType = this.deviceDetectorService.getDeviceInfo().deviceType; + + const dialogRef = this.dialog.open< + GfCreateWatchlistItemDialogComponent, + CreateWatchlistItemDialogParams + >(GfCreateWatchlistItemDialogComponent, { + data: { + deviceType, + locale: user?.settings?.locale ?? DEFAULT_LOCALE + }, + width: deviceType === 'mobile' ? '100vw' : '50rem' + }); + + this.dialogRef = dialogRef; + + dialogRef + .afterClosed() + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(({ dataSource, symbol } = {}) => { + if (!dataSource || !symbol) { + this.navigateBack(); + + return; + } + + this.dataService + .postWatchlistItem({ dataSource, symbol }) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe({ + error: () => { + this.navigateBack(); + }, + next: () => { + this.homeWatchlistService.triggerRefresh(); + + this.navigateBack(); + } + }); + }); + } +} 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 674fb76eb1..ea408c17d8 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 @@ -9,25 +9,33 @@ /> -
-
- {{ summary?.activityCount }} - {summary?.activityCount, plural, - =1 {activity} - other {activities} - } - - - + @if (isLoading) { +
+
+ +
-
+ } @else { +
+
+ {{ summary?.activityCount }} + {summary?.activityCount, plural, + =1 {activity} + other {activities} + } + + + +
+
+ }

@@ -127,11 +135,16 @@
Net Performance - (ROAI) + @if ( + user?.settings?.performanceCalculationType === + PerformanceCalculationType.ROAI + ) { + (ROAI) + }
{ this.holdings = getHoldingsForFilter(holdings); @@ -343,7 +381,7 @@ export class GfCreateOrUpdateAccessDialogComponent implements OnInit { } private async updateAccess() { - const accessId = this.data.access?.id; + const accessId = this.accessId; if (!accessId) { return; diff --git a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html index 21c0cd3a8b..31391beb0f 100644 --- a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html +++ b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -133,6 +133,18 @@ [tags]="tags" /> } + @if (showMcpDetails || showPublicDetails) { +

Details

+ @if (showMcpDetails) { +
{{ mcpConfiguration | json }}
+ } @else if (showPublicDetails) { +
+ GET {{ baseUrl }}/api/v1/public/{{ accessId }}/portfolio +
+ } + }
diff --git a/apps/client/src/app/pages/accounts/accounts-page.routes.ts b/apps/client/src/app/pages/accounts/accounts-page.routes.ts index fd58d660ca..74ebb3a775 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.routes.ts +++ b/apps/client/src/app/pages/accounts/accounts-page.routes.ts @@ -6,7 +6,8 @@ import { Routes } from '@angular/router'; import { GfAccountDialogHostComponent } from './account-dialog-host/account-dialog-host.component'; import { GfAccountsPageComponent } from './accounts-page.component'; -const { create, detail, update } = internalRoutes.accounts.subRoutes; +const { create, detail, transferCashBalance, update } = + internalRoutes.accounts.subRoutes; export const routes: Routes = [ { @@ -18,6 +19,12 @@ export const routes: Routes = [ path: create.path, title: create.title }, + { + component: GfAccountDialogHostComponent, + data: { mode: 'transferCashBalance' }, + path: transferCashBalance.path, + title: transferCashBalance.title + }, { children: [ { 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 4339f570bd..ab3854b931 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,9 @@ import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { TAG_ID_DRAFT } from '@ghostfolio/common/config'; +import { + COMMENT_MAXIMUM_LENGTH, + TAG_ID_DRAFT +} from '@ghostfolio/common/config'; import { CreateAccountDto, UpdateAccountDto } from '@ghostfolio/common/dtos'; import { getStringOrNull } from '@ghostfolio/common/helper'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; @@ -62,6 +65,8 @@ import { CreateOrUpdateAccountDialogParams } from './interfaces/interfaces'; templateUrl: 'create-or-update-account-dialog.html' }) export class GfCreateOrUpdateAccountDialogComponent { + protected readonly COMMENT_MAXIMUM_LENGTH = COMMENT_MAXIMUM_LENGTH; + protected accountForm: FormGroup; protected currencies: string[] = []; protected filteredPlatforms: Observable | undefined; 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 86a034b531..5119790c9b 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 @@ -91,6 +91,7 @@ cdkTextareaAutosize formControlName="comment" matInput + [maxlength]="COMMENT_MAXIMUM_LENGTH" (keyup.enter)="$event.stopPropagation()" > diff --git a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts index 75f6f076a6..cdfa7181c4 100644 --- a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts +++ b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts @@ -99,13 +99,13 @@ export class GfTransferBalanceDialogComponent { } protected onSubmit() { - const account: TransferBalanceDto = { + const transferBalance: TransferBalanceDto = { accountIdFrom: this.transferBalanceForm.controls.fromAccount.value ?? '', accountIdTo: this.transferBalanceForm.controls.toAccount.value ?? '', balance: Number(this.transferBalanceForm.controls.balance.value) }; - this.dialogRef.close({ account }); + this.dialogRef.close(transferBalance); } private getAccountById(aId: string | null) { diff --git a/apps/client/src/app/pages/admin/admin-page.routes.ts b/apps/client/src/app/pages/admin/admin-page.routes.ts index 30d6728ae9..8e480d3fd0 100644 --- a/apps/client/src/app/pages/admin/admin-page.routes.ts +++ b/apps/client/src/app/pages/admin/admin-page.routes.ts @@ -1,5 +1,6 @@ import { GfAdminJobsComponent } from '@ghostfolio/client/components/admin-jobs/admin-jobs.component'; import { GfAdminMarketDataComponent } from '@ghostfolio/client/components/admin-market-data/admin-market-data.component'; +import { GfAssetProfileDialogHostComponent } from '@ghostfolio/client/components/admin-market-data/asset-profile-dialog-host/asset-profile-dialog-host.component'; import { GfAdminOverviewComponent } from '@ghostfolio/client/components/admin-overview/admin-overview.component'; import { GfAdminSettingsComponent } from '@ghostfolio/client/components/admin-settings/admin-settings.component'; import { GfAdminUsersComponent } from '@ghostfolio/client/components/admin-users/admin-users.component'; @@ -10,6 +11,9 @@ import { Routes, UrlMatcher, UrlSegment } from '@angular/router'; import { AdminPageComponent } from './admin-page.component'; +const { create, update } = + internalRoutes.adminControl.subRoutes.marketData.subRoutes; + // Matches both the users list and the user detail dialog route within a single // route configuration so that the component is reused (and not re-created) when // the user detail dialog is opened or closed @@ -46,8 +50,27 @@ export const routes: Routes = [ title: internalRoutes.adminControl.subRoutes.jobs.title }, { - path: internalRoutes.adminControl.subRoutes.marketData.path, + children: [ + { + component: GfAssetProfileDialogHostComponent, + data: { mode: 'create' }, + path: create.path, + title: create.title + }, + { + children: [ + { + component: GfAssetProfileDialogHostComponent, + data: { mode: 'update' }, + path: update.path, + title: update.title + } + ], + path: ':dataSource/:symbol' + } + ], component: GfAdminMarketDataComponent, + path: internalRoutes.adminControl.subRoutes.marketData.path, title: internalRoutes.adminControl.subRoutes.marketData.title }, { 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 cc444c2b00..3e0ce7b266 100644 --- a/apps/client/src/app/pages/home/home-page.routes.ts +++ b/apps/client/src/app/pages/home/home-page.routes.ts @@ -2,6 +2,7 @@ import { GfHomeHoldingsComponent } from '@ghostfolio/client/components/home-hold 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'; +import { GfWatchlistDialogHostComponent } from '@ghostfolio/client/components/home-watchlist/watchlist-dialog-host/watchlist-dialog-host.component'; import { GfMarketsComponent } from '@ghostfolio/client/components/markets/markets.component'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; @@ -34,6 +35,14 @@ export const routes: Routes = [ title: internalRoutes.home.subRoutes.markets.title }, { + children: [ + { + component: GfWatchlistDialogHostComponent, + path: internalRoutes.home.subRoutes.watchlist.subRoutes.create.path, + title: + internalRoutes.home.subRoutes.watchlist.subRoutes.create.title + } + ], path: internalRoutes.home.subRoutes.watchlist.path, component: GfHomeWatchlistComponent, title: internalRoutes.home.subRoutes.watchlist.title 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 a5758fb2cc..3b7938c8c4 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,6 +1,10 @@ import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { ASSET_CLASS_MAPPING, DEFAULT_LOCALE } from '@ghostfolio/common/config'; +import { + ASSET_CLASS_MAPPING, + COMMENT_MAXIMUM_LENGTH, + DEFAULT_LOCALE +} from '@ghostfolio/common/config'; import { CreateOrderDto, UpdateOrderDto } from '@ghostfolio/common/dtos'; import { getDateFormatString, @@ -79,6 +83,7 @@ import { ActivityType } from './types/activity-type.type'; templateUrl: 'create-or-update-activity-dialog.html' }) export class GfCreateOrUpdateActivityDialogComponent { + protected readonly COMMENT_MAXIMUM_LENGTH = COMMENT_MAXIMUM_LENGTH; protected readonly DEFAULT_LOCALE = DEFAULT_LOCALE; protected activityForm: FormGroup; @@ -148,7 +153,9 @@ export class GfCreateOrUpdateActivityDialogComponent { this.defaultDateFormat = getDateFormatString(this.locale); this.dataService - .fetchPortfolioHoldings() + .fetchPortfolioHoldings({ + filters: [{ id: 'ACTIVE', type: 'HOLDING_TYPE' }] + }) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(({ holdings }) => { this.defaultLookupItems = holdings 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 e797db911c..f9494efdc2 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 @@ -255,6 +255,7 @@ cdkTextareaAutosize formControlName="comment" matInput + [maxlength]="COMMENT_MAXIMUM_LENGTH" (keyup.enter)="$event.stopPropagation()" > 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 48f1d5abd0..98e0c0ad82 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 @@ -144,6 +144,10 @@ export class GfImportActivitiesDialogComponent { { id: AssetClass.FIXED_INCOME, type: 'ASSET_CLASS' + }, + { + id: 'ACTIVE', + type: 'HOLDING_TYPE' } ], range: DEFAULT_DATE_RANGE diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts index 3a3c44269d..26fb711bb7 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -377,7 +377,10 @@ export class GfAnalysisPageComponent implements OnInit { this.dataService .fetchPortfolioHoldings({ - filters: this.userService.getFilters(), + filters: [ + ...this.userService.getFilters(), + { id: 'ACTIVE', type: 'HOLDING_TYPE' } + ], range: this.user?.settings?.dateRange }) .pipe(takeUntilDestroyed(this.destroyRef)) diff --git a/apps/client/src/assets/oss-friends.json b/apps/client/src/assets/oss-friends.json index da409ca2f9..2a49af6ffd 100644 --- a/apps/client/src/assets/oss-friends.json +++ b/apps/client/src/assets/oss-friends.json @@ -1,5 +1,5 @@ { - "createdAt": "2026-05-26T00:00:00.000Z", + "createdAt": "2026-09-07T00:00:00.000Z", "data": [ { "name": "Activepieces", @@ -76,11 +76,6 @@ "description": "Onyx is the open-source AI chat connected to your docs, apps, and people.", "href": "https://onyx.app" }, - { - "name": "OpenBB", - "description": "Democratizing investment research through an open source financial ecosystem. The OpenBB Terminal allows everyone to perform investment research, from everywhere.", - "href": "https://openbb.co" - }, { "name": "OpenStatus", "description": "Open-source monitoring platform with beautiful status pages", diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index a3f7eb482f..7de5ed15ff 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -26,7 +26,7 @@ libs/common/src/lib/routes/routes.ts - 306 + 332 @@ -34,7 +34,7 @@ Internacionalització libs/common/src/lib/routes/routes.ts - 149 + 175 @@ -54,7 +54,7 @@ libs/common/src/lib/routes/routes.ts - 116 + 135 @@ -115,31 +115,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 226 + 252 libs/common/src/lib/routes/routes.ts - 227 + 253 libs/common/src/lib/routes/routes.ts - 232 + 258 libs/common/src/lib/routes/routes.ts - 240 + 266 libs/common/src/lib/routes/routes.ts - 248 + 274 libs/common/src/lib/routes/routes.ts - 256 + 282 libs/common/src/lib/routes/routes.ts - 264 + 290 @@ -148,11 +148,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 238 + 264 libs/common/src/lib/routes/routes.ts - 241 + 267 @@ -161,11 +161,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 280 libs/common/src/lib/routes/routes.ts - 257 + 283 @@ -174,19 +174,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 284 + 310 libs/common/src/lib/routes/routes.ts - 285 + 311 libs/common/src/lib/routes/routes.ts - 289 + 315 libs/common/src/lib/routes/routes.ts - 295 + 321 @@ -195,11 +195,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 330 libs/common/src/lib/routes/routes.ts - 305 + 331 @@ -208,11 +208,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 309 + 335 libs/common/src/lib/routes/routes.ts - 310 + 336 @@ -221,11 +221,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 319 + 345 libs/common/src/lib/routes/routes.ts - 320 + 346 @@ -234,11 +234,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 329 + 355 libs/common/src/lib/routes/routes.ts - 330 + 356 @@ -247,31 +247,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 334 + 360 libs/common/src/lib/routes/routes.ts - 335 + 361 libs/common/src/lib/routes/routes.ts - 340 + 366 libs/common/src/lib/routes/routes.ts - 348 + 374 libs/common/src/lib/routes/routes.ts - 356 + 382 libs/common/src/lib/routes/routes.ts - 364 + 390 libs/common/src/lib/routes/routes.ts - 372 + 398 @@ -342,8 +342,8 @@ Details Detalls - apps/client/src/app/components/access-table/access-table.component.html - 49 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 137 @@ -351,7 +351,7 @@ Revocar apps/client/src/app/components/access-table/access-table.component.html - 138 + 100 @@ -375,7 +375,7 @@ Realment vol revocar aquest accés? apps/client/src/app/components/access-table/access-table.component.ts - 177 + 153 @@ -425,6 +425,10 @@ apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 113 + libs/ui/src/lib/accounts-table/accounts-table.component.html 10 @@ -475,7 +479,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 182 + 185 libs/ui/src/lib/benchmark/benchmark.component.html @@ -539,7 +543,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 329 + 332 @@ -575,15 +579,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 309 + 312 libs/ui/src/lib/activities-table/activities-table.component.html - 346 + 349 libs/ui/src/lib/holdings-table/holdings-table.component.html - 99 + 101 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -599,7 +603,7 @@ Editar apps/client/src/app/components/access-table/access-table.component.html - 104 + 74 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -619,7 +623,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 510 + 513 @@ -627,7 +631,7 @@ Suprimir apps/client/src/app/components/access-table/access-table.component.html - 135 + 97 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -639,7 +643,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 241 + 236 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -667,7 +671,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 545 + 548 libs/ui/src/lib/benchmark/benchmark.component.html @@ -679,7 +683,7 @@ Realment vol suprimir aquest compte? libs/ui/src/lib/accounts-table/accounts-table.component.ts - 183 + 185 @@ -711,11 +715,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 7 + 10 libs/ui/src/lib/activities-table/activities-table.component.html - 204 + 207 @@ -725,6 +729,10 @@ apps/client/src/app/components/admin-jobs/admin-jobs.html 52 + + libs/common/src/lib/routes/routes.ts + 76 + Historical Market Data @@ -735,7 +743,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 496 @@ -851,7 +859,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 518 + 519 @@ -891,7 +899,7 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 450 @@ -899,11 +907,11 @@ Data apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 527 + 528 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 566 + 567 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -915,7 +923,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 216 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -951,7 +959,7 @@ Punts de referència apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 118 @@ -959,7 +967,7 @@ Divises apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 133 + 123 apps/client/src/app/pages/public/public-page.html @@ -979,7 +987,7 @@ ETFs sense País apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 138 + 128 @@ -987,7 +995,7 @@ ETFs sense Sector apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 143 + 133 @@ -995,7 +1003,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 - 526 + 528 @@ -1003,7 +1011,7 @@ Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 377 + 350 @@ -1023,7 +1031,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 52 @@ -1039,7 +1047,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 476 + 477 @@ -1075,7 +1083,7 @@ Apply current market price apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 220 + 221 @@ -1111,11 +1119,11 @@ Realment vol eliminar el perfil d’aquest actiu? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 27 + 33 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 69 + 75 @@ -1139,7 +1147,7 @@ El preu de mercat actual és apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 854 + 856 @@ -1255,7 +1263,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 176 + 202 @@ -1287,7 +1295,7 @@ Configuració del Proveïdor de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 635 @@ -1331,7 +1339,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 752 + 754 @@ -1347,7 +1355,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 251 + 252 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -1355,7 +1363,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 396 + 399 @@ -1365,6 +1373,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 69 + Search @@ -1390,14 +1402,6 @@ 18 - - Copy identifier to clipboard - Copy identifier to clipboard - - apps/client/src/app/components/access-table/access-table.component.html - 120 - - Name, symbol or ISIN Nom, símbol o ISIN @@ -1503,7 +1507,7 @@ Update Account libs/common/src/lib/routes/routes.ts - 101 + 120 @@ -1523,7 +1527,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 451 @@ -1563,11 +1567,11 @@ Afegir apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 622 apps/client/src/app/components/admin-overview/admin-overview.html - 304 + 299 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1627,7 +1631,7 @@ The data of this asset profile is moved to () and this asset profile is deleted. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 959 + 961 @@ -1643,7 +1647,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 @@ -1783,11 +1787,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 728 + 730 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 731 + 733 @@ -1827,7 +1831,7 @@ libs/common/src/lib/routes/routes.ts - 202 + 228 @@ -1955,11 +1959,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 235 + 238 libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 76 @@ -1979,7 +1983,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 94 + 102 @@ -2007,7 +2011,7 @@ en Actiiu apps/client/src/app/components/home-holdings/home-holdings.component.ts - 73 + 77 @@ -2015,7 +2019,7 @@ Finalitzat apps/client/src/app/components/home-holdings/home-holdings.component.ts - 74 + 78 @@ -2023,7 +2027,7 @@ Taula apps/client/src/app/components/home-holdings/home-holdings.component.ts - 62 + 66 @@ -2031,7 +2035,7 @@ Gràfic apps/client/src/app/components/home-holdings/home-holdings.component.ts - 67 + 71 @@ -2047,7 +2051,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 533 @@ -2055,7 +2059,7 @@ Por apps/client/src/app/components/markets/markets.component.ts - 57 + 61 libs/ui/src/lib/i18n.ts @@ -2067,7 +2071,7 @@ Cobdícia apps/client/src/app/components/markets/markets.component.ts - 58 + 62 libs/ui/src/lib/i18n.ts @@ -2087,7 +2091,7 @@ An error occurred while merging this asset profile into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 942 + 944 @@ -2183,7 +2187,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 @@ -2351,7 +2355,7 @@ {VAR_PLURAL, plural, =1 {activitat} other {activitats}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 18 + 25 @@ -2359,7 +2363,7 @@ Rendiment brut absolut apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 80 + 88 @@ -2367,7 +2371,7 @@ Rendiment net absolut apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 114 + 122 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -2379,7 +2383,7 @@ Rendiment net apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 129 + 137 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -2391,7 +2395,7 @@ Actius totals apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 152 + 165 @@ -2399,7 +2403,7 @@ Poder adquisitiu apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 292 + 305 @@ -2407,7 +2411,7 @@ Exclòs de l’anàlisi apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 324 + 337 @@ -2415,7 +2419,7 @@ Passius apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 355 + 368 apps/client/src/app/pages/features/features-page.html @@ -2427,7 +2431,7 @@ Valor net apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 378 + 391 @@ -2435,7 +2439,7 @@ Rendiment anualitzat apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 393 + 406 @@ -2443,7 +2447,7 @@ Definiu l’import del vostre fons d’emergència. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 160 + 169 @@ -2595,7 +2599,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 366 + 368 @@ -2603,11 +2607,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -2615,11 +2619,11 @@ 1 any apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -2635,11 +2639,11 @@ 5 anys apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -2655,19 +2659,11 @@ Màx apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 277 + 279 libs/ui/src/lib/assistant/assistant.component.ts - 416 - - - - Identifier has been copied to the clipboard - Identifier has been copied to the clipboard - - apps/client/src/app/components/access-table/access-table.component.ts - 149 + 418 @@ -2675,7 +2671,7 @@ Vaja! No s’ha pogut concedir l’accés. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 256 + 314 @@ -2727,7 +2723,7 @@ ID d’usuari apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 116 + 113 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2759,7 +2755,7 @@ Add Account libs/common/src/lib/routes/routes.ts - 87 + 101 @@ -2839,7 +2835,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 450 + 452 @@ -2855,7 +2851,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 164 + 190 @@ -3027,7 +3023,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 214 + 227 @@ -3107,7 +3103,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 197 @@ -3127,7 +3123,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 195 @@ -3139,7 +3135,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 194 + 198 @@ -3147,7 +3143,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 245 + 247 @@ -3179,7 +3175,7 @@ libs/common/src/lib/routes/routes.ts - 270 + 296 @@ -3195,7 +3191,7 @@ libs/common/src/lib/routes/routes.ts - 235 + 261 @@ -3211,7 +3207,7 @@ libs/common/src/lib/routes/routes.ts - 243 + 269 @@ -3227,7 +3223,7 @@ libs/common/src/lib/routes/routes.ts - 259 + 285 @@ -3299,19 +3295,19 @@ libs/common/src/lib/routes/routes.ts - 104 + 123 libs/ui/src/lib/assistant/assistant.html - 84 + 85 Oops, cash balance transfer has failed. Vaja, la transferència del saldo en efectiu ha fallat. - apps/client/src/app/pages/accounts/accounts-page.component.ts - 199 + apps/client/src/app/pages/accounts/account-dialog-host/account-dialog-host.component.ts + 365 @@ -3335,7 +3331,7 @@ ID del compte apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 108 + 109 @@ -3383,7 +3379,7 @@ libs/common/src/lib/routes/routes.ts - 78 + 92 @@ -3407,7 +3403,7 @@ libs/common/src/lib/routes/routes.ts - 65 + 79 @@ -3423,7 +3419,7 @@ libs/common/src/lib/routes/routes.ts - 70 + 84 @@ -3435,7 +3431,7 @@ libs/common/src/lib/routes/routes.ts - 75 + 89 @@ -3471,11 +3467,11 @@ libs/common/src/lib/routes/routes.ts - 143 + 169 libs/common/src/lib/routes/routes.ts - 220 + 246 @@ -3587,7 +3583,7 @@ libs/common/src/lib/routes/routes.ts - 275 + 301 @@ -3595,11 +3591,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 676 + 678 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 679 + 681 @@ -3651,7 +3647,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 327 @@ -3671,7 +3667,7 @@ libs/common/src/lib/routes/routes.ts - 290 + 316 @@ -3683,7 +3679,7 @@ libs/common/src/lib/routes/routes.ts - 298 + 324 @@ -3692,11 +3688,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 293 + 319 libs/common/src/lib/routes/routes.ts - 296 + 322 @@ -3868,7 +3864,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 196 apps/client/src/app/pages/public/public-page.html @@ -3876,15 +3872,15 @@ libs/common/src/lib/routes/routes.ts - 125 + 144 libs/common/src/lib/routes/routes.ts - 217 + 243 libs/ui/src/lib/assistant/assistant.html - 110 + 111 @@ -3892,7 +3888,7 @@ This action cannot be undone. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 961 + 963 @@ -3912,7 +3908,7 @@ libs/common/src/lib/routes/routes.ts - 135 + 154 @@ -3944,15 +3940,15 @@ libs/common/src/lib/routes/routes.ts - 130 + 149 libs/common/src/lib/routes/routes.ts - 311 + 337 libs/common/src/lib/routes/routes.ts - 359 + 385 @@ -4276,7 +4272,7 @@ Do you really want to delete these activities? libs/ui/src/lib/activities-table/activities-table.component.ts - 344 + 327 @@ -4380,7 +4376,7 @@ Oops! Could not delete the asset profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 54 + 60 @@ -4452,7 +4448,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 169 + 195 @@ -4508,7 +4504,7 @@ Do you really want to merge this asset profile into it? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 965 + 967 @@ -4652,7 +4648,7 @@ libs/common/src/lib/routes/routes.ts - 179 + 205 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -4736,7 +4732,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 263 @@ -4748,11 +4744,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 31 libs/ui/src/lib/activities-table/activities-table.component.html - 432 + 435 @@ -4764,11 +4760,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 54 + 57 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -4776,7 +4772,7 @@ S’estan important dades... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 176 @@ -4784,7 +4780,7 @@ La importació s’ha completat apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 183 + 187 @@ -4800,7 +4796,7 @@ S’estan validant les dades... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 294 + 298 @@ -4876,7 +4872,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 590 + 591 @@ -4904,7 +4900,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 - 809 + 811 @@ -4920,7 +4916,7 @@ libs/common/src/lib/routes/routes.ts - 184 + 210 @@ -4936,7 +4932,7 @@ Per plataforma apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 39 + 41 @@ -4944,7 +4940,7 @@ Per Moneda apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 58 + 60 @@ -4952,7 +4948,7 @@ Per classe d’actiu apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 80 + 82 @@ -4960,7 +4956,7 @@ Per Holding apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 102 + 104 @@ -4968,7 +4964,7 @@ Per sectors apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 125 + 127 @@ -4976,7 +4972,7 @@ Per continent apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 148 + 150 @@ -4984,7 +4980,7 @@ Per Mercat apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 170 + 172 @@ -4992,7 +4988,7 @@ Regions apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 193 + 195 apps/client/src/app/pages/public/public-page.html @@ -5020,7 +5016,7 @@ Mercats desenvolupats apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 216 + 218 apps/client/src/app/pages/public/public-page.html @@ -5040,7 +5036,7 @@ Mercats emergents apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 228 apps/client/src/app/pages/public/public-page.html @@ -5052,7 +5048,7 @@ Altres Mercats apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 236 + 238 apps/client/src/app/pages/public/public-page.html @@ -5064,7 +5060,7 @@ Per País apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 261 + 263 @@ -5072,7 +5068,7 @@ Per compte apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 283 + 285 @@ -5080,7 +5076,7 @@ Pel proveïdor d’ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 303 + 305 @@ -5088,7 +5084,7 @@ Per ETF Holding apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 328 + 330 @@ -5096,7 +5092,7 @@ Aproximació basada en les participacions principals de cada ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 335 + 337 @@ -5108,7 +5104,7 @@ libs/common/src/lib/routes/routes.ts - 189 + 215 @@ -5132,7 +5128,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 479 + 492 apps/client/src/app/pages/features/features-page.html @@ -5328,7 +5324,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 347 @@ -5352,7 +5348,7 @@ Do you really want to remove this received access? apps/client/src/app/components/access-table/access-table.component.ts - 176 + 152 @@ -5376,7 +5372,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 249 + 251 @@ -5516,11 +5512,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 762 + 764 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 765 + 767 @@ -5580,7 +5576,7 @@ libs/common/src/lib/routes/routes.ts - 331 + 357 @@ -5612,7 +5608,7 @@ libs/common/src/lib/routes/routes.ts - 379 + 405 @@ -5621,11 +5617,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 370 + 396 libs/common/src/lib/routes/routes.ts - 374 + 400 @@ -5665,7 +5661,7 @@ Data gathering has been started. apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 413 + 386 @@ -5961,7 +5957,7 @@ libs/common/src/lib/routes/routes.ts - 382 + 408 @@ -6045,11 +6041,11 @@ Activitats d’exportació libs/ui/src/lib/activities-table/activities-table.component.html - 73 + 76 libs/ui/src/lib/activities-table/activities-table.component.html - 460 + 463 @@ -6057,11 +6053,11 @@ Exporta esborranys com a ICS libs/ui/src/lib/activities-table/activities-table.component.html - 87 + 90 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 476 @@ -6069,7 +6065,7 @@ Suprimeix les activitats libs/ui/src/lib/activities-table/activities-table.component.html - 111 + 114 @@ -6077,7 +6073,7 @@ Esborrany libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/i18n.ts @@ -6089,7 +6085,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 521 + 524 @@ -6097,7 +6093,7 @@ Exporta l’esborrany com a ICS libs/ui/src/lib/activities-table/activities-table.component.html - 533 + 536 @@ -6105,11 +6101,11 @@ Realment vols suprimir aquesta activitat? libs/ui/src/lib/activities-table/activities-table.component.ts - 343 + 326 libs/ui/src/lib/activities-table/activities-table.component.ts - 354 + 337 @@ -6117,7 +6113,7 @@ Setmana fins avui libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6125,11 +6121,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6137,7 +6133,7 @@ Mes fins a la data libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6145,11 +6141,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6165,7 +6161,7 @@ Any fins a la data libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -6173,7 +6169,7 @@ any apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6185,7 +6181,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -6193,11 +6189,11 @@ anys apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -6209,7 +6205,7 @@ libs/ui/src/lib/assistant/assistant.html - 140 + 141 @@ -6217,7 +6213,7 @@ Interval de dates libs/ui/src/lib/assistant/assistant.html - 170 + 171 @@ -6225,7 +6221,7 @@ Restableix els filtres libs/ui/src/lib/assistant/assistant.html - 204 + 205 @@ -6233,7 +6229,7 @@ Aplicar filtres libs/ui/src/lib/assistant/assistant.html - 217 + 218 @@ -6241,7 +6237,7 @@ Portfolio Filters apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 128 + 125 @@ -6300,6 +6296,14 @@ 286 + + Add to Watchlist + Add to Watchlist + + libs/common/src/lib/routes/routes.ts + 163 + + Market data provided by Dades de mercat proporcionades per @@ -6337,7 +6341,7 @@ This asset profile cannot be merged into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 920 + 922 @@ -6365,7 +6369,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 465 + 478 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -6393,11 +6397,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 124 + 126 libs/ui/src/lib/holdings-table/holdings-table.component.html - 125 + 127 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6417,7 +6421,7 @@ Mostra-ho tot libs/ui/src/lib/holdings-table/holdings-table.component.html - 216 + 222 @@ -6425,15 +6429,15 @@ Compte apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 102 + 109 libs/common/src/lib/routes/routes.ts - 94 + 108 libs/ui/src/lib/activities-table/activities-table.component.html - 362 + 365 libs/ui/src/lib/i18n.ts @@ -6469,7 +6473,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 266 + 268 libs/ui/src/lib/i18n.ts @@ -6501,7 +6505,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 287 libs/ui/src/lib/i18n.ts @@ -6545,15 +6549,15 @@ Fons d’emergència apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 229 + 242 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 320 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 412 + 425 apps/client/src/app/pages/features/features-page.html @@ -6625,7 +6629,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 460 + 462 @@ -6649,7 +6653,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 148 + 138 @@ -6709,7 +6713,7 @@ Export libs/ui/src/lib/activities-table/activities-table.component.html - 69 + 72 @@ -6765,7 +6769,7 @@ Comprar apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 35 + 43 libs/ui/src/lib/i18n.ts @@ -6777,11 +6781,11 @@ Comissió apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 238 + 239 libs/ui/src/lib/activities-table/activities-table.component.html - 285 + 288 libs/ui/src/lib/i18n.ts @@ -6809,7 +6813,7 @@ Vendre apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 49 + 57 libs/ui/src/lib/i18n.ts @@ -6829,7 +6833,7 @@ Efectiu apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 274 @@ -6929,7 +6933,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 66 + 74 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -6993,7 +6997,7 @@ No hi ha dades disponibles apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 247 + 249 apps/client/src/app/pages/public/public-page.html @@ -7005,11 +7009,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 462 + 464 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 476 + 478 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7121,7 +7125,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 53 + 59 @@ -7225,7 +7229,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 499 + 502 @@ -7233,7 +7237,7 @@ Do you really want to delete these asset profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 70 + 76 @@ -7241,15 +7245,15 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 844 + 846 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 921 + 923 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 943 + 945 @@ -7273,7 +7277,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 354 + 414 @@ -7313,11 +7317,11 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 143 + 152 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 117 + 118 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7325,7 +7329,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 321 + 323 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -7369,7 +7373,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 145 + 154 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7381,11 +7385,11 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 119 + 120 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 323 + 325 libs/ui/src/lib/i18n.ts @@ -7413,7 +7417,7 @@ Copy link to clipboard apps/client/src/app/components/access-table/access-table.component.html - 112 + 82 @@ -7601,7 +7605,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 107 + 110 @@ -7633,7 +7637,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 603 + 604 @@ -7693,7 +7697,7 @@ Oops! Could not find any assets. libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html - 43 + 44 @@ -7749,7 +7753,7 @@ libs/common/src/lib/routes/routes.ts - 343 + 369 @@ -7765,7 +7769,7 @@ libs/common/src/lib/routes/routes.ts - 351 + 377 @@ -7774,11 +7778,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 346 + 372 libs/common/src/lib/routes/routes.ts - 349 + 375 @@ -7787,11 +7791,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 338 + 364 libs/common/src/lib/routes/routes.ts - 341 + 367 @@ -7831,7 +7835,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 148 + 151 @@ -7951,7 +7955,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 158 + 167 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7959,15 +7963,15 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 158 + 167 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 128 + 129 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 332 + 334 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -8015,7 +8019,7 @@ Please enter your Ghostfolio API key. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 167 + 170 @@ -8039,7 +8043,7 @@ Link has been copied to the clipboard apps/client/src/app/components/access-table/access-table.component.ts - 161 + 137 @@ -8047,7 +8051,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8055,7 +8059,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8063,7 +8067,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 644 + 645 @@ -8079,7 +8083,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 - 529 + 531 @@ -8095,7 +8099,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 657 + 658 @@ -8103,7 +8107,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8111,7 +8115,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8135,7 +8139,7 @@ Change libs/ui/src/lib/holdings-table/holdings-table.component.html - 146 + 148 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8171,11 +8175,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 168 + 170 libs/ui/src/lib/holdings-table/holdings-table.component.html - 169 + 171 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8239,7 +8243,7 @@ Additional requests are granted while you are setting up your instance apps/client/src/app/components/admin-settings/admin-settings.component.ts - 87 + 88 @@ -8308,11 +8312,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 262 + 288 libs/common/src/lib/routes/routes.ts - 265 + 291 @@ -8324,7 +8328,7 @@ libs/common/src/lib/routes/routes.ts - 267 + 293 @@ -8340,7 +8344,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 963 + 965 @@ -8348,7 +8352,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 807 + 809 @@ -8436,7 +8440,7 @@ libs/common/src/lib/routes/routes.ts - 140 + 166 @@ -8452,11 +8456,11 @@ {VAR_PLURAL, plural, =1 {Activity} other {Activities}} libs/ui/src/lib/activities-table/activities-table.component.html - 70 + 73 libs/ui/src/lib/activities-table/activities-table.component.html - 108 + 111 @@ -8481,11 +8485,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 230 + 256 libs/common/src/lib/routes/routes.ts - 233 + 259 @@ -8605,7 +8609,7 @@ Quick Links libs/ui/src/lib/assistant/assistant.html - 58 + 59 @@ -8621,7 +8625,7 @@ libs/common/src/lib/routes/routes.ts - 281 + 307 @@ -8629,7 +8633,7 @@ Open Source Alternative to libs/common/src/lib/routes/routes.ts - 376 + 402 @@ -8662,15 +8666,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 362 + 388 libs/common/src/lib/routes/routes.ts - 365 + 391 libs/common/src/lib/routes/routes.ts - 373 + 399 @@ -8679,11 +8683,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 354 + 380 libs/common/src/lib/routes/routes.ts - 357 + 383 @@ -8763,7 +8767,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 @@ -8908,11 +8912,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 386 + 412 libs/common/src/lib/routes/routes.ts - 387 + 413 @@ -8944,7 +8948,7 @@ Stocks apps/client/src/app/components/markets/markets.component.ts - 53 + 57 apps/client/src/app/pages/features/features-page.html @@ -8956,7 +8960,7 @@ Cryptocurrencies apps/client/src/app/components/markets/markets.component.ts - 54 + 58 apps/client/src/app/pages/features/features-page.html @@ -9084,7 +9088,7 @@ No results found... libs/ui/src/lib/assistant/assistant.html - 51 + 52 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 1a2a3ff382..c46ea477e3 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -66,19 +66,19 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 7 + 10 libs/ui/src/lib/activities-table/activities-table.component.html - 204 + 207 Details Details - apps/client/src/app/components/access-table/access-table.component.html - 49 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 137 @@ -86,7 +86,7 @@ Widerrufen apps/client/src/app/components/access-table/access-table.component.html - 138 + 100 @@ -110,7 +110,7 @@ Möchtest du diese Zugangsberechtigung wirklich widerrufen? apps/client/src/app/components/access-table/access-table.component.ts - 177 + 153 @@ -158,7 +158,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 182 + 185 libs/ui/src/lib/benchmark/benchmark.component.html @@ -218,15 +218,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 309 + 312 libs/ui/src/lib/activities-table/activities-table.component.html - 346 + 349 libs/ui/src/lib/holdings-table/holdings-table.component.html - 99 + 101 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -242,7 +242,7 @@ Bearbeiten apps/client/src/app/components/access-table/access-table.component.html - 104 + 74 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -262,7 +262,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 510 + 513 @@ -270,7 +270,7 @@ Löschen apps/client/src/app/components/access-table/access-table.component.html - 135 + 97 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -282,7 +282,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 241 + 236 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -310,7 +310,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 545 + 548 libs/ui/src/lib/benchmark/benchmark.component.html @@ -322,7 +322,7 @@ Möchtest du dieses Konto wirklich löschen? libs/ui/src/lib/accounts-table/accounts-table.component.ts - 183 + 185 @@ -434,7 +434,7 @@ libs/ui/src/lib/assistant/assistant.html - 140 + 141 @@ -446,7 +446,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 496 @@ -462,7 +462,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 518 + 519 @@ -494,7 +494,7 @@ Finde ein Konto... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 450 @@ -502,11 +502,11 @@ Datum apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 527 + 528 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 566 + 567 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -518,7 +518,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 216 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -566,7 +566,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 52 @@ -686,7 +686,7 @@ Konto bearbeiten libs/common/src/lib/routes/routes.ts - 101 + 120 @@ -702,11 +702,11 @@ Hinzufügen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 622 apps/client/src/app/components/admin-overview/admin-overview.html - 304 + 299 libs/ui/src/lib/account-balances/account-balances.component.html @@ -862,7 +862,7 @@ libs/common/src/lib/routes/routes.ts - 116 + 135 @@ -894,7 +894,7 @@ Split-Verhältnis apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 533 @@ -910,7 +910,7 @@ Beim Zusammenführen dieses Anlageprofils mit () ist ein Fehler aufgetreten. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 942 + 944 @@ -1034,7 +1034,7 @@ Absolute Brutto Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 80 + 88 @@ -1042,7 +1042,7 @@ Absolute Netto Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 114 + 122 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1054,7 +1054,7 @@ Netto Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 129 + 137 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1066,7 +1066,7 @@ Gesamtanlagevermögen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 152 + 165 @@ -1074,7 +1074,7 @@ Kaufkraft apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 292 + 305 @@ -1082,7 +1082,7 @@ Gesamtvermögen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 378 + 391 @@ -1090,7 +1090,7 @@ Performance pro Jahr apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 393 + 406 @@ -1098,7 +1098,7 @@ Bitte setze den Betrag deines Notfallfonds. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 160 + 169 @@ -1170,11 +1170,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 124 + 126 libs/ui/src/lib/holdings-table/holdings-table.component.html - 125 + 127 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -1194,7 +1194,7 @@ Alle anzeigen libs/ui/src/lib/holdings-table/holdings-table.component.html - 216 + 222 @@ -1206,7 +1206,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 366 + 368 @@ -1214,11 +1214,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -1226,11 +1226,11 @@ 1J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -1246,11 +1246,11 @@ 5J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -1266,19 +1266,11 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 277 + 279 libs/ui/src/lib/assistant/assistant.component.ts - 416 - - - - Identifier has been copied to the clipboard - Identifizierungszeichen wurde in die Zwischenablage kopiert - - apps/client/src/app/components/access-table/access-table.component.ts - 149 + 418 @@ -1290,7 +1282,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 194 + 198 @@ -1314,7 +1306,7 @@ libs/common/src/lib/routes/routes.ts - 270 + 296 @@ -1330,7 +1322,7 @@ libs/common/src/lib/routes/routes.ts - 259 + 285 @@ -1358,7 +1350,7 @@ Konto hinzufügen libs/common/src/lib/routes/routes.ts - 87 + 101 @@ -1498,7 +1490,7 @@ Benutzer ID apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 116 + 113 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1590,11 +1582,11 @@ libs/common/src/lib/routes/routes.ts - 104 + 123 libs/ui/src/lib/assistant/assistant.html - 84 + 85 @@ -1650,7 +1642,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 329 + 332 @@ -1690,7 +1682,7 @@ Konto ID apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 108 + 109 @@ -1714,7 +1706,7 @@ libs/common/src/lib/routes/routes.ts - 78 + 92 @@ -1826,7 +1818,7 @@ libs/common/src/lib/routes/routes.ts - 275 + 301 @@ -1870,7 +1862,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 327 @@ -1898,7 +1890,7 @@ libs/common/src/lib/routes/routes.ts - 306 + 332 @@ -1934,11 +1926,11 @@ libs/common/src/lib/routes/routes.ts - 143 + 169 libs/common/src/lib/routes/routes.ts - 220 + 246 @@ -1970,15 +1962,15 @@ libs/common/src/lib/routes/routes.ts - 130 + 149 libs/common/src/lib/routes/routes.ts - 311 + 337 libs/common/src/lib/routes/routes.ts - 359 + 385 @@ -1994,7 +1986,7 @@ libs/common/src/lib/routes/routes.ts - 184 + 210 @@ -2002,7 +1994,7 @@ Nach Konto apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 283 + 285 @@ -2010,7 +2002,7 @@ Nach Währung apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 58 + 60 @@ -2018,7 +2010,7 @@ Nach Anlageklasse apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 80 + 82 @@ -2026,7 +2018,7 @@ Nach Position apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 102 + 104 @@ -2034,7 +2026,7 @@ Nach Sektor apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 125 + 127 @@ -2042,7 +2034,7 @@ Nach Kontinent apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 148 + 150 @@ -2050,7 +2042,7 @@ Nach Land apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 261 + 263 @@ -2058,7 +2050,7 @@ Regionen apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 193 + 195 apps/client/src/app/pages/public/public-page.html @@ -2082,7 +2074,7 @@ libs/common/src/lib/routes/routes.ts - 189 + 215 @@ -2138,7 +2130,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 196 apps/client/src/app/pages/public/public-page.html @@ -2146,15 +2138,15 @@ libs/common/src/lib/routes/routes.ts - 125 + 144 libs/common/src/lib/routes/routes.ts - 217 + 243 libs/ui/src/lib/assistant/assistant.html - 110 + 111 @@ -2170,7 +2162,7 @@ Aktuelle Woche apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 @@ -2190,7 +2182,7 @@ Verkauf apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 49 + 57 libs/ui/src/lib/i18n.ts @@ -2205,14 +2197,6 @@ 5 - - Copy identifier to clipboard - Identifizierungszeichen in die Zwischenablage kopieren - - apps/client/src/app/components/access-table/access-table.component.html - 120 - - Name, symbol or ISIN Name, Symbol oder ISIN @@ -2258,11 +2242,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 235 + 238 libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 76 @@ -2274,7 +2258,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 263 @@ -2290,7 +2274,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 251 + 252 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2298,7 +2282,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 396 + 399 @@ -2346,7 +2330,7 @@ libs/common/src/lib/routes/routes.ts - 179 + 205 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2358,7 +2342,7 @@ Daten importieren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 176 @@ -2366,7 +2350,7 @@ Der Import wurde abgeschlossen apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 183 + 187 @@ -2406,7 +2390,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 347 @@ -2430,7 +2414,7 @@ libs/common/src/lib/routes/routes.ts - 202 + 228 @@ -2466,7 +2450,7 @@ libs/common/src/lib/routes/routes.ts - 331 + 357 @@ -2510,7 +2494,7 @@ libs/common/src/lib/routes/routes.ts - 382 + 408 @@ -2542,7 +2526,7 @@ Geplant libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/i18n.ts @@ -2558,11 +2542,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 31 libs/ui/src/lib/activities-table/activities-table.component.html - 432 + 435 @@ -2570,11 +2554,11 @@ Aktivitäten exportieren libs/ui/src/lib/activities-table/activities-table.component.html - 73 + 76 libs/ui/src/lib/activities-table/activities-table.component.html - 460 + 463 @@ -2582,11 +2566,11 @@ Geplante Aktivitäten als ICS exportieren libs/ui/src/lib/activities-table/activities-table.component.html - 87 + 90 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 476 @@ -2594,7 +2578,7 @@ Kopieren libs/ui/src/lib/activities-table/activities-table.component.html - 521 + 524 @@ -2602,7 +2586,7 @@ Geplante Aktivität als ICS exportieren libs/ui/src/lib/activities-table/activities-table.component.html - 533 + 536 @@ -2610,11 +2594,11 @@ Möchtest du diese Aktivität wirklich löschen? libs/ui/src/lib/activities-table/activities-table.component.ts - 343 + 326 libs/ui/src/lib/activities-table/activities-table.component.ts - 354 + 337 @@ -2694,7 +2678,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 197 @@ -2706,7 +2690,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 195 @@ -2778,7 +2762,7 @@ Entwickelte Länder apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 216 + 218 apps/client/src/app/pages/public/public-page.html @@ -2798,7 +2782,7 @@ Schwellenländer apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 228 apps/client/src/app/pages/public/public-page.html @@ -2810,7 +2794,7 @@ Übrige Länder apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 236 + 238 apps/client/src/app/pages/public/public-page.html @@ -2850,7 +2834,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 465 + 478 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2890,7 +2874,7 @@ Aktuellen Marktpreis übernehmen apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 220 + 221 @@ -2906,7 +2890,7 @@ Angst apps/client/src/app/components/markets/markets.component.ts - 57 + 61 libs/ui/src/lib/i18n.ts @@ -2918,7 +2902,7 @@ Gier apps/client/src/app/components/markets/markets.component.ts - 58 + 62 libs/ui/src/lib/i18n.ts @@ -2930,7 +2914,7 @@ Filtern nach... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 377 + 350 @@ -2966,11 +2950,11 @@ Das Formular konnte nicht validiert werden apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 728 + 730 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 731 + 733 @@ -3006,7 +2990,7 @@ Von der Analyse ausgenommen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 324 + 337 @@ -3102,15 +3086,15 @@ Konto apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 102 + 109 libs/common/src/lib/routes/routes.ts - 94 + 108 libs/ui/src/lib/activities-table/activities-table.component.html - 362 + 365 libs/ui/src/lib/i18n.ts @@ -3138,7 +3122,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 266 + 268 libs/ui/src/lib/i18n.ts @@ -3182,7 +3166,7 @@ exportieren libs/ui/src/lib/activities-table/activities-table.component.html - 69 + 72 @@ -3202,7 +3186,7 @@ Bargeld apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 274 @@ -3234,15 +3218,15 @@ Notfallfonds apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 229 + 242 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 320 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 412 + 425 apps/client/src/app/pages/features/features-page.html @@ -3266,7 +3250,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 460 + 462 @@ -3274,7 +3258,7 @@ Keine Daten verfügbar apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 247 + 249 apps/client/src/app/pages/public/public-page.html @@ -3286,11 +3270,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 462 + 464 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 476 + 478 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3370,7 +3354,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 66 + 74 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -3418,7 +3402,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 - 809 + 811 @@ -3434,7 +3418,7 @@ Häufigkeit der Datensynchronisierung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 476 + 477 @@ -3490,7 +3474,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 479 + 492 apps/client/src/app/pages/features/features-page.html @@ -3530,7 +3514,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 287 libs/ui/src/lib/i18n.ts @@ -3550,7 +3534,7 @@ Daten validieren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 294 + 298 @@ -3578,7 +3562,7 @@ libs/common/src/lib/routes/routes.ts - 65 + 79 @@ -3590,7 +3574,7 @@ libs/common/src/lib/routes/routes.ts - 75 + 89 @@ -3598,7 +3582,7 @@ Diese Aktion kann nicht rückgängig gemacht werden. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 961 + 963 @@ -3618,7 +3602,7 @@ libs/common/src/lib/routes/routes.ts - 135 + 154 @@ -3658,11 +3642,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 54 + 57 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -3714,7 +3698,7 @@ Keine Aktivitäten apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 148 + 138 @@ -3762,7 +3746,7 @@ Investitionen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 214 + 227 @@ -3906,7 +3890,7 @@ Stündlich apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 249 + 251 @@ -4018,11 +4002,11 @@ Das Anlageprofil konnte nicht gespeichert werden apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 762 + 764 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 765 + 767 @@ -4042,7 +4026,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 94 + 102 @@ -4117,6 +4101,14 @@ 18 + + Add to Watchlist + Zur Beobachtungsliste hinzufügen + + libs/common/src/lib/routes/routes.ts + 163 + + Market data provided by Marktdaten bereitgestellt von @@ -4138,7 +4130,7 @@ Dieses Anlageprofil kann nicht mit () zusammengeführt werden. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 920 + 922 @@ -4198,7 +4190,7 @@ Möchtest du diese erhaltene Zugangsberechtigung wirklich entfernen? apps/client/src/app/components/access-table/access-table.component.ts - 176 + 152 @@ -4214,7 +4206,7 @@ Nach ETF-Anbieter apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 303 + 305 @@ -4238,7 +4230,7 @@ Die Daten dieses Anlageprofils werden nach () verschoben und dieses Anlageprofil wird gelöscht. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 959 + 961 @@ -4254,7 +4246,7 @@ Aktuelles Jahr apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 @@ -4306,7 +4298,7 @@ Das Anlageprofil wurde gespeichert apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 752 + 754 @@ -4338,7 +4330,7 @@ Nach Plattform apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 39 + 41 @@ -4378,7 +4370,7 @@ libs/common/src/lib/routes/routes.ts - 70 + 84 @@ -4434,7 +4426,7 @@ Anteile nachher apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 590 + 591 @@ -4518,7 +4510,7 @@ Verbindlichkeiten apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 355 + 368 apps/client/src/app/pages/features/features-page.html @@ -4538,7 +4530,7 @@ libs/common/src/lib/routes/routes.ts - 235 + 261 @@ -4554,7 +4546,7 @@ libs/common/src/lib/routes/routes.ts - 243 + 269 @@ -4674,7 +4666,7 @@ Aktivität bearbeiten libs/common/src/lib/routes/routes.ts - 176 + 202 @@ -4706,7 +4698,7 @@ Scraper Konfiguration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 635 @@ -4716,6 +4708,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 69 + Personal Finance Tools @@ -4726,7 +4722,7 @@ libs/common/src/lib/routes/routes.ts - 379 + 405 @@ -4954,7 +4950,7 @@ Kauf apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 35 + 43 libs/ui/src/lib/i18n.ts @@ -4982,7 +4978,7 @@ ETFs ohne Länder apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 138 + 128 @@ -4990,7 +4986,7 @@ ETFs ohne Sektoren apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 143 + 133 @@ -4998,7 +4994,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 - 526 + 528 @@ -5022,7 +5018,7 @@ Nach Markt apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 170 + 172 @@ -5218,7 +5214,7 @@ Währungen apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 133 + 123 apps/client/src/app/pages/public/public-page.html @@ -5270,11 +5266,11 @@ Die Scraper Konfiguration konnte nicht geparsed werden apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 676 + 678 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 679 + 681 @@ -5414,7 +5410,7 @@ Möchtest du diese Aktivitäten wirklich löschen? libs/ui/src/lib/activities-table/activities-table.component.ts - 344 + 327 @@ -5518,7 +5514,7 @@ Ups! Die Anlageprofile konnten nicht gelöscht werden. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 54 + 60 @@ -5574,7 +5570,7 @@ Aktivität hinzufügen libs/common/src/lib/routes/routes.ts - 169 + 195 @@ -5623,19 +5619,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 284 + 310 libs/common/src/lib/routes/routes.ts - 285 + 311 libs/common/src/lib/routes/routes.ts - 289 + 315 libs/common/src/lib/routes/routes.ts - 295 + 321 @@ -5644,11 +5640,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 330 libs/common/src/lib/routes/routes.ts - 305 + 331 @@ -5657,31 +5653,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 226 + 252 libs/common/src/lib/routes/routes.ts - 227 + 253 libs/common/src/lib/routes/routes.ts - 232 + 258 libs/common/src/lib/routes/routes.ts - 240 + 266 libs/common/src/lib/routes/routes.ts - 248 + 274 libs/common/src/lib/routes/routes.ts - 256 + 282 libs/common/src/lib/routes/routes.ts - 264 + 290 @@ -5690,11 +5686,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 280 libs/common/src/lib/routes/routes.ts - 257 + 283 @@ -5703,11 +5699,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 238 + 264 libs/common/src/lib/routes/routes.ts - 241 + 267 @@ -5716,11 +5712,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 309 + 335 libs/common/src/lib/routes/routes.ts - 310 + 336 @@ -5729,11 +5725,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 319 + 345 libs/common/src/lib/routes/routes.ts - 320 + 346 @@ -5742,11 +5738,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 329 + 355 libs/common/src/lib/routes/routes.ts - 330 + 356 @@ -5755,31 +5751,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 334 + 360 libs/common/src/lib/routes/routes.ts - 335 + 361 libs/common/src/lib/routes/routes.ts - 340 + 366 libs/common/src/lib/routes/routes.ts - 348 + 374 libs/common/src/lib/routes/routes.ts - 356 + 382 libs/common/src/lib/routes/routes.ts - 364 + 390 libs/common/src/lib/routes/routes.ts - 372 + 398 @@ -5852,11 +5848,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 370 + 396 libs/common/src/lib/routes/routes.ts - 374 + 400 @@ -5888,7 +5884,7 @@ Finanzmarktdaten synchronisieren wurde gestartet. apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 413 + 386 @@ -5924,7 +5920,7 @@ Möchtest du dieses Anlageprofil wirklich damit zusammenführen? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 965 + 967 @@ -6008,11 +6004,11 @@ Gebühr apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 238 + 239 libs/ui/src/lib/activities-table/activities-table.component.html - 285 + 288 libs/ui/src/lib/i18n.ts @@ -6066,6 +6062,10 @@ apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 113 + libs/ui/src/lib/accounts-table/accounts-table.component.html 10 @@ -6142,17 +6142,21 @@ apps/client/src/app/components/admin-jobs/admin-jobs.html 52 + + libs/common/src/lib/routes/routes.ts + 76 + Do you really want to delete this asset profile? Möchtest du dieses Anlageprofil wirklich löschen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 27 + 33 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 69 + 75 @@ -6359,8 +6363,8 @@ Oops, cash balance transfer has failed. Ups, der Cash-Bestand Transfer ist fehlgeschlagen. - apps/client/src/app/pages/accounts/accounts-page.component.ts - 199 + apps/client/src/app/pages/accounts/account-dialog-host/account-dialog-host.component.ts + 365 @@ -6416,7 +6420,7 @@ Portfolio Filter apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 128 + 125 @@ -6476,7 +6480,7 @@ Der aktuelle Marktpreis ist apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 854 + 856 @@ -6492,7 +6496,7 @@ Zeitraum libs/ui/src/lib/assistant/assistant.html - 170 + 171 @@ -6520,7 +6524,7 @@ Ups! Der Zugang konnte nicht gewährt werden. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 256 + 314 @@ -6616,7 +6620,7 @@ Seit Wochenbeginn libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6624,11 +6628,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6636,7 +6640,7 @@ Seit Monatsbeginn libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6644,11 +6648,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6664,7 +6668,7 @@ Seit Jahresbeginn libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -6696,7 +6700,7 @@ Filter zurücksetzen libs/ui/src/lib/assistant/assistant.html - 204 + 205 @@ -6704,7 +6708,7 @@ Jahr apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6716,7 +6720,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -6724,11 +6728,11 @@ Jahre apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -6736,7 +6740,7 @@ Filter anwenden libs/ui/src/lib/assistant/assistant.html - 217 + 218 @@ -6756,7 +6760,7 @@ Finde eine Position... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 451 @@ -6776,7 +6780,7 @@ libs/common/src/lib/routes/routes.ts - 290 + 316 @@ -6788,7 +6792,7 @@ libs/common/src/lib/routes/routes.ts - 298 + 324 @@ -6797,11 +6801,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 293 + 319 libs/common/src/lib/routes/routes.ts - 296 + 322 @@ -6809,7 +6813,7 @@ Täglich apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 245 + 247 @@ -6833,7 +6837,7 @@ Aktiv apps/client/src/app/components/home-holdings/home-holdings.component.ts - 73 + 77 @@ -6841,7 +6845,7 @@ Abgeschlossen apps/client/src/app/components/home-holdings/home-holdings.component.ts - 74 + 78 @@ -6893,7 +6897,7 @@ {VAR_PLURAL, plural, =1 {Aktivität} other {Aktivitäten}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 18 + 25 @@ -6909,7 +6913,7 @@ Aktivitäten löschen libs/ui/src/lib/activities-table/activities-table.component.html - 111 + 114 @@ -6917,7 +6921,7 @@ Internationalisierung libs/common/src/lib/routes/routes.ts - 149 + 175 @@ -6933,7 +6937,7 @@ Springe zu einer Seite... libs/ui/src/lib/assistant/assistant.component.ts - 450 + 452 @@ -6957,7 +6961,7 @@ Nach ETF Position apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 328 + 330 @@ -6965,7 +6969,7 @@ Annäherung auf Basis der grössten Positionen pro ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 335 + 337 @@ -6981,7 +6985,7 @@ Aktivität kopieren libs/common/src/lib/routes/routes.ts - 164 + 190 @@ -7021,7 +7025,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 118 @@ -7029,7 +7033,7 @@ Tabelle apps/client/src/app/components/home-holdings/home-holdings.component.ts - 62 + 66 @@ -7037,7 +7041,7 @@ Diagramm apps/client/src/app/components/home-holdings/home-holdings.component.ts - 67 + 71 @@ -7145,7 +7149,7 @@ Ups! Das Anlageprofil konnte nicht gelöscht werden. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 53 + 59 @@ -7249,7 +7253,7 @@ Position ansehen libs/ui/src/lib/activities-table/activities-table.component.html - 499 + 502 @@ -7257,7 +7261,7 @@ Möchtest du diese Anlageprofile wirklich löschen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 70 + 76 @@ -7265,15 +7269,15 @@ Fehler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 844 + 846 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 921 + 923 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 943 + 945 @@ -7297,7 +7301,7 @@ Ups! Der Zugang konnte nicht bearbeitet werden. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 354 + 414 @@ -7337,11 +7341,11 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 143 + 152 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 117 + 118 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7349,7 +7353,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 321 + 323 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -7393,7 +7397,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 145 + 154 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7405,11 +7409,11 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 119 + 120 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 323 + 325 libs/ui/src/lib/i18n.ts @@ -7437,7 +7441,7 @@ Link in die Zwischenablage kopieren apps/client/src/app/components/access-table/access-table.component.html - 112 + 82 @@ -7625,7 +7629,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 107 + 110 @@ -7657,7 +7661,7 @@ Anteile vorher apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 603 + 604 @@ -7717,7 +7721,7 @@ Ups! Es konnten leider keine Assets gefunden werden. libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html - 43 + 44 @@ -7773,7 +7777,7 @@ libs/common/src/lib/routes/routes.ts - 343 + 369 @@ -7789,7 +7793,7 @@ libs/common/src/lib/routes/routes.ts - 351 + 377 @@ -7798,11 +7802,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 346 + 372 libs/common/src/lib/routes/routes.ts - 349 + 375 @@ -7811,11 +7815,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 338 + 364 libs/common/src/lib/routes/routes.ts - 341 + 367 @@ -7855,7 +7859,7 @@ Möchtest du den API-Schlüssel wirklich löschen? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 148 + 151 @@ -7975,7 +7979,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 158 + 167 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7983,15 +7987,15 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 158 + 167 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 128 + 129 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 332 + 334 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -8039,7 +8043,7 @@ Bitte gebe deinen Ghostfolio API-Schlüssel ein. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 167 + 170 @@ -8063,7 +8067,7 @@ Link wurde in die Zwischenablage kopiert apps/client/src/app/components/access-table/access-table.component.ts - 161 + 137 @@ -8071,7 +8075,7 @@ Verzögert apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8079,7 +8083,7 @@ Sofort apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8087,7 +8091,7 @@ Standardmarktpreis apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 644 + 645 @@ -8103,7 +8107,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 - 529 + 531 @@ -8119,7 +8123,7 @@ HTTP Request-Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 657 + 658 @@ -8127,7 +8131,7 @@ Tagesende apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8135,7 +8139,7 @@ in Echtzeit apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8159,7 +8163,7 @@ Änderung libs/ui/src/lib/holdings-table/holdings-table.component.html - 146 + 148 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8195,11 +8199,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 168 + 170 libs/ui/src/lib/holdings-table/holdings-table.component.html - 169 + 171 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8263,7 +8267,7 @@ Während du deine Instanz einrichtest, stehen dir zusätzliche Anfragen zur Verfügung. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 87 + 88 @@ -8332,11 +8336,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 262 + 288 libs/common/src/lib/routes/routes.ts - 265 + 291 @@ -8348,7 +8352,7 @@ libs/common/src/lib/routes/routes.ts - 267 + 293 @@ -8364,7 +8368,7 @@ () wird bereits verwendet. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 963 + 965 @@ -8372,7 +8376,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 - 807 + 809 @@ -8436,7 +8440,7 @@ libs/common/src/lib/routes/routes.ts - 140 + 166 @@ -8452,11 +8456,11 @@ {VAR_PLURAL, plural, =1 {Aktivität} other {Aktivitäten}} libs/ui/src/lib/activities-table/activities-table.component.html - 70 + 73 libs/ui/src/lib/activities-table/activities-table.component.html - 108 + 111 @@ -8481,11 +8485,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 230 + 256 libs/common/src/lib/routes/routes.ts - 233 + 259 @@ -8605,7 +8609,7 @@ Schnellzugriff libs/ui/src/lib/assistant/assistant.html - 58 + 59 @@ -8621,7 +8625,7 @@ libs/common/src/lib/routes/routes.ts - 281 + 307 @@ -8629,7 +8633,7 @@ Open Source Alternative zu libs/common/src/lib/routes/routes.ts - 376 + 402 @@ -8662,15 +8666,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 362 + 388 libs/common/src/lib/routes/routes.ts - 365 + 391 libs/common/src/lib/routes/routes.ts - 373 + 399 @@ -8679,11 +8683,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 354 + 380 libs/common/src/lib/routes/routes.ts - 357 + 383 @@ -8763,7 +8767,7 @@ Aktueller Monat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 @@ -8908,11 +8912,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 386 + 412 libs/common/src/lib/routes/routes.ts - 387 + 413 @@ -8944,7 +8948,7 @@ Aktien apps/client/src/app/components/markets/markets.component.ts - 53 + 57 apps/client/src/app/pages/features/features-page.html @@ -8956,7 +8960,7 @@ Kryptowährungen apps/client/src/app/components/markets/markets.component.ts - 54 + 58 apps/client/src/app/pages/features/features-page.html @@ -9084,7 +9088,7 @@ Keine Ergebnisse gefunden... libs/ui/src/lib/assistant/assistant.html - 51 + 52 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 80b316bfc2..bda5678c05 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -67,19 +67,19 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 7 + 10 libs/ui/src/lib/activities-table/activities-table.component.html - 204 + 207 Details Detalles - apps/client/src/app/components/access-table/access-table.component.html - 49 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 137 @@ -87,7 +87,7 @@ Revocar apps/client/src/app/components/access-table/access-table.component.html - 138 + 100 @@ -111,7 +111,7 @@ ¿Seguro que quieres revocar el acceso concedido? apps/client/src/app/components/access-table/access-table.component.ts - 177 + 153 @@ -159,7 +159,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 182 + 185 libs/ui/src/lib/benchmark/benchmark.component.html @@ -219,15 +219,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 309 + 312 libs/ui/src/lib/activities-table/activities-table.component.html - 346 + 349 libs/ui/src/lib/holdings-table/holdings-table.component.html - 99 + 101 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -243,7 +243,7 @@ Editar apps/client/src/app/components/access-table/access-table.component.html - 104 + 74 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -263,7 +263,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 510 + 513 @@ -271,7 +271,7 @@ Eliminar apps/client/src/app/components/access-table/access-table.component.html - 135 + 97 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -283,7 +283,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 241 + 236 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -311,7 +311,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 545 + 548 libs/ui/src/lib/benchmark/benchmark.component.html @@ -323,7 +323,7 @@ ¿Seguro que quieres eliminar esta cuenta? libs/ui/src/lib/accounts-table/accounts-table.component.ts - 183 + 185 @@ -435,7 +435,7 @@ libs/ui/src/lib/assistant/assistant.html - 140 + 141 @@ -447,7 +447,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 496 @@ -463,7 +463,7 @@ Desdoblamientos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 518 + 519 @@ -495,7 +495,7 @@ Buscar una cuenta... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 450 @@ -503,11 +503,11 @@ Fecha apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 527 + 528 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 566 + 567 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -519,7 +519,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 216 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -567,7 +567,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 52 @@ -671,7 +671,7 @@ Actualizar cuenta libs/common/src/lib/routes/routes.ts - 101 + 120 @@ -687,11 +687,11 @@ Añadir apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 622 apps/client/src/app/components/admin-overview/admin-overview.html - 304 + 299 libs/ui/src/lib/account-balances/account-balances.component.html @@ -847,7 +847,7 @@ libs/common/src/lib/routes/routes.ts - 116 + 135 @@ -879,7 +879,7 @@ Relación de desdoblamiento apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 533 @@ -895,7 +895,7 @@ An error occurred while merging this asset profile into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 942 + 944 @@ -1019,7 +1019,7 @@ Rendimiento bruto absoluto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 80 + 88 @@ -1027,7 +1027,7 @@ Rendimiento neto absoluto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 114 + 122 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1039,7 +1039,7 @@ Rendimiento neto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 129 + 137 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1051,7 +1051,7 @@ Total de activos apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 152 + 165 @@ -1059,7 +1059,7 @@ Poder adquisitivo apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 292 + 305 @@ -1067,7 +1067,7 @@ Patrimonio neto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 378 + 391 @@ -1075,7 +1075,7 @@ Rendimiento anualizado apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 393 + 406 @@ -1083,7 +1083,7 @@ Por favor, ingresa la cantidad de tu fondo de emergencia. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 160 + 169 @@ -1155,11 +1155,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 124 + 126 libs/ui/src/lib/holdings-table/holdings-table.component.html - 125 + 127 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -1179,7 +1179,7 @@ Mostrar todos libs/ui/src/lib/holdings-table/holdings-table.component.html - 216 + 222 @@ -1191,7 +1191,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 366 + 368 @@ -1199,11 +1199,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -1211,11 +1211,11 @@ 1 año apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -1231,11 +1231,11 @@ 5 años apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -1251,19 +1251,11 @@ Máximo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 277 + 279 libs/ui/src/lib/assistant/assistant.component.ts - 416 - - - - Identifier has been copied to the clipboard - Identifier has been copied to the clipboard - - apps/client/src/app/components/access-table/access-table.component.ts - 149 + 418 @@ -1275,7 +1267,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 194 + 198 @@ -1299,7 +1291,7 @@ libs/common/src/lib/routes/routes.ts - 270 + 296 @@ -1315,7 +1307,7 @@ libs/common/src/lib/routes/routes.ts - 259 + 285 @@ -1343,7 +1335,7 @@ Añadir cuenta libs/common/src/lib/routes/routes.ts - 87 + 101 @@ -1483,7 +1475,7 @@ ID de usuario apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 116 + 113 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1575,11 +1567,11 @@ libs/common/src/lib/routes/routes.ts - 104 + 123 libs/ui/src/lib/assistant/assistant.html - 84 + 85 @@ -1635,7 +1627,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 329 + 332 @@ -1675,7 +1667,7 @@ ID de cuenta apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 108 + 109 @@ -1699,7 +1691,7 @@ libs/common/src/lib/routes/routes.ts - 78 + 92 @@ -1811,7 +1803,7 @@ libs/common/src/lib/routes/routes.ts - 275 + 301 @@ -1855,7 +1847,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 327 @@ -1883,7 +1875,7 @@ libs/common/src/lib/routes/routes.ts - 306 + 332 @@ -1919,11 +1911,11 @@ libs/common/src/lib/routes/routes.ts - 143 + 169 libs/common/src/lib/routes/routes.ts - 220 + 246 @@ -1955,15 +1947,15 @@ libs/common/src/lib/routes/routes.ts - 130 + 149 libs/common/src/lib/routes/routes.ts - 311 + 337 libs/common/src/lib/routes/routes.ts - 359 + 385 @@ -1979,7 +1971,7 @@ libs/common/src/lib/routes/routes.ts - 184 + 210 @@ -1987,7 +1979,7 @@ Por cuenta apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 283 + 285 @@ -1995,7 +1987,7 @@ Por divisa apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 58 + 60 @@ -2003,7 +1995,7 @@ Por tipo de activo apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 80 + 82 @@ -2011,7 +2003,7 @@ Por posiciones apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 102 + 104 @@ -2019,7 +2011,7 @@ Por sector apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 125 + 127 @@ -2027,7 +2019,7 @@ Por continente apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 148 + 150 @@ -2035,7 +2027,7 @@ Por país apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 261 + 263 @@ -2043,7 +2035,7 @@ Regiones apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 193 + 195 apps/client/src/app/pages/public/public-page.html @@ -2067,7 +2059,7 @@ libs/common/src/lib/routes/routes.ts - 189 + 215 @@ -2123,7 +2115,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 196 apps/client/src/app/pages/public/public-page.html @@ -2131,15 +2123,15 @@ libs/common/src/lib/routes/routes.ts - 125 + 144 libs/common/src/lib/routes/routes.ts - 217 + 243 libs/ui/src/lib/assistant/assistant.html - 110 + 111 @@ -2155,7 +2147,7 @@ Semana actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 @@ -2175,7 +2167,7 @@ Venta apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 49 + 57 libs/ui/src/lib/i18n.ts @@ -2190,14 +2182,6 @@ 5 - - Copy identifier to clipboard - Copy identifier to clipboard - - apps/client/src/app/components/access-table/access-table.component.html - 120 - - Name, symbol or ISIN Nombre, símbolo o ISIN @@ -2243,11 +2227,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 235 + 238 libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 76 @@ -2259,7 +2243,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 263 @@ -2275,7 +2259,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 251 + 252 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2283,7 +2267,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 396 + 399 @@ -2331,7 +2315,7 @@ libs/common/src/lib/routes/routes.ts - 179 + 205 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2343,7 +2327,7 @@ Importando datos... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 176 @@ -2351,7 +2335,7 @@ La importación se ha completado apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 183 + 187 @@ -2391,7 +2375,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 347 @@ -2415,7 +2399,7 @@ libs/common/src/lib/routes/routes.ts - 202 + 228 @@ -2451,7 +2435,7 @@ libs/common/src/lib/routes/routes.ts - 331 + 357 @@ -2495,7 +2479,7 @@ libs/common/src/lib/routes/routes.ts - 382 + 408 @@ -2527,7 +2511,7 @@ Borrador libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/i18n.ts @@ -2543,11 +2527,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 31 libs/ui/src/lib/activities-table/activities-table.component.html - 432 + 435 @@ -2555,11 +2539,11 @@ Exportar operaciones libs/ui/src/lib/activities-table/activities-table.component.html - 73 + 76 libs/ui/src/lib/activities-table/activities-table.component.html - 460 + 463 @@ -2567,11 +2551,11 @@ Exportar borrador como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 87 + 90 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 476 @@ -2579,7 +2563,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 521 + 524 @@ -2587,7 +2571,7 @@ Exportar borrador como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 533 + 536 @@ -2595,11 +2579,11 @@ ¿Seguro que quieres eliminar esta operación? libs/ui/src/lib/activities-table/activities-table.component.ts - 343 + 326 libs/ui/src/lib/activities-table/activities-table.component.ts - 354 + 337 @@ -2675,7 +2659,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 195 @@ -2691,7 +2675,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 197 @@ -2707,7 +2691,7 @@ Mercados desarrollados apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 216 + 218 apps/client/src/app/pages/public/public-page.html @@ -2735,7 +2719,7 @@ Otros mercados apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 236 + 238 apps/client/src/app/pages/public/public-page.html @@ -2747,7 +2731,7 @@ Mercados emergentes apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 228 apps/client/src/app/pages/public/public-page.html @@ -2827,7 +2811,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 465 + 478 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2867,7 +2851,7 @@ Aplicar el precio de mercado actual apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 220 + 221 @@ -2891,7 +2875,7 @@ Miedo apps/client/src/app/components/markets/markets.component.ts - 57 + 61 libs/ui/src/lib/i18n.ts @@ -2903,7 +2887,7 @@ Codicia apps/client/src/app/components/markets/markets.component.ts - 58 + 62 libs/ui/src/lib/i18n.ts @@ -2915,7 +2899,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 377 + 350 @@ -2963,11 +2947,11 @@ No se pudo validar el formulario apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 728 + 730 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 731 + 733 @@ -2991,7 +2975,7 @@ Excluido del análisis apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 324 + 337 @@ -3087,15 +3071,15 @@ Cuenta apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 102 + 109 libs/common/src/lib/routes/routes.ts - 94 + 108 libs/ui/src/lib/activities-table/activities-table.component.html - 362 + 365 libs/ui/src/lib/i18n.ts @@ -3123,7 +3107,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 266 + 268 libs/ui/src/lib/i18n.ts @@ -3167,7 +3151,7 @@ Exportar libs/ui/src/lib/activities-table/activities-table.component.html - 69 + 72 @@ -3187,7 +3171,7 @@ Efectivo apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 274 @@ -3219,15 +3203,15 @@ Fondo de emergencia apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 229 + 242 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 320 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 412 + 425 apps/client/src/app/pages/features/features-page.html @@ -3251,7 +3235,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 460 + 462 @@ -3259,7 +3243,7 @@ Sin datos disponibles apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 247 + 249 apps/client/src/app/pages/public/public-page.html @@ -3271,11 +3255,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 462 + 464 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 476 + 478 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3355,7 +3339,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 66 + 74 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -3403,7 +3387,7 @@ ¿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 - 809 + 811 @@ -3419,7 +3403,7 @@ Frecuencia de recopilación de datos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 476 + 477 @@ -3467,7 +3451,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 479 + 492 apps/client/src/app/pages/features/features-page.html @@ -3515,7 +3499,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 287 libs/ui/src/lib/i18n.ts @@ -3535,7 +3519,7 @@ Validando datos... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 294 + 298 @@ -3563,7 +3547,7 @@ libs/common/src/lib/routes/routes.ts - 65 + 79 @@ -3575,7 +3559,7 @@ libs/common/src/lib/routes/routes.ts - 75 + 89 @@ -3583,7 +3567,7 @@ This action cannot be undone. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 961 + 963 @@ -3603,7 +3587,7 @@ libs/common/src/lib/routes/routes.ts - 135 + 154 @@ -3643,11 +3627,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 54 + 57 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -3699,7 +3683,7 @@ Sin operaciones apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 148 + 138 @@ -3747,7 +3731,7 @@ Inversiones apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 214 + 227 @@ -3891,7 +3875,7 @@ Horaria apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 249 + 251 @@ -4003,11 +3987,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 - 762 + 764 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 765 + 767 @@ -4027,7 +4011,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 94 + 102 @@ -4102,6 +4086,14 @@ 18 + + Add to Watchlist + Add to Watchlist + + libs/common/src/lib/routes/routes.ts + 163 + + Market data provided by Datos de mercado proporcionados por @@ -4123,7 +4115,7 @@ This asset profile cannot be merged into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 920 + 922 @@ -4175,7 +4167,7 @@ Do you really want to remove this received access? apps/client/src/app/components/access-table/access-table.component.ts - 176 + 152 @@ -4191,7 +4183,7 @@ Por proveedor de ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 303 + 305 @@ -4215,7 +4207,7 @@ The data of this asset profile is moved to () and this asset profile is deleted. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 959 + 961 @@ -4231,7 +4223,7 @@ Año actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 @@ -4283,7 +4275,7 @@ Perfil del activo guardado apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 752 + 754 @@ -4315,7 +4307,7 @@ Por plataforma apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 39 + 41 @@ -4355,7 +4347,7 @@ libs/common/src/lib/routes/routes.ts - 70 + 84 @@ -4411,7 +4403,7 @@ Acciones después apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 590 + 591 @@ -4495,7 +4487,7 @@ Pasivos apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 355 + 368 apps/client/src/app/pages/features/features-page.html @@ -4515,7 +4507,7 @@ libs/common/src/lib/routes/routes.ts - 235 + 261 @@ -4531,7 +4523,7 @@ libs/common/src/lib/routes/routes.ts - 243 + 269 @@ -4651,7 +4643,7 @@ Actualizar operación libs/common/src/lib/routes/routes.ts - 176 + 202 @@ -4683,7 +4675,7 @@ Configuración del scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 635 @@ -4693,6 +4685,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 69 + Personal Finance Tools @@ -4703,7 +4699,7 @@ libs/common/src/lib/routes/routes.ts - 379 + 405 @@ -4931,7 +4927,7 @@ Compra apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 35 + 43 libs/ui/src/lib/i18n.ts @@ -4959,7 +4955,7 @@ ETFs sin países apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 138 + 128 @@ -4967,7 +4963,7 @@ ETFs sin sectores apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 143 + 133 @@ -4975,7 +4971,7 @@ 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 - 526 + 528 @@ -4999,7 +4995,7 @@ Por mercado apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 170 + 172 @@ -5195,7 +5191,7 @@ Divisas apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 133 + 123 apps/client/src/app/pages/public/public-page.html @@ -5247,11 +5243,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 - 676 + 678 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 679 + 681 @@ -5391,7 +5387,7 @@ ¿De verdad quieres eliminar estas actividades? libs/ui/src/lib/activities-table/activities-table.component.ts - 344 + 327 @@ -5495,7 +5491,7 @@ ¡Ups! No se pudieron eliminar los perfiles de activos. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 54 + 60 @@ -5551,7 +5547,7 @@ Añadir operación libs/common/src/lib/routes/routes.ts - 169 + 195 @@ -5600,19 +5596,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 284 + 310 libs/common/src/lib/routes/routes.ts - 285 + 311 libs/common/src/lib/routes/routes.ts - 289 + 315 libs/common/src/lib/routes/routes.ts - 295 + 321 @@ -5621,11 +5617,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 330 libs/common/src/lib/routes/routes.ts - 305 + 331 @@ -5634,31 +5630,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 226 + 252 libs/common/src/lib/routes/routes.ts - 227 + 253 libs/common/src/lib/routes/routes.ts - 232 + 258 libs/common/src/lib/routes/routes.ts - 240 + 266 libs/common/src/lib/routes/routes.ts - 248 + 274 libs/common/src/lib/routes/routes.ts - 256 + 282 libs/common/src/lib/routes/routes.ts - 264 + 290 @@ -5667,11 +5663,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 280 libs/common/src/lib/routes/routes.ts - 257 + 283 @@ -5680,11 +5676,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 238 + 264 libs/common/src/lib/routes/routes.ts - 241 + 267 @@ -5693,11 +5689,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 309 + 335 libs/common/src/lib/routes/routes.ts - 310 + 336 @@ -5706,11 +5702,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 319 + 345 libs/common/src/lib/routes/routes.ts - 320 + 346 @@ -5719,11 +5715,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 329 + 355 libs/common/src/lib/routes/routes.ts - 330 + 356 @@ -5732,31 +5728,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 334 + 360 libs/common/src/lib/routes/routes.ts - 335 + 361 libs/common/src/lib/routes/routes.ts - 340 + 366 libs/common/src/lib/routes/routes.ts - 348 + 374 libs/common/src/lib/routes/routes.ts - 356 + 382 libs/common/src/lib/routes/routes.ts - 364 + 390 libs/common/src/lib/routes/routes.ts - 372 + 398 @@ -5829,11 +5825,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 370 + 396 libs/common/src/lib/routes/routes.ts - 374 + 400 @@ -5865,7 +5861,7 @@ La recopilación de datos ha comenzado. apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 413 + 386 @@ -5901,7 +5897,7 @@ Do you really want to merge this asset profile into it? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 965 + 967 @@ -5985,11 +5981,11 @@ Comisión apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 238 + 239 libs/ui/src/lib/activities-table/activities-table.component.html - 285 + 288 libs/ui/src/lib/i18n.ts @@ -6043,6 +6039,10 @@ apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 113 + libs/ui/src/lib/accounts-table/accounts-table.component.html 10 @@ -6119,17 +6119,21 @@ apps/client/src/app/components/admin-jobs/admin-jobs.html 52 + + libs/common/src/lib/routes/routes.ts + 76 + Do you really want to delete this asset profile? ¿Seguro que quieres eliminar este perfil de activo? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 27 + 33 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 69 + 75 @@ -6336,8 +6340,8 @@ Oops, cash balance transfer has failed. ¡Vaya! La transferencia del saldo de efectivo ha fallado. - apps/client/src/app/pages/accounts/accounts-page.component.ts - 199 + apps/client/src/app/pages/accounts/account-dialog-host/account-dialog-host.component.ts + 365 @@ -6393,7 +6397,7 @@ Filtros de cartera apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 128 + 125 @@ -6453,7 +6457,7 @@ El precio actual de mercado es apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 854 + 856 @@ -6469,7 +6473,7 @@ Rango de fechas libs/ui/src/lib/assistant/assistant.html - 170 + 171 @@ -6497,7 +6501,7 @@ ¡Vaya! No se pudo otorgar acceso. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 256 + 314 @@ -6593,7 +6597,7 @@ Semana hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6601,11 +6605,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6613,7 +6617,7 @@ Mes hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6621,11 +6625,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6641,7 +6645,7 @@ Año hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -6673,7 +6677,7 @@ Reiniciar filtros libs/ui/src/lib/assistant/assistant.html - 204 + 205 @@ -6681,7 +6685,7 @@ año apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6693,7 +6697,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -6701,11 +6705,11 @@ años apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -6713,7 +6717,7 @@ Aplicar filtros libs/ui/src/lib/assistant/assistant.html - 217 + 218 @@ -6733,7 +6737,7 @@ Buscar una posición... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 451 @@ -6753,7 +6757,7 @@ libs/common/src/lib/routes/routes.ts - 290 + 316 @@ -6765,7 +6769,7 @@ libs/common/src/lib/routes/routes.ts - 298 + 324 @@ -6774,11 +6778,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 293 + 319 libs/common/src/lib/routes/routes.ts - 296 + 322 @@ -6786,7 +6790,7 @@ Diaria apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 245 + 247 @@ -6810,7 +6814,7 @@ Activo apps/client/src/app/components/home-holdings/home-holdings.component.ts - 73 + 77 @@ -6818,7 +6822,7 @@ Cerrado apps/client/src/app/components/home-holdings/home-holdings.component.ts - 74 + 78 @@ -6870,7 +6874,7 @@ {VAR_PLURAL, plural, =1 {operación} other {operaciones}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 18 + 25 @@ -6886,7 +6890,7 @@ Eliminar operaciones libs/ui/src/lib/activities-table/activities-table.component.html - 111 + 114 @@ -6894,7 +6898,7 @@ Internacionalización libs/common/src/lib/routes/routes.ts - 149 + 175 @@ -6910,7 +6914,7 @@ Saltar a una página... libs/ui/src/lib/assistant/assistant.component.ts - 450 + 452 @@ -6934,7 +6938,7 @@ Por tenencia de ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 328 + 330 @@ -6942,7 +6946,7 @@ Aproximación basada en las principales posiciones de cada ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 335 + 337 @@ -6958,7 +6962,7 @@ Clonar operación libs/common/src/lib/routes/routes.ts - 164 + 190 @@ -6998,7 +7002,7 @@ Índices de referencia apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 118 @@ -7006,7 +7010,7 @@ Tabla apps/client/src/app/components/home-holdings/home-holdings.component.ts - 62 + 66 @@ -7014,7 +7018,7 @@ Gráfico apps/client/src/app/components/home-holdings/home-holdings.component.ts - 67 + 71 @@ -7122,7 +7126,7 @@ ¡Ups! No se pudo eliminar el perfil de activo. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 53 + 59 @@ -7226,7 +7230,7 @@ Ver posición libs/ui/src/lib/activities-table/activities-table.component.html - 499 + 502 @@ -7234,7 +7238,7 @@ ¿Seguro que quieres eliminar estos perfiles de activos? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 70 + 76 @@ -7242,15 +7246,15 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 844 + 846 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 921 + 923 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 943 + 945 @@ -7274,7 +7278,7 @@ ¡Vaya! No se pudo actualizar el acceso. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 354 + 414 @@ -7314,11 +7318,11 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 143 + 152 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 117 + 118 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7326,7 +7330,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 321 + 323 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -7370,7 +7374,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 145 + 154 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7382,11 +7386,11 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 119 + 120 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 323 + 325 libs/ui/src/lib/i18n.ts @@ -7414,7 +7418,7 @@ Copiar enlace al portapapeles apps/client/src/app/components/access-table/access-table.component.html - 112 + 82 @@ -7602,7 +7606,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 107 + 110 @@ -7634,7 +7638,7 @@ Acciones antes apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 603 + 604 @@ -7694,7 +7698,7 @@ ¡Vaya! No se pudieron encontrar activos. libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html - 43 + 44 @@ -7750,7 +7754,7 @@ libs/common/src/lib/routes/routes.ts - 343 + 369 @@ -7766,7 +7770,7 @@ libs/common/src/lib/routes/routes.ts - 351 + 377 @@ -7775,11 +7779,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 346 + 372 libs/common/src/lib/routes/routes.ts - 349 + 375 @@ -7788,11 +7792,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 338 + 364 libs/common/src/lib/routes/routes.ts - 341 + 367 @@ -7832,7 +7836,7 @@ ¿Seguro que quieres eliminar la clave API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 148 + 151 @@ -7952,7 +7956,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 158 + 167 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7960,15 +7964,15 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 158 + 167 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 128 + 129 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 332 + 334 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -8016,7 +8020,7 @@ Por favor, ingresa tu clave API de Ghostfolio. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 167 + 170 @@ -8040,7 +8044,7 @@ El enlace ha sido copiado al portapapeles apps/client/src/app/components/access-table/access-table.component.ts - 161 + 137 @@ -8048,7 +8052,7 @@ Bajo demanda apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8056,7 +8060,7 @@ Instantáneo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8064,7 +8068,7 @@ Precio de mercado por defecto apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 644 + 645 @@ -8080,7 +8084,7 @@ ¿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 - 529 + 531 @@ -8096,7 +8100,7 @@ Encabezados de solicitud HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 657 + 658 @@ -8104,7 +8108,7 @@ final del día apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8112,7 +8116,7 @@ en tiempo real apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8136,7 +8140,7 @@ Cambio libs/ui/src/lib/holdings-table/holdings-table.component.html - 146 + 148 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8172,11 +8176,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 168 + 170 libs/ui/src/lib/holdings-table/holdings-table.component.html - 169 + 171 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8240,7 +8244,7 @@ Additional requests are granted while you are setting up your instance apps/client/src/app/components/admin-settings/admin-settings.component.ts - 87 + 88 @@ -8309,11 +8313,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 262 + 288 libs/common/src/lib/routes/routes.ts - 265 + 291 @@ -8325,7 +8329,7 @@ libs/common/src/lib/routes/routes.ts - 267 + 293 @@ -8341,7 +8345,7 @@ () ya está en uso. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 963 + 965 @@ -8349,7 +8353,7 @@ Ocurrió un error al actualizar a (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 807 + 809 @@ -8437,7 +8441,7 @@ libs/common/src/lib/routes/routes.ts - 140 + 166 @@ -8453,11 +8457,11 @@ {VAR_PLURAL, plural, =1 {Actividad} other {Actividades}} libs/ui/src/lib/activities-table/activities-table.component.html - 70 + 73 libs/ui/src/lib/activities-table/activities-table.component.html - 108 + 111 @@ -8482,11 +8486,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 230 + 256 libs/common/src/lib/routes/routes.ts - 233 + 259 @@ -8606,7 +8610,7 @@ Enlaces rápidos libs/ui/src/lib/assistant/assistant.html - 58 + 59 @@ -8622,7 +8626,7 @@ libs/common/src/lib/routes/routes.ts - 281 + 307 @@ -8630,7 +8634,7 @@ Alternativa de software de código abierto a libs/common/src/lib/routes/routes.ts - 376 + 402 @@ -8663,15 +8667,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 362 + 388 libs/common/src/lib/routes/routes.ts - 365 + 391 libs/common/src/lib/routes/routes.ts - 373 + 399 @@ -8680,11 +8684,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 354 + 380 libs/common/src/lib/routes/routes.ts - 357 + 383 @@ -8764,7 +8768,7 @@ Mes actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 @@ -8909,11 +8913,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 386 + 412 libs/common/src/lib/routes/routes.ts - 387 + 413 @@ -8945,7 +8949,7 @@ Acciones apps/client/src/app/components/markets/markets.component.ts - 53 + 57 apps/client/src/app/pages/features/features-page.html @@ -8957,7 +8961,7 @@ Criptomonedas apps/client/src/app/components/markets/markets.component.ts - 54 + 58 apps/client/src/app/pages/features/features-page.html @@ -9085,7 +9089,7 @@ No se encontraron resultados... libs/ui/src/lib/assistant/assistant.html - 51 + 52 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 85b4f6983f..da0d5da102 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -58,19 +58,19 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 7 + 10 libs/ui/src/lib/activities-table/activities-table.component.html - 204 + 207 Details Détails - apps/client/src/app/components/access-table/access-table.component.html - 49 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 137 @@ -78,7 +78,7 @@ Révoquer apps/client/src/app/components/access-table/access-table.component.html - 138 + 100 @@ -102,7 +102,7 @@ Voulez-vous vraiment révoquer cet accès ? apps/client/src/app/components/access-table/access-table.component.ts - 177 + 153 @@ -166,7 +166,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 182 + 185 libs/ui/src/lib/benchmark/benchmark.component.html @@ -230,7 +230,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 329 + 332 @@ -282,15 +282,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 309 + 312 libs/ui/src/lib/activities-table/activities-table.component.html - 346 + 349 libs/ui/src/lib/holdings-table/holdings-table.component.html - 99 + 101 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -306,7 +306,7 @@ Modifier apps/client/src/app/components/access-table/access-table.component.html - 104 + 74 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -326,7 +326,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 510 + 513 @@ -334,7 +334,7 @@ Supprimer apps/client/src/app/components/access-table/access-table.component.html - 135 + 97 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -346,7 +346,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 241 + 236 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -374,7 +374,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 545 + 548 libs/ui/src/lib/benchmark/benchmark.component.html @@ -386,7 +386,7 @@ Voulez-vous vraiment supprimer ce compte ? libs/ui/src/lib/accounts-table/accounts-table.component.ts - 183 + 185 @@ -498,7 +498,7 @@ libs/ui/src/lib/assistant/assistant.html - 140 + 141 @@ -510,7 +510,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 496 @@ -526,7 +526,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 518 + 519 @@ -558,7 +558,7 @@ Rechercher un compte... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 450 @@ -566,11 +566,11 @@ Date apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 527 + 528 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 566 + 567 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -582,7 +582,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 216 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -618,7 +618,7 @@ Filtrer par... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 377 + 350 @@ -638,7 +638,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 52 @@ -654,7 +654,7 @@ Fréquence de collecte des données apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 476 + 477 @@ -690,7 +690,7 @@ Appliquer le prix actuel du marché apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 220 + 221 @@ -826,7 +826,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 251 + 252 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -834,7 +834,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 396 + 399 @@ -914,7 +914,7 @@ Update Account libs/common/src/lib/routes/routes.ts - 101 + 120 @@ -954,11 +954,11 @@ Ajouter apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 622 apps/client/src/app/components/admin-overview/admin-overview.html - 304 + 299 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1038,11 +1038,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 - 728 + 730 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 731 + 733 @@ -1074,7 +1074,7 @@ libs/common/src/lib/routes/routes.ts - 202 + 228 @@ -1126,7 +1126,7 @@ libs/common/src/lib/routes/routes.ts - 116 + 135 @@ -1158,7 +1158,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 533 @@ -1166,7 +1166,7 @@ Peur apps/client/src/app/components/markets/markets.component.ts - 57 + 61 libs/ui/src/lib/i18n.ts @@ -1178,7 +1178,7 @@ Avidité apps/client/src/app/components/markets/markets.component.ts - 58 + 62 libs/ui/src/lib/i18n.ts @@ -1198,7 +1198,7 @@ An error occurred while merging this asset profile into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 942 + 944 @@ -1346,7 +1346,7 @@ Performance Absolue Brute apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 80 + 88 @@ -1354,7 +1354,7 @@ Performance Absolue Nette apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 114 + 122 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1366,7 +1366,7 @@ Performance nette apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 129 + 137 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1378,7 +1378,7 @@ Actifs Totaux apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 152 + 165 @@ -1386,7 +1386,7 @@ Pouvoir d’Achat apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 292 + 305 @@ -1394,7 +1394,7 @@ Exclus de l’Analyse apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 324 + 337 @@ -1402,7 +1402,7 @@ Fortune apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 378 + 391 @@ -1410,7 +1410,7 @@ Performance annualisée apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 393 + 406 @@ -1418,7 +1418,7 @@ Veuillez entrer le montant de votre fonds d’urgence : apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 160 + 169 @@ -1454,11 +1454,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 235 + 238 libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 76 @@ -1478,7 +1478,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 366 + 368 @@ -1486,11 +1486,11 @@ CDA apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -1498,11 +1498,11 @@ 1A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -1518,11 +1518,11 @@ 5A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -1538,19 +1538,11 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 277 + 279 libs/ui/src/lib/assistant/assistant.component.ts - 416 - - - - Identifier has been copied to the clipboard - Identifier has been copied to the clipboard - - apps/client/src/app/components/access-table/access-table.component.ts - 149 + 418 @@ -1574,7 +1566,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 197 @@ -1586,7 +1578,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 195 @@ -1598,7 +1590,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 194 + 198 @@ -1622,7 +1614,7 @@ libs/common/src/lib/routes/routes.ts - 270 + 296 @@ -1638,7 +1630,7 @@ libs/common/src/lib/routes/routes.ts - 259 + 285 @@ -1678,7 +1670,7 @@ Add Account libs/common/src/lib/routes/routes.ts - 87 + 101 @@ -1878,7 +1870,7 @@ ID d’utilisateur apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 116 + 113 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1970,11 +1962,11 @@ libs/common/src/lib/routes/routes.ts - 104 + 123 libs/ui/src/lib/assistant/assistant.html - 84 + 85 @@ -1998,7 +1990,7 @@ ID du compte apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 108 + 109 @@ -2018,7 +2010,7 @@ libs/common/src/lib/routes/routes.ts - 65 + 79 @@ -2034,7 +2026,7 @@ libs/common/src/lib/routes/routes.ts - 78 + 92 @@ -2046,7 +2038,7 @@ libs/common/src/lib/routes/routes.ts - 75 + 89 @@ -2158,7 +2150,7 @@ libs/common/src/lib/routes/routes.ts - 275 + 301 @@ -2202,7 +2194,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 327 @@ -2230,7 +2222,7 @@ libs/common/src/lib/routes/routes.ts - 306 + 332 @@ -2246,7 +2238,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 196 apps/client/src/app/pages/public/public-page.html @@ -2254,15 +2246,15 @@ libs/common/src/lib/routes/routes.ts - 125 + 144 libs/common/src/lib/routes/routes.ts - 217 + 243 libs/ui/src/lib/assistant/assistant.html - 110 + 111 @@ -2270,7 +2262,7 @@ This action cannot be undone. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 961 + 963 @@ -2290,7 +2282,7 @@ libs/common/src/lib/routes/routes.ts - 135 + 154 @@ -2322,15 +2314,15 @@ libs/common/src/lib/routes/routes.ts - 130 + 149 libs/common/src/lib/routes/routes.ts - 311 + 337 libs/common/src/lib/routes/routes.ts - 359 + 385 @@ -2378,7 +2370,7 @@ libs/common/src/lib/routes/routes.ts - 179 + 205 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2398,7 +2390,7 @@ Semaine en cours apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 @@ -2418,7 +2410,7 @@ Vente apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 49 + 57 libs/ui/src/lib/i18n.ts @@ -2433,14 +2425,6 @@ 5 - - Copy identifier to clipboard - Copy identifier to clipboard - - apps/client/src/app/components/access-table/access-table.component.html - 120 - - Name, symbol or ISIN Nom, symbole, ou ISIN @@ -2478,7 +2462,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 263 @@ -2486,7 +2470,7 @@ Import des données... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 176 @@ -2494,7 +2478,7 @@ L’import est terminé apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 183 + 187 @@ -2510,7 +2494,7 @@ Validation des données... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 294 + 298 @@ -2546,7 +2530,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 - 809 + 811 @@ -2578,7 +2562,7 @@ libs/common/src/lib/routes/routes.ts - 184 + 210 @@ -2594,7 +2578,7 @@ Par Compte apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 283 + 285 @@ -2602,7 +2586,7 @@ Par Devise apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 58 + 60 @@ -2610,7 +2594,7 @@ Par Classe d’Actifs apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 80 + 82 @@ -2618,7 +2602,7 @@ Par Position apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 102 + 104 @@ -2626,7 +2610,7 @@ Par Secteur apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 125 + 127 @@ -2634,7 +2618,7 @@ Par Continent apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 148 + 150 @@ -2642,7 +2626,7 @@ Par Pays apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 261 + 263 @@ -2650,7 +2634,7 @@ Régions apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 193 + 195 apps/client/src/app/pages/public/public-page.html @@ -2678,7 +2662,7 @@ Marchés développés apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 216 + 218 apps/client/src/app/pages/public/public-page.html @@ -2698,7 +2682,7 @@ Marchés émergents apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 228 apps/client/src/app/pages/public/public-page.html @@ -2710,7 +2694,7 @@ Autres marchés apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 236 + 238 apps/client/src/app/pages/public/public-page.html @@ -2726,7 +2710,7 @@ libs/common/src/lib/routes/routes.ts - 189 + 215 @@ -2750,7 +2734,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 479 + 492 apps/client/src/app/pages/features/features-page.html @@ -2870,7 +2854,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 347 @@ -2958,7 +2942,7 @@ libs/common/src/lib/routes/routes.ts - 331 + 357 @@ -3022,7 +3006,7 @@ libs/common/src/lib/routes/routes.ts - 382 + 408 @@ -3082,11 +3066,11 @@ libs/common/src/lib/routes/routes.ts - 143 + 169 libs/common/src/lib/routes/routes.ts - 220 + 246 @@ -3094,7 +3078,7 @@ Brouillon libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/i18n.ts @@ -3110,11 +3094,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 31 libs/ui/src/lib/activities-table/activities-table.component.html - 432 + 435 @@ -3122,11 +3106,11 @@ Exporter Activités libs/ui/src/lib/activities-table/activities-table.component.html - 73 + 76 libs/ui/src/lib/activities-table/activities-table.component.html - 460 + 463 @@ -3134,11 +3118,11 @@ Exporter Brouillons sous ICS libs/ui/src/lib/activities-table/activities-table.component.html - 87 + 90 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 476 @@ -3146,7 +3130,7 @@ Dupliquer libs/ui/src/lib/activities-table/activities-table.component.html - 521 + 524 @@ -3154,7 +3138,7 @@ Exporter Brouillon sous ICS libs/ui/src/lib/activities-table/activities-table.component.html - 533 + 536 @@ -3162,11 +3146,11 @@ Voulez-vous vraiment supprimer cette activité ? libs/ui/src/lib/activities-table/activities-table.component.ts - 343 + 326 libs/ui/src/lib/activities-table/activities-table.component.ts - 354 + 337 @@ -3226,7 +3210,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 465 + 478 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -3254,11 +3238,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 124 + 126 libs/ui/src/lib/holdings-table/holdings-table.component.html - 125 + 127 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3278,7 +3262,7 @@ Montrer tout libs/ui/src/lib/holdings-table/holdings-table.component.html - 216 + 222 @@ -3286,15 +3270,15 @@ Compte apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 102 + 109 libs/common/src/lib/routes/routes.ts - 94 + 108 libs/ui/src/lib/activities-table/activities-table.component.html - 362 + 365 libs/ui/src/lib/i18n.ts @@ -3322,7 +3306,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 266 + 268 libs/ui/src/lib/i18n.ts @@ -3354,7 +3338,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 287 libs/ui/src/lib/i18n.ts @@ -3366,15 +3350,15 @@ Fonds d’Urgence apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 229 + 242 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 320 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 412 + 425 apps/client/src/app/pages/features/features-page.html @@ -3398,7 +3382,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 460 + 462 @@ -3434,7 +3418,7 @@ Export libs/ui/src/lib/activities-table/activities-table.component.html - 69 + 72 @@ -3454,7 +3438,7 @@ Cash apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 274 @@ -3554,7 +3538,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 66 + 74 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -3582,7 +3566,7 @@ Pas de données disponibles apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 247 + 249 apps/client/src/app/pages/public/public-page.html @@ -3594,11 +3578,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 462 + 464 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 476 + 478 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3642,11 +3626,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 54 + 57 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -3698,7 +3682,7 @@ Aucune Activité apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 148 + 138 @@ -3746,7 +3730,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 214 + 227 @@ -3890,7 +3874,7 @@ Toutes les heures apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 249 + 251 @@ -4002,11 +3986,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 - 762 + 764 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 765 + 767 @@ -4026,7 +4010,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 94 + 102 @@ -4101,6 +4085,14 @@ 18 + + Add to Watchlist + Add to Watchlist + + libs/common/src/lib/routes/routes.ts + 163 + + Market data provided by Données de marché fournies par @@ -4122,7 +4114,7 @@ This asset profile cannot be merged into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 920 + 922 @@ -4174,7 +4166,7 @@ Do you really want to remove this received access? apps/client/src/app/components/access-table/access-table.component.ts - 176 + 152 @@ -4190,7 +4182,7 @@ Par Émetteur d’ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 303 + 305 @@ -4214,7 +4206,7 @@ The data of this asset profile is moved to () and this asset profile is deleted. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 959 + 961 @@ -4230,7 +4222,7 @@ Année en cours apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 @@ -4282,7 +4274,7 @@ Le profil d’actif a été enregistré apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 752 + 754 @@ -4314,7 +4306,7 @@ Par Plateforme apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 39 + 41 @@ -4354,7 +4346,7 @@ libs/common/src/lib/routes/routes.ts - 70 + 84 @@ -4410,7 +4402,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 590 + 591 @@ -4494,7 +4486,7 @@ Dettes apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 355 + 368 apps/client/src/app/pages/features/features-page.html @@ -4514,7 +4506,7 @@ libs/common/src/lib/routes/routes.ts - 235 + 261 @@ -4530,7 +4522,7 @@ libs/common/src/lib/routes/routes.ts - 243 + 269 @@ -4650,7 +4642,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 176 + 202 @@ -4682,7 +4674,7 @@ Configuration du Scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 635 @@ -4692,6 +4684,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 69 + Personal Finance Tools @@ -4702,7 +4698,7 @@ libs/common/src/lib/routes/routes.ts - 379 + 405 @@ -4930,7 +4926,7 @@ Achat apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 35 + 43 libs/ui/src/lib/i18n.ts @@ -4958,7 +4954,7 @@ ETF sans Pays apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 138 + 128 @@ -4966,7 +4962,7 @@ ETF sans Secteurs apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 143 + 133 @@ -4974,7 +4970,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 - 526 + 528 @@ -4998,7 +4994,7 @@ par marché apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 170 + 172 @@ -5194,7 +5190,7 @@ Devises apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 133 + 123 apps/client/src/app/pages/public/public-page.html @@ -5246,11 +5242,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 - 676 + 678 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 679 + 681 @@ -5390,7 +5386,7 @@ Do you really want to delete these activities? libs/ui/src/lib/activities-table/activities-table.component.ts - 344 + 327 @@ -5494,7 +5490,7 @@ Oops! Could not delete the asset profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 54 + 60 @@ -5550,7 +5546,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 169 + 195 @@ -5599,19 +5595,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 284 + 310 libs/common/src/lib/routes/routes.ts - 285 + 311 libs/common/src/lib/routes/routes.ts - 289 + 315 libs/common/src/lib/routes/routes.ts - 295 + 321 @@ -5620,11 +5616,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 330 libs/common/src/lib/routes/routes.ts - 305 + 331 @@ -5633,31 +5629,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 226 + 252 libs/common/src/lib/routes/routes.ts - 227 + 253 libs/common/src/lib/routes/routes.ts - 232 + 258 libs/common/src/lib/routes/routes.ts - 240 + 266 libs/common/src/lib/routes/routes.ts - 248 + 274 libs/common/src/lib/routes/routes.ts - 256 + 282 libs/common/src/lib/routes/routes.ts - 264 + 290 @@ -5666,11 +5662,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 280 libs/common/src/lib/routes/routes.ts - 257 + 283 @@ -5679,11 +5675,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 238 + 264 libs/common/src/lib/routes/routes.ts - 241 + 267 @@ -5692,11 +5688,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 309 + 335 libs/common/src/lib/routes/routes.ts - 310 + 336 @@ -5705,11 +5701,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 319 + 345 libs/common/src/lib/routes/routes.ts - 320 + 346 @@ -5718,11 +5714,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 329 + 355 libs/common/src/lib/routes/routes.ts - 330 + 356 @@ -5731,31 +5727,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 334 + 360 libs/common/src/lib/routes/routes.ts - 335 + 361 libs/common/src/lib/routes/routes.ts - 340 + 366 libs/common/src/lib/routes/routes.ts - 348 + 374 libs/common/src/lib/routes/routes.ts - 356 + 382 libs/common/src/lib/routes/routes.ts - 364 + 390 libs/common/src/lib/routes/routes.ts - 372 + 398 @@ -5828,11 +5824,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 370 + 396 libs/common/src/lib/routes/routes.ts - 374 + 400 @@ -5864,7 +5860,7 @@ Data gathering has been started. apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 413 + 386 @@ -5900,7 +5896,7 @@ Do you really want to merge this asset profile into it? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 965 + 967 @@ -5984,11 +5980,11 @@ Frais apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 238 + 239 libs/ui/src/lib/activities-table/activities-table.component.html - 285 + 288 libs/ui/src/lib/i18n.ts @@ -6042,6 +6038,10 @@ apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 113 + libs/ui/src/lib/accounts-table/accounts-table.component.html 10 @@ -6118,17 +6118,21 @@ apps/client/src/app/components/admin-jobs/admin-jobs.html 52 + + libs/common/src/lib/routes/routes.ts + 76 + Do you really want to delete this asset profile? Confirmez la suppressoion de ce profil d’actif? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 27 + 33 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 69 + 75 @@ -6335,8 +6339,8 @@ Oops, cash balance transfer has failed. Oops, échec du transfert de la cash balance. - apps/client/src/app/pages/accounts/accounts-page.component.ts - 199 + apps/client/src/app/pages/accounts/account-dialog-host/account-dialog-host.component.ts + 365 @@ -6392,7 +6396,7 @@ Filtres du Portefeuille apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 128 + 125 @@ -6452,7 +6456,7 @@ Le prix actuel du marché est apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 854 + 856 @@ -6468,7 +6472,7 @@ Intervalle de Date libs/ui/src/lib/assistant/assistant.html - 170 + 171 @@ -6496,7 +6500,7 @@ Oops! Impossible d’accorder l’accès. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 256 + 314 @@ -6592,7 +6596,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6600,11 +6604,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6612,7 +6616,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6620,11 +6624,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6640,7 +6644,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -6672,7 +6676,7 @@ Réinitialiser les Filtres libs/ui/src/lib/assistant/assistant.html - 204 + 205 @@ -6680,7 +6684,7 @@ année apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6692,7 +6696,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -6700,11 +6704,11 @@ années apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -6712,7 +6716,7 @@ Appliquer les Filtres libs/ui/src/lib/assistant/assistant.html - 217 + 218 @@ -6732,7 +6736,7 @@ Rechercher une position... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 451 @@ -6752,7 +6756,7 @@ libs/common/src/lib/routes/routes.ts - 290 + 316 @@ -6764,7 +6768,7 @@ libs/common/src/lib/routes/routes.ts - 298 + 324 @@ -6773,11 +6777,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 293 + 319 libs/common/src/lib/routes/routes.ts - 296 + 322 @@ -6785,7 +6789,7 @@ Tous les jours apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 245 + 247 @@ -6809,7 +6813,7 @@ Actif apps/client/src/app/components/home-holdings/home-holdings.component.ts - 73 + 77 @@ -6817,7 +6821,7 @@ Clôturé apps/client/src/app/components/home-holdings/home-holdings.component.ts - 74 + 78 @@ -6869,7 +6873,7 @@ {VAR_PLURAL, plural, =1 {activity} autres {activities}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 18 + 25 @@ -6885,7 +6889,7 @@ Supprimer les Activitées libs/ui/src/lib/activities-table/activities-table.component.html - 111 + 114 @@ -6893,7 +6897,7 @@ Internationalisation libs/common/src/lib/routes/routes.ts - 149 + 175 @@ -6909,7 +6913,7 @@ Aller à une page... libs/ui/src/lib/assistant/assistant.component.ts - 450 + 452 @@ -6933,7 +6937,7 @@ Par détention ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 328 + 330 @@ -6941,7 +6945,7 @@ Approximation basée sur les principaux titres de chaque ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 335 + 337 @@ -6957,7 +6961,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 164 + 190 @@ -6997,7 +7001,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 118 @@ -7005,7 +7009,7 @@ Table apps/client/src/app/components/home-holdings/home-holdings.component.ts - 62 + 66 @@ -7013,7 +7017,7 @@ Tableau apps/client/src/app/components/home-holdings/home-holdings.component.ts - 67 + 71 @@ -7121,7 +7125,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 53 + 59 @@ -7225,7 +7229,7 @@ Voir la Position libs/ui/src/lib/activities-table/activities-table.component.html - 499 + 502 @@ -7233,7 +7237,7 @@ Voulez-vous vraiment supprimer ces profils d’actifs ? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 70 + 76 @@ -7241,15 +7245,15 @@ Erreur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 844 + 846 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 921 + 923 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 943 + 945 @@ -7273,7 +7277,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 354 + 414 @@ -7313,11 +7317,11 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 143 + 152 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 117 + 118 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7325,7 +7329,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 321 + 323 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -7369,7 +7373,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 145 + 154 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7381,11 +7385,11 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 119 + 120 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 323 + 325 libs/ui/src/lib/i18n.ts @@ -7413,7 +7417,7 @@ Copier le lien dans le presse-papiers apps/client/src/app/components/access-table/access-table.component.html - 112 + 82 @@ -7601,7 +7605,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 107 + 110 @@ -7633,7 +7637,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 603 + 604 @@ -7693,7 +7697,7 @@ Oups! Aucun actif n’a été trouvé. libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html - 43 + 44 @@ -7749,7 +7753,7 @@ libs/common/src/lib/routes/routes.ts - 343 + 369 @@ -7765,7 +7769,7 @@ libs/common/src/lib/routes/routes.ts - 351 + 377 @@ -7774,11 +7778,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 346 + 372 libs/common/src/lib/routes/routes.ts - 349 + 375 @@ -7787,11 +7791,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 338 + 364 libs/common/src/lib/routes/routes.ts - 341 + 367 @@ -7831,7 +7835,7 @@ Voulez-vous vraiment supprimer la clé API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 148 + 151 @@ -7951,7 +7955,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 158 + 167 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7959,15 +7963,15 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 158 + 167 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 128 + 129 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 332 + 334 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -8015,7 +8019,7 @@ Veuillez saisir votre clé API Ghostfolio. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 167 + 170 @@ -8039,7 +8043,7 @@ Le lien a été copié dans le presse-papiers apps/client/src/app/components/access-table/access-table.component.ts - 161 + 137 @@ -8047,7 +8051,7 @@ Paresseux apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8055,7 +8059,7 @@ Instantané apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8063,7 +8067,7 @@ Prix du marché par défaut apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 644 + 645 @@ -8079,7 +8083,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 - 529 + 531 @@ -8095,7 +8099,7 @@ En-têtes de requête HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 657 + 658 @@ -8103,7 +8107,7 @@ fin de journée apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8111,7 +8115,7 @@ temps réel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8135,7 +8139,7 @@ Variation libs/ui/src/lib/holdings-table/holdings-table.component.html - 146 + 148 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8171,11 +8175,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 168 + 170 libs/ui/src/lib/holdings-table/holdings-table.component.html - 169 + 171 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8239,7 +8243,7 @@ Additional requests are granted while you are setting up your instance apps/client/src/app/components/admin-settings/admin-settings.component.ts - 87 + 88 @@ -8308,11 +8312,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 262 + 288 libs/common/src/lib/routes/routes.ts - 265 + 291 @@ -8324,7 +8328,7 @@ libs/common/src/lib/routes/routes.ts - 267 + 293 @@ -8340,7 +8344,7 @@ () est déjà utilisé. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 963 + 965 @@ -8348,7 +8352,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 - 807 + 809 @@ -8436,7 +8440,7 @@ libs/common/src/lib/routes/routes.ts - 140 + 166 @@ -8452,11 +8456,11 @@ {VAR_PLURAL, plural, =1 {Activity} other {Activities}} libs/ui/src/lib/activities-table/activities-table.component.html - 70 + 73 libs/ui/src/lib/activities-table/activities-table.component.html - 108 + 111 @@ -8481,11 +8485,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 230 + 256 libs/common/src/lib/routes/routes.ts - 233 + 259 @@ -8605,7 +8609,7 @@ Liens rapides libs/ui/src/lib/assistant/assistant.html - 58 + 59 @@ -8621,7 +8625,7 @@ libs/common/src/lib/routes/routes.ts - 281 + 307 @@ -8629,7 +8633,7 @@ Solutions open source alternatives à libs/common/src/lib/routes/routes.ts - 376 + 402 @@ -8662,15 +8666,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 362 + 388 libs/common/src/lib/routes/routes.ts - 365 + 391 libs/common/src/lib/routes/routes.ts - 373 + 399 @@ -8679,11 +8683,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 354 + 380 libs/common/src/lib/routes/routes.ts - 357 + 383 @@ -8763,7 +8767,7 @@ Mois en cours apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 @@ -8908,11 +8912,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 386 + 412 libs/common/src/lib/routes/routes.ts - 387 + 413 @@ -8944,7 +8948,7 @@ Actions apps/client/src/app/components/markets/markets.component.ts - 53 + 57 apps/client/src/app/pages/features/features-page.html @@ -8956,7 +8960,7 @@ Crypto-monnaies apps/client/src/app/components/markets/markets.component.ts - 54 + 58 apps/client/src/app/pages/features/features-page.html @@ -9084,7 +9088,7 @@ Aucun résultat trouvé... libs/ui/src/lib/assistant/assistant.html - 51 + 52 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 695acf32ea..dd5800f319 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -67,19 +67,19 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 7 + 10 libs/ui/src/lib/activities-table/activities-table.component.html - 204 + 207 Details Dettagli - apps/client/src/app/components/access-table/access-table.component.html - 49 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 137 @@ -87,7 +87,7 @@ Revoca apps/client/src/app/components/access-table/access-table.component.html - 138 + 100 @@ -111,7 +111,7 @@ Vuoi davvero revocare l’accesso concesso? apps/client/src/app/components/access-table/access-table.component.ts - 177 + 153 @@ -159,7 +159,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 182 + 185 libs/ui/src/lib/benchmark/benchmark.component.html @@ -219,15 +219,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 309 + 312 libs/ui/src/lib/activities-table/activities-table.component.html - 346 + 349 libs/ui/src/lib/holdings-table/holdings-table.component.html - 99 + 101 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -243,7 +243,7 @@ Modifica apps/client/src/app/components/access-table/access-table.component.html - 104 + 74 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -263,7 +263,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 510 + 513 @@ -271,7 +271,7 @@ Elimina apps/client/src/app/components/access-table/access-table.component.html - 135 + 97 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -283,7 +283,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 241 + 236 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -311,7 +311,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 545 + 548 libs/ui/src/lib/benchmark/benchmark.component.html @@ -323,7 +323,7 @@ Vuoi davvero eliminare questo account? libs/ui/src/lib/accounts-table/accounts-table.component.ts - 183 + 185 @@ -435,7 +435,7 @@ libs/ui/src/lib/assistant/assistant.html - 140 + 141 @@ -447,7 +447,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 496 @@ -463,7 +463,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 518 + 519 @@ -495,7 +495,7 @@ Trova un account... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 450 @@ -503,11 +503,11 @@ Data apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 527 + 528 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 566 + 567 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -519,7 +519,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 216 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -567,7 +567,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 52 @@ -671,7 +671,7 @@ Aggiorna account libs/common/src/lib/routes/routes.ts - 101 + 120 @@ -687,11 +687,11 @@ Aggiungi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 622 apps/client/src/app/components/admin-overview/admin-overview.html - 304 + 299 libs/ui/src/lib/account-balances/account-balances.component.html @@ -847,7 +847,7 @@ libs/common/src/lib/routes/routes.ts - 116 + 135 @@ -879,7 +879,7 @@ Rapporto di frazionamento apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 533 @@ -895,7 +895,7 @@ Si è verificato un errore durante l’unione di questo profilo di asset in (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 942 + 944 @@ -1019,7 +1019,7 @@ Prestazioni lorde assolute apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 80 + 88 @@ -1027,7 +1027,7 @@ Prestazioni nette assolute apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 114 + 122 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1039,7 +1039,7 @@ Prestazioni nette apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 129 + 137 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1051,7 +1051,7 @@ Asset totali apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 152 + 165 @@ -1059,7 +1059,7 @@ Potere d’acquisto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 292 + 305 @@ -1067,7 +1067,7 @@ Patrimonio netto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 378 + 391 @@ -1075,7 +1075,7 @@ Prestazioni annualizzate apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 393 + 406 @@ -1083,7 +1083,7 @@ Inserisci l’importo del tuo fondo di emergenza: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 160 + 169 @@ -1155,11 +1155,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 124 + 126 libs/ui/src/lib/holdings-table/holdings-table.component.html - 125 + 127 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -1179,7 +1179,7 @@ Mostra tutti libs/ui/src/lib/holdings-table/holdings-table.component.html - 216 + 222 @@ -1191,7 +1191,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 366 + 368 @@ -1199,11 +1199,11 @@ anno corrente apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -1211,11 +1211,11 @@ 1 anno apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -1231,11 +1231,11 @@ 5 anni apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -1251,19 +1251,11 @@ Massimo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 277 + 279 libs/ui/src/lib/assistant/assistant.component.ts - 416 - - - - Identifier has been copied to the clipboard - Identificativo copiato negli appunti - - apps/client/src/app/components/access-table/access-table.component.ts - 149 + 418 @@ -1275,7 +1267,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 194 + 198 @@ -1299,7 +1291,7 @@ libs/common/src/lib/routes/routes.ts - 270 + 296 @@ -1315,7 +1307,7 @@ libs/common/src/lib/routes/routes.ts - 259 + 285 @@ -1343,7 +1335,7 @@ Aggiungi account libs/common/src/lib/routes/routes.ts - 87 + 101 @@ -1483,7 +1475,7 @@ ID utente apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 116 + 113 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1575,11 +1567,11 @@ libs/common/src/lib/routes/routes.ts - 104 + 123 libs/ui/src/lib/assistant/assistant.html - 84 + 85 @@ -1635,7 +1627,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 329 + 332 @@ -1675,7 +1667,7 @@ ID account apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 108 + 109 @@ -1699,7 +1691,7 @@ libs/common/src/lib/routes/routes.ts - 78 + 92 @@ -1811,7 +1803,7 @@ libs/common/src/lib/routes/routes.ts - 275 + 301 @@ -1855,7 +1847,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 327 @@ -1883,7 +1875,7 @@ libs/common/src/lib/routes/routes.ts - 306 + 332 @@ -1919,11 +1911,11 @@ libs/common/src/lib/routes/routes.ts - 143 + 169 libs/common/src/lib/routes/routes.ts - 220 + 246 @@ -1955,15 +1947,15 @@ libs/common/src/lib/routes/routes.ts - 130 + 149 libs/common/src/lib/routes/routes.ts - 311 + 337 libs/common/src/lib/routes/routes.ts - 359 + 385 @@ -1979,7 +1971,7 @@ libs/common/src/lib/routes/routes.ts - 184 + 210 @@ -1987,7 +1979,7 @@ Per account apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 283 + 285 @@ -1995,7 +1987,7 @@ Per valuta apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 58 + 60 @@ -2003,7 +1995,7 @@ Per classe asset apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 80 + 82 @@ -2011,7 +2003,7 @@ Per partecipazione apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 102 + 104 @@ -2019,7 +2011,7 @@ Per settore apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 125 + 127 @@ -2027,7 +2019,7 @@ Per continente apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 148 + 150 @@ -2035,7 +2027,7 @@ Per paese apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 261 + 263 @@ -2043,7 +2035,7 @@ Regioni apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 193 + 195 apps/client/src/app/pages/public/public-page.html @@ -2067,7 +2059,7 @@ libs/common/src/lib/routes/routes.ts - 189 + 215 @@ -2123,7 +2115,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 196 apps/client/src/app/pages/public/public-page.html @@ -2131,15 +2123,15 @@ libs/common/src/lib/routes/routes.ts - 125 + 144 libs/common/src/lib/routes/routes.ts - 217 + 243 libs/ui/src/lib/assistant/assistant.html - 110 + 111 @@ -2155,7 +2147,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 @@ -2175,7 +2167,7 @@ Vendi apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 49 + 57 libs/ui/src/lib/i18n.ts @@ -2190,14 +2182,6 @@ 5 - - Copy identifier to clipboard - Copy identifier to clipboard - - apps/client/src/app/components/access-table/access-table.component.html - 120 - - Name, symbol or ISIN Nome, simbolo o ISIN @@ -2243,11 +2227,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 235 + 238 libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 76 @@ -2259,7 +2243,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 263 @@ -2275,7 +2259,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 251 + 252 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2283,7 +2267,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 396 + 399 @@ -2331,7 +2315,7 @@ libs/common/src/lib/routes/routes.ts - 179 + 205 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2343,7 +2327,7 @@ Importazione dei dati... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 176 @@ -2351,7 +2335,7 @@ L’importazione è stata completata apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 183 + 187 @@ -2391,7 +2375,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 347 @@ -2415,7 +2399,7 @@ libs/common/src/lib/routes/routes.ts - 202 + 228 @@ -2451,7 +2435,7 @@ libs/common/src/lib/routes/routes.ts - 331 + 357 @@ -2495,7 +2479,7 @@ libs/common/src/lib/routes/routes.ts - 382 + 408 @@ -2527,7 +2511,7 @@ Bozza libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/i18n.ts @@ -2543,11 +2527,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 31 libs/ui/src/lib/activities-table/activities-table.component.html - 432 + 435 @@ -2555,11 +2539,11 @@ Esporta le attività libs/ui/src/lib/activities-table/activities-table.component.html - 73 + 76 libs/ui/src/lib/activities-table/activities-table.component.html - 460 + 463 @@ -2567,11 +2551,11 @@ Esporta le bozze come ICS libs/ui/src/lib/activities-table/activities-table.component.html - 87 + 90 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 476 @@ -2579,7 +2563,7 @@ Clona libs/ui/src/lib/activities-table/activities-table.component.html - 521 + 524 @@ -2587,7 +2571,7 @@ Esporta la bozza come ICS libs/ui/src/lib/activities-table/activities-table.component.html - 533 + 536 @@ -2595,11 +2579,11 @@ Vuoi davvero eliminare questa attività? libs/ui/src/lib/activities-table/activities-table.component.ts - 343 + 326 libs/ui/src/lib/activities-table/activities-table.component.ts - 354 + 337 @@ -2675,7 +2659,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 195 @@ -2691,7 +2675,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 197 @@ -2707,7 +2691,7 @@ Mercati sviluppati apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 216 + 218 apps/client/src/app/pages/public/public-page.html @@ -2735,7 +2719,7 @@ Altri mercati apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 236 + 238 apps/client/src/app/pages/public/public-page.html @@ -2747,7 +2731,7 @@ Mercati emergenti apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 228 apps/client/src/app/pages/public/public-page.html @@ -2827,7 +2811,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 465 + 478 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2867,7 +2851,7 @@ Apply current market price apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 220 + 221 @@ -2891,7 +2875,7 @@ Paura apps/client/src/app/components/markets/markets.component.ts - 57 + 61 libs/ui/src/lib/i18n.ts @@ -2903,7 +2887,7 @@ Avidità apps/client/src/app/components/markets/markets.component.ts - 58 + 62 libs/ui/src/lib/i18n.ts @@ -2915,7 +2899,7 @@ Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 377 + 350 @@ -2963,11 +2947,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 728 + 730 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 731 + 733 @@ -2991,7 +2975,7 @@ Escluso dall’analisi apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 324 + 337 @@ -3087,15 +3071,15 @@ Account apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 102 + 109 libs/common/src/lib/routes/routes.ts - 94 + 108 libs/ui/src/lib/activities-table/activities-table.component.html - 362 + 365 libs/ui/src/lib/i18n.ts @@ -3123,7 +3107,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 266 + 268 libs/ui/src/lib/i18n.ts @@ -3167,7 +3151,7 @@ Export libs/ui/src/lib/activities-table/activities-table.component.html - 69 + 72 @@ -3187,7 +3171,7 @@ Contanti apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 274 @@ -3219,15 +3203,15 @@ Fondo di emergenza apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 229 + 242 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 320 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 412 + 425 apps/client/src/app/pages/features/features-page.html @@ -3251,7 +3235,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 460 + 462 @@ -3259,7 +3243,7 @@ Nessun dato disponibile apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 247 + 249 apps/client/src/app/pages/public/public-page.html @@ -3271,11 +3255,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 462 + 464 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 476 + 478 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3355,7 +3339,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 66 + 74 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -3403,7 +3387,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 - 809 + 811 @@ -3419,7 +3403,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 476 + 477 @@ -3467,7 +3451,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 479 + 492 apps/client/src/app/pages/features/features-page.html @@ -3515,7 +3499,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 287 libs/ui/src/lib/i18n.ts @@ -3535,7 +3519,7 @@ Convalida dei dati... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 294 + 298 @@ -3563,7 +3547,7 @@ libs/common/src/lib/routes/routes.ts - 65 + 79 @@ -3575,7 +3559,7 @@ libs/common/src/lib/routes/routes.ts - 75 + 89 @@ -3583,7 +3567,7 @@ This action cannot be undone. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 961 + 963 @@ -3603,7 +3587,7 @@ libs/common/src/lib/routes/routes.ts - 135 + 154 @@ -3643,11 +3627,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 54 + 57 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -3699,7 +3683,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 148 + 138 @@ -3747,7 +3731,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 214 + 227 @@ -3891,7 +3875,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 249 + 251 @@ -4003,11 +3987,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 762 + 764 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 765 + 767 @@ -4027,7 +4011,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 94 + 102 @@ -4102,6 +4086,14 @@ 18 + + Add to Watchlist + Add to Watchlist + + libs/common/src/lib/routes/routes.ts + 163 + + Market data provided by Dati del mercato forniti da @@ -4123,7 +4115,7 @@ This asset profile cannot be merged into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 920 + 922 @@ -4175,7 +4167,7 @@ Do you really want to remove this received access? apps/client/src/app/components/access-table/access-table.component.ts - 176 + 152 @@ -4191,7 +4183,7 @@ Per fornitore di ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 303 + 305 @@ -4215,7 +4207,7 @@ The data of this asset profile is moved to () and this asset profile is deleted. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 959 + 961 @@ -4231,7 +4223,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 @@ -4283,7 +4275,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 752 + 754 @@ -4315,7 +4307,7 @@ Per piattaforma apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 39 + 41 @@ -4355,7 +4347,7 @@ libs/common/src/lib/routes/routes.ts - 70 + 84 @@ -4411,7 +4403,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 590 + 591 @@ -4495,7 +4487,7 @@ Passività apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 355 + 368 apps/client/src/app/pages/features/features-page.html @@ -4515,7 +4507,7 @@ libs/common/src/lib/routes/routes.ts - 235 + 261 @@ -4531,7 +4523,7 @@ libs/common/src/lib/routes/routes.ts - 243 + 269 @@ -4651,7 +4643,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 176 + 202 @@ -4683,7 +4675,7 @@ Configurazione dello scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 635 @@ -4693,6 +4685,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 69 + Personal Finance Tools @@ -4703,7 +4699,7 @@ libs/common/src/lib/routes/routes.ts - 379 + 405 @@ -4931,7 +4927,7 @@ Compra apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 35 + 43 libs/ui/src/lib/i18n.ts @@ -4959,7 +4955,7 @@ ETF senza paesi apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 138 + 128 @@ -4967,7 +4963,7 @@ ETF senza settori apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 143 + 133 @@ -4975,7 +4971,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 - 526 + 528 @@ -4999,7 +4995,7 @@ Per mercato apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 170 + 172 @@ -5195,7 +5191,7 @@ Valute apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 133 + 123 apps/client/src/app/pages/public/public-page.html @@ -5247,11 +5243,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 676 + 678 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 679 + 681 @@ -5391,7 +5387,7 @@ Do you really want to delete these activities? libs/ui/src/lib/activities-table/activities-table.component.ts - 344 + 327 @@ -5495,7 +5491,7 @@ Oops! Could not delete the asset profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 54 + 60 @@ -5551,7 +5547,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 169 + 195 @@ -5600,19 +5596,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 284 + 310 libs/common/src/lib/routes/routes.ts - 285 + 311 libs/common/src/lib/routes/routes.ts - 289 + 315 libs/common/src/lib/routes/routes.ts - 295 + 321 @@ -5621,11 +5617,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 330 libs/common/src/lib/routes/routes.ts - 305 + 331 @@ -5634,31 +5630,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 226 + 252 libs/common/src/lib/routes/routes.ts - 227 + 253 libs/common/src/lib/routes/routes.ts - 232 + 258 libs/common/src/lib/routes/routes.ts - 240 + 266 libs/common/src/lib/routes/routes.ts - 248 + 274 libs/common/src/lib/routes/routes.ts - 256 + 282 libs/common/src/lib/routes/routes.ts - 264 + 290 @@ -5667,11 +5663,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 280 libs/common/src/lib/routes/routes.ts - 257 + 283 @@ -5680,11 +5676,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 238 + 264 libs/common/src/lib/routes/routes.ts - 241 + 267 @@ -5693,11 +5689,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 309 + 335 libs/common/src/lib/routes/routes.ts - 310 + 336 @@ -5706,11 +5702,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 319 + 345 libs/common/src/lib/routes/routes.ts - 320 + 346 @@ -5719,11 +5715,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 329 + 355 libs/common/src/lib/routes/routes.ts - 330 + 356 @@ -5732,31 +5728,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 334 + 360 libs/common/src/lib/routes/routes.ts - 335 + 361 libs/common/src/lib/routes/routes.ts - 340 + 366 libs/common/src/lib/routes/routes.ts - 348 + 374 libs/common/src/lib/routes/routes.ts - 356 + 382 libs/common/src/lib/routes/routes.ts - 364 + 390 libs/common/src/lib/routes/routes.ts - 372 + 398 @@ -5829,11 +5825,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 370 + 396 libs/common/src/lib/routes/routes.ts - 374 + 400 @@ -5865,7 +5861,7 @@ Data gathering has been started. apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 413 + 386 @@ -5901,7 +5897,7 @@ Do you really want to merge this asset profile into it? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 965 + 967 @@ -5985,11 +5981,11 @@ Commissione apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 238 + 239 libs/ui/src/lib/activities-table/activities-table.component.html - 285 + 288 libs/ui/src/lib/i18n.ts @@ -6043,6 +6039,10 @@ apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 113 + libs/ui/src/lib/accounts-table/accounts-table.component.html 10 @@ -6119,17 +6119,21 @@ apps/client/src/app/components/admin-jobs/admin-jobs.html 52 + + libs/common/src/lib/routes/routes.ts + 76 + Do you really want to delete this asset profile? Vuoi veramente eliminare il profilo di questo asset? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 27 + 33 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 69 + 75 @@ -6336,8 +6340,8 @@ Oops, cash balance transfer has failed. Ops, il trasferimento del saldo di cassa è fallito. - apps/client/src/app/pages/accounts/accounts-page.component.ts - 199 + apps/client/src/app/pages/accounts/account-dialog-host/account-dialog-host.component.ts + 365 @@ -6393,7 +6397,7 @@ Portfolio Filters apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 128 + 125 @@ -6453,7 +6457,7 @@ L’attuale prezzo di mercato è apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 854 + 856 @@ -6469,7 +6473,7 @@ Intervallo di date libs/ui/src/lib/assistant/assistant.html - 170 + 171 @@ -6497,7 +6501,7 @@ Ops! Impossibile abilitare l’accesso. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 256 + 314 @@ -6593,7 +6597,7 @@ Da inizio settimana libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6601,11 +6605,11 @@ Settimana corrente apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6613,7 +6617,7 @@ Da inizio mese libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6621,11 +6625,11 @@ Mese corrente apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6641,7 +6645,7 @@ Da inizio anno libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -6673,7 +6677,7 @@ Reset Filtri libs/ui/src/lib/assistant/assistant.html - 204 + 205 @@ -6681,7 +6685,7 @@ anno apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6693,7 +6697,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -6701,11 +6705,11 @@ anni apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -6713,7 +6717,7 @@ Applica i Filtri libs/ui/src/lib/assistant/assistant.html - 217 + 218 @@ -6733,7 +6737,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 451 @@ -6753,7 +6757,7 @@ libs/common/src/lib/routes/routes.ts - 290 + 316 @@ -6765,7 +6769,7 @@ libs/common/src/lib/routes/routes.ts - 298 + 324 @@ -6774,11 +6778,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 293 + 319 libs/common/src/lib/routes/routes.ts - 296 + 322 @@ -6786,7 +6790,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 245 + 247 @@ -6810,7 +6814,7 @@ Attivo apps/client/src/app/components/home-holdings/home-holdings.component.ts - 73 + 77 @@ -6818,7 +6822,7 @@ Chiuso apps/client/src/app/components/home-holdings/home-holdings.component.ts - 74 + 78 @@ -6870,7 +6874,7 @@ {VAR_PLURAL, plural, =1 {attività} other {attività}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 18 + 25 @@ -6886,7 +6890,7 @@ Elimina le attività libs/ui/src/lib/activities-table/activities-table.component.html - 111 + 114 @@ -6894,7 +6898,7 @@ Internazionalizzazione libs/common/src/lib/routes/routes.ts - 149 + 175 @@ -6910,7 +6914,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 450 + 452 @@ -6934,7 +6938,7 @@ Per ETF posseduti apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 328 + 330 @@ -6942,7 +6946,7 @@ Approssimato in base ai principali ETF posseduti apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 335 + 337 @@ -6958,7 +6962,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 164 + 190 @@ -6998,7 +7002,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 118 @@ -7006,7 +7010,7 @@ Tabella apps/client/src/app/components/home-holdings/home-holdings.component.ts - 62 + 66 @@ -7014,7 +7018,7 @@ Grafico apps/client/src/app/components/home-holdings/home-holdings.component.ts - 67 + 71 @@ -7122,7 +7126,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 53 + 59 @@ -7226,7 +7230,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 499 + 502 @@ -7234,7 +7238,7 @@ Do you really want to delete these asset profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 70 + 76 @@ -7242,15 +7246,15 @@ Errore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 844 + 846 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 921 + 923 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 943 + 945 @@ -7274,7 +7278,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 354 + 414 @@ -7314,11 +7318,11 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 143 + 152 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 117 + 118 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7326,7 +7330,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 321 + 323 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -7370,7 +7374,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 145 + 154 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7382,11 +7386,11 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 119 + 120 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 323 + 325 libs/ui/src/lib/i18n.ts @@ -7414,7 +7418,7 @@ Copia link negli appunti apps/client/src/app/components/access-table/access-table.component.html - 112 + 82 @@ -7602,7 +7606,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 107 + 110 @@ -7634,7 +7638,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 603 + 604 @@ -7694,7 +7698,7 @@ Oops! Non ho trovato alcun asset. libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html - 43 + 44 @@ -7750,7 +7754,7 @@ libs/common/src/lib/routes/routes.ts - 343 + 369 @@ -7766,7 +7770,7 @@ libs/common/src/lib/routes/routes.ts - 351 + 377 @@ -7775,11 +7779,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 346 + 372 libs/common/src/lib/routes/routes.ts - 349 + 375 @@ -7788,11 +7792,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 338 + 364 libs/common/src/lib/routes/routes.ts - 341 + 367 @@ -7832,7 +7836,7 @@ Vuoi davvero eliminare l’API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 148 + 151 @@ -7952,7 +7956,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 158 + 167 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7960,15 +7964,15 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 158 + 167 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 128 + 129 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 332 + 334 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -8016,7 +8020,7 @@ Inserisci la tua API key di Ghostfolio. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 167 + 170 @@ -8040,7 +8044,7 @@ Il link è stato copiato negli appunti apps/client/src/app/components/access-table/access-table.component.ts - 161 + 137 @@ -8048,7 +8052,7 @@ Pigro apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8056,7 +8060,7 @@ Istantaneo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8064,7 +8068,7 @@ Prezzo di mercato predefinito apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 644 + 645 @@ -8080,7 +8084,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 - 529 + 531 @@ -8096,7 +8100,7 @@ Intestazioni della richiesta HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 657 + 658 @@ -8104,7 +8108,7 @@ fine giornata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8112,7 +8116,7 @@ in tempo reale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8136,7 +8140,7 @@ Cambia libs/ui/src/lib/holdings-table/holdings-table.component.html - 146 + 148 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8172,11 +8176,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 168 + 170 libs/ui/src/lib/holdings-table/holdings-table.component.html - 169 + 171 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8240,7 +8244,7 @@ Additional requests are granted while you are setting up your instance apps/client/src/app/components/admin-settings/admin-settings.component.ts - 87 + 88 @@ -8309,11 +8313,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 262 + 288 libs/common/src/lib/routes/routes.ts - 265 + 291 @@ -8325,7 +8329,7 @@ libs/common/src/lib/routes/routes.ts - 267 + 293 @@ -8341,7 +8345,7 @@ () e gia in uso. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 963 + 965 @@ -8349,7 +8353,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 - 807 + 809 @@ -8437,7 +8441,7 @@ libs/common/src/lib/routes/routes.ts - 140 + 166 @@ -8453,11 +8457,11 @@ {VAR_PLURAL, plural, =1 {Activity} other {Activities}} libs/ui/src/lib/activities-table/activities-table.component.html - 70 + 73 libs/ui/src/lib/activities-table/activities-table.component.html - 108 + 111 @@ -8482,11 +8486,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 230 + 256 libs/common/src/lib/routes/routes.ts - 233 + 259 @@ -8606,7 +8610,7 @@ Collegamenti rapidi libs/ui/src/lib/assistant/assistant.html - 58 + 59 @@ -8622,7 +8626,7 @@ libs/common/src/lib/routes/routes.ts - 281 + 307 @@ -8630,7 +8634,7 @@ L’alternativa open source a libs/common/src/lib/routes/routes.ts - 376 + 402 @@ -8663,15 +8667,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 362 + 388 libs/common/src/lib/routes/routes.ts - 365 + 391 libs/common/src/lib/routes/routes.ts - 373 + 399 @@ -8680,11 +8684,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 354 + 380 libs/common/src/lib/routes/routes.ts - 357 + 383 @@ -8764,7 +8768,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 @@ -8909,11 +8913,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 386 + 412 libs/common/src/lib/routes/routes.ts - 387 + 413 @@ -8945,7 +8949,7 @@ Azioni apps/client/src/app/components/markets/markets.component.ts - 53 + 57 apps/client/src/app/pages/features/features-page.html @@ -8957,7 +8961,7 @@ criptovalute apps/client/src/app/components/markets/markets.component.ts - 54 + 58 apps/client/src/app/pages/features/features-page.html @@ -9085,7 +9089,7 @@ No results found... libs/ui/src/lib/assistant/assistant.html - 51 + 52 diff --git a/apps/client/src/locales/messages.ja.xlf b/apps/client/src/locales/messages.ja.xlf index e4d8603239..dd10a3f8e6 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 - 226 + 252 libs/common/src/lib/routes/routes.ts - 227 + 253 libs/common/src/lib/routes/routes.ts - 232 + 258 libs/common/src/lib/routes/routes.ts - 240 + 266 libs/common/src/lib/routes/routes.ts - 248 + 274 libs/common/src/lib/routes/routes.ts - 256 + 282 libs/common/src/lib/routes/routes.ts - 264 + 290 @@ -41,19 +41,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 284 + 310 libs/common/src/lib/routes/routes.ts - 285 + 311 libs/common/src/lib/routes/routes.ts - 289 + 315 libs/common/src/lib/routes/routes.ts - 295 + 321 @@ -62,11 +62,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 330 libs/common/src/lib/routes/routes.ts - 305 + 331 @@ -75,11 +75,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 238 + 264 libs/common/src/lib/routes/routes.ts - 241 + 267 @@ -88,11 +88,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 309 + 335 libs/common/src/lib/routes/routes.ts - 310 + 336 @@ -101,11 +101,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 319 + 345 libs/common/src/lib/routes/routes.ts - 320 + 346 @@ -114,11 +114,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 280 libs/common/src/lib/routes/routes.ts - 257 + 283 @@ -127,11 +127,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 329 + 355 libs/common/src/lib/routes/routes.ts - 330 + 356 @@ -140,31 +140,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 334 + 360 libs/common/src/lib/routes/routes.ts - 335 + 361 libs/common/src/lib/routes/routes.ts - 340 + 366 libs/common/src/lib/routes/routes.ts - 348 + 374 libs/common/src/lib/routes/routes.ts - 356 + 382 libs/common/src/lib/routes/routes.ts - 364 + 390 libs/common/src/lib/routes/routes.ts - 372 + 398 @@ -268,19 +268,19 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 7 + 10 libs/ui/src/lib/activities-table/activities-table.component.html - 204 + 207 Details 詳細 - apps/client/src/app/components/access-table/access-table.component.html - 49 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 137 @@ -288,7 +288,7 @@ 取り消し apps/client/src/app/components/access-table/access-table.component.html - 138 + 100 @@ -312,7 +312,7 @@ 付与したアクセス権を取り消してもよろしいですか? apps/client/src/app/components/access-table/access-table.component.ts - 177 + 153 @@ -362,6 +362,10 @@ apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 113 + libs/ui/src/lib/accounts-table/accounts-table.component.html 10 @@ -412,7 +416,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 182 + 185 libs/ui/src/lib/benchmark/benchmark.component.html @@ -476,7 +480,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 329 + 332 @@ -512,15 +516,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 309 + 312 libs/ui/src/lib/activities-table/activities-table.component.html - 346 + 349 libs/ui/src/lib/holdings-table/holdings-table.component.html - 99 + 101 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -536,7 +540,7 @@ 編集 apps/client/src/app/components/access-table/access-table.component.html - 104 + 74 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -556,7 +560,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 510 + 513 @@ -564,7 +568,7 @@ 削除 apps/client/src/app/components/access-table/access-table.component.html - 135 + 97 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -576,7 +580,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 241 + 236 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -604,7 +608,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 545 + 548 libs/ui/src/lib/benchmark/benchmark.component.html @@ -616,7 +620,7 @@ このアカウントを削除してもよろしいですか? libs/ui/src/lib/accounts-table/accounts-table.component.ts - 183 + 185 @@ -634,6 +638,10 @@ apps/client/src/app/components/admin-jobs/admin-jobs.html 52 + + libs/common/src/lib/routes/routes.ts + 76 + Historical Market Data @@ -644,7 +652,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 496 @@ -752,7 +760,7 @@ 株式分割 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 518 + 519 @@ -784,7 +792,7 @@ アカウントを検索... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 450 @@ -792,11 +800,11 @@ 日付 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 527 + 528 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 566 + 567 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -808,7 +816,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 216 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -844,7 +852,7 @@ 通貨 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 133 + 123 apps/client/src/app/pages/public/public-page.html @@ -864,7 +872,7 @@ 国に縛られないETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 138 + 128 @@ -872,7 +880,7 @@ セクター別ではないETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 143 + 133 @@ -880,7 +888,7 @@ データソースを に変換中にエラーが発生しました。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 526 + 528 @@ -888,11 +896,11 @@ この資産プロファイルを削除してもよろしいですか? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 27 + 33 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 69 + 75 @@ -900,7 +908,7 @@ 絞り込み... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 377 + 350 @@ -920,7 +928,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 52 @@ -936,7 +944,7 @@ データ収集頻度 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 476 + 477 @@ -972,7 +980,7 @@ 現在の市場価格を適用 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 220 + 221 @@ -1156,7 +1164,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 176 + 202 @@ -1188,7 +1196,7 @@ スクレイパーの設定 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 635 @@ -1204,7 +1212,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 251 + 252 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -1212,7 +1220,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 396 + 399 @@ -1222,6 +1230,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 69 + Search @@ -1247,14 +1259,6 @@ 18 - - Copy identifier to clipboard - Copy identifier to clipboard - - apps/client/src/app/components/access-table/access-table.component.html - 120 - - Name, symbol or ISIN 名称、シンボル、またはISIN @@ -1360,7 +1364,7 @@ Update Account libs/common/src/lib/routes/routes.ts - 101 + 120 @@ -1400,11 +1404,11 @@ 追加 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 622 apps/client/src/app/components/admin-overview/admin-overview.html - 304 + 299 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1468,7 +1472,7 @@ 資産プロファイルを保存しました apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 752 + 754 @@ -1500,7 +1504,7 @@ The data of this asset profile is moved to () and this asset profile is deleted. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 959 + 961 @@ -1516,7 +1520,7 @@ 現在の年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 @@ -1656,11 +1660,11 @@ フォームを検証できませんでした apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 728 + 730 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 731 + 733 @@ -1700,7 +1704,7 @@ libs/common/src/lib/routes/routes.ts - 202 + 228 @@ -1752,7 +1756,7 @@ libs/common/src/lib/routes/routes.ts - 116 + 135 @@ -1784,7 +1788,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 533 @@ -1792,7 +1796,7 @@ 恐怖 apps/client/src/app/components/markets/markets.component.ts - 57 + 61 libs/ui/src/lib/i18n.ts @@ -1804,7 +1808,7 @@ Greed apps/client/src/app/components/markets/markets.component.ts - 58 + 62 libs/ui/src/lib/i18n.ts @@ -1824,7 +1828,7 @@ An error occurred while merging this asset profile into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 942 + 944 @@ -1920,7 +1924,7 @@ 今週 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 @@ -2072,7 +2076,7 @@ 絶対グロス・パフォーマンス apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 80 + 88 @@ -2084,7 +2088,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 94 + 102 @@ -2092,7 +2096,7 @@ 実質純パフォーマンス apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 114 + 122 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -2104,7 +2108,7 @@ 純パフォーマンス apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 129 + 137 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -2116,7 +2120,7 @@ 総資産 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 152 + 165 @@ -2124,7 +2128,7 @@ 購買力 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 292 + 305 @@ -2132,7 +2136,7 @@ 分析から除外 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 324 + 337 @@ -2140,7 +2144,7 @@ 負債 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 355 + 368 apps/client/src/app/pages/features/features-page.html @@ -2152,7 +2156,7 @@ 純資産(ネットワース) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 378 + 391 @@ -2160,7 +2164,7 @@ 年率換算パフォーマンス apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 393 + 406 @@ -2168,7 +2172,7 @@ 緊急用資金の金額を設定してください。 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 160 + 169 @@ -2204,11 +2208,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 235 + 238 libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 76 @@ -2396,7 +2400,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 366 + 368 @@ -2404,11 +2408,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -2416,11 +2420,11 @@ 1年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -2436,11 +2440,11 @@ 5年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -2456,19 +2460,11 @@ マックス apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 277 + 279 libs/ui/src/lib/assistant/assistant.component.ts - 416 - - - - Identifier has been copied to the clipboard - Identifier has been copied to the clipboard - - apps/client/src/app/components/access-table/access-table.component.ts - 149 + 418 @@ -2528,7 +2524,7 @@ Add Account libs/common/src/lib/routes/routes.ts - 87 + 101 @@ -2740,7 +2736,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 214 + 227 @@ -2780,7 +2776,7 @@ ユーザーID apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 116 + 113 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2820,7 +2816,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 197 @@ -2832,7 +2828,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 195 @@ -2844,7 +2840,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 194 + 198 @@ -2868,7 +2864,7 @@ libs/common/src/lib/routes/routes.ts - 270 + 296 @@ -2884,7 +2880,7 @@ libs/common/src/lib/routes/routes.ts - 235 + 261 @@ -2900,7 +2896,7 @@ libs/common/src/lib/routes/routes.ts - 243 + 269 @@ -2916,7 +2912,7 @@ libs/common/src/lib/routes/routes.ts - 259 + 285 @@ -2988,19 +2984,19 @@ libs/common/src/lib/routes/routes.ts - 104 + 123 libs/ui/src/lib/assistant/assistant.html - 84 + 85 Oops, cash balance transfer has failed. おっと、現金残高の振替に失敗しました。 - apps/client/src/app/pages/accounts/accounts-page.component.ts - 199 + apps/client/src/app/pages/accounts/account-dialog-host/account-dialog-host.component.ts + 365 @@ -3024,7 +3020,7 @@ 口座ID apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 108 + 109 @@ -3072,7 +3068,7 @@ libs/common/src/lib/routes/routes.ts - 78 + 92 @@ -3084,7 +3080,7 @@ libs/common/src/lib/routes/routes.ts - 65 + 79 @@ -3100,7 +3096,7 @@ libs/common/src/lib/routes/routes.ts - 70 + 84 @@ -3112,7 +3108,7 @@ libs/common/src/lib/routes/routes.ts - 75 + 89 @@ -3148,11 +3144,11 @@ libs/common/src/lib/routes/routes.ts - 143 + 169 libs/common/src/lib/routes/routes.ts - 220 + 246 @@ -3264,7 +3260,7 @@ libs/common/src/lib/routes/routes.ts - 275 + 301 @@ -3272,11 +3268,11 @@ スクレイパー設定を解析できませんでした apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 676 + 678 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 679 + 681 @@ -3328,7 +3324,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 327 @@ -3356,7 +3352,7 @@ libs/common/src/lib/routes/routes.ts - 306 + 332 @@ -3528,7 +3524,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 196 apps/client/src/app/pages/public/public-page.html @@ -3536,15 +3532,15 @@ libs/common/src/lib/routes/routes.ts - 125 + 144 libs/common/src/lib/routes/routes.ts - 217 + 243 libs/ui/src/lib/assistant/assistant.html - 110 + 111 @@ -3552,7 +3548,7 @@ This action cannot be undone. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 961 + 963 @@ -3572,7 +3568,7 @@ libs/common/src/lib/routes/routes.ts - 135 + 154 @@ -3604,15 +3600,15 @@ libs/common/src/lib/routes/routes.ts - 130 + 149 libs/common/src/lib/routes/routes.ts - 311 + 337 libs/common/src/lib/routes/routes.ts - 359 + 385 @@ -3928,7 +3924,7 @@ Do you really want to delete these activities? libs/ui/src/lib/activities-table/activities-table.component.ts - 344 + 327 @@ -4040,7 +4036,7 @@ おっと!資産プロファイルを削除できませんでした。 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 54 + 60 @@ -4112,7 +4108,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 169 + 195 @@ -4160,7 +4156,7 @@ Do you really want to merge this asset profile into it? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 965 + 967 @@ -4304,7 +4300,7 @@ libs/common/src/lib/routes/routes.ts - 179 + 205 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -4388,7 +4384,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 263 @@ -4400,11 +4396,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 31 libs/ui/src/lib/activities-table/activities-table.component.html - 432 + 435 @@ -4416,11 +4412,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 54 + 57 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -4428,7 +4424,7 @@ データをインポート中... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 176 @@ -4436,7 +4432,7 @@ インポートが完了しました apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 183 + 187 @@ -4452,7 +4448,7 @@ データを検証中... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 294 + 298 @@ -4528,7 +4524,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 590 + 591 @@ -4556,7 +4552,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 - 809 + 811 @@ -4572,7 +4568,7 @@ libs/common/src/lib/routes/routes.ts - 184 + 210 @@ -4588,7 +4584,7 @@ プラットフォーム別 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 39 + 41 @@ -4596,7 +4592,7 @@ 通貨別 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 58 + 60 @@ -4604,7 +4600,7 @@ 資産クラス別 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 80 + 82 @@ -4612,7 +4608,7 @@ 保有資産別 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 102 + 104 @@ -4620,7 +4616,7 @@ セクター別 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 125 + 127 @@ -4628,7 +4624,7 @@ 大陸別 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 148 + 150 @@ -4636,7 +4632,7 @@ 市場別 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 170 + 172 @@ -4644,7 +4640,7 @@ 地域 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 193 + 195 apps/client/src/app/pages/public/public-page.html @@ -4672,7 +4668,7 @@ 先進国市場 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 216 + 218 apps/client/src/app/pages/public/public-page.html @@ -4692,7 +4688,7 @@ 新興国市場 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 228 apps/client/src/app/pages/public/public-page.html @@ -4704,7 +4700,7 @@ その他の市場 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 236 + 238 apps/client/src/app/pages/public/public-page.html @@ -4716,7 +4712,7 @@ 口座別 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 283 + 285 @@ -4724,7 +4720,7 @@ ETFプロバイダー別 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 303 + 305 @@ -4732,7 +4728,7 @@ 国別 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 261 + 263 @@ -4744,7 +4740,7 @@ libs/common/src/lib/routes/routes.ts - 189 + 215 @@ -4768,7 +4764,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 479 + 492 apps/client/src/app/pages/features/features-page.html @@ -4912,7 +4908,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 347 @@ -4936,7 +4932,7 @@ Do you really want to remove this received access? apps/client/src/app/components/access-table/access-table.component.ts - 176 + 152 @@ -4960,7 +4956,7 @@ 時間ごと apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 249 + 251 @@ -5116,11 +5112,11 @@ 資産プロフィールを保存できませんでした apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 762 + 764 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 765 + 767 @@ -5172,7 +5168,7 @@ libs/common/src/lib/routes/routes.ts - 331 + 357 @@ -5204,7 +5200,7 @@ libs/common/src/lib/routes/routes.ts - 379 + 405 @@ -5213,11 +5209,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 370 + 396 libs/common/src/lib/routes/routes.ts - 374 + 400 @@ -5517,7 +5513,7 @@ Data gathering has been started. apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 413 + 386 @@ -5553,7 +5549,7 @@ libs/common/src/lib/routes/routes.ts - 382 + 408 @@ -5637,11 +5633,11 @@ アクティビティをエクスポート libs/ui/src/lib/activities-table/activities-table.component.html - 73 + 76 libs/ui/src/lib/activities-table/activities-table.component.html - 460 + 463 @@ -5649,11 +5645,11 @@ ドラフトをICSとしてエクスポート libs/ui/src/lib/activities-table/activities-table.component.html - 87 + 90 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 476 @@ -5661,7 +5657,7 @@ ドラフト libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/i18n.ts @@ -5673,7 +5669,7 @@ クローン libs/ui/src/lib/activities-table/activities-table.component.html - 521 + 524 @@ -5681,7 +5677,7 @@ ドラフトをICSとしてエクスポート libs/ui/src/lib/activities-table/activities-table.component.html - 533 + 536 @@ -5689,11 +5685,11 @@ 本当にこのアクティビティを削除したいですか? libs/ui/src/lib/activities-table/activities-table.component.ts - 343 + 326 libs/ui/src/lib/activities-table/activities-table.component.ts - 354 + 337 @@ -5705,7 +5701,7 @@ libs/ui/src/lib/assistant/assistant.html - 140 + 141 @@ -5713,7 +5709,7 @@ ポートフォリオフィルター apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 128 + 125 @@ -5772,6 +5768,14 @@ 286 + + Add to Watchlist + Add to Watchlist + + libs/common/src/lib/routes/routes.ts + 163 + + Market data provided by 市場データの提供元 @@ -5809,7 +5813,7 @@ This asset profile cannot be merged into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 920 + 922 @@ -5829,7 +5833,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 465 + 478 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5857,11 +5861,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 124 + 126 libs/ui/src/lib/holdings-table/holdings-table.component.html - 125 + 127 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5881,7 +5885,7 @@ すべて表示 libs/ui/src/lib/holdings-table/holdings-table.component.html - 216 + 222 @@ -5889,15 +5893,15 @@ 口座 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 102 + 109 libs/common/src/lib/routes/routes.ts - 94 + 108 libs/ui/src/lib/activities-table/activities-table.component.html - 362 + 365 libs/ui/src/lib/i18n.ts @@ -5933,7 +5937,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 266 + 268 libs/ui/src/lib/i18n.ts @@ -5965,7 +5969,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 287 libs/ui/src/lib/i18n.ts @@ -6001,15 +6005,15 @@ 緊急資金 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 229 + 242 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 320 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 412 + 425 apps/client/src/app/pages/features/features-page.html @@ -6081,7 +6085,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 460 + 462 @@ -6105,7 +6109,7 @@ アクティビティなし apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 148 + 138 @@ -6157,7 +6161,7 @@ Export libs/ui/src/lib/activities-table/activities-table.component.html - 69 + 72 @@ -6213,7 +6217,7 @@ 買い apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 35 + 43 libs/ui/src/lib/i18n.ts @@ -6225,11 +6229,11 @@ 手数料 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 238 + 239 libs/ui/src/lib/activities-table/activities-table.component.html - 285 + 288 libs/ui/src/lib/i18n.ts @@ -6257,7 +6261,7 @@ 売る apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 49 + 57 libs/ui/src/lib/i18n.ts @@ -6277,7 +6281,7 @@ 現金 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 274 @@ -6377,7 +6381,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 66 + 74 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -6441,7 +6445,7 @@ データがありません apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 247 + 249 apps/client/src/app/pages/public/public-page.html @@ -6453,11 +6457,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 462 + 464 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 476 + 478 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6477,7 +6481,7 @@ 日付範囲 libs/ui/src/lib/assistant/assistant.html - 170 + 171 @@ -6485,7 +6489,7 @@ 現在の市場価格は apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 854 + 856 @@ -6501,7 +6505,7 @@ おっと!アクセスを許可できませんでした。 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 256 + 314 @@ -6617,7 +6621,7 @@ 年初来 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -6625,7 +6629,7 @@ 週初来 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6633,7 +6637,7 @@ 月初来 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6641,11 +6645,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6661,11 +6665,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6697,7 +6701,7 @@ フィルターをリセット libs/ui/src/lib/assistant/assistant.html - 204 + 205 @@ -6705,7 +6709,7 @@ 年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6717,7 +6721,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -6725,11 +6729,11 @@ 年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -6737,7 +6741,7 @@ フィルターを適用 libs/ui/src/lib/assistant/assistant.html - 217 + 218 @@ -6746,11 +6750,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 293 + 319 libs/common/src/lib/routes/routes.ts - 296 + 322 @@ -6762,7 +6766,7 @@ libs/common/src/lib/routes/routes.ts - 298 + 324 @@ -6782,7 +6786,7 @@ 保有資産を検索... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 451 @@ -6802,7 +6806,7 @@ libs/common/src/lib/routes/routes.ts - 290 + 316 @@ -6810,7 +6814,7 @@ 毎日 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 245 + 247 @@ -6834,7 +6838,7 @@ クローズ済み apps/client/src/app/components/home-holdings/home-holdings.component.ts - 74 + 78 @@ -6842,7 +6846,7 @@ アクティブ apps/client/src/app/components/home-holdings/home-holdings.component.ts - 73 + 77 @@ -6902,7 +6906,7 @@ {VAR_PLURAL, plural, =1 {アクティビティ} other {アクティビティ}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 18 + 25 @@ -6910,7 +6914,7 @@ アクティビティを削除する libs/ui/src/lib/activities-table/activities-table.component.html - 111 + 114 @@ -6918,7 +6922,7 @@ 国際化 libs/common/src/lib/routes/routes.ts - 149 + 175 @@ -6942,7 +6946,7 @@ ページにジャンプ... libs/ui/src/lib/assistant/assistant.component.ts - 450 + 452 @@ -6958,7 +6962,7 @@ Approximation based on the top holdings of each ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 335 + 337 @@ -6966,7 +6970,7 @@ By ETF Holding apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 328 + 330 @@ -6982,7 +6986,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 164 + 190 @@ -7022,7 +7026,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 118 @@ -7030,7 +7034,7 @@ Chart apps/client/src/app/components/home-holdings/home-holdings.component.ts - 67 + 71 @@ -7038,7 +7042,7 @@ Table apps/client/src/app/components/home-holdings/home-holdings.component.ts - 62 + 66 @@ -7130,7 +7134,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 53 + 59 @@ -7186,7 +7190,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 499 + 502 @@ -7258,7 +7262,7 @@ Do you really want to delete these asset profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 70 + 76 @@ -7266,15 +7270,15 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 844 + 846 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 921 + 923 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 943 + 945 @@ -7306,11 +7310,11 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 143 + 152 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 117 + 118 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7318,7 +7322,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 321 + 323 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -7386,7 +7390,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 145 + 154 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7398,11 +7402,11 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 119 + 120 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 323 + 325 libs/ui/src/lib/i18n.ts @@ -7422,7 +7426,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 354 + 414 @@ -7494,7 +7498,7 @@ Copy link to clipboard apps/client/src/app/components/access-table/access-table.component.html - 112 + 82 @@ -7626,7 +7630,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 107 + 110 @@ -7658,7 +7662,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 603 + 604 @@ -7718,7 +7722,7 @@ Oops! Could not find any assets. libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html - 43 + 44 @@ -7774,7 +7778,7 @@ libs/common/src/lib/routes/routes.ts - 343 + 369 @@ -7783,11 +7787,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 338 + 364 libs/common/src/lib/routes/routes.ts - 341 + 367 @@ -7803,7 +7807,7 @@ libs/common/src/lib/routes/routes.ts - 351 + 377 @@ -7812,11 +7816,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 346 + 372 libs/common/src/lib/routes/routes.ts - 349 + 375 @@ -7848,7 +7852,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 148 + 151 @@ -7976,7 +7980,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 158 + 167 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7984,15 +7988,15 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 158 + 167 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 128 + 129 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 332 + 334 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -8040,7 +8044,7 @@ Please enter your Ghostfolio API key. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 167 + 170 @@ -8064,7 +8068,7 @@ Link has been copied to the clipboard apps/client/src/app/components/access-table/access-table.component.ts - 161 + 137 @@ -8080,7 +8084,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 - 529 + 531 @@ -8088,7 +8092,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 644 + 645 @@ -8104,7 +8108,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8112,7 +8116,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8120,7 +8124,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 657 + 658 @@ -8128,7 +8132,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8136,7 +8140,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8160,7 +8164,7 @@ Change libs/ui/src/lib/holdings-table/holdings-table.component.html - 146 + 148 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8196,11 +8200,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 168 + 170 libs/ui/src/lib/holdings-table/holdings-table.component.html - 169 + 171 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8248,7 +8252,7 @@ Additional requests are granted while you are setting up your instance apps/client/src/app/components/admin-settings/admin-settings.component.ts - 87 + 88 @@ -8328,7 +8332,7 @@ libs/common/src/lib/routes/routes.ts - 267 + 293 @@ -8337,11 +8341,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 262 + 288 libs/common/src/lib/routes/routes.ts - 265 + 291 @@ -8365,7 +8369,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 963 + 965 @@ -8373,7 +8377,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 807 + 809 @@ -8437,7 +8441,7 @@ libs/common/src/lib/routes/routes.ts - 140 + 166 @@ -8453,11 +8457,11 @@ {VAR_PLURAL, plural, =1 {Activity} other {Activities}} libs/ui/src/lib/activities-table/activities-table.component.html - 70 + 73 libs/ui/src/lib/activities-table/activities-table.component.html - 108 + 111 @@ -8482,11 +8486,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 230 + 256 libs/common/src/lib/routes/routes.ts - 233 + 259 @@ -8606,7 +8610,7 @@ Quick Links libs/ui/src/lib/assistant/assistant.html - 58 + 59 @@ -8622,7 +8626,7 @@ libs/common/src/lib/routes/routes.ts - 281 + 307 @@ -8630,7 +8634,7 @@ Open Source Alternative to libs/common/src/lib/routes/routes.ts - 376 + 402 @@ -8663,15 +8667,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 362 + 388 libs/common/src/lib/routes/routes.ts - 365 + 391 libs/common/src/lib/routes/routes.ts - 373 + 399 @@ -8680,11 +8684,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 354 + 380 libs/common/src/lib/routes/routes.ts - 357 + 383 @@ -8764,7 +8768,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 @@ -8909,11 +8913,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 386 + 412 libs/common/src/lib/routes/routes.ts - 387 + 413 @@ -8945,7 +8949,7 @@ Cryptocurrencies apps/client/src/app/components/markets/markets.component.ts - 54 + 58 apps/client/src/app/pages/features/features-page.html @@ -8957,7 +8961,7 @@ Stocks apps/client/src/app/components/markets/markets.component.ts - 53 + 57 apps/client/src/app/pages/features/features-page.html @@ -8989,7 +8993,7 @@ No results found... libs/ui/src/lib/assistant/assistant.html - 51 + 52 diff --git a/apps/client/src/locales/messages.ko.xlf b/apps/client/src/locales/messages.ko.xlf index e057f9fe69..6eba590199 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 - 226 + 252 libs/common/src/lib/routes/routes.ts - 227 + 253 libs/common/src/lib/routes/routes.ts - 232 + 258 libs/common/src/lib/routes/routes.ts - 240 + 266 libs/common/src/lib/routes/routes.ts - 248 + 274 libs/common/src/lib/routes/routes.ts - 256 + 282 libs/common/src/lib/routes/routes.ts - 264 + 290 @@ -41,19 +41,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 284 + 310 libs/common/src/lib/routes/routes.ts - 285 + 311 libs/common/src/lib/routes/routes.ts - 289 + 315 libs/common/src/lib/routes/routes.ts - 295 + 321 @@ -62,11 +62,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 330 libs/common/src/lib/routes/routes.ts - 305 + 331 @@ -75,11 +75,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 238 + 264 libs/common/src/lib/routes/routes.ts - 241 + 267 @@ -88,11 +88,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 309 + 335 libs/common/src/lib/routes/routes.ts - 310 + 336 @@ -101,11 +101,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 319 + 345 libs/common/src/lib/routes/routes.ts - 320 + 346 @@ -114,11 +114,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 280 libs/common/src/lib/routes/routes.ts - 257 + 283 @@ -127,11 +127,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 329 + 355 libs/common/src/lib/routes/routes.ts - 330 + 356 @@ -140,31 +140,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 334 + 360 libs/common/src/lib/routes/routes.ts - 335 + 361 libs/common/src/lib/routes/routes.ts - 340 + 366 libs/common/src/lib/routes/routes.ts - 348 + 374 libs/common/src/lib/routes/routes.ts - 356 + 382 libs/common/src/lib/routes/routes.ts - 364 + 390 libs/common/src/lib/routes/routes.ts - 372 + 398 @@ -268,19 +268,19 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 7 + 10 libs/ui/src/lib/activities-table/activities-table.component.html - 204 + 207 Details 상세 - apps/client/src/app/components/access-table/access-table.component.html - 49 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 137 @@ -288,7 +288,7 @@ 회수 apps/client/src/app/components/access-table/access-table.component.html - 138 + 100 @@ -312,7 +312,7 @@ 이 부여된 접근 권한을 정말로 회수하시겠습니까? apps/client/src/app/components/access-table/access-table.component.ts - 177 + 153 @@ -362,6 +362,10 @@ apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 113 + libs/ui/src/lib/accounts-table/accounts-table.component.html 10 @@ -412,7 +416,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 182 + 185 libs/ui/src/lib/benchmark/benchmark.component.html @@ -476,7 +480,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 329 + 332 @@ -512,15 +516,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 309 + 312 libs/ui/src/lib/activities-table/activities-table.component.html - 346 + 349 libs/ui/src/lib/holdings-table/holdings-table.component.html - 99 + 101 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -536,7 +540,7 @@ 편집 apps/client/src/app/components/access-table/access-table.component.html - 104 + 74 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -556,7 +560,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 510 + 513 @@ -564,7 +568,7 @@ 삭제 apps/client/src/app/components/access-table/access-table.component.html - 135 + 97 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -576,7 +580,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 241 + 236 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -604,7 +608,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 545 + 548 libs/ui/src/lib/benchmark/benchmark.component.html @@ -616,7 +620,7 @@ 이 계좌를 정말 삭제하시겠습니까? libs/ui/src/lib/accounts-table/accounts-table.component.ts - 183 + 185 @@ -634,6 +638,10 @@ apps/client/src/app/components/admin-jobs/admin-jobs.html 52 + + libs/common/src/lib/routes/routes.ts + 76 + Historical Market Data @@ -644,7 +652,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 496 @@ -752,7 +760,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 518 + 519 @@ -784,7 +792,7 @@ 계좌 검색... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 450 @@ -792,11 +800,11 @@ 날짜 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 527 + 528 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 566 + 567 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -808,7 +816,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 216 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -844,7 +852,7 @@ 통화 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 133 + 123 apps/client/src/app/pages/public/public-page.html @@ -864,7 +872,7 @@ 국가 정보 없는 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 138 + 128 @@ -872,7 +880,7 @@ 섹터 정보 없는 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 143 + 133 @@ -880,7 +888,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 - 526 + 528 @@ -888,11 +896,11 @@ 이 자산 프로필을 정말 삭제하시겠습니까? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 27 + 33 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 69 + 75 @@ -900,7 +908,7 @@ 다음 기준으로 필터... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 377 + 350 @@ -920,7 +928,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 52 @@ -936,7 +944,7 @@ 데이터 수집 빈도 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 476 + 477 @@ -972,7 +980,7 @@ Apply current market price apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 220 + 221 @@ -1156,7 +1164,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 176 + 202 @@ -1188,7 +1196,7 @@ 스크래퍼 설정 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 635 @@ -1204,7 +1212,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 251 + 252 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -1212,7 +1220,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 396 + 399 @@ -1222,6 +1230,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 69 + Search @@ -1247,14 +1259,6 @@ 18 - - Copy identifier to clipboard - Copy identifier to clipboard - - apps/client/src/app/components/access-table/access-table.component.html - 120 - - Name, symbol or ISIN 이름, 심볼 또는 ISIN @@ -1360,7 +1364,7 @@ Update Account libs/common/src/lib/routes/routes.ts - 101 + 120 @@ -1400,11 +1404,11 @@ 추가 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 622 apps/client/src/app/components/admin-overview/admin-overview.html - 304 + 299 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1468,7 +1472,7 @@ 자산 정보가 저장되었습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 752 + 754 @@ -1500,7 +1504,7 @@ The data of this asset profile is moved to () and this asset profile is deleted. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 959 + 961 @@ -1516,7 +1520,7 @@ 올해 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 @@ -1656,11 +1660,11 @@ 양식 유효성 검사에 실패했습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 728 + 730 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 731 + 733 @@ -1700,7 +1704,7 @@ libs/common/src/lib/routes/routes.ts - 202 + 228 @@ -1752,7 +1756,7 @@ libs/common/src/lib/routes/routes.ts - 116 + 135 @@ -1784,7 +1788,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 533 @@ -1792,7 +1796,7 @@ 두려움 apps/client/src/app/components/markets/markets.component.ts - 57 + 61 libs/ui/src/lib/i18n.ts @@ -1804,7 +1808,7 @@ 탐욕 apps/client/src/app/components/markets/markets.component.ts - 58 + 62 libs/ui/src/lib/i18n.ts @@ -1824,7 +1828,7 @@ An error occurred while merging this asset profile into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 942 + 944 @@ -1920,7 +1924,7 @@ 이번주 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 @@ -2072,7 +2076,7 @@ 절대 총 성과 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 80 + 88 @@ -2084,7 +2088,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 94 + 102 @@ -2092,7 +2096,7 @@ 절대 순 성과 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 114 + 122 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -2104,7 +2108,7 @@ 순 성과 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 129 + 137 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -2116,7 +2120,7 @@ 총자산 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 152 + 165 @@ -2124,7 +2128,7 @@ 매수 가능 금액 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 292 + 305 @@ -2132,7 +2136,7 @@ 분석에서 제외됨 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 324 + 337 @@ -2140,7 +2144,7 @@ 부채 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 355 + 368 apps/client/src/app/pages/features/features-page.html @@ -2152,7 +2156,7 @@ 순자산 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 378 + 391 @@ -2160,7 +2164,7 @@ 연환산 성과 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 393 + 406 @@ -2168,7 +2172,7 @@ 비상금 금액을 설정해 주세요. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 160 + 169 @@ -2204,11 +2208,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 235 + 238 libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 76 @@ -2396,7 +2400,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 366 + 368 @@ -2404,11 +2408,11 @@ 연초 대비 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -2416,11 +2420,11 @@ 1년 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -2436,11 +2440,11 @@ 5년 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -2456,19 +2460,11 @@ 맥스 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 277 + 279 libs/ui/src/lib/assistant/assistant.component.ts - 416 - - - - Identifier has been copied to the clipboard - Identifier has been copied to the clipboard - - apps/client/src/app/components/access-table/access-table.component.ts - 149 + 418 @@ -2528,7 +2524,7 @@ Add Account libs/common/src/lib/routes/routes.ts - 87 + 101 @@ -2740,7 +2736,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 214 + 227 @@ -2780,7 +2776,7 @@ 사용자 ID apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 116 + 113 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2820,7 +2816,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 197 @@ -2832,7 +2828,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 195 @@ -2844,7 +2840,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 194 + 198 @@ -2868,7 +2864,7 @@ libs/common/src/lib/routes/routes.ts - 270 + 296 @@ -2884,7 +2880,7 @@ libs/common/src/lib/routes/routes.ts - 235 + 261 @@ -2900,7 +2896,7 @@ libs/common/src/lib/routes/routes.ts - 243 + 269 @@ -2916,7 +2912,7 @@ libs/common/src/lib/routes/routes.ts - 259 + 285 @@ -2988,19 +2984,19 @@ libs/common/src/lib/routes/routes.ts - 104 + 123 libs/ui/src/lib/assistant/assistant.html - 84 + 85 Oops, cash balance transfer has failed. 죄송합니다. 현금 잔액 이체가 실패했습니다. - apps/client/src/app/pages/accounts/accounts-page.component.ts - 199 + apps/client/src/app/pages/accounts/account-dialog-host/account-dialog-host.component.ts + 365 @@ -3024,7 +3020,7 @@ 계좌 ID apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 108 + 109 @@ -3072,7 +3068,7 @@ libs/common/src/lib/routes/routes.ts - 78 + 92 @@ -3084,7 +3080,7 @@ libs/common/src/lib/routes/routes.ts - 65 + 79 @@ -3100,7 +3096,7 @@ libs/common/src/lib/routes/routes.ts - 70 + 84 @@ -3112,7 +3108,7 @@ libs/common/src/lib/routes/routes.ts - 75 + 89 @@ -3148,11 +3144,11 @@ libs/common/src/lib/routes/routes.ts - 143 + 169 libs/common/src/lib/routes/routes.ts - 220 + 246 @@ -3264,7 +3260,7 @@ libs/common/src/lib/routes/routes.ts - 275 + 301 @@ -3272,11 +3268,11 @@ 스크래퍼 설정을 파싱할 수 없습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 676 + 678 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 679 + 681 @@ -3328,7 +3324,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 327 @@ -3356,7 +3352,7 @@ libs/common/src/lib/routes/routes.ts - 306 + 332 @@ -3528,7 +3524,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 196 apps/client/src/app/pages/public/public-page.html @@ -3536,15 +3532,15 @@ libs/common/src/lib/routes/routes.ts - 125 + 144 libs/common/src/lib/routes/routes.ts - 217 + 243 libs/ui/src/lib/assistant/assistant.html - 110 + 111 @@ -3552,7 +3548,7 @@ This action cannot be undone. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 961 + 963 @@ -3572,7 +3568,7 @@ libs/common/src/lib/routes/routes.ts - 135 + 154 @@ -3604,15 +3600,15 @@ libs/common/src/lib/routes/routes.ts - 130 + 149 libs/common/src/lib/routes/routes.ts - 311 + 337 libs/common/src/lib/routes/routes.ts - 359 + 385 @@ -3928,7 +3924,7 @@ Do you really want to delete these activities? libs/ui/src/lib/activities-table/activities-table.component.ts - 344 + 327 @@ -4032,7 +4028,7 @@ 이런! 자산 프로필을 삭제할 수 없습니다. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 54 + 60 @@ -4104,7 +4100,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 169 + 195 @@ -4152,7 +4148,7 @@ Do you really want to merge this asset profile into it? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 965 + 967 @@ -4296,7 +4292,7 @@ libs/common/src/lib/routes/routes.ts - 179 + 205 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -4380,7 +4376,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 263 @@ -4392,11 +4388,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 31 libs/ui/src/lib/activities-table/activities-table.component.html - 432 + 435 @@ -4408,11 +4404,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 54 + 57 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -4420,7 +4416,7 @@ 데이터 가져오는 중... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 176 @@ -4428,7 +4424,7 @@ 가져오기가 완료되었습니다. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 183 + 187 @@ -4444,7 +4440,7 @@ 데이터 유효성을 검사하는 중... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 294 + 298 @@ -4520,7 +4516,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 590 + 591 @@ -4548,7 +4544,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 - 809 + 811 @@ -4564,7 +4560,7 @@ libs/common/src/lib/routes/routes.ts - 184 + 210 @@ -4580,7 +4576,7 @@ 플랫폼별 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 39 + 41 @@ -4588,7 +4584,7 @@ 통화별 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 58 + 60 @@ -4596,7 +4592,7 @@ 자산군별 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 80 + 82 @@ -4604,7 +4600,7 @@ 보유 종목별 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 102 + 104 @@ -4612,7 +4608,7 @@ 부문별 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 125 + 127 @@ -4620,7 +4616,7 @@ 대륙별 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 148 + 150 @@ -4628,7 +4624,7 @@ 시장별 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 170 + 172 @@ -4636,7 +4632,7 @@ 지역 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 193 + 195 apps/client/src/app/pages/public/public-page.html @@ -4664,7 +4660,7 @@ 선진시장 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 216 + 218 apps/client/src/app/pages/public/public-page.html @@ -4684,7 +4680,7 @@ 신흥시장 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 228 apps/client/src/app/pages/public/public-page.html @@ -4696,7 +4692,7 @@ 기타 시장 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 236 + 238 apps/client/src/app/pages/public/public-page.html @@ -4708,7 +4704,7 @@ 계좌별 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 283 + 285 @@ -4716,7 +4712,7 @@ ETF 제공자별 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 303 + 305 @@ -4724,7 +4720,7 @@ 국가별 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 261 + 263 @@ -4736,7 +4732,7 @@ libs/common/src/lib/routes/routes.ts - 189 + 215 @@ -4760,7 +4756,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 479 + 492 apps/client/src/app/pages/features/features-page.html @@ -4904,7 +4900,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 347 @@ -4928,7 +4924,7 @@ Do you really want to remove this received access? apps/client/src/app/components/access-table/access-table.component.ts - 176 + 152 @@ -4952,7 +4948,7 @@ 매시간 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 249 + 251 @@ -5108,11 +5104,11 @@ 자산 정보를 저장할 수 없습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 762 + 764 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 765 + 767 @@ -5164,7 +5160,7 @@ libs/common/src/lib/routes/routes.ts - 331 + 357 @@ -5196,7 +5192,7 @@ libs/common/src/lib/routes/routes.ts - 379 + 405 @@ -5205,11 +5201,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 370 + 396 libs/common/src/lib/routes/routes.ts - 374 + 400 @@ -5509,7 +5505,7 @@ Data gathering has been started. apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 413 + 386 @@ -5545,7 +5541,7 @@ libs/common/src/lib/routes/routes.ts - 382 + 408 @@ -5629,11 +5625,11 @@ 거래 내역 내보내기 libs/ui/src/lib/activities-table/activities-table.component.html - 73 + 76 libs/ui/src/lib/activities-table/activities-table.component.html - 460 + 463 @@ -5641,11 +5637,11 @@ 초안을 달력 파일로 내보내기 libs/ui/src/lib/activities-table/activities-table.component.html - 87 + 90 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 476 @@ -5653,7 +5649,7 @@ 초안 libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/i18n.ts @@ -5665,7 +5661,7 @@ 클론 libs/ui/src/lib/activities-table/activities-table.component.html - 521 + 524 @@ -5673,7 +5669,7 @@ 초안을 달력 파일로 내보내기 libs/ui/src/lib/activities-table/activities-table.component.html - 533 + 536 @@ -5681,11 +5677,11 @@ 정말로 이 거래를 삭제하시겠습니까? libs/ui/src/lib/activities-table/activities-table.component.ts - 343 + 326 libs/ui/src/lib/activities-table/activities-table.component.ts - 354 + 337 @@ -5697,7 +5693,7 @@ libs/ui/src/lib/assistant/assistant.html - 140 + 141 @@ -5705,7 +5701,7 @@ 포트폴리오 필터 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 128 + 125 @@ -5764,6 +5760,14 @@ 286 + + Add to Watchlist + Add to Watchlist + + libs/common/src/lib/routes/routes.ts + 163 + + Market data provided by 시장 데이터 제공: @@ -5801,7 +5805,7 @@ This asset profile cannot be merged into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 920 + 922 @@ -5821,7 +5825,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 465 + 478 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5849,11 +5853,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 124 + 126 libs/ui/src/lib/holdings-table/holdings-table.component.html - 125 + 127 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5873,7 +5877,7 @@ 모두 표시 libs/ui/src/lib/holdings-table/holdings-table.component.html - 216 + 222 @@ -5881,15 +5885,15 @@ 계좌 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 102 + 109 libs/common/src/lib/routes/routes.ts - 94 + 108 libs/ui/src/lib/activities-table/activities-table.component.html - 362 + 365 libs/ui/src/lib/i18n.ts @@ -5925,7 +5929,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 266 + 268 libs/ui/src/lib/i18n.ts @@ -5957,7 +5961,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 287 libs/ui/src/lib/i18n.ts @@ -5993,15 +5997,15 @@ 비상자금 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 229 + 242 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 320 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 412 + 425 apps/client/src/app/pages/features/features-page.html @@ -6073,7 +6077,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 460 + 462 @@ -6097,7 +6101,7 @@ 거래 내역 없음 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 148 + 138 @@ -6157,7 +6161,7 @@ Export libs/ui/src/lib/activities-table/activities-table.component.html - 69 + 72 @@ -6213,7 +6217,7 @@ 구입하다 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 35 + 43 libs/ui/src/lib/i18n.ts @@ -6225,11 +6229,11 @@ 수수료 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 238 + 239 libs/ui/src/lib/activities-table/activities-table.component.html - 285 + 288 libs/ui/src/lib/i18n.ts @@ -6257,7 +6261,7 @@ 팔다 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 49 + 57 libs/ui/src/lib/i18n.ts @@ -6277,7 +6281,7 @@ 현금 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 274 @@ -6377,7 +6381,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 66 + 74 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -6441,7 +6445,7 @@ 사용 가능한 데이터가 없습니다. apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 247 + 249 apps/client/src/app/pages/public/public-page.html @@ -6453,11 +6457,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 462 + 464 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 476 + 478 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6477,7 +6481,7 @@ 기간 libs/ui/src/lib/assistant/assistant.html - 170 + 171 @@ -6485,7 +6489,7 @@ 현재 시장가격은 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 854 + 856 @@ -6501,7 +6505,7 @@ 이런! 액세스 권한을 부여할 수 없습니다. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 256 + 314 @@ -6617,7 +6621,7 @@ 연초 현재 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -6625,7 +6629,7 @@ 이번주 현재까지 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6633,7 +6637,7 @@ 월간 누계 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6641,11 +6645,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6661,11 +6665,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6697,7 +6701,7 @@ 필터 재설정 libs/ui/src/lib/assistant/assistant.html - 204 + 205 @@ -6705,7 +6709,7 @@ 년도 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6717,7 +6721,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -6725,11 +6729,11 @@ 연령 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -6737,7 +6741,7 @@ 필터 적용 libs/ui/src/lib/assistant/assistant.html - 217 + 218 @@ -6746,11 +6750,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 293 + 319 libs/common/src/lib/routes/routes.ts - 296 + 322 @@ -6762,7 +6766,7 @@ libs/common/src/lib/routes/routes.ts - 298 + 324 @@ -6782,7 +6786,7 @@ 보유 종목 검색... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 451 @@ -6802,7 +6806,7 @@ libs/common/src/lib/routes/routes.ts - 290 + 316 @@ -6810,7 +6814,7 @@ 매일 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 245 + 247 @@ -6834,7 +6838,7 @@ 닫은 apps/client/src/app/components/home-holdings/home-holdings.component.ts - 74 + 78 @@ -6842,7 +6846,7 @@ 활동적인 apps/client/src/app/components/home-holdings/home-holdings.component.ts - 73 + 77 @@ -6902,7 +6906,7 @@ {VAR_PLURAL, plural, =1 {거래} other {거래}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 18 + 25 @@ -6910,7 +6914,7 @@ 거래 삭제 libs/ui/src/lib/activities-table/activities-table.component.html - 111 + 114 @@ -6918,7 +6922,7 @@ 국제화 libs/common/src/lib/routes/routes.ts - 149 + 175 @@ -6942,7 +6946,7 @@ 페이지 이동... libs/ui/src/lib/assistant/assistant.component.ts - 450 + 452 @@ -6958,7 +6962,7 @@ 각 ETF의 상위 보유 종목을 기준으로 한 근사치 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 335 + 337 @@ -6966,7 +6970,7 @@ ETF 보유 종목별 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 328 + 330 @@ -6982,7 +6986,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 164 + 190 @@ -7022,7 +7026,7 @@ 벤치마크 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 118 @@ -7030,7 +7034,7 @@ 차트 apps/client/src/app/components/home-holdings/home-holdings.component.ts - 67 + 71 @@ -7038,7 +7042,7 @@ 테이블 apps/client/src/app/components/home-holdings/home-holdings.component.ts - 62 + 66 @@ -7130,7 +7134,7 @@ 이런! 자산 프로필을 삭제할 수 없습니다. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 53 + 59 @@ -7186,7 +7190,7 @@ 보유 종목 보기 libs/ui/src/lib/activities-table/activities-table.component.html - 499 + 502 @@ -7258,7 +7262,7 @@ 이 개의 자산 프로필을 정말 삭제하시겠습니까? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 70 + 76 @@ -7266,15 +7270,15 @@ 오류 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 844 + 846 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 921 + 923 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 943 + 945 @@ -7306,11 +7310,11 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 143 + 152 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 117 + 118 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7318,7 +7322,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 321 + 323 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -7386,7 +7390,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 145 + 154 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7398,11 +7402,11 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 119 + 120 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 323 + 325 libs/ui/src/lib/i18n.ts @@ -7422,7 +7426,7 @@ 이런! 액세스를 업데이트할 수 없습니다. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 354 + 414 @@ -7494,7 +7498,7 @@ 링크를 클립보드에 복사 apps/client/src/app/components/access-table/access-table.component.html - 112 + 82 @@ -7626,7 +7630,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 107 + 110 @@ -7658,7 +7662,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 603 + 604 @@ -7718,7 +7722,7 @@ 이런! 자산을 찾을 수 없습니다. libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html - 43 + 44 @@ -7774,7 +7778,7 @@ libs/common/src/lib/routes/routes.ts - 343 + 369 @@ -7783,11 +7787,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 338 + 364 libs/common/src/lib/routes/routes.ts - 341 + 367 @@ -7803,7 +7807,7 @@ libs/common/src/lib/routes/routes.ts - 351 + 377 @@ -7812,11 +7816,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 346 + 372 libs/common/src/lib/routes/routes.ts - 349 + 375 @@ -7848,7 +7852,7 @@ API 키를 정말로 삭제하시겠습니까? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 148 + 151 @@ -7976,7 +7980,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 158 + 167 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7984,15 +7988,15 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 158 + 167 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 128 + 129 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 332 + 334 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -8040,7 +8044,7 @@ Ghostfolio API 키를 입력하세요. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 167 + 170 @@ -8064,7 +8068,7 @@ 링크가 클립보드에 복사되었습니다. apps/client/src/app/components/access-table/access-table.component.ts - 161 + 137 @@ -8080,7 +8084,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 - 529 + 531 @@ -8088,7 +8092,7 @@ 기본 시장 가격 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 644 + 645 @@ -8104,7 +8108,7 @@ 즉각적인 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8112,7 +8116,7 @@ 게으른 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8120,7 +8124,7 @@ HTTP 요청 헤더 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 657 + 658 @@ -8128,7 +8132,7 @@ 실시간 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8136,7 +8140,7 @@ 하루의 끝 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8160,7 +8164,7 @@ 변동 libs/ui/src/lib/holdings-table/holdings-table.component.html - 146 + 148 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8196,11 +8200,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 168 + 170 libs/ui/src/lib/holdings-table/holdings-table.component.html - 169 + 171 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8248,7 +8252,7 @@ Additional requests are granted while you are setting up your instance apps/client/src/app/components/admin-settings/admin-settings.component.ts - 87 + 88 @@ -8328,7 +8332,7 @@ libs/common/src/lib/routes/routes.ts - 267 + 293 @@ -8337,11 +8341,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 262 + 288 libs/common/src/lib/routes/routes.ts - 265 + 291 @@ -8365,7 +8369,7 @@ ()은(는) 이미 사용 중입니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 963 + 965 @@ -8373,7 +8377,7 @@ ()로 업데이트하는 동안 오류가 발생했습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 807 + 809 @@ -8437,7 +8441,7 @@ libs/common/src/lib/routes/routes.ts - 140 + 166 @@ -8453,11 +8457,11 @@ {VAR_PLURAL, plural, =1 {Activity} other {Activities}} libs/ui/src/lib/activities-table/activities-table.component.html - 70 + 73 libs/ui/src/lib/activities-table/activities-table.component.html - 108 + 111 @@ -8482,11 +8486,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 230 + 256 libs/common/src/lib/routes/routes.ts - 233 + 259 @@ -8606,7 +8610,7 @@ 빠른 링크 libs/ui/src/lib/assistant/assistant.html - 58 + 59 @@ -8622,7 +8626,7 @@ libs/common/src/lib/routes/routes.ts - 281 + 307 @@ -8630,7 +8634,7 @@ 오픈 소스 대안 libs/common/src/lib/routes/routes.ts - 376 + 402 @@ -8663,15 +8667,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 362 + 388 libs/common/src/lib/routes/routes.ts - 365 + 391 libs/common/src/lib/routes/routes.ts - 373 + 399 @@ -8680,11 +8684,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 354 + 380 libs/common/src/lib/routes/routes.ts - 357 + 383 @@ -8764,7 +8768,7 @@ 이번 달 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 @@ -8909,11 +8913,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 386 + 412 libs/common/src/lib/routes/routes.ts - 387 + 413 @@ -8945,7 +8949,7 @@ 암호화폐 apps/client/src/app/components/markets/markets.component.ts - 54 + 58 apps/client/src/app/pages/features/features-page.html @@ -8957,7 +8961,7 @@ 주식 apps/client/src/app/components/markets/markets.component.ts - 53 + 57 apps/client/src/app/pages/features/features-page.html @@ -8989,7 +8993,7 @@ 검색된 결과가 없습니다... libs/ui/src/lib/assistant/assistant.html - 51 + 52 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 1811425188..a0c9f0c4c0 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -66,19 +66,19 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 7 + 10 libs/ui/src/lib/activities-table/activities-table.component.html - 204 + 207 Details Details - apps/client/src/app/components/access-table/access-table.component.html - 49 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 137 @@ -86,7 +86,7 @@ Intrekken apps/client/src/app/components/access-table/access-table.component.html - 138 + 100 @@ -110,7 +110,7 @@ Wil je deze verleende toegang echt intrekken? apps/client/src/app/components/access-table/access-table.component.ts - 177 + 153 @@ -158,7 +158,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 182 + 185 libs/ui/src/lib/benchmark/benchmark.component.html @@ -218,15 +218,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 309 + 312 libs/ui/src/lib/activities-table/activities-table.component.html - 346 + 349 libs/ui/src/lib/holdings-table/holdings-table.component.html - 99 + 101 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -242,7 +242,7 @@ Bewerken apps/client/src/app/components/access-table/access-table.component.html - 104 + 74 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -262,7 +262,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 510 + 513 @@ -270,7 +270,7 @@ Verwijderen apps/client/src/app/components/access-table/access-table.component.html - 135 + 97 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -282,7 +282,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 241 + 236 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -310,7 +310,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 545 + 548 libs/ui/src/lib/benchmark/benchmark.component.html @@ -322,7 +322,7 @@ Wil je deze rekening echt verwijderen? libs/ui/src/lib/accounts-table/accounts-table.component.ts - 183 + 185 @@ -434,7 +434,7 @@ libs/ui/src/lib/assistant/assistant.html - 140 + 141 @@ -446,7 +446,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 496 @@ -462,7 +462,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 518 + 519 @@ -494,7 +494,7 @@ Zoek een account... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 450 @@ -502,11 +502,11 @@ Datum apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 527 + 528 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 566 + 567 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -518,7 +518,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 216 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -566,7 +566,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 52 @@ -670,7 +670,7 @@ Update Account libs/common/src/lib/routes/routes.ts - 101 + 120 @@ -686,11 +686,11 @@ Toevoegen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 622 apps/client/src/app/components/admin-overview/admin-overview.html - 304 + 299 libs/ui/src/lib/account-balances/account-balances.component.html @@ -846,7 +846,7 @@ libs/common/src/lib/routes/routes.ts - 116 + 135 @@ -878,7 +878,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 533 @@ -894,7 +894,7 @@ An error occurred while merging this asset profile into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 942 + 944 @@ -1018,7 +1018,7 @@ Absoluut bruto rendement apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 80 + 88 @@ -1026,7 +1026,7 @@ Absoluut netto rendement apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 114 + 122 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1038,7 +1038,7 @@ Netto rendement apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 129 + 137 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1050,7 +1050,7 @@ Totaal Activa apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 152 + 165 @@ -1058,7 +1058,7 @@ Koopkracht apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 292 + 305 @@ -1066,7 +1066,7 @@ Netto waarde apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 378 + 391 @@ -1074,7 +1074,7 @@ Rendement per jaar apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 393 + 406 @@ -1082,7 +1082,7 @@ Voer het bedrag van je noodfonds in: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 160 + 169 @@ -1154,11 +1154,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 124 + 126 libs/ui/src/lib/holdings-table/holdings-table.component.html - 125 + 127 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -1178,7 +1178,7 @@ Toon alle libs/ui/src/lib/holdings-table/holdings-table.component.html - 216 + 222 @@ -1190,7 +1190,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 366 + 368 @@ -1198,11 +1198,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -1210,11 +1210,11 @@ 1J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -1230,11 +1230,11 @@ 5J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -1250,19 +1250,11 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 277 + 279 libs/ui/src/lib/assistant/assistant.component.ts - 416 - - - - Identifier has been copied to the clipboard - Identifier has been copied to the clipboard - - apps/client/src/app/components/access-table/access-table.component.ts - 149 + 418 @@ -1274,7 +1266,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 194 + 198 @@ -1298,7 +1290,7 @@ libs/common/src/lib/routes/routes.ts - 270 + 296 @@ -1314,7 +1306,7 @@ libs/common/src/lib/routes/routes.ts - 259 + 285 @@ -1342,7 +1334,7 @@ Add Account libs/common/src/lib/routes/routes.ts - 87 + 101 @@ -1482,7 +1474,7 @@ Gebruikers-ID apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 116 + 113 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1574,11 +1566,11 @@ libs/common/src/lib/routes/routes.ts - 104 + 123 libs/ui/src/lib/assistant/assistant.html - 84 + 85 @@ -1634,7 +1626,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 329 + 332 @@ -1674,7 +1666,7 @@ Rekening-ID apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 108 + 109 @@ -1698,7 +1690,7 @@ libs/common/src/lib/routes/routes.ts - 78 + 92 @@ -1810,7 +1802,7 @@ libs/common/src/lib/routes/routes.ts - 275 + 301 @@ -1854,7 +1846,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 327 @@ -1882,7 +1874,7 @@ libs/common/src/lib/routes/routes.ts - 306 + 332 @@ -1918,11 +1910,11 @@ libs/common/src/lib/routes/routes.ts - 143 + 169 libs/common/src/lib/routes/routes.ts - 220 + 246 @@ -1954,15 +1946,15 @@ libs/common/src/lib/routes/routes.ts - 130 + 149 libs/common/src/lib/routes/routes.ts - 311 + 337 libs/common/src/lib/routes/routes.ts - 359 + 385 @@ -1978,7 +1970,7 @@ libs/common/src/lib/routes/routes.ts - 184 + 210 @@ -1986,7 +1978,7 @@ Per rekening apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 283 + 285 @@ -1994,7 +1986,7 @@ Per valuta apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 58 + 60 @@ -2002,7 +1994,7 @@ Per asset klasse apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 80 + 82 @@ -2010,7 +2002,7 @@ Per positie apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 102 + 104 @@ -2018,7 +2010,7 @@ Per sector apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 125 + 127 @@ -2026,7 +2018,7 @@ Per continent apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 148 + 150 @@ -2034,7 +2026,7 @@ Per land apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 261 + 263 @@ -2042,7 +2034,7 @@ Regio’s apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 193 + 195 apps/client/src/app/pages/public/public-page.html @@ -2066,7 +2058,7 @@ libs/common/src/lib/routes/routes.ts - 189 + 215 @@ -2122,7 +2114,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 196 apps/client/src/app/pages/public/public-page.html @@ -2130,15 +2122,15 @@ libs/common/src/lib/routes/routes.ts - 125 + 144 libs/common/src/lib/routes/routes.ts - 217 + 243 libs/ui/src/lib/assistant/assistant.html - 110 + 111 @@ -2154,7 +2146,7 @@ Huidige week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 @@ -2174,7 +2166,7 @@ Verkopen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 49 + 57 libs/ui/src/lib/i18n.ts @@ -2189,14 +2181,6 @@ 5 - - Copy identifier to clipboard - Copy identifier to clipboard - - apps/client/src/app/components/access-table/access-table.component.html - 120 - - Name, symbol or ISIN Naam, symbool of ISIN @@ -2242,11 +2226,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 235 + 238 libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 76 @@ -2258,7 +2242,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 263 @@ -2274,7 +2258,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 251 + 252 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2282,7 +2266,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 396 + 399 @@ -2330,7 +2314,7 @@ libs/common/src/lib/routes/routes.ts - 179 + 205 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2342,7 +2326,7 @@ Gegevens importeren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 176 @@ -2350,7 +2334,7 @@ Importeren is voltooid apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 183 + 187 @@ -2390,7 +2374,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 347 @@ -2414,7 +2398,7 @@ libs/common/src/lib/routes/routes.ts - 202 + 228 @@ -2450,7 +2434,7 @@ libs/common/src/lib/routes/routes.ts - 331 + 357 @@ -2494,7 +2478,7 @@ libs/common/src/lib/routes/routes.ts - 382 + 408 @@ -2526,7 +2510,7 @@ Concept libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/i18n.ts @@ -2542,11 +2526,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 31 libs/ui/src/lib/activities-table/activities-table.component.html - 432 + 435 @@ -2554,11 +2538,11 @@ Activiteiten exporteren libs/ui/src/lib/activities-table/activities-table.component.html - 73 + 76 libs/ui/src/lib/activities-table/activities-table.component.html - 460 + 463 @@ -2566,11 +2550,11 @@ Concept exporteren als ICS libs/ui/src/lib/activities-table/activities-table.component.html - 87 + 90 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 476 @@ -2578,7 +2562,7 @@ Kloon libs/ui/src/lib/activities-table/activities-table.component.html - 521 + 524 @@ -2586,7 +2570,7 @@ Concept exporteren als ICS libs/ui/src/lib/activities-table/activities-table.component.html - 533 + 536 @@ -2594,11 +2578,11 @@ Wil je deze activiteit echt verwijderen? libs/ui/src/lib/activities-table/activities-table.component.ts - 343 + 326 libs/ui/src/lib/activities-table/activities-table.component.ts - 354 + 337 @@ -2674,7 +2658,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 195 @@ -2690,7 +2674,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 197 @@ -2706,7 +2690,7 @@ Ontwikkelde markten apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 216 + 218 apps/client/src/app/pages/public/public-page.html @@ -2734,7 +2718,7 @@ Andere markten apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 236 + 238 apps/client/src/app/pages/public/public-page.html @@ -2746,7 +2730,7 @@ Opkomende markten apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 228 apps/client/src/app/pages/public/public-page.html @@ -2826,7 +2810,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 465 + 478 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2866,7 +2850,7 @@ Huidige marktprijs toepassen apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 220 + 221 @@ -2890,7 +2874,7 @@ Angst apps/client/src/app/components/markets/markets.component.ts - 57 + 61 libs/ui/src/lib/i18n.ts @@ -2902,7 +2886,7 @@ Hebzucht apps/client/src/app/components/markets/markets.component.ts - 58 + 62 libs/ui/src/lib/i18n.ts @@ -2914,7 +2898,7 @@ Filter op... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 377 + 350 @@ -2962,11 +2946,11 @@ Het formulier kon niet worden gevalideerd. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 728 + 730 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 731 + 733 @@ -2990,7 +2974,7 @@ Uitgesloten van analyse apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 324 + 337 @@ -3086,15 +3070,15 @@ Account apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 102 + 109 libs/common/src/lib/routes/routes.ts - 94 + 108 libs/ui/src/lib/activities-table/activities-table.component.html - 362 + 365 libs/ui/src/lib/i18n.ts @@ -3122,7 +3106,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 266 + 268 libs/ui/src/lib/i18n.ts @@ -3166,7 +3150,7 @@ Export libs/ui/src/lib/activities-table/activities-table.component.html - 69 + 72 @@ -3186,7 +3170,7 @@ Contant geld apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 274 @@ -3218,15 +3202,15 @@ Noodfonds apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 229 + 242 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 320 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 412 + 425 apps/client/src/app/pages/features/features-page.html @@ -3250,7 +3234,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 460 + 462 @@ -3258,7 +3242,7 @@ Geen gegevens beschikbaar apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 247 + 249 apps/client/src/app/pages/public/public-page.html @@ -3270,11 +3254,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 462 + 464 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 476 + 478 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3354,7 +3338,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 66 + 74 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -3402,7 +3386,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 - 809 + 811 @@ -3418,7 +3402,7 @@ Frequentie van gegevensverzameling apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 476 + 477 @@ -3466,7 +3450,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 479 + 492 apps/client/src/app/pages/features/features-page.html @@ -3514,7 +3498,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 287 libs/ui/src/lib/i18n.ts @@ -3534,7 +3518,7 @@ Gegevens valideren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 294 + 298 @@ -3562,7 +3546,7 @@ libs/common/src/lib/routes/routes.ts - 65 + 79 @@ -3574,7 +3558,7 @@ libs/common/src/lib/routes/routes.ts - 75 + 89 @@ -3582,7 +3566,7 @@ This action cannot be undone. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 961 + 963 @@ -3602,7 +3586,7 @@ libs/common/src/lib/routes/routes.ts - 135 + 154 @@ -3642,11 +3626,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 54 + 57 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -3698,7 +3682,7 @@ Geen activiteiten apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 148 + 138 @@ -3746,7 +3730,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 214 + 227 @@ -3890,7 +3874,7 @@ Elk uur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 249 + 251 @@ -4002,11 +3986,11 @@ Kon het assetprofiel niet opslaan apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 762 + 764 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 765 + 767 @@ -4026,7 +4010,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 94 + 102 @@ -4101,6 +4085,14 @@ 18 + + Add to Watchlist + Add to Watchlist + + libs/common/src/lib/routes/routes.ts + 163 + + Market data provided by Marktgegevens geleverd door @@ -4122,7 +4114,7 @@ This asset profile cannot be merged into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 920 + 922 @@ -4174,7 +4166,7 @@ Do you really want to remove this received access? apps/client/src/app/components/access-table/access-table.component.ts - 176 + 152 @@ -4190,7 +4182,7 @@ Per ETF-aanbieder apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 303 + 305 @@ -4214,7 +4206,7 @@ The data of this asset profile is moved to () and this asset profile is deleted. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 959 + 961 @@ -4230,7 +4222,7 @@ Huidig jaar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 @@ -4282,7 +4274,7 @@ Het activaprofiel is opgeslagen. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 752 + 754 @@ -4314,7 +4306,7 @@ Per platform apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 39 + 41 @@ -4354,7 +4346,7 @@ libs/common/src/lib/routes/routes.ts - 70 + 84 @@ -4410,7 +4402,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 590 + 591 @@ -4494,7 +4486,7 @@ Verplichtingen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 355 + 368 apps/client/src/app/pages/features/features-page.html @@ -4514,7 +4506,7 @@ libs/common/src/lib/routes/routes.ts - 235 + 261 @@ -4530,7 +4522,7 @@ libs/common/src/lib/routes/routes.ts - 243 + 269 @@ -4650,7 +4642,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 176 + 202 @@ -4682,7 +4674,7 @@ Scraper instellingen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 635 @@ -4692,6 +4684,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 69 + Personal Finance Tools @@ -4702,7 +4698,7 @@ libs/common/src/lib/routes/routes.ts - 379 + 405 @@ -4930,7 +4926,7 @@ Koop apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 35 + 43 libs/ui/src/lib/i18n.ts @@ -4958,7 +4954,7 @@ ETF’s zonder Landen apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 138 + 128 @@ -4966,7 +4962,7 @@ ETF’s zonder Sectoren apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 143 + 133 @@ -4974,7 +4970,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 - 526 + 528 @@ -4998,7 +4994,7 @@ Per markt apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 170 + 172 @@ -5194,7 +5190,7 @@ Valuta apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 133 + 123 apps/client/src/app/pages/public/public-page.html @@ -5246,11 +5242,11 @@ De scraperconfiguratie kon niet worden geparseerd apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 676 + 678 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 679 + 681 @@ -5390,7 +5386,7 @@ Do you really want to delete these activities? libs/ui/src/lib/activities-table/activities-table.component.ts - 344 + 327 @@ -5494,7 +5490,7 @@ Oeps! De activaprofielen konden niet worden verwijderd. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 54 + 60 @@ -5550,7 +5546,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 169 + 195 @@ -5599,19 +5595,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 284 + 310 libs/common/src/lib/routes/routes.ts - 285 + 311 libs/common/src/lib/routes/routes.ts - 289 + 315 libs/common/src/lib/routes/routes.ts - 295 + 321 @@ -5620,11 +5616,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 330 libs/common/src/lib/routes/routes.ts - 305 + 331 @@ -5633,31 +5629,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 226 + 252 libs/common/src/lib/routes/routes.ts - 227 + 253 libs/common/src/lib/routes/routes.ts - 232 + 258 libs/common/src/lib/routes/routes.ts - 240 + 266 libs/common/src/lib/routes/routes.ts - 248 + 274 libs/common/src/lib/routes/routes.ts - 256 + 282 libs/common/src/lib/routes/routes.ts - 264 + 290 @@ -5666,11 +5662,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 280 libs/common/src/lib/routes/routes.ts - 257 + 283 @@ -5679,11 +5675,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 238 + 264 libs/common/src/lib/routes/routes.ts - 241 + 267 @@ -5692,11 +5688,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 309 + 335 libs/common/src/lib/routes/routes.ts - 310 + 336 @@ -5705,11 +5701,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 319 + 345 libs/common/src/lib/routes/routes.ts - 320 + 346 @@ -5718,11 +5714,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 329 + 355 libs/common/src/lib/routes/routes.ts - 330 + 356 @@ -5731,31 +5727,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 334 + 360 libs/common/src/lib/routes/routes.ts - 335 + 361 libs/common/src/lib/routes/routes.ts - 340 + 366 libs/common/src/lib/routes/routes.ts - 348 + 374 libs/common/src/lib/routes/routes.ts - 356 + 382 libs/common/src/lib/routes/routes.ts - 364 + 390 libs/common/src/lib/routes/routes.ts - 372 + 398 @@ -5828,11 +5824,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 370 + 396 libs/common/src/lib/routes/routes.ts - 374 + 400 @@ -5864,7 +5860,7 @@ Data gathering has been started. apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 413 + 386 @@ -5900,7 +5896,7 @@ Do you really want to merge this asset profile into it? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 965 + 967 @@ -5984,11 +5980,11 @@ Kosten apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 238 + 239 libs/ui/src/lib/activities-table/activities-table.component.html - 285 + 288 libs/ui/src/lib/i18n.ts @@ -6042,6 +6038,10 @@ apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 113 + libs/ui/src/lib/accounts-table/accounts-table.component.html 10 @@ -6118,17 +6118,21 @@ apps/client/src/app/components/admin-jobs/admin-jobs.html 52 + + libs/common/src/lib/routes/routes.ts + 76 + Do you really want to delete this asset profile? Weet u zeker dat u dit bezittingen profiel wilt verwijderen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 27 + 33 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 69 + 75 @@ -6335,8 +6339,8 @@ Oops, cash balance transfer has failed. Oeps, geldoverdracht is mislukt. - apps/client/src/app/pages/accounts/accounts-page.component.ts - 199 + apps/client/src/app/pages/accounts/account-dialog-host/account-dialog-host.component.ts + 365 @@ -6392,7 +6396,7 @@ Portefeuillefilters apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 128 + 125 @@ -6452,7 +6456,7 @@ De huidige markt waarde is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 854 + 856 @@ -6468,7 +6472,7 @@ Datumbereik libs/ui/src/lib/assistant/assistant.html - 170 + 171 @@ -6496,7 +6500,7 @@ Oeps! Kan geen toegang verlenen. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 256 + 314 @@ -6592,7 +6596,7 @@ Week tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6600,11 +6604,11 @@ Week tot nu toe apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6612,7 +6616,7 @@ Maand tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6620,11 +6624,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6640,7 +6644,7 @@ Jaar tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -6672,7 +6676,7 @@ Filters Herstellen libs/ui/src/lib/assistant/assistant.html - 204 + 205 @@ -6680,7 +6684,7 @@ jaar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6692,7 +6696,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -6700,11 +6704,11 @@ jaren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -6712,7 +6716,7 @@ Filters Toepassen libs/ui/src/lib/assistant/assistant.html - 217 + 218 @@ -6732,7 +6736,7 @@ Zoek een positie... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 451 @@ -6752,7 +6756,7 @@ libs/common/src/lib/routes/routes.ts - 290 + 316 @@ -6764,7 +6768,7 @@ libs/common/src/lib/routes/routes.ts - 298 + 324 @@ -6773,11 +6777,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 293 + 319 libs/common/src/lib/routes/routes.ts - 296 + 322 @@ -6785,7 +6789,7 @@ Dagelijks apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 245 + 247 @@ -6809,7 +6813,7 @@ Actief apps/client/src/app/components/home-holdings/home-holdings.component.ts - 73 + 77 @@ -6817,7 +6821,7 @@ Gesloten apps/client/src/app/components/home-holdings/home-holdings.component.ts - 74 + 78 @@ -6869,7 +6873,7 @@ {VAR_PLURAL, plural, =1 {activiteit} other {activiteiten}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 18 + 25 @@ -6885,7 +6889,7 @@ Verwijder Activiteiten libs/ui/src/lib/activities-table/activities-table.component.html - 111 + 114 @@ -6893,7 +6897,7 @@ Internationalizering libs/common/src/lib/routes/routes.ts - 149 + 175 @@ -6909,7 +6913,7 @@ Ga naar een pagina... libs/ui/src/lib/assistant/assistant.component.ts - 450 + 452 @@ -6933,7 +6937,7 @@ Per Aangehouden ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 328 + 330 @@ -6941,7 +6945,7 @@ Benadering op basis van de grootste belegingen binnen iedere ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 335 + 337 @@ -6957,7 +6961,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 164 + 190 @@ -6997,7 +7001,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 118 @@ -7005,7 +7009,7 @@ Tabel apps/client/src/app/components/home-holdings/home-holdings.component.ts - 62 + 66 @@ -7013,7 +7017,7 @@ Grafiek apps/client/src/app/components/home-holdings/home-holdings.component.ts - 67 + 71 @@ -7121,7 +7125,7 @@ Oeps! Het activaprofiel kon niet worden verwijderd. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 53 + 59 @@ -7225,7 +7229,7 @@ Bekijk Holding libs/ui/src/lib/activities-table/activities-table.component.html - 499 + 502 @@ -7233,7 +7237,7 @@ Wil je deze activaprofielen echt verwijderen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 70 + 76 @@ -7241,15 +7245,15 @@ Fout apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 844 + 846 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 921 + 923 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 943 + 945 @@ -7273,7 +7277,7 @@ Oops! Kan de toegang niet updaten. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 354 + 414 @@ -7313,11 +7317,11 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 143 + 152 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 117 + 118 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7325,7 +7329,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 321 + 323 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -7369,7 +7373,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 145 + 154 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7381,11 +7385,11 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 119 + 120 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 323 + 325 libs/ui/src/lib/i18n.ts @@ -7413,7 +7417,7 @@ Kopieer link naar klembord apps/client/src/app/components/access-table/access-table.component.html - 112 + 82 @@ -7601,7 +7605,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 107 + 110 @@ -7633,7 +7637,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 603 + 604 @@ -7693,7 +7697,7 @@ Oeps! Kan geen activa vinden. libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html - 43 + 44 @@ -7749,7 +7753,7 @@ libs/common/src/lib/routes/routes.ts - 343 + 369 @@ -7765,7 +7769,7 @@ libs/common/src/lib/routes/routes.ts - 351 + 377 @@ -7774,11 +7778,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 346 + 372 libs/common/src/lib/routes/routes.ts - 349 + 375 @@ -7787,11 +7791,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 338 + 364 libs/common/src/lib/routes/routes.ts - 341 + 367 @@ -7831,7 +7835,7 @@ Wilt u de API-sleutel echt verwijderen? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 148 + 151 @@ -7951,7 +7955,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 158 + 167 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7959,15 +7963,15 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 158 + 167 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 128 + 129 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 332 + 334 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -8015,7 +8019,7 @@ Voer uw Ghostfolio API-sleutel in. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 167 + 170 @@ -8039,7 +8043,7 @@ Link is gekopieerd naar klemboord apps/client/src/app/components/access-table/access-table.component.ts - 161 + 137 @@ -8047,7 +8051,7 @@ Lui apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8055,7 +8059,7 @@ Direct apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8063,7 +8067,7 @@ Standaard Marktprijs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 644 + 645 @@ -8079,7 +8083,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 - 529 + 531 @@ -8095,7 +8099,7 @@ HTTP Verzoek Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 657 + 658 @@ -8103,7 +8107,7 @@ eind van de dag apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8111,7 +8115,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8135,7 +8139,7 @@ Aanpassen libs/ui/src/lib/holdings-table/holdings-table.component.html - 146 + 148 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8171,11 +8175,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 168 + 170 libs/ui/src/lib/holdings-table/holdings-table.component.html - 169 + 171 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8239,7 +8243,7 @@ Additional requests are granted while you are setting up your instance apps/client/src/app/components/admin-settings/admin-settings.component.ts - 87 + 88 @@ -8308,11 +8312,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 262 + 288 libs/common/src/lib/routes/routes.ts - 265 + 291 @@ -8324,7 +8328,7 @@ libs/common/src/lib/routes/routes.ts - 267 + 293 @@ -8340,7 +8344,7 @@ () is al in gebruik. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 963 + 965 @@ -8348,7 +8352,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 - 807 + 809 @@ -8436,7 +8440,7 @@ libs/common/src/lib/routes/routes.ts - 140 + 166 @@ -8452,11 +8456,11 @@ {VAR_PLURAL, plural, =1 {Activity} other {Activities}} libs/ui/src/lib/activities-table/activities-table.component.html - 70 + 73 libs/ui/src/lib/activities-table/activities-table.component.html - 108 + 111 @@ -8481,11 +8485,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 230 + 256 libs/common/src/lib/routes/routes.ts - 233 + 259 @@ -8605,7 +8609,7 @@ Snelle koppelingen libs/ui/src/lib/assistant/assistant.html - 58 + 59 @@ -8621,7 +8625,7 @@ libs/common/src/lib/routes/routes.ts - 281 + 307 @@ -8629,7 +8633,7 @@ Open Source alternatief voor libs/common/src/lib/routes/routes.ts - 376 + 402 @@ -8662,15 +8666,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 362 + 388 libs/common/src/lib/routes/routes.ts - 365 + 391 libs/common/src/lib/routes/routes.ts - 373 + 399 @@ -8679,11 +8683,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 354 + 380 libs/common/src/lib/routes/routes.ts - 357 + 383 @@ -8763,7 +8767,7 @@ Huidige maand apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 @@ -8908,11 +8912,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 386 + 412 libs/common/src/lib/routes/routes.ts - 387 + 413 @@ -8944,7 +8948,7 @@ Aandelen apps/client/src/app/components/markets/markets.component.ts - 53 + 57 apps/client/src/app/pages/features/features-page.html @@ -8956,7 +8960,7 @@ Cryptovaluta apps/client/src/app/components/markets/markets.component.ts - 54 + 58 apps/client/src/app/pages/features/features-page.html @@ -9084,7 +9088,7 @@ Geen resultaten gevonden... libs/ui/src/lib/assistant/assistant.html - 51 + 52 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index ef7ef8c5b0..653c7245cf 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 - 226 + 252 libs/common/src/lib/routes/routes.ts - 227 + 253 libs/common/src/lib/routes/routes.ts - 232 + 258 libs/common/src/lib/routes/routes.ts - 240 + 266 libs/common/src/lib/routes/routes.ts - 248 + 274 libs/common/src/lib/routes/routes.ts - 256 + 282 libs/common/src/lib/routes/routes.ts - 264 + 290 @@ -40,19 +40,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 284 + 310 libs/common/src/lib/routes/routes.ts - 285 + 311 libs/common/src/lib/routes/routes.ts - 289 + 315 libs/common/src/lib/routes/routes.ts - 295 + 321 @@ -61,11 +61,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 330 libs/common/src/lib/routes/routes.ts - 305 + 331 @@ -74,11 +74,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 238 + 264 libs/common/src/lib/routes/routes.ts - 241 + 267 @@ -87,11 +87,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 309 + 335 libs/common/src/lib/routes/routes.ts - 310 + 336 @@ -100,11 +100,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 319 + 345 libs/common/src/lib/routes/routes.ts - 320 + 346 @@ -113,11 +113,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 280 libs/common/src/lib/routes/routes.ts - 257 + 283 @@ -126,11 +126,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 329 + 355 libs/common/src/lib/routes/routes.ts - 330 + 356 @@ -139,31 +139,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 334 + 360 libs/common/src/lib/routes/routes.ts - 335 + 361 libs/common/src/lib/routes/routes.ts - 340 + 366 libs/common/src/lib/routes/routes.ts - 348 + 374 libs/common/src/lib/routes/routes.ts - 356 + 382 libs/common/src/lib/routes/routes.ts - 364 + 390 libs/common/src/lib/routes/routes.ts - 372 + 398 @@ -267,19 +267,19 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 7 + 10 libs/ui/src/lib/activities-table/activities-table.component.html - 204 + 207 Details Szczegóły - apps/client/src/app/components/access-table/access-table.component.html - 49 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 137 @@ -287,7 +287,7 @@ Cofnij apps/client/src/app/components/access-table/access-table.component.html - 138 + 100 @@ -311,7 +311,7 @@ Czy na pewno chcesz cofnąć przyznany dostęp? apps/client/src/app/components/access-table/access-table.component.ts - 177 + 153 @@ -353,6 +353,10 @@ apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 113 + libs/ui/src/lib/accounts-table/accounts-table.component.html 10 @@ -403,7 +407,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 182 + 185 libs/ui/src/lib/benchmark/benchmark.component.html @@ -467,7 +471,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 329 + 332 @@ -503,15 +507,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 309 + 312 libs/ui/src/lib/activities-table/activities-table.component.html - 346 + 349 libs/ui/src/lib/holdings-table/holdings-table.component.html - 99 + 101 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -527,7 +531,7 @@ Edytuj apps/client/src/app/components/access-table/access-table.component.html - 104 + 74 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -547,7 +551,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 510 + 513 @@ -555,7 +559,7 @@ Usuń apps/client/src/app/components/access-table/access-table.component.html - 135 + 97 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -567,7 +571,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 241 + 236 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -595,7 +599,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 545 + 548 libs/ui/src/lib/benchmark/benchmark.component.html @@ -607,7 +611,7 @@ Czy na pewno chcesz usunąć to konto? libs/ui/src/lib/accounts-table/accounts-table.component.ts - 183 + 185 @@ -625,6 +629,10 @@ apps/client/src/app/components/admin-jobs/admin-jobs.html 52 + + libs/common/src/lib/routes/routes.ts + 76 + Historical Market Data @@ -635,7 +643,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 496 @@ -743,7 +751,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 518 + 519 @@ -775,7 +783,7 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 450 @@ -783,11 +791,11 @@ Data apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 527 + 528 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 566 + 567 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -799,7 +807,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 216 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -835,7 +843,7 @@ Waluty apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 133 + 123 apps/client/src/app/pages/public/public-page.html @@ -855,7 +863,7 @@ ETF-y bez Krajów apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 138 + 128 @@ -863,7 +871,7 @@ ETF-y bez Sektorów apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 143 + 133 @@ -871,7 +879,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 - 526 + 528 @@ -879,11 +887,11 @@ Czy na pewno chcesz usunąć ten profil aktywów? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 27 + 33 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 69 + 75 @@ -891,7 +899,7 @@ Filtruj według... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 377 + 350 @@ -911,7 +919,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 52 @@ -927,7 +935,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 476 + 477 @@ -963,7 +971,7 @@ Apply current market price apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 220 + 221 @@ -1123,7 +1131,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 176 + 202 @@ -1155,7 +1163,7 @@ Konfiguracja Scrapera apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 635 @@ -1171,7 +1179,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 251 + 252 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -1179,7 +1187,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 396 + 399 @@ -1189,6 +1197,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 69 + Search @@ -1214,14 +1226,6 @@ 18 - - Copy identifier to clipboard - Copy identifier to clipboard - - apps/client/src/app/components/access-table/access-table.component.html - 120 - - Name, symbol or ISIN Nazwa, symbol lub ISIN @@ -1327,7 +1331,7 @@ Update Account libs/common/src/lib/routes/routes.ts - 101 + 120 @@ -1367,11 +1371,11 @@ Dodaj apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 622 apps/client/src/app/components/admin-overview/admin-overview.html - 304 + 299 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1435,7 +1439,7 @@ Profil zasobu został zapisany apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 752 + 754 @@ -1467,7 +1471,7 @@ The data of this asset profile is moved to () and this asset profile is deleted. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 959 + 961 @@ -1483,7 +1487,7 @@ Obecny rok apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 @@ -1623,11 +1627,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 728 + 730 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 731 + 733 @@ -1667,7 +1671,7 @@ libs/common/src/lib/routes/routes.ts - 202 + 228 @@ -1719,7 +1723,7 @@ libs/common/src/lib/routes/routes.ts - 116 + 135 @@ -1751,7 +1755,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 533 @@ -1759,7 +1763,7 @@ Zagrożenie apps/client/src/app/components/markets/markets.component.ts - 57 + 61 libs/ui/src/lib/i18n.ts @@ -1771,7 +1775,7 @@ Zachłanność apps/client/src/app/components/markets/markets.component.ts - 58 + 62 libs/ui/src/lib/i18n.ts @@ -1791,7 +1795,7 @@ An error occurred while merging this asset profile into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 942 + 944 @@ -1887,7 +1891,7 @@ Obecny tydzień apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 @@ -2039,7 +2043,7 @@ Bezwzględne Osiągi Brutto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 80 + 88 @@ -2051,7 +2055,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 94 + 102 @@ -2059,7 +2063,7 @@ Bezwzględne Osiągi Netto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 114 + 122 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -2071,7 +2075,7 @@ Osiągi Netto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 129 + 137 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -2083,7 +2087,7 @@ Suma Aktywów apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 152 + 165 @@ -2091,7 +2095,7 @@ Siła Nabywcza apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 292 + 305 @@ -2099,7 +2103,7 @@ Wykluczone z Analizy apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 324 + 337 @@ -2107,7 +2111,7 @@ Pasywa (Zobowiązania Finansowe) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 355 + 368 apps/client/src/app/pages/features/features-page.html @@ -2119,7 +2123,7 @@ Wartość Netto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 378 + 391 @@ -2127,7 +2131,7 @@ Osiągi w Ujęciu Rocznym apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 393 + 406 @@ -2135,7 +2139,7 @@ Wprowadź wysokość funduszu rezerwowego: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 160 + 169 @@ -2171,11 +2175,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 235 + 238 libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 76 @@ -2363,7 +2367,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 366 + 368 @@ -2371,11 +2375,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 - 265 + 267 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -2383,11 +2387,11 @@ 1 rok apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -2403,11 +2407,11 @@ 5 lat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -2423,19 +2427,11 @@ Maksimum apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 277 + 279 libs/ui/src/lib/assistant/assistant.component.ts - 416 - - - - Identifier has been copied to the clipboard - Identifier has been copied to the clipboard - - apps/client/src/app/components/access-table/access-table.component.ts - 149 + 418 @@ -2495,7 +2491,7 @@ Add Account libs/common/src/lib/routes/routes.ts - 87 + 101 @@ -2707,7 +2703,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 214 + 227 @@ -2747,7 +2743,7 @@ ID Użytkownika apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 116 + 113 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2787,7 +2783,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 197 @@ -2799,7 +2795,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 195 @@ -2811,7 +2807,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 194 + 198 @@ -2835,7 +2831,7 @@ libs/common/src/lib/routes/routes.ts - 270 + 296 @@ -2851,7 +2847,7 @@ libs/common/src/lib/routes/routes.ts - 235 + 261 @@ -2867,7 +2863,7 @@ libs/common/src/lib/routes/routes.ts - 243 + 269 @@ -2883,7 +2879,7 @@ libs/common/src/lib/routes/routes.ts - 259 + 285 @@ -2955,19 +2951,19 @@ libs/common/src/lib/routes/routes.ts - 104 + 123 libs/ui/src/lib/assistant/assistant.html - 84 + 85 Oops, cash balance transfer has failed. Ups, transfer salda nie powiódł się. - apps/client/src/app/pages/accounts/accounts-page.component.ts - 199 + apps/client/src/app/pages/accounts/account-dialog-host/account-dialog-host.component.ts + 365 @@ -2991,7 +2987,7 @@ ID konta apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 108 + 109 @@ -3039,7 +3035,7 @@ libs/common/src/lib/routes/routes.ts - 78 + 92 @@ -3051,7 +3047,7 @@ libs/common/src/lib/routes/routes.ts - 65 + 79 @@ -3067,7 +3063,7 @@ libs/common/src/lib/routes/routes.ts - 70 + 84 @@ -3079,7 +3075,7 @@ libs/common/src/lib/routes/routes.ts - 75 + 89 @@ -3115,11 +3111,11 @@ libs/common/src/lib/routes/routes.ts - 143 + 169 libs/common/src/lib/routes/routes.ts - 220 + 246 @@ -3231,7 +3227,7 @@ libs/common/src/lib/routes/routes.ts - 275 + 301 @@ -3239,11 +3235,11 @@ Nie udało się przetworzyć konfiguracji scrapera apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 676 + 678 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 679 + 681 @@ -3295,7 +3291,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 327 @@ -3323,7 +3319,7 @@ libs/common/src/lib/routes/routes.ts - 306 + 332 @@ -3495,7 +3491,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 196 apps/client/src/app/pages/public/public-page.html @@ -3503,15 +3499,15 @@ libs/common/src/lib/routes/routes.ts - 125 + 144 libs/common/src/lib/routes/routes.ts - 217 + 243 libs/ui/src/lib/assistant/assistant.html - 110 + 111 @@ -3519,7 +3515,7 @@ This action cannot be undone. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 961 + 963 @@ -3539,7 +3535,7 @@ libs/common/src/lib/routes/routes.ts - 135 + 154 @@ -3571,15 +3567,15 @@ libs/common/src/lib/routes/routes.ts - 130 + 149 libs/common/src/lib/routes/routes.ts - 311 + 337 libs/common/src/lib/routes/routes.ts - 359 + 385 @@ -3895,7 +3891,7 @@ Do you really want to delete these activities? libs/ui/src/lib/activities-table/activities-table.component.ts - 344 + 327 @@ -3999,7 +3995,7 @@ Oops! Could not delete the asset profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 54 + 60 @@ -4071,7 +4067,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 169 + 195 @@ -4119,7 +4115,7 @@ Do you really want to merge this asset profile into it? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 965 + 967 @@ -4263,7 +4259,7 @@ libs/common/src/lib/routes/routes.ts - 179 + 205 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -4347,7 +4343,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 263 @@ -4359,11 +4355,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 31 libs/ui/src/lib/activities-table/activities-table.component.html - 432 + 435 @@ -4375,11 +4371,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 54 + 57 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -4387,7 +4383,7 @@ Importowanie danych... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 176 @@ -4395,7 +4391,7 @@ Importowanie zakończone apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 183 + 187 @@ -4411,7 +4407,7 @@ Weryfikacja danych... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 294 + 298 @@ -4487,7 +4483,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 590 + 591 @@ -4515,7 +4511,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 - 809 + 811 @@ -4531,7 +4527,7 @@ libs/common/src/lib/routes/routes.ts - 184 + 210 @@ -4547,7 +4543,7 @@ Wg. platformy apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 39 + 41 @@ -4555,7 +4551,7 @@ Wg. waluty apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 58 + 60 @@ -4563,7 +4559,7 @@ Wg. klasy aktywów apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 80 + 82 @@ -4571,7 +4567,7 @@ Wg. inwestycji apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 102 + 104 @@ -4579,7 +4575,7 @@ Wg. sektora apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 125 + 127 @@ -4587,7 +4583,7 @@ Wg. kontynentu apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 148 + 150 @@ -4595,7 +4591,7 @@ Wg. rynku apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 170 + 172 @@ -4603,7 +4599,7 @@ Regiony apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 193 + 195 apps/client/src/app/pages/public/public-page.html @@ -4631,7 +4627,7 @@ Rynki Rozwinięte apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 216 + 218 apps/client/src/app/pages/public/public-page.html @@ -4651,7 +4647,7 @@ Rynki Wschodzące apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 228 apps/client/src/app/pages/public/public-page.html @@ -4663,7 +4659,7 @@ Inne Rynki apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 236 + 238 apps/client/src/app/pages/public/public-page.html @@ -4675,7 +4671,7 @@ Wg. kont apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 283 + 285 @@ -4683,7 +4679,7 @@ Wg. Dostawcy ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 303 + 305 @@ -4691,7 +4687,7 @@ Wg. kraju apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 261 + 263 @@ -4703,7 +4699,7 @@ libs/common/src/lib/routes/routes.ts - 189 + 215 @@ -4727,7 +4723,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 479 + 492 apps/client/src/app/pages/features/features-page.html @@ -4871,7 +4867,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 347 @@ -4895,7 +4891,7 @@ Do you really want to remove this received access? apps/client/src/app/components/access-table/access-table.component.ts - 176 + 152 @@ -4919,7 +4915,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 249 + 251 @@ -5075,11 +5071,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 762 + 764 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 765 + 767 @@ -5131,7 +5127,7 @@ libs/common/src/lib/routes/routes.ts - 331 + 357 @@ -5163,7 +5159,7 @@ libs/common/src/lib/routes/routes.ts - 379 + 405 @@ -5172,11 +5168,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 370 + 396 libs/common/src/lib/routes/routes.ts - 374 + 400 @@ -5464,7 +5460,7 @@ Data gathering has been started. apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 413 + 386 @@ -5500,7 +5496,7 @@ libs/common/src/lib/routes/routes.ts - 382 + 408 @@ -5576,11 +5572,11 @@ Eksportuj Działalności libs/ui/src/lib/activities-table/activities-table.component.html - 73 + 76 libs/ui/src/lib/activities-table/activities-table.component.html - 460 + 463 @@ -5588,11 +5584,11 @@ Eksportuj Wersje Robocze jako ICS libs/ui/src/lib/activities-table/activities-table.component.html - 87 + 90 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 476 @@ -5600,7 +5596,7 @@ Przygotuj Wstępną Wersję libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/i18n.ts @@ -5612,7 +5608,7 @@ Sklonuj libs/ui/src/lib/activities-table/activities-table.component.html - 521 + 524 @@ -5620,7 +5616,7 @@ Eksportuj Wersję Roboczą jako ICS libs/ui/src/lib/activities-table/activities-table.component.html - 533 + 536 @@ -5628,11 +5624,11 @@ Czy na pewno chcesz usunąć tę działalność? libs/ui/src/lib/activities-table/activities-table.component.ts - 343 + 326 libs/ui/src/lib/activities-table/activities-table.component.ts - 354 + 337 @@ -5644,7 +5640,7 @@ libs/ui/src/lib/assistant/assistant.html - 140 + 141 @@ -5687,6 +5683,14 @@ 286 + + Add to Watchlist + Add to Watchlist + + libs/common/src/lib/routes/routes.ts + 163 + + Market data provided by Dane rynkowe dostarczone przez @@ -5724,7 +5728,7 @@ This asset profile cannot be merged into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 920 + 922 @@ -5744,7 +5748,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 465 + 478 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5772,11 +5776,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 124 + 126 libs/ui/src/lib/holdings-table/holdings-table.component.html - 125 + 127 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5796,7 +5800,7 @@ Pokaż wszystko libs/ui/src/lib/holdings-table/holdings-table.component.html - 216 + 222 @@ -5804,15 +5808,15 @@ Konto apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 102 + 109 libs/common/src/lib/routes/routes.ts - 94 + 108 libs/ui/src/lib/activities-table/activities-table.component.html - 362 + 365 libs/ui/src/lib/i18n.ts @@ -5848,7 +5852,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 266 + 268 libs/ui/src/lib/i18n.ts @@ -5880,7 +5884,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 287 libs/ui/src/lib/i18n.ts @@ -5916,15 +5920,15 @@ Fundusz Rezerwowy apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 229 + 242 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 320 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 412 + 425 apps/client/src/app/pages/features/features-page.html @@ -5996,7 +6000,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 460 + 462 @@ -6020,7 +6024,7 @@ Brak transakcji apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 148 + 138 @@ -6080,7 +6084,7 @@ Export libs/ui/src/lib/activities-table/activities-table.component.html - 69 + 72 @@ -6136,7 +6140,7 @@ Kupno apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 35 + 43 libs/ui/src/lib/i18n.ts @@ -6148,11 +6152,11 @@ Opłata apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 238 + 239 libs/ui/src/lib/activities-table/activities-table.component.html - 285 + 288 libs/ui/src/lib/i18n.ts @@ -6180,7 +6184,7 @@ Sprzedaż apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 49 + 57 libs/ui/src/lib/i18n.ts @@ -6200,7 +6204,7 @@ Gotówka apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 274 @@ -6300,7 +6304,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 66 + 74 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -6364,7 +6368,7 @@ Brak danych apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 247 + 249 apps/client/src/app/pages/public/public-page.html @@ -6376,11 +6380,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 462 + 464 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 476 + 478 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6392,7 +6396,7 @@ Portfolio Filters apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 128 + 125 @@ -6452,7 +6456,7 @@ Obecna cena rynkowa wynosi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 854 + 856 @@ -6468,7 +6472,7 @@ Zakres Dat libs/ui/src/lib/assistant/assistant.html - 170 + 171 @@ -6496,7 +6500,7 @@ Ups! Nie udało się przyznać dostępu. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 256 + 314 @@ -6592,7 +6596,7 @@ Dotychczasowy tydzień libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6600,11 +6604,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6612,7 +6616,7 @@ Od początku miesiąca libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6620,11 +6624,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6640,7 +6644,7 @@ Od początku roku libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -6672,7 +6676,7 @@ Resetuj Filtry libs/ui/src/lib/assistant/assistant.html - 204 + 205 @@ -6680,7 +6684,7 @@ rok apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6692,7 +6696,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -6700,11 +6704,11 @@ lata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -6712,7 +6716,7 @@ Zastosuj Filtry libs/ui/src/lib/assistant/assistant.html - 217 + 218 @@ -6732,7 +6736,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 451 @@ -6752,7 +6756,7 @@ libs/common/src/lib/routes/routes.ts - 290 + 316 @@ -6764,7 +6768,7 @@ libs/common/src/lib/routes/routes.ts - 298 + 324 @@ -6773,11 +6777,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 293 + 319 libs/common/src/lib/routes/routes.ts - 296 + 322 @@ -6785,7 +6789,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 245 + 247 @@ -6809,7 +6813,7 @@ Aktywne apps/client/src/app/components/home-holdings/home-holdings.component.ts - 73 + 77 @@ -6817,7 +6821,7 @@ Zamknięte apps/client/src/app/components/home-holdings/home-holdings.component.ts - 74 + 78 @@ -6869,7 +6873,7 @@ {VAR_PLURAL, plural, =1 {działalność} other {działalność}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 18 + 25 @@ -6885,7 +6889,7 @@ Usuń aktywności libs/ui/src/lib/activities-table/activities-table.component.html - 111 + 114 @@ -6893,7 +6897,7 @@ Internacjonalizacja libs/common/src/lib/routes/routes.ts - 149 + 175 @@ -6909,7 +6913,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 450 + 452 @@ -6933,7 +6937,7 @@ Wg. Holdingu ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 328 + 330 @@ -6941,7 +6945,7 @@ Przybliżenie oparte na najwyższych aktywach każdego funduszu ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 335 + 337 @@ -6957,7 +6961,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 164 + 190 @@ -6997,7 +7001,7 @@ Punkty Odniesienia apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 118 @@ -7005,7 +7009,7 @@ Tabela apps/client/src/app/components/home-holdings/home-holdings.component.ts - 62 + 66 @@ -7013,7 +7017,7 @@ Wykres apps/client/src/app/components/home-holdings/home-holdings.component.ts - 67 + 71 @@ -7121,7 +7125,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 53 + 59 @@ -7225,7 +7229,7 @@ Podgląd inwestycji libs/ui/src/lib/activities-table/activities-table.component.html - 499 + 502 @@ -7233,7 +7237,7 @@ Do you really want to delete these asset profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 70 + 76 @@ -7241,15 +7245,15 @@ Błąd apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 844 + 846 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 921 + 923 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 943 + 945 @@ -7273,7 +7277,7 @@ Ups! Nie udało się zaktualizować dostępu. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 354 + 414 @@ -7313,11 +7317,11 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 143 + 152 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 117 + 118 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7325,7 +7329,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 321 + 323 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -7369,7 +7373,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 145 + 154 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7381,11 +7385,11 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 119 + 120 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 323 + 325 libs/ui/src/lib/i18n.ts @@ -7413,7 +7417,7 @@ Kopiuj link do schowka apps/client/src/app/components/access-table/access-table.component.html - 112 + 82 @@ -7601,7 +7605,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 107 + 110 @@ -7633,7 +7637,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 603 + 604 @@ -7693,7 +7697,7 @@ Ups! Nie znaleziono żadnych aktywów. libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html - 43 + 44 @@ -7749,7 +7753,7 @@ libs/common/src/lib/routes/routes.ts - 343 + 369 @@ -7765,7 +7769,7 @@ libs/common/src/lib/routes/routes.ts - 351 + 377 @@ -7774,11 +7778,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 346 + 372 libs/common/src/lib/routes/routes.ts - 349 + 375 @@ -7787,11 +7791,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 338 + 364 libs/common/src/lib/routes/routes.ts - 341 + 367 @@ -7831,7 +7835,7 @@ Czy na pewno chcesz usunąć klucz API?? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 148 + 151 @@ -7951,7 +7955,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 158 + 167 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7959,15 +7963,15 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 158 + 167 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 128 + 129 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 332 + 334 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -8015,7 +8019,7 @@ Wprowadź swój klucz API Ghostfolio. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 167 + 170 @@ -8039,7 +8043,7 @@ Link został skopiowany do schowka apps/client/src/app/components/access-table/access-table.component.ts - 161 + 137 @@ -8047,7 +8051,7 @@ Leniwy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8055,7 +8059,7 @@ Natychmiastowy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8063,7 +8067,7 @@ Domyślna cena rynkowa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 644 + 645 @@ -8079,7 +8083,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 - 529 + 531 @@ -8095,7 +8099,7 @@ Nagłówki żądań HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 657 + 658 @@ -8103,7 +8107,7 @@ koniec dnia apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8111,7 +8115,7 @@ w czasie rzeczywistym apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8135,7 +8139,7 @@ Zmiana libs/ui/src/lib/holdings-table/holdings-table.component.html - 146 + 148 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8171,11 +8175,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 168 + 170 libs/ui/src/lib/holdings-table/holdings-table.component.html - 169 + 171 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8239,7 +8243,7 @@ Additional requests are granted while you are setting up your instance apps/client/src/app/components/admin-settings/admin-settings.component.ts - 87 + 88 @@ -8308,11 +8312,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 262 + 288 libs/common/src/lib/routes/routes.ts - 265 + 291 @@ -8324,7 +8328,7 @@ libs/common/src/lib/routes/routes.ts - 267 + 293 @@ -8340,7 +8344,7 @@ () jest już w użyciu. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 963 + 965 @@ -8348,7 +8352,7 @@ Wystąpił błąd podczas aktualizacji do (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 807 + 809 @@ -8436,7 +8440,7 @@ libs/common/src/lib/routes/routes.ts - 140 + 166 @@ -8452,11 +8456,11 @@ {VAR_PLURAL, plural, =1 {Activity} other {Activities}} libs/ui/src/lib/activities-table/activities-table.component.html - 70 + 73 libs/ui/src/lib/activities-table/activities-table.component.html - 108 + 111 @@ -8481,11 +8485,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 230 + 256 libs/common/src/lib/routes/routes.ts - 233 + 259 @@ -8605,7 +8609,7 @@ Szybkie linki libs/ui/src/lib/assistant/assistant.html - 58 + 59 @@ -8621,7 +8625,7 @@ libs/common/src/lib/routes/routes.ts - 281 + 307 @@ -8629,7 +8633,7 @@ Alternatywa Open Source dla libs/common/src/lib/routes/routes.ts - 376 + 402 @@ -8662,15 +8666,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 362 + 388 libs/common/src/lib/routes/routes.ts - 365 + 391 libs/common/src/lib/routes/routes.ts - 373 + 399 @@ -8679,11 +8683,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 354 + 380 libs/common/src/lib/routes/routes.ts - 357 + 383 @@ -8763,7 +8767,7 @@ Bieżący miesiąc apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 @@ -8908,11 +8912,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 386 + 412 libs/common/src/lib/routes/routes.ts - 387 + 413 @@ -8944,7 +8948,7 @@ Akcje apps/client/src/app/components/markets/markets.component.ts - 53 + 57 apps/client/src/app/pages/features/features-page.html @@ -8956,7 +8960,7 @@ Kryptowaluty apps/client/src/app/components/markets/markets.component.ts - 54 + 58 apps/client/src/app/pages/features/features-page.html @@ -9084,7 +9088,7 @@ Nie znaleziono wyników... libs/ui/src/lib/assistant/assistant.html - 51 + 52 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index d45525e084..fa8cd24b96 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -58,19 +58,19 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 7 + 10 libs/ui/src/lib/activities-table/activities-table.component.html - 204 + 207 Details Detalhes - apps/client/src/app/components/access-table/access-table.component.html - 49 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 137 @@ -78,7 +78,7 @@ Revogar apps/client/src/app/components/access-table/access-table.component.html - 138 + 100 @@ -102,7 +102,7 @@ Pretende realmente revogar este acesso concedido? apps/client/src/app/components/access-table/access-table.component.ts - 177 + 153 @@ -166,7 +166,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 182 + 185 libs/ui/src/lib/benchmark/benchmark.component.html @@ -230,7 +230,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 329 + 332 @@ -282,15 +282,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 309 + 312 libs/ui/src/lib/activities-table/activities-table.component.html - 346 + 349 libs/ui/src/lib/holdings-table/holdings-table.component.html - 99 + 101 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -306,7 +306,7 @@ Editar apps/client/src/app/components/access-table/access-table.component.html - 104 + 74 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -326,7 +326,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 510 + 513 @@ -334,7 +334,7 @@ Eliminar apps/client/src/app/components/access-table/access-table.component.html - 135 + 97 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -346,7 +346,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 241 + 236 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -374,7 +374,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 545 + 548 libs/ui/src/lib/benchmark/benchmark.component.html @@ -386,7 +386,7 @@ Pretende realmente eliminar esta conta? libs/ui/src/lib/accounts-table/accounts-table.component.ts - 183 + 185 @@ -498,7 +498,7 @@ libs/ui/src/lib/assistant/assistant.html - 140 + 141 @@ -510,7 +510,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 496 @@ -526,7 +526,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 518 + 519 @@ -558,7 +558,7 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 450 @@ -566,11 +566,11 @@ Data apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 527 + 528 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 566 + 567 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -582,7 +582,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 216 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -618,7 +618,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 377 + 350 @@ -638,7 +638,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 52 @@ -674,7 +674,7 @@ Apply current market price apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 220 + 221 @@ -774,7 +774,7 @@ Update Account libs/common/src/lib/routes/routes.ts - 101 + 120 @@ -790,11 +790,11 @@ Adicionar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 622 apps/client/src/app/components/admin-overview/admin-overview.html - 304 + 299 libs/ui/src/lib/account-balances/account-balances.component.html @@ -874,11 +874,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 728 + 730 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 731 + 733 @@ -910,7 +910,7 @@ libs/common/src/lib/routes/routes.ts - 202 + 228 @@ -962,7 +962,7 @@ libs/common/src/lib/routes/routes.ts - 116 + 135 @@ -994,7 +994,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 533 @@ -1002,7 +1002,7 @@ Medo apps/client/src/app/components/markets/markets.component.ts - 57 + 61 libs/ui/src/lib/i18n.ts @@ -1014,7 +1014,7 @@ Ganância apps/client/src/app/components/markets/markets.component.ts - 58 + 62 libs/ui/src/lib/i18n.ts @@ -1034,7 +1034,7 @@ An error occurred while merging this asset profile into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 942 + 944 @@ -1190,7 +1190,7 @@ Desempenho Bruto Absoluto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 80 + 88 @@ -1198,7 +1198,7 @@ Desempenho Líquido Absoluto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 114 + 122 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1210,7 +1210,7 @@ Desempenho Líquido apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 129 + 137 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1222,7 +1222,7 @@ Ativos Totais apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 152 + 165 @@ -1230,7 +1230,7 @@ Poder de Compra apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 292 + 305 @@ -1238,7 +1238,7 @@ Excluído da Análise apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 324 + 337 @@ -1246,7 +1246,7 @@ Valor Líquido apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 378 + 391 @@ -1254,7 +1254,7 @@ Desempenho Anual apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 393 + 406 @@ -1262,7 +1262,7 @@ Por favor, insira o valor do seu fundo de emergência: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 160 + 169 @@ -1298,11 +1298,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 235 + 238 libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 76 @@ -1414,11 +1414,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 124 + 126 libs/ui/src/lib/holdings-table/holdings-table.component.html - 125 + 127 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -1438,7 +1438,7 @@ Mostrar tudo libs/ui/src/lib/holdings-table/holdings-table.component.html - 216 + 222 @@ -1450,7 +1450,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 366 + 368 @@ -1458,11 +1458,11 @@ AATD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -1470,11 +1470,11 @@ 1A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -1490,11 +1490,11 @@ 5A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -1510,19 +1510,11 @@ Máx apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 277 + 279 libs/ui/src/lib/assistant/assistant.component.ts - 416 - - - - Identifier has been copied to the clipboard - Identifier has been copied to the clipboard - - apps/client/src/app/components/access-table/access-table.component.ts - 149 + 418 @@ -1546,7 +1538,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 197 @@ -1558,7 +1550,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 195 @@ -1570,7 +1562,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 194 + 198 @@ -1594,7 +1586,7 @@ libs/common/src/lib/routes/routes.ts - 270 + 296 @@ -1610,7 +1602,7 @@ libs/common/src/lib/routes/routes.ts - 259 + 285 @@ -1650,7 +1642,7 @@ Add Account libs/common/src/lib/routes/routes.ts - 87 + 101 @@ -1762,7 +1754,7 @@ libs/common/src/lib/routes/routes.ts - 75 + 89 @@ -1862,7 +1854,7 @@ ID do Utilizador apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 116 + 113 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1954,11 +1946,11 @@ libs/common/src/lib/routes/routes.ts - 104 + 123 libs/ui/src/lib/assistant/assistant.html - 84 + 85 @@ -1982,7 +1974,7 @@ ID da Conta apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 108 + 109 @@ -2006,7 +1998,7 @@ libs/common/src/lib/routes/routes.ts - 78 + 92 @@ -2118,7 +2110,7 @@ libs/common/src/lib/routes/routes.ts - 275 + 301 @@ -2162,7 +2154,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 327 @@ -2190,7 +2182,7 @@ libs/common/src/lib/routes/routes.ts - 306 + 332 @@ -2226,11 +2218,11 @@ libs/common/src/lib/routes/routes.ts - 143 + 169 libs/common/src/lib/routes/routes.ts - 220 + 246 @@ -2262,15 +2254,15 @@ libs/common/src/lib/routes/routes.ts - 130 + 149 libs/common/src/lib/routes/routes.ts - 311 + 337 libs/common/src/lib/routes/routes.ts - 359 + 385 @@ -2318,7 +2310,7 @@ libs/common/src/lib/routes/routes.ts - 179 + 205 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2338,7 +2330,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 @@ -2358,7 +2350,7 @@ Venda apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 49 + 57 libs/ui/src/lib/i18n.ts @@ -2373,14 +2365,6 @@ 5 - - Copy identifier to clipboard - Copy identifier to clipboard - - apps/client/src/app/components/access-table/access-table.component.html - 120 - - Name, symbol or ISIN Nome, símbolo or ISIN @@ -2418,7 +2402,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 263 @@ -2434,7 +2418,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 251 + 252 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -2442,7 +2426,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 396 + 399 @@ -2450,7 +2434,7 @@ A importar dados... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 176 @@ -2458,7 +2442,7 @@ A importação foi concluída apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 183 + 187 @@ -2502,7 +2486,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 - 809 + 811 @@ -2518,7 +2502,7 @@ libs/common/src/lib/routes/routes.ts - 184 + 210 @@ -2534,7 +2518,7 @@ Por Conta apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 283 + 285 @@ -2542,7 +2526,7 @@ Por Moeda apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 58 + 60 @@ -2550,7 +2534,7 @@ Por Classe de Ativo apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 80 + 82 @@ -2558,7 +2542,7 @@ Por Posse apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 102 + 104 @@ -2566,7 +2550,7 @@ Por Setor apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 125 + 127 @@ -2574,7 +2558,7 @@ Por Continente apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 148 + 150 @@ -2582,7 +2566,7 @@ Por País apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 261 + 263 @@ -2590,7 +2574,7 @@ Regiões apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 193 + 195 apps/client/src/app/pages/public/public-page.html @@ -2618,7 +2602,7 @@ Mercados Desenvoldidos apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 216 + 218 apps/client/src/app/pages/public/public-page.html @@ -2638,7 +2622,7 @@ Mercados Emergentes apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 228 apps/client/src/app/pages/public/public-page.html @@ -2650,7 +2634,7 @@ Outros Mercados apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 236 + 238 apps/client/src/app/pages/public/public-page.html @@ -2666,7 +2650,7 @@ libs/common/src/lib/routes/routes.ts - 189 + 215 @@ -2738,7 +2722,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 196 apps/client/src/app/pages/public/public-page.html @@ -2746,15 +2730,15 @@ libs/common/src/lib/routes/routes.ts - 125 + 144 libs/common/src/lib/routes/routes.ts - 217 + 243 libs/ui/src/lib/assistant/assistant.html - 110 + 111 @@ -2786,7 +2770,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 347 @@ -2874,7 +2858,7 @@ libs/common/src/lib/routes/routes.ts - 331 + 357 @@ -2938,7 +2922,7 @@ libs/common/src/lib/routes/routes.ts - 382 + 408 @@ -2970,7 +2954,7 @@ Rascunho libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/i18n.ts @@ -2986,11 +2970,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 31 libs/ui/src/lib/activities-table/activities-table.component.html - 432 + 435 @@ -2998,11 +2982,11 @@ Exportar Atividades libs/ui/src/lib/activities-table/activities-table.component.html - 73 + 76 libs/ui/src/lib/activities-table/activities-table.component.html - 460 + 463 @@ -3010,11 +2994,11 @@ Exportar Rascunhos como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 87 + 90 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 476 @@ -3022,7 +3006,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 521 + 524 @@ -3030,7 +3014,7 @@ Exportar Rascunho como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 533 + 536 @@ -3038,11 +3022,11 @@ Deseja realmente eliminar esta atividade? libs/ui/src/lib/activities-table/activities-table.component.ts - 343 + 326 libs/ui/src/lib/activities-table/activities-table.component.ts - 354 + 337 @@ -3102,7 +3086,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 465 + 478 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -3126,15 +3110,15 @@ Conta apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 102 + 109 libs/common/src/lib/routes/routes.ts - 94 + 108 libs/ui/src/lib/activities-table/activities-table.component.html - 362 + 365 libs/ui/src/lib/i18n.ts @@ -3162,7 +3146,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 266 + 268 libs/ui/src/lib/i18n.ts @@ -3178,15 +3162,15 @@ Fundo de Emergência apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 229 + 242 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 320 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 412 + 425 apps/client/src/app/pages/features/features-page.html @@ -3210,7 +3194,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 460 + 462 @@ -3246,7 +3230,7 @@ Export libs/ui/src/lib/activities-table/activities-table.component.html - 69 + 72 @@ -3266,7 +3250,7 @@ Dinheiro apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 274 @@ -3366,7 +3350,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 66 + 74 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -3394,7 +3378,7 @@ Sem dados disponíveis apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 247 + 249 apps/client/src/app/pages/public/public-page.html @@ -3406,11 +3390,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 462 + 464 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 476 + 478 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3430,7 +3414,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 476 + 477 @@ -3474,7 +3458,7 @@ libs/common/src/lib/routes/routes.ts - 65 + 79 @@ -3482,7 +3466,7 @@ This action cannot be undone. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 961 + 963 @@ -3502,7 +3486,7 @@ libs/common/src/lib/routes/routes.ts - 135 + 154 @@ -3510,7 +3494,7 @@ A validar dados... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 294 + 298 @@ -3550,7 +3534,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 479 + 492 apps/client/src/app/pages/features/features-page.html @@ -3598,7 +3582,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 287 libs/ui/src/lib/i18n.ts @@ -3642,11 +3626,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 54 + 57 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -3698,7 +3682,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 148 + 138 @@ -3746,7 +3730,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 214 + 227 @@ -3890,7 +3874,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 249 + 251 @@ -4002,11 +3986,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 762 + 764 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 765 + 767 @@ -4026,7 +4010,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 94 + 102 @@ -4101,6 +4085,14 @@ 18 + + Add to Watchlist + Add to Watchlist + + libs/common/src/lib/routes/routes.ts + 163 + + Market data provided by Dados de mercado fornecidos por @@ -4122,7 +4114,7 @@ This asset profile cannot be merged into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 920 + 922 @@ -4174,7 +4166,7 @@ Do you really want to remove this received access? apps/client/src/app/components/access-table/access-table.component.ts - 176 + 152 @@ -4190,7 +4182,7 @@ Por Prestador de ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 303 + 305 @@ -4214,7 +4206,7 @@ The data of this asset profile is moved to () and this asset profile is deleted. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 959 + 961 @@ -4230,7 +4222,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 @@ -4282,7 +4274,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 752 + 754 @@ -4314,7 +4306,7 @@ Por Plataforma apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 39 + 41 @@ -4354,7 +4346,7 @@ libs/common/src/lib/routes/routes.ts - 70 + 84 @@ -4410,7 +4402,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 590 + 591 @@ -4494,7 +4486,7 @@ Responsabilidades apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 355 + 368 apps/client/src/app/pages/features/features-page.html @@ -4514,7 +4506,7 @@ libs/common/src/lib/routes/routes.ts - 235 + 261 @@ -4530,7 +4522,7 @@ libs/common/src/lib/routes/routes.ts - 243 + 269 @@ -4650,7 +4642,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 176 + 202 @@ -4682,7 +4674,7 @@ Configuração do raspador apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 635 @@ -4692,6 +4684,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 69 + Personal Finance Tools @@ -4702,7 +4698,7 @@ libs/common/src/lib/routes/routes.ts - 379 + 405 @@ -4930,7 +4926,7 @@ Comprar apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 35 + 43 libs/ui/src/lib/i18n.ts @@ -4958,7 +4954,7 @@ ETFs sem países apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 138 + 128 @@ -4966,7 +4962,7 @@ ETFs sem setores apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 143 + 133 @@ -4974,7 +4970,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 - 526 + 528 @@ -4998,7 +4994,7 @@ Por mercado apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 170 + 172 @@ -5194,7 +5190,7 @@ Moedas apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 133 + 123 apps/client/src/app/pages/public/public-page.html @@ -5246,11 +5242,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 676 + 678 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 679 + 681 @@ -5390,7 +5386,7 @@ Do you really want to delete these activities? libs/ui/src/lib/activities-table/activities-table.component.ts - 344 + 327 @@ -5494,7 +5490,7 @@ Oops! Could not delete the asset profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 54 + 60 @@ -5550,7 +5546,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 169 + 195 @@ -5599,19 +5595,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 284 + 310 libs/common/src/lib/routes/routes.ts - 285 + 311 libs/common/src/lib/routes/routes.ts - 289 + 315 libs/common/src/lib/routes/routes.ts - 295 + 321 @@ -5620,11 +5616,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 330 libs/common/src/lib/routes/routes.ts - 305 + 331 @@ -5633,31 +5629,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 226 + 252 libs/common/src/lib/routes/routes.ts - 227 + 253 libs/common/src/lib/routes/routes.ts - 232 + 258 libs/common/src/lib/routes/routes.ts - 240 + 266 libs/common/src/lib/routes/routes.ts - 248 + 274 libs/common/src/lib/routes/routes.ts - 256 + 282 libs/common/src/lib/routes/routes.ts - 264 + 290 @@ -5666,11 +5662,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 280 libs/common/src/lib/routes/routes.ts - 257 + 283 @@ -5679,11 +5675,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 238 + 264 libs/common/src/lib/routes/routes.ts - 241 + 267 @@ -5692,11 +5688,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 309 + 335 libs/common/src/lib/routes/routes.ts - 310 + 336 @@ -5705,11 +5701,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 319 + 345 libs/common/src/lib/routes/routes.ts - 320 + 346 @@ -5718,11 +5714,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 329 + 355 libs/common/src/lib/routes/routes.ts - 330 + 356 @@ -5731,31 +5727,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 334 + 360 libs/common/src/lib/routes/routes.ts - 335 + 361 libs/common/src/lib/routes/routes.ts - 340 + 366 libs/common/src/lib/routes/routes.ts - 348 + 374 libs/common/src/lib/routes/routes.ts - 356 + 382 libs/common/src/lib/routes/routes.ts - 364 + 390 libs/common/src/lib/routes/routes.ts - 372 + 398 @@ -5828,11 +5824,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 370 + 396 libs/common/src/lib/routes/routes.ts - 374 + 400 @@ -5864,7 +5860,7 @@ Data gathering has been started. apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 413 + 386 @@ -5900,7 +5896,7 @@ Do you really want to merge this asset profile into it? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 965 + 967 @@ -5984,11 +5980,11 @@ Taxa apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 238 + 239 libs/ui/src/lib/activities-table/activities-table.component.html - 285 + 288 libs/ui/src/lib/i18n.ts @@ -6042,6 +6038,10 @@ apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 113 + libs/ui/src/lib/accounts-table/accounts-table.component.html 10 @@ -6118,17 +6118,21 @@ apps/client/src/app/components/admin-jobs/admin-jobs.html 52 + + libs/common/src/lib/routes/routes.ts + 76 + Do you really want to delete this asset profile? Você realmente deseja excluir este perfil de ativo? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 27 + 33 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 69 + 75 @@ -6335,8 +6339,8 @@ Oops, cash balance transfer has failed. Ops, a transferência do saldo em dinheiro falhou. - apps/client/src/app/pages/accounts/accounts-page.component.ts - 199 + apps/client/src/app/pages/accounts/account-dialog-host/account-dialog-host.component.ts + 365 @@ -6392,7 +6396,7 @@ Portfolio Filters apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 128 + 125 @@ -6452,7 +6456,7 @@ O preço de mercado atual é apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 854 + 856 @@ -6468,7 +6472,7 @@ Período libs/ui/src/lib/assistant/assistant.html - 170 + 171 @@ -6496,7 +6500,7 @@ Ops! Não foi possível conceder acesso. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 256 + 314 @@ -6592,7 +6596,7 @@ Semana até agora libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6600,11 +6604,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6612,7 +6616,7 @@ Do mês até a data libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6620,11 +6624,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6640,7 +6644,7 @@ No acumulado do ano libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -6672,7 +6676,7 @@ Redefinir filtros libs/ui/src/lib/assistant/assistant.html - 204 + 205 @@ -6680,7 +6684,7 @@ ano apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6692,7 +6696,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -6700,11 +6704,11 @@ anos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -6712,7 +6716,7 @@ Aplicar filtros libs/ui/src/lib/assistant/assistant.html - 217 + 218 @@ -6732,7 +6736,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 451 @@ -6752,7 +6756,7 @@ libs/common/src/lib/routes/routes.ts - 290 + 316 @@ -6764,7 +6768,7 @@ libs/common/src/lib/routes/routes.ts - 298 + 324 @@ -6773,11 +6777,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 293 + 319 libs/common/src/lib/routes/routes.ts - 296 + 322 @@ -6785,7 +6789,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 245 + 247 @@ -6809,7 +6813,7 @@ Ativo apps/client/src/app/components/home-holdings/home-holdings.component.ts - 73 + 77 @@ -6817,7 +6821,7 @@ Fechado apps/client/src/app/components/home-holdings/home-holdings.component.ts - 74 + 78 @@ -6869,7 +6873,7 @@ {VAR_PLURAL, plural, =1 {activity} other {activities}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 18 + 25 @@ -6885,7 +6889,7 @@ Excluir atividades libs/ui/src/lib/activities-table/activities-table.component.html - 111 + 114 @@ -6893,7 +6897,7 @@ Internacionalização libs/common/src/lib/routes/routes.ts - 149 + 175 @@ -6909,7 +6913,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 450 + 452 @@ -6933,7 +6937,7 @@ Por ETF Holding apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 328 + 330 @@ -6941,7 +6945,7 @@ Aproximação baseada nas principais participações de cada ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 335 + 337 @@ -6957,7 +6961,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 164 + 190 @@ -6997,7 +7001,7 @@ Referências apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 118 @@ -7005,7 +7009,7 @@ o índice apps/client/src/app/components/home-holdings/home-holdings.component.ts - 62 + 66 @@ -7013,7 +7017,7 @@ Gráfico apps/client/src/app/components/home-holdings/home-holdings.component.ts - 67 + 71 @@ -7121,7 +7125,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 53 + 59 @@ -7225,7 +7229,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 499 + 502 @@ -7233,7 +7237,7 @@ Do you really want to delete these asset profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 70 + 76 @@ -7241,15 +7245,15 @@ Erro apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 844 + 846 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 921 + 923 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 943 + 945 @@ -7273,7 +7277,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 354 + 414 @@ -7313,11 +7317,11 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 143 + 152 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 117 + 118 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7325,7 +7329,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 321 + 323 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -7369,7 +7373,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 145 + 154 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7381,11 +7385,11 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 119 + 120 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 323 + 325 libs/ui/src/lib/i18n.ts @@ -7413,7 +7417,7 @@ Copiar link para a área de transferência apps/client/src/app/components/access-table/access-table.component.html - 112 + 82 @@ -7601,7 +7605,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 107 + 110 @@ -7633,7 +7637,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 603 + 604 @@ -7693,7 +7697,7 @@ Ops! Não foi possível encontrar nenhum ativo. libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html - 43 + 44 @@ -7749,7 +7753,7 @@ libs/common/src/lib/routes/routes.ts - 343 + 369 @@ -7765,7 +7769,7 @@ libs/common/src/lib/routes/routes.ts - 351 + 377 @@ -7774,11 +7778,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 346 + 372 libs/common/src/lib/routes/routes.ts - 349 + 375 @@ -7787,11 +7791,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 338 + 364 libs/common/src/lib/routes/routes.ts - 341 + 367 @@ -7831,7 +7835,7 @@ Você realmente deseja excluir a chave de API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 148 + 151 @@ -7951,7 +7955,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 158 + 167 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7959,15 +7963,15 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 158 + 167 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 128 + 129 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 332 + 334 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -8015,7 +8019,7 @@ Please enter your Ghostfolio API key. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 167 + 170 @@ -8039,7 +8043,7 @@ O link foi copiado para a área de transferência apps/client/src/app/components/access-table/access-table.component.ts - 161 + 137 @@ -8047,7 +8051,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8055,7 +8059,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8063,7 +8067,7 @@ Preço de mercado padrão apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 644 + 645 @@ -8079,7 +8083,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 - 529 + 531 @@ -8095,7 +8099,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 657 + 658 @@ -8103,7 +8107,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8111,7 +8115,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8135,7 +8139,7 @@ Mudar libs/ui/src/lib/holdings-table/holdings-table.component.html - 146 + 148 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8171,11 +8175,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 168 + 170 libs/ui/src/lib/holdings-table/holdings-table.component.html - 169 + 171 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8239,7 +8243,7 @@ Additional requests are granted while you are setting up your instance apps/client/src/app/components/admin-settings/admin-settings.component.ts - 87 + 88 @@ -8308,11 +8312,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 262 + 288 libs/common/src/lib/routes/routes.ts - 265 + 291 @@ -8324,7 +8328,7 @@ libs/common/src/lib/routes/routes.ts - 267 + 293 @@ -8340,7 +8344,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 963 + 965 @@ -8348,7 +8352,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 807 + 809 @@ -8436,7 +8440,7 @@ libs/common/src/lib/routes/routes.ts - 140 + 166 @@ -8452,11 +8456,11 @@ {VAR_PLURAL, plural, =1 {Activity} other {Activities}} libs/ui/src/lib/activities-table/activities-table.component.html - 70 + 73 libs/ui/src/lib/activities-table/activities-table.component.html - 108 + 111 @@ -8481,11 +8485,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 230 + 256 libs/common/src/lib/routes/routes.ts - 233 + 259 @@ -8605,7 +8609,7 @@ Links rápidos libs/ui/src/lib/assistant/assistant.html - 58 + 59 @@ -8621,7 +8625,7 @@ libs/common/src/lib/routes/routes.ts - 281 + 307 @@ -8629,7 +8633,7 @@ Alternativa de software livre ao libs/common/src/lib/routes/routes.ts - 376 + 402 @@ -8662,15 +8666,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 362 + 388 libs/common/src/lib/routes/routes.ts - 365 + 391 libs/common/src/lib/routes/routes.ts - 373 + 399 @@ -8679,11 +8683,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 354 + 380 libs/common/src/lib/routes/routes.ts - 357 + 383 @@ -8763,7 +8767,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 @@ -8908,11 +8912,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 386 + 412 libs/common/src/lib/routes/routes.ts - 387 + 413 @@ -8944,7 +8948,7 @@ Stocks apps/client/src/app/components/markets/markets.component.ts - 53 + 57 apps/client/src/app/pages/features/features-page.html @@ -8956,7 +8960,7 @@ Criptomoedas apps/client/src/app/components/markets/markets.component.ts - 54 + 58 apps/client/src/app/pages/features/features-page.html @@ -9084,7 +9088,7 @@ Nenhum resultado encontrado... libs/ui/src/lib/assistant/assistant.html - 51 + 52 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 8dd15047c0..201d907ea5 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 - 226 + 252 libs/common/src/lib/routes/routes.ts - 227 + 253 libs/common/src/lib/routes/routes.ts - 232 + 258 libs/common/src/lib/routes/routes.ts - 240 + 266 libs/common/src/lib/routes/routes.ts - 248 + 274 libs/common/src/lib/routes/routes.ts - 256 + 282 libs/common/src/lib/routes/routes.ts - 264 + 290 @@ -40,19 +40,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 284 + 310 libs/common/src/lib/routes/routes.ts - 285 + 311 libs/common/src/lib/routes/routes.ts - 289 + 315 libs/common/src/lib/routes/routes.ts - 295 + 321 @@ -61,11 +61,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 330 libs/common/src/lib/routes/routes.ts - 305 + 331 @@ -74,11 +74,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 238 + 264 libs/common/src/lib/routes/routes.ts - 241 + 267 @@ -87,11 +87,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 309 + 335 libs/common/src/lib/routes/routes.ts - 310 + 336 @@ -100,11 +100,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 319 + 345 libs/common/src/lib/routes/routes.ts - 320 + 346 @@ -113,11 +113,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 280 libs/common/src/lib/routes/routes.ts - 257 + 283 @@ -126,11 +126,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 329 + 355 libs/common/src/lib/routes/routes.ts - 330 + 356 @@ -139,31 +139,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 334 + 360 libs/common/src/lib/routes/routes.ts - 335 + 361 libs/common/src/lib/routes/routes.ts - 340 + 366 libs/common/src/lib/routes/routes.ts - 348 + 374 libs/common/src/lib/routes/routes.ts - 356 + 382 libs/common/src/lib/routes/routes.ts - 364 + 390 libs/common/src/lib/routes/routes.ts - 372 + 398 @@ -239,19 +239,19 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 7 + 10 libs/ui/src/lib/activities-table/activities-table.component.html - 204 + 207 Details Ayrıntılar - apps/client/src/app/components/access-table/access-table.component.html - 49 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 137 @@ -259,7 +259,7 @@ Geri Al apps/client/src/app/components/access-table/access-table.component.html - 138 + 100 @@ -283,7 +283,7 @@ Bu erişim iznini geri almayı gerçekten istiyor musunuz? apps/client/src/app/components/access-table/access-table.component.ts - 177 + 153 @@ -363,7 +363,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 182 + 185 libs/ui/src/lib/benchmark/benchmark.component.html @@ -427,7 +427,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 329 + 332 @@ -463,15 +463,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 309 + 312 libs/ui/src/lib/activities-table/activities-table.component.html - 346 + 349 libs/ui/src/lib/holdings-table/holdings-table.component.html - 99 + 101 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -487,7 +487,7 @@ Düzenle apps/client/src/app/components/access-table/access-table.component.html - 104 + 74 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -507,7 +507,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 510 + 513 @@ -515,7 +515,7 @@ Sil apps/client/src/app/components/access-table/access-table.component.html - 135 + 97 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -527,7 +527,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 241 + 236 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -555,7 +555,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 545 + 548 libs/ui/src/lib/benchmark/benchmark.component.html @@ -567,7 +567,7 @@ Bu hesabı silmeyi gerçekten istiyor musunuz? libs/ui/src/lib/accounts-table/accounts-table.component.ts - 183 + 185 @@ -679,7 +679,7 @@ libs/ui/src/lib/assistant/assistant.html - 140 + 141 @@ -691,7 +691,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 496 @@ -707,7 +707,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 518 + 519 @@ -739,7 +739,7 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 450 @@ -747,11 +747,11 @@ Tarih apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 527 + 528 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 566 + 567 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -763,7 +763,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 216 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -799,7 +799,7 @@ Para Birimleri apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 133 + 123 apps/client/src/app/pages/public/public-page.html @@ -819,7 +819,7 @@ Ülkesi Olmayan ETF’ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 138 + 128 @@ -827,7 +827,7 @@ Sektörü Olmayan ETF’ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 143 + 133 @@ -835,7 +835,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 - 526 + 528 @@ -843,7 +843,7 @@ Filtrele... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 377 + 350 @@ -863,7 +863,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 52 @@ -879,7 +879,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 476 + 477 @@ -915,7 +915,7 @@ Apply current market price apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 220 + 221 @@ -1043,7 +1043,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 176 + 202 @@ -1075,7 +1075,7 @@ Veri Toplayıcı Yapılandırması apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 635 @@ -1091,7 +1091,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 251 + 252 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -1099,7 +1099,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 396 + 399 @@ -1109,13 +1109,9 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 - - - Copy identifier to clipboard - Copy identifier to clipboard - apps/client/src/app/components/access-table/access-table.component.html - 120 + libs/common/src/lib/routes/routes.ts + 69 @@ -1223,7 +1219,7 @@ Update Account libs/common/src/lib/routes/routes.ts - 101 + 120 @@ -1263,11 +1259,11 @@ Ekle apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 622 apps/client/src/app/components/admin-overview/admin-overview.html - 304 + 299 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1331,7 +1327,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 752 + 754 @@ -1363,7 +1359,7 @@ The data of this asset profile is moved to () and this asset profile is deleted. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 959 + 961 @@ -1379,7 +1375,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 @@ -1471,11 +1467,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 728 + 730 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 731 + 733 @@ -1515,7 +1511,7 @@ libs/common/src/lib/routes/routes.ts - 202 + 228 @@ -1567,7 +1563,7 @@ libs/common/src/lib/routes/routes.ts - 116 + 135 @@ -1599,7 +1595,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 533 @@ -1607,7 +1603,7 @@ Korku apps/client/src/app/components/markets/markets.component.ts - 57 + 61 libs/ui/src/lib/i18n.ts @@ -1619,7 +1615,7 @@ Açgözlülük apps/client/src/app/components/markets/markets.component.ts - 58 + 62 libs/ui/src/lib/i18n.ts @@ -1639,7 +1635,7 @@ An error occurred while merging this asset profile into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 942 + 944 @@ -1735,7 +1731,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 @@ -1887,7 +1883,7 @@ Toplam Brüt Performans apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 80 + 88 @@ -1895,7 +1891,7 @@ Toplam Net Performans apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 114 + 122 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1907,7 +1903,7 @@ Net Performans apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 129 + 137 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1919,7 +1915,7 @@ Toplam Varlıklar apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 152 + 165 @@ -1927,7 +1923,7 @@ Alım Limiti apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 292 + 305 @@ -1935,7 +1931,7 @@ Analize Dahil Edilmemiştir. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 324 + 337 @@ -1943,7 +1939,7 @@ Yükümlülükler apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 355 + 368 apps/client/src/app/pages/features/features-page.html @@ -1955,7 +1951,7 @@ Toplam Varlık apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 378 + 391 @@ -1963,7 +1959,7 @@ Yıllıklandırılmış Performans apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 393 + 406 @@ -1971,7 +1967,7 @@ Lütfen acil durum yedeği meblağını giriniz: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 160 + 169 @@ -2007,11 +2003,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 235 + 238 libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 76 @@ -2023,7 +2019,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 94 + 102 @@ -2211,7 +2207,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 366 + 368 @@ -2219,11 +2215,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -2231,11 +2227,11 @@ 1Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -2251,11 +2247,11 @@ 5Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -2271,19 +2267,11 @@ Maks. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 277 + 279 libs/ui/src/lib/assistant/assistant.component.ts - 416 - - - - Identifier has been copied to the clipboard - Identifier has been copied to the clipboard - - apps/client/src/app/components/access-table/access-table.component.ts - 149 + 418 @@ -2307,7 +2295,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 197 @@ -2319,7 +2307,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 195 @@ -2331,7 +2319,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 194 + 198 @@ -2355,7 +2343,7 @@ libs/common/src/lib/routes/routes.ts - 270 + 296 @@ -2371,7 +2359,7 @@ libs/common/src/lib/routes/routes.ts - 235 + 261 @@ -2387,7 +2375,7 @@ libs/common/src/lib/routes/routes.ts - 243 + 269 @@ -2403,7 +2391,7 @@ libs/common/src/lib/routes/routes.ts - 259 + 285 @@ -2475,11 +2463,11 @@ libs/common/src/lib/routes/routes.ts - 104 + 123 libs/ui/src/lib/assistant/assistant.html - 84 + 85 @@ -2503,7 +2491,7 @@ Hesap Kimliği apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 108 + 109 @@ -2527,7 +2515,7 @@ libs/common/src/lib/routes/routes.ts - 78 + 92 @@ -2539,7 +2527,7 @@ libs/common/src/lib/routes/routes.ts - 65 + 79 @@ -2555,7 +2543,7 @@ libs/common/src/lib/routes/routes.ts - 70 + 84 @@ -2567,7 +2555,7 @@ libs/common/src/lib/routes/routes.ts - 75 + 89 @@ -2603,11 +2591,11 @@ libs/common/src/lib/routes/routes.ts - 143 + 169 libs/common/src/lib/routes/routes.ts - 220 + 246 @@ -2719,7 +2707,7 @@ libs/common/src/lib/routes/routes.ts - 275 + 301 @@ -2727,11 +2715,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 676 + 678 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 679 + 681 @@ -2783,7 +2771,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 327 @@ -2811,7 +2799,7 @@ libs/common/src/lib/routes/routes.ts - 306 + 332 @@ -2995,7 +2983,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 196 apps/client/src/app/pages/public/public-page.html @@ -3003,15 +2991,15 @@ libs/common/src/lib/routes/routes.ts - 125 + 144 libs/common/src/lib/routes/routes.ts - 217 + 243 libs/ui/src/lib/assistant/assistant.html - 110 + 111 @@ -3019,7 +3007,7 @@ This action cannot be undone. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 961 + 963 @@ -3039,7 +3027,7 @@ libs/common/src/lib/routes/routes.ts - 135 + 154 @@ -3071,15 +3059,15 @@ libs/common/src/lib/routes/routes.ts - 130 + 149 libs/common/src/lib/routes/routes.ts - 311 + 337 libs/common/src/lib/routes/routes.ts - 359 + 385 @@ -3235,7 +3223,7 @@ Do you really want to delete these activities? libs/ui/src/lib/activities-table/activities-table.component.ts - 344 + 327 @@ -3339,7 +3327,7 @@ Oops! Could not delete the asset profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 54 + 60 @@ -3411,7 +3399,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 169 + 195 @@ -3535,7 +3523,7 @@ libs/common/src/lib/routes/routes.ts - 179 + 205 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -3595,7 +3583,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 263 @@ -3607,11 +3595,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 31 libs/ui/src/lib/activities-table/activities-table.component.html - 432 + 435 @@ -3623,11 +3611,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 54 + 57 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -3635,7 +3623,7 @@ Veri içe aktarılıyor... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 176 @@ -3643,7 +3631,7 @@ İçe aktarma tamamlandı apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 183 + 187 @@ -3659,7 +3647,7 @@ Veri doğrulanıyor... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 294 + 298 @@ -3727,7 +3715,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 590 + 591 @@ -3755,7 +3743,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 - 809 + 811 @@ -3787,7 +3775,7 @@ libs/common/src/lib/routes/routes.ts - 184 + 210 @@ -3803,7 +3791,7 @@ Platforma Göre apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 39 + 41 @@ -3811,7 +3799,7 @@ Para Birimine Göre apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 58 + 60 @@ -3819,7 +3807,7 @@ Varlık Sınıfına Göre apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 80 + 82 @@ -3827,7 +3815,7 @@ Varlığa Göre apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 102 + 104 @@ -3835,7 +3823,7 @@ Sektöre Göre apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 125 + 127 @@ -3843,7 +3831,7 @@ Kıtaya Göre apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 148 + 150 @@ -3851,7 +3839,7 @@ Piyasaya Göre apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 170 + 172 @@ -3859,7 +3847,7 @@ Bölgeler apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 193 + 195 apps/client/src/app/pages/public/public-page.html @@ -3887,7 +3875,7 @@ Gelişmiş Piyasalar apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 216 + 218 apps/client/src/app/pages/public/public-page.html @@ -3907,7 +3895,7 @@ Gelişmekte Olan Piyasalar apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 228 apps/client/src/app/pages/public/public-page.html @@ -3919,7 +3907,7 @@ Diğer Piyasalar apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 236 + 238 apps/client/src/app/pages/public/public-page.html @@ -3931,7 +3919,7 @@ Hesaba Göre apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 283 + 285 @@ -3939,7 +3927,7 @@ ETF Sağlayıcısına Göre apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 303 + 305 @@ -3947,7 +3935,7 @@ Ülkeye Göre apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 261 + 263 @@ -3959,7 +3947,7 @@ libs/common/src/lib/routes/routes.ts - 189 + 215 @@ -3983,7 +3971,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 479 + 492 apps/client/src/app/pages/features/features-page.html @@ -4127,7 +4115,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 347 @@ -4151,7 +4139,7 @@ Do you really want to remove this received access? apps/client/src/app/components/access-table/access-table.component.ts - 176 + 152 @@ -4175,7 +4163,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 249 + 251 @@ -4331,11 +4319,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 762 + 764 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 765 + 767 @@ -4387,7 +4375,7 @@ libs/common/src/lib/routes/routes.ts - 331 + 357 @@ -4439,7 +4427,7 @@ libs/common/src/lib/routes/routes.ts - 379 + 405 @@ -4448,11 +4436,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 370 + 396 libs/common/src/lib/routes/routes.ts - 374 + 400 @@ -4732,7 +4720,7 @@ Data gathering has been started. apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 413 + 386 @@ -4768,7 +4756,7 @@ libs/common/src/lib/routes/routes.ts - 382 + 408 @@ -4844,7 +4832,7 @@ Add Account libs/common/src/lib/routes/routes.ts - 87 + 101 @@ -5044,7 +5032,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 214 + 227 @@ -5084,7 +5072,7 @@ Kullanıcı Kimliği apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 116 + 113 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -5140,11 +5128,11 @@ İşlemleri Dışa Aktar libs/ui/src/lib/activities-table/activities-table.component.html - 73 + 76 libs/ui/src/lib/activities-table/activities-table.component.html - 460 + 463 @@ -5152,11 +5140,11 @@ Taslakları ICS Olarak Dışa Aktar libs/ui/src/lib/activities-table/activities-table.component.html - 87 + 90 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 476 @@ -5164,7 +5152,7 @@ Taslak libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/i18n.ts @@ -5176,7 +5164,7 @@ Klonla libs/ui/src/lib/activities-table/activities-table.component.html - 521 + 524 @@ -5184,7 +5172,7 @@ Taslakları ICS Olarak Dışa Aktar libs/ui/src/lib/activities-table/activities-table.component.html - 533 + 536 @@ -5192,11 +5180,11 @@ TBu işlemi silmeyi gerçekten istiyor musunuz? libs/ui/src/lib/activities-table/activities-table.component.ts - 343 + 326 libs/ui/src/lib/activities-table/activities-table.component.ts - 354 + 337 @@ -5231,6 +5219,14 @@ 286 + + Add to Watchlist + Add to Watchlist + + libs/common/src/lib/routes/routes.ts + 163 + + Market data provided by Piyasa verileri tarafından sağlanmıştır @@ -5268,7 +5264,7 @@ This asset profile cannot be merged into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 920 + 922 @@ -5288,7 +5284,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 465 + 478 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5316,11 +5312,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 124 + 126 libs/ui/src/lib/holdings-table/holdings-table.component.html - 125 + 127 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5340,7 +5336,7 @@ Tümünü göster libs/ui/src/lib/holdings-table/holdings-table.component.html - 216 + 222 @@ -5348,15 +5344,15 @@ Hesap apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 102 + 109 libs/common/src/lib/routes/routes.ts - 94 + 108 libs/ui/src/lib/activities-table/activities-table.component.html - 362 + 365 libs/ui/src/lib/i18n.ts @@ -5392,7 +5388,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 266 + 268 libs/ui/src/lib/i18n.ts @@ -5424,7 +5420,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 287 libs/ui/src/lib/i18n.ts @@ -5460,15 +5456,15 @@ Acil Durum Fonu apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 229 + 242 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 320 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 412 + 425 apps/client/src/app/pages/features/features-page.html @@ -5540,7 +5536,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 460 + 462 @@ -5564,7 +5560,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 148 + 138 @@ -5624,7 +5620,7 @@ Export libs/ui/src/lib/activities-table/activities-table.component.html - 69 + 72 @@ -5680,7 +5676,7 @@ Al apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 35 + 43 libs/ui/src/lib/i18n.ts @@ -5708,7 +5704,7 @@ Sat apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 49 + 57 libs/ui/src/lib/i18n.ts @@ -5728,7 +5724,7 @@ Nakit apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 274 @@ -5828,7 +5824,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 66 + 74 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -5856,7 +5852,7 @@ Veri mevcut değil apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 247 + 249 apps/client/src/app/pages/public/public-page.html @@ -5868,11 +5864,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 462 + 464 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 476 + 478 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5908,7 +5904,7 @@ Do you really want to merge this asset profile into it? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 965 + 967 @@ -5992,11 +5988,11 @@ Ücret apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 238 + 239 libs/ui/src/lib/activities-table/activities-table.component.html - 285 + 288 libs/ui/src/lib/i18n.ts @@ -6042,6 +6038,10 @@ apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 113 + libs/ui/src/lib/accounts-table/accounts-table.component.html 10 @@ -6118,17 +6118,21 @@ apps/client/src/app/components/admin-jobs/admin-jobs.html 52 + + libs/common/src/lib/routes/routes.ts + 76 + Do you really want to delete this asset profile? Bu varlık profilini silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 27 + 33 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 69 + 75 @@ -6335,8 +6339,8 @@ Oops, cash balance transfer has failed. Hay Allah, Nakit bakiyesi tranferi başarısız oldu. - apps/client/src/app/pages/accounts/accounts-page.component.ts - 199 + apps/client/src/app/pages/accounts/account-dialog-host/account-dialog-host.component.ts + 365 @@ -6392,7 +6396,7 @@ Portfolio Filters apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 128 + 125 @@ -6452,7 +6456,7 @@ Şu anki piyasa fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 854 + 856 @@ -6468,7 +6472,7 @@ Tarih Aralığı libs/ui/src/lib/assistant/assistant.html - 170 + 171 @@ -6496,7 +6500,7 @@ Hay Allah! Erişim izni verilemedi. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 256 + 314 @@ -6592,7 +6596,7 @@ Hafta içi libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6600,11 +6604,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6612,7 +6616,7 @@ Ay içi libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6620,11 +6624,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6640,7 +6644,7 @@ Yıl içi libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -6672,7 +6676,7 @@ Filtreleri Sıfırla libs/ui/src/lib/assistant/assistant.html - 204 + 205 @@ -6680,7 +6684,7 @@ Yıl apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6692,7 +6696,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -6700,11 +6704,11 @@ Yıllar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -6712,7 +6716,7 @@ Filtreleri Uygula libs/ui/src/lib/assistant/assistant.html - 217 + 218 @@ -6732,7 +6736,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 451 @@ -6752,7 +6756,7 @@ libs/common/src/lib/routes/routes.ts - 290 + 316 @@ -6764,7 +6768,7 @@ libs/common/src/lib/routes/routes.ts - 298 + 324 @@ -6773,11 +6777,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 293 + 319 libs/common/src/lib/routes/routes.ts - 296 + 322 @@ -6785,7 +6789,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 245 + 247 @@ -6809,7 +6813,7 @@ Aktif apps/client/src/app/components/home-holdings/home-holdings.component.ts - 73 + 77 @@ -6817,7 +6821,7 @@ Kapalı apps/client/src/app/components/home-holdings/home-holdings.component.ts - 74 + 78 @@ -6869,7 +6873,7 @@ {VAR_PLURAL, plural, =1 {Etkinlik} other {Etkinlikler}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 18 + 25 @@ -6885,7 +6889,7 @@ Etkinlikleri Sil libs/ui/src/lib/activities-table/activities-table.component.html - 111 + 114 @@ -6893,7 +6897,7 @@ İnternasyonalizasyon libs/common/src/lib/routes/routes.ts - 149 + 175 @@ -6909,7 +6913,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 450 + 452 @@ -6933,7 +6937,7 @@ ETF Portföyü apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 328 + 330 @@ -6941,7 +6945,7 @@ Her ETF’nin en üst tutarlarına dayalı yaklaşım apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 335 + 337 @@ -6957,7 +6961,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 164 + 190 @@ -6997,7 +7001,7 @@ Kıyaslamalar apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 118 @@ -7005,7 +7009,7 @@ Tablo apps/client/src/app/components/home-holdings/home-holdings.component.ts - 62 + 66 @@ -7013,7 +7017,7 @@ Grafik apps/client/src/app/components/home-holdings/home-holdings.component.ts - 67 + 71 @@ -7121,7 +7125,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 53 + 59 @@ -7225,7 +7229,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 499 + 502 @@ -7233,7 +7237,7 @@ Do you really want to delete these asset profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 70 + 76 @@ -7241,15 +7245,15 @@ Hata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 844 + 846 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 921 + 923 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 943 + 945 @@ -7273,7 +7277,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 354 + 414 @@ -7313,11 +7317,11 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 143 + 152 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 117 + 118 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7325,7 +7329,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 321 + 323 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -7369,7 +7373,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 145 + 154 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7381,11 +7385,11 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 119 + 120 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 323 + 325 libs/ui/src/lib/i18n.ts @@ -7413,7 +7417,7 @@ Bağlantıyı panoya kopyala apps/client/src/app/components/access-table/access-table.component.html - 112 + 82 @@ -7601,7 +7605,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 107 + 110 @@ -7633,7 +7637,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 603 + 604 @@ -7693,7 +7697,7 @@ Oops! Herhangi bir varlık bulunamadı. libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html - 43 + 44 @@ -7749,7 +7753,7 @@ libs/common/src/lib/routes/routes.ts - 343 + 369 @@ -7765,7 +7769,7 @@ libs/common/src/lib/routes/routes.ts - 351 + 377 @@ -7774,11 +7778,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 346 + 372 libs/common/src/lib/routes/routes.ts - 349 + 375 @@ -7787,11 +7791,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 338 + 364 libs/common/src/lib/routes/routes.ts - 341 + 367 @@ -7831,7 +7835,7 @@ API anahtarını silmek istediğinize emin misiniz? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 148 + 151 @@ -7951,7 +7955,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 158 + 167 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7959,15 +7963,15 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 158 + 167 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 128 + 129 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 332 + 334 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -8015,7 +8019,7 @@ Lütfen Ghostfolio API anahtarınızı girin. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 167 + 170 @@ -8039,7 +8043,7 @@ Bağlantı panoya kopyalandı apps/client/src/app/components/access-table/access-table.component.ts - 161 + 137 @@ -8047,7 +8051,7 @@ Tembel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8055,7 +8059,7 @@ Anında apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8063,7 +8067,7 @@ Varsayılan Piyasa Fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 644 + 645 @@ -8079,7 +8083,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 - 529 + 531 @@ -8095,7 +8099,7 @@ HTTP İstek Başlıkları apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 657 + 658 @@ -8103,7 +8107,7 @@ gün sonu apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8111,7 +8115,7 @@ gerçek zamanlı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8135,7 +8139,7 @@ Değişim libs/ui/src/lib/holdings-table/holdings-table.component.html - 146 + 148 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8171,11 +8175,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 168 + 170 libs/ui/src/lib/holdings-table/holdings-table.component.html - 169 + 171 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8239,7 +8243,7 @@ Additional requests are granted while you are setting up your instance apps/client/src/app/components/admin-settings/admin-settings.component.ts - 87 + 88 @@ -8308,11 +8312,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 262 + 288 libs/common/src/lib/routes/routes.ts - 265 + 291 @@ -8324,7 +8328,7 @@ libs/common/src/lib/routes/routes.ts - 267 + 293 @@ -8340,7 +8344,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 963 + 965 @@ -8348,7 +8352,7 @@ Güncelleştirilirken bir hata oluştu (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 807 + 809 @@ -8436,7 +8440,7 @@ libs/common/src/lib/routes/routes.ts - 140 + 166 @@ -8452,11 +8456,11 @@ {VAR_PLURAL, plural, =1 {Activity} other {Activities}} libs/ui/src/lib/activities-table/activities-table.component.html - 70 + 73 libs/ui/src/lib/activities-table/activities-table.component.html - 108 + 111 @@ -8481,11 +8485,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 230 + 256 libs/common/src/lib/routes/routes.ts - 233 + 259 @@ -8605,7 +8609,7 @@ Hızlı Bağlantılar libs/ui/src/lib/assistant/assistant.html - 58 + 59 @@ -8621,7 +8625,7 @@ libs/common/src/lib/routes/routes.ts - 281 + 307 @@ -8629,7 +8633,7 @@ Açık Kaynak Alternatifi libs/common/src/lib/routes/routes.ts - 376 + 402 @@ -8662,15 +8666,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 362 + 388 libs/common/src/lib/routes/routes.ts - 365 + 391 libs/common/src/lib/routes/routes.ts - 373 + 399 @@ -8679,11 +8683,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 354 + 380 libs/common/src/lib/routes/routes.ts - 357 + 383 @@ -8763,7 +8767,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 @@ -8908,11 +8912,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 386 + 412 libs/common/src/lib/routes/routes.ts - 387 + 413 @@ -8944,7 +8948,7 @@ Stocks apps/client/src/app/components/markets/markets.component.ts - 53 + 57 apps/client/src/app/pages/features/features-page.html @@ -8956,7 +8960,7 @@ Cryptocurrencies apps/client/src/app/components/markets/markets.component.ts - 54 + 58 apps/client/src/app/pages/features/features-page.html @@ -9084,7 +9088,7 @@ No results found... libs/ui/src/lib/assistant/assistant.html - 51 + 52 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 7bcfb2b595..5a632dcc1e 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -26,7 +26,7 @@ libs/common/src/lib/routes/routes.ts - 306 + 332 @@ -34,7 +34,7 @@ Інтернаціоналізація libs/common/src/lib/routes/routes.ts - 149 + 175 @@ -54,7 +54,7 @@ libs/common/src/lib/routes/routes.ts - 116 + 135 @@ -115,31 +115,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 226 + 252 libs/common/src/lib/routes/routes.ts - 227 + 253 libs/common/src/lib/routes/routes.ts - 232 + 258 libs/common/src/lib/routes/routes.ts - 240 + 266 libs/common/src/lib/routes/routes.ts - 248 + 274 libs/common/src/lib/routes/routes.ts - 256 + 282 libs/common/src/lib/routes/routes.ts - 264 + 290 @@ -148,11 +148,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 238 + 264 libs/common/src/lib/routes/routes.ts - 241 + 267 @@ -161,11 +161,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 280 libs/common/src/lib/routes/routes.ts - 257 + 283 @@ -174,19 +174,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 284 + 310 libs/common/src/lib/routes/routes.ts - 285 + 311 libs/common/src/lib/routes/routes.ts - 289 + 315 libs/common/src/lib/routes/routes.ts - 295 + 321 @@ -195,11 +195,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 330 libs/common/src/lib/routes/routes.ts - 305 + 331 @@ -208,11 +208,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 309 + 335 libs/common/src/lib/routes/routes.ts - 310 + 336 @@ -221,11 +221,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 319 + 345 libs/common/src/lib/routes/routes.ts - 320 + 346 @@ -234,11 +234,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 329 + 355 libs/common/src/lib/routes/routes.ts - 330 + 356 @@ -247,31 +247,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 334 + 360 libs/common/src/lib/routes/routes.ts - 335 + 361 libs/common/src/lib/routes/routes.ts - 340 + 366 libs/common/src/lib/routes/routes.ts - 348 + 374 libs/common/src/lib/routes/routes.ts - 356 + 382 libs/common/src/lib/routes/routes.ts - 364 + 390 libs/common/src/lib/routes/routes.ts - 372 + 398 @@ -342,8 +342,8 @@ Details Деталі - apps/client/src/app/components/access-table/access-table.component.html - 49 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 137 @@ -351,7 +351,7 @@ Скопіювати посилання в буфер обміну apps/client/src/app/components/access-table/access-table.component.html - 112 + 82 @@ -367,7 +367,7 @@ Відкликати apps/client/src/app/components/access-table/access-table.component.html - 138 + 100 @@ -383,7 +383,7 @@ Посилання скопійовано в буфер обміну apps/client/src/app/components/access-table/access-table.component.ts - 161 + 137 @@ -399,7 +399,7 @@ Ви дійсно хочете відкликати цей наданий доступ? apps/client/src/app/components/access-table/access-table.component.ts - 177 + 153 @@ -449,6 +449,10 @@ apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 113 + libs/ui/src/lib/accounts-table/accounts-table.component.html 10 @@ -499,7 +503,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 182 + 185 libs/ui/src/lib/benchmark/benchmark.component.html @@ -563,7 +567,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 329 + 332 @@ -599,15 +603,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 309 + 312 libs/ui/src/lib/activities-table/activities-table.component.html - 346 + 349 libs/ui/src/lib/holdings-table/holdings-table.component.html - 99 + 101 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -623,7 +627,7 @@ Редагувати apps/client/src/app/components/access-table/access-table.component.html - 104 + 74 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -643,7 +647,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 510 + 513 @@ -651,7 +655,7 @@ Видалити apps/client/src/app/components/access-table/access-table.component.html - 135 + 97 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -663,7 +667,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 241 + 236 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -691,7 +695,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 545 + 548 libs/ui/src/lib/benchmark/benchmark.component.html @@ -703,7 +707,7 @@ Ви дійсно хочете видалити цей обліковий запис? libs/ui/src/lib/accounts-table/accounts-table.component.ts - 183 + 185 @@ -735,11 +739,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 7 + 10 libs/ui/src/lib/activities-table/activities-table.component.html - 204 + 207 @@ -749,6 +753,10 @@ apps/client/src/app/components/admin-jobs/admin-jobs.html 52 + + libs/common/src/lib/routes/routes.ts + 76 + Historical Market Data @@ -759,7 +767,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 496 @@ -883,7 +891,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 518 + 519 @@ -915,7 +923,7 @@ Порівняльні показники apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 118 @@ -923,7 +931,7 @@ Валюти apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 133 + 123 apps/client/src/app/pages/public/public-page.html @@ -943,7 +951,7 @@ ETF без країн apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 138 + 128 @@ -951,7 +959,7 @@ ETF без секторів apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 143 + 133 @@ -959,7 +967,7 @@ Під час конвертації джерела даних на сталася помилка. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 526 + 528 @@ -967,7 +975,7 @@ Фільтрувати за... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 377 + 350 @@ -1011,7 +1019,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 52 @@ -1027,7 +1035,7 @@ Частота збору даних apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 476 + 477 @@ -1063,7 +1071,7 @@ Застосувати поточну ринкову ціну apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 220 + 221 @@ -1099,11 +1107,11 @@ Ви дійсно хочете видалити цей профіль активу? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 27 + 33 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 69 + 75 @@ -1111,7 +1119,7 @@ Ви справді хочете видалити ці профілі активів? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 70 + 76 @@ -1119,15 +1127,15 @@ Помилка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 844 + 846 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 921 + 923 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 943 + 945 @@ -1135,7 +1143,7 @@ Поточна ринкова ціна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 854 + 856 @@ -1235,7 +1243,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 176 + 202 @@ -1267,7 +1275,7 @@ Конфігурація скребка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 635 @@ -1311,7 +1319,7 @@ Профіль активу було збережено apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 752 + 754 @@ -1327,7 +1335,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 251 + 252 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -1335,7 +1343,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 396 + 399 @@ -1345,6 +1353,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 69 + Search @@ -1378,14 +1390,6 @@ 20 - - Copy identifier to clipboard - Copy identifier to clipboard - - apps/client/src/app/components/access-table/access-table.component.html - 120 - - Name, symbol or ISIN Назва, символ або ISIN @@ -1491,7 +1495,7 @@ Update Account libs/common/src/lib/routes/routes.ts - 101 + 120 @@ -1511,7 +1515,7 @@ Знайти актив... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 451 @@ -1551,11 +1555,11 @@ Додати apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 622 apps/client/src/app/components/admin-overview/admin-overview.html - 304 + 299 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1615,7 +1619,7 @@ The data of this asset profile is moved to () and this asset profile is deleted. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 959 + 961 @@ -1631,7 +1635,7 @@ Поточний рік apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 @@ -1731,7 +1735,7 @@ Ви дійсно хочете видалити ключ API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 148 + 151 @@ -1747,7 +1751,7 @@ Будь ласка, введіть ваш ключ API Ghostfolio. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 167 + 170 @@ -1907,11 +1911,11 @@ Не вдалося перевірити форму apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 728 + 730 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 731 + 733 @@ -1951,7 +1955,7 @@ libs/common/src/lib/routes/routes.ts - 202 + 228 @@ -2103,11 +2107,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 235 + 238 libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 76 @@ -2127,7 +2131,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 94 + 102 @@ -2155,7 +2159,7 @@ Активний apps/client/src/app/components/home-holdings/home-holdings.component.ts - 73 + 77 @@ -2163,7 +2167,7 @@ Закритий apps/client/src/app/components/home-holdings/home-holdings.component.ts - 74 + 78 @@ -2171,7 +2175,7 @@ Таблиця apps/client/src/app/components/home-holdings/home-holdings.component.ts - 62 + 66 @@ -2179,7 +2183,7 @@ Графік apps/client/src/app/components/home-holdings/home-holdings.component.ts - 67 + 71 @@ -2195,7 +2199,7 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 533 @@ -2203,7 +2207,7 @@ Страх apps/client/src/app/components/markets/markets.component.ts - 57 + 61 libs/ui/src/lib/i18n.ts @@ -2215,7 +2219,7 @@ Жадібність apps/client/src/app/components/markets/markets.component.ts - 58 + 62 libs/ui/src/lib/i18n.ts @@ -2235,7 +2239,7 @@ An error occurred while merging this asset profile into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 942 + 944 @@ -2331,7 +2335,7 @@ Поточний тиждень apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 @@ -2451,7 +2455,7 @@ {VAR_PLURAL, plural, =1 {дія} other {дій}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 18 + 25 @@ -2459,7 +2463,7 @@ Абсолютний валовий дохід apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 80 + 88 @@ -2467,7 +2471,7 @@ Абсолютний чистий прибуток apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 114 + 122 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -2479,7 +2483,7 @@ Чистий прибуток apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 129 + 137 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -2491,7 +2495,7 @@ Загальні активи apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 152 + 165 @@ -2499,7 +2503,7 @@ Купівельна спроможність apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 292 + 305 @@ -2507,7 +2511,7 @@ Виключено з аналізу apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 324 + 337 @@ -2515,7 +2519,7 @@ Зобов’язання apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 355 + 368 apps/client/src/app/pages/features/features-page.html @@ -2527,7 +2531,7 @@ Чиста вартість apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 378 + 391 @@ -2535,7 +2539,7 @@ Річна доходність apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 393 + 406 @@ -2563,7 +2567,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 158 + 167 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -2571,15 +2575,15 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 158 + 167 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 128 + 129 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 332 + 334 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -2591,7 +2595,7 @@ Будь ласка, встановіть суму вашого резервного фонду. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 160 + 169 @@ -2655,7 +2659,7 @@ Упс! Не вдалося оновити права доступу. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 354 + 414 @@ -2823,7 +2827,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 366 + 368 @@ -2831,11 +2835,11 @@ З початку року apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -2843,11 +2847,11 @@ 1 рік apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -2863,11 +2867,11 @@ 5 років apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -2883,19 +2887,11 @@ Максимум apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 277 + 279 libs/ui/src/lib/assistant/assistant.component.ts - 416 - - - - Identifier has been copied to the clipboard - Identifier has been copied to the clipboard - - apps/client/src/app/components/access-table/access-table.component.ts - 149 + 418 @@ -2903,7 +2899,7 @@ Упс! Не вдалося надати доступ. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 256 + 314 @@ -2955,7 +2951,7 @@ ID користувача apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 116 + 113 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -3019,7 +3015,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 194 + 198 @@ -3091,7 +3087,7 @@ Add Account libs/common/src/lib/routes/routes.ts - 87 + 101 @@ -3147,7 +3143,7 @@ Перейти до сторінки... libs/ui/src/lib/assistant/assistant.component.ts - 450 + 452 @@ -3163,7 +3159,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 164 + 190 @@ -3335,7 +3331,7 @@ Інвестиції apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 214 + 227 @@ -3415,7 +3411,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 197 @@ -3435,7 +3431,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 195 @@ -3443,7 +3439,7 @@ Щодня apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 245 + 247 @@ -3475,7 +3471,7 @@ libs/common/src/lib/routes/routes.ts - 270 + 296 @@ -3491,7 +3487,7 @@ libs/common/src/lib/routes/routes.ts - 235 + 261 @@ -3507,7 +3503,7 @@ libs/common/src/lib/routes/routes.ts - 243 + 269 @@ -3523,7 +3519,7 @@ libs/common/src/lib/routes/routes.ts - 259 + 285 @@ -3595,19 +3591,19 @@ libs/common/src/lib/routes/routes.ts - 104 + 123 libs/ui/src/lib/assistant/assistant.html - 84 + 85 Oops, cash balance transfer has failed. Упс, перенесення балансу готівки не вдалося. - apps/client/src/app/pages/accounts/accounts-page.component.ts - 199 + apps/client/src/app/pages/accounts/account-dialog-host/account-dialog-host.component.ts + 365 @@ -3631,7 +3627,7 @@ Ідентифікатор облікового запису apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 108 + 109 @@ -3679,7 +3675,7 @@ libs/common/src/lib/routes/routes.ts - 78 + 92 @@ -3703,7 +3699,7 @@ libs/common/src/lib/routes/routes.ts - 65 + 79 @@ -3719,7 +3715,7 @@ libs/common/src/lib/routes/routes.ts - 70 + 84 @@ -3731,7 +3727,7 @@ libs/common/src/lib/routes/routes.ts - 75 + 89 @@ -3767,11 +3763,11 @@ libs/common/src/lib/routes/routes.ts - 143 + 169 libs/common/src/lib/routes/routes.ts - 220 + 246 @@ -3891,7 +3887,7 @@ libs/common/src/lib/routes/routes.ts - 275 + 301 @@ -3899,11 +3895,11 @@ Не вдалося розібрати конфігурацію скрапера apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 676 + 678 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 679 + 681 @@ -3955,7 +3951,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 327 @@ -3975,7 +3971,7 @@ libs/common/src/lib/routes/routes.ts - 290 + 316 @@ -3987,7 +3983,7 @@ libs/common/src/lib/routes/routes.ts - 298 + 324 @@ -3996,11 +3992,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 293 + 319 libs/common/src/lib/routes/routes.ts - 296 + 322 @@ -4172,7 +4168,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 196 apps/client/src/app/pages/public/public-page.html @@ -4180,15 +4176,15 @@ libs/common/src/lib/routes/routes.ts - 125 + 144 libs/common/src/lib/routes/routes.ts - 217 + 243 libs/ui/src/lib/assistant/assistant.html - 110 + 111 @@ -4196,7 +4192,7 @@ This action cannot be undone. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 961 + 963 @@ -4216,7 +4212,7 @@ libs/common/src/lib/routes/routes.ts - 135 + 154 @@ -4248,15 +4244,15 @@ libs/common/src/lib/routes/routes.ts - 130 + 149 libs/common/src/lib/routes/routes.ts - 311 + 337 libs/common/src/lib/routes/routes.ts - 359 + 385 @@ -4580,7 +4576,7 @@ Do you really want to delete these activities? libs/ui/src/lib/activities-table/activities-table.component.ts - 344 + 327 @@ -4684,7 +4680,7 @@ Упс! Не вдалося видалити профілі активів. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 54 + 60 @@ -4756,7 +4752,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 169 + 195 @@ -4812,7 +4808,7 @@ Do you really want to merge this asset profile into it? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 965 + 967 @@ -4956,7 +4952,7 @@ libs/common/src/lib/routes/routes.ts - 179 + 205 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -5036,7 +5032,7 @@ Знайти рахунок... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 450 @@ -5044,11 +5040,11 @@ Дата apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 527 + 528 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 566 + 567 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -5060,7 +5056,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 216 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -5076,7 +5072,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 263 @@ -5088,11 +5084,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 31 libs/ui/src/lib/activities-table/activities-table.component.html - 432 + 435 @@ -5104,11 +5100,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 54 + 57 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -5116,7 +5112,7 @@ Імпортуються дані... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 176 @@ -5124,7 +5120,7 @@ Імпорт завершено apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 183 + 187 @@ -5140,7 +5136,7 @@ Перевірка даних... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 294 + 298 @@ -5216,7 +5212,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 590 + 591 @@ -5244,7 +5240,7 @@ Ви дійсно бажаєте конвертувати цей профіль активу в ()? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 809 + 811 @@ -5276,7 +5272,7 @@ libs/common/src/lib/routes/routes.ts - 184 + 210 @@ -5292,7 +5288,7 @@ За платформою apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 39 + 41 @@ -5300,7 +5296,7 @@ За валютою apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 58 + 60 @@ -5308,7 +5304,7 @@ За класом активів apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 80 + 82 @@ -5316,7 +5312,7 @@ За активом apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 102 + 104 @@ -5324,7 +5320,7 @@ За сектором apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 125 + 127 @@ -5332,7 +5328,7 @@ За континентом apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 148 + 150 @@ -5340,7 +5336,7 @@ За ринком apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 170 + 172 @@ -5348,7 +5344,7 @@ Регіони apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 193 + 195 apps/client/src/app/pages/public/public-page.html @@ -5376,7 +5372,7 @@ Розвиті ринки apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 216 + 218 apps/client/src/app/pages/public/public-page.html @@ -5396,7 +5392,7 @@ Ринки, що розвиваються apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 228 apps/client/src/app/pages/public/public-page.html @@ -5408,7 +5404,7 @@ Інші ринки apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 236 + 238 apps/client/src/app/pages/public/public-page.html @@ -5420,7 +5416,7 @@ За країною apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 261 + 263 @@ -5428,7 +5424,7 @@ За рахунком apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 283 + 285 @@ -5436,7 +5432,7 @@ За постачальником ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 303 + 305 @@ -5444,7 +5440,7 @@ За активами ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 328 + 330 @@ -5452,7 +5448,7 @@ Наближення на основі провідних активів кожного ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 335 + 337 @@ -5464,7 +5460,7 @@ libs/common/src/lib/routes/routes.ts - 189 + 215 @@ -5488,7 +5484,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 479 + 492 apps/client/src/app/pages/features/features-page.html @@ -5708,7 +5704,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 347 @@ -5732,7 +5728,7 @@ Do you really want to remove this received access? apps/client/src/app/components/access-table/access-table.component.ts - 176 + 152 @@ -5756,7 +5752,7 @@ Щогодини apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 249 + 251 @@ -5896,11 +5892,11 @@ Не вдалося зберегти профіль активу apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 762 + 764 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 765 + 767 @@ -5996,7 +5992,7 @@ libs/common/src/lib/routes/routes.ts - 331 + 357 @@ -6032,7 +6028,7 @@ libs/common/src/lib/routes/routes.ts - 343 + 369 @@ -6048,7 +6044,7 @@ libs/common/src/lib/routes/routes.ts - 351 + 377 @@ -6057,11 +6053,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 346 + 372 libs/common/src/lib/routes/routes.ts - 349 + 375 @@ -6070,11 +6066,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 338 + 364 libs/common/src/lib/routes/routes.ts - 341 + 367 @@ -6086,7 +6082,7 @@ libs/common/src/lib/routes/routes.ts - 379 + 405 @@ -6095,11 +6091,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 370 + 396 libs/common/src/lib/routes/routes.ts - 374 + 400 @@ -6139,7 +6135,7 @@ Data gathering has been started. apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 413 + 386 @@ -6251,7 +6247,7 @@ От халепа! Не вдалося видалити профіль активу. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 53 + 59 @@ -6603,7 +6599,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 107 + 110 @@ -6643,7 +6639,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 603 + 604 @@ -6787,7 +6783,7 @@ libs/common/src/lib/routes/routes.ts - 382 + 408 @@ -6871,11 +6867,11 @@ Експорт активності libs/ui/src/lib/activities-table/activities-table.component.html - 73 + 76 libs/ui/src/lib/activities-table/activities-table.component.html - 460 + 463 @@ -6883,11 +6879,11 @@ Експортувати чернетки як ICS libs/ui/src/lib/activities-table/activities-table.component.html - 87 + 90 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 476 @@ -6895,7 +6891,7 @@ Видалити активності libs/ui/src/lib/activities-table/activities-table.component.html - 111 + 114 @@ -6903,7 +6899,7 @@ Чернетка libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/i18n.ts @@ -6915,7 +6911,7 @@ Клонувати libs/ui/src/lib/activities-table/activities-table.component.html - 521 + 524 @@ -6923,7 +6919,7 @@ Експортувати чернетку як ICS libs/ui/src/lib/activities-table/activities-table.component.html - 533 + 536 @@ -6931,11 +6927,11 @@ Ви дійсно хочете видалити цю активність? libs/ui/src/lib/activities-table/activities-table.component.ts - 343 + 326 libs/ui/src/lib/activities-table/activities-table.component.ts - 354 + 337 @@ -6943,7 +6939,7 @@ Тиждень до дати libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6951,11 +6947,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6963,7 +6959,7 @@ Місяць до дати libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6971,11 +6967,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6991,7 +6987,7 @@ Рік до дати libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -6999,7 +6995,7 @@ рік apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -7011,7 +7007,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -7019,11 +7015,11 @@ роки apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -7035,7 +7031,7 @@ libs/ui/src/lib/assistant/assistant.html - 140 + 141 @@ -7043,7 +7039,7 @@ Діапазон дат libs/ui/src/lib/assistant/assistant.html - 170 + 171 @@ -7051,7 +7047,7 @@ Скинути фільтри libs/ui/src/lib/assistant/assistant.html - 204 + 205 @@ -7059,7 +7055,7 @@ Застосувати фільтри libs/ui/src/lib/assistant/assistant.html - 217 + 218 @@ -7067,7 +7063,7 @@ Фільтри портфеля apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 128 + 125 @@ -7126,6 +7122,14 @@ 286 + + Add to Watchlist + Add to Watchlist + + libs/common/src/lib/routes/routes.ts + 163 + + Market data provided by Ринкові дані надані @@ -7163,7 +7167,7 @@ This asset profile cannot be merged into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 920 + 922 @@ -7191,7 +7195,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 465 + 478 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -7243,11 +7247,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 124 + 126 libs/ui/src/lib/holdings-table/holdings-table.component.html - 125 + 127 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7267,7 +7271,7 @@ Показати все libs/ui/src/lib/holdings-table/holdings-table.component.html - 216 + 222 @@ -7275,15 +7279,15 @@ Рахунок apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 102 + 109 libs/common/src/lib/routes/routes.ts - 94 + 108 libs/ui/src/lib/activities-table/activities-table.component.html - 362 + 365 libs/ui/src/lib/i18n.ts @@ -7319,7 +7323,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 266 + 268 libs/ui/src/lib/i18n.ts @@ -7351,7 +7355,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 287 libs/ui/src/lib/i18n.ts @@ -7395,11 +7399,11 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 143 + 152 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 117 + 118 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7407,7 +7411,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 321 + 323 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -7459,7 +7463,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 145 + 154 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7471,11 +7475,11 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 119 + 120 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 323 + 325 libs/ui/src/lib/i18n.ts @@ -7503,15 +7507,15 @@ Резервний фонд apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 229 + 242 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 320 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 412 + 425 apps/client/src/app/pages/features/features-page.html @@ -7583,7 +7587,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 460 + 462 @@ -7615,7 +7619,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 148 + 138 @@ -7675,7 +7679,7 @@ Export libs/ui/src/lib/activities-table/activities-table.component.html - 69 + 72 @@ -7747,7 +7751,7 @@ Купити apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 35 + 43 libs/ui/src/lib/i18n.ts @@ -7759,11 +7763,11 @@ Комісія apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 238 + 239 libs/ui/src/lib/activities-table/activities-table.component.html - 285 + 288 libs/ui/src/lib/i18n.ts @@ -7791,7 +7795,7 @@ Продати apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 49 + 57 libs/ui/src/lib/i18n.ts @@ -7811,7 +7815,7 @@ Готівка apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 274 @@ -7911,7 +7915,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 66 + 74 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -7931,7 +7935,7 @@ Переглянути позицію libs/ui/src/lib/activities-table/activities-table.component.html - 499 + 502 @@ -7987,7 +7991,7 @@ Дані недоступні apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 247 + 249 apps/client/src/app/pages/public/public-page.html @@ -7999,11 +8003,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 462 + 464 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 476 + 478 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -8015,7 +8019,7 @@ Упс! Не вдалося знайти жодного активу. libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html - 43 + 44 @@ -8047,7 +8051,7 @@ Лінивий apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8055,7 +8059,7 @@ Миттєвий apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8063,7 +8067,7 @@ Стандартна ринкова ціна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 644 + 645 @@ -8079,7 +8083,7 @@ Ви дійсно бажаєте конвертувати джерело даних на ? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 529 + 531 @@ -8095,7 +8099,7 @@ Заголовки HTTP-запиту apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 657 + 658 @@ -8103,7 +8107,7 @@ кінець дня apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8111,7 +8115,7 @@ реальний час apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8135,7 +8139,7 @@ Змінити libs/ui/src/lib/holdings-table/holdings-table.component.html - 146 + 148 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8171,11 +8175,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 168 + 170 libs/ui/src/lib/holdings-table/holdings-table.component.html - 169 + 171 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8239,7 +8243,7 @@ Additional requests are granted while you are setting up your instance apps/client/src/app/components/admin-settings/admin-settings.component.ts - 87 + 88 @@ -8308,11 +8312,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 262 + 288 libs/common/src/lib/routes/routes.ts - 265 + 291 @@ -8324,7 +8328,7 @@ libs/common/src/lib/routes/routes.ts - 267 + 293 @@ -8340,7 +8344,7 @@ () вже використовується. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 963 + 965 @@ -8348,7 +8352,7 @@ Під час оновлення до () сталася помилка. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 807 + 809 @@ -8436,7 +8440,7 @@ libs/common/src/lib/routes/routes.ts - 140 + 166 @@ -8452,11 +8456,11 @@ {VAR_PLURAL, plural, =1 {Activity} other {Activities}} libs/ui/src/lib/activities-table/activities-table.component.html - 70 + 73 libs/ui/src/lib/activities-table/activities-table.component.html - 108 + 111 @@ -8481,11 +8485,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 230 + 256 libs/common/src/lib/routes/routes.ts - 233 + 259 @@ -8605,7 +8609,7 @@ Швидкі посилання libs/ui/src/lib/assistant/assistant.html - 58 + 59 @@ -8621,7 +8625,7 @@ libs/common/src/lib/routes/routes.ts - 281 + 307 @@ -8629,7 +8633,7 @@ Альтернатива з відкритим кодом для libs/common/src/lib/routes/routes.ts - 376 + 402 @@ -8662,15 +8666,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 362 + 388 libs/common/src/lib/routes/routes.ts - 365 + 391 libs/common/src/lib/routes/routes.ts - 373 + 399 @@ -8679,11 +8683,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 354 + 380 libs/common/src/lib/routes/routes.ts - 357 + 383 @@ -8763,7 +8767,7 @@ Поточний місяць apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 @@ -8908,11 +8912,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 386 + 412 libs/common/src/lib/routes/routes.ts - 387 + 413 @@ -8944,7 +8948,7 @@ Акції apps/client/src/app/components/markets/markets.component.ts - 53 + 57 apps/client/src/app/pages/features/features-page.html @@ -8956,7 +8960,7 @@ Криптовалюти apps/client/src/app/components/markets/markets.component.ts - 54 + 58 apps/client/src/app/pages/features/features-page.html @@ -9084,7 +9088,7 @@ Результатів не знайдено... libs/ui/src/lib/assistant/assistant.html - 51 + 52 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 806cf86c78..dea659d90c 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 - 226 + 252 libs/common/src/lib/routes/routes.ts - 227 + 253 libs/common/src/lib/routes/routes.ts - 232 + 258 libs/common/src/lib/routes/routes.ts - 240 + 266 libs/common/src/lib/routes/routes.ts - 248 + 274 libs/common/src/lib/routes/routes.ts - 256 + 282 libs/common/src/lib/routes/routes.ts - 264 + 290 @@ -39,19 +39,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 284 + 310 libs/common/src/lib/routes/routes.ts - 285 + 311 libs/common/src/lib/routes/routes.ts - 289 + 315 libs/common/src/lib/routes/routes.ts - 295 + 321 @@ -59,11 +59,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 330 libs/common/src/lib/routes/routes.ts - 305 + 331 @@ -71,11 +71,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 238 + 264 libs/common/src/lib/routes/routes.ts - 241 + 267 @@ -83,11 +83,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 309 + 335 libs/common/src/lib/routes/routes.ts - 310 + 336 @@ -95,11 +95,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 319 + 345 libs/common/src/lib/routes/routes.ts - 320 + 346 @@ -107,11 +107,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 280 libs/common/src/lib/routes/routes.ts - 257 + 283 @@ -119,11 +119,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 329 + 355 libs/common/src/lib/routes/routes.ts - 330 + 356 @@ -131,31 +131,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 334 + 360 libs/common/src/lib/routes/routes.ts - 335 + 361 libs/common/src/lib/routes/routes.ts - 340 + 366 libs/common/src/lib/routes/routes.ts - 348 + 374 libs/common/src/lib/routes/routes.ts - 356 + 382 libs/common/src/lib/routes/routes.ts - 364 + 390 libs/common/src/lib/routes/routes.ts - 372 + 398 @@ -251,25 +251,25 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 7 + 10 libs/ui/src/lib/activities-table/activities-table.component.html - 204 + 207 Details - apps/client/src/app/components/access-table/access-table.component.html - 49 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 137 Revoke apps/client/src/app/components/access-table/access-table.component.html - 138 + 100 @@ -290,7 +290,7 @@ Do you really want to revoke this granted access? apps/client/src/app/components/access-table/access-table.component.ts - 177 + 153 @@ -336,6 +336,10 @@ apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 113 + libs/ui/src/lib/accounts-table/accounts-table.component.html 10 @@ -385,7 +389,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 182 + 185 libs/ui/src/lib/benchmark/benchmark.component.html @@ -446,7 +450,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 329 + 332 @@ -481,15 +485,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 309 + 312 libs/ui/src/lib/activities-table/activities-table.component.html - 346 + 349 libs/ui/src/lib/holdings-table/holdings-table.component.html - 99 + 101 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -504,7 +508,7 @@ Edit apps/client/src/app/components/access-table/access-table.component.html - 104 + 74 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -524,14 +528,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 510 + 513 Delete apps/client/src/app/components/access-table/access-table.component.html - 135 + 97 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -543,7 +547,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 241 + 236 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -571,7 +575,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 545 + 548 libs/ui/src/lib/benchmark/benchmark.component.html @@ -582,7 +586,7 @@ Do you really want to delete this account? libs/ui/src/lib/accounts-table/accounts-table.component.ts - 183 + 185 @@ -598,6 +602,10 @@ apps/client/src/app/components/admin-jobs/admin-jobs.html 52 + + libs/common/src/lib/routes/routes.ts + 76 + Historical Market Data @@ -607,7 +615,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 496 @@ -704,7 +712,7 @@ Splits apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 518 + 519 @@ -732,18 +740,18 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 450 Date apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 527 + 528 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 566 + 567 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -755,7 +763,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 216 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -788,7 +796,7 @@ Currencies apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 133 + 123 apps/client/src/app/pages/public/public-page.html @@ -806,39 +814,39 @@ ETFs without Countries apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 138 + 128 ETFs without Sectors apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 143 + 133 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 - 526 + 528 Do you really want to delete this asset profile? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 27 + 33 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 69 + 75 Filter by... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 377 + 350 @@ -857,7 +865,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 52 @@ -871,7 +879,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 476 + 477 @@ -903,7 +911,7 @@ Apply current market price apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 220 + 221 @@ -1070,7 +1078,7 @@ Update Activity libs/common/src/lib/routes/routes.ts - 176 + 202 @@ -1098,7 +1106,7 @@ Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 635 @@ -1113,7 +1121,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 251 + 252 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -1121,7 +1129,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 396 + 399 @@ -1130,6 +1138,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 69 + Search @@ -1152,13 +1164,6 @@ 18 - - Copy identifier to clipboard - - apps/client/src/app/components/access-table/access-table.component.html - 120 - - Name, symbol or ISIN @@ -1252,7 +1257,7 @@ Update Account libs/common/src/lib/routes/routes.ts - 101 + 120 @@ -1287,11 +1292,11 @@ Add apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 622 apps/client/src/app/components/admin-overview/admin-overview.html - 304 + 299 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1349,7 +1354,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 752 + 754 @@ -1377,7 +1382,7 @@ The data of this asset profile is moved to () and this asset profile is deleted. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 959 + 961 @@ -1391,7 +1396,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 @@ -1516,11 +1521,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 728 + 730 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 731 + 733 @@ -1557,7 +1562,7 @@ libs/common/src/lib/routes/routes.ts - 202 + 228 @@ -1605,7 +1610,7 @@ libs/common/src/lib/routes/routes.ts - 116 + 135 @@ -1634,14 +1639,14 @@ Split Ratio apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 533 Fear apps/client/src/app/components/markets/markets.component.ts - 57 + 61 libs/ui/src/lib/i18n.ts @@ -1652,7 +1657,7 @@ Greed apps/client/src/app/components/markets/markets.component.ts - 58 + 62 libs/ui/src/lib/i18n.ts @@ -1670,7 +1675,7 @@ An error occurred while merging this asset profile into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 942 + 944 @@ -1754,7 +1759,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 @@ -1894,7 +1899,7 @@ Absolute Gross Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 80 + 88 @@ -1905,14 +1910,14 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 94 + 102 Absolute Net Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 114 + 122 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1923,7 +1928,7 @@ Net Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 129 + 137 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -1934,28 +1939,28 @@ Total Assets apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 152 + 165 Buying Power apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 292 + 305 Excluded from Analysis apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 324 + 337 Liabilities apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 355 + 368 apps/client/src/app/pages/features/features-page.html @@ -1966,21 +1971,21 @@ Net Worth apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 378 + 391 Annualized Performance apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 393 + 406 Please set the amount of your emergency fund. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 160 + 169 @@ -2013,11 +2018,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 235 + 238 libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 76 @@ -2192,29 +2197,29 @@ libs/ui/src/lib/assistant/assistant.component.ts - 366 + 368 YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 1Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -2228,11 +2233,11 @@ 5Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -2246,18 +2251,11 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 277 + 279 libs/ui/src/lib/assistant/assistant.component.ts - 416 - - - - Identifier has been copied to the clipboard - - apps/client/src/app/components/access-table/access-table.component.ts - 149 + 418 @@ -2311,7 +2309,7 @@ Add Account libs/common/src/lib/routes/routes.ts - 87 + 101 @@ -2499,7 +2497,7 @@ Investments apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 214 + 227 @@ -2534,7 +2532,7 @@ User ID apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 116 + 113 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2571,7 +2569,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 197 @@ -2582,7 +2580,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 195 @@ -2593,7 +2591,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 194 + 198 @@ -2616,7 +2614,7 @@ libs/common/src/lib/routes/routes.ts - 270 + 296 @@ -2631,7 +2629,7 @@ libs/common/src/lib/routes/routes.ts - 235 + 261 @@ -2646,7 +2644,7 @@ libs/common/src/lib/routes/routes.ts - 243 + 269 @@ -2661,7 +2659,7 @@ libs/common/src/lib/routes/routes.ts - 259 + 285 @@ -2728,18 +2726,18 @@ libs/common/src/lib/routes/routes.ts - 104 + 123 libs/ui/src/lib/assistant/assistant.html - 84 + 85 Oops, cash balance transfer has failed. - apps/client/src/app/pages/accounts/accounts-page.component.ts - 199 + apps/client/src/app/pages/accounts/account-dialog-host/account-dialog-host.component.ts + 365 @@ -2760,7 +2758,7 @@ Account ID apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 108 + 109 @@ -2803,7 +2801,7 @@ libs/common/src/lib/routes/routes.ts - 78 + 92 @@ -2814,7 +2812,7 @@ libs/common/src/lib/routes/routes.ts - 65 + 79 @@ -2829,7 +2827,7 @@ libs/common/src/lib/routes/routes.ts - 70 + 84 @@ -2840,7 +2838,7 @@ libs/common/src/lib/routes/routes.ts - 75 + 89 @@ -2875,11 +2873,11 @@ libs/common/src/lib/routes/routes.ts - 143 + 169 libs/common/src/lib/routes/routes.ts - 220 + 246 @@ -2990,18 +2988,18 @@ libs/common/src/lib/routes/routes.ts - 275 + 301 Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 676 + 678 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 679 + 681 @@ -3048,7 +3046,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 327 @@ -3074,7 +3072,7 @@ libs/common/src/lib/routes/routes.ts - 306 + 332 @@ -3229,7 +3227,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 196 apps/client/src/app/pages/public/public-page.html @@ -3237,22 +3235,22 @@ libs/common/src/lib/routes/routes.ts - 125 + 144 libs/common/src/lib/routes/routes.ts - 217 + 243 libs/ui/src/lib/assistant/assistant.html - 110 + 111 This action cannot be undone. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 961 + 963 @@ -3270,7 +3268,7 @@ libs/common/src/lib/routes/routes.ts - 135 + 154 @@ -3301,15 +3299,15 @@ libs/common/src/lib/routes/routes.ts - 130 + 149 libs/common/src/lib/routes/routes.ts - 311 + 337 libs/common/src/lib/routes/routes.ts - 359 + 385 @@ -3587,7 +3585,7 @@ Do you really want to delete these activities? libs/ui/src/lib/activities-table/activities-table.component.ts - 344 + 327 @@ -3685,7 +3683,7 @@ Oops! Could not delete the asset profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 54 + 60 @@ -3748,7 +3746,7 @@ Add Activity libs/common/src/lib/routes/routes.ts - 169 + 195 @@ -3790,7 +3788,7 @@ Do you really want to merge this asset profile into it? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 965 + 967 @@ -3922,7 +3920,7 @@ libs/common/src/lib/routes/routes.ts - 179 + 205 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -3997,7 +3995,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 263 @@ -4008,11 +4006,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 31 libs/ui/src/lib/activities-table/activities-table.component.html - 432 + 435 @@ -4023,25 +4021,25 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 54 + 57 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 Importing data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 176 Import has been completed apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 183 + 187 @@ -4055,7 +4053,7 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 294 + 298 @@ -4122,7 +4120,7 @@ Shares After apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 590 + 591 @@ -4147,7 +4145,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 - 809 + 811 @@ -4162,7 +4160,7 @@ libs/common/src/lib/routes/routes.ts - 184 + 210 @@ -4176,56 +4174,56 @@ By Platform apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 39 + 41 By Currency apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 58 + 60 By Asset Class apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 80 + 82 By Holding apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 102 + 104 By Sector apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 125 + 127 By Continent apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 148 + 150 By Market apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 170 + 172 Regions apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 193 + 195 apps/client/src/app/pages/public/public-page.html @@ -4250,7 +4248,7 @@ Developed Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 216 + 218 apps/client/src/app/pages/public/public-page.html @@ -4268,7 +4266,7 @@ Emerging Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 228 apps/client/src/app/pages/public/public-page.html @@ -4279,7 +4277,7 @@ Other Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 236 + 238 apps/client/src/app/pages/public/public-page.html @@ -4290,21 +4288,21 @@ By Account apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 283 + 285 By ETF Provider apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 303 + 305 By Country apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 261 + 263 @@ -4315,7 +4313,7 @@ libs/common/src/lib/routes/routes.ts - 189 + 215 @@ -4337,7 +4335,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 479 + 492 apps/client/src/app/pages/features/features-page.html @@ -4468,7 +4466,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 347 @@ -4489,7 +4487,7 @@ Do you really want to remove this received access? apps/client/src/app/components/access-table/access-table.component.ts - 176 + 152 @@ -4510,7 +4508,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 249 + 251 @@ -4651,11 +4649,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 762 + 764 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 765 + 767 @@ -4701,7 +4699,7 @@ libs/common/src/lib/routes/routes.ts - 331 + 357 @@ -4730,7 +4728,7 @@ libs/common/src/lib/routes/routes.ts - 379 + 405 @@ -4738,11 +4736,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 370 + 396 libs/common/src/lib/routes/routes.ts - 374 + 400 @@ -5012,7 +5010,7 @@ Data gathering has been started. apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 413 + 386 @@ -5046,7 +5044,7 @@ libs/common/src/lib/routes/routes.ts - 382 + 408 @@ -5121,29 +5119,29 @@ Export Activities libs/ui/src/lib/activities-table/activities-table.component.html - 73 + 76 libs/ui/src/lib/activities-table/activities-table.component.html - 460 + 463 Export Drafts as ICS libs/ui/src/lib/activities-table/activities-table.component.html - 87 + 90 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 476 Draft libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/i18n.ts @@ -5154,25 +5152,25 @@ Clone libs/ui/src/lib/activities-table/activities-table.component.html - 521 + 524 Export Draft as ICS libs/ui/src/lib/activities-table/activities-table.component.html - 533 + 536 Do you really want to delete this activity? libs/ui/src/lib/activities-table/activities-table.component.ts - 343 + 326 libs/ui/src/lib/activities-table/activities-table.component.ts - 354 + 337 @@ -5183,14 +5181,14 @@ libs/ui/src/lib/assistant/assistant.html - 140 + 141 Portfolio Filters apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 128 + 125 @@ -5242,6 +5240,13 @@ 286 + + Add to Watchlist + + libs/common/src/lib/routes/routes.ts + 163 + + Market data provided by @@ -5274,7 +5279,7 @@ This asset profile cannot be merged into (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 920 + 922 @@ -5292,7 +5297,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 465 + 478 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5318,11 +5323,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 124 + 126 libs/ui/src/lib/holdings-table/holdings-table.component.html - 125 + 127 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5341,22 +5346,22 @@ Show all libs/ui/src/lib/holdings-table/holdings-table.component.html - 216 + 222 Account apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 102 + 109 libs/common/src/lib/routes/routes.ts - 94 + 108 libs/ui/src/lib/activities-table/activities-table.component.html - 362 + 365 libs/ui/src/lib/i18n.ts @@ -5390,7 +5395,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 266 + 268 libs/ui/src/lib/i18n.ts @@ -5421,7 +5426,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 287 libs/ui/src/lib/i18n.ts @@ -5453,15 +5458,15 @@ Emergency Fund apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 229 + 242 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 320 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 412 + 425 apps/client/src/app/pages/features/features-page.html @@ -5526,7 +5531,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 460 + 462 @@ -5547,7 +5552,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 148 + 138 @@ -5595,7 +5600,7 @@ Export libs/ui/src/lib/activities-table/activities-table.component.html - 69 + 72 @@ -5645,7 +5650,7 @@ Buy apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 35 + 43 libs/ui/src/lib/i18n.ts @@ -5656,11 +5661,11 @@ Fee apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 238 + 239 libs/ui/src/lib/activities-table/activities-table.component.html - 285 + 288 libs/ui/src/lib/i18n.ts @@ -5685,7 +5690,7 @@ Sell apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 49 + 57 libs/ui/src/lib/i18n.ts @@ -5703,7 +5708,7 @@ Cash apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 274 @@ -5791,7 +5796,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 66 + 74 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -5848,7 +5853,7 @@ No data available apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 247 + 249 apps/client/src/app/pages/public/public-page.html @@ -5860,11 +5865,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 462 + 464 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 476 + 478 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5882,14 +5887,14 @@ Date Range libs/ui/src/lib/assistant/assistant.html - 170 + 171 The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 854 + 856 @@ -5903,7 +5908,7 @@ Oops! Could not grant access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 256 + 314 @@ -6006,32 +6011,32 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 Week to date libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 Month to date libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6045,11 +6050,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6077,14 +6082,14 @@ Reset Filters libs/ui/src/lib/assistant/assistant.html - 204 + 205 year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6096,25 +6101,25 @@ libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 years apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 Apply Filters libs/ui/src/lib/assistant/assistant.html - 217 + 218 @@ -6122,11 +6127,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 293 + 319 libs/common/src/lib/routes/routes.ts - 296 + 322 @@ -6137,7 +6142,7 @@ libs/common/src/lib/routes/routes.ts - 298 + 324 @@ -6155,7 +6160,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 451 @@ -6173,14 +6178,14 @@ libs/common/src/lib/routes/routes.ts - 290 + 316 Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 245 + 247 @@ -6201,14 +6206,14 @@ Closed apps/client/src/app/components/home-holdings/home-holdings.component.ts - 74 + 78 Active apps/client/src/app/components/home-holdings/home-holdings.component.ts - 73 + 77 @@ -6261,21 +6266,21 @@ {VAR_PLURAL, plural, =1 {activity} other {activities}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 18 + 25 Delete Activities libs/ui/src/lib/activities-table/activities-table.component.html - 111 + 114 Internationalization libs/common/src/lib/routes/routes.ts - 149 + 175 @@ -6296,7 +6301,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 450 + 452 @@ -6310,14 +6315,14 @@ Approximation based on the top holdings of each ETF apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 335 + 337 By ETF Holding apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 328 + 330 @@ -6331,7 +6336,7 @@ Clone Activity libs/common/src/lib/routes/routes.ts - 164 + 190 @@ -6366,21 +6371,21 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 118 Chart apps/client/src/app/components/home-holdings/home-holdings.component.ts - 67 + 71 Table apps/client/src/app/components/home-holdings/home-holdings.component.ts - 62 + 66 @@ -6467,7 +6472,7 @@ Oops! Could not delete the asset profile. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 53 + 59 @@ -6516,7 +6521,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 499 + 502 @@ -6580,22 +6585,22 @@ Do you really want to delete these asset profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 70 + 76 Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 844 + 846 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 921 + 923 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 943 + 945 @@ -6626,11 +6631,11 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 143 + 152 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 117 + 118 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -6638,7 +6643,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 321 + 323 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -6702,7 +6707,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 145 + 154 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -6714,11 +6719,11 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 119 + 120 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 323 + 325 libs/ui/src/lib/i18n.ts @@ -6736,7 +6741,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 354 + 414 @@ -6799,7 +6804,7 @@ Copy link to clipboard apps/client/src/app/components/access-table/access-table.component.html - 112 + 82 @@ -6917,7 +6922,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 107 + 110 @@ -6946,7 +6951,7 @@ Shares Before apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 603 + 604 @@ -7000,7 +7005,7 @@ Oops! Could not find any assets. libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html - 43 + 44 @@ -7050,7 +7055,7 @@ libs/common/src/lib/routes/routes.ts - 343 + 369 @@ -7058,11 +7063,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 338 + 364 libs/common/src/lib/routes/routes.ts - 341 + 367 @@ -7077,7 +7082,7 @@ libs/common/src/lib/routes/routes.ts - 351 + 377 @@ -7085,11 +7090,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 346 + 372 libs/common/src/lib/routes/routes.ts - 349 + 375 @@ -7117,7 +7122,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 148 + 151 @@ -7232,7 +7237,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 158 + 167 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7240,15 +7245,15 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 158 + 167 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 128 + 129 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 332 + 334 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -7291,7 +7296,7 @@ Please enter your Ghostfolio API key. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 167 + 170 @@ -7312,7 +7317,7 @@ Link has been copied to the clipboard apps/client/src/app/components/access-table/access-table.component.ts - 161 + 137 @@ -7326,14 +7331,14 @@ 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 - 529 + 531 Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 644 + 645 @@ -7347,35 +7352,35 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 657 + 658 real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -7396,7 +7401,7 @@ Change libs/ui/src/lib/holdings-table/holdings-table.component.html - 146 + 148 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7429,11 +7434,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 168 + 170 libs/ui/src/lib/holdings-table/holdings-table.component.html - 169 + 171 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7476,7 +7481,7 @@ Additional requests are granted while you are setting up your instance apps/client/src/app/components/admin-settings/admin-settings.component.ts - 87 + 88 @@ -7547,7 +7552,7 @@ libs/common/src/lib/routes/routes.ts - 267 + 293 @@ -7555,11 +7560,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 262 + 288 libs/common/src/lib/routes/routes.ts - 265 + 291 @@ -7580,14 +7585,14 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 963 + 965 An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 807 + 809 @@ -7644,7 +7649,7 @@ libs/common/src/lib/routes/routes.ts - 140 + 166 @@ -7658,11 +7663,11 @@ {VAR_PLURAL, plural, =1 {Activity} other {Activities}} libs/ui/src/lib/activities-table/activities-table.component.html - 70 + 73 libs/ui/src/lib/activities-table/activities-table.component.html - 108 + 111 @@ -7684,11 +7689,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 230 + 256 libs/common/src/lib/routes/routes.ts - 233 + 259 @@ -7793,7 +7798,7 @@ Quick Links libs/ui/src/lib/assistant/assistant.html - 58 + 59 @@ -7808,14 +7813,14 @@ libs/common/src/lib/routes/routes.ts - 281 + 307 Open Source Alternative to libs/common/src/lib/routes/routes.ts - 376 + 402 @@ -7844,15 +7849,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 362 + 388 libs/common/src/lib/routes/routes.ts - 365 + 391 libs/common/src/lib/routes/routes.ts - 373 + 399 @@ -7860,11 +7865,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 354 + 380 libs/common/src/lib/routes/routes.ts - 357 + 383 @@ -7935,7 +7940,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 @@ -8062,11 +8067,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 386 + 412 libs/common/src/lib/routes/routes.ts - 387 + 413 @@ -8094,7 +8099,7 @@ Cryptocurrencies apps/client/src/app/components/markets/markets.component.ts - 54 + 58 apps/client/src/app/pages/features/features-page.html @@ -8105,7 +8110,7 @@ Stocks apps/client/src/app/components/markets/markets.component.ts - 53 + 57 apps/client/src/app/pages/features/features-page.html @@ -8134,7 +8139,7 @@ No results found... libs/ui/src/lib/assistant/assistant.html - 51 + 52 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index d387c94956..6a761c1a87 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 - 226 + 252 libs/common/src/lib/routes/routes.ts - 227 + 253 libs/common/src/lib/routes/routes.ts - 232 + 258 libs/common/src/lib/routes/routes.ts - 240 + 266 libs/common/src/lib/routes/routes.ts - 248 + 274 libs/common/src/lib/routes/routes.ts - 256 + 282 libs/common/src/lib/routes/routes.ts - 264 + 290 @@ -41,19 +41,19 @@ kebab-case libs/common/src/lib/routes/routes.ts - 284 + 310 libs/common/src/lib/routes/routes.ts - 285 + 311 libs/common/src/lib/routes/routes.ts - 289 + 315 libs/common/src/lib/routes/routes.ts - 295 + 321 @@ -62,11 +62,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 304 + 330 libs/common/src/lib/routes/routes.ts - 305 + 331 @@ -75,11 +75,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 238 + 264 libs/common/src/lib/routes/routes.ts - 241 + 267 @@ -88,11 +88,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 309 + 335 libs/common/src/lib/routes/routes.ts - 310 + 336 @@ -101,11 +101,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 319 + 345 libs/common/src/lib/routes/routes.ts - 320 + 346 @@ -114,11 +114,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 254 + 280 libs/common/src/lib/routes/routes.ts - 257 + 283 @@ -127,11 +127,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 329 + 355 libs/common/src/lib/routes/routes.ts - 330 + 356 @@ -140,31 +140,31 @@ kebab-case libs/common/src/lib/routes/routes.ts - 334 + 360 libs/common/src/lib/routes/routes.ts - 335 + 361 libs/common/src/lib/routes/routes.ts - 340 + 366 libs/common/src/lib/routes/routes.ts - 348 + 374 libs/common/src/lib/routes/routes.ts - 356 + 382 libs/common/src/lib/routes/routes.ts - 364 + 390 libs/common/src/lib/routes/routes.ts - 372 + 398 @@ -268,19 +268,19 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 7 + 10 libs/ui/src/lib/activities-table/activities-table.component.html - 204 + 207 Details 详情 - apps/client/src/app/components/access-table/access-table.component.html - 49 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 137 @@ -288,7 +288,7 @@ 撤销 apps/client/src/app/components/access-table/access-table.component.html - 138 + 100 @@ -301,7 +301,7 @@ Any person who has the link can view the data. - Any person who has the link can view the data. + 任何拥有此链接的人都可以查看数据。 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 42 @@ -312,7 +312,7 @@ 您真的要撤销此访问权限吗? apps/client/src/app/components/access-table/access-table.component.ts - 177 + 153 @@ -362,6 +362,10 @@ apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 113 + libs/ui/src/lib/accounts-table/accounts-table.component.html 10 @@ -412,7 +416,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 182 + 185 libs/ui/src/lib/benchmark/benchmark.component.html @@ -476,7 +480,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 329 + 332 @@ -512,15 +516,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 309 + 312 libs/ui/src/lib/activities-table/activities-table.component.html - 346 + 349 libs/ui/src/lib/holdings-table/holdings-table.component.html - 99 + 101 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -536,7 +540,7 @@ 编辑 apps/client/src/app/components/access-table/access-table.component.html - 104 + 74 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -556,7 +560,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 510 + 513 @@ -564,7 +568,7 @@ 删除 apps/client/src/app/components/access-table/access-table.component.html - 135 + 97 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -576,7 +580,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 241 + 236 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -604,7 +608,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 545 + 548 libs/ui/src/lib/benchmark/benchmark.component.html @@ -616,7 +620,7 @@ 您确定要删除此账户吗? libs/ui/src/lib/accounts-table/accounts-table.component.ts - 183 + 185 @@ -634,6 +638,10 @@ apps/client/src/app/components/admin-jobs/admin-jobs.html 52 + + libs/common/src/lib/routes/routes.ts + 76 + Historical Market Data @@ -644,7 +652,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 496 @@ -689,7 +697,7 @@ View and manage - View and manage + 查看与管理 libs/ui/src/lib/access-level-icon/access-level-icon.component.html 9 @@ -749,10 +757,10 @@ Splits - Splits + 拆股 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 518 + 519 @@ -784,7 +792,7 @@ 查找账户... libs/ui/src/lib/assistant/assistant.component.ts - 448 + 450 @@ -792,11 +800,11 @@ 日期 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 527 + 528 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 566 + 567 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -808,7 +816,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 213 + 216 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -844,7 +852,7 @@ 货币 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 133 + 123 apps/client/src/app/pages/public/public-page.html @@ -864,7 +872,7 @@ 没有国家的 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 138 + 128 @@ -872,7 +880,7 @@ 无行业类别的 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 143 + 133 @@ -880,7 +888,7 @@ 将数据源转换为 时发生错误。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 526 + 528 @@ -888,11 +896,11 @@ 您确实要删除此资产配置文件吗? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 27 + 33 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 69 + 75 @@ -900,7 +908,7 @@ 过滤... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 377 + 350 @@ -920,12 +928,12 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 52 Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. - Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. + 在我们的常见问题 (FAQ) 页面中查找关于完全托管的 Ghostfolio 云服务的常见问题快速解答。 apps/client/src/app/pages/faq/saas/saas-page.html 8 @@ -936,7 +944,7 @@ 数据采集频率 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 476 + 477 @@ -972,7 +980,7 @@ 应用当前市场价格 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 220 + 221 @@ -1132,7 +1140,7 @@ 更新活动 libs/common/src/lib/routes/routes.ts - 176 + 202 @@ -1164,7 +1172,7 @@ 刮削配置 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 634 + 635 @@ -1180,7 +1188,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 251 + 252 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -1188,7 +1196,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 396 + 399 @@ -1198,6 +1206,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 + + libs/common/src/lib/routes/routes.ts + 69 + Search @@ -1223,14 +1235,6 @@ 18 - - Copy identifier to clipboard - Copy identifier to clipboard - - apps/client/src/app/components/access-table/access-table.component.html - 120 - - Name, symbol or ISIN 名称、代码或 ISIN @@ -1333,10 +1337,10 @@ Update Account - Update Account + 更新账户 libs/common/src/lib/routes/routes.ts - 101 + 120 @@ -1349,7 +1353,7 @@ Explore our guides to help you get started with investing and managing your finances. - Explore our guides to help you get started with investing and managing your finances. + 探索我们的指南,帮助您开启投资与财务管理之旅。 apps/client/src/app/pages/resources/overview/resources-overview.component.ts 21 @@ -1376,11 +1380,11 @@ 添加 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 622 apps/client/src/app/components/admin-overview/admin-overview.html - 304 + 299 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1433,7 +1437,7 @@ Adjust the rules below and set custom thresholds to align with a personal investment strategy. - Adjust the rules below and set custom thresholds to align with a personal investment strategy. + 调整下方规则并设置自定义阈值,以贴合您的个人投资策略。 apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 12 @@ -1444,7 +1448,7 @@ 资产概况已保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 752 + 754 @@ -1465,7 +1469,7 @@ Please select a date in the future. - Please select a date in the future. + 请选择一个未来的日期。 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 70 @@ -1473,10 +1477,10 @@ The data of this asset profile is moved to () and this asset profile is deleted. - The data of this asset profile is moved to () and this asset profile is deleted. + 此资产概况的数据已转移至 (),且该资产概况已被删除。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 959 + 961 @@ -1492,7 +1496,7 @@ 当前年份 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 @@ -1505,7 +1509,7 @@ Cache has been flushed. - Cache has been flushed. + 缓存已刷新。 apps/client/src/app/components/admin-overview/admin-overview.component.ts 281 @@ -1632,11 +1636,11 @@ 无法验证表单 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 728 + 730 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 731 + 733 @@ -1676,7 +1680,7 @@ libs/common/src/lib/routes/routes.ts - 202 + 228 @@ -1728,7 +1732,7 @@ libs/common/src/lib/routes/routes.ts - 116 + 135 @@ -1757,10 +1761,10 @@ Split Ratio - Split Ratio + 拆股比例 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 532 + 533 @@ -1768,7 +1772,7 @@ 恐惧 apps/client/src/app/components/markets/markets.component.ts - 57 + 61 libs/ui/src/lib/i18n.ts @@ -1780,7 +1784,7 @@ 贪婪 apps/client/src/app/components/markets/markets.component.ts - 58 + 62 libs/ui/src/lib/i18n.ts @@ -1789,7 +1793,7 @@ Last Used - Last Used + 上次使用 apps/client/src/app/components/access-table/access-table.component.html 31 @@ -1797,10 +1801,10 @@ An error occurred while merging this asset profile into (). - An error occurred while merging this asset profile into (). + 将此资产概况合并入 () 时发生错误。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 942 + 944 @@ -1896,7 +1900,7 @@ 当前周 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 @@ -1965,7 +1969,7 @@ Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section. - Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section. + 在我们的常见问题 (FAQ) 页面中查找关于 Ghostfolio 的常见问题快速解答。 apps/client/src/app/pages/resources/overview/resources-overview.component.ts 16 @@ -2048,7 +2052,7 @@ 绝对总业绩 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 80 + 88 @@ -2060,7 +2064,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 94 + 102 @@ -2068,7 +2072,7 @@ 绝对净绩效 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 114 + 122 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -2080,7 +2084,7 @@ 净绩效 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 129 + 137 apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -2092,7 +2096,7 @@ 总资产 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 152 + 165 @@ -2100,7 +2104,7 @@ 购买力 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 292 + 305 @@ -2108,7 +2112,7 @@ 从分析中排除 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 324 + 337 @@ -2116,7 +2120,7 @@ 负债 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 355 + 368 apps/client/src/app/pages/features/features-page.html @@ -2128,7 +2132,7 @@ 净值 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 378 + 391 @@ -2136,7 +2140,7 @@ 年化业绩 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 393 + 406 @@ -2144,7 +2148,7 @@ 请输入您的应急基金金额。 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 160 + 169 @@ -2180,11 +2184,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 235 + 238 libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 76 @@ -2372,7 +2376,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 366 + 368 @@ -2380,11 +2384,11 @@ 年初至今 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 265 + 267 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -2392,11 +2396,11 @@ 1年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -2412,11 +2416,11 @@ 5年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -2432,19 +2436,11 @@ 最大限度 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 277 + 279 libs/ui/src/lib/assistant/assistant.component.ts - 416 - - - - Identifier has been copied to the clipboard - Identifier has been copied to the clipboard - - apps/client/src/app/components/access-table/access-table.component.ts - 149 + 418 @@ -2501,10 +2497,10 @@ Add Account - Add Account + 添加账户 libs/common/src/lib/routes/routes.ts - 87 + 101 @@ -2716,7 +2712,7 @@ 投资 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 214 + 227 @@ -2756,7 +2752,7 @@ 用户身份 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 116 + 113 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2796,7 +2792,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 197 @@ -2808,7 +2804,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 195 @@ -2820,7 +2816,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 194 + 198 @@ -2844,7 +2840,7 @@ libs/common/src/lib/routes/routes.ts - 270 + 296 @@ -2860,7 +2856,7 @@ libs/common/src/lib/routes/routes.ts - 235 + 261 @@ -2876,7 +2872,7 @@ libs/common/src/lib/routes/routes.ts - 243 + 269 @@ -2892,7 +2888,7 @@ libs/common/src/lib/routes/routes.ts - 259 + 285 @@ -2964,19 +2960,19 @@ libs/common/src/lib/routes/routes.ts - 104 + 123 libs/ui/src/lib/assistant/assistant.html - 84 + 85 Oops, cash balance transfer has failed. 糟糕,现金余额转账失败。 - apps/client/src/app/pages/accounts/accounts-page.component.ts - 199 + apps/client/src/app/pages/accounts/account-dialog-host/account-dialog-host.component.ts + 365 @@ -3000,7 +2996,7 @@ 帐户ID apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 108 + 109 @@ -3048,7 +3044,7 @@ libs/common/src/lib/routes/routes.ts - 78 + 92 @@ -3060,7 +3056,7 @@ libs/common/src/lib/routes/routes.ts - 65 + 79 @@ -3076,7 +3072,7 @@ libs/common/src/lib/routes/routes.ts - 70 + 84 @@ -3088,7 +3084,7 @@ libs/common/src/lib/routes/routes.ts - 75 + 89 @@ -3124,11 +3120,11 @@ libs/common/src/lib/routes/routes.ts - 143 + 169 libs/common/src/lib/routes/routes.ts - 220 + 246 @@ -3240,7 +3236,7 @@ libs/common/src/lib/routes/routes.ts - 275 + 301 @@ -3248,11 +3244,11 @@ 无法解析抓取器配置 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 676 + 678 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 679 + 681 @@ -3304,7 +3300,7 @@ libs/common/src/lib/routes/routes.ts - 301 + 327 @@ -3332,7 +3328,7 @@ libs/common/src/lib/routes/routes.ts - 306 + 332 @@ -3504,7 +3500,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 183 + 196 apps/client/src/app/pages/public/public-page.html @@ -3512,23 +3508,23 @@ libs/common/src/lib/routes/routes.ts - 125 + 144 libs/common/src/lib/routes/routes.ts - 217 + 243 libs/ui/src/lib/assistant/assistant.html - 110 + 111 This action cannot be undone. - This action cannot be undone. + 此操作无法撤销。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 961 + 963 @@ -3548,7 +3544,7 @@ libs/common/src/lib/routes/routes.ts - 135 + 154 @@ -3580,20 +3576,20 @@ libs/common/src/lib/routes/routes.ts - 130 + 149 libs/common/src/lib/routes/routes.ts - 311 + 337 libs/common/src/lib/routes/routes.ts - 359 + 385 Alternative Investment - Alternative Investment + 另类投资 libs/ui/src/lib/i18n.ts 52 @@ -3601,7 +3597,7 @@ Commodity - Commodity + 大宗商品 libs/ui/src/lib/i18n.ts 53 @@ -3609,7 +3605,7 @@ Equity - Equity + 股权 libs/ui/src/lib/i18n.ts 54 @@ -3617,7 +3613,7 @@ Fixed Income - Fixed Income + 固定收益 libs/ui/src/lib/i18n.ts 55 @@ -3625,7 +3621,7 @@ Liquidity - Liquidity + 流动性 libs/ui/src/lib/i18n.ts 56 @@ -3633,7 +3629,7 @@ Real Estate - Real Estate + 房地产 libs/ui/src/lib/i18n.ts 57 @@ -3641,7 +3637,7 @@ Bond - Bond + 债券 libs/ui/src/lib/i18n.ts 60 @@ -3649,7 +3645,7 @@ Cash - Cash + 现金 libs/ui/src/lib/i18n.ts 61 @@ -3657,7 +3653,7 @@ Collectible - Collectible + 收藏品 libs/ui/src/lib/i18n.ts 62 @@ -3665,7 +3661,7 @@ Commodity - Commodity + 大宗商品 apps/client/src/app/pages/i18n/i18n-page.html 5 @@ -3673,7 +3669,7 @@ Cryptocurrency - Cryptocurrency + 加密货币 libs/ui/src/lib/i18n.ts 63 @@ -3681,7 +3677,7 @@ ETF - ETF + ETF libs/ui/src/lib/i18n.ts 64 @@ -3689,7 +3685,7 @@ Loan - Loan + 贷款 libs/ui/src/lib/i18n.ts 65 @@ -3697,7 +3693,7 @@ Mutual Fund - Mutual Fund + 共同基金 libs/ui/src/lib/i18n.ts 66 @@ -3705,7 +3701,7 @@ Precious Metal - Precious Metal + 贵金属 libs/ui/src/lib/i18n.ts 67 @@ -3713,7 +3709,7 @@ Private Equity - Private Equity + 私募股权 libs/ui/src/lib/i18n.ts 68 @@ -3721,7 +3717,7 @@ Stock - Stock + 股票 libs/ui/src/lib/i18n.ts 69 @@ -3869,7 +3865,7 @@ Learn key financial terms and concepts in our comprehensive glossary. - Learn key financial terms and concepts in our comprehensive glossary. + 在我们的全面词汇表中学习关键的财务术语和概念。 apps/client/src/app/pages/resources/overview/resources-overview.component.ts 31 @@ -3901,10 +3897,10 @@ 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 - 344 + 327 @@ -4016,7 +4012,7 @@ 哎呀!无法删除资产概况。 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 54 + 60 @@ -4088,7 +4084,7 @@ 添加活动 libs/common/src/lib/routes/routes.ts - 169 + 195 @@ -4133,10 +4129,10 @@ Do you really want to merge this asset profile into it? - Do you really want to merge this asset profile into it? + 您确定要将此资产概况合并至其中吗? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 965 + 967 @@ -4280,7 +4276,7 @@ libs/common/src/lib/routes/routes.ts - 179 + 205 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -4364,7 +4360,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 263 @@ -4376,11 +4372,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 28 + 31 libs/ui/src/lib/activities-table/activities-table.component.html - 432 + 435 @@ -4392,11 +4388,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 54 + 57 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -4404,7 +4400,7 @@ 正在导入数据... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 176 @@ -4412,7 +4408,7 @@ 导入已完成 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 183 + 187 @@ -4428,7 +4424,7 @@ 验证数据... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 294 + 298 @@ -4501,10 +4497,10 @@ Shares After - Shares After + 拆股后股数 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 590 + 591 @@ -4532,7 +4528,7 @@ 您确定要把此资产概况转换为 () 吗? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 809 + 811 @@ -4548,7 +4544,7 @@ libs/common/src/lib/routes/routes.ts - 184 + 210 @@ -4564,7 +4560,7 @@ 按平台 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 39 + 41 @@ -4572,7 +4568,7 @@ 按货币 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 58 + 60 @@ -4580,7 +4576,7 @@ 按资产类别 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 80 + 82 @@ -4588,7 +4584,7 @@ 通过持有 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 102 + 104 @@ -4596,7 +4592,7 @@ 按部门 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 125 + 127 @@ -4604,7 +4600,7 @@ 按大陆 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 148 + 150 @@ -4612,7 +4608,7 @@ 按市场 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 170 + 172 @@ -4620,7 +4616,7 @@ 区域 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 193 + 195 apps/client/src/app/pages/public/public-page.html @@ -4648,7 +4644,7 @@ 发达市场 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 216 + 218 apps/client/src/app/pages/public/public-page.html @@ -4668,7 +4664,7 @@ 新兴市场 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 226 + 228 apps/client/src/app/pages/public/public-page.html @@ -4680,7 +4676,7 @@ 其他市场 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 236 + 238 apps/client/src/app/pages/public/public-page.html @@ -4692,7 +4688,7 @@ 按帐户 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 283 + 285 @@ -4700,7 +4696,7 @@ 按 ETF 提供商 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 303 + 305 @@ -4708,7 +4704,7 @@ 按国家/地区 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 261 + 263 @@ -4720,7 +4716,7 @@ libs/common/src/lib/routes/routes.ts - 189 + 215 @@ -4744,7 +4740,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 479 + 492 apps/client/src/app/pages/features/features-page.html @@ -4888,7 +4884,7 @@ libs/common/src/lib/routes/routes.ts - 321 + 347 @@ -4909,10 +4905,10 @@ Do you really want to remove this received access? - Do you really want to remove this received access? + 您确定要移除接收到的此访问权限吗? apps/client/src/app/components/access-table/access-table.component.ts - 176 + 152 @@ -4936,7 +4932,7 @@ 每小时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 249 + 251 @@ -5092,11 +5088,11 @@ 无法保存资产概况 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 762 + 764 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 765 + 767 @@ -5148,7 +5144,7 @@ libs/common/src/lib/routes/routes.ts - 331 + 357 @@ -5180,7 +5176,7 @@ libs/common/src/lib/routes/routes.ts - 379 + 405 @@ -5189,11 +5185,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 370 + 396 libs/common/src/lib/routes/routes.ts - 374 + 400 @@ -5246,7 +5242,7 @@ Expiration Date - Expiration Date + 到期日 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 54 @@ -5490,10 +5486,10 @@ Data gathering has been started. - Data gathering has been started. + 数据收集已开始。 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 413 + 386 @@ -5529,7 +5525,7 @@ libs/common/src/lib/routes/routes.ts - 382 + 408 @@ -5613,11 +5609,11 @@ 导出活动记录 libs/ui/src/lib/activities-table/activities-table.component.html - 73 + 76 libs/ui/src/lib/activities-table/activities-table.component.html - 460 + 463 @@ -5625,11 +5621,11 @@ 将汇票导出为 ICS libs/ui/src/lib/activities-table/activities-table.component.html - 87 + 90 libs/ui/src/lib/activities-table/activities-table.component.html - 473 + 476 @@ -5637,7 +5633,7 @@ 草稿 libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/i18n.ts @@ -5649,7 +5645,7 @@ 克隆 libs/ui/src/lib/activities-table/activities-table.component.html - 521 + 524 @@ -5657,7 +5653,7 @@ 将汇票导出为 ICS libs/ui/src/lib/activities-table/activities-table.component.html - 533 + 536 @@ -5665,11 +5661,11 @@ 您确实要删除此活动吗? libs/ui/src/lib/activities-table/activities-table.component.ts - 343 + 326 libs/ui/src/lib/activities-table/activities-table.component.ts - 354 + 337 @@ -5681,7 +5677,7 @@ libs/ui/src/lib/assistant/assistant.html - 140 + 141 @@ -5689,7 +5685,7 @@ 组合筛选器 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 128 + 125 @@ -5748,6 +5744,14 @@ 286 + + Add to Watchlist + 添加到关注列表 + + libs/common/src/lib/routes/routes.ts + 163 + + Market data provided by 市场数据提供者 @@ -5782,10 +5786,10 @@ This asset profile cannot be merged into (). - This asset profile cannot be merged into (). + 无法将此资产概况合并到 ()。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 920 + 922 @@ -5805,7 +5809,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 465 + 478 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -5833,11 +5837,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 124 + 126 libs/ui/src/lib/holdings-table/holdings-table.component.html - 125 + 127 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5857,7 +5861,7 @@ 显示所有 libs/ui/src/lib/holdings-table/holdings-table.component.html - 216 + 222 @@ -5865,15 +5869,15 @@ 帐户 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts - 102 + 109 libs/common/src/lib/routes/routes.ts - 94 + 108 libs/ui/src/lib/activities-table/activities-table.component.html - 362 + 365 libs/ui/src/lib/i18n.ts @@ -5909,7 +5913,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 266 + 268 libs/ui/src/lib/i18n.ts @@ -5941,7 +5945,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 287 libs/ui/src/lib/i18n.ts @@ -5977,15 +5981,15 @@ 应急基金 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 229 + 242 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 307 + 320 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 412 + 425 apps/client/src/app/pages/features/features-page.html @@ -6057,7 +6061,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 460 + 462 @@ -6081,7 +6085,7 @@ 暂无活动 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 148 + 138 @@ -6130,10 +6134,10 @@ Export - Export + 导出 libs/ui/src/lib/activities-table/activities-table.component.html - 69 + 72 @@ -6189,7 +6193,7 @@ 买入 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 35 + 43 libs/ui/src/lib/i18n.ts @@ -6201,11 +6205,11 @@ 费用 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 238 + 239 libs/ui/src/lib/activities-table/activities-table.component.html - 285 + 288 libs/ui/src/lib/i18n.ts @@ -6233,7 +6237,7 @@ 卖出 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 49 + 57 libs/ui/src/lib/i18n.ts @@ -6242,7 +6246,7 @@ Restricted view and manage - Restricted view and manage + 受限的查看与管理 libs/ui/src/lib/access-level-icon/access-level-icon.component.html 5 @@ -6253,7 +6257,7 @@ 现金 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 261 + 274 @@ -6298,7 +6302,7 @@ Find quick answers to commonly asked questions about self-hosting Ghostfolio in our Frequently Asked Questions (FAQ) section. - Find quick answers to commonly asked questions about self-hosting Ghostfolio in our Frequently Asked Questions (FAQ) section. + 在我们的常见问题 (FAQ) 页面中查找关于自托管 Ghostfolio 的常见问题快速解答。 apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html 8 @@ -6353,7 +6357,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 66 + 74 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -6417,7 +6421,7 @@ 无可用数据 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 247 + 249 apps/client/src/app/pages/public/public-page.html @@ -6429,11 +6433,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 462 + 464 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 476 + 478 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6453,7 +6457,7 @@ 日期范围 libs/ui/src/lib/assistant/assistant.html - 170 + 171 @@ -6461,7 +6465,7 @@ 当前市场价格为 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 854 + 856 @@ -6477,7 +6481,7 @@ 哎呀!无法授予访问权限。 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 256 + 314 @@ -6593,7 +6597,7 @@ 今年迄今为止 libs/ui/src/lib/assistant/assistant.component.ts - 378 + 380 @@ -6601,7 +6605,7 @@ 本周至今 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6609,7 +6613,7 @@ 本月至今 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6617,11 +6621,11 @@ 本月至今 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 libs/ui/src/lib/assistant/assistant.component.ts - 374 + 376 @@ -6637,11 +6641,11 @@ 本周至今 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 257 + 259 libs/ui/src/lib/assistant/assistant.component.ts - 370 + 372 @@ -6673,7 +6677,7 @@ 重置过滤器 libs/ui/src/lib/assistant/assistant.html - 204 + 205 @@ -6681,7 +6685,7 @@ 年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 269 + 271 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6693,7 +6697,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 388 + 390 @@ -6701,11 +6705,11 @@ 年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 273 + 275 libs/ui/src/lib/assistant/assistant.component.ts - 410 + 412 @@ -6713,7 +6717,7 @@ 应用过滤器 libs/ui/src/lib/assistant/assistant.html - 217 + 218 @@ -6722,11 +6726,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 293 + 319 libs/common/src/lib/routes/routes.ts - 296 + 322 @@ -6738,7 +6742,7 @@ libs/common/src/lib/routes/routes.ts - 298 + 324 @@ -6758,7 +6762,7 @@ 查找持仓... libs/ui/src/lib/assistant/assistant.component.ts - 449 + 451 @@ -6778,7 +6782,7 @@ libs/common/src/lib/routes/routes.ts - 290 + 316 @@ -6786,7 +6790,7 @@ 每天 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 245 + 247 @@ -6810,7 +6814,7 @@ 已关闭 apps/client/src/app/components/home-holdings/home-holdings.component.ts - 74 + 78 @@ -6818,7 +6822,7 @@ 活跃 apps/client/src/app/components/home-holdings/home-holdings.component.ts - 73 + 77 @@ -6870,7 +6874,7 @@ {VAR_PLURAL, plural, =1 {活动} other {活动}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html - 18 + 25 @@ -6886,7 +6890,7 @@ 删除活动 libs/ui/src/lib/activities-table/activities-table.component.html - 111 + 114 @@ -6894,7 +6898,7 @@ 国际化 libs/common/src/lib/routes/routes.ts - 149 + 175 @@ -6910,7 +6914,7 @@ 跳转到页面... libs/ui/src/lib/assistant/assistant.component.ts - 450 + 452 @@ -6934,7 +6938,7 @@ 按 ETF 持仓 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 328 + 330 @@ -6942,7 +6946,7 @@ 基于每个 ETF 的主要持仓的近似值 apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 335 + 337 @@ -6958,7 +6962,7 @@ 克隆活动 libs/common/src/lib/routes/routes.ts - 164 + 190 @@ -6971,7 +6975,7 @@ Derived from the portfolio you are viewing - Derived from the portfolio you are viewing + 源自您正在查看的投资组合 apps/client/src/app/components/user-account-settings/user-account-settings.html 27 @@ -6998,7 +7002,7 @@ 基准 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 118 @@ -7006,7 +7010,7 @@ 表格 apps/client/src/app/components/home-holdings/home-holdings.component.ts - 62 + 66 @@ -7014,7 +7018,7 @@ 图表 apps/client/src/app/components/home-holdings/home-holdings.component.ts - 67 + 71 @@ -7111,7 +7115,7 @@ Ghostfolio X-ray uses static analysis to uncover potential issues and risks in the portfolio. - Ghostfolio X-ray uses static analysis to uncover potential issues and risks in the portfolio. + Ghostfolio X-ray 使用静态分析来揭示投资组合中的潜在问题和风险。 apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 7 @@ -7122,7 +7126,7 @@ 哎呀!无法删除资产概况。 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 53 + 59 @@ -7191,7 +7195,7 @@ Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section. Discover what Ghostfolio is, explore its features, and learn about our privacy practices. Get all the information you need in one place. - Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section. Discover what Ghostfolio is, explore its features, and learn about our privacy practices. Get all the information you need in one place. + 在我们的常见问题 (FAQ) 页面中查找关于 Ghostfolio 的常见问题快速解答。了解什么是 Ghostfolio,探索其功能,并了解我们的隐私规范。一站式获取您所需的所有信息。 apps/client/src/app/pages/faq/overview/faq-overview-page.html 8 @@ -7226,7 +7230,7 @@ 查看持仓 libs/ui/src/lib/activities-table/activities-table.component.html - 499 + 502 @@ -7234,7 +7238,7 @@ 您确定要删除这 个资产概况吗? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 70 + 76 @@ -7242,15 +7246,15 @@ 错误 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 844 + 846 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 921 + 923 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 943 + 945 @@ -7274,7 +7278,7 @@ 哎呀!无法更新访问权限。 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 354 + 414 @@ -7314,11 +7318,11 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 143 + 152 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 117 + 118 apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html @@ -7326,7 +7330,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 321 + 323 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -7370,7 +7374,7 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 145 + 154 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -7382,11 +7386,11 @@ apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 119 + 120 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 323 + 325 libs/ui/src/lib/i18n.ts @@ -7414,7 +7418,7 @@ 复制链接到剪贴板 apps/client/src/app/components/access-table/access-table.component.html - 112 + 82 @@ -7602,7 +7606,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 107 + 110 @@ -7631,10 +7635,10 @@ Shares Before - Shares Before + 拆股前股数 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 603 + 604 @@ -7694,7 +7698,7 @@ 哎呀!找不到任何资产。 libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html - 43 + 44 @@ -7750,7 +7754,7 @@ libs/common/src/lib/routes/routes.ts - 343 + 369 @@ -7766,7 +7770,7 @@ libs/common/src/lib/routes/routes.ts - 351 + 377 @@ -7775,11 +7779,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 346 + 372 libs/common/src/lib/routes/routes.ts - 349 + 375 @@ -7788,11 +7792,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 338 + 364 libs/common/src/lib/routes/routes.ts - 341 + 367 @@ -7832,7 +7836,7 @@ 您确定要删除此 API 密钥吗? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 148 + 151 @@ -7873,7 +7877,7 @@ Access various market resources and tools to stay informed about financial markets. - Access various market resources and tools to stay informed about financial markets. + 访问各种市场资源和工具,随时了解金融市场动态。 apps/client/src/app/pages/resources/overview/resources-overview.component.ts 26 @@ -7921,7 +7925,7 @@ rules align with the portfolio. - 条规则与您的投资组合一致。 + 项规则符合投资组合。 apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 65 @@ -7952,7 +7956,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 158 + 167 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7960,15 +7964,15 @@ apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html - 158 + 167 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html - 128 + 129 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 332 + 334 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -8016,7 +8020,7 @@ 请输入您的 Ghostfolio API 密钥。 apps/client/src/app/components/admin-settings/admin-settings.component.ts - 167 + 170 @@ -8040,7 +8044,7 @@ 链接已复制到剪贴板 apps/client/src/app/components/access-table/access-table.component.ts - 161 + 137 @@ -8048,7 +8052,7 @@ 延迟 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8056,7 +8060,7 @@ 即时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8064,7 +8068,7 @@ 默认市场价格 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 644 + 645 @@ -8080,7 +8084,7 @@ 您确定要把数据源转换为 吗? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 529 + 531 @@ -8096,7 +8100,7 @@ HTTP 请求标头 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 657 + 658 @@ -8104,7 +8108,7 @@ 收盘 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 294 + 296 @@ -8112,7 +8116,7 @@ 实时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 298 + 300 @@ -8136,7 +8140,7 @@ 涨跌 libs/ui/src/lib/holdings-table/holdings-table.component.html - 146 + 148 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8153,7 +8157,7 @@ Oops! Could not remove the received access. - Oops! Could not remove the received access. + 哎呀!无法移除接收到的访问权限。 apps/client/src/app/components/user-account-access/user-account-access.component.ts 156 @@ -8172,11 +8176,11 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 168 + 170 libs/ui/src/lib/holdings-table/holdings-table.component.html - 169 + 171 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -8237,10 +8241,10 @@ Additional requests are granted while you are setting up your instance - Additional requests are granted while you are setting up your instance + 在您配置实例期间已授予额外请求额度 apps/client/src/app/components/admin-settings/admin-settings.component.ts - 87 + 88 @@ -8309,11 +8313,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 262 + 288 libs/common/src/lib/routes/routes.ts - 265 + 291 @@ -8325,7 +8329,7 @@ libs/common/src/lib/routes/routes.ts - 267 + 293 @@ -8338,10 +8342,10 @@ () is already in use. - () 已在使用中。 + () 已被使用。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 963 + 965 @@ -8349,7 +8353,7 @@ 在更新到 () 时发生错误。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 807 + 809 @@ -8437,7 +8441,7 @@ libs/common/src/lib/routes/routes.ts - 140 + 166 @@ -8450,14 +8454,14 @@ {VAR_PLURAL, plural, =1 {Activity} other {Activities}} - {VAR_PLURAL, plural, =1 {Activity} other {Activities}} + {VAR_PLURAL, plural, =1 {活动} other {活动}} libs/ui/src/lib/activities-table/activities-table.component.html - 70 + 73 libs/ui/src/lib/activities-table/activities-table.component.html - 108 + 111 @@ -8482,11 +8486,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 230 + 256 libs/common/src/lib/routes/routes.ts - 233 + 259 @@ -8515,7 +8519,7 @@ Coverage - Coverage + 覆盖范围 apps/client/src/app/pages/i18n/i18n-page.html 147 @@ -8523,7 +8527,7 @@ The assets tagged as emergency fund exceed the emergency fund of ${emergencyFund} ${baseCurrency} - The assets tagged as emergency fund exceed the emergency fund of ${emergencyFund} ${baseCurrency} + 标记为应急基金的资产已超过设立的 ${emergencyFund} ${baseCurrency} 应急基金 apps/client/src/app/pages/i18n/i18n-page.html 149 @@ -8531,7 +8535,7 @@ The emergency fund of ${emergencyFund} ${baseCurrency} is not covered - The emergency fund of ${emergencyFund} ${baseCurrency} is not covered + ${emergencyFund} ${baseCurrency} 的应急基金尚未得到充分覆盖 apps/client/src/app/pages/i18n/i18n-page.html 153 @@ -8539,7 +8543,7 @@ No emergency fund amount has been set to determine the coverage - No emergency fund amount has been set to determine the coverage + 未设置应急基金金额,无法确定覆盖情况 apps/client/src/app/pages/i18n/i18n-page.html 157 @@ -8547,7 +8551,7 @@ The emergency fund of ${emergencyFund} ${baseCurrency} is covered - The emergency fund of ${emergencyFund} ${baseCurrency} is covered + ${emergencyFund} ${baseCurrency} 的应急基金已得到充分覆盖 apps/client/src/app/pages/i18n/i18n-page.html 160 @@ -8555,7 +8559,7 @@ Setup - 应急资金:设置 + 设置 apps/client/src/app/pages/i18n/i18n-page.html 163 @@ -8587,7 +8591,7 @@ The fees do exceed ${thresholdMax}% of the total investment volume (${feeRatio}%) - 费用已超过您总投资金额的 ${thresholdMax}%(${feeRatio}%) + 费用已超过总投资额的 ${thresholdMax}%(当前为 ${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 172 @@ -8595,7 +8599,7 @@ The fees do not exceed ${thresholdMax}% of the total investment volume (${feeRatio}%) - 费用未超过您总投资金额的 ${thresholdMax}%(${feeRatio}%) + 费用未超过总投资额的 ${thresholdMax}%(当前为 ${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 176 @@ -8606,7 +8610,7 @@ 快速链接 libs/ui/src/lib/assistant/assistant.html - 58 + 59 @@ -8622,7 +8626,7 @@ libs/common/src/lib/routes/routes.ts - 281 + 307 @@ -8630,7 +8634,7 @@ 开源替代方案 libs/common/src/lib/routes/routes.ts - 376 + 402 @@ -8643,7 +8647,7 @@ The net worth is managed by a single account - 您的净资产由单一账户管理 + 净资产由单个账户管理 apps/client/src/app/pages/i18n/i18n-page.html 32 @@ -8651,7 +8655,7 @@ The net worth is managed by ${accountsLength} accounts - 您的净资产由 ${accountsLength} 个账户管理 + 净资产由 ${accountsLength} 个账户管理 apps/client/src/app/pages/i18n/i18n-page.html 38 @@ -8663,15 +8667,15 @@ kebab-case libs/common/src/lib/routes/routes.ts - 362 + 388 libs/common/src/lib/routes/routes.ts - 365 + 391 libs/common/src/lib/routes/routes.ts - 373 + 399 @@ -8680,11 +8684,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 354 + 380 libs/common/src/lib/routes/routes.ts - 357 + 383 @@ -8764,7 +8768,7 @@ 当前月份 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 261 + 263 @@ -8777,7 +8781,7 @@ Over ${thresholdMax}% of the current investment is at ${maxAccountName} (${maxInvestmentRatio}%) - 您当前投资中有超过 ${thresholdMax}% 的资金在 ${maxAccountName} (${maxInvestmentRatio}%) + 当前投资中有超过 ${thresholdMax}% 集中于 ${maxAccountName}(${maxInvestmentRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 19 @@ -8785,7 +8789,7 @@ The major part of the current investment is at ${maxAccountName} (${maxInvestmentRatio}%) and does not exceed ${thresholdMax}% - 您的当前投资大部分位于 ${maxAccountName} (${maxInvestmentRatio}%) 且不超过 ${thresholdMax}% + 当前投资的主要部分位于 ${maxAccountName}(${maxInvestmentRatio}%),且未超过 ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 26 @@ -8801,7 +8805,7 @@ The equity contribution of the current investment (${equityValueRatio}%) exceeds ${thresholdMax}% - 您目前投资中股权占比 (${equityValueRatio}%) 超过了 ${thresholdMax}% + 股票类资产在当前投资中的占比(${equityValueRatio}%)超过了 ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 45 @@ -8809,7 +8813,7 @@ The equity contribution of the current investment (${equityValueRatio}%) is below ${thresholdMin}% - 您目前投资中股权占比 (${equityValueRatio}%) 低于 ${thresholdMin}% + 股票类资产在当前投资中的占比(${equityValueRatio}%)低于 ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 49 @@ -8817,7 +8821,7 @@ The equity contribution of the current investment (${equityValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 您目前投资中股权占比 (${equityValueRatio}%) 在 ${thresholdMin}% 和 ${thresholdMax}% 之间 + 股票类资产在当前投资中的占比(${equityValueRatio}%)介于 ${thresholdMin}% 到 ${thresholdMax}% 之间 apps/client/src/app/pages/i18n/i18n-page.html 53 @@ -8833,7 +8837,7 @@ The fixed income contribution of the current investment (${fixedIncomeValueRatio}%) exceeds ${thresholdMax}% - 您目前投资中固定收益占比 (${fixedIncomeValueRatio}%) 超过了 ${thresholdMax}% + 固定收益类资产在当前投资中的占比(${fixedIncomeValueRatio}%)超过了 ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 59 @@ -8841,7 +8845,7 @@ The fixed income contribution of the current investment (${fixedIncomeValueRatio}%) is below ${thresholdMin}% - 您目前投资中固定收益占比 (${fixedIncomeValueRatio}%) 低于 ${thresholdMin}% + 固定收益类资产在当前投资中的占比(${fixedIncomeValueRatio}%)低于 ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 63 @@ -8849,7 +8853,7 @@ The fixed income contribution of the current investment (${fixedIncomeValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 您目前投资中固定收益占比 (${fixedIncomeValueRatio}%) 在 ${thresholdMin}% 和 ${thresholdMax}% 之间 + 固定收益类资产在当前投资中的占比(${fixedIncomeValueRatio}%)介于 ${thresholdMin}% 到 ${thresholdMax}% 之间 apps/client/src/app/pages/i18n/i18n-page.html 68 @@ -8865,7 +8869,7 @@ The major part of the current investment is not in the base currency (${baseCurrencyValueRatio}% in ${baseCurrency}) - 您的当前投资的主要部分未以您的基础货币计价 ( ${baseCurrency} 仅占 ${baseCurrencyValueRatio}%) + 当前投资的主要部分未以基础货币计价(${baseCurrency} 占比为 ${baseCurrencyValueRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 90 @@ -8873,7 +8877,7 @@ The major part of the current investment is in the base currency (${baseCurrencyValueRatio}% in ${baseCurrency}) - 您的当前投资的主要部分以您的基础货币计价(其中 ${baseCurrency} 占比 ${baseCurrencyValueRatio}%) + 当前投资的主要部分以基础货币计价(${baseCurrency} 占比为 ${baseCurrencyValueRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 94 @@ -8889,7 +8893,7 @@ Over ${thresholdMax}% of the current investment is in ${currency} (${maxValueRatio}%) - 超过 ${thresholdMax}% 的当前投资在 ${currency} 中(占比 ${maxValueRatio}%) + 当前投资中有超过 ${thresholdMax}% 以 ${currency} 计价(${maxValueRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 99 @@ -8897,7 +8901,7 @@ The major part of the current investment is in ${currency} (${maxValueRatio}%) and does not exceed ${thresholdMax}% - 您的当前投资的主要部分以 ${currency} 计价(占比 ${maxValueRatio}%),并且未超过 ${thresholdMax}% + 当前投资的主要部分以 ${currency} 计价(${maxValueRatio}%),且未超过 ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 103 @@ -8909,11 +8913,11 @@ kebab-case libs/common/src/lib/routes/routes.ts - 386 + 412 libs/common/src/lib/routes/routes.ts - 387 + 413 @@ -8945,7 +8949,7 @@ 股票 apps/client/src/app/components/markets/markets.component.ts - 53 + 57 apps/client/src/app/pages/features/features-page.html @@ -8957,7 +8961,7 @@ 加密货币 apps/client/src/app/components/markets/markets.component.ts - 54 + 58 apps/client/src/app/pages/features/features-page.html @@ -9050,7 +9054,7 @@ The buying power is below ${thresholdMin} ${baseCurrency} - 您的购买力低于 ${thresholdMin} ${baseCurrency} + 购买力低于 ${thresholdMin} ${baseCurrency} apps/client/src/app/pages/i18n/i18n-page.html 75 @@ -9058,7 +9062,7 @@ The buying power is 0 ${baseCurrency} - 您的购买力为 0 ${baseCurrency} + 购买力为 0 ${baseCurrency} apps/client/src/app/pages/i18n/i18n-page.html 79 @@ -9066,7 +9070,7 @@ The buying power exceeds ${thresholdMin} ${baseCurrency} - 您的购买力超过了 ${thresholdMin} ${baseCurrency} + 购买力超过 ${thresholdMin} ${baseCurrency} apps/client/src/app/pages/i18n/i18n-page.html 82 @@ -9085,7 +9089,7 @@ 未找到结果... libs/ui/src/lib/assistant/assistant.html - 51 + 52 @@ -9098,7 +9102,7 @@ The developed markets contribution of the current investment (${developedMarketsValueRatio}%) exceeds ${thresholdMax}% - 发达市场对您的当前投资 (${developedMarketsValueRatio}%) 的贡献超过了 ${thresholdMax}% + 发达市场在当前投资中的占比(${developedMarketsValueRatio}%)超过了 ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 114 @@ -9106,7 +9110,7 @@ The developed markets contribution of the current investment (${developedMarketsValueRatio}%) is below ${thresholdMin}% - 发达市场对您的当前投资 (${developedMarketsValueRatio}%) 的贡献低于 ${thresholdMin}% + 发达市场在当前投资中的占比(${developedMarketsValueRatio}%)低于 ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 119 @@ -9114,7 +9118,7 @@ The developed markets contribution of the current investment (${developedMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 发达市场对您的当前投资 (${developedMarketsValueRatio}%) 的贡献在 ${thresholdMin}% 和 ${thresholdMax}% 之间 + 发达市场在当前投资中的占比(${developedMarketsValueRatio}%)介于 ${thresholdMin}% 到 ${thresholdMax}% 之间 apps/client/src/app/pages/i18n/i18n-page.html 124 @@ -9130,7 +9134,7 @@ The emerging markets contribution of the current investment (${emergingMarketsValueRatio}%) exceeds ${thresholdMax}% - 新兴市场对您的当前投资 (${emergingMarketsValueRatio}%) 的贡献超过了 ${thresholdMax}% + 新兴市场在当前投资中的占比(${emergingMarketsValueRatio}%)超过了 ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 132 @@ -9138,7 +9142,7 @@ The emerging markets contribution of the current investment (${emergingMarketsValueRatio}%) is below ${thresholdMin}% - 新兴市场对您的当前投资 (${emergingMarketsValueRatio}%) 的贡献低于 ${thresholdMin}% + 新兴市场在当前投资中的占比(${emergingMarketsValueRatio}%)低于 ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 137 @@ -9146,7 +9150,7 @@ The emerging markets contribution of the current investment (${emergingMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 新兴市场对您的当前投资 (${emergingMarketsValueRatio}%) 的贡献在 ${thresholdMin}% 和 ${thresholdMax}% 之间 + 新兴市场在当前投资中的占比(${emergingMarketsValueRatio}%)介于 ${thresholdMin}% 到 ${thresholdMax}% 之间 apps/client/src/app/pages/i18n/i18n-page.html 142 @@ -9162,7 +9166,7 @@ The net worth is managed by 0 accounts - 您的净资产由 0 个帐户管理 + 净资产由 0 个账户管理 apps/client/src/app/pages/i18n/i18n-page.html 35 @@ -9178,7 +9182,7 @@ The Asia-Pacific market contribution of the current investment (${valueRatio}%) exceeds ${thresholdMax}% - 亚太地区对您的当前投资 (${valueRatio}%) 的贡献超过了 ${thresholdMax}% + 亚太市场在当前投资中的占比(${valueRatio}%)超过了 ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 185 @@ -9186,7 +9190,7 @@ The Asia-Pacific market contribution of the current investment (${valueRatio}%) is below ${thresholdMin}% - 亚太地区对您的当前投资 (${valueRatio}%) 的贡献低于 ${thresholdMin}% + 亚太市场在当前投资中的占比(${valueRatio}%)低于 ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 189 @@ -9194,7 +9198,7 @@ The Asia-Pacific market contribution of the current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 亚太地区对您的当前投资 (${valueRatio}%) 的贡献在 ${thresholdMin}% 和 ${thresholdMax}% 之间 + 亚太市场在当前投资中的占比(${valueRatio}%)介于 ${thresholdMin}% 到 ${thresholdMax}% 之间 apps/client/src/app/pages/i18n/i18n-page.html 193 @@ -9210,7 +9214,7 @@ The Emerging Markets contribution of the current investment (${valueRatio}%) exceeds ${thresholdMax}% - 新兴市场对您的当前投资 (${valueRatio}%) 的贡献超过了 ${thresholdMax}% + 新兴市场在当前投资中的占比(${valueRatio}%)超过了 ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 201 @@ -9218,7 +9222,7 @@ The Emerging Markets contribution of the current investment (${valueRatio}%) is below ${thresholdMin}% - 新兴市场对您的当前投资 (${valueRatio}%) 的贡献低于 ${thresholdMin}% + 新兴市场在当前投资中的占比(${valueRatio}%)低于 ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 205 @@ -9226,7 +9230,7 @@ The Emerging Markets contribution of the current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 新兴市场对您的当前投资 (${valueRatio}%) 的贡献在 ${thresholdMin}% 和 ${thresholdMax}% 之间 + 新兴市场在当前投资中的占比(${valueRatio}%)介于 ${thresholdMin}% 到 ${thresholdMax}% 之间 apps/client/src/app/pages/i18n/i18n-page.html 209 @@ -9242,7 +9246,7 @@ The Europe market contribution of the current investment (${valueRatio}%) exceeds ${thresholdMax}% - 欧洲市场对您的当前投资 (${valueRatio}%) 的贡献超过了 ${thresholdMax}% + 欧洲市场在当前投资中的占比(${valueRatio}%)超过了 ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 215 @@ -9250,7 +9254,7 @@ The Europe market contribution of the current investment (${valueRatio}%) is below ${thresholdMin}% - 欧洲市场对您的当前投资 (${valueRatio}%) 的贡献低于 ${thresholdMin}% + 欧洲市场在当前投资中的占比(${valueRatio}%)低于 ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 219 @@ -9258,7 +9262,7 @@ The Europe market contribution of the current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 欧洲市场对您的当前投资 (${valueRatio}%) 的贡献在 ${thresholdMin}% 和 ${thresholdMax}% 之间 + 欧洲市场在当前投资中的占比(${valueRatio}%)介于 ${thresholdMin}% 到 ${thresholdMax}% 之间 apps/client/src/app/pages/i18n/i18n-page.html 223 @@ -9274,7 +9278,7 @@ The Japan market contribution of the current investment (${valueRatio}%) exceeds ${thresholdMax}% - 日本市场对您的当前投资 (${valueRatio}%) 的贡献超过了 ${thresholdMax}% + 日本市场在当前投资中的占比(${valueRatio}%)超过了 ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 229 @@ -9282,7 +9286,7 @@ The Japan market contribution of the current investment (${valueRatio}%) is below ${thresholdMin}% - 日本市场对您的当前投资 (${valueRatio}%) 的贡献低于 ${thresholdMin}% + 日本市场在当前投资中的占比(${valueRatio}%)低于 ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 233 @@ -9290,7 +9294,7 @@ The Japan market contribution of the current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 日本市场对您的当前投资 (${valueRatio}%) 的贡献在 ${thresholdMin}% 和 ${thresholdMax}% 之间 + 日本市场在当前投资中的占比(${valueRatio}%)介于 ${thresholdMin}% 到 ${thresholdMax}% 之间 apps/client/src/app/pages/i18n/i18n-page.html 237 @@ -9306,7 +9310,7 @@ The North America market contribution of the current investment (${valueRatio}%) exceeds ${thresholdMax}% - 北美市场对您的当前投资 (${valueRatio}%) 的贡献超过了 ${thresholdMax}% + 北美市场在当前投资中的占比(${valueRatio}%)超过了 ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 243 @@ -9314,7 +9318,7 @@ The North America market contribution of the current investment (${valueRatio}%) is below ${thresholdMin}% - 北美市场对您的当前投资 (${valueRatio}%) 的贡献低于 ${thresholdMin}% + 北美市场在当前投资中的占比(${valueRatio}%)低于 ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 247 @@ -9322,7 +9326,7 @@ The North America market contribution of the current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 北美市场对您的当前投资 (${valueRatio}%) 的贡献在 ${thresholdMin}% 和 ${thresholdMax}% 之间 + 北美市场在当前投资中的占比(${valueRatio}%)介于 ${thresholdMin}% 到 ${thresholdMax}% 之间 apps/client/src/app/pages/i18n/i18n-page.html 251 @@ -9382,7 +9386,7 @@ Oops! Could not revoke the granted access. - Oops! Could not revoke the granted access. + 哎呀!无法撤销授予的访问权限。 apps/client/src/app/components/user-account-access/user-account-access.component.ts 135 diff --git a/apps/client/src/styles/theme.scss b/apps/client/src/styles/theme.scss index 3f81250116..d3c9e6022b 100644 --- a/apps/client/src/styles/theme.scss +++ b/apps/client/src/styles/theme.scss @@ -149,6 +149,14 @@ $gf-typography: ( regular-weight: 400 ); +$_dense-form-field-theme: mat.define-theme( + ( + density: ( + scale: -4 + ) + ) +); + .theme-light { color-scheme: light; @@ -412,6 +420,10 @@ $gf-typography: ( ) ); + .gf-form-field-dense { + @include mat.form-field-density($_dense-form-field-theme); + } + .mat-accent { @include mat.button-overrides( ( diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 5e11f8ae17..77e8542398 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -60,6 +60,8 @@ export const BULL_BOARD_ROUTE = '/admin/queues'; export const CACHE_TTL_NO_CACHE = 1; export const CACHE_TTL_INFINITE = 0; +export const COMMENT_MAXIMUM_LENGTH = 2000; + export const DATA_GATHERING_QUEUE = 'DATA_GATHERING_QUEUE'; export const DATA_GATHERING_QUEUE_PRIORITY_HIGH = 1; export const DATA_GATHERING_QUEUE_PRIORITY_LOW = Number.MAX_SAFE_INTEGER; @@ -342,6 +344,7 @@ export const REPLACE_NAME_PARTS = [ 'Xtrackers (IE) Plc -' ]; +export const SEARCH_QUERY_MAXIMUM_LENGTH = 255; export const SEARCH_QUERY_MINIMUM_LENGTH = 2; export const SECTORS = [ @@ -378,6 +381,8 @@ export const SUPPORTED_LANGUAGE_CODES = [ 'zh' ] as const; +export const SYMBOL_MAXIMUM_LENGTH = 255; + export const TAG_ID_DEMO = 'efa08cb3-9b9d-4974-ac68-db13a19c4874'; export const TAG_ID_DRAFT = '0c077abd-eca2-4cbb-818c-6cefbf2d169a'; export const TAG_ID_EMERGENCY_FUND = '4452656d-9fa4-4bd0-ba38-70492e31d180'; diff --git a/libs/common/src/lib/dtos/create-account.dto.ts b/libs/common/src/lib/dtos/create-account.dto.ts index ccadff5f97..92879dbb2c 100644 --- a/libs/common/src/lib/dtos/create-account.dto.ts +++ b/libs/common/src/lib/dtos/create-account.dto.ts @@ -1,3 +1,4 @@ +import { COMMENT_MAXIMUM_LENGTH } from '@ghostfolio/common/config'; import { IsCurrencyCode } from '@ghostfolio/common/validators/is-currency-code'; import { Transform, TransformFnParams } from 'class-transformer'; @@ -7,6 +8,7 @@ import { IsNumber, IsOptional, IsString, + MaxLength, ValidateIf } from 'class-validator'; import { isString } from 'lodash'; @@ -22,6 +24,7 @@ export class CreateAccountDto { @IsOptional() @IsString() + @MaxLength(COMMENT_MAXIMUM_LENGTH) @Transform(({ value }: TransformFnParams) => isString(value) ? value.trim() : value ) diff --git a/libs/common/src/lib/dtos/create-asset-profile.dto.ts b/libs/common/src/lib/dtos/create-asset-profile.dto.ts index 17a9d12b9d..4197137fb3 100644 --- a/libs/common/src/lib/dtos/create-asset-profile.dto.ts +++ b/libs/common/src/lib/dtos/create-asset-profile.dto.ts @@ -1,3 +1,7 @@ +import { + COMMENT_MAXIMUM_LENGTH, + SYMBOL_MAXIMUM_LENGTH +} from '@ghostfolio/common/config'; import { IsCurrencyCode } from '@ghostfolio/common/validators/is-currency-code'; import { AssetClass, AssetSubClass, DataSource, Prisma } from '@prisma/client'; @@ -9,6 +13,7 @@ import { IsOptional, IsString, IsUrl, + MaxLength, ValidateNested } from 'class-validator'; @@ -27,6 +32,7 @@ export class CreateAssetProfileDto { @IsOptional() @IsString() + @MaxLength(COMMENT_MAXIMUM_LENGTH) comment?: string; @IsArray() @@ -82,6 +88,7 @@ export class CreateAssetProfileDto { sectors?: Prisma.InputJsonArray; @IsString() + @MaxLength(SYMBOL_MAXIMUM_LENGTH) symbol: string; @IsOptional() diff --git a/libs/common/src/lib/dtos/create-order.dto.ts b/libs/common/src/lib/dtos/create-order.dto.ts index c70b66b025..1345f418a1 100644 --- a/libs/common/src/lib/dtos/create-order.dto.ts +++ b/libs/common/src/lib/dtos/create-order.dto.ts @@ -1,3 +1,7 @@ +import { + COMMENT_MAXIMUM_LENGTH, + SYMBOL_MAXIMUM_LENGTH +} from '@ghostfolio/common/config'; import { IsAfter1970Constraint } from '@ghostfolio/common/validator-constraints/is-after-1970'; import { IsCurrencyCode } from '@ghostfolio/common/validators/is-currency-code'; @@ -12,6 +16,7 @@ import { IsNumber, IsOptional, IsString, + MaxLength, Min, Validate } from 'class-validator'; @@ -32,6 +37,7 @@ export class CreateOrderDto { @IsOptional() @IsString() + @MaxLength(COMMENT_MAXIMUM_LENGTH) @Transform(({ value }: TransformFnParams) => isString(value) ? value.trim() : value ) @@ -61,6 +67,7 @@ export class CreateOrderDto { quantity: number; @IsString() + @MaxLength(SYMBOL_MAXIMUM_LENGTH) symbol: string; @ArrayUnique() diff --git a/libs/common/src/lib/dtos/create-watchlist-item.dto.ts b/libs/common/src/lib/dtos/create-watchlist-item.dto.ts index 663965ef1d..78808a0246 100644 --- a/libs/common/src/lib/dtos/create-watchlist-item.dto.ts +++ b/libs/common/src/lib/dtos/create-watchlist-item.dto.ts @@ -1,10 +1,13 @@ +import { SYMBOL_MAXIMUM_LENGTH } from '@ghostfolio/common/config'; + import { DataSource } from '@prisma/client'; -import { IsEnum, IsString } from 'class-validator'; +import { IsEnum, IsString, MaxLength } from 'class-validator'; export class CreateWatchlistItemDto { @IsEnum(DataSource) dataSource: DataSource; @IsString() + @MaxLength(SYMBOL_MAXIMUM_LENGTH) symbol: string; } diff --git a/libs/common/src/lib/dtos/update-account.dto.ts b/libs/common/src/lib/dtos/update-account.dto.ts index 4e1570aad6..deec684aae 100644 --- a/libs/common/src/lib/dtos/update-account.dto.ts +++ b/libs/common/src/lib/dtos/update-account.dto.ts @@ -1,3 +1,4 @@ +import { COMMENT_MAXIMUM_LENGTH } from '@ghostfolio/common/config'; import { IsCurrencyCode } from '@ghostfolio/common/validators/is-currency-code'; import { Transform, TransformFnParams } from 'class-transformer'; @@ -7,6 +8,7 @@ import { IsNumber, IsOptional, IsString, + MaxLength, ValidateIf } from 'class-validator'; import { isString } from 'lodash'; @@ -22,6 +24,7 @@ export class UpdateAccountDto { @IsOptional() @IsString() + @MaxLength(COMMENT_MAXIMUM_LENGTH) @Transform(({ value }: TransformFnParams) => isString(value) ? value.trim() : value ) 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 a8eaad608a..965778761d 100644 --- a/libs/common/src/lib/dtos/update-asset-profile.dto.ts +++ b/libs/common/src/lib/dtos/update-asset-profile.dto.ts @@ -1,3 +1,7 @@ +import { + COMMENT_MAXIMUM_LENGTH, + SYMBOL_MAXIMUM_LENGTH +} from '@ghostfolio/common/config'; import { IsCurrencyCode } from '@ghostfolio/common/validators/is-currency-code'; import { @@ -16,6 +20,7 @@ import { IsOptional, IsString, IsUrl, + MaxLength, ValidateNested } from 'class-validator'; @@ -35,6 +40,7 @@ export class UpdateAssetProfileDto { @IsOptional() @IsString() + @MaxLength(COMMENT_MAXIMUM_LENGTH) comment?: string | null; @IsArray() @@ -83,6 +89,7 @@ export class UpdateAssetProfileDto { @IsOptional() @IsString() + @MaxLength(SYMBOL_MAXIMUM_LENGTH) symbol?: string; @IsObject() diff --git a/libs/common/src/lib/dtos/update-order.dto.ts b/libs/common/src/lib/dtos/update-order.dto.ts index d8fdbe66b6..69d993559e 100644 --- a/libs/common/src/lib/dtos/update-order.dto.ts +++ b/libs/common/src/lib/dtos/update-order.dto.ts @@ -1,3 +1,7 @@ +import { + COMMENT_MAXIMUM_LENGTH, + SYMBOL_MAXIMUM_LENGTH +} from '@ghostfolio/common/config'; import { IsAfter1970Constraint } from '@ghostfolio/common/validator-constraints/is-after-1970'; import { IsCurrencyCode } from '@ghostfolio/common/validators/is-currency-code'; @@ -11,6 +15,7 @@ import { IsNumber, IsOptional, IsString, + MaxLength, Min, Validate } from 'class-validator'; @@ -31,6 +36,7 @@ export class UpdateOrderDto { @IsOptional() @IsString() + @MaxLength(COMMENT_MAXIMUM_LENGTH) @Transform(({ value }: TransformFnParams) => isString(value) ? value.trim() : value ) @@ -62,6 +68,7 @@ export class UpdateOrderDto { quantity: number; @IsString() + @MaxLength(SYMBOL_MAXIMUM_LENGTH) symbol: string; @ArrayUnique() diff --git a/libs/common/src/lib/personal-finance-tools.ts b/libs/common/src/lib/personal-finance-tools.ts index d0d7a92ba2..75fdcd1608 100644 --- a/libs/common/src/lib/personal-finance-tools.ts +++ b/libs/common/src/lib/personal-finance-tools.ts @@ -2460,14 +2460,14 @@ export const personalFinanceTools: Product[] = [ { categories: ['NET_WORTH_TRACKING', 'STOCK_TRACKING'], founded: 2025, - hasFreePlan: false, + hasFreePlan: true, hasSelfHostingAbility: false, key: 'turbobulls', name: 'Turbobulls', origin: 'RO', platforms: ['WEB'], - pricingPerYear: '€39.99', - slogan: 'Your complete financial dashboard. Actually private.', + pricingPerYear: '€35.90', + slogan: 'Your complete portfolio and expense tracker. Actually private.', url: 'https://www.turbobulls.com' }, { diff --git a/libs/common/src/lib/routes/routes.ts b/libs/common/src/lib/routes/routes.ts index 6985ba04f2..ca3cdd3663 100644 --- a/libs/common/src/lib/routes/routes.ts +++ b/libs/common/src/lib/routes/routes.ts @@ -62,6 +62,20 @@ export const internalRoutes = { marketData: { path: 'market-data', routerLink: ['/admin', 'market-data'], + subRoutes: { + create: { + path: 'create', + routerLink: ['/admin', 'market-data', 'create'], + title: $localize`Add Asset Profile` + }, + update: { + path: 'update', + routerLink: (aDataSource: string, aSymbol: string) => { + return ['/admin', 'market-data', aDataSource, aSymbol, 'update']; + }, + title: $localize`Asset Profile` + } + }, title: $localize`Market Data` }, settings: { @@ -93,6 +107,11 @@ export const internalRoutes = { }, title: $localize`Account` }, + transferCashBalance: { + path: 'transfer-cash-balance', + routerLink: ['/accounts', 'transfer-cash-balance'], + title: $localize`Transfer Cash Balance` + }, update: { path: 'update', routerLink: (aAccountId: string) => { @@ -137,6 +156,13 @@ export const internalRoutes = { watchlist: { path: 'watchlist', routerLink: ['/home', 'watchlist'], + subRoutes: { + create: { + path: 'create', + routerLink: ['/home', 'watchlist', 'create'], + title: $localize`Add to Watchlist` + } + }, title: $localize`Watchlist` } }, 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 2719f05a0d..a01abff1a8 100644 --- a/libs/ui/src/lib/accounts-table/accounts-table.component.html +++ b/libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -4,7 +4,7 @@ class="align-items-center d-flex" mat-stroked-button [disabled]="dataSource?.data.length < 2" - (click)="onTransferBalance()" + [routerLink]="transferCashBalanceRouterLink" > Transfer Cash Balance... 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 48eb99d51c..e986932906 100644 --- a/libs/ui/src/lib/accounts-table/accounts-table.component.ts +++ b/libs/ui/src/lib/accounts-table/accounts-table.component.ts @@ -75,7 +75,6 @@ export class GfAccountsTableComponent { public readonly totalValueInBaseCurrency = input(); public readonly accountDeleted = output(); - public readonly transferBalance = output(); public readonly sort = viewChild.required(MatSort); @@ -141,6 +140,9 @@ export class GfAccountsTableComponent { protected readonly isLoading = computed(() => !this.accounts()); + protected readonly transferCashBalanceRouterLink = + internalRoutes.accounts.subRoutes.transferCashBalance.routerLink; + private readonly notificationService = inject(NotificationService); private readonly router = inject(Router); @@ -197,8 +199,4 @@ export class GfAccountsTableComponent { title: aComment }); } - - protected onTransferBalance() { - this.transferBalance.emit(); - } } 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 9bfd44b9da..ded8fe8c83 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.html +++ b/libs/ui/src/lib/activities-table/activities-table.component.html @@ -3,7 +3,10 @@ >
@if (hasPermissionToFilterByType && activityTypeOptions().length > 1) { - + Type @for (activityType of activityTypeOptions(); track activityType.key) { 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 4e98f726e2..5d4e87f30f 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.scss +++ b/libs/ui/src/lib/activities-table/activities-table.component.scss @@ -1,12 +1,3 @@ -@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.ts b/libs/ui/src/lib/activities-table/activities-table.component.ts index acf17c933a..4646606577 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.ts @@ -1,13 +1,6 @@ -import { - DEFAULT_PAGE_SIZE, - TAG_ID_EXCLUDE_FROM_ANALYSIS -} from '@ghostfolio/common/config'; +import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; -import { - getLocale, - isAccountExcluded, - isDraftActivity -} from '@ghostfolio/common/helper'; +import { getLocale, isDraftActivity } from '@ghostfolio/common/helper'; import { Activity, AssetProfileIdentifier @@ -286,7 +279,6 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnInit { public canClickActivity(activity: Activity) { return ( this.hasPermissionToOpenDetails && - this.isExcludedFromAnalysis(activity) === false && isDraftActivity(activity) === false && ['BUY', 'DIVIDEND', 'SELL'].includes(activity.type) ); @@ -306,15 +298,6 @@ export class GfActivitiesTableComponent implements AfterViewInit, OnInit { ); } - public isExcludedFromAnalysis(activity: Activity) { - return ( - isAccountExcluded(activity.account) || - activity.tags?.some(({ id }) => { - return id === TAG_ID_EXCLUDE_FROM_ANALYSIS; - }) === true - ); - } - public onChangePage(page: PageEvent) { this.pageChanged.emit(page); } diff --git a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts index a45e6224c5..aabda169f9 100644 --- a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts +++ b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts @@ -55,14 +55,13 @@ export class GfAssistantListItemComponent this.queryParams = {}; this.routerLink = this.item.routerLink; } else if (this.item?.mode === SearchMode.ASSET_PROFILE) { - this.queryParams = { - assetProfileDialog: true, - dataSource: this.item.dataSource, - symbol: this.item.symbol - }; + this.queryParams = {}; this.routerLink = - internalRoutes.adminControl.subRoutes.marketData.routerLink ?? []; + internalRoutes.adminControl.subRoutes.marketData.subRoutes.update.routerLink( + this.item.dataSource, + this.item.symbol + ); } else if (this.item?.mode === SearchMode.HOLDING) { this.queryParams = { dataSource: this.item.dataSource, diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts index f612a2cad7..6babc10398 100644 --- a/libs/ui/src/lib/assistant/assistant.component.ts +++ b/libs/ui/src/lib/assistant/assistant.component.ts @@ -1,3 +1,4 @@ +import { SEARCH_QUERY_MAXIMUM_LENGTH } from '@ghostfolio/common/config'; import { Filter, PortfolioPosition, User } from '@ghostfolio/common/interfaces'; import { InternalRoute } from '@ghostfolio/common/routes/interfaces/internal-route.interface'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; @@ -130,6 +131,7 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { ); public searchFormControl = new FormControl(''); + public readonly SEARCH_QUERY_MAXIMUM_LENGTH = SEARCH_QUERY_MAXIMUM_LENGTH; public searchResults: SearchResults = { accounts: [], @@ -477,7 +479,9 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { this.setIsOpen(true); this.dataService - .fetchPortfolioHoldings() + .fetchPortfolioHoldings({ + filters: [{ id: 'ACTIVE', type: 'HOLDING_TYPE' }] + }) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(({ holdings }) => { this.holdings = getHoldingsForFilter(holdings); diff --git a/libs/ui/src/lib/assistant/assistant.html b/libs/ui/src/lib/assistant/assistant.html index 79e2f31a13..9c5fd5601c 100644 --- a/libs/ui/src/lib/assistant/assistant.html +++ b/libs/ui/src/lib/assistant/assistant.html @@ -13,6 +13,7 @@ name="search" type="text" [formControl]="searchFormControl" + [maxlength]="SEARCH_QUERY_MAXIMUM_LENGTH" [placeholder]="placeholder" /> @if (deviceType !== 'mobile' && !searchFormControl.value) { 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 8a7e131568..f46722921f 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 @@ -44,7 +44,7 @@ import { BenchmarkDetailDialogParams } from './interfaces/interfaces'; templateUrl: 'benchmark-detail-dialog.html' }) export class GfBenchmarkDetailDialogComponent implements OnInit { - public assetProfile: AdminMarketDataDetails['assetProfile']; + public assetProfile?: AdminMarketDataDetails['assetProfile']; public historicalDataItems: LineChartItem[]; public isLoading = true; public value: number; 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 2f415d874c..2ab60b9d2d 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 @@ -1,7 +1,7 @@ diff --git a/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.html b/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.html index 9214336200..fb72e72cd7 100644 --- a/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.html +++ b/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.html @@ -1,5 +1,5 @@ - Market data provided by  + Market data provided by{{ ' ' }} @for ( dataProviderInfo of dataProviderInfos; track dataProviderInfo; @@ -7,10 +7,7 @@ ) { {{ dataProviderInfo.name - }} - @if (!last) { - ,  - } + }}{{ last ? '.' : ', ' }} } - . 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 e66dac725a..5bc76f646e 100644 --- a/libs/ui/src/lib/holdings-table/holdings-table.component.html +++ b/libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -3,9 +3,9 @@ class="gf-table w-100" mat-table matSort - matSortActive="allocationInPercentage" - matSortDirection="desc" [dataSource]="dataSource" + [matSortActive]="sortActive()" + [matSortDirection]="sortDirection()" > @@ -34,9 +34,11 @@ ({{ element.assetProfile.assetSubClassLabel }}) }
-
- {{ element.assetProfile.symbol }} -
+ @if (mode() === 'default') { +
+ {{ element.assetProfile.symbol }} +
+ } @@ -181,7 +183,11 @@ - +
- - Time to add your first activity. - + diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html index d786d724de..5e23c558a7 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html @@ -4,6 +4,7 @@ matInput [formControl]="control" [matAutocomplete]="symbolAutocomplete" + [maxlength]="SEARCH_QUERY_MAXIMUM_LENGTH" /> ('symbolAutocomplete'); diff --git a/package-lock.json b/package-lock.json index 6d3a14071e..ebf42dac50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.65.0", + "version": "3.70.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.65.0", + "version": "3.70.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { @@ -21,10 +21,10 @@ "@angular/platform-browser-dynamic": "22.1.2", "@angular/router": "22.1.2", "@angular/service-worker": "22.1.2", - "@bull-board/api": "9.0.1", - "@bull-board/express": "9.0.1", - "@bull-board/nestjs": "9.0.1", - "@codewithdan/observable-store": "2.2.15", + "@bull-board/api": "9.8.0", + "@bull-board/express": "9.8.0", + "@bull-board/nestjs": "9.8.0", + "@codewithdan/observable-store": "3.0.0", "@date-fns/utc": "2.1.1", "@internationalized/number": "3.6.7", "@ionic/angular": "8.8.12", @@ -33,23 +33,23 @@ "@modelcontextprotocol/node": "2.0.0", "@modelcontextprotocol/server": "2.0.0", "@nest-lab/throttler-storage-redis": "1.2.0", - "@nestjs/bull": "11.0.4", + "@nestjs/bull": "11.0.5", "@nestjs/cache-manager": "3.1.3", - "@nestjs/common": "11.1.28", + "@nestjs/common": "11.2.3", "@nestjs/config": "4.0.4", - "@nestjs/core": "11.1.28", + "@nestjs/core": "11.2.3", "@nestjs/event-emitter": "3.1.0", "@nestjs/jwt": "11.0.2", - "@nestjs/microservices": "11.1.28", + "@nestjs/microservices": "11.2.3", "@nestjs/passport": "11.0.5", - "@nestjs/platform-express": "11.1.28", + "@nestjs/platform-express": "11.2.3", "@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.10.0", "@prisma/client": "7.10.0", - "@rekog/mcp-nest": "2.0.0", + "@rekog/mcp-nest": "2.0.2", "@simplewebauthn/browser": "13.3.0", "@simplewebauthn/server": "13.3.1", "ai": "7.0.37", @@ -67,7 +67,7 @@ "class-validator": "0.15.1", "color": "5.0.3", "cookie-parser": "1.4.7", - "countries-and-timezones": "3.9.0", + "countries-and-timezones": "3.10.0", "countries-list": "3.4.1", "countup.js": "2.10.1", "date-fns": "4.4.0", @@ -88,9 +88,9 @@ "ng-extract-i18n-merge": "3.4.0", "ngx-device-detector": "12.0.0", "ngx-markdown": "22.0.0", - "ngx-skeleton-loader": "12.0.0", + "ngx-skeleton-loader": "13.0.0", "open-color": "1.9.1", - "papaparse": "5.5.3", + "papaparse": "5.7.0", "passport": "0.7.0", "passport-google-oauth20": "2.0.0", "passport-headerapikey": "1.2.2", @@ -105,8 +105,8 @@ "undici": "8.10.0", "uuid": "14.0.2", "yahoo-finance2": "4.0.2", - "zod": "4.4.3", - "zone.js": "0.16.2" + "zod": "4.5.4", + "zone.js": "0.16.3" }, "devDependencies": { "@angular-devkit/build-angular": "22.1.4", @@ -123,7 +123,7 @@ "@eslint/eslintrc": "3.3.1", "@eslint/js": "9.35.0", "@nestjs/schematics": "11.1.0", - "@nestjs/testing": "11.1.28", + "@nestjs/testing": "11.2.3", "@nx/angular": "23.1.1", "@nx/eslint-plugin": "23.1.1", "@nx/jest": "23.1.1", @@ -3378,6 +3378,16 @@ "node": ">=22.13.0" } }, + "node_modules/@angular/cli/node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/@angular/common": { "version": "22.1.2", "resolved": "https://registry.npmjs.org/@angular/common/-/common-22.1.2.tgz", @@ -6156,17 +6166,17 @@ "license": "(Apache-2.0 AND BSD-3-Clause)" }, "node_modules/@bull-board/api": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-9.0.1.tgz", - "integrity": "sha512-QZ+SDOlD1MAePNqy8qfs+7zExZyJCW/+nEncGE6Mt/+MlxT9mqvyZWmPUm38QZvIBJGSKaA9i9ZElR9wDbbPhw==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-9.8.0.tgz", + "integrity": "sha512-+qmJ19pBrOSZCPLbN93IijoPEpx5DZBWkwqUBk/FgQObvSyHB2OJvuwvvi/TaujTCbRH1eiYPc4USp9dTlNEug==", "license": "MIT", "dependencies": { "redis-info": "^3.1.0" }, "peerDependencies": { - "@bull-board/ui": "9.0.1", + "@bull-board/ui": "9.8.0", "bull": "^4.16.5", - "bullmq": "^5.79.2 || ^6.0.0" + "bullmq": "^5.56.0 || ^6.0.0" }, "peerDependenciesMeta": { "bull": { @@ -6178,13 +6188,13 @@ } }, "node_modules/@bull-board/express": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-9.0.1.tgz", - "integrity": "sha512-eblNP2imr639K9KG0n1sBaJp6lw6pu4/j7q3W+bydxtw83v4wobCcuVUxuhQkRaLTrIUMR/Snulc7+/vtxCshw==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-9.8.0.tgz", + "integrity": "sha512-nYywx44PHHq7ybgQZySrDiM9B2Yc1NSywWm+zdjP8UyVGrvgooZ0UsT+F58ZF4wQ2QGqYRCTNb+YbPvBAWWjBg==", "license": "MIT", "dependencies": { - "@bull-board/api": "9.0.1", - "@bull-board/ui": "9.0.1", + "@bull-board/api": "9.8.0", + "@bull-board/ui": "9.8.0", "ejs": "^6.0.1", "express": "^5.2.1" } @@ -6202,26 +6212,26 @@ } }, "node_modules/@bull-board/nestjs": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@bull-board/nestjs/-/nestjs-9.0.1.tgz", - "integrity": "sha512-pVcMZyuZ/X8SLjoayW8aREM1f4RFdI9WlwvHmT9RwlPhRnFLTnGMbnC5LOk+cYR/9WTB/Oeo1SDnzblIR99JtQ==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@bull-board/nestjs/-/nestjs-9.8.0.tgz", + "integrity": "sha512-Ooht3SBI6/3kiqrQ8HXQf9cXNH7C7NQoCupA9F0FGGnozdMUfS4+c8IXCwpcTuOp6x1+o1ZAqY6bckPiYdngAg==", "license": "MIT", "peerDependencies": { - "@bull-board/api": "^9.0.1", - "@nestjs/bull-shared": "^10.0.0 || ^11.0.0", - "@nestjs/common": "^9.0.0 || ^10.0.0 || ^11.0.0", - "@nestjs/core": "^9.0.0 || ^10.0.0 || ^11.0.0", + "@bull-board/api": "^9.8.0", + "@nestjs/bull-shared": "^10.0.0 || ^11.0.0 || ^12.0.0", + "@nestjs/common": "^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0", "reflect-metadata": "^0.1.13 || ^0.2.0", "rxjs": "^7.8.1" } }, "node_modules/@bull-board/ui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-9.0.1.tgz", - "integrity": "sha512-yGg0CMAFCA49IM1zPS+JFvUJW/whftaLtRyMWiVtvyLRd53uX0QW/uTaPcHy0V4bApp6U0FTa9+L9rk/49ciwg==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-9.8.0.tgz", + "integrity": "sha512-WE6imvISwGDI/E1i7H1M4mQ/NI99sj9u/XIUT5QgbQlWAbys1N4/YdfPktwK6eyKynPMPHJqcAqwRDJDzlceOA==", "license": "MIT", "dependencies": { - "@bull-board/api": "9.0.1" + "@bull-board/api": "9.8.0" } }, "node_modules/@cacheable/utils": { @@ -6236,9 +6246,9 @@ } }, "node_modules/@codewithdan/observable-store": { - "version": "2.2.15", - "resolved": "https://registry.npmjs.org/@codewithdan/observable-store/-/observable-store-2.2.15.tgz", - "integrity": "sha512-LVCSMZzTCvoDo5n7YDmtIIEhTmvJ8O21k36Vwu/A4kumdXQ1YVs4sKoSK3vlINZPL4AYY2MRsBVtvre4QIETFw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@codewithdan/observable-store/-/observable-store-3.0.0.tgz", + "integrity": "sha512-OyHzU29/nszIs0+340uQYjA2Ftx0eGmU3TyLYK8/j1IW7pv1Qx/W68dWcfC26hV67SVschPpp5v/qKudx9Marg==", "license": "MIT", "peerDependencies": { "rxjs": ">=6.4.0 <8" @@ -9466,12 +9476,12 @@ } }, "node_modules/@nestjs/bull": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@nestjs/bull/-/bull-11.0.4.tgz", - "integrity": "sha512-QVz2PR/rJF/isy7otVnMTSqLf/O71p9Ka7lBZt9Gm+NQFv8fcH2L11GL7TA0whyCcw/kAX5iRepUXz/wed4JoA==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/bull/-/bull-11.0.5.tgz", + "integrity": "sha512-z1TKz7NHlsZv5ss27Lp32jzPe8ynw/COWoywMu32k8VXWsDSAy7mvDSBEX3Go0ekO7CzhAzqPWrl//GU3QuMFA==", "license": "MIT", "dependencies": { - "@nestjs/bull-shared": "^11.0.4", + "@nestjs/bull-shared": "^11.0.5", "tslib": "2.8.1" }, "peerDependencies": { @@ -9481,9 +9491,9 @@ } }, "node_modules/@nestjs/bull-shared": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@nestjs/bull-shared/-/bull-shared-11.0.4.tgz", - "integrity": "sha512-VBJcDHSAzxQnpcDfA0kt9MTGUD1XZzfByV70su0W0eDCQ9aqIEBlzWRW21tv9FG9dIut22ysgDidshdjlnczLw==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/bull-shared/-/bull-shared-11.0.5.tgz", + "integrity": "sha512-QI7GHPk4oePBwszAZn/Kz5hgB79KijB1RDoo+E/BrSt33sHUrvRZXVyO0+knZleyloRYy0LT2VwsqSP/aQvg4Q==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -9507,9 +9517,9 @@ } }, "node_modules/@nestjs/common": { - "version": "11.1.28", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.28.tgz", - "integrity": "sha512-bRImsxibie+AM7xjdwcrm/gr5YeacI65kSBNzTufa1Ib5iwziaY/lqMtRh9THq6pbV4e1HP9aI2ZxGUumnmaoQ==", + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.2.3.tgz", + "integrity": "sha512-obdauJXHfthhepbV+LpGe88OeBlR/Kw9lwjLo0Utzc//agoLXYb9DUGhPQWtm81IpBWMv+19eiwcve9MsBZwXA==", "license": "MIT", "dependencies": { "file-type": "21.3.4", @@ -9592,9 +9602,9 @@ } }, "node_modules/@nestjs/core": { - "version": "11.1.28", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.28.tgz", - "integrity": "sha512-06m63xIRj8+l8uOeh/8LnYupGubkyu4f+bPKIadaSui6vK9KpXgoz7HveT1yOVLcEt0M0oCOEW5EuEXZkEmBBQ==", + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.2.3.tgz", + "integrity": "sha512-vkA9/Ja0Z3hvqXErSa+HaxrfF+cNXthNFi8VPNEKVli4rMd009yExAl0gLmko/Kf8peDXr72u1RN+j9Da2ukHg==", "license": "MIT", "dependencies": { "fast-safe-stringify": "2.1.1", @@ -9657,9 +9667,9 @@ } }, "node_modules/@nestjs/microservices": { - "version": "11.1.28", - "resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-11.1.28.tgz", - "integrity": "sha512-8uRs6/UrhXvd8YCrYKcNUwWA7b8jcbYH03WBKWJ2A3bc6+WcHA6yXq7Px30yemAGBtIIMXkHeL88dO2usVI5zg==", + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-11.2.3.tgz", + "integrity": "sha512-HcMm6c8dwKbU0CSOFYxcHZ17YkQawnVzpfT58u24/fAzmsA1WJyfCej5+uONjuG7L/CG76OSxKZlZBNzcxkUiw==", "license": "MIT", "dependencies": { "iterare": "1.2.1", @@ -9725,9 +9735,9 @@ } }, "node_modules/@nestjs/platform-express": { - "version": "11.1.28", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.28.tgz", - "integrity": "sha512-hU+9Sz4m+onHrR5AmelI59QKmY/Re546bPnygnpqqeQdHDiJpBgjWbL4t6Jr73CBpS60cpyng7WzjgphNB9iwA==", + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.2.3.tgz", + "integrity": "sha512-YFQvRXT2de1qNL9LJPUBQ31+RsfI4cJ+sbpU9ENM/hDCgoHSEhm7oxUuGGKmhTZBNZEYm8mDYdfoTFmAH1LIJg==", "license": "MIT", "dependencies": { "cors": "2.8.6", @@ -10008,9 +10018,9 @@ } }, "node_modules/@nestjs/testing": { - "version": "11.1.28", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.28.tgz", - "integrity": "sha512-B+VgRxeLaH7jkOMgAyUP3N3rpFlisQ7JRxixRbgHvG6a0VgKbbkNSofKExexCgKmQQak80undb3+2kE1lUBmRQ==", + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.2.3.tgz", + "integrity": "sha512-7ANDWlkm8Xw4CYIhCNZhtBzANsQUKqjteA2yx/6sjqGyWhekeBKz8wgCJykm0vo+ltrg6U34dZlm2NgiRcNHPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13587,9 +13597,9 @@ } }, "node_modules/@rekog/mcp-nest": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@rekog/mcp-nest/-/mcp-nest-2.0.0.tgz", - "integrity": "sha512-lT5V26V4fvPay50zMiw2KrEqlDSuzdAeyoQFd0+vfAwb40G6H8p8psTzgq5atTgNHktRPI7u4x8lrm8X844Asg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rekog/mcp-nest/-/mcp-nest-2.0.2.tgz", + "integrity": "sha512-kuye6wmRk5Gw4KZSCSXd83cWznRw4eFbvNUXsd8+1dYcS4uWKVVbRvxQIKNCyxc2UcljpsmLpnksr1NCRn3YAQ==", "license": "MIT", "dependencies": { "multer": "^2.2.0", @@ -19034,9 +19044,9 @@ } }, "node_modules/countries-and-timezones": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/countries-and-timezones/-/countries-and-timezones-3.9.0.tgz", - "integrity": "sha512-3upkVtUfZgdp5xOQI/Deg1ye73ae6bygJMO4UvtUi6wLjwcj7cBqx2PzSZ1VL8i5iveBbjhsQp2Judx7kPKivA==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/countries-and-timezones/-/countries-and-timezones-3.10.0.tgz", + "integrity": "sha512-HQ1GtXWNZy0r5MnZMLF9xmBmFNmtDVBeKQgX/5DY+RVmcZTODA+EPN/JLPCYRNP86nHG0QQrb1yJwGzXeqCCXw==", "license": "MIT", "engines": { "node": ">=8.x", @@ -27973,9 +27983,9 @@ } }, "node_modules/ngx-skeleton-loader": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ngx-skeleton-loader/-/ngx-skeleton-loader-12.0.0.tgz", - "integrity": "sha512-vGEytpLElYKSLovFHCJkwgPZOdy0lPqyejxuhVFcZJg9dsp07o0/NeM4/Nnc2oCDE8T/wkXSPIbrpKzfTDbMCQ==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/ngx-skeleton-loader/-/ngx-skeleton-loader-13.0.0.tgz", + "integrity": "sha512-IEJh0RbrQRA1MHWdFTpLtbibk6KulRno+YqibsCCankr3FVEl3JwspcbHhxQuWahC8EuahJLrcBPLYxFyF/Swg==", "license": "MIT", "dependencies": { "tslib": "^2.0.0" @@ -29403,9 +29413,9 @@ "license": "BlueOak-1.0.0" }, "node_modules/papaparse": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz", - "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.7.0.tgz", + "integrity": "sha512-qBGxg/7Q3Kl9Wfhrz2Z74UnvnHTXLNG6jmKJFeBvP2+y4lV7So+7SR62+Zd47JvdrCkX+nDcnr0ObPzek/+6RA==", "license": "MIT" }, "node_modules/param-case": { @@ -37225,9 +37235,9 @@ } }, "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.5.4.tgz", + "integrity": "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -37243,9 +37253,9 @@ } }, "node_modules/zone.js": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.16.2.tgz", - "integrity": "sha512-Eky7p2Z1Ig3NnbfodSPoARCjKBSTFMnE/ACsP1L/XJEfY4SdOFce19BsUCWVwL6K5ABZFy5J3bjcMWffX+YM3Q==", + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.16.3.tgz", + "integrity": "sha512-ihXL9+vhYyEhXz4TDNpHeAOZN9FVrbog0Il64OIEI28UP/n5AaI6gsccRuOHBfx+206agzyoK527bYIO0Foy6A==", "license": "MIT" } } diff --git a/package.json b/package.json index f21c66d6b1..7ac8ab8613 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.65.0", + "version": "3.70.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", @@ -65,10 +65,10 @@ "@angular/platform-browser-dynamic": "22.1.2", "@angular/router": "22.1.2", "@angular/service-worker": "22.1.2", - "@bull-board/api": "9.0.1", - "@bull-board/express": "9.0.1", - "@bull-board/nestjs": "9.0.1", - "@codewithdan/observable-store": "2.2.15", + "@bull-board/api": "9.8.0", + "@bull-board/express": "9.8.0", + "@bull-board/nestjs": "9.8.0", + "@codewithdan/observable-store": "3.0.0", "@date-fns/utc": "2.1.1", "@internationalized/number": "3.6.7", "@ionic/angular": "8.8.12", @@ -77,23 +77,23 @@ "@modelcontextprotocol/node": "2.0.0", "@modelcontextprotocol/server": "2.0.0", "@nest-lab/throttler-storage-redis": "1.2.0", - "@nestjs/bull": "11.0.4", + "@nestjs/bull": "11.0.5", "@nestjs/cache-manager": "3.1.3", - "@nestjs/common": "11.1.28", + "@nestjs/common": "11.2.3", "@nestjs/config": "4.0.4", - "@nestjs/core": "11.1.28", + "@nestjs/core": "11.2.3", "@nestjs/event-emitter": "3.1.0", "@nestjs/jwt": "11.0.2", - "@nestjs/microservices": "11.1.28", + "@nestjs/microservices": "11.2.3", "@nestjs/passport": "11.0.5", - "@nestjs/platform-express": "11.1.28", + "@nestjs/platform-express": "11.2.3", "@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.10.0", "@prisma/client": "7.10.0", - "@rekog/mcp-nest": "2.0.0", + "@rekog/mcp-nest": "2.0.2", "@simplewebauthn/browser": "13.3.0", "@simplewebauthn/server": "13.3.1", "ai": "7.0.37", @@ -111,7 +111,7 @@ "class-validator": "0.15.1", "color": "5.0.3", "cookie-parser": "1.4.7", - "countries-and-timezones": "3.9.0", + "countries-and-timezones": "3.10.0", "countries-list": "3.4.1", "countup.js": "2.10.1", "date-fns": "4.4.0", @@ -132,9 +132,9 @@ "ng-extract-i18n-merge": "3.4.0", "ngx-device-detector": "12.0.0", "ngx-markdown": "22.0.0", - "ngx-skeleton-loader": "12.0.0", + "ngx-skeleton-loader": "13.0.0", "open-color": "1.9.1", - "papaparse": "5.5.3", + "papaparse": "5.7.0", "passport": "0.7.0", "passport-google-oauth20": "2.0.0", "passport-headerapikey": "1.2.2", @@ -149,8 +149,8 @@ "undici": "8.10.0", "uuid": "14.0.2", "yahoo-finance2": "4.0.2", - "zod": "4.4.3", - "zone.js": "0.16.2" + "zod": "4.5.4", + "zone.js": "0.16.3" }, "devDependencies": { "@angular-devkit/build-angular": "22.1.4", @@ -167,7 +167,7 @@ "@eslint/eslintrc": "3.3.1", "@eslint/js": "9.35.0", "@nestjs/schematics": "11.1.0", - "@nestjs/testing": "11.1.28", + "@nestjs/testing": "11.2.3", "@nx/angular": "23.1.1", "@nx/eslint-plugin": "23.1.1", "@nx/jest": "23.1.1",