Browse Source

Merge branch 'ghostfolio:main' into perf/optimize-redact-attributes

pull/5843/head
Laksh sadhwani 1 month ago
committed by GitHub
parent
commit
f26b3e3513
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 57
      CHANGELOG.md
  2. 13
      README.md
  3. 4
      apps/api/src/app/admin/admin.controller.ts
  4. 6
      apps/api/src/app/admin/admin.service.ts
  5. 17
      apps/api/src/app/auth/auth.controller.ts
  6. 37
      apps/api/src/app/auth/auth.service.ts
  7. 3
      apps/api/src/app/auth/google.strategy.ts
  8. 79
      apps/api/src/app/endpoints/ai/ai.service.ts
  9. 140
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts
  10. 362
      apps/api/src/assets/cryptocurrencies/cryptocurrencies.json
  11. 9
      apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts
  12. 10
      apps/api/src/services/exchange-rate-data/exchange-rate-data.service.mock.ts
  13. 2
      apps/api/src/services/i18n/i18n.service.ts
  14. 1
      apps/api/src/services/interfaces/interfaces.ts
  15. 55
      apps/api/src/services/market-data/market-data.service.ts
  16. 14
      apps/api/src/services/queues/data-gathering/data-gathering.processor.ts
  17. 8
      apps/api/src/services/queues/data-gathering/data-gathering.service.ts
  18. 56
      apps/client/project.json
  19. 7
      apps/client/src/app/app.component.ts
  20. 6
      apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts
  21. 2
      apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html
  22. 27
      apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
  23. 62
      apps/client/src/app/components/admin-platform/admin-platform.component.ts
  24. 14
      apps/client/src/app/components/admin-tag/admin-tag.component.ts
  25. 2
      apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/interfaces/interfaces.ts
  26. 21
      apps/client/src/app/components/admin-users/admin-users.component.ts
  27. 6
      apps/client/src/app/components/header/header.component.ts
  28. 55
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts
  29. 48
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
  30. 20
      apps/client/src/app/components/home-watchlist/home-watchlist.component.ts
  31. 5
      apps/client/src/app/components/login-with-access-token-dialog/interfaces/interfaces.ts
  32. 22
      apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.component.ts
  33. 11
      apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
  34. 9
      apps/client/src/app/components/rule/rule.component.ts
  35. 1
      apps/client/src/app/components/rules/rules.component.html
  36. 1
      apps/client/src/app/components/rules/rules.component.ts
  37. 15
      apps/client/src/app/components/user-account-access/user-account-access.component.ts
  38. 5
      apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts
  39. 73
      apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
  40. 2
      apps/client/src/app/core/module-preload.service.ts
  41. 26
      apps/client/src/app/pages/about/overview/about-overview-page.html
  42. 25
      apps/client/src/app/pages/accounts/accounts-page.component.ts
  43. 2
      apps/client/src/app/pages/accounts/create-or-update-account-dialog/interfaces/interfaces.ts
  44. 10
      apps/client/src/app/pages/home/home-page.component.ts
  45. 73
      apps/client/src/app/pages/portfolio/activities/activities-page.component.ts
  46. 1
      apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts
  47. 2
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/interfaces/interfaces.ts
  48. 7
      apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
  49. 14
      apps/client/src/app/pages/portfolio/fire/fire-page.scss
  50. 2
      apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html
  51. 34
      apps/client/src/app/pages/register/register-page.component.ts
  52. 14
      apps/client/src/app/pages/register/register-page.html
  53. 18
      apps/client/src/app/pages/resources/glossary/resources-glossary.component.html
  54. 4
      apps/client/src/app/pages/resources/guides/resources-guides.component.html
  55. 8
      apps/client/src/app/pages/resources/markets/resources-markets.component.html
  56. 2
      apps/client/src/app/pages/resources/overview/resources-overview.component.html
  57. 6
      apps/client/src/app/pages/zen/zen-page.component.ts
  58. 4
      apps/client/src/app/services/admin.service.ts
  59. 56
      apps/client/src/app/services/internet-identity.service.ts
  60. 22
      apps/client/src/app/services/user/user.service.ts
  61. 28
      apps/client/src/assets/icons/internet-computer.svg
  62. BIN
      apps/client/src/assets/images/sponsors/logo-lambdatest.png
  63. 12
      apps/client/src/assets/oss-friends.json
  64. 114
      apps/client/src/locales/messages.ca.xlf
  65. 114
      apps/client/src/locales/messages.de.xlf
  66. 114
      apps/client/src/locales/messages.es.xlf
  67. 114
      apps/client/src/locales/messages.fr.xlf
  68. 114
      apps/client/src/locales/messages.it.xlf
  69. 114
      apps/client/src/locales/messages.nl.xlf
  70. 114
      apps/client/src/locales/messages.pl.xlf
  71. 114
      apps/client/src/locales/messages.pt.xlf
  72. 114
      apps/client/src/locales/messages.tr.xlf
  73. 114
      apps/client/src/locales/messages.uk.xlf
  74. 106
      apps/client/src/locales/messages.xlf
  75. 114
      apps/client/src/locales/messages.zh.xlf
  76. 61
      apps/client/src/styles/theme.scss
  77. 4
      apps/client/src/styles/variables.scss
  78. 5
      eslint.config.cjs
  79. 2
      libs/common/src/lib/helper.ts
  80. 4
      libs/common/src/lib/interfaces/index.ts
  81. 2
      libs/common/src/lib/interfaces/responses/admin-users-response.interface.ts
  82. 14
      libs/ui/src/lib/activities-table/activities-table.component.html
  83. 18
      libs/ui/src/lib/activities-table/activities-table.component.ts
  84. 7
      libs/ui/src/lib/benchmark/benchmark.component.ts
  85. 2
      libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
  86. 28
      libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts
  87. 3
      libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
  88. 6
      libs/ui/src/lib/tags-selector/tags-selector.component.ts
  89. 3
      libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
  90. 442
      package-lock.json
  91. 31
      package.json
  92. 8
      test/import/not-ok/invalid-data-source.json
  93. 8
      test/import/not-ok/invalid-date-before-min.json
  94. 8
      test/import/not-ok/invalid-date.json
  95. 8
      test/import/not-ok/invalid-symbol.json
  96. 8
      test/import/not-ok/invalid-type.json
  97. 8
      test/import/not-ok/unavailable-exchange-rate.json
  98. 3
      test/import/ok/500-activities.json
  99. 3
      test/import/ok/btceur.json
  100. 3
      test/import/ok/btcusd-short.json

57
CHANGELOG.md

@ -5,6 +5,63 @@ 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
### Changed
- Changed the build executor of the client from `@nx/angular:webpack-browser` to `@nx/angular:browser-esbuild`
### Fixed
- Fixed the style of the safe withdrawal rate selector in the _FIRE_ section (experimental)
## 2.214.0 - 2025-11-01
### Changed
- Improved the icon of the _View Holding_ menu item in the activities table
- Ensured atomic data replacement during historical market data gathering
- Removed _Internet Identity_ as a social login provider
- Refreshed the cryptocurrencies list
- Upgraded `countries-list` from version `3.1.1` to `3.2.0`
- Upgraded `ng-extract-i18n-merge` from version `3.0.0` to `3.1.0`
- Upgraded `twitter-api-v2` from version `1.23.0` to `1.27.0`
## 2.213.0 - 2025-10-30
### Added
- Extended the activities table menu with a _View Holding_ item
- Added the error logging to the symbol lookup in the _Trackinsight_ data enhancer
### Changed
- Improved the icon of the holdings tab on the home page
- Improved the icon of the holdings tab on the home page for the _Zen Mode_
- Improved the icon of the holdings tab in the account detail dialog
- Migrated the tags selector component in the holding detail dialog to form control
- Improved the language localization for German (`de`)
- Upgraded `nestjs` from version `11.1.3` to `11.1.8`
## 2.212.0 - 2025-10-29
### Added
- Added a close holding button to the holding detail dialog
- Added the _Sponsors_ section to the about page
- Extended the user detail dialog in the users section of the admin control panel
### Changed
- Refactored the generation of the holdings table in the _Copy AI prompt to clipboard for analysis_ action on the analysis page (experimental)
- Refactored the generation of the holdings table in the _Copy portfolio data to clipboard for AI prompt_ action on the analysis page (experimental)
- Improved the usability of the user detail dialog in the users section of the admin control panel
- Improved the language localization for German (`de`)
### Fixed
- Ensured the locale is available in the settings dialog to customize the rule thresholds of the _X-ray_ page
## 2.211.0 - 2025-10-25
### Added

13
README.md

