diff --git a/CHANGELOG.md b/CHANGELOG.md index 20824d59..99cc25cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Added a new static portfolio analysis rule: _Regional Market Cluster Risk_ (Europe) +- Added a link to _Duck.ai_ to the _Copy AI prompt to clipboard_ action on the analysis page (experimental) - Extracted the tags selector to a reusable component used in the create or update activity dialog and holding detail dialog ### Changed diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index a14f97d2..bbe2a6ca 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -15,6 +15,7 @@ import { EconomicMarketClusterRiskDevelopedMarkets } from '@ghostfolio/api/model import { EconomicMarketClusterRiskEmergingMarkets } from '@ghostfolio/api/models/rules/economic-market-cluster-risk/emerging-markets'; import { EmergencyFundSetup } from '@ghostfolio/api/models/rules/emergency-fund/emergency-fund-setup'; import { FeeRatioInitialInvestment } from '@ghostfolio/api/models/rules/fees/fee-ratio-initial-investment'; +import { RegionalMarketClusterRiskEurope } from '@ghostfolio/api/models/rules/regional-market-cluster-risk/europe'; import { RegionalMarketClusterRiskNorthAmerica } from '@ghostfolio/api/models/rules/regional-market-cluster-risk/north-america'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; @@ -1278,6 +1279,11 @@ export class PortfolioService { summary.ordersCount > 0 ? await this.rulesService.evaluate( [ + new RegionalMarketClusterRiskEurope( + this.exchangeRateDataService, + marketsAdvancedTotalInBaseCurrency, + marketsAdvanced.europe.valueInBaseCurrency + ), new RegionalMarketClusterRiskNorthAmerica( this.exchangeRateDataService, marketsAdvancedTotalInBaseCurrency, diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 415cbc99..44a29e73 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -13,6 +13,7 @@ import { EconomicMarketClusterRiskDevelopedMarkets } from '@ghostfolio/api/model import { EconomicMarketClusterRiskEmergingMarkets } from '@ghostfolio/api/models/rules/economic-market-cluster-risk/emerging-markets'; import { EmergencyFundSetup } from '@ghostfolio/api/models/rules/emergency-fund/emergency-fund-setup'; import { FeeRatioInitialInvestment } from '@ghostfolio/api/models/rules/fees/fee-ratio-initial-investment'; +import { RegionalMarketClusterRiskEurope } from '@ghostfolio/api/models/rules/regional-market-cluster-risk/europe'; import { RegionalMarketClusterRiskNorthAmerica } from '@ghostfolio/api/models/rules/regional-market-cluster-risk/north-america'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; @@ -270,6 +271,11 @@ export class UserService { undefined, undefined ).getSettings(user.Settings.settings), + RegionalMarketClusterRiskEurope: new RegionalMarketClusterRiskEurope( + undefined, + undefined, + undefined + ).getSettings(user.Settings.settings), RegionalMarketClusterRiskNorthAmerica: new RegionalMarketClusterRiskNorthAmerica( undefined, diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts b/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts new file mode 100644 index 00000000..d33190ce --- /dev/null +++ b/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts @@ -0,0 +1,77 @@ +import { Rule } from '@ghostfolio/api/models/rule'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { UserSettings } from '@ghostfolio/common/interfaces'; + +import { Settings } from './interfaces/rule-settings.interface'; + +export class RegionalMarketClusterRiskEurope extends Rule { + private currentValueInBaseCurrency: number; + private europeValueInBaseCurrency: number; + + public constructor( + protected exchangeRateDataService: ExchangeRateDataService, + currentValueInBaseCurrency: number, + europeValueInBaseCurrency: number + ) { + super(exchangeRateDataService, { + key: RegionalMarketClusterRiskEurope.name, + name: 'Europe' + }); + + this.currentValueInBaseCurrency = currentValueInBaseCurrency; + this.europeValueInBaseCurrency = europeValueInBaseCurrency; + } + + public evaluate(ruleSettings: Settings) { + const europeMarketValueRatio = this.currentValueInBaseCurrency + ? this.europeValueInBaseCurrency / this.currentValueInBaseCurrency + : 0; + + if (europeMarketValueRatio > ruleSettings.thresholdMax) { + return { + evaluation: `The Europe market contribution of your current investment (${(europeMarketValueRatio * 100).toPrecision(3)}%) exceeds ${( + ruleSettings.thresholdMax * 100 + ).toPrecision(3)}%`, + value: false + }; + } else if (europeMarketValueRatio < ruleSettings.thresholdMin) { + return { + evaluation: `The Europe market contribution of your current investment (${(europeMarketValueRatio * 100).toPrecision(3)}%) is below ${( + ruleSettings.thresholdMin * 100 + ).toPrecision(3)}%`, + value: false + }; + } + + return { + evaluation: `The Europe market contribution of your current investment (${(europeMarketValueRatio * 100).toPrecision(3)}%) is within the range of ${( + ruleSettings.thresholdMin * 100 + ).toPrecision( + 3 + )}% and ${(ruleSettings.thresholdMax * 100).toPrecision(3)}%`, + value: true + }; + } + + public getConfiguration() { + return { + threshold: { + max: 1, + min: 0, + step: 0.01, + unit: '%' + }, + thresholdMax: true, + thresholdMin: true + }; + } + + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { + return { + baseCurrency, + isActive: xRayRules?.[this.getKey()]?.isActive ?? true, + thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.15, + thresholdMin: xRayRules?.[this.getKey()]?.thresholdMin ?? 0.11 + }; + } +} diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/interfaces/rule-settings.interface.ts b/apps/api/src/models/rules/regional-market-cluster-risk/interfaces/rule-settings.interface.ts new file mode 100644 index 00000000..8b9fddf3 --- /dev/null +++ b/apps/api/src/models/rules/regional-market-cluster-risk/interfaces/rule-settings.interface.ts @@ -0,0 +1,7 @@ +import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; + +export interface Settings extends RuleSettings { + baseCurrency: string; + thresholdMin: number; + thresholdMax: number; +} diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts b/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts index dc3f6d97..4563b7c5 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts @@ -1,8 +1,9 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { UserSettings } from '@ghostfolio/common/interfaces'; +import { Settings } from './interfaces/rule-settings.interface'; + export class RegionalMarketClusterRiskNorthAmerica extends Rule { private currentValueInBaseCurrency: number; private northAmericaValueInBaseCurrency: number; @@ -74,9 +75,3 @@ export class RegionalMarketClusterRiskNorthAmerica extends Rule { }; } } - -interface Settings extends RuleSettings { - baseCurrency: string; - thresholdMin: number; - thresholdMax: number; -} diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts index acc561f1..0fbc3886 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -21,6 +21,7 @@ import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { MatSnackBar } from '@angular/material/snack-bar'; import { SymbolProfile } from '@prisma/client'; import { isNumber, sortBy } from 'lodash'; +import ms from 'ms'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -171,17 +172,27 @@ export class AnalysisPageComponent implements OnDestroy, OnInit { } public onCopyPromptToClipboard() { - this.dataService.fetchPrompt().subscribe(({ prompt }) => { - this.clipboard.copy(prompt); + this.dataService + .fetchPrompt() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ prompt }) => { + this.clipboard.copy(prompt); - this.snackBar.open( - '✅ ' + $localize`AI prompt has been copied to the clipboard`, - undefined, - { - duration: 3000 - } - ); - }); + const snackBarRef = this.snackBar.open( + '✅ ' + $localize`AI prompt has been copied to the clipboard`, + $localize`Open Duck.ai` + ' →', + { + duration: ms('7 seconds') + } + ); + + snackBarRef + .onAction() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(() => { + window.open('https://duck.ai', '_blank'); + }); + }); } public ngOnDestroy() { diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 18c8288c..3bee762a 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -5075,7 +5075,7 @@ Dividend apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 41 + 42 libs/ui/src/lib/i18n.ts @@ -5087,11 +5087,11 @@ Investment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5103,7 +5103,7 @@ Monthly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -5111,7 +5111,7 @@ Yearly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -7641,7 +7641,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 149 + 153 @@ -7740,6 +7740,14 @@ 97 + + Open Duck.ai + Open Duck.ai + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 154 + + diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 5d528758..9f5fd16f 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -2806,7 +2806,7 @@ Monatlich apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -3326,7 +3326,7 @@ Dividenden apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 41 + 42 libs/ui/src/lib/i18n.ts @@ -3434,7 +3434,7 @@ Jährlich apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -6319,11 +6319,11 @@ Einlage apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -7641,7 +7641,7 @@ KI-Anweisung wurde in die Zwischenablage kopiert apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 149 + 153 @@ -7740,6 +7740,14 @@ 97 + + Open Duck.ai + Öffne Duck.ai + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 154 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 81f347ed..c71d49f5 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -2835,7 +2835,7 @@ Mensual apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -3319,7 +3319,7 @@ Dividendo apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 41 + 42 libs/ui/src/lib/i18n.ts @@ -3435,7 +3435,7 @@ Anual apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -6320,11 +6320,11 @@ Inversión apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -7642,7 +7642,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 149 + 153 @@ -7741,6 +7741,14 @@ 97 + + Open Duck.ai + Open Duck.ai + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 154 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index e657e087..521cfe6f 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -2750,7 +2750,7 @@ Dividende apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 41 + 42 libs/ui/src/lib/i18n.ts @@ -2770,7 +2770,7 @@ Mensuel apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -3434,7 +3434,7 @@ Annuel apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -6319,11 +6319,11 @@ Investissement apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -7641,7 +7641,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 149 + 153 @@ -7740,6 +7740,14 @@ 97 + + Open Duck.ai + Open Duck.ai + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 154 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index dda729b5..4d428d41 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -2835,7 +2835,7 @@ Mensile apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -3319,7 +3319,7 @@ Dividendi apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 41 + 42 libs/ui/src/lib/i18n.ts @@ -3435,7 +3435,7 @@ Annuale apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -6320,11 +6320,11 @@ Investimento apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -7642,7 +7642,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 149 + 153 @@ -7741,6 +7741,14 @@ 97 + + Open Duck.ai + Open Duck.ai + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 154 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 3cd6ec03..a3c6c6d6 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -2834,7 +2834,7 @@ Maandelijks apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -3318,7 +3318,7 @@ Dividend apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 41 + 42 libs/ui/src/lib/i18n.ts @@ -3434,7 +3434,7 @@ Jaarlijks apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -6319,11 +6319,11 @@ Investment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -7641,7 +7641,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 149 + 153 @@ -7740,6 +7740,14 @@ 97 + + Open Duck.ai + Open Duck.ai + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 154 + + diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index da00dbd6..135e5847 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -4667,7 +4667,7 @@ Dywidenda apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 41 + 42 libs/ui/src/lib/i18n.ts @@ -4687,7 +4687,7 @@ Miesięcznie apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -4695,7 +4695,7 @@ Rocznie apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -6319,11 +6319,11 @@ Inwestycje apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -7641,7 +7641,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 149 + 153 @@ -7740,6 +7740,14 @@ 97 + + Open Duck.ai + Open Duck.ai + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 154 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 7fdf42c9..37d4688f 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -2654,7 +2654,7 @@ Mensalmente apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -3386,7 +3386,7 @@ Dividendos apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 41 + 42 libs/ui/src/lib/i18n.ts @@ -3434,7 +3434,7 @@ Anualmente apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -6319,11 +6319,11 @@ Investment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -7641,7 +7641,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 149 + 153 @@ -7740,6 +7740,14 @@ 97 + + Open Duck.ai + Open Duck.ai + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 154 + + diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index c1064f53..0c6c7206 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -4151,7 +4151,7 @@ Temettü apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 41 + 42 libs/ui/src/lib/i18n.ts @@ -4171,7 +4171,7 @@ Aylık apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -4179,7 +4179,7 @@ Yıllık apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -6319,11 +6319,11 @@ Investment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -7641,7 +7641,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 149 + 153 @@ -7740,6 +7740,14 @@ 97 + + Open Duck.ai + Open Duck.ai + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 154 + + diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 43510264..235d99bf 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -5351,7 +5351,7 @@ Дивіденди apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 41 + 42 libs/ui/src/lib/i18n.ts @@ -5363,11 +5363,11 @@ Інвестиції apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5379,7 +5379,7 @@ Щомісячно apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -5387,7 +5387,7 @@ Щорічно apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -7649,7 +7649,7 @@ Запит AI скопійовано в буфер обміну apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 149 + 153 @@ -7740,6 +7740,14 @@ 97 + + Open Duck.ai + Open Duck.ai + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 154 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 0f9c97b5..5a70868d 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -4294,7 +4294,7 @@ Dividend apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 41 + 42 libs/ui/src/lib/i18n.ts @@ -4312,14 +4312,14 @@ Monthly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 Yearly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -5772,11 +5772,11 @@ Investment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6920,7 +6920,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 149 + 153 @@ -7000,6 +7000,13 @@ 93 + + Open Duck.ai + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 154 + + diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 05cabcee..984c0bed 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -4684,7 +4684,7 @@ 股息 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 41 + 42 libs/ui/src/lib/i18n.ts @@ -4704,7 +4704,7 @@ 每月 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 54 + 55 @@ -4712,7 +4712,7 @@ 每年 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 55 + 56 @@ -6344,11 +6344,11 @@ 投资 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 46 + 47 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 60 + 61 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -7642,7 +7642,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 149 + 153 @@ -7741,6 +7741,14 @@ 97 + + Open Duck.ai + Open Duck.ai + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 154 + + diff --git a/libs/common/src/lib/interfaces/x-ray-rules-settings.interface.ts b/libs/common/src/lib/interfaces/x-ray-rules-settings.interface.ts index 61f79d65..f1ca5c68 100644 --- a/libs/common/src/lib/interfaces/x-ray-rules-settings.interface.ts +++ b/libs/common/src/lib/interfaces/x-ray-rules-settings.interface.ts @@ -9,6 +9,7 @@ export interface XRayRulesSettings { EconomicMarketClusterRiskEmergingMarkets?: RuleSettings; EmergencyFundSetup?: RuleSettings; FeeRatioInitialInvestment?: RuleSettings; + RegionalMarketClusterRiskEurope?: RuleSettings; RegionalMarketClusterRiskNorthAmerica?: RuleSettings; }