Browse Source

Merge branch 'main' into feature/annualized_dividend_yield_in_summary

pull/6258/head
Sven Günther 1 week ago
committed by GitHub
parent
commit
3df6adc9a0
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 12
      CHANGELOG.md
  2. 4
      apps/api/src/app/admin/admin.service.ts
  3. 134
      apps/api/src/app/import/import.service.ts
  4. 25
      apps/api/src/app/order/order.controller.ts
  5. 43
      apps/api/src/assets/cryptocurrencies/cryptocurrencies.json
  6. 118
      apps/api/src/services/data-provider/data-provider.service.ts
  7. 5
      apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
  8. 20
      apps/client/src/locales/messages.ca.xlf
  9. 20
      apps/client/src/locales/messages.de.xlf
  10. 28
      apps/client/src/locales/messages.es.xlf
  11. 20
      apps/client/src/locales/messages.fr.xlf
  12. 20
      apps/client/src/locales/messages.it.xlf
  13. 20
      apps/client/src/locales/messages.ko.xlf
  14. 20
      apps/client/src/locales/messages.nl.xlf
  15. 20
      apps/client/src/locales/messages.pl.xlf
  16. 20
      apps/client/src/locales/messages.pt.xlf
  17. 20
      apps/client/src/locales/messages.tr.xlf
  18. 20
      apps/client/src/locales/messages.uk.xlf
  19. 19
      apps/client/src/locales/messages.xlf
  20. 20
      apps/client/src/locales/messages.zh.xlf
  21. 3
      libs/common/src/lib/types/market-data-preset.type.ts
  22. 10
      libs/ui/src/lib/account-balances/account-balances.component.html
  23. 68
      libs/ui/src/lib/account-balances/account-balances.component.ts
  24. 2
      libs/ui/src/lib/accounts-table/accounts-table.component.ts
  25. 4
      package-lock.json
  26. 2
      package.json

12
CHANGELOG.md

@ -10,11 +10,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added ### Added
- Added the dividend yield (trailing twelve months) to the portfolio summary (experimental) - Added the dividend yield (trailing twelve months) to the portfolio summary (experimental)
### Changed
- Refreshed the cryptocurrencies list
- Improved the language localization for Spanish (`es`)
## 2.240.0 - 2026-02-18
### Added
- Added a _No Activities_ preset to the historical market data table of the admin control panel
- Added support for custom cryptocurrencies defined in the database - Added support for custom cryptocurrencies defined in the database
- Added support for the cryptocurrency _Sky_ - Added support for the cryptocurrency _Sky_
### Changed ### Changed
- Harmonized the validation for the create activity endpoint with the existing import activity logic
- Upgraded `marked` from version `17.0.1` to `17.0.2` - Upgraded `marked` from version `17.0.1` to `17.0.2`
- Upgraded `ngx-markdown` from version `21.0.1` to `21.1.0` - Upgraded `ngx-markdown` from version `21.0.1` to `21.1.0`

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