@ -297,7 +297,18 @@ Ghostfolio is **100% free** and **open source**. We encourage and support an act
Not sure what to work on? We have [some ideas](https://github.com/ghostfolio/ghostfolio/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22%20no%3Aassignee), even for [newcomers](https://github.com/ghostfolio/ghostfolio/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22%20no%3Aassignee). Please join the Ghostfolio [Slack](https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg) channel or post to [@ghostfolio\_](https://x.com/ghostfolio_) on _X_. We would love to hear from you.
If you like to support this project, get [**Ghostfolio Premium**](https://ghostfol.io/en/pricing) or [**Buy me a coffee**](https://www.buymeacoffee.com/ghostfolio).
If you like to support this project, become a [**Sponsor**](https://github.com/sponsors/ghostfolio), get [**Ghostfolio Premium**](https://ghostfol.io/en/pricing) or [**Buy me a coffee**](https://www.buymeacoffee.com/ghostfolio).
## Sponsors
<div align="center">
<p>
Browser testing via<br />
<a href="https://www.lambdatest.com?utm_medium=sponsor&utm_source=ghostfolio" target="_blank" title="LambdaTest - AI Powered Testing Tool">
<img alt="LambdaTest Logo" height="45" width="250" src="https://www.lambdatest.com/blue-logo.png" />
</a>
</p>
</div>
## Analytics

4
apps/api/src/app/admin/admin.controller.ts

@ -17,7 +17,7 @@ import { getAssetProfileIdentifier } from '@ghostfolio/common/helper';
import {
AdminData,
AdminMarketData,
AdminUsers,
AdminUsersResponse,
EnhancedSymbolProfile,
ScraperConfiguration
} from '@ghostfolio/common/interfaces';
@ -315,7 +315,7 @@ export class AdminController {
public async getUsers(
@Query('skip') skip?: number,
@Query('take') take?: number
): Promise<AdminUsers> {
): Promise<AdminUsersResponse> {
return this.adminService.getUsers({
skip: isNaN(skip) ? undefined : skip,
take: isNaN(take) ? undefined : take

6
apps/api/src/app/admin/admin.service.ts

@ -23,7 +23,7 @@ import {
AdminMarketData,
AdminMarketDataDetails,
AdminMarketDataItem,
AdminUsers,
AdminUsersResponse,
AssetProfileIdentifier,
EnhancedSymbolProfile,
Filter
@ -513,7 +513,7 @@ export class AdminService {
}: {
skip?: number;
take?: number;
}): Promise<AdminUsers> {
}): Promise<AdminUsersResponse> {
const [count, users] = await Promise.all([
this.countUsersWithAnalytics(),
this.getUsersWithAnalytics({ skip, take })
@ -818,7 +818,7 @@ export class AdminService {
}: {
skip?: number;
take?: number;
}): Promise<AdminUsers['users']> {
}): Promise<AdminUsersResponse['users']> {
let orderBy: Prisma.Enumerable<Prisma.UserOrderByWithRelationInput> = [
{ createdAt: 'desc' }
];

17
apps/api/src/app/auth/auth.controller.ts

@ -102,23 +102,6 @@ export class AuthController {
}
}
@Post('internet-identity')
public async internetIdentityLogin(
@Body() body: { principalId: string }
): Promise<OAuthResponse> {
try {
const authToken = await this.authService.validateInternetIdentityLogin(
body.principalId
);
return { authToken };
} catch {
throw new HttpException(
getReasonPhrase(StatusCodes.FORBIDDEN),
StatusCodes.FORBIDDEN
);
}
}
@Get('webauthn/generate-registration-options')
@UseGuards(AuthGuard('jwt'), HasPermissionGuard)
public async generateRegistrationOptions() {

37
apps/api/src/app/auth/auth.service.ts

@ -4,7 +4,6 @@ import { PropertyService } from '@ghostfolio/api/services/property/property.serv
import { Injectable, InternalServerErrorException } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { Provider } from '@prisma/client';
import { ValidateOAuthLoginParams } from './interfaces/interfaces';
@ -44,42 +43,6 @@ export class AuthService {
});
}
public async validateInternetIdentityLogin(principalId: string) {
try {
const provider: Provider = 'INTERNET_IDENTITY';
let [user] = await this.userService.users({
where: { provider, thirdPartyId: principalId }
});
if (!user) {
const isUserSignupEnabled =
await this.propertyService.isUserSignupEnabled();
if (!isUserSignupEnabled || true) {
throw new Error('Sign up forbidden');
}
// Create new user if not found
user = await this.userService.createUser({
data: {
provider,
thirdPartyId: principalId
}
});
}
return this.jwtService.sign({
id: user.id
});
} catch (error) {
throw new InternalServerErrorException(
'validateInternetIdentityLogin',
error.message
);
}
}
public async validateOAuthLogin({
provider,
thirdPartyId

3
apps/api/src/app/auth/google.strategy.ts

@ -3,6 +3,7 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/con
import { Injectable, Logger } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Provider } from '@prisma/client';
import { DoneCallback } from 'passport';
import { Profile, Strategy } from 'passport-google-oauth20';
import { AuthService } from './auth.service';
@ -29,7 +30,7 @@ export class GoogleStrategy extends PassportStrategy(Strategy, 'google') {
_token: string,
_refreshToken: string,
profile: Profile,
done: Function
done: DoneCallback
) {
try {
const jwt = await this.authService.validateOAuthLogin({

79
apps/api/src/app/endpoints/ai/ai.service.ts

@ -14,6 +14,27 @@ import type { ColumnDescriptor } from 'tablemark';
@Injectable()
export class AiService {
private static readonly HOLDINGS_TABLE_COLUMN_DEFINITIONS: ({
key:
| 'ALLOCATION_PERCENTAGE'
| 'ASSET_CLASS'
| 'ASSET_SUB_CLASS'
| 'CURRENCY'
| 'NAME'
| 'SYMBOL';
} & ColumnDescriptor)[] = [
{ key: 'NAME', name: 'Name' },
{ key: 'SYMBOL', name: 'Symbol' },
{ key: 'CURRENCY', name: 'Currency' },
{ key: 'ASSET_CLASS', name: 'Asset Class' },
{ key: 'ASSET_SUB_CLASS', name: 'Asset Sub Class' },
{
align: 'right',
key: 'ALLOCATION_PERCENTAGE',
name: 'Allocation in Percentage'
}
];
public constructor(
private readonly portfolioService: PortfolioService,
private readonly propertyService: PropertyService
@ -59,14 +80,10 @@ export class AiService {
userId
});
const holdingsTableColumns: ColumnDescriptor[] = [
{ name: 'Name' },
{ name: 'Symbol' },
{ name: 'Currency' },
{ name: 'Asset Class' },
{ name: 'Asset Sub Class' },
{ align: 'right', name: 'Allocation in Percentage' }
];
const holdingsTableColumns: ColumnDescriptor[] =
AiService.HOLDINGS_TABLE_COLUMN_DEFINITIONS.map(({ align, name }) => {
return { name, align: align ?? 'left' };
});
const holdingsTableRows = Object.values(holdings)
.sort((a, b) => {
@ -78,17 +95,45 @@ export class AiService {
assetClass,
assetSubClass,
currency,
name,
name: label,
symbol
}) => {
return {
Name: name,
Symbol: symbol,
Currency: currency,
'Asset Class': assetClass ?? '',
'Asset Sub Class': assetSubClass ?? '',
'Allocation in Percentage': `${(allocationInPercentage * 100).toFixed(3)}%`
};
return AiService.HOLDINGS_TABLE_COLUMN_DEFINITIONS.reduce(
(row, { key, name }) => {
switch (key) {
case 'ALLOCATION_PERCENTAGE':
row[name] = `${(allocationInPercentage * 100).toFixed(3)}%`;
break;
case 'ASSET_CLASS':
row[name] = assetClass ?? '';
break;
case 'ASSET_SUB_CLASS':
row[name] = assetSubClass ?? '';
break;
case 'CURRENCY':
row[name] = currency;
break;
case 'NAME':
row[name] = label;
break;
case 'SYMBOL':
row[name] = symbol;
break;
default:
row[name] = '';
break;
}
return row;
},
{} as Record<string, string>
);
}
);

140
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts

@ -0,0 +1,140 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import {
activityDummyData,
loadExportFile,
symbolProfileDummyData,
userDummyData
} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils';
import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory';
import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service';
import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock';
import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service';
import { RedisCacheServiceMock } from '@ghostfolio/api/app/redis-cache/redis-cache.service.mock';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service.mock';
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { ExportResponse } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js';
import { join } from 'node:path';
jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => {
return {
CurrentRateService: jest.fn().mockImplementation(() => {
return CurrentRateServiceMock;
})
};
});
jest.mock(
'@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service',
() => {
return {
ExchangeRateDataService: jest.fn().mockImplementation(() => {
return ExchangeRateDataServiceMock;
})
};
}
);
jest.mock(
'@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service',
() => {
return {
PortfolioSnapshotService: jest.fn().mockImplementation(() => {
return PortfolioSnapshotServiceMock;
})
};
}
);
jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => {
return {
RedisCacheService: jest.fn().mockImplementation(() => {
return RedisCacheServiceMock;
})
};
});
describe('PortfolioCalculator', () => {
let exportResponse: ExportResponse;
let configurationService: ConfigurationService;
let currentRateService: CurrentRateService;
let exchangeRateDataService: ExchangeRateDataService;
let portfolioCalculatorFactory: PortfolioCalculatorFactory;
let portfolioSnapshotService: PortfolioSnapshotService;
let redisCacheService: RedisCacheService;
beforeAll(() => {
exportResponse = loadExportFile(
join(__dirname, '../../../../../../../test/import/ok/btceur.json')
);
});
beforeEach(() => {
configurationService = new ConfigurationService();
currentRateService = new CurrentRateService(null, null, null, null);
exchangeRateDataService = new ExchangeRateDataService(
null,
null,
null,
null
);
portfolioSnapshotService = new PortfolioSnapshotService(null);
redisCacheService = new RedisCacheService(null, null);
portfolioCalculatorFactory = new PortfolioCalculatorFactory(
configurationService,
currentRateService,
exchangeRateDataService,
portfolioSnapshotService,
redisCacheService
);
});
describe('get current positions', () => {
it.only('with BTCUSD buy (in EUR)', async () => {
jest.useFakeTimers().setSystemTime(parseDate('2022-01-14').getTime());
const activities: Activity[] = exportResponse.activities.map(
(activity) => ({
...activityDummyData,
...activity,
date: parseDate(activity.date),
feeInAssetProfileCurrency: 4.46,
SymbolProfile: {
...symbolProfileDummyData,
currency: 'USD',
dataSource: activity.dataSource,
name: 'Bitcoin',
symbol: activity.symbol
},
unitPriceInAssetProfileCurrency: 44558.42
})
);
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
activities,
calculationType: PerformanceCalculationType.ROAI,
currency: 'EUR',
userId: userDummyData.id
});
const portfolioSnapshot = await portfolioCalculator.computeSnapshot();
expect(portfolioSnapshot.positions[0].fee).toEqual(new Big(4.46));
expect(
portfolioSnapshot.positions[0].feeInBaseCurrency.toNumber()
).toBeCloseTo(3.94, 1);
});
});
});

362
apps/api/src/assets/cryptocurrencies/cryptocurrencies.json

File diff suppressed because it is too large

9
apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts

@ -4,7 +4,7 @@ import { Holding } from '@ghostfolio/common/interfaces';
import { Country } from '@ghostfolio/common/interfaces/country.interface';
import { Sector } from '@ghostfolio/common/interfaces/sector.interface';
import { Injectable } from '@nestjs/common';
import { Injectable, Logger } from '@nestjs/common';
import { SymbolProfile } from '@prisma/client';
import { countries } from 'countries-list';
@ -202,7 +202,12 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface {
return undefined;
})
.catch(() => {
.catch(({ message }) => {
Logger.error(
`Failed to search Trackinsight symbol for ${symbol} (${message})`,
'TrackinsightDataEnhancerService'
);
return undefined;
});
}

10
apps/api/src/services/exchange-rate-data/exchange-rate-data.service.mock.ts

@ -17,11 +17,21 @@ export const ExchangeRateDataServiceMock = {
'2023-07-10': 0.8854
}
});
} else if (targetCurrency === 'EUR') {
return Promise.resolve({
EUREUR: {
'2021-12-12': 1
},
USDEUR: {
'2021-12-12': 0.8855
}
});
} else if (targetCurrency === 'USD') {
return Promise.resolve({
USDUSD: {
'2018-01-01': 1,
'2021-11-16': 1,
'2021-12-12': 1,
'2023-07-10': 1
}
});

2
apps/api/src/services/i18n/i18n.service.ts

@ -65,7 +65,7 @@ export class I18nService {
}
private parseLanguageCode(aFileName: string) {
const match = aFileName.match(/\.([a-zA-Z]+)\.xlf$/);
const match = /\.([a-zA-Z]+)\.xlf$/.exec(aFileName);
return match ? match[1] : DEFAULT_LANGUAGE_CODE;
}

1
apps/api/src/services/interfaces/interfaces.ts

@ -20,4 +20,5 @@ export interface DataProviderResponse {
export interface DataGatheringItem extends AssetProfileIdentifier {
date?: Date;
force?: boolean;
}

55
apps/api/src/services/market-data/market-data.service.ts

@ -132,6 +132,61 @@ export class MarketDataService {
});
}
/**
* Atomically replace market data for a symbol within a date range.
* Deletes existing data in the range and inserts new data within a single
* transaction to prevent data loss if the operation fails.
*/
public async replaceForSymbol({
data,
dataSource,
symbol
}: AssetProfileIdentifier & { data: Prisma.MarketDataUpdateInput[] }) {
await this.prismaService.$transaction(async (prisma) => {
if (data.length > 0) {
let minTime = Infinity;
let maxTime = -Infinity;
for (const { date } of data) {
const time = (date as Date).getTime();
if (time < minTime) {
minTime = time;
}
if (time > maxTime) {
maxTime = time;
}
}
const minDate = new Date(minTime);
const maxDate = new Date(maxTime);
await prisma.marketData.deleteMany({
where: {
dataSource,
symbol,
date: {
gte: minDate,
lte: maxDate
}
}
});
await prisma.marketData.createMany({
data: data.map(({ date, marketPrice, state }) => ({
dataSource,
symbol,
date: date as Date,
marketPrice: marketPrice as number,
state: state as MarketDataState
})),
skipDuplicates: true
});
}
});
}
public async updateAssetProfileIdentifier(
oldAssetProfileIdentifier: AssetProfileIdentifier,
newAssetProfileIdentifier: AssetProfileIdentifier

14
apps/api/src/services/queues/data-gathering/data-gathering.processor.ts

@ -100,7 +100,7 @@ export class DataGatheringProcessor {
name: GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_NAME
})
public async gatherHistoricalMarketData(job: Job<DataGatheringItem>) {
const { dataSource, date, symbol } = job.data;
const { dataSource, date, force, symbol } = job.data;
try {
let currentDate = parseISO(date as unknown as string);
@ -109,7 +109,7 @@ export class DataGatheringProcessor {
`Historical market data gathering has been started for ${symbol} (${dataSource}) at ${format(
currentDate,
DATE_FORMAT
)}`,
)}${force ? ' (forced update)' : ''}`,
`DataGatheringProcessor (${GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_NAME})`
);
@ -157,7 +157,15 @@ export class DataGatheringProcessor {
currentDate = addDays(currentDate, 1);
}
await this.marketDataService.updateMany({ data });
if (force) {
await this.marketDataService.replaceForSymbol({
data,
dataSource,
symbol
});
} else {
await this.marketDataService.updateMany({ data });
}
Logger.log(
`Historical market data gathering has been completed for ${symbol} (${dataSource}) at ${format(

8
apps/api/src/services/queues/data-gathering/data-gathering.service.ts

@ -2,7 +2,6 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data
import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces';
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { PropertyService } from '@ghostfolio/api/services/property/property.service';
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
@ -41,7 +40,6 @@ export class DataGatheringService {
private readonly dataGatheringQueue: Queue,
private readonly dataProviderService: DataProviderService,
private readonly exchangeRateDataService: ExchangeRateDataService,
private readonly marketDataService: MarketDataService,
private readonly prismaService: PrismaService,
private readonly propertyService: PropertyService,
private readonly symbolProfileService: SymbolProfileService
@ -95,8 +93,6 @@ export class DataGatheringService {
}
public async gatherSymbol({ dataSource, date, symbol }: DataGatheringItem) {
await this.marketDataService.deleteMany({ dataSource, symbol });
const dataGatheringItems = (await this.getSymbolsMax())
.filter((dataGatheringItem) => {
return (
@ -111,6 +107,7 @@ export class DataGatheringService {
await this.gatherSymbols({
dataGatheringItems,
force: true,
priority: DATA_GATHERING_QUEUE_PRIORITY_HIGH
});
}
@ -274,9 +271,11 @@ export class DataGatheringService {
public async gatherSymbols({
dataGatheringItems,
force = false,
priority
}: {
dataGatheringItems: DataGatheringItem[];
force?: boolean;
priority: number;
}) {
await this.addJobsToQueue(
@ -285,6 +284,7 @@ export class DataGatheringService {
data: {
dataSource,
date,
force,
symbol
},
name: GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_NAME,

56
apps/client/project.json

@ -61,30 +61,30 @@
},
"targets": {
"build": {
"executor": "@nx/angular:webpack-browser",
"executor": "@nx/angular:browser-esbuild",
"options": {
"deleteOutputPath": false,
"localize": true,
"outputPath": "dist/apps/client",
"index": "apps/client/src/index.html",
"main": "apps/client/src/main.ts",
"polyfills": "apps/client/src/polyfills.ts",
"outputPath": "dist/apps/client",
"tsConfig": "apps/client/tsconfig.app.json",
"buildOptimizer": false,
"deleteOutputPath": false,
"extractLicenses": false,
"localize": true,
"namedChunks": true,
"ngswConfigPath": "apps/client/ngsw-config.json",
"optimization": false,
"polyfills": "apps/client/src/polyfills.ts",
"scripts": ["node_modules/marked/marked.min.js"],
"serviceWorker": true,
"sourceMap": true,
"styles": [
"apps/client/src/assets/fonts/inter.css",
"apps/client/src/styles/theme.scss",
"apps/client/src/styles.scss",
"node_modules/open-color/open-color.css"
],
"scripts": ["node_modules/marked/marked.min.js"],
"vendorChunk": true,
"extractLicenses": false,
"buildOptimizer": false,
"sourceMap": true,
"optimization": false,
"namedChunks": true,
"serviceWorker": true,
"ngswConfigPath": "apps/client/ngsw-config.json"
"vendorChunk": true
},
"configurations": {
"development-ca": {
@ -136,19 +136,6 @@
"localize": ["zh"]
},
"production": {
"fileReplacements": [
{
"replace": "apps/client/src/environments/environment.ts",
"with": "apps/client/src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"namedChunks": false,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"budgets": [
{
"type": "initial",
@ -160,7 +147,20 @@
"maximumWarning": "6kb",
"maximumError": "10kb"
}
]
],
"buildOptimizer": true,
"extractLicenses": true,
"fileReplacements": [
{
"replace": "apps/client/src/environments/environment.ts",
"with": "apps/client/src/environments/environment.prod.ts"
}
],
"namedChunks": false,
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"vendorChunk": false
}
},
"outputs": ["{options.outputPath}"],

7
apps/client/src/app/app.component.ts

@ -276,7 +276,10 @@ export class AppComponent implements OnDestroy, OnInit {
.subscribe((user) => {
this.user = user;
const dialogRef = this.dialog.open(GfHoldingDetailDialogComponent, {
const dialogRef = this.dialog.open<
GfHoldingDetailDialogComponent,
HoldingDetailDialogParams
>(GfHoldingDetailDialogComponent, {
autoFocus: false,
data: {
dataSource,
@ -302,7 +305,7 @@ export class AppComponent implements OnDestroy, OnInit {
hasPermission(this.user?.permissions, permissions.updateOrder) &&
!this.user?.settings?.isRestrictedView,
locale: this.user?.settings?.locale
} as HoldingDetailDialogParams,
},
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});

6
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts

@ -43,9 +43,9 @@ import { Big } from 'big.js';
import { format, parseISO } from 'date-fns';
import { addIcons } from 'ionicons';
import {
albumsOutline,
cashOutline,
swapVerticalOutline,
walletOutline
swapVerticalOutline
} from 'ionicons/icons';
import { isNumber } from 'lodash';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
@ -129,7 +129,7 @@ export class GfAccountDetailDialogComponent implements OnDestroy, OnInit {
}
});
addIcons({ cashOutline, swapVerticalOutline, walletOutline });
addIcons({ albumsOutline, cashOutline, swapVerticalOutline });
}
public ngOnInit() {

2
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html

@ -98,7 +98,7 @@
>
<mat-tab>
<ng-template mat-tab-label>
<ion-icon name="wallet-outline" />
<ion-icon name="albums-outline" />
<div class="d-none d-sm-block ml-2" i18n>Holdings</div>
</ng-template>
<gf-holdings-table

27
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts

@ -430,7 +430,10 @@ export class GfAdminMarketDataComponent
.subscribe((user) => {
this.user = user;
const dialogRef = this.dialog.open(GfAssetProfileDialogComponent, {
const dialogRef = this.dialog.open<
GfAssetProfileDialogComponent,
AssetProfileDialogParams
>(GfAssetProfileDialogComponent, {
autoFocus: false,
data: {
dataSource,
@ -438,7 +441,7 @@ export class GfAdminMarketDataComponent
colorScheme: this.user?.settings.colorScheme,
deviceType: this.deviceType,
locale: this.user?.settings?.locale
} as AssetProfileDialogParams,
},
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
@ -465,17 +468,17 @@ export class GfAdminMarketDataComponent
.subscribe((user) => {
this.user = user;
const dialogRef = this.dialog.open(
const dialogRef = this.dialog.open<
GfCreateAssetProfileDialogComponent,
{
autoFocus: false,
data: {
deviceType: this.deviceType,
locale: this.user?.settings?.locale
} as CreateAssetProfileDialogParams,
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
}
);
CreateAssetProfileDialogParams
>(GfCreateAssetProfileDialogComponent, {
autoFocus: false,
data: {
deviceType: this.deviceType,
locale: this.user?.settings?.locale
},
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
dialogRef
.afterClosed()

62
apps/client/src/app/components/admin-platform/admin-platform.component.ts

@ -34,6 +34,7 @@ import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject, takeUntil } from 'rxjs';
import { GfCreateOrUpdatePlatformDialogComponent } from './create-or-update-platform-dialog/create-or-update-platform-dialog.component';
import { CreateOrUpdatePlatformDialogParams } from './create-or-update-platform-dialog/interfaces/interfaces';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@ -153,19 +154,20 @@ export class GfAdminPlatformComponent implements OnInit, OnDestroy {
}
private openCreatePlatformDialog() {
const dialogRef = this.dialog.open(
const dialogRef = this.dialog.open<
GfCreateOrUpdatePlatformDialogComponent,
{
data: {
platform: {
name: null,
url: null
}
},
height: this.deviceType === 'mobile' ? '98vh' : undefined,
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
}
);
CreateOrUpdatePlatformDialogParams
>(GfCreateOrUpdatePlatformDialogComponent, {
data: {
platform: {
id: null,
name: null,
url: null
}
},
height: this.deviceType === 'mobile' ? '98vh' : undefined,
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
dialogRef
.afterClosed()
@ -191,21 +193,29 @@ export class GfAdminPlatformComponent implements OnInit, OnDestroy {
});
}
private openUpdatePlatformDialog({ id, name, url }) {
const dialogRef = this.dialog.open(
private openUpdatePlatformDialog({
id,
name,
url
}: {
id: string;
name: string;
url: string;
}) {
const dialogRef = this.dialog.open<
GfCreateOrUpdatePlatformDialogComponent,
{
data: {
platform: {
id,
name,
url
}
},
height: this.deviceType === 'mobile' ? '98vh' : undefined,
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
}
);
CreateOrUpdatePlatformDialogParams
>(GfCreateOrUpdatePlatformDialogComponent, {
data: {
platform: {
id,
name,
url
}
},
height: this.deviceType === 'mobile' ? '98vh' : undefined,
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
dialogRef
.afterClosed()

14
apps/client/src/app/components/admin-tag/admin-tag.component.ts

@ -32,6 +32,7 @@ import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject, takeUntil } from 'rxjs';
import { GfCreateOrUpdateTagDialogComponent } from './create-or-update-tag-dialog/create-or-update-tag-dialog.component';
import { CreateOrUpdateTagDialogParams } from './create-or-update-tag-dialog/interfaces/interfaces';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@ -149,9 +150,13 @@ export class GfAdminTagComponent implements OnInit, OnDestroy {
}
private openCreateTagDialog() {
const dialogRef = this.dialog.open(GfCreateOrUpdateTagDialogComponent, {
const dialogRef = this.dialog.open<
GfCreateOrUpdateTagDialogComponent,
CreateOrUpdateTagDialogParams
>(GfCreateOrUpdateTagDialogComponent, {
data: {
tag: {
id: null,
name: null
}
},
@ -183,8 +188,11 @@ export class GfAdminTagComponent implements OnInit, OnDestroy {
});
}
private openUpdateTagDialog({ id, name }) {
const dialogRef = this.dialog.open(GfCreateOrUpdateTagDialogComponent, {
private openUpdateTagDialog({ id, name }: { id: string; name: string }) {
const dialogRef = this.dialog.open<
GfCreateOrUpdateTagDialogComponent,
CreateOrUpdateTagDialogParams
>(GfCreateOrUpdateTagDialogComponent, {
data: {
tag: {
id,

2
apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/interfaces/interfaces.ts

@ -1,5 +1,5 @@
import { Tag } from '@prisma/client';
export interface CreateOrUpdateTagDialogParams {
tag: Tag;
tag: Pick<Tag, 'id' | 'name'>;
}

21
apps/client/src/app/components/admin-users/admin-users.component.ts

@ -5,7 +5,11 @@ import {
getDateFormatString,
getEmojiFlag
} from '@ghostfolio/common/helper';
import { AdminUsers, InfoItem, User } from '@ghostfolio/common/interfaces';
import {
AdminUsersResponse,
InfoItem,
User
} from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { GfValueComponent } from '@ghostfolio/ui/value';
@ -75,7 +79,7 @@ import { GfUserDetailDialogComponent } from '../user-detail-dialog/user-detail-d
export class GfAdminUsersComponent implements OnDestroy, OnInit {
@ViewChild(MatPaginator) paginator: MatPaginator;
public dataSource = new MatTableDataSource<AdminUsers['users'][0]>();
public dataSource = new MatTableDataSource<AdminUsersResponse['users'][0]>();
public defaultDateFormat: string;
public deviceType: string;
public displayedColumns: string[] = [];
@ -278,9 +282,9 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
});
}
private openUserDetailDialog(userId: string) {
private openUserDetailDialog(aUserId: string) {
const userData = this.dataSource.data.find(({ id }) => {
return id === userId;
return id === aUserId;
});
if (!userData) {
@ -288,13 +292,17 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
return;
}
const dialogRef = this.dialog.open(GfUserDetailDialogComponent, {
const dialogRef = this.dialog.open<
GfUserDetailDialogComponent,
UserDetailDialogParams
>(GfUserDetailDialogComponent, {
autoFocus: false,
data: {
userData,
deviceType: this.deviceType,
hasPermissionForSubscription: this.hasPermissionForSubscription,
locale: this.user?.settings?.locale
} as UserDetailDialogParams,
},
height: this.deviceType === 'mobile' ? '98vh' : '60vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
@ -303,7 +311,6 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
.afterClosed()
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(() => {
this.fetchUsers();
this.router.navigate(['.'], { relativeTo: this.route });
});
}

6
apps/client/src/app/components/header/header.component.ts

@ -1,4 +1,5 @@
import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto';
import { LoginWithAccessTokenDialogParams } from '@ghostfolio/client/components/login-with-access-token-dialog/interfaces/interfaces';
import { GfLoginWithAccessTokenDialogComponent } from '@ghostfolio/client/components/login-with-access-token-dialog/login-with-access-token-dialog.component';
import { LayoutService } from '@ghostfolio/client/core/layout.service';
import { NotificationService } from '@ghostfolio/client/core/notification/notification.service';
@ -271,7 +272,10 @@ export class GfHeaderComponent implements OnChanges {
}
public openLoginDialog() {
const dialogRef = this.dialog.open(GfLoginWithAccessTokenDialogComponent, {
const dialogRef = this.dialog.open<
GfLoginWithAccessTokenDialogComponent,
LoginWithAccessTokenDialogParams
>(GfLoginWithAccessTokenDialogComponent, {
autoFocus: false,
data: {
accessToken: '',

55
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts

@ -1,3 +1,4 @@
import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto';
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component';
import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component';
@ -38,7 +39,7 @@ import {
OnDestroy,
OnInit
} from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatChipsModule } from '@angular/material/chips';
import {
@ -57,6 +58,7 @@ import { isUUID } from 'class-validator';
import { format, isSameMonth, isToday, parseISO } from 'date-fns';
import { addIcons } from 'ionicons';
import {
arrowDownCircleOutline,
createOutline,
flagOutline,
readerOutline,
@ -92,6 +94,7 @@ import { HoldingDetailDialogParams } from './interfaces/interfaces';
MatFormFieldModule,
MatTabsModule,
NgxSkeletonLoaderModule,
ReactiveFormsModule,
RouterModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
@ -101,7 +104,6 @@ import { HoldingDetailDialogParams } from './interfaces/interfaces';
})
export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
public activitiesCount: number;
public activityForm: FormGroup;
public accounts: Account[];
public assetClass: string;
public assetSubClass: string;
@ -122,6 +124,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
public hasPermissionToCreateOwnTag: boolean;
public hasPermissionToReadMarketDataOfOwnAssetProfile: boolean;
public historicalDataItems: LineChartItem[];
public holdingForm: FormGroup;
public investmentInBaseCurrencyWithCurrencyEffect: number;
public investmentInBaseCurrencyWithCurrencyEffectPrecision = 2;
public isUUID = isUUID;
@ -167,6 +170,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
private userService: UserService
) {
addIcons({
arrowDownCircleOutline,
createOutline,
flagOutline,
readerOutline,
@ -177,16 +181,16 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
}
public ngOnInit() {
this.activityForm = this.formBuilder.group({
tags: [] as string[]
});
const filters: Filter[] = [
{ id: this.data.dataSource, type: 'DATA_SOURCE' },
{ id: this.data.symbol, type: 'SYMBOL' }
];
this.activityForm
this.holdingForm = this.formBuilder.group({
tags: [] as string[]
});
this.holdingForm
.get('tags')
.valueChanges.pipe(takeUntil(this.unsubscribeSubject))
.subscribe((tags: Tag[]) => {
@ -427,7 +431,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
};
});
this.activityForm.setValue({ tags: this.tags }, { emitEvent: false });
this.holdingForm.setValue({ tags: this.tags }, { emitEvent: false });
this.value = value;
@ -557,6 +561,37 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
this.dialogRef.close();
}
public onCloseHolding() {
const today = new Date();
const activity: CreateOrderDto = {
accountId: this.accounts.length === 1 ? this.accounts[0].id : null,
comment: null,
currency: this.SymbolProfile.currency,
dataSource: this.SymbolProfile.dataSource,
date: today.toISOString(),
fee: 0,
quantity: this.quantity,
symbol: this.SymbolProfile.symbol,
tags: this.tags.map(({ id }) => {
return id;
}),
type: 'SELL',
unitPrice: this.marketPrice
};
this.dataService
.postOrder(activity)
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(() => {
this.router.navigate(
internalRoutes.portfolio.subRoutes.activities.routerLink
);
this.dialogRef.close();
});
}
public onExport() {
const activityIds = this.dataSource.data.map(({ id }) => {
return id;
@ -583,10 +618,6 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
}
}
public onTagsChanged(tags: Tag[]) {
this.activityForm.get('tags').setValue(tags);
}
public onUpdateActivity(aActivity: Activity) {
this.router.navigate(
internalRoutes.portfolio.subRoutes.activities.routerLink,

48
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html

@ -411,13 +411,14 @@
}
</mat-tab-group>
<gf-tags-selector
[hasPermissionToCreateTag]="hasPermissionToCreateOwnTag"
[readonly]="!data.hasPermissionToUpdateOrder"
[tags]="activityForm.get('tags')?.value"
[tagsAvailable]="tagsAvailable"
(tagsChanged)="onTagsChanged($event)"
/>
<form [formGroup]="holdingForm">
<gf-tags-selector
formControlName="tags"
[hasPermissionToCreateTag]="hasPermissionToCreateOwnTag"
[readonly]="!data.hasPermissionToUpdateOrder"
[tagsAvailable]="tagsAvailable"
/>
</form>
@if (
data.hasPermissionToAccessAdminControl ||
@ -428,6 +429,29 @@
<div class="row">
<div class="col">
<div class="button-container d-flex flex-wrap">
@if (data.hasPermissionToCreateActivity && quantity > 0) {
<button
color="warn"
mat-stroked-button
(click)="onCloseHolding()"
>
<ion-icon
class="mr-1"
name="arrow-down-circle-outline"
></ion-icon
><span i18n>Close Holding</span>
</button>
}
@if (
dataSource?.data.length > 0 &&
data.hasPermissionToReportDataGlitch === true
) {
<a color="warn" mat-stroked-button [href]="reportDataGlitchMail"
><ion-icon class="mr-1" name="flag-outline" /><span i18n
>Report Data Glitch</span
>...</a
>
}
@if (data.hasPermissionToAccessAdminControl) {
<a
mat-stroked-button
@ -443,16 +467,6 @@
>...</a
>
}
@if (
dataSource?.data.length > 0 &&
data.hasPermissionToReportDataGlitch === true
) {
<a color="warn" mat-stroked-button [href]="reportDataGlitchMail"
><ion-icon class="mr-1" name="flag-outline" /><span i18n
>Report Data Glitch</span
>...</a
>
}
</div>
</div>
</div>

20
apps/client/src/app/components/home-watchlist/home-watchlist.component.ts

@ -149,17 +149,17 @@ export class GfHomeWatchlistComponent implements OnDestroy, OnInit {
.subscribe((user) => {
this.user = user;
const dialogRef = this.dialog.open(
const dialogRef = this.dialog.open<
GfCreateWatchlistItemDialogComponent,
{
autoFocus: false,
data: {
deviceType: this.deviceType,
locale: this.user?.settings?.locale
} as CreateWatchlistItemDialogParams,
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
}
);
CreateWatchlistItemDialogParams
>(GfCreateWatchlistItemDialogComponent, {
autoFocus: false,
data: {
deviceType: this.deviceType,
locale: this.user?.settings?.locale
},
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
dialogRef
.afterClosed()

5
apps/client/src/app/components/login-with-access-token-dialog/interfaces/interfaces.ts

@ -0,0 +1,5 @@
export interface LoginWithAccessTokenDialogParams {
accessToken: string;
hasPermissionToUseSocialLogin: boolean;
title: string;
}

22
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.component.ts

@ -1,10 +1,8 @@
import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component';
import { InternetIdentityService } from '@ghostfolio/client/services/internet-identity.service';
import {
KEY_STAY_SIGNED_IN,
SettingsStorageService
} from '@ghostfolio/client/services/settings-storage.service';
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
@ -21,11 +19,12 @@ import {
} from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { Router } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { eyeOffOutline, eyeOutline } from 'ionicons/icons';
import { LoginWithAccessTokenDialogParams } from './interfaces/interfaces';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
@ -51,12 +50,9 @@ export class GfLoginWithAccessTokenDialogComponent {
public isAccessTokenHidden = true;
public constructor(
@Inject(MAT_DIALOG_DATA) public data: any,
@Inject(MAT_DIALOG_DATA) public data: LoginWithAccessTokenDialogParams,
public dialogRef: MatDialogRef<GfLoginWithAccessTokenDialogComponent>,
private internetIdentityService: InternetIdentityService,
private router: Router,
private settingsStorageService: SettingsStorageService,
private tokenStorageService: TokenStorageService
private settingsStorageService: SettingsStorageService
) {
addIcons({ eyeOffOutline, eyeOutline });
}
@ -79,14 +75,4 @@ export class GfLoginWithAccessTokenDialogComponent {
});
}
}
public async onLoginWithInternetIdentity() {
try {
const { authToken } = await this.internetIdentityService.login();
this.tokenStorageService.saveToken(authToken);
this.dialogRef.close();
this.router.navigate(['/']);
} catch {}
}
}

11
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html

@ -26,17 +26,6 @@
@if (data.hasPermissionToUseSocialLogin) {
<div class="my-3 text-center text-muted" i18n>or</div>
<div class="d-flex flex-column">
<button
class="mb-2 px-4 rounded-pill"
mat-stroked-button
(click)="onLoginWithInternetIdentity()"
>
<img
class="mr-2"
src="../assets/icons/internet-computer.svg"
style="height: 0.75rem"
/><span i18n>Sign in with Internet Identity</span>
</button>
<a
class="px-4 rounded-pill"
href="../api/v1/auth/google"

9
apps/client/src/app/components/rule/rule.component.ts

@ -51,6 +51,7 @@ export class GfRuleComponent implements OnInit {
@Input() categoryName: string;
@Input() hasPermissionToUpdateUserSettings: boolean;
@Input() isLoading: boolean;
@Input() locale: string;
@Input() rule: PortfolioReportRule;
@Input() settings: XRayRulesSettings['AccountClusterRiskCurrentInvestment'];
@ -78,12 +79,16 @@ export class GfRuleComponent implements OnInit {
}
public onCustomizeRule(rule: PortfolioReportRule) {
const dialogRef = this.dialog.open(GfRuleSettingsDialogComponent, {
const dialogRef = this.dialog.open<
GfRuleSettingsDialogComponent,
RuleSettingsDialogParams
>(GfRuleSettingsDialogComponent, {
data: {
rule,
categoryName: this.categoryName,
locale: this.locale,
settings: this.settings
} as RuleSettingsDialogParams,
},
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});

1
apps/client/src/app/components/rules/rules.component.html

@ -12,6 +12,7 @@
[hasPermissionToUpdateUserSettings]="
hasPermissionToUpdateUserSettings
"
[locale]="locale"
[rule]="rule"
[settings]="settings?.[rule.key]"
(ruleUpdated)="onRuleUpdated($event)"

1
apps/client/src/app/components/rules/rules.component.ts

@ -26,6 +26,7 @@ export class GfRulesComponent {
@Input() categoryName: string;
@Input() hasPermissionToUpdateUserSettings: boolean;
@Input() isLoading: boolean;
@Input() locale: string;
@Input() rules: PortfolioReportRule[];
@Input() settings: XRayRulesSettings;

15
apps/client/src/app/components/user-account-access/user-account-access.component.ts

@ -31,6 +31,7 @@ import { EMPTY, Subject } from 'rxjs';
import { catchError, takeUntil } from 'rxjs/operators';
import { GfCreateOrUpdateAccessDialogComponent } from './create-or-update-access-dialog/create-or-update-access-dialog.component';
import { CreateOrUpdateAccessDialogParams } from './create-or-update-access-dialog/interfaces/interfaces';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@ -187,10 +188,15 @@ export class GfUserAccountAccessComponent implements OnDestroy, OnInit {
}
private openCreateAccessDialog() {
const dialogRef = this.dialog.open(GfCreateOrUpdateAccessDialogComponent, {
const dialogRef = this.dialog.open<
GfCreateOrUpdateAccessDialogComponent,
CreateOrUpdateAccessDialogParams
>(GfCreateOrUpdateAccessDialogComponent, {
data: {
access: {
alias: '',
grantee: null,
id: null,
permissions: ['READ_RESTRICTED'],
type: 'PRIVATE'
}
@ -219,12 +225,15 @@ export class GfUserAccountAccessComponent implements OnDestroy, OnInit {
return;
}
const dialogRef = this.dialog.open(GfCreateOrUpdateAccessDialogComponent, {
const dialogRef = this.dialog.open<
GfCreateOrUpdateAccessDialogComponent,
CreateOrUpdateAccessDialogParams
>(GfCreateOrUpdateAccessDialogComponent, {
data: {
access: {
alias: access.alias,
id: access.id,
grantee: access.grantee === 'Public' ? null : access.grantee,
id: access.id,
permissions: access.permissions,
type: access.type
}

5
apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts

@ -1,7 +1,8 @@
import { AdminUsers } from '@ghostfolio/common/interfaces';
import { AdminUsersResponse } from '@ghostfolio/common/interfaces';
export interface UserDetailDialogParams {
deviceType: string;
hasPermissionForSubscription: boolean;
locale: string;
userData: AdminUsers['users'][0];
userData: AdminUsersResponse['users'][0];
}

73
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html

@ -8,9 +8,9 @@
<div class="container p-0">
<div class="mb-3 row">
<div class="col-6 mb-3">
<gf-value i18n size="medium" [value]="data.userData.id"
>User ID</gf-value
>
<gf-value i18n size="medium" [value]="data.userData.id">
User ID
</gf-value>
</div>
<div class="col-6 mb-3">
<gf-value
@ -19,10 +19,75 @@
[isDate]="true"
[locale]="data.locale"
[value]="data.userData.createdAt"
>Registration Date</gf-value
>
Registration Date
</gf-value>
</div>
</div>
<div class="mb-3 row">
<div class="col-6 mb-3">
<gf-value i18n size="medium" [value]="data.userData.role">
Role
</gf-value>
</div>
@if (data.hasPermissionForSubscription) {
<div class="col-6 mb-3">
<gf-value i18n size="medium" [value]="data.userData.country">
Country
</gf-value>
</div>
}
</div>
<div class="mb-3 row">
<div class="col-6 mb-3">
<gf-value
i18n
size="medium"
[locale]="data.locale"
[value]="data.userData.accountCount"
>
Accounts
</gf-value>
</div>
<div class="col-6 mb-3">
<gf-value
i18n
size="medium"
[locale]="data.locale"
[value]="data.userData.activityCount"
>
Activities
</gf-value>
</div>
</div>
@if (data.hasPermissionForSubscription) {
<div class="mb-3 row">
<div class="col-6 mb-3">
<gf-value
i18n
size="medium"
[locale]="data.locale"
[precision]="0"
[value]="data.userData.engagement"
>
Engagement per Day
</gf-value>
</div>
<div class="col-6 mb-3">
<gf-value
i18n
size="medium"
[locale]="data.locale"
[value]="data.userData.dailyApiRequests"
>
API Requests Today
</gf-value>
</div>
</div>
}
</div>
</div>

2
apps/client/src/app/core/module-preload.service.ts

@ -7,7 +7,7 @@ export class ModulePreloadService implements PreloadingStrategy {
/**
* Preloads all lazy loading modules with the attribute 'preload' set to true
*/
preload(route: Route, load: Function): Observable<any> {
preload<T>(route: Route, load: () => Observable<T>): Observable<T | null> {
return route.data?.preload ? load() : of(null);
}
}

26
apps/client/src/app/pages/about/overview/about-overview-page.html

@ -175,7 +175,7 @@
</div>
</div>
<div class="row">
<div class="mb-5 row">
<div
class="col-md-6 col-xs-12 my-2"
[ngClass]="{ 'offset-md-3': hasPermissionForSubscription === false }"
@ -201,4 +201,28 @@
</div>
}
</div>
@if (user?.subscription?.type !== 'Premium') {
<div class="row">
<div class="col-12">
<h2 class="h4 mb-3">Sponsors</h2>
<div class="text-center">
<small>Browser testing via</small>
<br />
<a
href="https://www.lambdatest.com?utm_medium=sponsor&utm_source=ghostfolio"
target="_blank"
title="LambdaTest - AI Powered Testing Tool"
>
<img
alt="LambdaTest Logo"
height="45"
src="../assets/images/sponsors/logo-lambdatest.png"
width="250"
/>
</a>
</div>
</div>
</div>
}
</div>

25
apps/client/src/app/pages/accounts/accounts-page.component.ts

@ -23,6 +23,8 @@ import { EMPTY, Subject, Subscription } from 'rxjs';
import { catchError, takeUntil } from 'rxjs/operators';
import { GfCreateOrUpdateAccountDialogComponent } from './create-or-update-account-dialog/create-or-update-account-dialog.component';
import { CreateOrUpdateAccountDialogParams } from './create-or-update-account-dialog/interfaces/interfaces';
import { TransferBalanceDialogParams } from './transfer-balance/interfaces/interfaces';
import { GfTransferBalanceDialogComponent } from './transfer-balance/transfer-balance-dialog.component';
@Component({
@ -179,7 +181,10 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
name,
platformId
}: AccountModel) {
const dialogRef = this.dialog.open(GfCreateOrUpdateAccountDialogComponent, {
const dialogRef = this.dialog.open<
GfCreateOrUpdateAccountDialogComponent,
CreateOrUpdateAccountDialogParams
>(GfCreateOrUpdateAccountDialogComponent, {
data: {
account: {
balance,
@ -227,7 +232,10 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
}
private openAccountDetailDialog(aAccountId: string) {
const dialogRef = this.dialog.open(GfAccountDetailDialogComponent, {
const dialogRef = this.dialog.open<
GfAccountDetailDialogComponent,
AccountDetailDialogParams
>(GfAccountDetailDialogComponent, {
autoFocus: false,
data: {
accountId: aAccountId,
@ -237,7 +245,7 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
!this.hasImpersonationId &&
hasPermission(this.user?.permissions, permissions.createOrder) &&
!this.user?.settings?.isRestrictedView
} as AccountDetailDialogParams,
},
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
@ -253,12 +261,16 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
}
private openCreateAccountDialog() {
const dialogRef = this.dialog.open(GfCreateOrUpdateAccountDialogComponent, {
const dialogRef = this.dialog.open<
GfCreateOrUpdateAccountDialogComponent,
CreateOrUpdateAccountDialogParams
>(GfCreateOrUpdateAccountDialogComponent, {
data: {
account: {
balance: 0,
comment: null,
currency: this.user?.settings?.baseCurrency,
id: null,
isExcluded: false,
name: null,
platformId: null
@ -295,7 +307,10 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
}
private openTransferBalanceDialog() {
const dialogRef = this.dialog.open(GfTransferBalanceDialogComponent, {
const dialogRef = this.dialog.open<
GfTransferBalanceDialogComponent,
TransferBalanceDialogParams
>(GfTransferBalanceDialogComponent, {
data: {
accounts: this.accounts
},

2
apps/client/src/app/pages/accounts/create-or-update-account-dialog/interfaces/interfaces.ts

@ -1,5 +1,5 @@
import { Account } from '@prisma/client';
export interface CreateOrUpdateAccountDialogParams {
account: Account;
account: Omit<Account, 'createdAt' | 'updatedAt' | 'userId'>;
}

10
apps/client/src/app/pages/home/home-page.component.ts

@ -16,11 +16,11 @@ import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import {
albumsOutline,
analyticsOutline,
bookmarkOutline,
newspaperOutline,
readerOutline,
walletOutline
readerOutline
} from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject } from 'rxjs';
@ -61,7 +61,7 @@ export class GfHomePageComponent implements OnDestroy, OnInit {
routerLink: internalRoutes.home.routerLink
},
{
iconName: 'wallet-outline',
iconName: 'albums-outline',
label: internalRoutes.home.subRoutes.holdings.title,
routerLink: internalRoutes.home.subRoutes.holdings.routerLink
},
@ -97,11 +97,11 @@ export class GfHomePageComponent implements OnDestroy, OnInit {
});
addIcons({
albumsOutline,
analyticsOutline,
bookmarkOutline,
newspaperOutline,
readerOutline,
walletOutline
readerOutline
});
}

73
apps/client/src/app/pages/portfolio/activities/activities-page.component.ts

@ -28,6 +28,7 @@ import { Subject, Subscription } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { GfCreateOrUpdateActivityDialogComponent } from './create-or-update-activity-dialog/create-or-update-activity-dialog.component';
import { CreateOrUpdateActivityDialogParams } from './create-or-update-activity-dialog/interfaces/interfaces';
import { GfImportActivitiesDialogComponent } from './import-activities-dialog/import-activities-dialog.component';
import { ImportActivitiesDialogParams } from './import-activities-dialog/interfaces/interfaces';
@ -245,11 +246,14 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
}
public onImport() {
const dialogRef = this.dialog.open(GfImportActivitiesDialogComponent, {
const dialogRef = this.dialog.open<
GfImportActivitiesDialogComponent,
ImportActivitiesDialogParams
>(GfImportActivitiesDialogComponent, {
data: {
deviceType: this.deviceType,
user: this.user
} as ImportActivitiesDialogParams,
},
height: this.deviceType === 'mobile' ? '98vh' : undefined,
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
@ -268,12 +272,15 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
}
public onImportDividends() {
const dialogRef = this.dialog.open(GfImportActivitiesDialogComponent, {
const dialogRef = this.dialog.open<
GfImportActivitiesDialogComponent,
ImportActivitiesDialogParams
>(GfImportActivitiesDialogComponent, {
data: {
activityTypes: ['DIVIDEND'],
deviceType: this.deviceType,
user: this.user
} as ImportActivitiesDialogParams,
},
height: this.deviceType === 'mobile' ? '98vh' : undefined,
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
@ -306,18 +313,18 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
}
public openUpdateActivityDialog(aActivity: Activity) {
const dialogRef = this.dialog.open(
const dialogRef = this.dialog.open<
GfCreateOrUpdateActivityDialogComponent,
{
data: {
activity: aActivity,
accounts: this.user?.accounts,
user: this.user
},
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
}
);
CreateOrUpdateActivityDialogParams
>(GfCreateOrUpdateActivityDialogComponent, {
data: {
activity: aActivity,
accounts: this.user?.accounts,
user: this.user
},
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
dialogRef
.afterClosed()
@ -350,26 +357,26 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
.subscribe((user) => {
this.updateUser(user);
const dialogRef = this.dialog.open(
const dialogRef = this.dialog.open<
GfCreateOrUpdateActivityDialogComponent,
{
data: {
accounts: this.user?.accounts,
activity: {
...aActivity,
accountId: aActivity?.accountId,
date: new Date(),
id: null,
fee: 0,
type: aActivity?.type ?? 'BUY',
unitPrice: null
},
user: this.user
CreateOrUpdateActivityDialogParams
>(GfCreateOrUpdateActivityDialogComponent, {
data: {
accounts: this.user?.accounts,
activity: {
...aActivity,
accountId: aActivity?.accountId,
date: new Date(),
id: null,
fee: 0,
type: aActivity?.type ?? 'BUY',
unitPrice: null
},
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
}
);
user: this.user
},
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
dialogRef
.afterClosed()

1
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts

@ -4,7 +4,6 @@ import { User } from '@ghostfolio/common/interfaces';
import { Account } from '@prisma/client';
export interface CreateOrUpdateActivityDialogParams {
accountId: string;
accounts: Account[];
activity: Activity;
user: User;

2
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/interfaces/interfaces.ts

@ -3,7 +3,7 @@ import { User } from '@ghostfolio/common/interfaces';
import { Type } from '@prisma/client';
export interface ImportActivitiesDialogParams {
activityTypes: Type[];
activityTypes?: Type[];
deviceType: string;
user: User;
}

7
apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts

@ -558,7 +558,10 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
}
private openAccountDetailDialog(aAccountId: string) {
const dialogRef = this.dialog.open(GfAccountDetailDialogComponent, {
const dialogRef = this.dialog.open<
GfAccountDetailDialogComponent,
AccountDetailDialogParams
>(GfAccountDetailDialogComponent, {
autoFocus: false,
data: {
accountId: aAccountId,
@ -568,7 +571,7 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
!this.hasImpersonationId &&
hasPermission(this.user?.permissions, permissions.createOrder) &&
!this.user?.settings?.isRestrictedView
} as AccountDetailDialogParams,
},
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});

14
apps/client/src/app/pages/portfolio/fire/fire-page.scss

@ -1,9 +1,21 @@
@use '../../../../styles/variables.scss' as variables;
@mixin select-arrow($color) {
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' fill='#{$color}' height='6' width='10'><polygon points='0,0 10,0 5,6'/></svg>");
}
:host {
display: block;
.safe-withdrawal-rate-select {
@include select-arrow(variables.$dark-primary-text);
appearance: none;
background-color: transparent;
background-position: right 0 center;
background-repeat: no-repeat;
color: rgb(var(--dark-primary-text));
padding: 0 0.75rem 0 0.25rem;
&:focus {
box-shadow: none;
@ -14,6 +26,8 @@
:host-context(.theme-dark) {
.safe-withdrawal-rate-select {
@include select-arrow(variables.$light-primary-text);
color: rgb(var(--light-primary-text));
}
}

2
apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html

@ -76,6 +76,7 @@
!hasImpersonationId && hasPermissionToUpdateUserSettings
"
[isLoading]="isLoading"
[locale]="user?.settings?.locale"
[rules]="category.rules"
[settings]="user?.settings?.xRayRules"
(rulesUpdated)="onRulesUpdated($event)"
@ -90,6 +91,7 @@
!hasImpersonationId && hasPermissionToUpdateUserSettings
"
[isLoading]="isLoading"
[locale]="user?.settings?.locale"
[rules]="inactiveRules"
[settings]="user?.settings?.xRayRules"
(rulesUpdated)="onRulesUpdated($event)"

34
apps/client/src/app/pages/register/register-page.component.ts

@ -1,5 +1,4 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { InternetIdentityService } from '@ghostfolio/client/services/internet-identity.service';
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { InfoItem, LineChartItem } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
@ -43,7 +42,6 @@ export class GfRegisterPageComponent implements OnDestroy, OnInit {
private dataService: DataService,
private deviceService: DeviceDetectorService,
private dialog: MatDialog,
private internetIdentityService: InternetIdentityService,
private router: Router,
private tokenStorageService: TokenStorageService
) {
@ -73,29 +71,19 @@ export class GfRegisterPageComponent implements OnDestroy, OnInit {
);
}
public async onLoginWithInternetIdentity() {
try {
const { authToken } = await this.internetIdentityService.login();
this.tokenStorageService.saveToken(authToken);
await this.router.navigate(['/']);
} catch {}
}
public openShowAccessTokenDialog() {
const dialogRef = this.dialog.open(
const dialogRef = this.dialog.open<
GfUserAccountRegistrationDialogComponent,
{
data: {
deviceType: this.deviceType,
needsToAcceptTermsOfService: this.hasPermissionForSubscription
} as UserAccountRegistrationDialogParams,
disableClose: true,
height: this.deviceType === 'mobile' ? '98vh' : undefined,
width: this.deviceType === 'mobile' ? '100vw' : '30rem'
}
);
UserAccountRegistrationDialogParams
>(GfUserAccountRegistrationDialogComponent, {
data: {
deviceType: this.deviceType,
needsToAcceptTermsOfService: this.hasPermissionForSubscription
},
disableClose: true,
height: this.deviceType === 'mobile' ? '98vh' : undefined,
width: this.deviceType === 'mobile' ? '100vw' : '30rem'
});
dialogRef
.afterClosed()

14
apps/client/src/app/pages/register/register-page.html

@ -28,20 +28,6 @@
</button>
@if (hasPermissionForSocialLogin) {
<div class="my-3 text-muted" i18n>or</div>
@if (false) {
<button
class="d-block mb-2 px-4 rounded-pill"
mat-stroked-button
(click)="onLoginWithInternetIdentity()"
>
<img
class="mr-2"
src="../assets/icons/internet-computer.svg"
style="height: 0.75rem"
/>
<span i18n>Continue with Internet Identity</span>
</button>
}
<a
class="px-4 rounded-pill w-100"
href="../api/v1/auth/google"

18
apps/client/src/app/pages/resources/glossary/resources-glossary.component.html

@ -5,7 +5,7 @@
<div>
<div class="mb-4 media">
<div class="media-body">
<h3 class="h5 mt-0">Buy and Hold</h3>
<h2 class="h5 mb-1 mt-0">Buy and Hold</h2>
<div class="mb-1">
Buy and hold is a passive investment strategy where you buy assets
and hold them for a long period regardless of fluctuations in the
@ -22,7 +22,7 @@
</div>
<div class="mb-4 media">
<div class="media-body">
<h3 class="h5 mt-0">Deflation</h3>
<h2 class="h5 mb-1 mt-0">Deflation</h2>
<div class="mb-1">
Deflation is a decrease of the general price level for goods and
services in an economy over a period of time.
@ -38,7 +38,7 @@
</div>
<div class="mb-4 media">
<div class="media-body">
<h3 class="h5 mt-0">Dollar-Cost Averaging (DCA)</h3>
<h2 class="h5 mb-1 mt-0">Dollar-Cost Averaging (DCA)</h2>
<div class="mb-1">
Dollar-cost averaging is an investment strategy where you split
the total amount to be invested across periodic purchases of a
@ -56,7 +56,7 @@
</div>
<div class="mb-4 media">
<div class="media-body">
<h3 class="h5 mt-0">Financial Independence</h3>
<h2 class="h5 mb-1 mt-0">Financial Independence</h2>
<div class="mb-1">
Financial independence is the status of having enough income, for
example with a passive income like dividends, to cover your living
@ -73,7 +73,7 @@
</div>
<div class="mb-4 media">
<div class="media-body">
<h3 class="h5 mt-0">FIRE</h3>
<h2 class="h5 mb-1 mt-0">FIRE</h2>
<div class="mb-1">
FIRE is a movement that promotes saving and investing to achieve
financial independence and early retirement.
@ -85,7 +85,7 @@
</div>
<div class="mb-4 media">
<div class="media-body">
<h3 class="h5 mt-0">Inflation</h3>
<h2 class="h5 mb-1 mt-0">Inflation</h2>
<div class="mb-1">
Inflation is an increase of the general price level for goods and
services in an economy over a period of time.
@ -102,7 +102,7 @@
@if (hasPermissionForSubscription) {
<div class="mb-4 media">
<div class="media-body">
<h3 class="h5 mt-0">Personal Finance Tools</h3>
<h2 class="h5 mb-1 mt-0">Personal Finance Tools</h2>
<div class="mb-1">
Personal finance tools are software applications that help
manage your money, track expenses, set budgets, monitor
@ -118,7 +118,7 @@
}
<div class="mb-4 media">
<div class="media-body">
<h3 class="h5 mt-0">Stagflation</h3>
<h2 class="h5 mb-1 mt-0">Stagflation</h2>
<div class="mb-1">
Stagflation describes a situation in which there is a stagnant
economy with high unemployment and high inflation.
@ -134,7 +134,7 @@
</div>
<div class="mb-4 media">
<div class="media-body">
<h3 class="h5 mt-0">Stealth Wealth</h3>
<h2 class="h5 mb-1 mt-0">Stealth Wealth</h2>
<div class="mb-1">
Stealth wealth is a lifestyle choice where you don’t openly show
off your wealth, but instead live quietly to maintain privacy and

4
apps/client/src/app/pages/resources/guides/resources-guides.component.html

@ -5,7 +5,7 @@
<div class="mb-5">
<div class="mb-4 media">
<div class="media-body">
<h3 class="h5 mt-0">Boringly Getting Rich</h3>
<h2 class="h5 mb-1 mt-0">Boringly Getting Rich</h2>
<div class="mb-1">
The <i>Boringly Getting Rich</i> guide supports you to get started
with investing. It introduces a strategy utilizing a broadly
@ -21,7 +21,7 @@
</div>
<div class="mb-4 media">
<div class="media-body">
<h3 class="h5 mt-0">How do I get my finances in order?</h3>
<h2 class="h5 mb-1 mt-0">How do I get my finances in order?</h2>
<div class="mb-1">
Before you can think of long-term investing, you have to get your
finances in order. Learn how you can reach your financial goals

8
apps/client/src/app/pages/resources/markets/resources-markets.component.html

@ -3,7 +3,7 @@
<div class="mb-5">
<div class="mb-4 media">
<div class="media-body">
<h3 class="h5 mt-0">Crypto Coins Heatmap</h3>
<h2 class="h5 mb-1 mt-0">Crypto Coins Heatmap</h2>
<div class="mb-1">
With the <i>Crypto Coins Heatmap</i> you can track the daily market
movements of cryptocurrencies as a visual snapshot.
@ -17,7 +17,7 @@
</div>
<div class="mb-4 media">
<div class="media-body">
<h3 class="h5 mt-0">Fear & Greed Index</h3>
<h2 class="h5 mb-1 mt-0">Fear & Greed Index</h2>
<div class="mb-1">
The fear and greed index was developed by <i>CNNMoney</i> to measure
the primary emotions (fear and greed) that influence how much
@ -32,7 +32,7 @@
</div>
<div class="media">
<div class="mb-4 media">
<h3 class="h5 mt-0">Inflation Chart</h3>
<h2 class="h5 mb-1 mt-0">Inflation Chart</h2>
<div class="mb-1">
<i>Inflation Chart</i> helps you find the intrinsic value of stock
markets, stock prices, goods and services by adjusting them to the
@ -48,7 +48,7 @@
</div>
<div class="media">
<div class="media-body">
<h3 class="h5 mt-0">Stock Heatmap</h3>
<h2 class="h5 mb-1 mt-0">Stock Heatmap</h2>
<div class="mb-1">
With the <i>Stock Heatmap</i> you can track the daily market movements
of stocks as a visual snapshot.

2
apps/client/src/app/pages/resources/overview/resources-overview.component.html

@ -5,7 +5,7 @@
<div class="overview-list">
@for (item of overviewItems; track item) {
<div class="mb-4">
<h3 class="h5 mt-0">{{ item.title }}</h3>
<h2 class="h5 mb-1 mt-0">{{ item.title }}</h2>
<p class="mb-1">{{ item.description }}</p>
<a [routerLink]="item.routerLink">Explore {{ item.title }} →</a>
</div>

6
apps/client/src/app/pages/zen/zen-page.component.ts

@ -8,7 +8,7 @@ import { MatTabsModule } from '@angular/material/tabs';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { analyticsOutline, walletOutline } from 'ionicons/icons';
import { albumsOutline, analyticsOutline } from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
@ -43,7 +43,7 @@ export class GfZenPageComponent implements OnDestroy, OnInit {
routerLink: internalRoutes.zen.routerLink
},
{
iconName: 'wallet-outline',
iconName: 'albums-outline',
label: internalRoutes.zen.subRoutes.holdings.title,
routerLink: internalRoutes.zen.subRoutes.holdings.routerLink
}
@ -54,7 +54,7 @@ export class GfZenPageComponent implements OnDestroy, OnInit {
}
});
addIcons({ analyticsOutline, walletOutline });
addIcons({ albumsOutline, analyticsOutline });
}
public ngOnInit() {

4
apps/client/src/app/services/admin.service.ts

@ -12,7 +12,7 @@ import {
AdminData,
AdminJobs,
AdminMarketData,
AdminUsers,
AdminUsersResponse,
DataProviderGhostfolioStatusResponse,
EnhancedSymbolProfile,
Filter
@ -154,7 +154,7 @@ export class AdminService {
params = params.append('skip', skip);
params = params.append('take', take);
return this.http.get<AdminUsers>('/api/v1/admin/user', { params });
return this.http.get<AdminUsersResponse>('/api/v1/admin/user', { params });
}
public gather7Days() {

56
apps/client/src/app/services/internet-identity.service.ts

@ -1,56 +0,0 @@
import { OAuthResponse } from '@ghostfolio/common/interfaces';
import { HttpClient } from '@angular/common/http';
import { Injectable, OnDestroy } from '@angular/core';
import { AuthClient } from '@dfinity/auth-client';
import { EMPTY, Subject } from 'rxjs';
import { catchError, takeUntil } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class InternetIdentityService implements OnDestroy {
private unsubscribeSubject = new Subject<void>();
public constructor(private http: HttpClient) {}
public async login(): Promise<OAuthResponse> {
const authClient = await AuthClient.create({
idleOptions: {
disableDefaultIdleCallback: true,
disableIdle: true
}
});
return new Promise((resolve, reject) => {
authClient.login({
onError: async () => {
return reject();
},
onSuccess: () => {
const principalId = authClient.getIdentity().getPrincipal();
this.http
.post<OAuthResponse>(`/api/v1/auth/internet-identity`, {
principalId: principalId.toText()
})
.pipe(
catchError(() => {
reject();
return EMPTY;
}),
takeUntil(this.unsubscribeSubject)
)
.subscribe((response) => {
resolve(response);
});
}
});
});
}
public ngOnDestroy() {
this.unsubscribeSubject.next();
this.unsubscribeSubject.complete();
}
}

22
apps/client/src/app/services/user/user.service.ts

@ -116,18 +116,18 @@ export class UserService extends ObservableStore<UserStoreState> {
permissions.enableSubscriptionInterstitial
)
) {
const dialogRef = this.dialog.open(
const dialogRef = this.dialog.open<
GfSubscriptionInterstitialDialogComponent,
{
autoFocus: false,
data: {
user
} as SubscriptionInterstitialDialogParams,
disableClose: true,
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
}
);
SubscriptionInterstitialDialogParams
>(GfSubscriptionInterstitialDialogComponent, {
autoFocus: false,
data: {
user
},
disableClose: true,
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
dialogRef
.afterClosed()

28
apps/client/src/assets/icons/internet-computer.svg

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 358.8 179.8" style="enable-background:new 0 0 358.8 179.8;" xml:space="preserve">
<style type="text/css">
.st0{fill:url(#SVGID_1_);}
.st1{fill:url(#SVGID_2_);}
.st2{fill-rule:evenodd;clip-rule:evenodd;fill:#29ABE2;}
</style>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="224.7853" y1="257.7536" x2="348.0663" y2="133.4581" gradientTransform="matrix(1 0 0 -1 0 272)">
<stop offset="0.21" style="stop-color:#F15A24"/>
<stop offset="0.6841" style="stop-color:#FBB03B"/>
</linearGradient>
<path class="st0" d="M271.6,0c-20,0-41.9,10.9-65,32.4c-10.9,10.1-20.5,21.1-27.5,29.8c0,0,11.2,12.9,23.5,26.8
c6.7-8.4,16.2-19.8,27.3-30.1c20.5-19.2,33.9-23.1,41.6-23.1c28.8,0,52.2,24.2,52.2,54.1c0,29.6-23.4,53.8-52.2,54.1
c-1.4,0-3-0.2-5-0.6c8.4,3.9,17.5,6.7,26,6.7c52.8,0,63.2-36.5,63.8-39.1c1.5-6.7,2.4-13.7,2.4-20.9C358.6,40.4,319.6,0,271.6,0z"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="133.9461" y1="106.4262" x2="10.6653" y2="230.7215" gradientTransform="matrix(1 0 0 -1 0 272)">
<stop offset="0.21" style="stop-color:#ED1E79"/>
<stop offset="0.8929" style="stop-color:#522785"/>
</linearGradient>
<path class="st1" d="M87.1,179.8c20,0,41.9-10.9,65-32.4c10.9-10.1,20.5-21.1,27.5-29.8c0,0-11.2-12.9-23.5-26.8
c-6.7,8.4-16.2,19.8-27.3,30.1c-20.5,19-34,23.1-41.6,23.1c-28.8,0-52.2-24.2-52.2-54.1c0-29.6,23.4-53.8,52.2-54.1
c1.4,0,3,0.2,5,0.6c-8.4-3.9-17.5-6.7-26-6.7C13.4,29.6,3,66.1,2.4,68.8C0.9,75.5,0,82.5,0,89.7C0,139.4,39,179.8,87.1,179.8z"/>
<path class="st2" d="M127.3,59.7c-5.8-5.6-34-28.5-61-29.3C18.1,29.2,4,64.2,2.7,68.7C12,29.5,46.4,0.2,87.2,0
c33.3,0,67,32.7,91.9,62.2c0,0,0.1-0.1,0.1-0.1c0,0,11.2,12.9,23.5,26.8c0,0,14,16.5,28.8,31c5.8,5.6,33.9,28.2,60.9,29
c49.5,1.4,63.2-35.6,63.9-38.4c-9.1,39.5-43.6,68.9-84.6,69.1c-33.3,0-67-32.7-92-62.2c0,0.1-0.1,0.1-0.1,0.2
c0,0-11.2-12.9-23.5-26.8C156.2,90.8,142.2,74.2,127.3,59.7z M2.7,69.1c0-0.1,0-0.2,0.1-0.3C2.7,68.9,2.7,69,2.7,69.1z"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

BIN
apps/client/src/assets/images/sponsors/logo-lambdatest.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

12
apps/client/src/assets/oss-friends.json

@ -1,5 +1,5 @@
{
"createdAt": "2025-09-17T00:00:00.000Z",
"createdAt": "2025-10-31T00:00:00.000Z",
"data": [
{
"name": "Activepieces",
@ -16,6 +16,11 @@
"description": "Argos provides the developer tools to debug tests and detect visual regressions.",
"href": "https://argos-ci.com"
},
{
"name": "Bifrost",
"description": "Fastest LLM gateway with adaptive load balancer, cluster mode, guardrails, 1000+ models support & <100 µs overhead at 5k RPS.",
"href": "https://www.getmaxim.ai/bifrost"
},
{
"name": "Cal.com",
"description": "Cal.com is a scheduling tool that helps you schedule meetings without the back-and-forth emails.",
@ -56,11 +61,6 @@
"description": "Inbox Zero makes it easy to clean up your inbox and reach inbox zero fast. It provides bulk newsletter unsubscribe, cold email blocking, email analytics, and AI automations.",
"href": "https://getinboxzero.com"
},
{
"name": "Infisical",
"description": "Open source, end-to-end encrypted platform that lets you securely manage secrets and configs across your team, devices, and infrastructure.",
"href": "https://infisical.com"
},
{
"name": "KeepHQ",
"description": "Keep is an open-source AIOps (AI for IT operations) platform",

114
apps/client/src/locales/messages.ca.xlf

@ -38,7 +38,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">283</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -603,7 +603,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">443</context>
<context context-type="linenumber">451</context>
</context-group>
</trans-unit>
<trans-unit id="7022070615528435141" datatype="html">
@ -639,7 +639,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">470</context>
<context context-type="linenumber">478</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
@ -1366,6 +1366,14 @@
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="8119836022359386797" datatype="html">
<source>Activities</source>
<target state="new">Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="5487499696517396535" datatype="html">
<source>Add Platform</source>
<target state="translated">Afegeix Plataforma</target>
@ -1379,7 +1387,7 @@
<target state="translated">Està segur que vol eliminar aquesta plataforma?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.ts</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="774722884061553775" datatype="html">
@ -1443,7 +1451,7 @@
<target state="translated">Està segur que vol eliminar aquesta etiqueta?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-tag/admin-tag.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3653624484380347431" datatype="html">
@ -1651,11 +1659,11 @@
<target state="translated">Oooh! El testimoni de seguretat és incorrecte.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">298</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">153</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
@ -1739,7 +1747,7 @@
<target state="translated">Informar d’un Problema amb les Dades</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">452</context>
<context context-type="linenumber">450</context>
</context-group>
</trans-unit>
<trans-unit id="8204176479746810612" datatype="html">
@ -2409,10 +2417,6 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">252</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="5369707274411995821" datatype="html">
<source>Granted Access</source>
@ -2891,7 +2895,7 @@
<target state="translated">Vaja, la transferència del saldo en efectiu ha fallat.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.component.ts</context>
<context context-type="linenumber">324</context>
<context context-type="linenumber">339</context>
</context-group>
</trans-unit>
<trans-unit id="4154970040744792968" datatype="html">
@ -4451,6 +4455,14 @@
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
<source>Close Holding</source>
<target state="new">Close Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">441</context>
</context-group>
</trans-unit>
<trans-unit id="1605678350626749943" datatype="html">
<source>Absolute Asset Performance</source>
<target state="translated">Rendiment absolut dels actius</target>
@ -5112,6 +5124,14 @@
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="1434671461968858301" datatype="html">
<source>User ID</source>
<target state="new">User ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="1154843799824106777" datatype="html">
<source>Free Plan</source>
<target state="translated">Pla gratuït</target>
@ -5305,7 +5325,7 @@
<target state="translated">Clonar</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">449</context>
<context context-type="linenumber">457</context>
</context-group>
</trans-unit>
<trans-unit id="4631493229601603593" datatype="html">
@ -5313,7 +5333,7 @@
<target state="translated">Exporta l’esborrany com a ICS</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">459</context>
<context context-type="linenumber">467</context>
</context-group>
</trans-unit>
<trans-unit id="4239552960465242484" datatype="html">
@ -5321,7 +5341,7 @@
<target state="translated">De veritat vols suprimir aquestes activitats?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">270</context>
<context context-type="linenumber">276</context>
</context-group>
</trans-unit>
<trans-unit id="670983159637074283" datatype="html">
@ -5329,7 +5349,7 @@
<target state="translated">Realment vols suprimir aquesta activitat?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">286</context>
</context-group>
</trans-unit>
<trans-unit id="3105754554141014845" datatype="html">
@ -6408,6 +6428,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
<source>View Holding</source>
<target state="new">View Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">444</context>
</context-group>
</trans-unit>
<trans-unit id="3486679398271885916" datatype="html">
<source>Canada</source>
<target state="new">Canada</target>
@ -6565,7 +6593,7 @@
<target state="new">Inactive</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="2159130950882492111" datatype="html">
@ -6668,6 +6696,14 @@
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="2803298218425845065" datatype="html">
<source>Role</source>
<target state="new">Role</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="2807800733729323332" datatype="html">
<source>Yes</source>
<target state="new">Yes</target>
@ -6679,6 +6715,10 @@
<trans-unit id="6574710269679413520" datatype="html">
<source>Accounts</source>
<target state="new">Accounts</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.html</context>
<context context-type="linenumber">84</context>
@ -6972,6 +7012,14 @@
<context context-type="linenumber">293</context>
</context-group>
</trans-unit>
<trans-unit id="7417020438124538834" datatype="html">
<source>Engagement per Day</source>
<target state="new">Engagement per Day</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">76</context>
</context-group>
</trans-unit>
<trans-unit id="7423212324650924366" datatype="html">
<source>Guides</source>
<target state="new">Guides</target>
@ -7110,6 +7158,14 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="8514765519764380399" datatype="html">
<source>Country</source>
<target state="new">Country</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="8517109745758603034" datatype="html">
<source>API Key</source>
<target state="new">API Key</target>
@ -7199,7 +7255,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="1769610706135259386" datatype="html">
@ -7258,6 +7314,14 @@
<context context-type="linenumber">234</context>
</context-group>
</trans-unit>
<trans-unit id="8214324091109908102" datatype="html">
<source>API Requests Today</source>
<target state="new">API Requests Today</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
<source>Default Market Price</source>
<target state="new">Default Market Price</target>
@ -7455,7 +7519,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">169</context>
<context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="6751986162338860240" datatype="html">
@ -8072,7 +8136,7 @@
<target state="new">Do you really want to generate a new security token?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="5193539160604294602" datatype="html">
@ -8128,7 +8192,7 @@
<target state="new">Manage Asset Profile</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">442</context>
<context context-type="linenumber">465</context>
</context-group>
</trans-unit>
<trans-unit id="2978009302056542263" datatype="html">
@ -8152,7 +8216,7 @@
<target state="new">Average Unit Price</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">113</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
@ -8543,12 +8607,12 @@
<context context-type="linenumber">128</context>
</context-group>
</trans-unit>
<trans-unit id="339860602695747533" datatype="html">
<trans-unit id="889243574476657449" datatype="html">
<source>Registration Date</source>
<target state="new">Registration Date</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="5162138648470294706" datatype="html">

114
apps/client/src/locales/messages.de.xlf

@ -242,7 +242,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">443</context>
<context context-type="linenumber">451</context>
</context-group>
</trans-unit>
<trans-unit id="7022070615528435141" datatype="html">
@ -278,7 +278,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">470</context>
<context context-type="linenumber">478</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
@ -633,6 +633,14 @@
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="8119836022359386797" datatype="html">
<source>Activities</source>
<target state="translated">Aktivitäten</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="2817099043823177227" datatype="html">
<source>Do you really want to delete this user?</source>
<target state="translated">Möchtest du diesen Benutzer wirklich löschen?</target>
@ -710,7 +718,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">283</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -730,11 +738,11 @@
<target state="translated">Ups! Falsches Sicherheits-Token.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">298</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">153</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
@ -982,7 +990,7 @@
<target state="translated">Datenfehler melden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">452</context>
<context context-type="linenumber">450</context>
</context-group>
</trans-unit>
<trans-unit id="8927080808898221200" datatype="html">
@ -1280,10 +1288,6 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">252</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="5369707274411995821" datatype="html">
<source>Granted Access</source>
@ -2238,7 +2242,7 @@
<target state="translated">Kopieren</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">449</context>
<context context-type="linenumber">457</context>
</context-group>
</trans-unit>
<trans-unit id="4631493229601603593" datatype="html">
@ -2246,7 +2250,7 @@
<target state="translated">Geplante Aktivität als ICS exportieren</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">459</context>
<context context-type="linenumber">467</context>
</context-group>
</trans-unit>
<trans-unit id="670983159637074283" datatype="html">
@ -2254,7 +2258,7 @@
<target state="translated">Möchtest du diese Aktivität wirklich löschen?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">286</context>
</context-group>
</trans-unit>
<trans-unit id="5425547984857378790" datatype="html">
@ -3746,7 +3750,7 @@
<target state="translated">Möchtest du diese Aktivitäten wirklich löschen?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">270</context>
<context context-type="linenumber">276</context>
</context-group>
</trans-unit>
<trans-unit id="7462039419171681274" datatype="html">
@ -3806,7 +3810,7 @@
<target state="translated">Möchtest du diese Plattform wirklich löschen?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.ts</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="7966917302907632321" datatype="html">
@ -4313,6 +4317,14 @@
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="1434671461968858301" datatype="html">
<source>User ID</source>
<target state="translated">Benutzer ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="1154843799824106777" datatype="html">
<source>Free Plan</source>
<target state="translated">Kostenlose Nutzung</target>
@ -5364,7 +5376,7 @@
<target state="translated">Möchtest du diesen Tag wirklich löschen?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-tag/admin-tag.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3653624484380347431" datatype="html">
@ -5556,7 +5568,7 @@
<target state="translated">Ups, der Cash-Bestand Transfer ist fehlgeschlagen.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.component.ts</context>
<context context-type="linenumber">324</context>
<context context-type="linenumber">339</context>
</context-group>
</trans-unit>
<trans-unit id="1189482335778578193" datatype="html">
@ -5771,6 +5783,14 @@
<context context-type="linenumber">364</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
<source>Close Holding</source>
<target state="translated">Position abschliessen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">441</context>
</context-group>
</trans-unit>
<trans-unit id="1605678350626749943" datatype="html">
<source>Absolute Asset Performance</source>
<target state="translated">Absolute Anlage Performance</target>
@ -6432,6 +6452,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
<source>View Holding</source>
<target state="translated">Position ansehen</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">444</context>
</context-group>
</trans-unit>
<trans-unit id="3486679398271885916" datatype="html">
<source>Canada</source>
<target state="translated">Kanada</target>
@ -6589,7 +6617,7 @@
<target state="translated">Inaktiv</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="2159130950882492111" datatype="html">
@ -6692,6 +6720,14 @@
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="2803298218425845065" datatype="html">
<source>Role</source>
<target state="translated">Rolle</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="2807800733729323332" datatype="html">
<source>Yes</source>
<target state="translated">Ja</target>
@ -6703,6 +6739,10 @@
<trans-unit id="6574710269679413520" datatype="html">
<source>Accounts</source>
<target state="translated">Konten</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.html</context>
<context context-type="linenumber">84</context>
@ -6996,6 +7036,14 @@
<context context-type="linenumber">293</context>
</context-group>
</trans-unit>
<trans-unit id="7417020438124538834" datatype="html">
<source>Engagement per Day</source>
<target state="translated">Engagement pro Tag</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">76</context>
</context-group>
</trans-unit>
<trans-unit id="7423212324650924366" datatype="html">
<source>Guides</source>
<target state="translated">Ratgeber</target>
@ -7134,6 +7182,14 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="8514765519764380399" datatype="html">
<source>Country</source>
<target state="translated">Land</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="8517109745758603034" datatype="html">
<source>API Key</source>
<target state="translated">API-Schlüssel</target>
@ -7223,7 +7279,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="1769610706135259386" datatype="html">
@ -7282,6 +7338,14 @@
<context context-type="linenumber">234</context>
</context-group>
</trans-unit>
<trans-unit id="8214324091109908102" datatype="html">
<source>API Requests Today</source>
<target state="translated">Heutige API Anfragen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
<source>Default Market Price</source>
<target state="translated">Standardmarktpreis</target>
@ -7479,7 +7543,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">169</context>
<context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="6751986162338860240" datatype="html">
@ -8072,7 +8136,7 @@
<target state="translated">Möchtest du wirklich ein neues Sicherheits-Token generieren?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="5193539160604294602" datatype="html">
@ -8128,7 +8192,7 @@
<target state="translated">Anlageprofil verwalten</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">442</context>
<context context-type="linenumber">465</context>
</context-group>
</trans-unit>
<trans-unit id="2978009302056542263" datatype="html">
@ -8152,7 +8216,7 @@
<target state="translated">Ø Preis pro Einheit</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">113</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
@ -8543,12 +8607,12 @@
<context context-type="linenumber">128</context>
</context-group>
</trans-unit>
<trans-unit id="339860602695747533" datatype="html">
<trans-unit id="889243574476657449" datatype="html">
<source>Registration Date</source>
<target state="translated">Registrierungsdatum</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="5162138648470294706" datatype="html">

114
apps/client/src/locales/messages.es.xlf

@ -243,7 +243,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">443</context>
<context context-type="linenumber">451</context>
</context-group>
</trans-unit>
<trans-unit id="7022070615528435141" datatype="html">
@ -279,7 +279,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">470</context>
<context context-type="linenumber">478</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
@ -618,6 +618,14 @@
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="8119836022359386797" datatype="html">
<source>Activities</source>
<target state="new">Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="2817099043823177227" datatype="html">
<source>Do you really want to delete this user?</source>
<target state="translated">¿Estás seguro de eliminar este usuario?</target>
@ -695,7 +703,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">283</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -715,11 +723,11 @@
<target state="translated">Vaya! Token de seguridad incorrecto.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">298</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">153</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
@ -967,7 +975,7 @@
<target state="translated">Reporta un anomalía de los datos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">452</context>
<context context-type="linenumber">450</context>
</context-group>
</trans-unit>
<trans-unit id="8927080808898221200" datatype="html">
@ -1265,10 +1273,6 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">252</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="5369707274411995821" datatype="html">
<source>Granted Access</source>
@ -2223,7 +2227,7 @@
<target state="translated">Clonar</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">449</context>
<context context-type="linenumber">457</context>
</context-group>
</trans-unit>
<trans-unit id="4631493229601603593" datatype="html">
@ -2231,7 +2235,7 @@
<target state="translated">Exportar borrador como ICS</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">459</context>
<context context-type="linenumber">467</context>
</context-group>
</trans-unit>
<trans-unit id="670983159637074283" datatype="html">
@ -2239,7 +2243,7 @@
<target state="translated">¿Estás seguro de eliminar esta operación?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">286</context>
</context-group>
</trans-unit>
<trans-unit id="5425547984857378790" datatype="html">
@ -3723,7 +3727,7 @@
<target state="translated">¿Realmente deseas eliminar estas actividades?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">270</context>
<context context-type="linenumber">276</context>
</context-group>
</trans-unit>
<trans-unit id="7462039419171681274" datatype="html">
@ -3783,7 +3787,7 @@
<target state="translated">¿Realmente deseas eliminar esta plataforma?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.ts</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="7966917302907632321" datatype="html">
@ -4290,6 +4294,14 @@
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="1434671461968858301" datatype="html">
<source>User ID</source>
<target state="new">User ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="1154843799824106777" datatype="html">
<source>Free Plan</source>
<target state="translated">Plan gratuito</target>
@ -5341,7 +5353,7 @@
<target state="translated">¿Realmente deseas eliminar esta etiqueta?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-tag/admin-tag.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3653624484380347431" datatype="html">
@ -5533,7 +5545,7 @@
<target state="translated">Oops, el saldo de efectivo no se ha transferido.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.component.ts</context>
<context context-type="linenumber">324</context>
<context context-type="linenumber">339</context>
</context-group>
</trans-unit>
<trans-unit id="1189482335778578193" datatype="html">
@ -5748,6 +5760,14 @@
<context context-type="linenumber">364</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
<source>Close Holding</source>
<target state="new">Close Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">441</context>
</context-group>
</trans-unit>
<trans-unit id="1605678350626749943" datatype="html">
<source>Absolute Asset Performance</source>
<target state="translated">Rendimiento absoluto de los activos</target>
@ -6409,6 +6429,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
<source>View Holding</source>
<target state="new">View Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">444</context>
</context-group>
</trans-unit>
<trans-unit id="3486679398271885916" datatype="html">
<source>Canada</source>
<target state="translated">Canadá</target>
@ -6566,7 +6594,7 @@
<target state="translated">Inactiva</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="2159130950882492111" datatype="html">
@ -6669,6 +6697,14 @@
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="2803298218425845065" datatype="html">
<source>Role</source>
<target state="new">Role</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="2807800733729323332" datatype="html">
<source>Yes</source>
<target state="translated">Sí</target>
@ -6680,6 +6716,10 @@
<trans-unit id="6574710269679413520" datatype="html">
<source>Accounts</source>
<target state="new">Accounts</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.html</context>
<context context-type="linenumber">84</context>
@ -6973,6 +7013,14 @@
<context context-type="linenumber">293</context>
</context-group>
</trans-unit>
<trans-unit id="7417020438124538834" datatype="html">
<source>Engagement per Day</source>
<target state="new">Engagement per Day</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">76</context>
</context-group>
</trans-unit>
<trans-unit id="7423212324650924366" datatype="html">
<source>Guides</source>
<target state="translated">Guías</target>
@ -7111,6 +7159,14 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="8514765519764380399" datatype="html">
<source>Country</source>
<target state="new">Country</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="8517109745758603034" datatype="html">
<source>API Key</source>
<target state="translated">Clave API</target>
@ -7200,7 +7256,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="1769610706135259386" datatype="html">
@ -7259,6 +7315,14 @@
<context context-type="linenumber">234</context>
</context-group>
</trans-unit>
<trans-unit id="8214324091109908102" datatype="html">
<source>API Requests Today</source>
<target state="new">API Requests Today</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
<source>Default Market Price</source>
<target state="translated">Precio de mercado por defecto</target>
@ -7456,7 +7520,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">169</context>
<context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="6751986162338860240" datatype="html">
@ -8073,7 +8137,7 @@
<target state="translated">¿Realmente deseas generar un nuevo token de seguridad?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="5193539160604294602" datatype="html">
@ -8129,7 +8193,7 @@
<target state="translated">Gestionar perfil de activo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">442</context>
<context context-type="linenumber">465</context>
</context-group>
</trans-unit>
<trans-unit id="2978009302056542263" datatype="html">
@ -8153,7 +8217,7 @@
<target state="translated">Precio medio por unidad</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">113</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
@ -8544,12 +8608,12 @@
<context context-type="linenumber">128</context>
</context-group>
</trans-unit>
<trans-unit id="339860602695747533" datatype="html">
<trans-unit id="889243574476657449" datatype="html">
<source>Registration Date</source>
<target state="new">Registration Date</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="5162138648470294706" datatype="html">

114
apps/client/src/locales/messages.fr.xlf

@ -298,7 +298,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">443</context>
<context context-type="linenumber">451</context>
</context-group>
</trans-unit>
<trans-unit id="7022070615528435141" datatype="html">
@ -334,7 +334,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">470</context>
<context context-type="linenumber">478</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
@ -825,6 +825,14 @@
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="8119836022359386797" datatype="html">
<source>Activities</source>
<target state="new">Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="2817099043823177227" datatype="html">
<source>Do you really want to delete this user?</source>
<target state="translated">Voulez-vous vraiment supprimer cet·te utilisateur·rice ?</target>
@ -942,7 +950,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">283</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -962,11 +970,11 @@
<target state="translated">Oups! Jeton de Sécurité Incorrect.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">298</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">153</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
@ -1254,7 +1262,7 @@
<target state="translated">Signaler une Erreur de Données</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">452</context>
<context context-type="linenumber">450</context>
</context-group>
</trans-unit>
<trans-unit id="6048892649018070225" datatype="html">
@ -1612,10 +1620,6 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">252</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="5369707274411995821" datatype="html">
<source>Granted Access</source>
@ -2698,7 +2702,7 @@
<target state="translated">Dupliquer</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">449</context>
<context context-type="linenumber">457</context>
</context-group>
</trans-unit>
<trans-unit id="4631493229601603593" datatype="html">
@ -2706,7 +2710,7 @@
<target state="translated">Exporter Brouillon sous ICS</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">459</context>
<context context-type="linenumber">467</context>
</context-group>
</trans-unit>
<trans-unit id="670983159637074283" datatype="html">
@ -2714,7 +2718,7 @@
<target state="translated">Voulez-vous vraiment supprimer cette activité ?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">286</context>
</context-group>
</trans-unit>
<trans-unit id="5425547984857378790" datatype="html">
@ -3722,7 +3726,7 @@
<target state="translated">Voulez-vous vraiment supprimer toutes vos activités ?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">270</context>
<context context-type="linenumber">276</context>
</context-group>
</trans-unit>
<trans-unit id="7462039419171681274" datatype="html">
@ -3782,7 +3786,7 @@
<target state="translated">Voulez-vous vraiment supprimer cette plateforme ?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.ts</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="7966917302907632321" datatype="html">
@ -4289,6 +4293,14 @@
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="1434671461968858301" datatype="html">
<source>User ID</source>
<target state="new">User ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="1154843799824106777" datatype="html">
<source>Free Plan</source>
<target state="translated">Plan gratuit</target>
@ -5340,7 +5352,7 @@
<target state="translated">Confirmez la suppression de ce tag ?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-tag/admin-tag.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3653624484380347431" datatype="html">
@ -5532,7 +5544,7 @@
<target state="translated">Oops, échec du transfert de la cash balance.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.component.ts</context>
<context context-type="linenumber">324</context>
<context context-type="linenumber">339</context>
</context-group>
</trans-unit>
<trans-unit id="1189482335778578193" datatype="html">
@ -5747,6 +5759,14 @@
<context context-type="linenumber">364</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
<source>Close Holding</source>
<target state="new">Close Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">441</context>
</context-group>
</trans-unit>
<trans-unit id="1605678350626749943" datatype="html">
<source>Absolute Asset Performance</source>
<target state="translated">Performance des Actifs en valeur absolue</target>
@ -6408,6 +6428,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
<source>View Holding</source>
<target state="new">View Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">444</context>
</context-group>
</trans-unit>
<trans-unit id="3486679398271885916" datatype="html">
<source>Canada</source>
<target state="translated">Canada</target>
@ -6565,7 +6593,7 @@
<target state="translated">Inactif</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="2159130950882492111" datatype="html">
@ -6668,6 +6696,14 @@
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="2803298218425845065" datatype="html">
<source>Role</source>
<target state="new">Role</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="2807800733729323332" datatype="html">
<source>Yes</source>
<target state="translated">Oui</target>
@ -6679,6 +6715,10 @@
<trans-unit id="6574710269679413520" datatype="html">
<source>Accounts</source>
<target state="new">Accounts</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.html</context>
<context context-type="linenumber">84</context>
@ -6972,6 +7012,14 @@
<context context-type="linenumber">293</context>
</context-group>
</trans-unit>
<trans-unit id="7417020438124538834" datatype="html">
<source>Engagement per Day</source>
<target state="new">Engagement per Day</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">76</context>
</context-group>
</trans-unit>
<trans-unit id="7423212324650924366" datatype="html">
<source>Guides</source>
<target state="translated">Guides</target>
@ -7110,6 +7158,14 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="8514765519764380399" datatype="html">
<source>Country</source>
<target state="new">Country</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="8517109745758603034" datatype="html">
<source>API Key</source>
<target state="translated">Clé API</target>
@ -7199,7 +7255,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="1769610706135259386" datatype="html">
@ -7258,6 +7314,14 @@
<context context-type="linenumber">234</context>
</context-group>
</trans-unit>
<trans-unit id="8214324091109908102" datatype="html">
<source>API Requests Today</source>
<target state="new">API Requests Today</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
<source>Default Market Price</source>
<target state="translated">Prix du marché par défaut</target>
@ -7455,7 +7519,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">169</context>
<context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="6751986162338860240" datatype="html">
@ -8072,7 +8136,7 @@
<target state="translated">Voulez-vous vraiment générer un nouveau jeton de sécurité?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="5193539160604294602" datatype="html">
@ -8128,7 +8192,7 @@
<target state="translated">Gérer le profil d’actif</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">442</context>
<context context-type="linenumber">465</context>
</context-group>
</trans-unit>
<trans-unit id="2978009302056542263" datatype="html">
@ -8152,7 +8216,7 @@
<target state="new">Average Unit Price</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">113</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
@ -8543,12 +8607,12 @@
<context context-type="linenumber">128</context>
</context-group>
</trans-unit>
<trans-unit id="339860602695747533" datatype="html">
<trans-unit id="889243574476657449" datatype="html">
<source>Registration Date</source>
<target state="new">Registration Date</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="5162138648470294706" datatype="html">

114
apps/client/src/locales/messages.it.xlf

@ -243,7 +243,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">443</context>
<context context-type="linenumber">451</context>
</context-group>
</trans-unit>
<trans-unit id="7022070615528435141" datatype="html">
@ -279,7 +279,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">470</context>
<context context-type="linenumber">478</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
@ -618,6 +618,14 @@
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="8119836022359386797" datatype="html">
<source>Activities</source>
<target state="new">Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="2817099043823177227" datatype="html">
<source>Do you really want to delete this user?</source>
<target state="translated">Vuoi davvero eliminare questo utente?</target>
@ -695,7 +703,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">283</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -715,11 +723,11 @@
<target state="translated">Ops! Token di sicurezza errato.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">298</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">153</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
@ -967,7 +975,7 @@
<target state="translated">Segnala un’anomalia dei dati</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">452</context>
<context context-type="linenumber">450</context>
</context-group>
</trans-unit>
<trans-unit id="8927080808898221200" datatype="html">
@ -1265,10 +1273,6 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">252</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="5369707274411995821" datatype="html">
<source>Granted Access</source>
@ -2223,7 +2227,7 @@
<target state="translated">Clona</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">449</context>
<context context-type="linenumber">457</context>
</context-group>
</trans-unit>
<trans-unit id="4631493229601603593" datatype="html">
@ -2231,7 +2235,7 @@
<target state="translated">Esporta la bozza come ICS</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">459</context>
<context context-type="linenumber">467</context>
</context-group>
</trans-unit>
<trans-unit id="670983159637074283" datatype="html">
@ -2239,7 +2243,7 @@
<target state="translated">Vuoi davvero eliminare questa attività?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">286</context>
</context-group>
</trans-unit>
<trans-unit id="5425547984857378790" datatype="html">
@ -3723,7 +3727,7 @@
<target state="translated">Vuoi davvero eliminare tutte le tue attività?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">270</context>
<context context-type="linenumber">276</context>
</context-group>
</trans-unit>
<trans-unit id="7462039419171681274" datatype="html">
@ -3783,7 +3787,7 @@
<target state="translated">Vuoi davvero eliminare questa piattaforma?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.ts</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="7966917302907632321" datatype="html">
@ -4290,6 +4294,14 @@
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="1434671461968858301" datatype="html">
<source>User ID</source>
<target state="new">User ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="1154843799824106777" datatype="html">
<source>Free Plan</source>
<target state="translated">Piano gratuito</target>
@ -5341,7 +5353,7 @@
<target state="translated">Sei sicuro di voler eliminare questo tag?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-tag/admin-tag.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3653624484380347431" datatype="html">
@ -5533,7 +5545,7 @@
<target state="translated">Ops, il trasferimento del saldo di cassa è fallito.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.component.ts</context>
<context context-type="linenumber">324</context>
<context context-type="linenumber">339</context>
</context-group>
</trans-unit>
<trans-unit id="1189482335778578193" datatype="html">
@ -5748,6 +5760,14 @@
<context context-type="linenumber">364</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
<source>Close Holding</source>
<target state="new">Close Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">441</context>
</context-group>
</trans-unit>
<trans-unit id="1605678350626749943" datatype="html">
<source>Absolute Asset Performance</source>
<target state="translated">Rendimento assoluto dell’Asset</target>
@ -6409,6 +6429,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
<source>View Holding</source>
<target state="new">View Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">444</context>
</context-group>
</trans-unit>
<trans-unit id="3486679398271885916" datatype="html">
<source>Canada</source>
<target state="translated">Canada</target>
@ -6566,7 +6594,7 @@
<target state="translated">Inattivo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="2159130950882492111" datatype="html">
@ -6669,6 +6697,14 @@
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="2803298218425845065" datatype="html">
<source>Role</source>
<target state="new">Role</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="2807800733729323332" datatype="html">
<source>Yes</source>
<target state="translated">Si</target>
@ -6680,6 +6716,10 @@
<trans-unit id="6574710269679413520" datatype="html">
<source>Accounts</source>
<target state="new">Accounts</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.html</context>
<context context-type="linenumber">84</context>
@ -6973,6 +7013,14 @@
<context context-type="linenumber">293</context>
</context-group>
</trans-unit>
<trans-unit id="7417020438124538834" datatype="html">
<source>Engagement per Day</source>
<target state="new">Engagement per Day</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">76</context>
</context-group>
</trans-unit>
<trans-unit id="7423212324650924366" datatype="html">
<source>Guides</source>
<target state="translated">Guide</target>
@ -7111,6 +7159,14 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="8514765519764380399" datatype="html">
<source>Country</source>
<target state="new">Country</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="8517109745758603034" datatype="html">
<source>API Key</source>
<target state="translated">API Key</target>
@ -7200,7 +7256,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="1769610706135259386" datatype="html">
@ -7259,6 +7315,14 @@
<context context-type="linenumber">234</context>
</context-group>
</trans-unit>
<trans-unit id="8214324091109908102" datatype="html">
<source>API Requests Today</source>
<target state="new">API Requests Today</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
<source>Default Market Price</source>
<target state="translated">Prezzo di mercato predefinito</target>
@ -7456,7 +7520,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">169</context>
<context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="6751986162338860240" datatype="html">
@ -8073,7 +8137,7 @@
<target state="translated">Vuoi davvero generare un nuovo token di sicurezza?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="5193539160604294602" datatype="html">
@ -8129,7 +8193,7 @@
<target state="translated">Gestisci profilo risorsa</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">442</context>
<context context-type="linenumber">465</context>
</context-group>
</trans-unit>
<trans-unit id="2978009302056542263" datatype="html">
@ -8153,7 +8217,7 @@
<target state="new">Average Unit Price</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">113</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
@ -8544,12 +8608,12 @@
<context context-type="linenumber">128</context>
</context-group>
</trans-unit>
<trans-unit id="339860602695747533" datatype="html">
<trans-unit id="889243574476657449" datatype="html">
<source>Registration Date</source>
<target state="new">Registration Date</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="5162138648470294706" datatype="html">

114
apps/client/src/locales/messages.nl.xlf

@ -242,7 +242,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">443</context>
<context context-type="linenumber">451</context>
</context-group>
</trans-unit>
<trans-unit id="7022070615528435141" datatype="html">
@ -278,7 +278,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">470</context>
<context context-type="linenumber">478</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
@ -617,6 +617,14 @@
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="8119836022359386797" datatype="html">
<source>Activities</source>
<target state="new">Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="2817099043823177227" datatype="html">
<source>Do you really want to delete this user?</source>
<target state="translated">Wilt je deze gebruiker echt verwijderen?</target>
@ -694,7 +702,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">283</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -714,11 +722,11 @@
<target state="translated">Oeps! Onjuiste beveiligingstoken.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">298</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">153</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
@ -966,7 +974,7 @@
<target state="translated">Gegevensstoring melden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">452</context>
<context context-type="linenumber">450</context>
</context-group>
</trans-unit>
<trans-unit id="8927080808898221200" datatype="html">
@ -1264,10 +1272,6 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">252</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="5369707274411995821" datatype="html">
<source>Granted Access</source>
@ -2222,7 +2226,7 @@
<target state="translated">Kloon</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">449</context>
<context context-type="linenumber">457</context>
</context-group>
</trans-unit>
<trans-unit id="4631493229601603593" datatype="html">
@ -2230,7 +2234,7 @@
<target state="translated">Concept exporteren als ICS</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">459</context>
<context context-type="linenumber">467</context>
</context-group>
</trans-unit>
<trans-unit id="670983159637074283" datatype="html">
@ -2238,7 +2242,7 @@
<target state="translated">Wil je deze activiteit echt verwijderen?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">286</context>
</context-group>
</trans-unit>
<trans-unit id="5425547984857378790" datatype="html">
@ -3722,7 +3726,7 @@
<target state="translated">Weet je zeker dat je alle activiteiten wilt verwijderen?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">270</context>
<context context-type="linenumber">276</context>
</context-group>
</trans-unit>
<trans-unit id="7462039419171681274" datatype="html">
@ -3782,7 +3786,7 @@
<target state="translated">Wil je dit platform echt verwijderen?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.ts</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="7966917302907632321" datatype="html">
@ -4289,6 +4293,14 @@
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="1434671461968858301" datatype="html">
<source>User ID</source>
<target state="new">User ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="1154843799824106777" datatype="html">
<source>Free Plan</source>
<target state="translated">Gratis abonnement</target>
@ -5340,7 +5352,7 @@
<target state="translated">Weet u zetker dat u dit label wilt verwijderen?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-tag/admin-tag.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3653624484380347431" datatype="html">
@ -5532,7 +5544,7 @@
<target state="translated">Oeps, geldoverdracht is mislukt.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.component.ts</context>
<context context-type="linenumber">324</context>
<context context-type="linenumber">339</context>
</context-group>
</trans-unit>
<trans-unit id="1189482335778578193" datatype="html">
@ -5747,6 +5759,14 @@
<context context-type="linenumber">364</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
<source>Close Holding</source>
<target state="new">Close Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">441</context>
</context-group>
</trans-unit>
<trans-unit id="1605678350626749943" datatype="html">
<source>Absolute Asset Performance</source>
<target state="translated">Absolute Activaprestaties</target>
@ -6408,6 +6428,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
<source>View Holding</source>
<target state="new">View Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">444</context>
</context-group>
</trans-unit>
<trans-unit id="3486679398271885916" datatype="html">
<source>Canada</source>
<target state="translated">Canada</target>
@ -6565,7 +6593,7 @@
<target state="translated">Inactief</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="2159130950882492111" datatype="html">
@ -6668,6 +6696,14 @@
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="2803298218425845065" datatype="html">
<source>Role</source>
<target state="new">Role</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="2807800733729323332" datatype="html">
<source>Yes</source>
<target state="translated">Ja</target>
@ -6679,6 +6715,10 @@
<trans-unit id="6574710269679413520" datatype="html">
<source>Accounts</source>
<target state="new">Accounts</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.html</context>
<context context-type="linenumber">84</context>
@ -6972,6 +7012,14 @@
<context context-type="linenumber">293</context>
</context-group>
</trans-unit>
<trans-unit id="7417020438124538834" datatype="html">
<source>Engagement per Day</source>
<target state="new">Engagement per Day</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">76</context>
</context-group>
</trans-unit>
<trans-unit id="7423212324650924366" datatype="html">
<source>Guides</source>
<target state="translated">Gidsen</target>
@ -7110,6 +7158,14 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="8514765519764380399" datatype="html">
<source>Country</source>
<target state="new">Country</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="8517109745758603034" datatype="html">
<source>API Key</source>
<target state="translated">API-sleutel</target>
@ -7199,7 +7255,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="1769610706135259386" datatype="html">
@ -7258,6 +7314,14 @@
<context context-type="linenumber">234</context>
</context-group>
</trans-unit>
<trans-unit id="8214324091109908102" datatype="html">
<source>API Requests Today</source>
<target state="new">API Requests Today</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
<source>Default Market Price</source>
<target state="translated">Standaard Marktprijs</target>
@ -7455,7 +7519,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">169</context>
<context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="6751986162338860240" datatype="html">
@ -8072,7 +8136,7 @@
<target state="translated">Wilt u echt een nieuwe securitytoken genereren?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="5193539160604294602" datatype="html">
@ -8128,7 +8192,7 @@
<target state="translated">Beheer activaprofiel</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">442</context>
<context context-type="linenumber">465</context>
</context-group>
</trans-unit>
<trans-unit id="2978009302056542263" datatype="html">
@ -8152,7 +8216,7 @@
<target state="translated">Gemiddelde eenheidsprijs</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">113</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
@ -8543,12 +8607,12 @@
<context context-type="linenumber">128</context>
</context-group>
</trans-unit>
<trans-unit id="339860602695747533" datatype="html">
<trans-unit id="889243574476657449" datatype="html">
<source>Registration Date</source>
<target state="new">Registration Date</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="5162138648470294706" datatype="html">

114
apps/client/src/locales/messages.pl.xlf

@ -519,7 +519,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">443</context>
<context context-type="linenumber">451</context>
</context-group>
</trans-unit>
<trans-unit id="7022070615528435141" datatype="html">
@ -555,7 +555,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">470</context>
<context context-type="linenumber">478</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
@ -1166,6 +1166,14 @@
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="8119836022359386797" datatype="html">
<source>Activities</source>
<target state="new">Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="5487499696517396535" datatype="html">
<source>Add Platform</source>
<target state="translated">Dodaj Platformę</target>
@ -1199,7 +1207,7 @@
<target state="translated">Czy naprawdę chcesz usunąć tę platformę?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.ts</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="774722884061553775" datatype="html">
@ -1263,7 +1271,7 @@
<target state="translated">Czy naprawdę chcesz usunąć ten tag?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-tag/admin-tag.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3653624484380347431" datatype="html">
@ -1431,7 +1439,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">283</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -1451,11 +1459,11 @@
<target state="translated">Ups! Nieprawidłowy token bezpieczeństwa.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">298</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">153</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
@ -1875,7 +1883,7 @@
<target state="translated">Zgłoś Błąd Danych</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">452</context>
<context context-type="linenumber">450</context>
</context-group>
</trans-unit>
<trans-unit id="5451369123952965511" datatype="html">
@ -2353,10 +2361,6 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">252</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="8604673556809626581" datatype="html">
<source>Export Data</source>
@ -2559,7 +2563,7 @@
<target state="translated">Ups, transfer salda nie powiódł się.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.component.ts</context>
<context context-type="linenumber">324</context>
<context context-type="linenumber">339</context>
</context-group>
</trans-unit>
<trans-unit id="4154970040744792968" datatype="html">
@ -3563,7 +3567,7 @@
<target state="translated">Czy na pewno chcesz usunąć te aktywności?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">270</context>
<context context-type="linenumber">276</context>
</context-group>
</trans-unit>
<trans-unit id="1111435290645444471" datatype="html">
@ -4643,6 +4647,14 @@
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="1434671461968858301" datatype="html">
<source>User ID</source>
<target state="new">User ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="1154843799824106777" datatype="html">
<source>Free Plan</source>
<target state="translated">Plan Darmowy</target>
@ -4832,7 +4844,7 @@
<target state="translated">Sklonuj</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">449</context>
<context context-type="linenumber">457</context>
</context-group>
</trans-unit>
<trans-unit id="4631493229601603593" datatype="html">
@ -4840,7 +4852,7 @@
<target state="translated">Eksportuj Wersję Roboczą jako ICS</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">459</context>
<context context-type="linenumber">467</context>
</context-group>
</trans-unit>
<trans-unit id="670983159637074283" datatype="html">
@ -4848,7 +4860,7 @@
<target state="translated">Czy na pewno chcesz usunąć tę działalność?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">286</context>
</context-group>
</trans-unit>
<trans-unit id="3060494754215793943" datatype="html">
@ -5747,6 +5759,14 @@
<context context-type="linenumber">364</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
<source>Close Holding</source>
<target state="new">Close Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">441</context>
</context-group>
</trans-unit>
<trans-unit id="1605678350626749943" datatype="html">
<source>Absolute Asset Performance</source>
<target state="translated">Łączny wynik aktywów</target>
@ -6408,6 +6428,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
<source>View Holding</source>
<target state="new">View Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">444</context>
</context-group>
</trans-unit>
<trans-unit id="3486679398271885916" datatype="html">
<source>Canada</source>
<target state="translated">Kanada</target>
@ -6565,7 +6593,7 @@
<target state="translated">Nieaktywny</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="2159130950882492111" datatype="html">
@ -6668,6 +6696,14 @@
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="2803298218425845065" datatype="html">
<source>Role</source>
<target state="new">Role</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="2807800733729323332" datatype="html">
<source>Yes</source>
<target state="translated">Tak</target>
@ -6679,6 +6715,10 @@
<trans-unit id="6574710269679413520" datatype="html">
<source>Accounts</source>
<target state="new">Accounts</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.html</context>
<context context-type="linenumber">84</context>
@ -6972,6 +7012,14 @@
<context context-type="linenumber">293</context>
</context-group>
</trans-unit>
<trans-unit id="7417020438124538834" datatype="html">
<source>Engagement per Day</source>
<target state="new">Engagement per Day</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">76</context>
</context-group>
</trans-unit>
<trans-unit id="7423212324650924366" datatype="html">
<source>Guides</source>
<target state="translated">Poradniki</target>
@ -7110,6 +7158,14 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="8514765519764380399" datatype="html">
<source>Country</source>
<target state="new">Country</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="8517109745758603034" datatype="html">
<source>API Key</source>
<target state="translated">Klucz API</target>
@ -7199,7 +7255,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="1769610706135259386" datatype="html">
@ -7258,6 +7314,14 @@
<context context-type="linenumber">234</context>
</context-group>
</trans-unit>
<trans-unit id="8214324091109908102" datatype="html">
<source>API Requests Today</source>
<target state="new">API Requests Today</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
<source>Default Market Price</source>
<target state="translated">Domyślna cena rynkowa</target>
@ -7455,7 +7519,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">169</context>
<context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="6751986162338860240" datatype="html">
@ -8072,7 +8136,7 @@
<target state="translated">Czy na pewno chcesz wygenerować nowy token bezpieczeństwa?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="5193539160604294602" datatype="html">
@ -8128,7 +8192,7 @@
<target state="translated">Zarządzaj profilem aktywów</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">442</context>
<context context-type="linenumber">465</context>
</context-group>
</trans-unit>
<trans-unit id="2978009302056542263" datatype="html">
@ -8152,7 +8216,7 @@
<target state="translated">Średnia cena jednostkowa</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">113</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
@ -8543,12 +8607,12 @@
<context context-type="linenumber">128</context>
</context-group>
</trans-unit>
<trans-unit id="339860602695747533" datatype="html">
<trans-unit id="889243574476657449" datatype="html">
<source>Registration Date</source>
<target state="new">Registration Date</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="5162138648470294706" datatype="html">

114
apps/client/src/locales/messages.pt.xlf

@ -298,7 +298,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">443</context>
<context context-type="linenumber">451</context>
</context-group>
</trans-unit>
<trans-unit id="7022070615528435141" datatype="html">
@ -334,7 +334,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">470</context>
<context context-type="linenumber">478</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
@ -697,6 +697,14 @@
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="8119836022359386797" datatype="html">
<source>Activities</source>
<target state="new">Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="2817099043823177227" datatype="html">
<source>Do you really want to delete this user?</source>
<target state="translated">Deseja realmente excluir este utilizador?</target>
@ -814,7 +822,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">283</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -834,11 +842,11 @@
<target state="translated">Oops! Token de Segurança Incorreto.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">298</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">153</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
@ -1214,7 +1222,7 @@
<target state="translated">Dados do Relatório com Problema</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">452</context>
<context context-type="linenumber">450</context>
</context-group>
</trans-unit>
<trans-unit id="8927080808898221200" datatype="html">
@ -1608,10 +1616,6 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">252</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="5369707274411995821" datatype="html">
<source>Granted Access</source>
@ -2598,7 +2602,7 @@
<target state="translated">Clonar</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">449</context>
<context context-type="linenumber">457</context>
</context-group>
</trans-unit>
<trans-unit id="4631493229601603593" datatype="html">
@ -2606,7 +2610,7 @@
<target state="translated">Exportar Rascunho como ICS</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">459</context>
<context context-type="linenumber">467</context>
</context-group>
</trans-unit>
<trans-unit id="670983159637074283" datatype="html">
@ -2614,7 +2618,7 @@
<target state="translated">Deseja realmente eliminar esta atividade?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">286</context>
</context-group>
</trans-unit>
<trans-unit id="5425547984857378790" datatype="html">
@ -3722,7 +3726,7 @@
<target state="translated">Deseja mesmo eliminar estas atividades?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">270</context>
<context context-type="linenumber">276</context>
</context-group>
</trans-unit>
<trans-unit id="7462039419171681274" datatype="html">
@ -3782,7 +3786,7 @@
<target state="translated">Deseja mesmo eliminar esta plataforma?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.ts</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="7966917302907632321" datatype="html">
@ -4289,6 +4293,14 @@
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="1434671461968858301" datatype="html">
<source>User ID</source>
<target state="new">User ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="1154843799824106777" datatype="html">
<source>Free Plan</source>
<target state="translated">Plano gratuito</target>
@ -5340,7 +5352,7 @@
<target state="translated">Você realmente deseja excluir esta tag?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-tag/admin-tag.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3653624484380347431" datatype="html">
@ -5532,7 +5544,7 @@
<target state="translated">Ops, a transferência do saldo em dinheiro falhou.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.component.ts</context>
<context context-type="linenumber">324</context>
<context context-type="linenumber">339</context>
</context-group>
</trans-unit>
<trans-unit id="1189482335778578193" datatype="html">
@ -5747,6 +5759,14 @@
<context context-type="linenumber">364</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
<source>Close Holding</source>
<target state="new">Close Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">441</context>
</context-group>
</trans-unit>
<trans-unit id="1605678350626749943" datatype="html">
<source>Absolute Asset Performance</source>
<target state="translated">Desempenho absoluto de ativos</target>
@ -6408,6 +6428,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
<source>View Holding</source>
<target state="new">View Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">444</context>
</context-group>
</trans-unit>
<trans-unit id="3486679398271885916" datatype="html">
<source>Canada</source>
<target state="translated">Canadá</target>
@ -6565,7 +6593,7 @@
<target state="translated">Inativo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="2159130950882492111" datatype="html">
@ -6668,6 +6696,14 @@
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="2803298218425845065" datatype="html">
<source>Role</source>
<target state="new">Role</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="2807800733729323332" datatype="html">
<source>Yes</source>
<target state="translated">Sim</target>
@ -6679,6 +6715,10 @@
<trans-unit id="6574710269679413520" datatype="html">
<source>Accounts</source>
<target state="new">Accounts</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.html</context>
<context context-type="linenumber">84</context>
@ -6972,6 +7012,14 @@
<context context-type="linenumber">293</context>
</context-group>
</trans-unit>
<trans-unit id="7417020438124538834" datatype="html">
<source>Engagement per Day</source>
<target state="new">Engagement per Day</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">76</context>
</context-group>
</trans-unit>
<trans-unit id="7423212324650924366" datatype="html">
<source>Guides</source>
<target state="translated">Guias</target>
@ -7110,6 +7158,14 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="8514765519764380399" datatype="html">
<source>Country</source>
<target state="new">Country</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="8517109745758603034" datatype="html">
<source>API Key</source>
<target state="translated">Chave de API</target>
@ -7199,7 +7255,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="1769610706135259386" datatype="html">
@ -7258,6 +7314,14 @@
<context context-type="linenumber">234</context>
</context-group>
</trans-unit>
<trans-unit id="8214324091109908102" datatype="html">
<source>API Requests Today</source>
<target state="new">API Requests Today</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
<source>Default Market Price</source>
<target state="translated">Preço de mercado padrão</target>
@ -7455,7 +7519,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">169</context>
<context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="6751986162338860240" datatype="html">
@ -8072,7 +8136,7 @@
<target state="new">Do you really want to generate a new security token?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="5193539160604294602" datatype="html">
@ -8128,7 +8192,7 @@
<target state="translated">Gerenciar perfil de ativos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">442</context>
<context context-type="linenumber">465</context>
</context-group>
</trans-unit>
<trans-unit id="2978009302056542263" datatype="html">
@ -8152,7 +8216,7 @@
<target state="translated">Preço médio unitário</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">113</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
@ -8543,12 +8607,12 @@
<context context-type="linenumber">128</context>
</context-group>
</trans-unit>
<trans-unit id="339860602695747533" datatype="html">
<trans-unit id="889243574476657449" datatype="html">
<source>Registration Date</source>
<target state="new">Registration Date</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="5162138648470294706" datatype="html">

114
apps/client/src/locales/messages.tr.xlf

@ -479,7 +479,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">443</context>
<context context-type="linenumber">451</context>
</context-group>
</trans-unit>
<trans-unit id="7022070615528435141" datatype="html">
@ -515,7 +515,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">470</context>
<context context-type="linenumber">478</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
@ -1078,6 +1078,14 @@
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="8119836022359386797" datatype="html">
<source>Activities</source>
<target state="new">Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="5487499696517396535" datatype="html">
<source>Add Platform</source>
<target state="translated">Platform Ekle</target>
@ -1111,7 +1119,7 @@
<target state="translated">Bu platformu silmeyi gerçekten istiyor musunuz?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.ts</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="774722884061553775" datatype="html">
@ -1287,7 +1295,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">283</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -1307,11 +1315,11 @@
<target state="translated">Hay Allah! Güvenlik anahtarı yanlış.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">298</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">153</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
@ -1731,7 +1739,7 @@
<target state="translated">Rapor Veri Sorunu</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">452</context>
<context context-type="linenumber">450</context>
</context-group>
</trans-unit>
<trans-unit id="5451369123952965511" datatype="html">
@ -3063,7 +3071,7 @@
<target state="translated">Tüm işlemlerinizi silmeyi gerçekten istiyor musunuz?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">270</context>
<context context-type="linenumber">276</context>
</context-group>
</trans-unit>
<trans-unit id="1111435290645444471" datatype="html">
@ -4131,6 +4139,14 @@
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="1434671461968858301" datatype="html">
<source>User ID</source>
<target state="new">User ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="1154843799824106777" datatype="html">
<source>Free Plan</source>
<target state="translated">Ücretsiz Plan</target>
@ -4470,10 +4486,6 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">252</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="8604673556809626581" datatype="html">
<source>Export Data</source>
@ -4552,7 +4564,7 @@
<target state="translated">Klonla</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">449</context>
<context context-type="linenumber">457</context>
</context-group>
</trans-unit>
<trans-unit id="4631493229601603593" datatype="html">
@ -4560,7 +4572,7 @@
<target state="translated">Taslakları ICS Olarak Dışa Aktar</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">459</context>
<context context-type="linenumber">467</context>
</context-group>
</trans-unit>
<trans-unit id="670983159637074283" datatype="html">
@ -4568,7 +4580,7 @@
<target state="translated">TBu işlemi silmeyi gerçekten istiyor musunuz?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">286</context>
</context-group>
</trans-unit>
<trans-unit id="5425547984857378790" datatype="html">
@ -5340,7 +5352,7 @@
<target state="translated">Bu etiketi silmeyi gerçekten istiyor musunuz?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-tag/admin-tag.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3653624484380347431" datatype="html">
@ -5532,7 +5544,7 @@
<target state="translated">Hay Allah, Nakit bakiyesi tranferi başarısız oldu.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.component.ts</context>
<context context-type="linenumber">324</context>
<context context-type="linenumber">339</context>
</context-group>
</trans-unit>
<trans-unit id="1189482335778578193" datatype="html">
@ -5747,6 +5759,14 @@
<context context-type="linenumber">364</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
<source>Close Holding</source>
<target state="new">Close Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">441</context>
</context-group>
</trans-unit>
<trans-unit id="1605678350626749943" datatype="html">
<source>Absolute Asset Performance</source>
<target state="translated">Mutlak Varlık Performansı</target>
@ -6408,6 +6428,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
<source>View Holding</source>
<target state="new">View Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">444</context>
</context-group>
</trans-unit>
<trans-unit id="3486679398271885916" datatype="html">
<source>Canada</source>
<target state="translated">Kanada</target>
@ -6565,7 +6593,7 @@
<target state="translated">Pasif</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="2159130950882492111" datatype="html">
@ -6668,6 +6696,14 @@
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="2803298218425845065" datatype="html">
<source>Role</source>
<target state="new">Role</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="2807800733729323332" datatype="html">
<source>Yes</source>
<target state="translated">Evet</target>
@ -6679,6 +6715,10 @@
<trans-unit id="6574710269679413520" datatype="html">
<source>Accounts</source>
<target state="new">Accounts</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.html</context>
<context context-type="linenumber">84</context>
@ -6972,6 +7012,14 @@
<context context-type="linenumber">293</context>
</context-group>
</trans-unit>
<trans-unit id="7417020438124538834" datatype="html">
<source>Engagement per Day</source>
<target state="new">Engagement per Day</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">76</context>
</context-group>
</trans-unit>
<trans-unit id="7423212324650924366" datatype="html">
<source>Guides</source>
<target state="translated">Kılavuzlar</target>
@ -7110,6 +7158,14 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="8514765519764380399" datatype="html">
<source>Country</source>
<target state="new">Country</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="8517109745758603034" datatype="html">
<source>API Key</source>
<target state="translated">API Anahtarı</target>
@ -7199,7 +7255,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="1769610706135259386" datatype="html">
@ -7258,6 +7314,14 @@
<context context-type="linenumber">234</context>
</context-group>
</trans-unit>
<trans-unit id="8214324091109908102" datatype="html">
<source>API Requests Today</source>
<target state="new">API Requests Today</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
<source>Default Market Price</source>
<target state="translated">Varsayılan Piyasa Fiyatı</target>
@ -7455,7 +7519,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">169</context>
<context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="6751986162338860240" datatype="html">
@ -8072,7 +8136,7 @@
<target state="new">Do you really want to generate a new security token?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="5193539160604294602" datatype="html">
@ -8128,7 +8192,7 @@
<target state="new">Manage Asset Profile</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">442</context>
<context context-type="linenumber">465</context>
</context-group>
</trans-unit>
<trans-unit id="2978009302056542263" datatype="html">
@ -8152,7 +8216,7 @@
<target state="new">Average Unit Price</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">113</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
@ -8543,12 +8607,12 @@
<context context-type="linenumber">128</context>
</context-group>
</trans-unit>
<trans-unit id="339860602695747533" datatype="html">
<trans-unit id="889243574476657449" datatype="html">
<source>Registration Date</source>
<target state="new">Registration Date</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="5162138648470294706" datatype="html">

114
apps/client/src/locales/messages.uk.xlf

@ -38,7 +38,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">283</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -345,6 +345,10 @@
<trans-unit id="6574710269679413520" datatype="html">
<source>Accounts</source>
<target state="new">Accounts</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.html</context>
<context context-type="linenumber">84</context>
@ -627,7 +631,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">443</context>
<context context-type="linenumber">451</context>
</context-group>
</trans-unit>
<trans-unit id="7022070615528435141" datatype="html">
@ -663,7 +667,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">470</context>
<context context-type="linenumber">478</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
@ -1362,6 +1366,14 @@
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="8119836022359386797" datatype="html">
<source>Activities</source>
<target state="new">Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="5487499696517396535" datatype="html">
<source>Add Platform</source>
<target state="translated">Додати платформу</target>
@ -1375,7 +1387,7 @@
<target state="translated">Ви дійсно хочете видалити цю платформу?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.ts</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="774722884061553775" datatype="html">
@ -1559,7 +1571,7 @@
<target state="translated">Ви дійсно хочете видалити цей тег?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-tag/admin-tag.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3653624484380347431" datatype="html">
@ -1763,11 +1775,11 @@
<target state="translated">Упс! Неправильний Секретний Токен.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">298</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">153</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
@ -1875,7 +1887,7 @@
<target state="translated">Повідомити про збій даних</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">452</context>
<context context-type="linenumber">450</context>
</context-group>
</trans-unit>
<trans-unit id="8204176479746810612" datatype="html">
@ -2625,10 +2637,6 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">252</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="7156797854368699223" datatype="html">
<source>Me</source>
@ -2639,7 +2647,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="1769610706135259386" datatype="html">
@ -3175,7 +3183,7 @@
<target state="translated">Упс, перенесення балансу готівки не вдалося.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.component.ts</context>
<context context-type="linenumber">324</context>
<context context-type="linenumber">339</context>
</context-group>
</trans-unit>
<trans-unit id="4154970040744792968" datatype="html">
@ -4779,6 +4787,14 @@
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
<source>Close Holding</source>
<target state="new">Close Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">441</context>
</context-group>
</trans-unit>
<trans-unit id="1605678350626749943" datatype="html">
<source>Absolute Asset Performance</source>
<target state="translated">Абсолютна прибутковість активів</target>
@ -4936,7 +4952,7 @@
<target state="translated">Неактивний</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="5080775557941296581" datatype="html">
@ -5255,6 +5271,14 @@
<context context-type="linenumber">293</context>
</context-group>
</trans-unit>
<trans-unit id="7417020438124538834" datatype="html">
<source>Engagement per Day</source>
<target state="new">Engagement per Day</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">76</context>
</context-group>
</trans-unit>
<trans-unit id="7423212324650924366" datatype="html">
<source>Guides</source>
<target state="translated">Посібники</target>
@ -5786,6 +5810,14 @@
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="1434671461968858301" datatype="html">
<source>User ID</source>
<target state="new">User ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="7900108539442184659" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> може використовуватися анонімно</target>
@ -6035,7 +6067,7 @@
<target state="translated">Клонувати</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">449</context>
<context context-type="linenumber">457</context>
</context-group>
</trans-unit>
<trans-unit id="4631493229601603593" datatype="html">
@ -6043,7 +6075,7 @@
<target state="translated">Експортувати чернетку як ICS</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">459</context>
<context context-type="linenumber">467</context>
</context-group>
</trans-unit>
<trans-unit id="4239552960465242484" datatype="html">
@ -6051,7 +6083,7 @@
<target state="translated">Ви дійсно хочете видалити ці дії?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">270</context>
<context context-type="linenumber">276</context>
</context-group>
</trans-unit>
<trans-unit id="670983159637074283" datatype="html">
@ -6059,7 +6091,7 @@
<target state="translated">Ви дійсно хочете видалити цю активність?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">286</context>
</context-group>
</trans-unit>
<trans-unit id="3105754554141014845" datatype="html">
@ -6750,6 +6782,14 @@
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
<trans-unit id="2803298218425845065" datatype="html">
<source>Role</source>
<target state="new">Role</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="2807800733729323332" datatype="html">
<source>Yes</source>
<target state="translated">Так</target>
@ -7014,6 +7054,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
<source>View Holding</source>
<target state="new">View Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">444</context>
</context-group>
</trans-unit>
<trans-unit id="3486679398271885916" datatype="html">
<source>Canada</source>
<target state="translated">Канада</target>
@ -7166,6 +7214,14 @@
<context context-type="linenumber">110</context>
</context-group>
</trans-unit>
<trans-unit id="8514765519764380399" datatype="html">
<source>Country</source>
<target state="new">Country</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="8517109745758603034" datatype="html">
<source>API Key</source>
<target state="translated">Ключ API</target>
@ -7258,6 +7314,14 @@
<context context-type="linenumber">234</context>
</context-group>
</trans-unit>
<trans-unit id="8214324091109908102" datatype="html">
<source>API Requests Today</source>
<target state="new">API Requests Today</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
<source>Default Market Price</source>
<target state="new">Default Market Price</target>
@ -7455,7 +7519,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">169</context>
<context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="6751986162338860240" datatype="html">
@ -8072,7 +8136,7 @@
<target state="new">Do you really want to generate a new security token?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="5193539160604294602" datatype="html">
@ -8128,7 +8192,7 @@
<target state="new">Manage Asset Profile</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">442</context>
<context context-type="linenumber">465</context>
</context-group>
</trans-unit>
<trans-unit id="2978009302056542263" datatype="html">
@ -8152,7 +8216,7 @@
<target state="new">Average Unit Price</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">113</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
@ -8543,12 +8607,12 @@
<context context-type="linenumber">128</context>
</context-group>
</trans-unit>
<trans-unit id="339860602695747533" datatype="html">
<trans-unit id="889243574476657449" datatype="html">
<source>Registration Date</source>
<target state="new">Registration Date</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="5162138648470294706" datatype="html">

106
apps/client/src/locales/messages.xlf

@ -498,7 +498,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">443</context>
<context context-type="linenumber">451</context>
</context-group>
</trans-unit>
<trans-unit id="7022070615528435141" datatype="html">
@ -533,7 +533,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">470</context>
<context context-type="linenumber">478</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
@ -1106,6 +1106,13 @@
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="8119836022359386797" datatype="html">
<source>Activities</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="5487499696517396535" datatype="html">
<source>Add Platform</source>
<context-group purpose="location">
@ -1136,7 +1143,7 @@
<source>Do you really want to delete this platform?</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.ts</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="774722884061553775" datatype="html">
@ -1193,7 +1200,7 @@
<source>Do you really want to delete this tag?</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-tag/admin-tag.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3653624484380347431" datatype="html">
@ -1344,7 +1351,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">283</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -1363,11 +1370,11 @@
<source>Oops! Incorrect Security Token.</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">298</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">153</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
@ -1747,7 +1754,7 @@
<source>Report Data Glitch</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">452</context>
<context context-type="linenumber">450</context>
</context-group>
</trans-unit>
<trans-unit id="5451369123952965511" datatype="html">
@ -2181,10 +2188,6 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">252</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="8604673556809626581" datatype="html">
<source>Export Data</source>
@ -2372,7 +2375,7 @@
<source>Oops, cash balance transfer has failed.</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.component.ts</context>
<context context-type="linenumber">324</context>
<context context-type="linenumber">339</context>
</context-group>
</trans-unit>
<trans-unit id="4154970040744792968" datatype="html">
@ -3287,7 +3290,7 @@
<source>Do you really want to delete these activities?</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">270</context>
<context context-type="linenumber">276</context>
</context-group>
</trans-unit>
<trans-unit id="1111435290645444471" datatype="html">
@ -4261,6 +4264,13 @@
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="1434671461968858301" datatype="html">
<source>User ID</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="1154843799824106777" datatype="html">
<source>Free Plan</source>
<context-group purpose="location">
@ -4449,21 +4459,21 @@
<source>Clone</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">449</context>
<context context-type="linenumber">457</context>
</context-group>
</trans-unit>
<trans-unit id="4631493229601603593" datatype="html">
<source>Export Draft as ICS</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">459</context>
<context context-type="linenumber">467</context>
</context-group>
</trans-unit>
<trans-unit id="670983159637074283" datatype="html">
<source>Do you really want to delete this activity?</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">286</context>
</context-group>
</trans-unit>
<trans-unit id="3060494754215793943" datatype="html">
@ -5233,6 +5243,13 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
<source>Close Holding</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">441</context>
</context-group>
</trans-unit>
<trans-unit id="1605678350626749943" datatype="html">
<source>Absolute Asset Performance</source>
<context-group purpose="location">
@ -5790,6 +5807,13 @@
<context context-type="linenumber">99</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
<source>View Holding</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">444</context>
</context-group>
</trans-unit>
<trans-unit id="3486679398271885916" datatype="html">
<source>Canada</source>
<context-group purpose="location">
@ -6000,6 +6024,13 @@
<context context-type="linenumber">9</context>
</context-group>
</trans-unit>
<trans-unit id="2803298218425845065" datatype="html">
<source>Role</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="2807800733729323332" datatype="html">
<source>Yes</source>
<context-group purpose="location">
@ -6018,7 +6049,7 @@
<source>Inactive</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="7819314041543176992" datatype="html">
@ -6136,6 +6167,10 @@
</trans-unit>
<trans-unit id="6574710269679413520" datatype="html">
<source>Accounts</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.html</context>
<context context-type="linenumber">84</context>
@ -6361,6 +6396,13 @@
<context context-type="linenumber">291</context>
</context-group>
</trans-unit>
<trans-unit id="7417020438124538834" datatype="html">
<source>Engagement per Day</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">76</context>
</context-group>
</trans-unit>
<trans-unit id="7423212324650924366" datatype="html">
<source>Guides</source>
<context-group purpose="location">
@ -6444,6 +6486,13 @@
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="8514765519764380399" datatype="html">
<source>Country</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="8517109745758603034" datatype="html">
<source>API Key</source>
<context-group purpose="location">
@ -6569,7 +6618,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="4068738931505527681" datatype="html">
@ -6600,6 +6649,13 @@
<context context-type="linenumber">450</context>
</context-group>
</trans-unit>
<trans-unit id="8214324091109908102" datatype="html">
<source>API Requests Today</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
<source>Default Market Price</source>
<context-group purpose="location">
@ -6796,7 +6852,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">169</context>
<context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="5343721620901142551" datatype="html">
@ -7322,7 +7378,7 @@
<source>Do you really want to generate a new security token?</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="1419479195323304896" datatype="html">
@ -7358,7 +7414,7 @@
<source>Manage Asset Profile</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">442</context>
<context context-type="linenumber">465</context>
</context-group>
</trans-unit>
<trans-unit id="2978009302056542263" datatype="html">
@ -7379,7 +7435,7 @@
<source>Average Unit Price</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">113</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
@ -7723,11 +7779,11 @@
<context context-type="linenumber">128</context>
</context-group>
</trans-unit>
<trans-unit id="339860602695747533" datatype="html">
<trans-unit id="889243574476657449" datatype="html">
<source>Registration Date</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="5606994816647505945" datatype="html">

114
apps/client/src/locales/messages.zh.xlf

@ -528,7 +528,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">443</context>
<context context-type="linenumber">451</context>
</context-group>
</trans-unit>
<trans-unit id="7022070615528435141" datatype="html">
@ -564,7 +564,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">470</context>
<context context-type="linenumber">478</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
@ -1175,6 +1175,14 @@
<context context-type="linenumber">200</context>
</context-group>
</trans-unit>
<trans-unit id="8119836022359386797" datatype="html">
<source>Activities</source>
<target state="new">Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="5487499696517396535" datatype="html">
<source>Add Platform</source>
<target state="translated">添加平台</target>
@ -1208,7 +1216,7 @@
<target state="translated">您真的要删除这个平台吗?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.ts</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="774722884061553775" datatype="html">
@ -1272,7 +1280,7 @@
<target state="translated">您真的要删除此标签吗?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-tag/admin-tag.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="3653624484380347431" datatype="html">
@ -1440,7 +1448,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">283</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
@ -1460,11 +1468,11 @@
<target state="translated">哎呀!安全令牌不正确。</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/header/header.component.ts</context>
<context context-type="linenumber">294</context>
<context context-type="linenumber">298</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">153</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
@ -1884,7 +1892,7 @@
<target state="translated">报告数据故障</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">452</context>
<context context-type="linenumber">450</context>
</context-group>
</trans-unit>
<trans-unit id="5451369123952965511" datatype="html">
@ -2362,10 +2370,6 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">252</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="8604673556809626581" datatype="html">
<source>Export Data</source>
@ -2568,7 +2572,7 @@
<target state="translated">糟糕,现金余额转账失败。</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/accounts-page.component.ts</context>
<context context-type="linenumber">324</context>
<context context-type="linenumber">339</context>
</context-group>
</trans-unit>
<trans-unit id="4154970040744792968" datatype="html">
@ -3572,7 +3576,7 @@
<target state="translated">您确定要删除这些活动吗?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">270</context>
<context context-type="linenumber">276</context>
</context-group>
</trans-unit>
<trans-unit id="1111435290645444471" datatype="html">
@ -4652,6 +4656,14 @@
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="1434671461968858301" datatype="html">
<source>User ID</source>
<target state="new">User ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="1154843799824106777" datatype="html">
<source>Free Plan</source>
<target state="translated">免费计划</target>
@ -4861,7 +4873,7 @@
<target state="translated">克隆</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">449</context>
<context context-type="linenumber">457</context>
</context-group>
</trans-unit>
<trans-unit id="4631493229601603593" datatype="html">
@ -4869,7 +4881,7 @@
<target state="translated">将汇票导出为 ICS</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">459</context>
<context context-type="linenumber">467</context>
</context-group>
</trans-unit>
<trans-unit id="670983159637074283" datatype="html">
@ -4877,7 +4889,7 @@
<target state="translated">您确实要删除此活动吗?</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.ts</context>
<context context-type="linenumber">280</context>
<context context-type="linenumber">286</context>
</context-group>
</trans-unit>
<trans-unit id="3060494754215793943" datatype="html">
@ -5732,6 +5744,14 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
<source>Close Holding</source>
<target state="new">Close Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">441</context>
</context-group>
</trans-unit>
<trans-unit id="1605678350626749943" datatype="html">
<source>Absolute Asset Performance</source>
<target state="translated">绝对资产回报</target>
@ -6409,6 +6429,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
<source>View Holding</source>
<target state="new">View Holding</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">444</context>
</context-group>
</trans-unit>
<trans-unit id="3486679398271885916" datatype="html">
<source>Canada</source>
<target state="translated">加拿大</target>
@ -6566,7 +6594,7 @@
<target state="translated">非活跃</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit id="2159130950882492111" datatype="html">
@ -6669,6 +6697,14 @@
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="2803298218425845065" datatype="html">
<source>Role</source>
<target state="new">Role</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">31</context>
</context-group>
</trans-unit>
<trans-unit id="2807800733729323332" datatype="html">
<source>Yes</source>
<target state="translated">是</target>
@ -6680,6 +6716,10 @@
<trans-unit id="6574710269679413520" datatype="html">
<source>Accounts</source>
<target state="new">Accounts</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.html</context>
<context context-type="linenumber">84</context>
@ -6973,6 +7013,14 @@
<context context-type="linenumber">293</context>
</context-group>
</trans-unit>
<trans-unit id="7417020438124538834" datatype="html">
<source>Engagement per Day</source>
<target state="new">Engagement per Day</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">76</context>
</context-group>
</trans-unit>
<trans-unit id="7423212324650924366" datatype="html">
<source>Guides</source>
<target state="translated">指南</target>
@ -7111,6 +7159,14 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="8514765519764380399" datatype="html">
<source>Country</source>
<target state="new">Country</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="8517109745758603034" datatype="html">
<source>API Key</source>
<target state="translated">API 密钥</target>
@ -7200,7 +7256,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="1769610706135259386" datatype="html">
@ -7259,6 +7315,14 @@
<context context-type="linenumber">234</context>
</context-group>
</trans-unit>
<trans-unit id="8214324091109908102" datatype="html">
<source>API Requests Today</source>
<target state="new">API Requests Today</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">86</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
<source>Default Market Price</source>
<target state="translated">默认市场价格</target>
@ -7456,7 +7520,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">169</context>
<context context-type="linenumber">170</context>
</context-group>
</trans-unit>
<trans-unit id="6751986162338860240" datatype="html">
@ -8073,7 +8137,7 @@
<target state="translated">您真的想要生成一个新的安全令牌吗?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/user-account-access.component.ts</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="5193539160604294602" datatype="html">
@ -8129,7 +8193,7 @@
<target state="translated">管理资产概况</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">442</context>
<context context-type="linenumber">465</context>
</context-group>
</trans-unit>
<trans-unit id="2978009302056542263" datatype="html">
@ -8153,7 +8217,7 @@
<target state="translated">平均单位价格</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts</context>
<context context-type="linenumber">111</context>
<context context-type="linenumber">113</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
@ -8544,12 +8608,12 @@
<context context-type="linenumber">128</context>
</context-group>
</trans-unit>
<trans-unit id="339860602695747533" datatype="html">
<trans-unit id="889243574476657449" datatype="html">
<source>Registration Date</source>
<target state="new">Registration Date</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="5162138648470294706" datatype="html">

61
apps/client/src/styles/theme.scss

@ -1,9 +1,6 @@
@use '@angular/material' as mat;
$dark-primary-text: rgba(black, 0.87);
$light-primary-text: white;
$mat-css-dark-theme-selector: '.theme-dark';
@use './variables.scss' as variables;
$gf-primary: (
50: var(--gf-theme-primary-50),
@ -21,20 +18,20 @@ $gf-primary: (
A400: var(--gf-theme-primary-A400),
A700: var(--gf-theme-primary-A700),
contrast: (
50: $dark-primary-text,
100: $dark-primary-text,
200: $dark-primary-text,
300: $light-primary-text,
400: $light-primary-text,
500: $light-primary-text,
600: $light-primary-text,
700: $light-primary-text,
800: $light-primary-text,
900: $light-primary-text,
A100: $dark-primary-text,
A200: $light-primary-text,
A400: $light-primary-text,
A700: $light-primary-text
50: variables.$dark-primary-text,
100: variables.$dark-primary-text,
200: variables.$dark-primary-text,
300: variables.$light-primary-text,
400: variables.$light-primary-text,
500: variables.$light-primary-text,
600: variables.$light-primary-text,
700: variables.$light-primary-text,
800: variables.$light-primary-text,
900: variables.$light-primary-text,
A100: variables.$dark-primary-text,
A200: variables.$light-primary-text,
A400: variables.$light-primary-text,
A700: variables.$light-primary-text
)
);
@ -54,20 +51,20 @@ $gf-secondary: (
A400: var(--gf-theme-secondary-A400),
A700: var(--gf-theme-secondary-A700),
contrast: (
50: $dark-primary-text,
100: $dark-primary-text,
200: $dark-primary-text,
300: $light-primary-text,
400: $light-primary-text,
500: $light-primary-text,
600: $light-primary-text,
700: $light-primary-text,
800: $light-primary-text,
900: $light-primary-text,
A100: $dark-primary-text,
A200: $light-primary-text,
A400: $light-primary-text,
A700: $light-primary-text
50: variables.$dark-primary-text,
100: variables.$dark-primary-text,
200: variables.$dark-primary-text,
300: variables.$light-primary-text,
400: variables.$light-primary-text,
500: variables.$light-primary-text,
600: variables.$light-primary-text,
700: variables.$light-primary-text,
800: variables.$light-primary-text,
900: variables.$light-primary-text,
A100: variables.$dark-primary-text,
A200: variables.$light-primary-text,
A400: variables.$light-primary-text,
A700: variables.$light-primary-text
)
);

4
apps/client/src/styles/variables.scss

@ -0,0 +1,4 @@
$dark-primary-text: rgba(black, 0.87);
$light-primary-text: white;
$mat-css-dark-theme-selector: '.theme-dark';

5
eslint.config.cjs

@ -152,7 +152,6 @@ module.exports = [
// The following rules are part of eslint:recommended
// and can be remove once solved
'no-constant-binary-expression': 'warn',
'no-loss-of-precision': 'warn',
// The following rules are part of @typescript-eslint/recommended-type-checked
@ -170,7 +169,6 @@ module.exports = [
'@typescript-eslint/no-unsafe-argument': 'warn',
'@typescript-eslint/no-unsafe-assignment': 'warn',
'@typescript-eslint/no-unsafe-enum-comparison': 'warn',
'@typescript-eslint/no-unsafe-function-type': 'warn',
'@typescript-eslint/no-unsafe-member-access': 'warn',
'@typescript-eslint/no-unsafe-return': 'warn',
'@typescript-eslint/no-unsafe-call': 'warn',
@ -189,8 +187,7 @@ module.exports = [
// The following rules are part of @typescript-eslint/stylistic-type-checked
// and can be remove once solved
'@typescript-eslint/prefer-nullish-coalescing': 'warn', // TODO: Requires strictNullChecks: true
'@typescript-eslint/prefer-regexp-exec': 'warn'
'@typescript-eslint/prefer-nullish-coalescing': 'warn' // TODO: Requires strictNullChecks: true
}
}))
];

2
libs/common/src/lib/helper.ts

@ -375,7 +375,7 @@ export function parseDate(date: string): Date {
// Transform 'yyyyMMdd' format to supported format by parse function
if (date?.length === 8) {
const match = date.match(/^(\d{4})(\d{2})(\d{2})$/);
const match = /^(\d{4})(\d{2})(\d{2})$/.exec(date);
if (match) {
const [, year, month, day] = match;

4
libs/common/src/lib/interfaces/index.ts

@ -7,7 +7,6 @@ import type {
AdminMarketData,
AdminMarketDataItem
} from './admin-market-data.interface';
import type { AdminUsers } from './admin-users.interface';
import type { AssetClassSelectorOption } from './asset-class-selector-option.interface';
import type { AssetProfileIdentifier } from './asset-profile-identifier.interface';
import type { BenchmarkProperty } from './benchmark-property.interface';
@ -39,6 +38,7 @@ import type { AccountBalancesResponse } from './responses/account-balances-respo
import type { AccountsResponse } from './responses/accounts-response.interface';
import type { ActivitiesResponse } from './responses/activities-response.interface';
import type { ActivityResponse } from './responses/activity-response.interface';
import type { AdminUsersResponse } from './responses/admin-users-response.interface';
import type { AiPromptResponse } from './responses/ai-prompt-response.interface';
import type { ApiKeyResponse } from './responses/api-key-response.interface';
import type { AssetResponse } from './responses/asset-response.interface';
@ -92,7 +92,7 @@ export {
AdminMarketData,
AdminMarketDataDetails,
AdminMarketDataItem,
AdminUsers,
AdminUsersResponse,
AiPromptResponse,
ApiKeyResponse,
AssetClassSelectorOption,

2
libs/common/src/lib/interfaces/admin-users.interface.ts → libs/common/src/lib/interfaces/responses/admin-users-response.interface.ts

@ -1,6 +1,6 @@
import { Role } from '@prisma/client';
export interface AdminUsers {
export interface AdminUsersResponse {
count: number;
users: {
accountCount: number;

14
libs/ui/src/lib/activities-table/activities-table.component.html

@ -437,6 +437,14 @@
class="no-max-width"
xPosition="before"
>
@if (canClickActivity(element)) {
<button mat-menu-item (click)="onClickActivity(element)">
<span class="align-items-center d-flex">
<ion-icon class="mr-2" name="tablet-landscape-outline" />
<span i18n>View Holding</span>
</span>
</button>
}
<button mat-menu-item (click)="onUpdateActivity(element)">
<span class="align-items-center d-flex">
<ion-icon class="mr-2" name="create-outline" />
@ -479,11 +487,7 @@
*matRowDef="let row; columns: displayedColumns"
mat-row
[ngClass]="{
'cursor-pointer':
hasPermissionToOpenDetails &&
isExcludedFromAnalysis(row) === false &&
row.isDraft === false &&
['BUY', 'DIVIDEND', 'SELL'].includes(row.type)
'cursor-pointer': canClickActivity(row)
}"
(click)="onClickActivity(row)"
></tr>

18
libs/ui/src/lib/activities-table/activities-table.component.ts

@ -56,6 +56,7 @@ import {
documentTextOutline,
ellipsisHorizontal,
ellipsisVertical,
tabletLandscapeOutline,
trashOutline
} from 'ionicons/icons';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
@ -153,6 +154,7 @@ export class GfActivitiesTableComponent
documentTextOutline,
ellipsisHorizontal,
ellipsisVertical,
tabletLandscapeOutline,
trashOutline
});
}
@ -226,6 +228,15 @@ export class GfActivitiesTableComponent
return numSelectedRows === numTotalRows;
}
public canClickActivity(activity: Activity) {
return (
this.hasPermissionToOpenDetails &&
this.isExcludedFromAnalysis(activity) === false &&
activity.isDraft === false &&
['BUY', 'DIVIDEND', 'SELL'].includes(activity.type)
);
}
public isExcludedFromAnalysis(activity: Activity) {
return (
activity.account?.isExcluded ||
@ -244,12 +255,7 @@ export class GfActivitiesTableComponent
if (!activity.error) {
this.selectedRows.toggle(activity);
}
} else if (
this.hasPermissionToOpenDetails &&
this.isExcludedFromAnalysis(activity) === false &&
activity.isDraft === false &&
['BUY', 'DIVIDEND', 'SELL'].includes(activity.type)
) {
} else if (this.canClickActivity(activity)) {
this.activityClicked.emit({
dataSource: activity.SymbolProfile.dataSource,
symbol: activity.SymbolProfile.symbol

7
libs/ui/src/lib/benchmark/benchmark.component.ts

@ -155,14 +155,17 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy {
dataSource,
symbol
}: AssetProfileIdentifier) {
const dialogRef = this.dialog.open(GfBenchmarkDetailDialogComponent, {
const dialogRef = this.dialog.open<
GfBenchmarkDetailDialogComponent,
BenchmarkDetailDialogParams
>(GfBenchmarkDetailDialogComponent, {
data: {
dataSource,
symbol,
colorScheme: this.user?.settings?.colorScheme,
deviceType: this.deviceType,
locale: this.locale
} as BenchmarkDetailDialogParams,
},
height: this.deviceType === 'mobile' ? '98vh' : undefined,
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});

2
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts

@ -185,7 +185,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
'principalInvestmentAmount'
).value,
projectedTotalAmount:
Number(this.getProjectedTotalAmount().toFixed(0)) ?? 0,
Math.round(this.getProjectedTotalAmount()) || 0,
retirementDate:
this.getRetirementDate() ?? this.DEFAULT_RETIREMENT_DATE
},

28
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts

@ -199,21 +199,21 @@ export class GfHistoricalMarketDataEditorComponent
}) {
const marketPrice = this.marketDataByMonth[yearMonth]?.[day]?.marketPrice;
const dialogRef = this.dialog.open(
const dialogRef = this.dialog.open<
GfHistoricalMarketDataEditorDialogComponent,
{
data: {
marketPrice,
currency: this.currency,
dataSource: this.dataSource,
dateString: `${yearMonth}-${day}`,
symbol: this.symbol,
user: this.user
} as HistoricalMarketDataEditorDialogParams,
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
}
);
HistoricalMarketDataEditorDialogParams
>(GfHistoricalMarketDataEditorDialogComponent, {
data: {
marketPrice,
currency: this.currency,
dataSource: this.dataSource,
dateString: `${yearMonth}-${day}`,
symbol: this.symbol,
user: this.user
},
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
dialogRef
.afterClosed()

3
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts

@ -31,6 +31,7 @@ import ChartDataLabels from 'chartjs-plugin-datalabels';
import { isUUID } from 'class-validator';
import Color from 'color';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import OpenColor from 'open-color';
import { translate } from '../i18n';
@ -47,7 +48,7 @@ const {
teal,
violet,
yellow
} = require('open-color');
} = OpenColor;
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,

6
libs/ui/src/lib/tags-selector/tags-selector.component.ts

@ -5,12 +5,10 @@ import {
Component,
CUSTOM_ELEMENTS_SCHEMA,
ElementRef,
EventEmitter,
Input,
OnChanges,
OnDestroy,
OnInit,
Output,
signal,
ViewChild
} from '@angular/core';
@ -66,8 +64,6 @@ export class GfTagsSelectorComponent
@Input() tags: Tag[];
@Input() tagsAvailable: Tag[];
@Output() tagsChanged = new EventEmitter<Tag[]>();
@ViewChild('tagInput') tagInput: ElementRef<HTMLInputElement>;
public filteredOptions: Subject<Tag[]> = new BehaviorSubject([]);
@ -115,7 +111,6 @@ export class GfTagsSelectorComponent
});
const newTags = this.tagsSelected();
this.tagsChanged.emit(newTags);
this.onChange(newTags);
this.onTouched();
this.tagInput.nativeElement.value = '';
@ -130,7 +125,6 @@ export class GfTagsSelectorComponent
});
const newTags = this.tagsSelected();
this.tagsChanged.emit(newTags);
this.onChange(newTags);
this.onTouched();
this.updateFilters();

3
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts

@ -33,10 +33,11 @@ import { isUUID } from 'class-validator';
import { differenceInDays, max } from 'date-fns';
import { orderBy } from 'lodash';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import OpenColor from 'open-color';
import { GetColorParams } from './interfaces/interfaces';
const { gray, green, red } = require('open-color');
const { gray, green, red } = OpenColor;
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,

442
package-lock.json

@ -1,12 +1,12 @@
{
"name": "ghostfolio",
"version": "2.211.0",
"version": "2.214.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
"version": "2.211.0",
"version": "2.214.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
@ -23,25 +23,20 @@
"@angular/service-worker": "20.2.4",
"@codewithdan/observable-store": "2.2.15",
"@date-fns/utc": "2.1.0",
"@dfinity/agent": "0.15.7",
"@dfinity/auth-client": "0.15.7",
"@dfinity/candid": "0.15.7",
"@dfinity/identity": "0.15.7",
"@dfinity/principal": "0.15.7",
"@internationalized/number": "3.6.3",
"@ionic/angular": "8.7.3",
"@keyv/redis": "4.4.0",
"@nestjs/bull": "11.0.2",
"@nestjs/bull": "11.0.4",
"@nestjs/cache-manager": "3.0.1",
"@nestjs/common": "11.1.3",
"@nestjs/common": "11.1.8",
"@nestjs/config": "4.0.2",
"@nestjs/core": "11.1.3",
"@nestjs/core": "11.1.8",
"@nestjs/event-emitter": "3.0.1",
"@nestjs/jwt": "11.0.0",
"@nestjs/jwt": "11.0.1",
"@nestjs/passport": "11.0.5",
"@nestjs/platform-express": "11.1.3",
"@nestjs/schedule": "6.0.0",
"@nestjs/serve-static": "5.0.3",
"@nestjs/platform-express": "11.1.8",
"@nestjs/schedule": "6.0.1",
"@nestjs/serve-static": "5.0.4",
"@openrouter/ai-sdk-provider": "0.7.2",
"@prisma/client": "6.18.0",
"@simplewebauthn/browser": "13.1.0",
@ -62,7 +57,7 @@
"class-validator": "0.14.2",
"color": "5.0.0",
"countries-and-timezones": "3.8.0",
"countries-list": "3.1.1",
"countries-list": "3.2.0",
"countup.js": "2.9.0",
"date-fns": "4.1.0",
"dotenv": "17.2.3",
@ -77,7 +72,7 @@
"lodash": "4.17.21",
"marked": "15.0.4",
"ms": "3.0.0-canary.1",
"ng-extract-i18n-merge": "3.0.0",
"ng-extract-i18n-merge": "3.1.0",
"ngx-device-detector": "10.1.0",
"ngx-markdown": "20.0.0",
"ngx-skeleton-loader": "11.3.0",
@ -93,7 +88,7 @@
"stripe": "18.5.0",
"svgmap": "2.12.2",
"tablemark": "4.1.0",
"twitter-api-v2": "1.23.0",
"twitter-api-v2": "1.27.0",
"uuid": "11.1.0",
"yahoo-finance2": "3.10.0",
"zone.js": "0.15.1"
@ -112,8 +107,8 @@
"@angular/pwa": "20.2.2",
"@eslint/eslintrc": "3.3.1",
"@eslint/js": "9.35.0",
"@nestjs/schematics": "11.0.5",
"@nestjs/testing": "11.1.3",
"@nestjs/schematics": "11.0.9",
"@nestjs/testing": "11.1.8",
"@nx/angular": "21.5.1",
"@nx/cypress": "21.5.1",
"@nx/eslint-plugin": "21.5.1",
@ -4713,6 +4708,7 @@
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/trace-mapping": "0.3.9"
@ -4725,6 +4721,7 @@
"version": "0.3.9",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.0.3",
@ -4953,73 +4950,6 @@
"node": "^16.13.0 || >=18.0.0"
}
},
"node_modules/@dfinity/agent": {
"version": "0.15.7",
"resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-0.15.7.tgz",
"integrity": "sha512-w34yvlUTpPBG8nLOD0t/ao3k2xonOFq4QGvfJ1HiS/nIggdza/3xC3nLBszGrjVYWj1jqu8BLFvQXCAeWin75A==",
"license": "Apache-2.0",
"dependencies": {
"base64-arraybuffer": "^0.2.0",
"bignumber.js": "^9.0.0",
"borc": "^2.1.1",
"js-sha256": "0.9.0",
"simple-cbor": "^0.4.1",
"ts-node": "^10.8.2"
},
"peerDependencies": {
"@dfinity/candid": "^0.15.7",
"@dfinity/principal": "^0.15.7"
}
},
"node_modules/@dfinity/auth-client": {
"version": "0.15.7",
"resolved": "https://registry.npmjs.org/@dfinity/auth-client/-/auth-client-0.15.7.tgz",
"integrity": "sha512-f6cRqXayCf+7+9gNcDnAZZwJrgBYKIzfxjxeRLlpsueQeo+E/BX2yVSANxzTkCNc4U3p+ttHI1RNtasLunYTcA==",
"license": "Apache-2.0",
"dependencies": {
"idb": "^7.0.2"
},
"peerDependencies": {
"@dfinity/agent": "^0.15.7",
"@dfinity/identity": "^0.15.7",
"@dfinity/principal": "^0.15.7"
}
},
"node_modules/@dfinity/candid": {
"version": "0.15.7",
"resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-0.15.7.tgz",
"integrity": "sha512-lTcjK/xrSyT7wvUQ2pApG+yklQAwxaofQ04D1IWv0/8gKbY0eUbh8G2w6+CypJ15Hb1CH24ijUj8nWdeX/z3jg==",
"license": "Apache-2.0",
"dependencies": {
"ts-node": "^10.8.2"
}
},
"node_modules/@dfinity/identity": {
"version": "0.15.7",
"resolved": "https://registry.npmjs.org/@dfinity/identity/-/identity-0.15.7.tgz",
"integrity": "sha512-kBAkx9wq78jSQf6T5aayLyWm8YgtOZw8bW6+OuzX6tR3hkAEa85A9TcKA7BjkmMWSIskjEDVQub4fFfKWS2vOQ==",
"license": "Apache-2.0",
"dependencies": {
"borc": "^2.1.1",
"js-sha256": "^0.9.0",
"tweetnacl": "^1.0.1"
},
"peerDependencies": {
"@dfinity/agent": "^0.15.7",
"@dfinity/principal": "^0.15.7",
"@peculiar/webcrypto": "^1.4.0"
}
},
"node_modules/@dfinity/principal": {
"version": "0.15.7",
"resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-0.15.7.tgz",
"integrity": "sha512-6/AkYzpGEH6Jw/0+B/EeeQn+5u2GDDvRLt1kQPhIG4txQYFnOy04H3VvyrymmfAj6/CXUgrOrux6OxgYSLYVJg==",
"license": "Apache-2.0",
"dependencies": {
"js-sha256": "^0.9.0",
"ts-node": "^10.8.2"
}
},
"node_modules/@discoveryjs/json-ext": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz",
@ -8997,12 +8927,12 @@
}
},
"node_modules/@nestjs/bull": {
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/@nestjs/bull/-/bull-11.0.2.tgz",
"integrity": "sha512-RjyP9JZUuLmMhmq1TMNIZqolkAd14az1jyXMMVki+C9dYvaMjWzBSwcZAtKs9Pk15Rm7qN1xn3R11aMV2Xv4gg==",
"version": "11.0.4",
"resolved": "https://registry.npmjs.org/@nestjs/bull/-/bull-11.0.4.tgz",
"integrity": "sha512-QVz2PR/rJF/isy7otVnMTSqLf/O71p9Ka7lBZt9Gm+NQFv8fcH2L11GL7TA0whyCcw/kAX5iRepUXz/wed4JoA==",
"license": "MIT",
"dependencies": {
"@nestjs/bull-shared": "^11.0.2",
"@nestjs/bull-shared": "^11.0.4",
"tslib": "2.8.1"
},
"peerDependencies": {
@ -9012,9 +8942,9 @@
}
},
"node_modules/@nestjs/bull-shared": {
"version": "11.0.3",
"resolved": "https://registry.npmjs.org/@nestjs/bull-shared/-/bull-shared-11.0.3.tgz",
"integrity": "sha512-CaHniPkLAxis6fAB1DB8WZELQv8VPCLedbj7iP0VQ1pz74i6NSzG9mBg6tOomXq/WW4la4P4OMGEQ48UAJh20A==",
"version": "11.0.4",
"resolved": "https://registry.npmjs.org/@nestjs/bull-shared/-/bull-shared-11.0.4.tgz",
"integrity": "sha512-VBJcDHSAzxQnpcDfA0kt9MTGUD1XZzfByV70su0W0eDCQ9aqIEBlzWRW21tv9FG9dIut22ysgDidshdjlnczLw==",
"license": "MIT",
"dependencies": {
"tslib": "2.8.1"
@ -9038,14 +8968,14 @@
}
},
"node_modules/@nestjs/common": {
"version": "11.1.3",
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.3.tgz",
"integrity": "sha512-ogEK+GriWodIwCw6buQ1rpcH4Kx+G7YQ9EwuPySI3rS05pSdtQ++UhucjusSI9apNidv+QURBztJkRecwwJQXg==",
"version": "11.1.8",
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.8.tgz",
"integrity": "sha512-bbsOqwld/GdBfiRNc4nnjyWWENDEicq4SH+R5AuYatvf++vf1x5JIsHB1i1KtfZMD3eRte0D4K9WXuAYil6XAg==",
"license": "MIT",
"dependencies": {
"file-type": "21.0.0",
"iterare": "1.2.1",
"load-esm": "1.0.2",
"load-esm": "1.0.3",
"tslib": "2.8.1",
"uid": "2.0.2"
},
@ -9111,16 +9041,16 @@
}
},
"node_modules/@nestjs/core": {
"version": "11.1.3",
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.3.tgz",
"integrity": "sha512-5lTni0TCh8x7bXETRD57pQFnKnEg1T6M+VLE7wAmyQRIecKQU+2inRGZD+A4v2DC1I04eA0WffP0GKLxjOKlzw==",
"version": "11.1.8",
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.8.tgz",
"integrity": "sha512-7riWfmTmMhCJHZ5ZiaG+crj4t85IPCq/wLRuOUSigBYyFT2JZj0lVHtAdf4Davp9ouNI8GINBDt9h9b5Gz9nTw==",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"@nuxt/opencollective": "0.4.1",
"fast-safe-stringify": "2.1.1",
"iterare": "1.2.1",
"path-to-regexp": "8.2.0",
"path-to-regexp": "8.3.0",
"tslib": "2.8.1",
"uid": "2.0.2"
},
@ -9165,12 +9095,12 @@
}
},
"node_modules/@nestjs/jwt": {
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.0.tgz",
"integrity": "sha512-v7YRsW3Xi8HNTsO+jeHSEEqelX37TVWgwt+BcxtkG/OfXJEOs6GZdbdza200d6KqId1pJQZ6UPj1F0M6E+mxaA==",
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.1.tgz",
"integrity": "sha512-HXSsc7SAnCnjA98TsZqrE7trGtHDnYXWp4Ffy6LwSmck1QvbGYdMzBquXofX5l6tIRpeY4Qidl2Ti2CVG77Pdw==",
"license": "MIT",
"dependencies": {
"@types/jsonwebtoken": "9.0.7",
"@types/jsonwebtoken": "9.0.10",
"jsonwebtoken": "9.0.2"
},
"peerDependencies": {
@ -9188,15 +9118,15 @@
}
},
"node_modules/@nestjs/platform-express": {
"version": "11.1.3",
"resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.3.tgz",
"integrity": "sha512-hEDNMlaPiBO72fxxX/CuRQL3MEhKRc/sIYGVoXjrnw6hTxZdezvvM6A95UaLsYknfmcZZa/CdG1SMBZOu9agHQ==",
"version": "11.1.8",
"resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.8.tgz",
"integrity": "sha512-rL6pZH9BW7BnL5X2eWbJMtt86uloAKjFgyY5+L2UkizgfEp7rgAs0+Z1z0BcW2Pgu5+q8O7RKPNyHJ/9ZNz/ZQ==",
"license": "MIT",
"dependencies": {
"cors": "2.8.5",
"express": "5.1.0",
"multer": "2.0.1",
"path-to-regexp": "8.2.0",
"multer": "2.0.2",
"path-to-regexp": "8.3.0",
"tslib": "2.8.1"
},
"funding": {
@ -9209,12 +9139,12 @@
}
},
"node_modules/@nestjs/schedule": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-6.0.0.tgz",
"integrity": "sha512-aQySMw6tw2nhitELXd3EiRacQRgzUKD9mFcUZVOJ7jPLqIBvXOyvRWLsK9SdurGA+jjziAlMef7iB5ZEFFoQpw==",
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-6.0.1.tgz",
"integrity": "sha512-v3yO6cSPAoBSSyH67HWnXHzuhPhSNZhRmLY38JvCt2sqY8sPMOODpcU1D79iUMFf7k16DaMEbL4Mgx61ZhiC8Q==",
"license": "MIT",
"dependencies": {
"cron": "4.3.0"
"cron": "4.3.3"
},
"peerDependencies": {
"@nestjs/common": "^10.0.0 || ^11.0.0",
@ -9222,15 +9152,15 @@
}
},
"node_modules/@nestjs/schematics": {
"version": "11.0.5",
"resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.5.tgz",
"integrity": "sha512-T50SCNyqCZ/fDssaOD7meBKLZ87ebRLaJqZTJPvJKjlib1VYhMOCwXYsr7bjMPmuPgiQHOwvppz77xN/m6GM7A==",
"version": "11.0.9",
"resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.9.tgz",
"integrity": "sha512-0NfPbPlEaGwIT8/TCThxLzrlz3yzDNkfRNpbL7FiplKq3w4qXpJg0JYwqgMEJnLQZm3L/L/5XjoyfJHUO3qX9g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "19.2.6",
"@angular-devkit/schematics": "19.2.6",
"comment-json": "4.2.5",
"@angular-devkit/core": "19.2.17",
"@angular-devkit/schematics": "19.2.17",
"comment-json": "4.4.1",
"jsonc-parser": "3.3.1",
"pluralize": "8.0.0"
},
@ -9239,9 +9169,9 @@
}
},
"node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": {
"version": "19.2.6",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.6.tgz",
"integrity": "sha512-WFgiYhrDMq83UNaGRAneIM7CYYdBozD+yYA9BjoU8AgBLKtrvn6S8ZcjKAk5heoHtY/u8pEb0mwDTz9gxFmJZQ==",
"version": "19.2.17",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.17.tgz",
"integrity": "sha512-Ah008x2RJkd0F+NLKqIpA34/vUGwjlprRCkvddjDopAWRzYn6xCkz1Tqwuhn0nR1Dy47wTLKYD999TYl5ONOAQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -9267,13 +9197,13 @@
}
},
"node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": {
"version": "19.2.6",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.6.tgz",
"integrity": "sha512-YTAxNnT++5eflx19OUHmOWu597/TbTel+QARiZCv1xQw99+X8DCKKOUXtqBRd53CAHlREDI33Rn/JLY3NYgMLQ==",
"version": "19.2.17",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.17.tgz",
"integrity": "sha512-ADfbaBsrG8mBF6Mfs+crKA/2ykB8AJI50Cv9tKmZfwcUcyAdmTr+vVvhsBCfvUAEokigSsgqgpYxfkJVxhJYeg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "19.2.6",
"@angular-devkit/core": "19.2.17",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.17",
"ora": "5.4.1",
@ -9371,12 +9301,12 @@
"license": "ISC"
},
"node_modules/@nestjs/serve-static": {
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-5.0.3.tgz",
"integrity": "sha512-0jFjTlSVSLrI+mot8lfm+h2laXtKzCvgsVStv9T1ZBZTDwS26gM5czIhIESmWAod0PfrbCDFiu9C1MglObL8VA==",
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-5.0.4.tgz",
"integrity": "sha512-3kO1M9D3vsPyWPFardxIjUYeuolS58PnhCoBTkS7t3BrdZFZCKHnBZ15js+UOzOR2Q6HmD7ssGjLd0DVYVdvOw==",
"license": "MIT",
"dependencies": {
"path-to-regexp": "8.2.0"
"path-to-regexp": "8.3.0"
},
"peerDependencies": {
"@fastify/static": "^8.0.4",
@ -9398,9 +9328,9 @@
}
},
"node_modules/@nestjs/testing": {
"version": "11.1.3",
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.3.tgz",
"integrity": "sha512-CeXG6/eEqgFIkPkmU00y18Dd3DLOIDFhPItzJK1SWckKo6IhcnfoRJzGx75bmuvUMjb51j6An96S/+MJ2ty9jA==",
"version": "11.1.8",
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.8.tgz",
"integrity": "sha512-E6K+0UTKztcPxJzLnQa7S34lFjZbrj3Z1r7c5y5WDrL1m5HD1H4AeyBhicHgdaFmxjLAva2bq0sYKy/S7cdeYA==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -11908,36 +11838,6 @@
"tslib": "^2.8.1"
}
},
"node_modules/@peculiar/json-schema": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz",
"integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==",
"license": "MIT",
"peer": true,
"dependencies": {
"tslib": "^2.0.0"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/@peculiar/webcrypto": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz",
"integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@peculiar/asn1-schema": "^2.3.8",
"@peculiar/json-schema": "^1.1.12",
"pvtsutils": "^1.3.5",
"tslib": "^2.6.2",
"webcrypto-core": "^1.8.0"
},
"engines": {
"node": ">=10.12.0"
}
},
"node_modules/@phenomnomnominal/tsquery": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz",
@ -13754,24 +13654,28 @@
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
"integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
"dev": true,
"license": "MIT"
},
"node_modules/@tsconfig/node12": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
"dev": true,
"license": "MIT"
},
"node_modules/@tsconfig/node14": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
"dev": true,
"license": "MIT"
},
"node_modules/@tsconfig/node16": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
"dev": true,
"license": "MIT"
},
"node_modules/@tufjs/canonical-json": {
@ -14449,11 +14353,12 @@
"license": "MIT"
},
"node_modules/@types/jsonwebtoken": {
"version": "9.0.7",
"resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz",
"integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==",
"version": "9.0.10",
"resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz",
"integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==",
"license": "MIT",
"dependencies": {
"@types/ms": "*",
"@types/node": "*"
}
},
@ -14465,9 +14370,9 @@
"license": "MIT"
},
"node_modules/@types/luxon": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.6.2.tgz",
"integrity": "sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==",
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz",
"integrity": "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==",
"license": "MIT"
},
"node_modules/@types/mdx": {
@ -14484,6 +14389,12 @@
"dev": true,
"license": "MIT"
},
"node_modules/@types/ms": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
"integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
"license": "MIT"
},
"node_modules/@types/node": {
"version": "22.15.17",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz",
@ -15679,6 +15590,7 @@
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"devOptional": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
@ -15725,6 +15637,7 @@
"version": "8.3.4",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
"integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
"dev": true,
"license": "MIT",
"dependencies": {
"acorn": "^8.11.0"
@ -16050,6 +15963,7 @@
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
"dev": true,
"license": "MIT"
},
"node_modules/argparse": {
@ -16702,14 +16616,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/base64-arraybuffer": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz",
"integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==",
"engines": {
"node": ">= 0.6.0"
}
},
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@ -17033,30 +16939,6 @@
"popper.js": "^1.16.1"
}
},
"node_modules/borc": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz",
"integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==",
"license": "MIT",
"dependencies": {
"bignumber.js": "^9.0.0",
"buffer": "^5.5.0",
"commander": "^2.15.0",
"ieee754": "^1.1.13",
"iso-url": "~0.4.7",
"json-text-sequence": "~0.1.0",
"readable-stream": "^3.6.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/borc/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"license": "MIT"
},
"node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
@ -17153,6 +17035,7 @@
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"dev": true,
"funding": [
{
"type": "github",
@ -18266,17 +18149,15 @@
}
},
"node_modules/comment-json": {
"version": "4.2.5",
"resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.5.tgz",
"integrity": "sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==",
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.4.1.tgz",
"integrity": "sha512-r1To31BQD5060QdkC+Iheai7gHwoSZobzunqkf2/kQ6xIAfJyrKNAFUwdKvkK7Qgu7pVTKQEa7ok7Ed3ycAJgg==",
"dev": true,
"license": "MIT",
"dependencies": {
"array-timsort": "^1.0.3",
"core-util-is": "^1.0.3",
"esprima": "^4.0.1",
"has-own-prop": "^2.0.0",
"repeat-string": "^1.6.1"
"esprima": "^4.0.1"
},
"engines": {
"node": ">= 6"
@ -18642,9 +18523,9 @@
}
},
"node_modules/countries-list": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/countries-list/-/countries-list-3.1.1.tgz",
"integrity": "sha512-nPklKJ5qtmY5MdBKw1NiBAoyx5Sa7p2yPpljZyQ7gyCN1m+eMFs9I6CT37Mxt8zvR5L3VzD3DJBE4WQzX3WF4A==",
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/countries-list/-/countries-list-3.2.0.tgz",
"integrity": "sha512-HYHAo2fwEsG3TmbsNdVmIQPHizRlqeYMTtLEAl0IANG/3jRYX7p3NR6VapDqKP0n60TmsRy1dyRjVN5JbywDbA==",
"license": "MIT"
},
"node_modules/countup.js": {
@ -19320,16 +19201,17 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
"dev": true,
"license": "MIT"
},
"node_modules/cron": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/cron/-/cron-4.3.0.tgz",
"integrity": "sha512-ciiYNLfSlF9MrDqnbMdRWFiA6oizSF7kA1osPP9lRzNu0Uu+AWog1UKy7SkckiDY2irrNjeO6qLyKnXC8oxmrw==",
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/cron/-/cron-4.3.3.tgz",
"integrity": "sha512-B/CJj5yL3sjtlun6RtYHvoSB26EmQ2NUmhq9ZiJSyKIM4K/fqfh9aelDFlIayD2YMeFZqWLi9hHV+c+pq2Djkw==",
"license": "MIT",
"dependencies": {
"@types/luxon": "~3.6.0",
"luxon": "~3.6.0"
"@types/luxon": "~3.7.0",
"luxon": "~3.7.0"
},
"engines": {
"node": ">=18.x"
@ -20803,12 +20685,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/delimit-stream": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz",
"integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==",
"license": "BSD-2-Clause"
},
"node_modules/denque": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
@ -20903,6 +20779,7 @@
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.3.1"
@ -24205,16 +24082,6 @@
"node": ">=8"
}
},
"node_modules/has-own-prop": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz",
"integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/has-property-descriptors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
@ -24845,12 +24712,6 @@
"postcss": "^8.1.0"
}
},
"node_modules/idb": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
"integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==",
"license": "ISC"
},
"node_modules/identity-obj-proxy": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz",
@ -25842,15 +25703,6 @@
"dev": true,
"license": "ISC"
},
"node_modules/iso-url": {
"version": "0.4.7",
"resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz",
"integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==",
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
@ -30103,12 +29955,6 @@
"license": "MIT",
"peer": true
},
"node_modules/js-sha256": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz",
"integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==",
"license": "MIT"
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@ -30321,15 +30167,6 @@
"dev": true,
"license": "ISC"
},
"node_modules/json-text-sequence": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz",
"integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==",
"license": "MIT",
"dependencies": {
"delimit-stream": "0.1.0"
}
},
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@ -31620,9 +31457,9 @@
}
},
"node_modules/load-esm": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.2.tgz",
"integrity": "sha512-nVAvWk/jeyrWyXEAs84mpQCYccxRqgKY4OznLuJhJCa0XsPSfdOIr2zvBZEj3IHEHbX97jjscKRRV539bW0Gpw==",
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz",
"integrity": "sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==",
"funding": [
{
"type": "github",
@ -32040,9 +31877,9 @@
"license": "ISC"
},
"node_modules/luxon": {
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz",
"integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==",
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz",
"integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==",
"license": "MIT",
"engines": {
"node": ">=12"
@ -32088,6 +31925,7 @@
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true,
"license": "ISC"
},
"node_modules/make-fetch-happen": {
@ -32633,9 +32471,9 @@
}
},
"node_modules/multer": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/multer/-/multer-2.0.1.tgz",
"integrity": "sha512-Ug8bXeTIUlxurg8xLTEskKShvcKDZALo1THEX5E41pYCD2sCVub5/kIRIGqWNoqV6szyLyQKV6mD4QUrWE5GCQ==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz",
"integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==",
"license": "MIT",
"dependencies": {
"append-field": "^1.0.0",
@ -32785,9 +32623,9 @@
"license": "MIT"
},
"node_modules/ng-extract-i18n-merge": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ng-extract-i18n-merge/-/ng-extract-i18n-merge-3.0.0.tgz",
"integrity": "sha512-vTWtAz6a/wVYxnUMFHp1ur6o4JSLm+LcxdSMV8o8Ml2p5oCsSB4iFd5E6h8Yb8X8D596qyBz0ELgiDmbn4YyRQ==",
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/ng-extract-i18n-merge/-/ng-extract-i18n-merge-3.1.0.tgz",
"integrity": "sha512-4rJRcpTcP54xf5cjoz3S1By0T04X2RoyQcMDxr4wLdRx3fVxkeP8jeuLzmj9F4G5n0yMQb+6jhUiFERxpkfs1w==",
"license": "MIT",
"dependencies": {
"@angular-devkit/architect": "^0.2000.0",
@ -34756,12 +34594,13 @@
"license": "ISC"
},
"node_modules/path-to-regexp": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
"integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
"integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
"license": "MIT",
"engines": {
"node": ">=16"
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
"node_modules/path-type": {
@ -36514,16 +36353,6 @@
"entities": "^2.0.0"
}
},
"node_modules/repeat-string": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
"integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10"
}
},
"node_modules/replace-in-file": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-8.3.0.tgz",
@ -38095,12 +37924,6 @@
"node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/simple-cbor": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/simple-cbor/-/simple-cbor-0.4.1.tgz",
"integrity": "sha512-rijcxtwx2b4Bje3sqeIqw5EeW7UlOIC4YfOdwqIKacpvRQ/D78bWg/4/0m5e0U91oKvlGh7LlJuZCu07ISCC7w==",
"license": "ISC"
},
"node_modules/sirv": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz",
@ -40056,6 +39879,7 @@
"version": "10.9.2",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
"integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@cspotcode/source-map-support": "^0.8.0",
@ -40233,16 +40057,10 @@
"node": "*"
}
},
"node_modules/tweetnacl": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
"integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
"license": "Unlicense"
},
"node_modules/twitter-api-v2": {
"version": "1.23.0",
"resolved": "https://registry.npmjs.org/twitter-api-v2/-/twitter-api-v2-1.23.0.tgz",
"integrity": "sha512-5i1agETVpTuY68Zuk9i2B3N9wHzc4JIWw0WKyG4CEaFv9mRKmU87roa+U1oYYXTChWb0HMcqfkwoBJHYmLbeDA==",
"version": "1.27.0",
"resolved": "https://registry.npmjs.org/twitter-api-v2/-/twitter-api-v2-1.27.0.tgz",
"integrity": "sha512-hbIFwzg0NeOcFOdmJqtKMCXjLjc0INff/7NwhnZ2zpnw65oku8i+0eMxo5M0iTc1hs+inD/IpDw3S0Xh2c45QQ==",
"license": "Apache-2.0"
},
"node_modules/type-check": {
@ -40809,6 +40627,7 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
"dev": true,
"license": "MIT"
},
"node_modules/v8-to-istanbul": {
@ -41124,20 +40943,6 @@
"license": "MIT",
"optional": true
},
"node_modules/webcrypto-core": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.8.1.tgz",
"integrity": "sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==",
"license": "MIT",
"peer": true,
"dependencies": {
"@peculiar/asn1-schema": "^2.3.13",
"@peculiar/json-schema": "^1.1.12",
"asn1js": "^3.0.5",
"pvtsutils": "^1.3.5",
"tslib": "^2.7.0"
}
},
"node_modules/webidl-conversions": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
@ -42438,6 +42243,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"

31
package.json

@ -1,6 +1,6 @@
{
"name": "ghostfolio",
"version": "2.211.0",
"version": "2.214.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
@ -69,25 +69,20 @@
"@angular/service-worker": "20.2.4",
"@codewithdan/observable-store": "2.2.15",
"@date-fns/utc": "2.1.0",
"@dfinity/agent": "0.15.7",
"@dfinity/auth-client": "0.15.7",
"@dfinity/candid": "0.15.7",
"@dfinity/identity": "0.15.7",
"@dfinity/principal": "0.15.7",
"@internationalized/number": "3.6.3",
"@ionic/angular": "8.7.3",
"@keyv/redis": "4.4.0",
"@nestjs/bull": "11.0.2",
"@nestjs/bull": "11.0.4",
"@nestjs/cache-manager": "3.0.1",
"@nestjs/common": "11.1.3",
"@nestjs/common": "11.1.8",
"@nestjs/config": "4.0.2",
"@nestjs/core": "11.1.3",
"@nestjs/core": "11.1.8",
"@nestjs/event-emitter": "3.0.1",
"@nestjs/jwt": "11.0.0",
"@nestjs/jwt": "11.0.1",
"@nestjs/passport": "11.0.5",
"@nestjs/platform-express": "11.1.3",
"@nestjs/schedule": "6.0.0",
"@nestjs/serve-static": "5.0.3",
"@nestjs/platform-express": "11.1.8",
"@nestjs/schedule": "6.0.1",
"@nestjs/serve-static": "5.0.4",
"@openrouter/ai-sdk-provider": "0.7.2",
"@prisma/client": "6.18.0",
"@simplewebauthn/browser": "13.1.0",
@ -108,7 +103,7 @@
"class-validator": "0.14.2",
"color": "5.0.0",
"countries-and-timezones": "3.8.0",
"countries-list": "3.1.1",
"countries-list": "3.2.0",
"countup.js": "2.9.0",
"date-fns": "4.1.0",
"dotenv": "17.2.3",
@ -123,7 +118,7 @@
"lodash": "4.17.21",
"marked": "15.0.4",
"ms": "3.0.0-canary.1",
"ng-extract-i18n-merge": "3.0.0",
"ng-extract-i18n-merge": "3.1.0",
"ngx-device-detector": "10.1.0",
"ngx-markdown": "20.0.0",
"ngx-skeleton-loader": "11.3.0",
@ -139,7 +134,7 @@
"stripe": "18.5.0",
"svgmap": "2.12.2",
"tablemark": "4.1.0",
"twitter-api-v2": "1.23.0",
"twitter-api-v2": "1.27.0",
"uuid": "11.1.0",
"yahoo-finance2": "3.10.0",
"zone.js": "0.15.1"
@ -158,8 +153,8 @@
"@angular/pwa": "20.2.2",
"@eslint/eslintrc": "3.3.1",
"@eslint/js": "9.35.0",
"@nestjs/schematics": "11.0.5",
"@nestjs/testing": "11.1.3",
"@nestjs/schematics": "11.0.9",
"@nestjs/testing": "11.1.8",
"@nx/angular": "21.5.1",
"@nx/cypress": "21.5.1",
"@nx/eslint-plugin": "21.5.1",

8
test/import/not-ok/invalid-data-source.json

@ -14,5 +14,11 @@
"type": "BUY",
"unitPrice": 100.0
}
]
],
"user": {
"settings": {
"currency": "USD",
"performanceCalculationType": "ROAI"
}
}
}

8
test/import/not-ok/invalid-date-before-min.json

@ -14,5 +14,11 @@
"type": "BUY",
"unitPrice": 100.0
}
]
],
"user": {
"settings": {
"currency": "USD",
"performanceCalculationType": "ROAI"
}
}
}

8
test/import/not-ok/invalid-date.json

@ -14,5 +14,11 @@
"type": "BUY",
"unitPrice": 100.0
}
]
],
"user": {
"settings": {
"currency": "USD",
"performanceCalculationType": "ROAI"
}
}
}

8
test/import/not-ok/invalid-symbol.json

@ -14,5 +14,11 @@
"type": "BUY",
"unitPrice": 100.0
}
]
],
"user": {
"settings": {
"currency": "USD",
"performanceCalculationType": "ROAI"
}
}
}

8
test/import/not-ok/invalid-type.json

@ -14,5 +14,11 @@
"type": "<invalid>",
"unitPrice": 100.0
}
]
],
"user": {
"settings": {
"currency": "USD",
"performanceCalculationType": "ROAI"
}
}
}

8
test/import/not-ok/unavailable-exchange-rate.json

@ -15,5 +15,11 @@
"date": "1990-01-01T00:00:00.000Z",
"symbol": "MSFT"
}
]
],
"user": {
"settings": {
"currency": "USD",
"performanceCalculationType": "ROAI"
}
}
}

3
test/import/ok/500-activities.json

@ -6019,7 +6019,8 @@
],
"user": {
"settings": {
"currency": "USD"
"currency": "USD",
"performanceCalculationType": "ROAI"
}
}
}

3
test/import/ok/btceur.json

@ -23,7 +23,8 @@
],
"user": {
"settings": {
"currency": "USD"
"currency": "USD",
"performanceCalculationType": "ROAI"
}
}
}

3
test/import/ok/btcusd-short.json

@ -36,7 +36,8 @@
],
"user": {
"settings": {
"currency": "USD"
"currency": "USD",
"performanceCalculationType": "ROAI"
}
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save