@ -225,6 +225,10 @@ export class AdminService {
presetId === 'ETF_WITHOUT_SECTORS' presetId === 'ETF_WITHOUT_SECTORS'
) { ) {
filters = [{ id: 'ETF', type: 'ASSET_SUB_CLASS' }]; filters = [{ id: 'ETF', type: 'ASSET_SUB_CLASS' }];
} else if (presetId === 'NO_ACTIVITIES') {
where.activities = {
none: {}
};
} }
const searchQuery = filters.find(({ type }) => { const searchQuery = filters.find(({ type }) => {

134
apps/api/src/app/import/import.service.ts

@ -3,7 +3,6 @@ import { OrderService } from '@ghostfolio/api/app/order/order.service';
import { PlatformService } from '@ghostfolio/api/app/platform/platform.service'; import { PlatformService } from '@ghostfolio/api/app/platform/platform.service';
import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service';
import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { ApiService } from '@ghostfolio/api/services/api/api.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
@ -33,7 +32,7 @@ import {
} from '@ghostfolio/common/types'; } from '@ghostfolio/common/types';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { DataSource, Prisma, SymbolProfile } from '@prisma/client'; import { DataSource, Prisma } from '@prisma/client';
import { Big } from 'big.js'; import { Big } from 'big.js';
import { endOfToday, isAfter, isSameSecond, parseISO } from 'date-fns'; import { endOfToday, isAfter, isSameSecond, parseISO } from 'date-fns';
import { omit, uniqBy } from 'lodash'; import { omit, uniqBy } from 'lodash';
@ -46,7 +45,6 @@ export class ImportService {
public constructor( public constructor(
private readonly accountService: AccountService, private readonly accountService: AccountService,
private readonly apiService: ApiService, private readonly apiService: ApiService,
private readonly configurationService: ConfigurationService,
private readonly dataGatheringService: DataGatheringService, private readonly dataGatheringService: DataGatheringService,
private readonly dataProviderService: DataProviderService, private readonly dataProviderService: DataProviderService,
private readonly exchangeRateDataService: ExchangeRateDataService, private readonly exchangeRateDataService: ExchangeRateDataService,
@ -395,7 +393,7 @@ export class ImportService {
} }
} }
const assetProfiles = await this.validateActivities({ const assetProfiles = await this.dataProviderService.validateActivities({
activitiesDto, activitiesDto,
assetProfilesWithMarketDataDto, assetProfilesWithMarketDataDto,
maxActivitiesToImport, maxActivitiesToImport,
@ -729,132 +727,4 @@ export class ImportService {
return uniqueAccountIds.size === 1; return uniqueAccountIds.size === 1;
} }
private async validateActivities({
activitiesDto,
assetProfilesWithMarketDataDto,
maxActivitiesToImport,
user
}: {
activitiesDto: Partial<CreateOrderDto>[];
assetProfilesWithMarketDataDto: ImportDataDto['assetProfiles'];
maxActivitiesToImport: number;
user: UserWithSettings;
}) {
if (activitiesDto?.length > maxActivitiesToImport) {
throw new Error(`Too many activities (${maxActivitiesToImport} at most)`);
}
const assetProfiles: {
[assetProfileIdentifier: string]: Partial<SymbolProfile>;
} = {};
const dataSources = await this.dataProviderService.getDataSources();
for (const [
index,
{ currency, dataSource, symbol, type }
] of activitiesDto.entries()) {
if (!dataSources.includes(dataSource)) {
throw new Error(
`activities.${index}.dataSource ("${dataSource}") is not valid`
);
}
if (
this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') &&
user.subscription.type === 'Basic'
) {
const dataProvider = this.dataProviderService.getDataProvider(
DataSource[dataSource]
);
if (dataProvider.getDataProviderInfo().isPremium) {
throw new Error(
`activities.${index}.dataSource ("${dataSource}") is not valid`
);
}
}
if (!assetProfiles[getAssetProfileIdentifier({ dataSource, symbol })]) {
if (['FEE', 'INTEREST', 'LIABILITY'].includes(type)) {
// Skip asset profile validation for FEE, INTEREST, and LIABILITY
// as these activity types don't require asset profiles
const assetProfileInImport = assetProfilesWithMarketDataDto?.find(
(profile) => {
return (
profile.dataSource === dataSource && profile.symbol === symbol
);
}
);
assetProfiles[getAssetProfileIdentifier({ dataSource, symbol })] = {
currency,
dataSource,
symbol,
name: assetProfileInImport?.name
};
continue;
}
let assetProfile: Partial<SymbolProfile> = { currency };
try {
assetProfile = (
await this.dataProviderService.getAssetProfiles([
{ dataSource, symbol }
])
)?.[symbol];
} catch {}
if (!assetProfile?.name) {
const assetProfileInImport = assetProfilesWithMarketDataDto?.find(
(profile) => {
return (
profile.dataSource === dataSource && profile.symbol === symbol
);
}
);
if (assetProfileInImport) {
// Merge all fields of custom asset profiles into the validation object
Object.assign(assetProfile, {
assetClass: assetProfileInImport.assetClass,
assetSubClass: assetProfileInImport.assetSubClass,
comment: assetProfileInImport.comment,
countries: assetProfileInImport.countries,
currency: assetProfileInImport.currency,
cusip: assetProfileInImport.cusip,
dataSource: assetProfileInImport.dataSource,
figi: assetProfileInImport.figi,
figiComposite: assetProfileInImport.figiComposite,
figiShareClass: assetProfileInImport.figiShareClass,
holdings: assetProfileInImport.holdings,
isActive: assetProfileInImport.isActive,
isin: assetProfileInImport.isin,
name: assetProfileInImport.name,
scraperConfiguration: assetProfileInImport.scraperConfiguration,
sectors: assetProfileInImport.sectors,
symbol: assetProfileInImport.symbol,
symbolMapping: assetProfileInImport.symbolMapping,
url: assetProfileInImport.url
});
}
}
if (!['FEE', 'INTEREST', 'LIABILITY'].includes(type)) {
if (!assetProfile?.name) {
throw new Error(
`activities.${index}.symbol ("${symbol}") is not valid for the specified data source ("${dataSource}")`
);
}
}
assetProfiles[getAssetProfileIdentifier({ dataSource, symbol })] =
assetProfile;
}
}
return assetProfiles;
}
} }

25
apps/api/src/app/order/order.controller.ts

@ -4,6 +4,7 @@ import { RedactValuesInResponseInterceptor } from '@ghostfolio/api/interceptors/
import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor';
import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor'; import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor';
import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { ApiService } from '@ghostfolio/api/services/api/api.service';
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service';
import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service';
import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper'; import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper';
@ -46,6 +47,7 @@ import { OrderService } from './order.service';
export class OrderController { export class OrderController {
public constructor( public constructor(
private readonly apiService: ApiService, private readonly apiService: ApiService,
private readonly dataProviderService: DataProviderService,
private readonly dataGatheringService: DataGatheringService, private readonly dataGatheringService: DataGatheringService,
private readonly impersonationService: ImpersonationService, private readonly impersonationService: ImpersonationService,
private readonly orderService: OrderService, private readonly orderService: OrderService,
@ -190,6 +192,29 @@ export class OrderController {
@UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseGuards(AuthGuard('jwt'), HasPermissionGuard)
@UseInterceptors(TransformDataSourceInRequestInterceptor) @UseInterceptors(TransformDataSourceInRequestInterceptor)
public async createOrder(@Body() data: CreateOrderDto): Promise<OrderModel> { public async createOrder(@Body() data: CreateOrderDto): Promise<OrderModel> {
try {
await this.dataProviderService.validateActivities({
activitiesDto: [
{
currency: data.currency,
dataSource: data.dataSource,
symbol: data.symbol,
type: data.type
}
],
maxActivitiesToImport: 1,
user: this.request.user
});
} catch (error) {
throw new HttpException(
{
error: getReasonPhrase(StatusCodes.BAD_REQUEST),
message: [error.message]
},
StatusCodes.BAD_REQUEST
);
}
const currency = data.currency; const currency = data.currency;
const customCurrency = data.customCurrency; const customCurrency = data.customCurrency;
const dataSource = data.dataSource; const dataSource = data.dataSource;

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

@ -421,6 +421,7 @@
"AGS": "Aegis", "AGS": "Aegis",
"AGT": "Alaya Governance Token", "AGT": "Alaya Governance Token",
"AGURI": "Aguri-Chan", "AGURI": "Aguri-Chan",
"AGUSTO": "Agusto",
"AGV": "Astra Guild Ventures", "AGV": "Astra Guild Ventures",
"AGVC": "AgaveCoin", "AGVC": "AgaveCoin",
"AGVE": "Agave", "AGVE": "Agave",
@ -662,6 +663,7 @@
"ALN": "Aluna", "ALN": "Aluna",
"ALNV1": "Aluna v1", "ALNV1": "Aluna v1",
"ALOHA": "Aloha", "ALOHA": "Aloha",
"ALOKA": "ALOKA",
"ALON": "Alon", "ALON": "Alon",
"ALOR": "The Algorix", "ALOR": "The Algorix",
"ALOT": "Dexalot", "ALOT": "Dexalot",
@ -708,6 +710,7 @@
"AMADEUS": "AMADEUS", "AMADEUS": "AMADEUS",
"AMAL": "AMAL", "AMAL": "AMAL",
"AMAPT": "Amnis Finance", "AMAPT": "Amnis Finance",
"AMARA": "AMARA",
"AMATEN": "Amaten", "AMATEN": "Amaten",
"AMATO": "AMATO", "AMATO": "AMATO",
"AMAZINGTEAM": "AmazingTeamDAO", "AMAZINGTEAM": "AmazingTeamDAO",
@ -1344,6 +1347,7 @@
"AZIT": "Azit", "AZIT": "Azit",
"AZNX": "AstraZeneca xStock", "AZNX": "AstraZeneca xStock",
"AZR": "Azure", "AZR": "Azure",
"AZTEC": "AZTEC",
"AZU": "Azultec", "AZU": "Azultec",
"AZUKI": "Azuki", "AZUKI": "Azuki",
"AZUKI2": "AZUKI 2.0", "AZUKI2": "AZUKI 2.0",
@ -1373,6 +1377,7 @@
"BABI": "Babylons", "BABI": "Babylons",
"BABL": "Babylon Finance", "BABL": "Babylon Finance",
"BABY": "Babylon", "BABY": "Babylon",
"BABY4": "Baby 4",
"BABYANDY": "Baby Andy", "BABYANDY": "Baby Andy",
"BABYASTER": "Baby Aster", "BABYASTER": "Baby Aster",
"BABYB": "Baby Bali", "BABYB": "Baby Bali",
@ -2342,6 +2347,7 @@
"BNPL": "BNPL Pay", "BNPL": "BNPL Pay",
"BNR": "BiNeuro", "BNR": "BiNeuro",
"BNRTX": "BnrtxCoin", "BNRTX": "BnrtxCoin",
"BNRY": "Binary Coin",
"BNS": "BNS token", "BNS": "BNS token",
"BNSAI": "bonsAI Network", "BNSAI": "bonsAI Network",
"BNSD": "BNSD Finance", "BNSD": "BNSD Finance",
@ -2526,9 +2532,10 @@
"BOSSCOQ": "THE COQFATHER", "BOSSCOQ": "THE COQFATHER",
"BOST": "BoostCoin", "BOST": "BoostCoin",
"BOSU": "Bosu Inu", "BOSU": "Bosu Inu",
"BOT": "Bot Planet", "BOT": "HyperBot",
"BOTC": "BotChain", "BOTC": "BotChain",
"BOTIFY": "BOTIFY", "BOTIFY": "BOTIFY",
"BOTPLANET": "Bot Planet",
"BOTS": "ArkDAO", "BOTS": "ArkDAO",
"BOTTO": "Botto", "BOTTO": "Botto",
"BOTX": "BOTXCOIN", "BOTX": "BOTXCOIN",
@ -3201,6 +3208,7 @@
"CATCO": "CatCoin", "CATCO": "CatCoin",
"CATCOIN": "CatCoin", "CATCOIN": "CatCoin",
"CATCOINETH": "Catcoin", "CATCOINETH": "Catcoin",
"CATCOINIO": "Catcoin",
"CATCOINOFSOL": "Cat Coin", "CATCOINOFSOL": "Cat Coin",
"CATCOINV2": "CatCoin Cash", "CATCOINV2": "CatCoin Cash",
"CATDOG": "Cat-Dog", "CATDOG": "Cat-Dog",
@ -3583,6 +3591,7 @@
"CIC": "Crazy Internet Coin", "CIC": "Crazy Internet Coin",
"CICHAIN": "CIChain", "CICHAIN": "CIChain",
"CIF": "Crypto Improvement Fund", "CIF": "Crypto Improvement Fund",
"CIFRON": "Cipher Mining (Ondo Tokenized)",
"CIG": "cig", "CIG": "cig",
"CIM": "COINCOME", "CIM": "COINCOME",
"CIN": "CinderCoin", "CIN": "CinderCoin",
@ -3718,6 +3727,7 @@
"CMPT": "Spatial Computing", "CMPT": "Spatial Computing",
"CMPV2": "Caduceus Protocol", "CMPV2": "Caduceus Protocol",
"CMQ": "Communique", "CMQ": "Communique",
"CMR": "U.S Critical Mineral Reserve",
"CMS": "COMSA", "CMS": "COMSA",
"CMSN": "The Commission", "CMSN": "The Commission",
"CMT": "CyberMiles", "CMT": "CyberMiles",
@ -4630,6 +4640,7 @@
"DEFIL": "DeFIL", "DEFIL": "DeFIL",
"DEFILAB": "Defi", "DEFILAB": "Defi",
"DEFISCALE": "DeFiScale", "DEFISCALE": "DeFiScale",
"DEFISSI": "DEFI.ssi",
"DEFIT": "Digital Fitness", "DEFIT": "Digital Fitness",
"DEFLA": "Defla", "DEFLA": "Defla",
"DEFLCT": "Deflect", "DEFLCT": "Deflect",
@ -6323,7 +6334,7 @@
"FIFTY": "FIFTYONEFIFTY", "FIFTY": "FIFTYONEFIFTY",
"FIG": "FlowCom", "FIG": "FlowCom",
"FIGH": "FIGHT FIGHT FIGHT", "FIGH": "FIGHT FIGHT FIGHT",
"FIGHT": "Fight to MAGA", "FIGHT2MAGA": "Fight to MAGA",
"FIGHTMAGA": "FIGHT MAGA", "FIGHTMAGA": "FIGHT MAGA",
"FIGHTPEPE": "FIGHT PEPE", "FIGHTPEPE": "FIGHT PEPE",
"FIGHTRUMP": "FIGHT TRUMP", "FIGHTRUMP": "FIGHT TRUMP",
@ -8039,6 +8050,7 @@
"HONOR": "HonorLand", "HONOR": "HonorLand",
"HONX": "Honeywell xStock", "HONX": "Honeywell xStock",
"HOODOG": "Hoodog", "HOODOG": "Hoodog",
"HOODON": "Robinhood Markets (Ondo Tokenized)",
"HOODRAT": "Hoodrat Coin", "HOODRAT": "Hoodrat Coin",
"HOODX": "Robinhood xStock", "HOODX": "Robinhood xStock",
"HOOF": "Metaderby Hoof", "HOOF": "Metaderby Hoof",
@ -8395,6 +8407,7 @@
"IMS": "Independent Money System", "IMS": "Independent Money System",
"IMST": "Imsmart", "IMST": "Imsmart",
"IMT": "Immortal Token", "IMT": "Immortal Token",
"IMU": "Immunefi",
"IMUSIFY": "imusify", "IMUSIFY": "imusify",
"IMVR": "ImmVRse", "IMVR": "ImmVRse",
"IMX": "Immutable X", "IMX": "Immutable X",
@ -8750,6 +8763,7 @@
"JFIVE": "Jonny Five", "JFIVE": "Jonny Five",
"JFOX": "JuniperFox AI", "JFOX": "JuniperFox AI",
"JFP": "JUSTICE FOR PEANUT", "JFP": "JUSTICE FOR PEANUT",
"JGGL": "JGGL Token",
"JGLP": "Jones GLP", "JGLP": "Jones GLP",
"JGN": "Juggernaut", "JGN": "Juggernaut",
"JHH": "Jen-Hsun Huang", "JHH": "Jen-Hsun Huang",
@ -9891,7 +9905,7 @@
"LRN": "Loopring [NEO]", "LRN": "Loopring [NEO]",
"LRT": "LandRocker", "LRT": "LandRocker",
"LSC": "LS Coin", "LSC": "LS Coin",
"LSD": "Pontem Liquidswap", "LSD": "LSD",
"LSDOGE": "LSDoge", "LSDOGE": "LSDoge",
"LSETH": "Liquid Staked ETH", "LSETH": "Liquid Staked ETH",
"LSHARE": "LSHARE", "LSHARE": "LSHARE",
@ -10167,8 +10181,7 @@
"MANUSAI": "Manus AI Agent", "MANUSAI": "Manus AI Agent",
"MANYU": "Manyu", "MANYU": "Manyu",
"MANYUDOG": "MANYU", "MANYUDOG": "MANYU",
"MAO": "MAO", "MAO": "Mao",
"MAOMEME": "Mao",
"MAOW": "MAOW", "MAOW": "MAOW",
"MAP": "MAP Protocol", "MAP": "MAP Protocol",
"MAPC": "MapCoin", "MAPC": "MapCoin",
@ -10631,6 +10644,7 @@
"MICRO": "Micro GPT", "MICRO": "Micro GPT",
"MICRODOGE": "MicroDoge", "MICRODOGE": "MicroDoge",
"MICROMINES": "Micromines", "MICROMINES": "Micromines",
"MICROVISION": "MicroVisionChain",
"MIDAI": "Midway AI", "MIDAI": "Midway AI",
"MIDAS": "Midas", "MIDAS": "Midas",
"MIDASDOLLAR": "Midas Dollar Share", "MIDASDOLLAR": "Midas Dollar Share",
@ -13146,6 +13160,7 @@
"PONKE": "Ponke", "PONKE": "Ponke",
"PONKEBNB": "Ponke BNB", "PONKEBNB": "Ponke BNB",
"PONKEI": "Chinese Ponkei the Original", "PONKEI": "Chinese Ponkei the Original",
"PONTEM": "Pontem Liquidswap",
"PONYO": "Ponyo Impact", "PONYO": "Ponyo Impact",
"PONZI": "Ponzi", "PONZI": "Ponzi",
"PONZIO": "Ponzio The Cat", "PONZIO": "Ponzio The Cat",
@ -13573,6 +13588,7 @@
"QNX": "QueenDex Coin", "QNX": "QueenDex Coin",
"QOBI": "Qobit", "QOBI": "Qobit",
"QOM": "Shiba Predator", "QOM": "Shiba Predator",
"QONE": "QONE",
"QOOB": "QOOBER", "QOOB": "QOOBER",
"QORA": "QoraCoin", "QORA": "QoraCoin",
"QORPO": "QORPO WORLD", "QORPO": "QORPO WORLD",
@ -15153,6 +15169,7 @@
"SNAP": "SnapEx", "SNAP": "SnapEx",
"SNAPCAT": "Snapcat", "SNAPCAT": "Snapcat",
"SNAPKERO": "SNAP", "SNAPKERO": "SNAP",
"SNAPON": "Snap (Ondo Tokenized)",
"SNB": "SynchroBitcoin", "SNB": "SynchroBitcoin",
"SNC": "SunContract", "SNC": "SunContract",
"SNCT": "SnakeCity", "SNCT": "SnakeCity",
@ -15380,7 +15397,7 @@
"SP8DE": "Sp8de", "SP8DE": "Sp8de",
"SPA": "Sperax", "SPA": "Sperax",
"SPAC": "SPACE DOGE", "SPAC": "SPACE DOGE",
"SPACE": "MicroVisionChain", "SPACE": "Spacecoin",
"SPACECOIN": "SpaceCoin", "SPACECOIN": "SpaceCoin",
"SPACED": "SPACE DRAGON", "SPACED": "SPACE DRAGON",
"SPACEHAMSTER": "Space Hamster", "SPACEHAMSTER": "Space Hamster",
@ -15868,6 +15885,7 @@
"SUPERCYCLE": "Crypto SuperCycle", "SUPERCYCLE": "Crypto SuperCycle",
"SUPERDAPP": "SuperDapp", "SUPERDAPP": "SuperDapp",
"SUPERF": "SUPER FLOKI", "SUPERF": "SUPER FLOKI",
"SUPERFL": "Superfluid",
"SUPERGROK": "SuperGrok", "SUPERGROK": "SuperGrok",
"SUPEROETHB": "Super OETH", "SUPEROETHB": "Super OETH",
"SUPERT": "Super Trump", "SUPERT": "Super Trump",
@ -16790,6 +16808,7 @@
"TSLAON": "Tesla (Ondo Tokenized)", "TSLAON": "Tesla (Ondo Tokenized)",
"TSLAX": "Tesla xStock", "TSLAX": "Tesla xStock",
"TSLT": "Tamkin", "TSLT": "Tamkin",
"TSMON": "Taiwan Semiconductor Manufacturing (Ondo Tokenized)",
"TSN": "Tsunami Exchange Token", "TSN": "Tsunami Exchange Token",
"TSO": "Thesirion", "TSO": "Thesirion",
"TSOTCHKE": "tsotchke", "TSOTCHKE": "tsotchke",
@ -17181,8 +17200,10 @@
"USDL": "Lift Dollar", "USDL": "Lift Dollar",
"USDM": "USDM", "USDM": "USDM",
"USDMA": "USD mars", "USDMA": "USD mars",
"USDN": "Neutral AI", "USDN": "Ultimate Synthetic Delta Neutral",
"USDNEUTRAL": "Neutral AI",
"USDO": "USD Open Dollar", "USDO": "USD Open Dollar",
"USDON": "U.S. Dollar Tokenized Currency (Ondo)",
"USDP": "Pax Dollar", "USDP": "Pax Dollar",
"USDPLUS": "Overnight.fi USD+", "USDPLUS": "Overnight.fi USD+",
"USDQ": "Quantoz USDQ", "USDQ": "Quantoz USDQ",
@ -17456,6 +17477,7 @@
"VIDZ": "PureVidz", "VIDZ": "PureVidz",
"VIEW": "Viewly", "VIEW": "Viewly",
"VIG": "TheVig", "VIG": "TheVig",
"VIGI": "Vigi",
"VIK": "VIKTAMA", "VIK": "VIKTAMA",
"VIKITA": "VIKITA", "VIKITA": "VIKITA",
"VIKKY": "VikkyToken", "VIKKY": "VikkyToken",
@ -17513,6 +17535,7 @@
"VLC": "Volcano Uni", "VLC": "Volcano Uni",
"VLDY": "Validity", "VLDY": "Validity",
"VLK": "Vulkania", "VLK": "Vulkania",
"VLR": "Velora",
"VLS": "Veles", "VLS": "Veles",
"VLT": "Veltor", "VLT": "Veltor",
"VLTC": "Venus LTC", "VLTC": "Venus LTC",
@ -17733,6 +17756,7 @@
"WANUSDT": "wanUSDT", "WANUSDT": "wanUSDT",
"WAP": "Wet Ass Pussy", "WAP": "Wet Ass Pussy",
"WAR": "WAR", "WAR": "WAR",
"WARD": "Warden",
"WARP": "WarpCoin", "WARP": "WarpCoin",
"WARPED": "Warped Games", "WARPED": "Warped Games",
"WARPIE": "Warpie", "WARPIE": "Warpie",
@ -18494,6 +18518,7 @@
"XP": "Xphere", "XP": "Xphere",
"XPA": "XPA", "XPA": "XPA",
"XPARTY": "X Party", "XPARTY": "X Party",
"XPASS": "XPASS Token",
"XPAT": "Bitnation Pangea", "XPAT": "Bitnation Pangea",
"XPAY": "Wallet Pay", "XPAY": "Wallet Pay",
"XPB": "Pebble Coin", "XPB": "Pebble Coin",
@ -18869,8 +18894,7 @@
"ZEBU": "ZEBU", "ZEBU": "ZEBU",
"ZEC": "ZCash", "ZEC": "ZCash",
"ZECD": "ZCashDarkCoin", "ZECD": "ZCashDarkCoin",
"ZED": "ZED Token", "ZED": "ZedCoins",
"ZEDCOIN": "ZedCoin",
"ZEDD": "ZedDex", "ZEDD": "ZedDex",
"ZEDTOKEN": "Zed Token", "ZEDTOKEN": "Zed Token",
"ZEDX": "ZEDX Сoin", "ZEDX": "ZEDX Сoin",
@ -19108,6 +19132,7 @@
"币安人生": "币安人生", "币安人生": "币安人生",
"恶俗企鹅": "恶俗企鹅", "恶俗企鹅": "恶俗企鹅",
"我踏马来了": "我踏马来了", "我踏马来了": "我踏马来了",
"狗屎": "狗屎",
"老子": "老子", "老子": "老子",
"雪球": "雪球", "雪球": "雪球",
"黑马": "黑马" "黑马": "黑马"

118
apps/api/src/services/data-provider/data-provider.service.ts

@ -1,3 +1,4 @@
import { ImportDataDto } from '@ghostfolio/api/app/import/import-data.dto';
import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
@ -10,8 +11,10 @@ import {
PROPERTY_API_KEY_GHOSTFOLIO, PROPERTY_API_KEY_GHOSTFOLIO,
PROPERTY_DATA_SOURCE_MAPPING PROPERTY_DATA_SOURCE_MAPPING
} from '@ghostfolio/common/config'; } from '@ghostfolio/common/config';
import { CreateOrderDto } from '@ghostfolio/common/dtos';
import { import {
DATE_FORMAT, DATE_FORMAT,
getAssetProfileIdentifier,
getCurrencyFromSymbol, getCurrencyFromSymbol,
getStartOfUtcDate, getStartOfUtcDate,
isCurrency, isCurrency,
@ -185,6 +188,121 @@ export class DataProviderService implements OnModuleInit {
return dataSources.sort(); return dataSources.sort();
} }
public async validateActivities({
activitiesDto,
assetProfilesWithMarketDataDto,
maxActivitiesToImport,
user
}: {
activitiesDto: Pick<
Partial<CreateOrderDto>,
'currency' | 'dataSource' | 'symbol' | 'type'
>[];
assetProfilesWithMarketDataDto?: ImportDataDto['assetProfiles'];
maxActivitiesToImport: number;
user: UserWithSettings;
}) {
if (activitiesDto?.length > maxActivitiesToImport) {
throw new Error(`Too many activities (${maxActivitiesToImport} at most)`);
}
const assetProfiles: {
[assetProfileIdentifier: string]: Partial<SymbolProfile>;
} = {};
const dataSources = await this.getDataSources();
for (const [
index,
{ currency, dataSource, symbol, type }
] of activitiesDto.entries()) {
const activityPath =
maxActivitiesToImport === 1 ? 'activity' : `activities.${index}`;
if (!dataSources.includes(dataSource)) {
throw new Error(
`${activityPath}.dataSource ("${dataSource}") is not valid`
);
}
if (
this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') &&
user.subscription.type === 'Basic'
) {
const dataProvider = this.getDataProvider(DataSource[dataSource]);
if (dataProvider.getDataProviderInfo().isPremium) {
throw new Error(
`${activityPath}.dataSource ("${dataSource}") is not valid`
);
}
}
const assetProfileIdentifier = getAssetProfileIdentifier({
dataSource,
symbol
});
if (!assetProfiles[assetProfileIdentifier]) {
if (['FEE', 'INTEREST', 'LIABILITY'].includes(type)) {
const assetProfileInImport = assetProfilesWithMarketDataDto?.find(
(profile) => {
return (
profile.dataSource === dataSource && profile.symbol === symbol
);
}
);
assetProfiles[assetProfileIdentifier] = {
currency,
dataSource,
symbol,
name: assetProfileInImport?.name
};
continue;
}
let assetProfile: Partial<SymbolProfile> = { currency };
try {
assetProfile = (
await this.getAssetProfiles([
{
dataSource,
symbol
}
])
)?.[symbol];
} catch {}
if (!assetProfile?.name) {
const assetProfileInImport = assetProfilesWithMarketDataDto?.find(
(profile) => {
return (
profile.dataSource === dataSource && profile.symbol === symbol
);
}
);
if (assetProfileInImport) {
Object.assign(assetProfile, assetProfileInImport);
}
}
if (!assetProfile?.name) {
throw new Error(
`activities.${index}.symbol ("${symbol}") is not valid for the specified data source ("${dataSource}")`
);
}
assetProfiles[assetProfileIdentifier] = assetProfile;
}
}
return assetProfiles;
}
public async getDividends({ public async getDividends({
dataSource, dataSource,
from, from,

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

@ -140,6 +140,11 @@ export class GfAdminMarketDataComponent
id: 'ETF_WITHOUT_SECTORS', id: 'ETF_WITHOUT_SECTORS',
label: $localize`ETFs without Sectors`, label: $localize`ETFs without Sectors`,
type: 'PRESET_ID' as Filter['type'] type: 'PRESET_ID' as Filter['type']
},
{
id: 'NO_ACTIVITIES',
label: $localize`No Activities`,
type: 'PRESET_ID' as Filter['type']
} }
]; ];
public benchmarks: Partial<SymbolProfile>[]; public benchmarks: Partial<SymbolProfile>[];

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

@ -895,7 +895,7 @@
<target state="translated">Filtra per...</target> <target state="translated">Filtra per...</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">390</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6182733719813772142" datatype="html"> <trans-unit id="6182733719813772142" datatype="html">
@ -935,7 +935,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">40</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6130372166370766747" datatype="html"> <trans-unit id="6130372166370766747" datatype="html">
@ -1003,7 +1003,7 @@
<target state="translated">Oooh! No s’han pogut recopilar les dades históriques.</target> <target state="translated">Oooh! No s’han pogut recopilar les dades históriques.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context>
<context context-type="linenumber">262</context> <context context-type="linenumber">284</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4405333887341433096" datatype="html"> <trans-unit id="4405333887341433096" datatype="html">
@ -1035,7 +1035,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">71</context> <context context-type="linenumber">67</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5299488188278756127" datatype="html"> <trans-unit id="5299488188278756127" datatype="html">
@ -5924,6 +5924,14 @@
<context context-type="linenumber">27</context> <context context-type="linenumber">27</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="9218541487912911620" datatype="html">
<source>No Activities</source>
<target state="new">No Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit id="9219851060664514927" datatype="html"> <trans-unit id="9219851060664514927" datatype="html">
<source>Retirement Provision</source> <source>Retirement Provision</source>
<target state="translated">Provisió de jubilació</target> <target state="translated">Provisió de jubilació</target>
@ -6757,7 +6765,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">46</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context> <context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -7335,7 +7343,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">48</context> <context context-type="linenumber">49</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7156797854368699223" datatype="html"> <trans-unit id="7156797854368699223" datatype="html">

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

@ -506,7 +506,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">40</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8122024350760043460" datatype="html"> <trans-unit id="8122024350760043460" datatype="html">
@ -2630,7 +2630,7 @@
<target state="translated">Filtern nach...</target> <target state="translated">Filtern nach...</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">390</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1965206604774400" datatype="html"> <trans-unit id="1965206604774400" datatype="html">
@ -3234,7 +3234,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">71</context> <context context-type="linenumber">67</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4798457301875181136" datatype="html"> <trans-unit id="4798457301875181136" datatype="html">
@ -3357,6 +3357,14 @@
<context context-type="linenumber">22</context> <context context-type="linenumber">22</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="9218541487912911620" datatype="html">
<source>No Activities</source>
<target state="new">No Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit id="9219851060664514927" datatype="html"> <trans-unit id="9219851060664514927" datatype="html">
<source>Retirement Provision</source> <source>Retirement Provision</source>
<target state="translated">Altersvorsorge</target> <target state="translated">Altersvorsorge</target>
@ -5716,7 +5724,7 @@
<target state="translated">Ups! Die historischen Daten konnten nicht geparsed werden.</target> <target state="translated">Ups! Die historischen Daten konnten nicht geparsed werden.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context>
<context context-type="linenumber">262</context> <context context-type="linenumber">284</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="297546430113071258" datatype="html"> <trans-unit id="297546430113071258" datatype="html">
@ -6781,7 +6789,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">46</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context> <context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -7359,7 +7367,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">48</context> <context context-type="linenumber">49</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7156797854368699223" datatype="html"> <trans-unit id="7156797854368699223" datatype="html">

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

@ -507,7 +507,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">40</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8122024350760043460" datatype="html"> <trans-unit id="8122024350760043460" datatype="html">
@ -2615,7 +2615,7 @@
<target state="translated">Filtrar por...</target> <target state="translated">Filtrar por...</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">390</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5342721262799645301" datatype="html"> <trans-unit id="5342721262799645301" datatype="html">
@ -3219,7 +3219,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">71</context> <context context-type="linenumber">67</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4798457301875181136" datatype="html"> <trans-unit id="4798457301875181136" datatype="html">
@ -3342,6 +3342,14 @@
<context context-type="linenumber">22</context> <context context-type="linenumber">22</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="9218541487912911620" datatype="html">
<source>No Activities</source>
<target state="new">No Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit id="9219851060664514927" datatype="html"> <trans-unit id="9219851060664514927" datatype="html">
<source>Retirement Provision</source> <source>Retirement Provision</source>
<target state="translated">Provisión de jubilación</target> <target state="translated">Provisión de jubilación</target>
@ -5693,7 +5701,7 @@
<target state="translated">¡Ups! No se pudieron analizar los datos históricos.</target> <target state="translated">¡Ups! No se pudieron analizar los datos históricos.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context>
<context context-type="linenumber">262</context> <context context-type="linenumber">284</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="297546430113071258" datatype="html"> <trans-unit id="297546430113071258" datatype="html">
@ -6758,7 +6766,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">46</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context> <context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -7336,7 +7344,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">48</context> <context context-type="linenumber">49</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7156797854368699223" datatype="html"> <trans-unit id="7156797854368699223" datatype="html">
@ -7883,7 +7891,7 @@
</trans-unit> </trans-unit>
<trans-unit id="rule.feeRatioInitialInvestment" datatype="html"> <trans-unit id="rule.feeRatioInitialInvestment" datatype="html">
<source>Fee Ratio (legacy)</source> <source>Fee Ratio (legacy)</source>
<target state="new">Relación de tarifas</target> <target state="translated">Relación de tarifas (heredado)</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">152</context> <context context-type="linenumber">152</context>
@ -7907,7 +7915,7 @@
</trans-unit> </trans-unit>
<trans-unit id="rule.feeRatioTotalInvestmentVolume" datatype="html"> <trans-unit id="rule.feeRatioTotalInvestmentVolume" datatype="html">
<source>Fee Ratio</source> <source>Fee Ratio</source>
<target state="new">Fee Ratio</target> <target state="translated">Relación de tarifas</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">161</context> <context context-type="linenumber">161</context>
@ -7915,7 +7923,7 @@
</trans-unit> </trans-unit>
<trans-unit id="rule.feeRatioTotalInvestmentVolume.false" datatype="html"> <trans-unit id="rule.feeRatioTotalInvestmentVolume.false" datatype="html">
<source>The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)</source> <source>The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)</source>
<target state="new">The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)</target> <target state="translated">Las tarifas superan el ${thresholdMax}% de su volumen total de inversión (${feeRatio}%)</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">163</context> <context context-type="linenumber">163</context>
@ -7923,7 +7931,7 @@
</trans-unit> </trans-unit>
<trans-unit id="rule.feeRatioTotalInvestmentVolume.true" datatype="html"> <trans-unit id="rule.feeRatioTotalInvestmentVolume.true" datatype="html">
<source>The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)</source> <source>The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)</source>
<target state="new">The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)</target> <target state="translated">Las tarifas no superan el ${thresholdMax}% de su volumen total de inversión (${feeRatio}%)</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">167</context> <context context-type="linenumber">167</context>

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

@ -530,7 +530,7 @@
<target state="translated">Filtrer par...</target> <target state="translated">Filtrer par...</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">390</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6182733719813772142" datatype="html"> <trans-unit id="6182733719813772142" datatype="html">
@ -570,7 +570,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">40</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6130372166370766747" datatype="html"> <trans-unit id="6130372166370766747" datatype="html">
@ -2222,7 +2222,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">71</context> <context context-type="linenumber">67</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2666668717343771434" datatype="html"> <trans-unit id="2666668717343771434" datatype="html">
@ -3341,6 +3341,14 @@
<context context-type="linenumber">22</context> <context context-type="linenumber">22</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="9218541487912911620" datatype="html">
<source>No Activities</source>
<target state="new">No Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit id="9219851060664514927" datatype="html"> <trans-unit id="9219851060664514927" datatype="html">
<source>Retirement Provision</source> <source>Retirement Provision</source>
<target state="translated">Réserve pour retraite</target> <target state="translated">Réserve pour retraite</target>
@ -5692,7 +5700,7 @@
<target state="translated">Oops! Echec du parsing des données historiques.</target> <target state="translated">Oops! Echec du parsing des données historiques.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context>
<context context-type="linenumber">262</context> <context context-type="linenumber">284</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="297546430113071258" datatype="html"> <trans-unit id="297546430113071258" datatype="html">
@ -6757,7 +6765,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">46</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context> <context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -7335,7 +7343,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">48</context> <context context-type="linenumber">49</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7156797854368699223" datatype="html"> <trans-unit id="7156797854368699223" datatype="html">

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

@ -507,7 +507,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">40</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8122024350760043460" datatype="html"> <trans-unit id="8122024350760043460" datatype="html">
@ -2615,7 +2615,7 @@
<target state="translated">Filtra per...</target> <target state="translated">Filtra per...</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">390</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5342721262799645301" datatype="html"> <trans-unit id="5342721262799645301" datatype="html">
@ -3219,7 +3219,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">71</context> <context context-type="linenumber">67</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4798457301875181136" datatype="html"> <trans-unit id="4798457301875181136" datatype="html">
@ -3342,6 +3342,14 @@
<context context-type="linenumber">22</context> <context context-type="linenumber">22</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="9218541487912911620" datatype="html">
<source>No Activities</source>
<target state="new">No Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit id="9219851060664514927" datatype="html"> <trans-unit id="9219851060664514927" datatype="html">
<source>Retirement Provision</source> <source>Retirement Provision</source>
<target state="translated">Fondo pensione</target> <target state="translated">Fondo pensione</target>
@ -5693,7 +5701,7 @@
<target state="translated">Ops! Impossibile elaborare i dati storici.</target> <target state="translated">Ops! Impossibile elaborare i dati storici.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context>
<context context-type="linenumber">262</context> <context context-type="linenumber">284</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="297546430113071258" datatype="html"> <trans-unit id="297546430113071258" datatype="html">
@ -6758,7 +6766,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">46</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context> <context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -7336,7 +7344,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">48</context> <context context-type="linenumber">49</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7156797854368699223" datatype="html"> <trans-unit id="7156797854368699223" datatype="html">

20
apps/client/src/locales/messages.ko.xlf

@ -792,7 +792,7 @@
<target state="translated">다음 기준으로 필터...</target> <target state="translated">다음 기준으로 필터...</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">390</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6182733719813772142" datatype="html"> <trans-unit id="6182733719813772142" datatype="html">
@ -832,7 +832,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">40</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6130372166370766747" datatype="html"> <trans-unit id="6130372166370766747" datatype="html">
@ -884,7 +884,7 @@
<target state="translated">이런! 과거 데이터를 파싱할 수 없습니다.</target> <target state="translated">이런! 과거 데이터를 파싱할 수 없습니다.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context>
<context context-type="linenumber">262</context> <context context-type="linenumber">284</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1102717806459547726" datatype="html"> <trans-unit id="1102717806459547726" datatype="html">
@ -916,7 +916,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">71</context> <context context-type="linenumber">67</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5299488188278756127" datatype="html"> <trans-unit id="5299488188278756127" datatype="html">
@ -5376,6 +5376,14 @@
<context context-type="linenumber">27</context> <context context-type="linenumber">27</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="9218541487912911620" datatype="html">
<source>No Activities</source>
<target state="new">No Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit id="9219851060664514927" datatype="html"> <trans-unit id="9219851060664514927" datatype="html">
<source>Retirement Provision</source> <source>Retirement Provision</source>
<target state="translated">퇴직금</target> <target state="translated">퇴직금</target>
@ -6742,7 +6750,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">46</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context> <context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -7360,7 +7368,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">48</context> <context context-type="linenumber">49</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1769610706135259386" datatype="html"> <trans-unit id="1769610706135259386" datatype="html">

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

@ -506,7 +506,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">40</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8122024350760043460" datatype="html"> <trans-unit id="8122024350760043460" datatype="html">
@ -2614,7 +2614,7 @@
<target state="translated">Filter op...</target> <target state="translated">Filter op...</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">390</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5342721262799645301" datatype="html"> <trans-unit id="5342721262799645301" datatype="html">
@ -3218,7 +3218,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">71</context> <context context-type="linenumber">67</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4798457301875181136" datatype="html"> <trans-unit id="4798457301875181136" datatype="html">
@ -3341,6 +3341,14 @@
<context context-type="linenumber">22</context> <context context-type="linenumber">22</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="9218541487912911620" datatype="html">
<source>No Activities</source>
<target state="new">No Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit id="9219851060664514927" datatype="html"> <trans-unit id="9219851060664514927" datatype="html">
<source>Retirement Provision</source> <source>Retirement Provision</source>
<target state="translated">Pensioen</target> <target state="translated">Pensioen</target>
@ -5692,7 +5700,7 @@
<target state="translated">Oeps! Ophalen van historische data is mislukt.</target> <target state="translated">Oeps! Ophalen van historische data is mislukt.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context>
<context context-type="linenumber">262</context> <context context-type="linenumber">284</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="297546430113071258" datatype="html"> <trans-unit id="297546430113071258" datatype="html">
@ -6757,7 +6765,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">46</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context> <context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -7335,7 +7343,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">48</context> <context context-type="linenumber">49</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7156797854368699223" datatype="html"> <trans-unit id="7156797854368699223" datatype="html">

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

@ -783,7 +783,7 @@
<target state="translated">Filtruj według...</target> <target state="translated">Filtruj według...</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">390</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6182733719813772142" datatype="html"> <trans-unit id="6182733719813772142" datatype="html">
@ -823,7 +823,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">40</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6130372166370766747" datatype="html"> <trans-unit id="6130372166370766747" datatype="html">
@ -859,7 +859,7 @@
<target state="translated">Ups! Nie udało się sparsować danych historycznych.</target> <target state="translated">Ups! Nie udało się sparsować danych historycznych.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context>
<context context-type="linenumber">262</context> <context context-type="linenumber">284</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1102717806459547726" datatype="html"> <trans-unit id="1102717806459547726" datatype="html">
@ -883,7 +883,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">71</context> <context context-type="linenumber">67</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5299488188278756127" datatype="html"> <trans-unit id="5299488188278756127" datatype="html">
@ -5307,6 +5307,14 @@
<context context-type="linenumber">27</context> <context context-type="linenumber">27</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="9218541487912911620" datatype="html">
<source>No Activities</source>
<target state="new">No Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit id="9219851060664514927" datatype="html"> <trans-unit id="9219851060664514927" datatype="html">
<source>Retirement Provision</source> <source>Retirement Provision</source>
<target state="translated">Świadczenia Emerytalne</target> <target state="translated">Świadczenia Emerytalne</target>
@ -6757,7 +6765,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">46</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context> <context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -7335,7 +7343,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">48</context> <context context-type="linenumber">49</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7156797854368699223" datatype="html"> <trans-unit id="7156797854368699223" datatype="html">

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

@ -530,7 +530,7 @@
<target state="translated">Filtrar por...</target> <target state="translated">Filtrar por...</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">390</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6182733719813772142" datatype="html"> <trans-unit id="6182733719813772142" datatype="html">
@ -570,7 +570,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">40</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3720539089813177542" datatype="html"> <trans-unit id="3720539089813177542" datatype="html">
@ -3174,7 +3174,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">71</context> <context context-type="linenumber">67</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7763941937414903315" datatype="html"> <trans-unit id="7763941937414903315" datatype="html">
@ -3341,6 +3341,14 @@
<context context-type="linenumber">22</context> <context context-type="linenumber">22</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="9218541487912911620" datatype="html">
<source>No Activities</source>
<target state="new">No Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit id="9219851060664514927" datatype="html"> <trans-unit id="9219851060664514927" datatype="html">
<source>Retirement Provision</source> <source>Retirement Provision</source>
<target state="translated">Provisão de Reforma</target> <target state="translated">Provisão de Reforma</target>
@ -5692,7 +5700,7 @@
<target state="translated">Ops! Não foi possível analisar os dados históricos.</target> <target state="translated">Ops! Não foi possível analisar os dados históricos.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context>
<context context-type="linenumber">262</context> <context context-type="linenumber">284</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="297546430113071258" datatype="html"> <trans-unit id="297546430113071258" datatype="html">
@ -6757,7 +6765,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">46</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context> <context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -7335,7 +7343,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">48</context> <context context-type="linenumber">49</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7156797854368699223" datatype="html"> <trans-unit id="7156797854368699223" datatype="html">

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

@ -739,7 +739,7 @@
<target state="translated">Filtrele...</target> <target state="translated">Filtrele...</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">390</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6182733719813772142" datatype="html"> <trans-unit id="6182733719813772142" datatype="html">
@ -779,7 +779,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">40</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6130372166370766747" datatype="html"> <trans-unit id="6130372166370766747" datatype="html">
@ -3371,7 +3371,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">71</context> <context context-type="linenumber">67</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2666668717343771434" datatype="html"> <trans-unit id="2666668717343771434" datatype="html">
@ -5003,6 +5003,14 @@
<context context-type="linenumber">27</context> <context context-type="linenumber">27</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="9218541487912911620" datatype="html">
<source>No Activities</source>
<target state="new">No Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit id="9219851060664514927" datatype="html"> <trans-unit id="9219851060664514927" datatype="html">
<source>Retirement Provision</source> <source>Retirement Provision</source>
<target state="translated">Yaşlılık Provizyonu</target> <target state="translated">Yaşlılık Provizyonu</target>
@ -5692,7 +5700,7 @@
<target state="translated">Hay Allah! Geçmiş veriler ayrıştırılamadı.</target> <target state="translated">Hay Allah! Geçmiş veriler ayrıştırılamadı.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context>
<context context-type="linenumber">262</context> <context context-type="linenumber">284</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="297546430113071258" datatype="html"> <trans-unit id="297546430113071258" datatype="html">
@ -6757,7 +6765,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">46</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context> <context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -7335,7 +7343,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">48</context> <context context-type="linenumber">49</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7156797854368699223" datatype="html"> <trans-unit id="7156797854368699223" datatype="html">

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

@ -875,7 +875,7 @@
<target state="translated">Фільтрувати за...</target> <target state="translated">Фільтрувати за...</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">390</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8411428959611082933" datatype="html"> <trans-unit id="8411428959611082933" datatype="html">
@ -931,7 +931,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">40</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6130372166370766747" datatype="html"> <trans-unit id="6130372166370766747" datatype="html">
@ -2323,7 +2323,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">48</context> <context context-type="linenumber">49</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5403336912114537863" datatype="html"> <trans-unit id="5403336912114537863" datatype="html">
@ -4576,7 +4576,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">71</context> <context context-type="linenumber">67</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2666668717343771434" datatype="html"> <trans-unit id="2666668717343771434" datatype="html">
@ -6419,7 +6419,7 @@
<target state="translated">Упс! Не вдалося отримати історичні дані.</target> <target state="translated">Упс! Не вдалося отримати історичні дані.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context>
<context context-type="linenumber">262</context> <context context-type="linenumber">284</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8927080808898221200" datatype="html"> <trans-unit id="8927080808898221200" datatype="html">
@ -6595,7 +6595,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">46</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context> <context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -6774,6 +6774,14 @@
<context context-type="linenumber">27</context> <context context-type="linenumber">27</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="9218541487912911620" datatype="html">
<source>No Activities</source>
<target state="new">No Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit id="9219851060664514927" datatype="html"> <trans-unit id="9219851060664514927" datatype="html">
<source>Retirement Provision</source> <source>Retirement Provision</source>
<target state="translated">Пенсійне накопичення</target> <target state="translated">Пенсійне накопичення</target>

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

@ -740,7 +740,7 @@
<source>Filter by...</source> <source>Filter by...</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">390</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6182733719813772142" datatype="html"> <trans-unit id="6182733719813772142" datatype="html">
@ -777,7 +777,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">40</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6130372166370766747" datatype="html"> <trans-unit id="6130372166370766747" datatype="html">
@ -823,7 +823,7 @@
<source>Oops! Could not parse historical data.</source> <source>Oops! Could not parse historical data.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context>
<context context-type="linenumber">262</context> <context context-type="linenumber">284</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1102717806459547726" datatype="html"> <trans-unit id="1102717806459547726" datatype="html">
@ -852,7 +852,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">71</context> <context context-type="linenumber">67</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5299488188278756127" datatype="html"> <trans-unit id="5299488188278756127" datatype="html">
@ -4907,6 +4907,13 @@
<context context-type="linenumber">27</context> <context context-type="linenumber">27</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="9218541487912911620" datatype="html">
<source>No Activities</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit id="9219851060664514927" datatype="html"> <trans-unit id="9219851060664514927" datatype="html">
<source>Retirement Provision</source> <source>Retirement Provision</source>
<context-group purpose="location"> <context-group purpose="location">
@ -6126,7 +6133,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">46</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context> <context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -6685,7 +6692,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">48</context> <context context-type="linenumber">49</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1769610706135259386" datatype="html"> <trans-unit id="1769610706135259386" datatype="html">

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

@ -792,7 +792,7 @@
<target state="translated">过滤...</target> <target state="translated">过滤...</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">390</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6182733719813772142" datatype="html"> <trans-unit id="6182733719813772142" datatype="html">
@ -832,7 +832,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">40</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6130372166370766747" datatype="html"> <trans-unit id="6130372166370766747" datatype="html">
@ -868,7 +868,7 @@
<target state="translated">哎呀!无法解析历史数据。</target> <target state="translated">哎呀!无法解析历史数据。</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts</context>
<context context-type="linenumber">262</context> <context context-type="linenumber">284</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1102717806459547726" datatype="html"> <trans-unit id="1102717806459547726" datatype="html">
@ -892,7 +892,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html</context>
<context context-type="linenumber">71</context> <context context-type="linenumber">67</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5299488188278756127" datatype="html"> <trans-unit id="5299488188278756127" datatype="html">
@ -5360,6 +5360,14 @@
<context context-type="linenumber">27</context> <context context-type="linenumber">27</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="9218541487912911620" datatype="html">
<source>No Activities</source>
<target state="new">No Activities</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.component.ts</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit id="9219851060664514927" datatype="html"> <trans-unit id="9219851060664514927" datatype="html">
<source>Retirement Provision</source> <source>Retirement Provision</source>
<target state="translated">退休金</target> <target state="translated">退休金</target>
@ -6758,7 +6766,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">46</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context> <context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -7336,7 +7344,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context> <context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
<context context-type="linenumber">48</context> <context context-type="linenumber">49</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7156797854368699223" datatype="html"> <trans-unit id="7156797854368699223" datatype="html">

3
libs/common/src/lib/types/market-data-preset.type.ts

@ -2,4 +2,5 @@ export type MarketDataPreset =
| 'BENCHMARKS' | 'BENCHMARKS'
| 'CURRENCIES' | 'CURRENCIES'
| 'ETF_WITHOUT_COUNTRIES' | 'ETF_WITHOUT_COUNTRIES'
| 'ETF_WITHOUT_SECTORS'; | 'ETF_WITHOUT_SECTORS'
| 'NO_ACTIVITIES';

10
libs/ui/src/lib/account-balances/account-balances.component.html

@ -12,7 +12,7 @@
<ng-container i18n>Date</ng-container> <ng-container i18n>Date</ng-container>
</th> </th>
<td *matCellDef="let element" class="px-2" mat-cell> <td *matCellDef="let element" class="px-2" mat-cell>
<gf-value [isDate]="true" [locale]="locale" [value]="element?.date" /> <gf-value [isDate]="true" [locale]="locale()" [value]="element?.date" />
</td> </td>
<td *matFooterCellDef class="px-2" mat-footer-cell> <td *matFooterCellDef class="px-2" mat-footer-cell>
<mat-form-field appearance="outline" class="py-1 without-hint"> <mat-form-field appearance="outline" class="py-1 without-hint">
@ -37,7 +37,7 @@
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<gf-value <gf-value
[isCurrency]="true" [isCurrency]="true"
[locale]="locale" [locale]="locale()"
[unit]="element?.account?.currency" [unit]="element?.account?.currency"
[value]="element?.value" [value]="element?.value"
/> />
@ -48,7 +48,7 @@
<mat-form-field appearance="outline" class="without-hint"> <mat-form-field appearance="outline" class="without-hint">
<input formControlName="balance" matInput type="number" /> <input formControlName="balance" matInput type="number" />
<div class="ml-2" matTextSuffix> <div class="ml-2" matTextSuffix>
{{ accountCurrency }} {{ accountCurrency() }}
</div> </div>
</mat-form-field> </mat-form-field>
</div> </div>
@ -58,7 +58,7 @@
<ng-container matColumnDef="actions" stickyEnd> <ng-container matColumnDef="actions" stickyEnd>
<th *matHeaderCellDef class="px-1 text-center" mat-header-cell></th> <th *matHeaderCellDef class="px-1 text-center" mat-header-cell></th>
<td *matCellDef="let element" class="px-1 text-center" mat-cell> <td *matCellDef="let element" class="px-1 text-center" mat-cell>
@if (showActions) { @if (showActions()) {
<button <button
class="mx-1 no-min-width px-2" class="mx-1 no-min-width px-2"
mat-button mat-button
@ -100,7 +100,7 @@
<tr <tr
*matFooterRowDef="displayedColumns" *matFooterRowDef="displayedColumns"
mat-footer-row mat-footer-row
[hidden]="!showActions" [hidden]="!showActions()"
></tr> ></tr>
</table> </table>
</form> </form>

68
libs/ui/src/lib/account-balances/account-balances.component.ts

@ -10,12 +10,12 @@ import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
Component, Component,
EventEmitter, EventEmitter,
Input,
OnChanges, OnChanges,
OnDestroy,
OnInit, OnInit,
Output, Output,
ViewChild inject,
input,
viewChild
} from '@angular/core'; } from '@angular/core';
import { import {
FormGroup, FormGroup,
@ -39,8 +39,7 @@ import {
ellipsisHorizontal, ellipsisHorizontal,
trashOutline trashOutline
} from 'ionicons/icons'; } from 'ionicons/icons';
import { get } from 'lodash'; import { get, isNil } from 'lodash';
import { Subject } from 'rxjs';
import { GfValueComponent } from '../value'; import { GfValueComponent } from '../value';
@ -63,50 +62,44 @@ import { GfValueComponent } from '../value';
styleUrls: ['./account-balances.component.scss'], styleUrls: ['./account-balances.component.scss'],
templateUrl: './account-balances.component.html' templateUrl: './account-balances.component.html'
}) })
export class GfAccountBalancesComponent export class GfAccountBalancesComponent implements OnChanges, OnInit {
implements OnChanges, OnDestroy, OnInit
{
@Input() accountBalances: AccountBalancesResponse['balances'];
@Input() accountCurrency: string;
@Input() accountId: string;
@Input() locale = getLocale();
@Input() showActions = true;
@Output() accountBalanceCreated = new EventEmitter<CreateAccountBalanceDto>(); @Output() accountBalanceCreated = new EventEmitter<CreateAccountBalanceDto>();
@Output() accountBalanceDeleted = new EventEmitter<string>(); @Output() accountBalanceDeleted = new EventEmitter<string>();
@ViewChild(MatSort) sort: MatSort; public readonly accountBalances =
input.required<AccountBalancesResponse['balances']>();
public readonly accountCurrency = input.required<string>();
public readonly accountId = input.required<string>();
public readonly displayedColumns: string[] = ['date', 'value', 'actions'];
public readonly locale = input(getLocale());
public readonly showActions = input(true);
public readonly sort = viewChild(MatSort);
public accountBalanceForm = new FormGroup({ public accountBalanceForm = new FormGroup({
balance: new FormControl(0, Validators.required), balance: new FormControl(0, (control) => Validators.required(control)),
date: new FormControl(new Date(), Validators.required) date: new FormControl(new Date(), (control) => Validators.required(control))
}); });
public dataSource = new MatTableDataSource< public dataSource = new MatTableDataSource<
AccountBalancesResponse['balances'][0] AccountBalancesResponse['balances'][0]
>(); >();
public displayedColumns: string[] = ['date', 'value', 'actions']; private dateAdapter = inject<DateAdapter<Date, string>>(DateAdapter);
public Validators = Validators; private notificationService = inject(NotificationService);
private unsubscribeSubject = new Subject<void>();
public constructor( public constructor() {
private dateAdapter: DateAdapter<any>,
private notificationService: NotificationService
) {
addIcons({ calendarClearOutline, ellipsisHorizontal, trashOutline }); addIcons({ calendarClearOutline, ellipsisHorizontal, trashOutline });
} }
public ngOnInit() { public ngOnInit() {
this.dateAdapter.setLocale(this.locale); this.dateAdapter.setLocale(this.locale());
} }
public ngOnChanges() { public ngOnChanges() {
if (this.accountBalances) { if (this.accountBalances()) {
this.dataSource = new MatTableDataSource(this.accountBalances); this.dataSource = new MatTableDataSource(this.accountBalances());
this.dataSource.sort = this.sort; this.dataSource.sort = this.sort();
this.dataSource.sortingDataAccessor = get; this.dataSource.sortingDataAccessor = get;
} }
} }
@ -122,10 +115,16 @@ export class GfAccountBalancesComponent
} }
public async onSubmitAccountBalance() { public async onSubmitAccountBalance() {
const { balance, date } = this.accountBalanceForm.value;
if (isNil(balance) || !date) {
return;
}
const accountBalance: CreateAccountBalanceDto = { const accountBalance: CreateAccountBalanceDto = {
accountId: this.accountId, balance,
balance: this.accountBalanceForm.get('balance').value, accountId: this.accountId(),
date: format(this.accountBalanceForm.get('date').value, DATE_FORMAT) date: format(date, DATE_FORMAT)
}; };
try { try {
@ -141,9 +140,4 @@ export class GfAccountBalancesComponent
this.accountBalanceCreated.emit(accountBalance); this.accountBalanceCreated.emit(accountBalance);
} }
public ngOnDestroy() {
this.unsubscribeSubject.next();
this.unsubscribeSubject.complete();
}
} }

2
libs/ui/src/lib/accounts-table/accounts-table.component.ts

@ -53,7 +53,7 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
templateUrl: './accounts-table.component.html' templateUrl: './accounts-table.component.html'
}) })
export class GfAccountsTableComponent { export class GfAccountsTableComponent {
public readonly accounts = input.required<Account[] | undefined>(); public readonly accounts = input.required<Account[]>();
public readonly activitiesCount = input<number>(); public readonly activitiesCount = input<number>();
public readonly baseCurrency = input<string>(); public readonly baseCurrency = input<string>();
public readonly hasPermissionToOpenDetails = input(true); public readonly hasPermissionToOpenDetails = input(true);

4
package-lock.json

@ -1,12 +1,12 @@
{ {
"name": "ghostfolio", "name": "ghostfolio",
"version": "2.239.0", "version": "2.240.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "ghostfolio", "name": "ghostfolio",
"version": "2.239.0", "version": "2.240.0",
"hasInstallScript": true, "hasInstallScript": true,
"license": "AGPL-3.0", "license": "AGPL-3.0",
"dependencies": { "dependencies": {

2
package.json

@ -1,6 +1,6 @@
{ {
"name": "ghostfolio", "name": "ghostfolio",
"version": "2.239.0", "version": "2.240.0",
"homepage": "https://ghostfol.io", "homepage": "https://ghostfol.io",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio", "repository": "https://github.com/ghostfolio/ghostfolio",

Loading…
Cancel
Save