From 1a9c11ba0e1a9670679d896b823ab785553f4d67 Mon Sep 17 00:00:00 2001 From: Dhaneshwari Tendle <110600266+dhaneshwaritendle@users.noreply.github.com> Date: Sat, 19 Oct 2024 13:55:02 +0530 Subject: [PATCH] Revert " modified: apps/api/src/helper/object.helper.ts" --- CHANGELOG.md | 33 +-- Dockerfile | 1 - .../api/src/app/account/create-account.dto.ts | 2 +- .../api/src/app/account/update-account.dto.ts | 2 +- apps/api/src/app/admin/queue/queue.service.ts | 4 +- apps/api/src/app/auth/auth.controller.ts | 11 +- apps/api/src/app/auth/google.strategy.ts | 8 +- apps/api/src/app/auth/web-auth.service.ts | 11 +- .../calculator/portfolio-calculator.ts | 8 +- ...io-calculator-dynamic-buy-and-sell.spec.ts | 252 ------------------ ...ulator-novn-buy-and-sell-partially.spec.ts | 56 ++-- apps/api/src/app/portfolio/rules.service.ts | 7 +- apps/api/src/app/user/user.service.ts | 46 +--- ...orm-data-source-in-response.interceptor.ts | 2 +- apps/api/src/models/rule.ts | 10 +- .../current-investment.ts | 16 +- .../account-cluster-risk/single-account.ts | 6 +- .../base-currency-current-investment.ts | 6 +- .../current-investment.ts | 16 +- .../emergency-fund/emergency-fund-setup.ts | 6 +- .../fees/fee-ratio-initial-investment.ts | 16 +- .../configuration/configuration.service.ts | 22 +- .../yahoo-finance.service.spec.ts | 4 + .../yahoo-finance/yahoo-finance.service.ts | 2 + .../eod-historical-data.service.ts | 6 +- .../google-sheets/google-sheets.service.ts | 2 +- .../interfaces/environment.interface.ts | 4 - .../data-gathering.processor.ts | 12 +- .../portfolio-snapshot.module.ts | 14 +- .../portfolio-snapshot.processor.ts | 10 +- .../portfolio-snapshot.service.ts | 4 +- .../benchmark-comparator.component.ts | 7 +- .../home-market/home-market.component.ts | 3 + .../components/home-market/home-market.html | 10 + .../home-market/home-market.module.ts | 4 +- .../investment-chart.component.ts | 7 +- .../interfaces/interfaces.ts | 2 - .../rule-settings-dialog.component.ts | 14 +- .../rule-settings-dialog.html | 90 ++----- .../app/components/rule/rule.component.html | 2 +- .../src/app/components/rule/rule.component.ts | 15 +- .../app/components/rules/rules.component.html | 1 - .../app/components/rules/rules.component.ts | 4 +- .../faq/self-hosting/self-hosting-page.html | 56 +--- .../portfolio/fire/fire-page.component.ts | 5 - .../app/pages/portfolio/fire/fire-page.html | 5 - apps/client/src/locales/messages.ca.xlf | 50 ++-- apps/client/src/locales/messages.de.xlf | 50 ++-- apps/client/src/locales/messages.es.xlf | 50 ++-- apps/client/src/locales/messages.fr.xlf | 50 ++-- apps/client/src/locales/messages.it.xlf | 50 ++-- apps/client/src/locales/messages.nl.xlf | 50 ++-- apps/client/src/locales/messages.pl.xlf | 50 ++-- apps/client/src/locales/messages.pt.xlf | 50 ++-- apps/client/src/locales/messages.tr.xlf | 50 ++-- apps/client/src/locales/messages.xlf | 50 ++-- apps/client/src/locales/messages.zh.xlf | 50 ++-- libs/common/src/lib/chart-helper.ts | 2 +- libs/common/src/lib/config.ts | 15 +- .../portfolio-report-rule.interface.ts | 14 +- libs/common/src/lib/personal-finance-tools.ts | 28 -- .../lib/types/x-ray-rules-settings.type.ts | 6 +- .../lib/benchmark/benchmark.component.html | 15 -- .../src/lib/benchmark/benchmark.component.ts | 5 - .../src/lib/carousel/carousel.component.scss | 2 +- libs/ui/src/lib/i18n.ts | 1 - .../lib/line-chart/line-chart.component.ts | 7 +- .../treemap-chart/treemap-chart.component.ts | 34 +-- package.json | 2 +- prisma/schema.prisma | 4 +- .../ok-novn-buy-and-sell-partially.json | 8 +- tsconfig.base.json | 4 +- 72 files changed, 505 insertions(+), 1016 deletions(-) delete mode 100644 apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-dynamic-buy-and-sell.spec.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b0c1cf71..d83247b12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,49 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -### Fixed - -- Fixed an issue in the carousel component for the testimonial section on the landing page - -## 2.116.0 - 2024-10-17 - -### Added - -- Extended the content of the _Self-Hosting_ section by the benchmarks concept for _Compare with..._ on the Frequently Asked Questions (FAQ) page -- Extended the content of the _Self-Hosting_ section by the benchmarks concept for _Markets_ on the Frequently Asked Questions (FAQ) page -- Set the permissions (`chmod 0700`) on `entrypoint.sh` in the `Dockerfile` - -### Changed - -- Improved the empty state in the benchmarks of the markets overview -- Disabled the text hover effect in the chart of the holdings tab on the home page (experimental) -- Improved the usability to customize the rule thresholds in the _X-ray_ section by introducing units (experimental) -- Switched to adjusted market prices (splits and dividends) in the get historical functionality of the _EOD Historical Data_ service -- Improved the language localization for German (`de`) - -### Fixed - -- Fixed the usage of the environment variable `PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY` - -## 2.115.0 - 2024-10-14 - ### Added - Added the name to the tooltip of the chart of the holdings tab on the home page (experimental) ### Changed +- Improved the portfolio unit tests to work with exported activity files ### Fixed - Considered the language of the user settings on login with _Security Token_ -### Todo - -- Rename the environment variable from `PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE` to `PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY` -- Rename the environment variable from `PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA` to `PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY` -- Rename the environment variable from `PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT` to `PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY` - ## 2.114.0 - 2024-10-10 ### Added diff --git a/Dockerfile b/Dockerfile index 0e5c0d275..e6c38f273 100644 --- a/Dockerfile +++ b/Dockerfile @@ -61,7 +61,6 @@ RUN apt-get update && apt-get install -y --no-install-suggests \ COPY --chown=node:node --from=builder /ghostfolio/dist/apps /ghostfolio/apps COPY --chown=node:node ./docker/entrypoint.sh /ghostfolio/entrypoint.sh -RUN chmod 0700 /ghostfolio/entrypoint.sh WORKDIR /ghostfolio/apps/api EXPOSE ${PORT:-3333} USER node diff --git a/apps/api/src/app/account/create-account.dto.ts b/apps/api/src/app/account/create-account.dto.ts index b331d4ec7..f3c88316f 100644 --- a/apps/api/src/app/account/create-account.dto.ts +++ b/apps/api/src/app/account/create-account.dto.ts @@ -36,6 +36,6 @@ export class CreateAccountDto { name: string; @IsString() - @ValidateIf((_object, value) => value !== null) + @ValidateIf((object, value) => value !== null) platformId: string | null; } diff --git a/apps/api/src/app/account/update-account.dto.ts b/apps/api/src/app/account/update-account.dto.ts index 3a721d873..6b87af71b 100644 --- a/apps/api/src/app/account/update-account.dto.ts +++ b/apps/api/src/app/account/update-account.dto.ts @@ -35,6 +35,6 @@ export class UpdateAccountDto { name: string; @IsString() - @ValidateIf((_object, value) => value !== null) + @ValidateIf((object, value) => value !== null) platformId: string | null; } diff --git a/apps/api/src/app/admin/queue/queue.service.ts b/apps/api/src/app/admin/queue/queue.service.ts index b0058e81f..7e4f0adb7 100644 --- a/apps/api/src/app/admin/queue/queue.service.ts +++ b/apps/api/src/app/admin/queue/queue.service.ts @@ -1,6 +1,6 @@ import { DATA_GATHERING_QUEUE, - PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE, + PORTFOLIO_SNAPSHOT_QUEUE, QUEUE_JOB_STATUS_LIST } from '@ghostfolio/common/config'; import { AdminJobs } from '@ghostfolio/common/interfaces'; @@ -14,7 +14,7 @@ export class QueueService { public constructor( @InjectQueue(DATA_GATHERING_QUEUE) private readonly dataGatheringQueue: Queue, - @InjectQueue(PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE) + @InjectQueue(PORTFOLIO_SNAPSHOT_QUEUE) private readonly portfolioSnapshotQueue: Queue ) {} diff --git a/apps/api/src/app/auth/auth.controller.ts b/apps/api/src/app/auth/auth.controller.ts index 5019bef21..c81c7e224 100644 --- a/apps/api/src/app/auth/auth.controller.ts +++ b/apps/api/src/app/auth/auth.controller.ts @@ -14,12 +14,12 @@ import { Req, Res, UseGuards, - Version, - VERSION_NEUTRAL + VERSION_NEUTRAL, + Version } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { Request, Response } from 'express'; -import { getReasonPhrase, StatusCodes } from 'http-status-codes'; +import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { AuthService } from './auth.service'; import { @@ -130,7 +130,10 @@ export class AuthController { public async verifyAttestation( @Body() body: { deviceName: string; credential: AttestationCredentialJSON } ) { - return this.webAuthService.verifyAttestation(body.credential); + return this.webAuthService.verifyAttestation( + body.deviceName, + body.credential + ); } @Post('webauthn/generate-assertion-options') diff --git a/apps/api/src/app/auth/google.strategy.ts b/apps/api/src/app/auth/google.strategy.ts index 02f82a7a8..ea6772680 100644 --- a/apps/api/src/app/auth/google.strategy.ts +++ b/apps/api/src/app/auth/google.strategy.ts @@ -11,7 +11,7 @@ import { AuthService } from './auth.service'; export class GoogleStrategy extends PassportStrategy(Strategy, 'google') { public constructor( private readonly authService: AuthService, - configurationService: ConfigurationService + private readonly configurationService: ConfigurationService ) { super({ callbackURL: `${configurationService.get( @@ -25,9 +25,9 @@ export class GoogleStrategy extends PassportStrategy(Strategy, 'google') { } public async validate( - _request: any, - _token: string, - _refreshToken: string, + request: any, + token: string, + refreshToken: string, profile: Profile, done: Function ) { diff --git a/apps/api/src/app/auth/web-auth.service.ts b/apps/api/src/app/auth/web-auth.service.ts index 2f8dd1018..961bbe9a7 100644 --- a/apps/api/src/app/auth/web-auth.service.ts +++ b/apps/api/src/app/auth/web-auth.service.ts @@ -13,16 +13,16 @@ import { import { REQUEST } from '@nestjs/core'; import { JwtService } from '@nestjs/jwt'; import { - generateAuthenticationOptions, GenerateAuthenticationOptionsOpts, - generateRegistrationOptions, GenerateRegistrationOptionsOpts, VerifiedAuthenticationResponse, VerifiedRegistrationResponse, - verifyAuthenticationResponse, VerifyAuthenticationResponseOpts, - verifyRegistrationResponse, - VerifyRegistrationResponseOpts + VerifyRegistrationResponseOpts, + generateAuthenticationOptions, + generateRegistrationOptions, + verifyAuthenticationResponse, + verifyRegistrationResponse } from '@simplewebauthn/server'; import { @@ -80,6 +80,7 @@ export class WebAuthService { } public async verifyAttestation( + deviceName: string, credential: AttestationCredentialJSON ): Promise { const user = this.request.user; diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index dec0e6387..3d39b80b5 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -15,8 +15,8 @@ import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper' import { PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME, PORTFOLIO_SNAPSHOT_PROCESS_JOB_OPTIONS, - PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_HIGH, - PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_LOW + PORTFOLIO_SNAPSHOT_QUEUE_PRIORITY_HIGH, + PORTFOLIO_SNAPSHOT_QUEUE_PRIORITY_LOW } from '@ghostfolio/common/config'; import { DATE_FORMAT, @@ -1080,7 +1080,7 @@ export abstract class PortfolioCalculator { opts: { ...PORTFOLIO_SNAPSHOT_PROCESS_JOB_OPTIONS, jobId, - priority: PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_LOW + priority: PORTFOLIO_SNAPSHOT_QUEUE_PRIORITY_LOW } }); } @@ -1096,7 +1096,7 @@ export abstract class PortfolioCalculator { opts: { ...PORTFOLIO_SNAPSHOT_PROCESS_JOB_OPTIONS, jobId, - priority: PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_HIGH + priority: PORTFOLIO_SNAPSHOT_QUEUE_PRIORITY_HIGH } }); diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-dynamic-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-dynamic-buy-and-sell.spec.ts deleted file mode 100644 index 529583fc0..000000000 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-dynamic-buy-and-sell.spec.ts +++ /dev/null @@ -1,252 +0,0 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; -import { userDummyData } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; -import { - PerformanceCalculationType, - PortfolioCalculatorFactory -} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; -import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; -import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock'; -import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; -import { RedisCacheServiceMock } from '@ghostfolio/api/app/redis-cache/redis-cache.service.mock'; -import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; -import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; -import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; -import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; -import { parseDate } from '@ghostfolio/common/helper'; - -import { Big } from 'big.js'; -import { existsSync, readFileSync } from 'fs'; -import { last } from 'lodash'; -import { join } from 'path'; - -jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { - return { - // eslint-disable-next-line @typescript-eslint/naming-convention - CurrentRateService: jest.fn().mockImplementation(() => { - return CurrentRateServiceMock; - }) - }; -}); - -jest.mock( - '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', - () => { - return { - // eslint-disable-next-line @typescript-eslint/naming-convention - PortfolioSnapshotService: jest.fn().mockImplementation(() => { - return PortfolioSnapshotServiceMock; - }) - }; - } -); - -jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { - return { - // eslint-disable-next-line @typescript-eslint/naming-convention - RedisCacheService: jest.fn().mockImplementation(() => { - return RedisCacheServiceMock; - }) - }; -}); - -describe('PortfolioCalculator', () => { - let configurationService: ConfigurationService; - let currentRateService: CurrentRateService; - let exchangeRateDataService: ExchangeRateDataService; - let portfolioCalculatorFactory: PortfolioCalculatorFactory; - let portfolioSnapshotService: PortfolioSnapshotService; - let redisCacheService: RedisCacheService; - - beforeEach(() => { - configurationService = new ConfigurationService(); - - currentRateService = new CurrentRateService(null, null, null, null); - - exchangeRateDataService = new ExchangeRateDataService( - null, - null, - null, - null - ); - - portfolioSnapshotService = new PortfolioSnapshotService(null); - - redisCacheService = new RedisCacheService(null, null); - - portfolioCalculatorFactory = new PortfolioCalculatorFactory( - configurationService, - currentRateService, - exchangeRateDataService, - portfolioSnapshotService, - redisCacheService - ); - }); - - //read from activities json - let activities: any[]; - - beforeAll(() => { - const jsonFilePath = join( - __dirname, - '../../../../../../../test/import/ok-novn-buy-and-sell.json' - ); - - if (!existsSync(jsonFilePath)) - throw new Error('JSON file not found at: ' + jsonFilePath); - - const jsonData = readFileSync(jsonFilePath, 'utf8'); - activities = JSON.parse(jsonData).activities; - }); - - describe('get current positions', () => { - it.only('with NOVN.SW buy and sell', async () => { - jest.useFakeTimers().setSystemTime(parseDate('2022-04-11').getTime()); - - //map activity with json - const mappedactivities: Activity[] = activities.map((activity) => ({ - ...activity, - date: new Date(activity.date), - SymbolProfile: { - currency: activity.currency || 'CHF', - dataSource: activity.dataSource || 'YAHOO', - name: activity.name || 'Default Name', // provide a default name if missing - symbol: activity.symbol || 'UNKNOWN' // provide a default symbol if missing - } - })); - - const portfolioCalculator = portfolioCalculatorFactory.createCalculator({ - activities: mappedactivities, - calculationType: PerformanceCalculationType.TWR, - currency: 'CHF', - userId: userDummyData.id - }); - - const portfolioSnapshot = await portfolioCalculator.computeSnapshot(); - - const investments = portfolioCalculator.getInvestments(); - - const investmentsByMonth = portfolioCalculator.getInvestmentsByGroup({ - data: portfolioSnapshot.historicalData, - groupBy: 'month' - }); - - expect(portfolioSnapshot.historicalData[0]).toEqual({ - date: '2022-03-06', - investmentValueWithCurrencyEffect: 0, - netPerformance: 0, - netPerformanceInPercentage: 0, - netPerformanceInPercentageWithCurrencyEffect: 0, - netPerformanceWithCurrencyEffect: 0, - netWorth: 0, - totalAccountBalance: 0, - totalInvestment: 0, - totalInvestmentValueWithCurrencyEffect: 0, - value: 0, - valueWithCurrencyEffect: 0 - }); - - expect(portfolioSnapshot.historicalData[1]).toEqual({ - date: '2022-03-07', - investmentValueWithCurrencyEffect: 151.6, - netPerformance: 0, - netPerformanceInPercentage: 0, - netPerformanceInPercentageWithCurrencyEffect: 0, - netPerformanceWithCurrencyEffect: 0, - netWorth: 151.6, - totalAccountBalance: 0, - totalInvestment: 151.6, - totalInvestmentValueWithCurrencyEffect: 151.6, - value: 151.6, - valueWithCurrencyEffect: 151.6 - }); - - expect( - portfolioSnapshot.historicalData[ - portfolioSnapshot.historicalData.length - 1 - ] - ).toEqual({ - date: '2022-04-11', - investmentValueWithCurrencyEffect: 0, - netPerformance: 19.86, - netPerformanceInPercentage: 0.13100263852242744, - netPerformanceInPercentageWithCurrencyEffect: 0.13100263852242744, - netPerformanceWithCurrencyEffect: 19.86, - netWorth: 0, - totalAccountBalance: 0, - totalInvestment: 0, - totalInvestmentValueWithCurrencyEffect: 0, - value: 0, - valueWithCurrencyEffect: 0 - }); - - expect(portfolioSnapshot).toMatchObject({ - currentValueInBaseCurrency: new Big('0'), - errors: [], - hasErrors: false, - positions: [ - { - averagePrice: new Big('0'), - currency: 'CHF', - dataSource: 'YAHOO', - dividend: new Big('0'), - dividendInBaseCurrency: new Big('0'), - fee: new Big('0'), - feeInBaseCurrency: new Big('0'), - firstBuyDate: '2022-03-07', - grossPerformance: new Big('19.86'), - grossPerformancePercentage: new Big('0.13100263852242744063'), - grossPerformancePercentageWithCurrencyEffect: new Big( - '0.13100263852242744063' - ), - grossPerformanceWithCurrencyEffect: new Big('19.86'), - investment: new Big('0'), - investmentWithCurrencyEffect: new Big('0'), - netPerformance: new Big('19.86'), - netPerformancePercentage: new Big('0.13100263852242744063'), - netPerformancePercentageWithCurrencyEffectMap: { - max: new Big('0.13100263852242744063') - }, - netPerformanceWithCurrencyEffectMap: { - max: new Big('19.86') - }, - marketPrice: 87.8, - marketPriceInBaseCurrency: 87.8, - quantity: new Big('0'), - symbol: 'NOVN.SW', - tags: [], - timeWeightedInvestment: new Big('151.6'), - timeWeightedInvestmentWithCurrencyEffect: new Big('151.6'), - transactionCount: 2, - valueInBaseCurrency: new Big('0') - } - ], - totalFeesWithCurrencyEffect: new Big('0'), - totalInterestWithCurrencyEffect: new Big('0'), - totalInvestment: new Big('0'), - totalInvestmentWithCurrencyEffect: new Big('0'), - totalLiabilitiesWithCurrencyEffect: new Big('0'), - totalValuablesWithCurrencyEffect: new Big('0') - }); - - expect(last(portfolioSnapshot.historicalData)).toMatchObject( - expect.objectContaining({ - netPerformance: 19.86, - netPerformanceInPercentage: 0.13100263852242744063, - netPerformanceInPercentageWithCurrencyEffect: 0.13100263852242744063, - netPerformanceWithCurrencyEffect: 19.86, - totalInvestmentValueWithCurrencyEffect: 0 - }) - ); - - expect(investments).toEqual([ - { date: '2022-03-07', investment: new Big('151.6') }, - { date: '2022-04-08', investment: new Big('0') } - ]); - - expect(investmentsByMonth).toEqual([ - { date: '2022-03-01', investment: 151.6 }, - { date: '2022-04-01', investment: -151.6 } - ]); - }); - }); -}); diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts index f9f99ee45..30eb79754 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts @@ -1,8 +1,6 @@ -import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, - loadActivityExportFile, symbolProfileDummyData, userDummyData } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; @@ -22,7 +20,6 @@ import { parseDate } from '@ghostfolio/common/helper'; import { Big } from 'big.js'; import { last } from 'lodash'; -import { join } from 'path'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { @@ -55,8 +52,6 @@ jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { }); describe('PortfolioCalculator', () => { - let activityDtos: CreateOrderDto[]; - let configurationService: ConfigurationService; let currentRateService: CurrentRateService; let exchangeRateDataService: ExchangeRateDataService; @@ -64,15 +59,6 @@ describe('PortfolioCalculator', () => { let portfolioSnapshotService: PortfolioSnapshotService; let redisCacheService: RedisCacheService; - beforeAll(() => { - activityDtos = loadActivityExportFile( - join( - __dirname, - '../../../../../../../test/import/ok-novn-buy-and-sell-partially.json' - ) - ); - }); - beforeEach(() => { configurationService = new ConfigurationService(); @@ -102,18 +88,38 @@ describe('PortfolioCalculator', () => { it.only('with NOVN.SW buy and sell partially', async () => { jest.useFakeTimers().setSystemTime(parseDate('2022-04-11').getTime()); - const activities: Activity[] = activityDtos.map((activity) => ({ - ...activityDummyData, - ...activity, - date: parseDate(activity.date), - SymbolProfile: { - ...symbolProfileDummyData, - currency: activity.currency, - dataSource: activity.dataSource, - name: 'Novartis AG', - symbol: activity.symbol + const activities: Activity[] = [ + { + ...activityDummyData, + date: new Date('2022-03-07'), + fee: 1.3, + quantity: 2, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'CHF', + dataSource: 'YAHOO', + name: 'Novartis AG', + symbol: 'NOVN.SW' + }, + type: 'BUY', + unitPrice: 75.8 + }, + { + ...activityDummyData, + date: new Date('2022-04-08'), + fee: 2.95, + quantity: 1, + SymbolProfile: { + ...symbolProfileDummyData, + currency: 'CHF', + dataSource: 'YAHOO', + name: 'Novartis AG', + symbol: 'NOVN.SW' + }, + type: 'SELL', + unitPrice: 85.73 } - })); + ]; const portfolioCalculator = portfolioCalculatorFactory.createCalculator({ activities, diff --git a/apps/api/src/app/portfolio/rules.service.ts b/apps/api/src/app/portfolio/rules.service.ts index 5f0aa64d5..fd9d794b2 100644 --- a/apps/api/src/app/portfolio/rules.service.ts +++ b/apps/api/src/app/portfolio/rules.service.ts @@ -24,10 +24,13 @@ export class RulesService { return { evaluation, value, - configuration: rule.getConfiguration(), isActive: true, key: rule.getKey(), - name: rule.getName() + name: rule.getName(), + settings: { + thresholdMax: settings['thresholdMax'], + thresholdMin: settings['thresholdMin'] + } }; } else { return { diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index e8a437be6..0f76b9540 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -2,12 +2,6 @@ import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { SubscriptionService } from '@ghostfolio/api/app/subscription/subscription.service'; import { environment } from '@ghostfolio/api/environments/environment'; import { PortfolioChangedEvent } from '@ghostfolio/api/events/portfolio-changed.event'; -import { AccountClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rules/account-cluster-risk/current-investment'; -import { AccountClusterRiskSingleAccount } from '@ghostfolio/api/models/rules/account-cluster-risk/single-account'; -import { CurrencyClusterRiskBaseCurrencyCurrentInvestment } from '@ghostfolio/api/models/rules/currency-cluster-risk/base-currency-current-investment'; -import { CurrencyClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rules/currency-cluster-risk/current-investment'; -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 { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; @@ -206,35 +200,17 @@ export class UserService { (user.Settings.settings as UserSettings).viewMode = 'DEFAULT'; } - (user.Settings.settings as UserSettings).xRayRules = { - AccountClusterRiskCurrentInvestment: - new AccountClusterRiskCurrentInvestment(undefined, {}).getSettings( - user.Settings.settings - ), - AccountClusterRiskSingleAccount: new AccountClusterRiskSingleAccount( - undefined, - {} - ).getSettings(user.Settings.settings), - CurrencyClusterRiskBaseCurrencyCurrentInvestment: - new CurrencyClusterRiskBaseCurrencyCurrentInvestment( - undefined, - undefined - ).getSettings(user.Settings.settings), - CurrencyClusterRiskCurrentInvestment: - new CurrencyClusterRiskCurrentInvestment( - undefined, - undefined - ).getSettings(user.Settings.settings), - EmergencyFundSetup: new EmergencyFundSetup( - undefined, - undefined - ).getSettings(user.Settings.settings), - FeeRatioInitialInvestment: new FeeRatioInitialInvestment( - undefined, - undefined, - undefined - ).getSettings(user.Settings.settings) - }; + // Set default values for X-ray rules + if (!(user.Settings.settings as UserSettings).xRayRules) { + (user.Settings.settings as UserSettings).xRayRules = { + AccountClusterRiskCurrentInvestment: { isActive: true }, + AccountClusterRiskSingleAccount: { isActive: true }, + CurrencyClusterRiskBaseCurrencyCurrentInvestment: { isActive: true }, + CurrencyClusterRiskCurrentInvestment: { isActive: true }, + EmergencyFundSetup: { isActive: true }, + FeeRatioInitialInvestment: { isActive: true } + }; + } let currentPermissions = getPermissions(user.role); diff --git a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts index f5034927c..aff42f002 100644 --- a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts +++ b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts @@ -21,7 +21,7 @@ export class TransformDataSourceInResponseInterceptor ) {} public intercept( - _context: ExecutionContext, + context: ExecutionContext, next: CallHandler ): Observable { return next.handle().pipe( diff --git a/apps/api/src/models/rule.ts b/apps/api/src/models/rule.ts index 187527fbb..a1e0d9bee 100644 --- a/apps/api/src/models/rule.ts +++ b/apps/api/src/models/rule.ts @@ -1,11 +1,7 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { groupBy } from '@ghostfolio/common/helper'; -import { - PortfolioPosition, - PortfolioReportRule, - UserSettings -} from '@ghostfolio/common/interfaces'; +import { PortfolioPosition, UserSettings } from '@ghostfolio/common/interfaces'; import { Big } from 'big.js'; @@ -69,9 +65,5 @@ export abstract class Rule implements RuleInterface { public abstract evaluate(aRuleSettings: T): EvaluationResult; - public abstract getConfiguration(): Partial< - PortfolioReportRule['configuration'] - >; - public abstract getSettings(aUserSettings: UserSettings): T; } diff --git a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts index 564af935d..13680270e 100644 --- a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts +++ b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts @@ -76,23 +76,11 @@ export class AccountClusterRiskCurrentInvestment extends Rule { }; } - public getConfiguration() { - return { - threshold: { - max: 1, - min: 0, - step: 0.01, - unit: '%' - }, - thresholdMax: true - }; - } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, - isActive: xRayRules?.[this.getKey()].isActive ?? true, - thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.5 + isActive: xRayRules[this.getKey()].isActive, + thresholdMax: xRayRules[this.getKey()]?.thresholdMax ?? 0.5 }; } } diff --git a/apps/api/src/models/rules/account-cluster-risk/single-account.ts b/apps/api/src/models/rules/account-cluster-risk/single-account.ts index ef549e579..feaaf4e38 100644 --- a/apps/api/src/models/rules/account-cluster-risk/single-account.ts +++ b/apps/api/src/models/rules/account-cluster-risk/single-account.ts @@ -34,13 +34,9 @@ export class AccountClusterRiskSingleAccount extends Rule { }; } - public getConfiguration() { - return undefined; - } - public getSettings({ xRayRules }: UserSettings): RuleSettings { return { - isActive: xRayRules?.[this.getKey()].isActive ?? true + isActive: xRayRules[this.getKey()].isActive }; } } diff --git a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts index 573795799..39ee8b88d 100644 --- a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts +++ b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts @@ -61,14 +61,10 @@ export class CurrencyClusterRiskBaseCurrencyCurrentInvestment extends Rule { }; } - public getConfiguration() { - return { - threshold: { - max: 1, - min: 0, - step: 0.01, - unit: '%' - }, - thresholdMax: true - }; - } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, - isActive: xRayRules?.[this.getKey()].isActive ?? true, - thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.5 + isActive: xRayRules[this.getKey()].isActive, + thresholdMax: xRayRules[this.getKey()]?.thresholdMax ?? 0.5 }; } } diff --git a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts index d13f2ffc5..819b8bd7b 100644 --- a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts +++ b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts @@ -32,14 +32,10 @@ export class EmergencyFundSetup extends Rule { }; } - public getConfiguration() { - return undefined; - } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, - isActive: xRayRules?.[this.getKey()].isActive ?? true + isActive: xRayRules[this.getKey()].isActive }; } } diff --git a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts index fa9d7e7bc..9b1961ed6 100644 --- a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts +++ b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts @@ -43,23 +43,11 @@ export class FeeRatioInitialInvestment extends Rule { }; } - public getConfiguration() { - return { - threshold: { - max: 0.1, - min: 0, - step: 0.0025, - unit: '%' - }, - thresholdMax: true - }; - } - public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, - isActive: xRayRules?.[this.getKey()].isActive ?? true, - thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.01 + isActive: xRayRules[this.getKey()].isActive, + thresholdMax: xRayRules[this.getKey()]?.thresholdMax ?? 0.01 }; } } diff --git a/apps/api/src/services/configuration/configuration.service.ts b/apps/api/src/services/configuration/configuration.service.ts index 10810deb5..cca393a2a 100644 --- a/apps/api/src/services/configuration/configuration.service.ts +++ b/apps/api/src/services/configuration/configuration.service.ts @@ -1,10 +1,9 @@ import { Environment } from '@ghostfolio/api/services/interfaces/environment.interface'; import { CACHE_TTL_NO_CACHE, - DEFAULT_PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY, - DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY, - DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY, - DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT, + DEFAULT_PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE, + DEFAULT_PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA, + DEFAULT_PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT, DEFAULT_ROOT_URL } from '@ghostfolio/common/config'; @@ -51,17 +50,14 @@ export class ConfigurationService { MAX_ACTIVITIES_TO_IMPORT: num({ default: Number.MAX_SAFE_INTEGER }), MAX_CHART_ITEMS: num({ default: 365 }), PORT: port({ default: 3333 }), - PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY: num({ - default: DEFAULT_PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY + PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE: num({ + default: DEFAULT_PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE }), - PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY: num({ - default: DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY + PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA: num({ + default: DEFAULT_PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA }), - PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY: num({ - default: DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY - }), - PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT: num({ - default: DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT + PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT: num({ + default: DEFAULT_PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT }), REDIS_DB: num({ default: 0 }), REDIS_HOST: str({ default: 'localhost' }), diff --git a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts index 8a8ab1f08..951a623d0 100644 --- a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts +++ b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.spec.ts @@ -1,3 +1,4 @@ +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service'; import { YahooFinanceDataEnhancerService } from './yahoo-finance.service'; @@ -25,13 +26,16 @@ jest.mock( ); describe('YahooFinanceDataEnhancerService', () => { + let configurationService: ConfigurationService; let cryptocurrencyService: CryptocurrencyService; let yahooFinanceDataEnhancerService: YahooFinanceDataEnhancerService; beforeAll(async () => { + configurationService = new ConfigurationService(); cryptocurrencyService = new CryptocurrencyService(); yahooFinanceDataEnhancerService = new YahooFinanceDataEnhancerService( + configurationService, cryptocurrencyService ); }); diff --git a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts index 6090b4f98..1b1335b7e 100644 --- a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts @@ -1,3 +1,4 @@ +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service'; import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; import { @@ -23,6 +24,7 @@ import type { Price } from 'yahoo-finance2/dist/esm/src/modules/quoteSummary-ifa @Injectable() export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { public constructor( + private readonly configurationService: ConfigurationService, private readonly cryptocurrencyService: CryptocurrencyService ) {} diff --git a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts index 78325d447..3a840340e 100644 --- a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts +++ b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts @@ -163,10 +163,10 @@ export class EodHistoricalDataService implements DataProviderInterface { ).json(); return response.reduce( - (result, { adjusted_close, date }) => { - if (isNumber(adjusted_close)) { + (result, { close, date }) => { + if (isNumber(close)) { result[this.convertFromEodSymbol(symbol)][date] = { - marketPrice: adjusted_close + marketPrice: close }; } else { Logger.error( diff --git a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts index 9f2344233..966069f22 100644 --- a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts +++ b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts @@ -76,7 +76,7 @@ export class GoogleSheetsService implements DataProviderInterface { } = {}; rows - .filter((_row, index) => { + .filter((row, index) => { return index >= 1; }) .forEach((row) => { diff --git a/apps/api/src/services/interfaces/environment.interface.ts b/apps/api/src/services/interfaces/environment.interface.ts index 8d6dd34de..d07937787 100644 --- a/apps/api/src/services/interfaces/environment.interface.ts +++ b/apps/api/src/services/interfaces/environment.interface.ts @@ -30,10 +30,6 @@ export interface Environment extends CleanedEnvAccessors { MAX_ACTIVITIES_TO_IMPORT: number; MAX_CHART_ITEMS: number; PORT: number; - PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY: number; - PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY: number; - PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY: number; - PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT: number; REDIS_DB: number; REDIS_HOST: string; REDIS_PASSWORD: string; diff --git a/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts b/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts index 5d0d1e131..2745aa288 100644 --- a/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts +++ b/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts @@ -3,8 +3,8 @@ import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfac import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { DATA_GATHERING_QUEUE, - DEFAULT_PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY, - DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY, + DEFAULT_PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE, + DEFAULT_PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA, GATHER_ASSET_PROFILE_PROCESS, GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_NAME } from '@ghostfolio/common/config'; @@ -38,8 +38,8 @@ export class DataGatheringProcessor { @Process({ concurrency: parseInt( - process.env.PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY ?? - DEFAULT_PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY.toString(), + process.env.PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE ?? + DEFAULT_PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE.toString(), 10 ), name: GATHER_ASSET_PROFILE_PROCESS @@ -69,8 +69,8 @@ export class DataGatheringProcessor { @Process({ concurrency: parseInt( - process.env.PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY ?? - DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY.toString(), + process.env.PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA ?? + DEFAULT_PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA.toString(), 10 ), name: GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_NAME diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts index 958636334..620feda53 100644 --- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts +++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts @@ -8,10 +8,7 @@ import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data- import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; -import { - DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT, - PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE -} from '@ghostfolio/common/config'; +import { PORTFOLIO_SNAPSHOT_QUEUE } from '@ghostfolio/common/config'; import { BullModule } from '@nestjs/bull'; import { Module } from '@nestjs/common'; @@ -23,14 +20,7 @@ import { PortfolioSnapshotProcessor } from './portfolio-snapshot.processor'; imports: [ AccountBalanceModule, BullModule.registerQueue({ - name: PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE, - settings: { - lockDuration: parseInt( - process.env.PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT ?? - DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT.toString(), - 10 - ) - } + name: PORTFOLIO_SNAPSHOT_QUEUE }), ConfigurationModule, DataProviderModule, diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts index c586a51b3..7c89e9c23 100644 --- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts +++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts @@ -9,9 +9,9 @@ import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.s import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { CACHE_TTL_INFINITE, - DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY, + DEFAULT_PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT, PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME, - PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE + PORTFOLIO_SNAPSHOT_QUEUE } from '@ghostfolio/common/config'; import { Process, Processor } from '@nestjs/bull'; @@ -22,7 +22,7 @@ import { addMilliseconds } from 'date-fns'; import { IPortfolioSnapshotQueueJob } from './interfaces/portfolio-snapshot-queue-job.interface'; @Injectable() -@Processor(PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE) +@Processor(PORTFOLIO_SNAPSHOT_QUEUE) export class PortfolioSnapshotProcessor { public constructor( private readonly accountBalanceService: AccountBalanceService, @@ -34,8 +34,8 @@ export class PortfolioSnapshotProcessor { @Process({ concurrency: parseInt( - process.env.PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY ?? - DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY.toString(), + process.env.PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT ?? + DEFAULT_PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT.toString(), 10 ), name: PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.ts index 9dba9275e..27ebdee53 100644 --- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.ts +++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.service.ts @@ -1,4 +1,4 @@ -import { PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE } from '@ghostfolio/common/config'; +import { PORTFOLIO_SNAPSHOT_QUEUE } from '@ghostfolio/common/config'; import { InjectQueue } from '@nestjs/bull'; import { Injectable } from '@nestjs/common'; @@ -9,7 +9,7 @@ import { IPortfolioSnapshotQueueJob } from './interfaces/portfolio-snapshot-queu @Injectable() export class PortfolioSnapshotService { public constructor( - @InjectQueue(PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE) + @InjectQueue(PORTFOLIO_SNAPSHOT_QUEUE) private readonly portfolioSnapshotQueue: Queue ) {} diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts index dc80b4058..a59515969 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -29,13 +29,12 @@ import { SymbolProfile } from '@prisma/client'; import { Chart, ChartData, - LinearScale, LineController, LineElement, + LinearScale, PointElement, TimeScale, - Tooltip, - TooltipPosition + Tooltip } from 'chart.js'; import 'chartjs-adapter-date-fns'; import annotationPlugin from 'chartjs-plugin-annotation'; @@ -75,7 +74,7 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { Tooltip ); - Tooltip.positioners['top'] = (_elements, position: TooltipPosition) => + Tooltip.positioners['top'] = (elements, position) => getTooltipPositionerMapTop(this.chart, position); } diff --git a/apps/client/src/app/components/home-market/home-market.component.ts b/apps/client/src/app/components/home-market/home-market.component.ts index 3480eaeb7..3a42a9ebc 100644 --- a/apps/client/src/app/components/home-market/home-market.component.ts +++ b/apps/client/src/app/components/home-market/home-market.component.ts @@ -29,6 +29,7 @@ export class HomeMarketComponent implements OnDestroy, OnInit { public hasPermissionToAccessFearAndGreedIndex: boolean; public historicalDataItems: HistoricalDataItem[]; public info: InfoItem; + public isLoading = true; public readonly numberOfDays = 365; public user: User; @@ -42,6 +43,7 @@ export class HomeMarketComponent implements OnDestroy, OnInit { ) { this.deviceType = this.deviceService.getDeviceInfo().deviceType; this.info = this.dataService.fetchInfo(); + this.isLoading = true; this.userService.stateChanged .pipe(takeUntil(this.unsubscribeSubject)) @@ -87,6 +89,7 @@ export class HomeMarketComponent implements OnDestroy, OnInit { .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(({ benchmarks }) => { this.benchmarks = benchmarks; + this.isLoading = false; this.changeDetectorRef.markForCheck(); }); diff --git a/apps/client/src/app/components/home-market/home-market.html b/apps/client/src/app/components/home-market/home-market.html index 2fcdb5716..c362fdd18 100644 --- a/apps/client/src/app/components/home-market/home-market.html +++ b/apps/client/src/app/components/home-market/home-market.html @@ -36,6 +36,16 @@ [locale]="user?.settings?.locale || undefined" [user]="user" /> + @if (isLoading) { + + } diff --git a/apps/client/src/app/components/home-market/home-market.module.ts b/apps/client/src/app/components/home-market/home-market.module.ts index b8e6582a5..bc35b4bef 100644 --- a/apps/client/src/app/components/home-market/home-market.module.ts +++ b/apps/client/src/app/components/home-market/home-market.module.ts @@ -4,6 +4,7 @@ import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { HomeMarketComponent } from './home-market.component'; @@ -14,7 +15,8 @@ import { HomeMarketComponent } from './home-market.component'; CommonModule, GfBenchmarkComponent, GfFearAndGreedIndexModule, - GfLineChartComponent + GfLineChartComponent, + NgxSkeletonLoaderModule ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) diff --git a/apps/client/src/app/components/investment-chart/investment-chart.component.ts b/apps/client/src/app/components/investment-chart/investment-chart.component.ts index e84032060..15a4a6f9a 100644 --- a/apps/client/src/app/components/investment-chart/investment-chart.component.ts +++ b/apps/client/src/app/components/investment-chart/investment-chart.component.ts @@ -29,13 +29,12 @@ import { BarElement, Chart, ChartData, - LinearScale, LineController, LineElement, + LinearScale, PointElement, TimeScale, - Tooltip, - TooltipPosition + Tooltip } from 'chart.js'; import 'chartjs-adapter-date-fns'; import annotationPlugin from 'chartjs-plugin-annotation'; @@ -80,7 +79,7 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy { Tooltip ); - Tooltip.positioners['top'] = (_elements, position: TooltipPosition) => + Tooltip.positioners['top'] = (elements, position) => getTooltipPositionerMapTop(this.chart, position); } diff --git a/apps/client/src/app/components/rule/rule-settings-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/rule/rule-settings-dialog/interfaces/interfaces.ts index 7eee7e52d..a409ab503 100644 --- a/apps/client/src/app/components/rule/rule-settings-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/rule/rule-settings-dialog/interfaces/interfaces.ts @@ -1,7 +1,5 @@ import { PortfolioReportRule } from '@ghostfolio/common/interfaces'; -import { XRayRulesSettings } from '@ghostfolio/common/types'; export interface IRuleSettingsDialogParams { rule: PortfolioReportRule; - settings: XRayRulesSettings['AccountClusterRiskCurrentInvestment']; } diff --git a/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts b/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts index 7aa228776..265d3c941 100644 --- a/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts +++ b/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts @@ -1,4 +1,4 @@ -import { XRayRulesSettings } from '@ghostfolio/common/types'; +import { PortfolioReportRule } from '@ghostfolio/common/interfaces'; import { CommonModule } from '@angular/common'; import { Component, Inject } from '@angular/core'; @@ -9,7 +9,8 @@ import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; -import { MatSliderModule } from '@angular/material/slider'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { IRuleSettingsDialogParams } from './interfaces/interfaces'; @@ -19,7 +20,8 @@ import { IRuleSettingsDialogParams } from './interfaces/interfaces'; FormsModule, MatButtonModule, MatDialogModule, - MatSliderModule + MatFormFieldModule, + MatInputModule ], selector: 'gf-rule-settings-dialog', standalone: true, @@ -27,10 +29,12 @@ import { IRuleSettingsDialogParams } from './interfaces/interfaces'; templateUrl: './rule-settings-dialog.html' }) export class GfRuleSettingsDialogComponent { - public settings: XRayRulesSettings['AccountClusterRiskCurrentInvestment']; + public settings: PortfolioReportRule['settings']; public constructor( @Inject(MAT_DIALOG_DATA) public data: IRuleSettingsDialogParams, public dialogRef: MatDialogRef - ) {} + ) { + this.settings = this.data.rule.settings; + } } diff --git a/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html b/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html index 8806dae6a..ef86549f6 100644 --- a/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html +++ b/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -1,85 +1,37 @@
{{ data.rule.name }}
-
-
- Threshold Min: - @if (data.rule.configuration.threshold.unit === '%') { - {{ data.settings.thresholdMin | percent: '1.2-2' }} - } @else { - {{ data.settings.thresholdMin }} - } -
- @if (data.rule.configuration.threshold.unit === '%') { - - } @else { - - } - Threshold Min + - - - @if (data.rule.configuration.threshold.unit === '%') { - - } @else { - - } -
-
+ + -
- Threshold Max: - @if (data.rule.configuration.threshold.unit === '%') { - {{ data.settings.thresholdMax | percent: '1.2-2' }} - } @else { - {{ data.settings.thresholdMax }} - } -
- @if (data.rule.configuration.threshold.unit === '%') { - - } @else { - - } - Threshold Max + - - - @if (data.rule.configuration.threshold.unit === '%') { - - } @else { - - } -
+ type="number" + [(ngModel)]="settings.thresholdMax" + /> +
-
diff --git a/apps/client/src/app/components/rule/rule.component.html b/apps/client/src/app/components/rule/rule.component.html index 7cea512e3..5491933c0 100644 --- a/apps/client/src/app/components/rule/rule.component.html +++ b/apps/client/src/app/components/rule/rule.component.html @@ -62,7 +62,7 @@ - @if (rule?.isActive && rule?.configuration) { + @if (rule?.isActive && !isEmpty(rule.settings)) { diff --git a/apps/client/src/app/components/rule/rule.component.ts b/apps/client/src/app/components/rule/rule.component.ts index f51ce805f..6e6c368f0 100644 --- a/apps/client/src/app/components/rule/rule.component.ts +++ b/apps/client/src/app/components/rule/rule.component.ts @@ -1,7 +1,5 @@ import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { PortfolioReportRule } from '@ghostfolio/common/interfaces'; -import { XRayRulesSettings } from '@ghostfolio/common/types'; import { ChangeDetectionStrategy, @@ -12,6 +10,7 @@ import { Output } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; +import { isEmpty } from 'lodash'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject, takeUntil } from 'rxjs'; @@ -28,10 +27,11 @@ export class RuleComponent implements OnInit { @Input() hasPermissionToUpdateUserSettings: boolean; @Input() isLoading: boolean; @Input() rule: PortfolioReportRule; - @Input() settings: XRayRulesSettings['AccountClusterRiskCurrentInvestment']; @Output() ruleUpdated = new EventEmitter(); + public isEmpty = isEmpty; + private deviceType: string; private unsubscribeSubject = new Subject(); @@ -46,17 +46,16 @@ export class RuleComponent implements OnInit { public onCustomizeRule(rule: PortfolioReportRule) { const dialogRef = this.dialog.open(GfRuleSettingsDialogComponent, { - data: { - rule, - settings: this.settings - } as IRuleSettingsDialogParams, + data: { + rule + }, width: this.deviceType === 'mobile' ? '100vw' : '50rem' }); dialogRef .afterClosed() .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe((settings: RuleSettings) => { + .subscribe((settings: PortfolioReportRule['settings']) => { if (settings) { this.ruleUpdated.emit({ xRayRules: { diff --git a/apps/client/src/app/components/rules/rules.component.html b/apps/client/src/app/components/rules/rules.component.html index 28343673d..31e61bfc2 100644 --- a/apps/client/src/app/components/rules/rules.component.html +++ b/apps/client/src/app/components/rules/rules.component.html @@ -12,7 +12,6 @@ hasPermissionToUpdateUserSettings " [rule]="rule" - [settings]="settings?.[rule.key]" (ruleUpdated)="onRuleUpdated($event)" /> } diff --git a/apps/client/src/app/components/rules/rules.component.ts b/apps/client/src/app/components/rules/rules.component.ts index fb2ef1cdb..b8493e7be 100644 --- a/apps/client/src/app/components/rules/rules.component.ts +++ b/apps/client/src/app/components/rules/rules.component.ts @@ -1,6 +1,5 @@ import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; import { PortfolioReportRule } from '@ghostfolio/common/interfaces'; -import { XRayRulesSettings } from '@ghostfolio/common/types'; import { ChangeDetectionStrategy, @@ -20,10 +19,11 @@ export class RulesComponent { @Input() hasPermissionToUpdateUserSettings: boolean; @Input() isLoading: boolean; @Input() rules: PortfolioReportRule[]; - @Input() settings: XRayRulesSettings; @Output() rulesUpdated = new EventEmitter(); + public constructor() {} + public onRuleUpdated(event: UpdateUserSettingDto) { this.rulesUpdated.emit(event); } diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html index 7538678c3..96da35ca9 100644 --- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html @@ -51,8 +51,8 @@ manually enter it.

    -
  1. Open the Admin Control panel
  2. -
  3. Navigate to the Market Data section
  4. +
  5. Go to the Admin Control panel
  6. +
  7. Go to the Market Data section
  8. Click on the + button
  9. Switch to Add Currency
  10. Insert e.g. EUR for Euro
  11. @@ -78,8 +78,8 @@ do the following:

      -
    1. Open the Admin Control panel
    2. -
    3. Navigate to the Market Data section
    4. +
    5. Go to the Admin Control panel
    6. +
    7. Go to the Market Data section
    8. Select Filter by Currencies
    9. Find the entry USDEUR
    10. @@ -105,8 +105,8 @@
        -
      1. Open the Admin Control panel
      2. -
      3. Navigate to the Settings section
      4. +
      5. Go to the Admin Control panel
      6. +
      7. Go to the Settings section
      8. Click on the Add Platform button
      @@ -117,8 +117,8 @@
        -
      1. Open the Admin Control panel
      2. -
      3. Navigate to the Settings section
      4. +
      5. Go to the Admin Control panel
      6. +
      7. Go to the Settings section
      8. Click on the Add Tag button
      @@ -133,24 +133,6 @@ providers are considered experimental. - - - How do I set up a benchmark? - - -

      - To compare your performance with benchmarks (see - Compare with...) like Bitcoin, Gold, or the - S&P 500, follow these steps. -

      -
        -
      1. Open the Admin Control panel
      2. -
      3. Navigate to the Market Data section
      4. -
      5. Choose an asset profile
      6. -
      7. In the dialog, check the Benchmark box
      8. -
      -
      -
      How do I add a custom asset? @@ -161,8 +143,8 @@ provider, you can create a custom asset as follows.

        -
      1. Open the Admin Control panel
      2. -
      3. Navigate to the Market Data section
      4. +
      5. Go to the Admin Control panel
      6. +
      7. Go to the Market Data section
      8. Create an asset profile
      9. Select Add Manually and enter a unique symbol
      10. Edit your asset profile
      11. @@ -170,24 +152,6 @@
      - - - How do I set up Markets? - - -

      The Markets list is derived from your Benchmarks.

      -
        -
      1. Open the Admin Control panel
      2. -
      3. Navigate to the Market Data section
      4. -
      5. Choose an asset profile
      6. -
      7. In the dialog, check the Benchmark box
      8. -
      -

      - Please note: Data is cached, meaning changes may take a few minutes - to appear. -

      -
      -
      Which devices are supported? diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts b/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts index 54f65b531..10a2eb604 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts @@ -138,11 +138,6 @@ export class FirePageComponent implements OnDestroy, OnInit { .putUserSetting(event) .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(() => { - this.userService - .get(true) - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(); - this.initializePortfolioReport(); }); } diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.html b/apps/client/src/app/pages/portfolio/fire/fire-page.html index c4a521a8c..b0fade836 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.html +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -132,7 +132,6 @@ " [isLoading]="isLoadingPortfolioReport" [rules]="emergencyFundRules" - [settings]="user?.settings?.xRayRules" (rulesUpdated)="onRulesUpdated($event)" /> @@ -151,7 +150,6 @@ " [isLoading]="isLoadingPortfolioReport" [rules]="currencyClusterRiskRules" - [settings]="user?.settings?.xRayRules" (rulesUpdated)="onRulesUpdated($event)" /> @@ -170,7 +168,6 @@ " [isLoading]="isLoadingPortfolioReport" [rules]="accountClusterRiskRules" - [settings]="user?.settings?.xRayRules" (rulesUpdated)="onRulesUpdated($event)" /> @@ -189,7 +186,6 @@ " [isLoading]="isLoadingPortfolioReport" [rules]="feeRules" - [settings]="user?.settings?.xRayRules" (rulesUpdated)="onRulesUpdated($event)" /> @@ -204,7 +200,6 @@ " [isLoading]="isLoadingPortfolioReport" [rules]="inactiveRules" - [settings]="user?.settings?.xRayRules" (rulesUpdated)="onRulesUpdated($event)" /> diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 24dc124a7..06f8a5647 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -1471,7 +1471,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 53 + 35 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -2303,7 +2303,7 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 117 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2319,7 +2319,7 @@ Punt de Referència apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 129 + 128 @@ -2579,7 +2579,7 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 179 + 176 @@ -2635,7 +2635,7 @@ Gestionar Activitats apps/client/src/app/components/home-holdings/home-holdings.html - 65 + 62 @@ -2767,7 +2767,7 @@ Total Amount apps/client/src/app/components/investment-chart/investment-chart.component.ts - 142 + 141 @@ -2775,7 +2775,7 @@ Savings Rate apps/client/src/app/components/investment-chart/investment-chart.component.ts - 214 + 213 @@ -3163,7 +3163,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 210 + 217 @@ -3175,7 +3175,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -3187,7 +3187,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -3199,7 +3199,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -3211,7 +3211,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 249 + 256 @@ -5199,7 +5199,7 @@ Currency Cluster Risks apps/client/src/app/pages/portfolio/fire/fire-page.html - 141 + 140 @@ -5207,7 +5207,7 @@ Account Cluster Risks apps/client/src/app/pages/portfolio/fire/fire-page.html - 160 + 158 @@ -5995,7 +5995,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 139 + 140 @@ -6003,7 +6003,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6011,7 +6011,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6019,7 +6019,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6027,7 +6027,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6035,7 +6035,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -6043,7 +6043,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -6051,7 +6051,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -6991,7 +6991,7 @@ Inactive apps/client/src/app/pages/portfolio/fire/fire-page.html - 198 + 194 @@ -7063,7 +7063,7 @@ Threshold Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 29 + 22 @@ -7071,7 +7071,7 @@ Close apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 47 + 33 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 00eb0e87a..62302249d 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -554,7 +554,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 53 + 35 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -1058,7 +1058,7 @@ Aktivitäten verwalten apps/client/src/app/components/home-holdings/home-holdings.html - 65 + 62 @@ -1414,7 +1414,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 210 + 217 @@ -1426,7 +1426,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -1438,7 +1438,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -1450,7 +1450,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -1462,7 +1462,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 249 + 256 @@ -2374,7 +2374,7 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 117 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2898,7 +2898,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 129 + 128 @@ -2962,7 +2962,7 @@ Gesamtbetrag apps/client/src/app/components/investment-chart/investment-chart.component.ts - 142 + 141 @@ -2978,7 +2978,7 @@ Sparrate apps/client/src/app/components/investment-chart/investment-chart.component.ts - 214 + 213 @@ -3730,7 +3730,7 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 179 + 176 @@ -5843,7 +5843,7 @@ Währungsklumpenrisiken apps/client/src/app/pages/portfolio/fire/fire-page.html - 141 + 140 @@ -5851,7 +5851,7 @@ Kontoklumpenrisiken apps/client/src/app/pages/portfolio/fire/fire-page.html - 160 + 158 @@ -5943,7 +5943,7 @@ Finde Position... libs/ui/src/lib/assistant/assistant.component.ts - 139 + 140 @@ -6311,7 +6311,7 @@ Seit Wochenbeginn libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6319,7 +6319,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6327,7 +6327,7 @@ Seit Monatsbeginn libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6335,7 +6335,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6343,7 +6343,7 @@ Seit Jahresbeginn libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -6387,7 +6387,7 @@ Jahr libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -6395,7 +6395,7 @@ Jahre libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -6991,7 +6991,7 @@ Inaktiv apps/client/src/app/pages/portfolio/fire/fire-page.html - 198 + 194 @@ -7063,7 +7063,7 @@ Threshold Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 29 + 22 @@ -7071,7 +7071,7 @@ Schliessen apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 47 + 33 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 9d788c1b4..1e897f596 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -555,7 +555,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 53 + 35 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -1059,7 +1059,7 @@ Gestión de las operaciones apps/client/src/app/components/home-holdings/home-holdings.html - 65 + 62 @@ -1415,7 +1415,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 210 + 217 @@ -1427,7 +1427,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -1439,7 +1439,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -1451,7 +1451,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -1463,7 +1463,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 249 + 256 @@ -2375,7 +2375,7 @@ Cartera apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 117 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2891,7 +2891,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 129 + 128 @@ -2963,7 +2963,7 @@ Importe total apps/client/src/app/components/investment-chart/investment-chart.component.ts - 142 + 141 @@ -2979,7 +2979,7 @@ Tasa de ahorro apps/client/src/app/components/investment-chart/investment-chart.component.ts - 214 + 213 @@ -3731,7 +3731,7 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 179 + 176 @@ -5844,7 +5844,7 @@ Currency Cluster Risks apps/client/src/app/pages/portfolio/fire/fire-page.html - 141 + 140 @@ -5852,7 +5852,7 @@ Account Cluster Risks apps/client/src/app/pages/portfolio/fire/fire-page.html - 160 + 158 @@ -5944,7 +5944,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 139 + 140 @@ -6312,7 +6312,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6320,7 +6320,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6328,7 +6328,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6336,7 +6336,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6344,7 +6344,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -6388,7 +6388,7 @@ año libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -6396,7 +6396,7 @@ años libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -6992,7 +6992,7 @@ Inactive apps/client/src/app/pages/portfolio/fire/fire-page.html - 198 + 194 @@ -7064,7 +7064,7 @@ Threshold Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 29 + 22 @@ -7072,7 +7072,7 @@ Close apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 47 + 33 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 88afcb818..aa366fcc4 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -614,7 +614,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 53 + 35 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -1142,7 +1142,7 @@ Portefeuille apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 117 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -1158,7 +1158,7 @@ Référence apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 129 + 128 @@ -1378,7 +1378,7 @@ Gérer les Activités apps/client/src/app/components/home-holdings/home-holdings.html - 65 + 62 @@ -1426,7 +1426,7 @@ Montant Total apps/client/src/app/components/investment-chart/investment-chart.component.ts - 142 + 141 @@ -1434,7 +1434,7 @@ Taux d’Épargne apps/client/src/app/components/investment-chart/investment-chart.component.ts - 214 + 213 @@ -1726,7 +1726,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 210 + 217 @@ -1738,7 +1738,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -1750,7 +1750,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -1762,7 +1762,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -1774,7 +1774,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 249 + 256 @@ -3730,7 +3730,7 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 179 + 176 @@ -5843,7 +5843,7 @@ Risques de change apps/client/src/app/pages/portfolio/fire/fire-page.html - 141 + 140 @@ -5851,7 +5851,7 @@ Risques liés aux regroupements de comptes apps/client/src/app/pages/portfolio/fire/fire-page.html - 160 + 158 @@ -5943,7 +5943,7 @@ Chercher un actif... libs/ui/src/lib/assistant/assistant.component.ts - 139 + 140 @@ -6311,7 +6311,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6319,7 +6319,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6327,7 +6327,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6335,7 +6335,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6343,7 +6343,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -6387,7 +6387,7 @@ année libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -6395,7 +6395,7 @@ années libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -6991,7 +6991,7 @@ Inactif apps/client/src/app/pages/portfolio/fire/fire-page.html - 198 + 194 @@ -7063,7 +7063,7 @@ Threshold Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 29 + 22 @@ -7071,7 +7071,7 @@ Close apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 47 + 33 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 08c7e8b26..a9d6df210 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -555,7 +555,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 53 + 35 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -1059,7 +1059,7 @@ Gestione delle attività apps/client/src/app/components/home-holdings/home-holdings.html - 65 + 62 @@ -1415,7 +1415,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 210 + 217 @@ -1427,7 +1427,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -1439,7 +1439,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -1451,7 +1451,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -1463,7 +1463,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 249 + 256 @@ -2375,7 +2375,7 @@ Portafoglio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 117 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2891,7 +2891,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 129 + 128 @@ -2963,7 +2963,7 @@ Importo totale apps/client/src/app/components/investment-chart/investment-chart.component.ts - 142 + 141 @@ -2979,7 +2979,7 @@ Tasso di risparmio apps/client/src/app/components/investment-chart/investment-chart.component.ts - 214 + 213 @@ -3731,7 +3731,7 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 179 + 176 @@ -5844,7 +5844,7 @@ Currency Cluster Risks apps/client/src/app/pages/portfolio/fire/fire-page.html - 141 + 140 @@ -5852,7 +5852,7 @@ Account Cluster Risks apps/client/src/app/pages/portfolio/fire/fire-page.html - 160 + 158 @@ -5944,7 +5944,7 @@ Trova possedimenti... libs/ui/src/lib/assistant/assistant.component.ts - 139 + 140 @@ -6312,7 +6312,7 @@ Da inizio settimana libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6320,7 +6320,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6328,7 +6328,7 @@ Da inizio mese libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6336,7 +6336,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6344,7 +6344,7 @@ Da inizio anno libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -6388,7 +6388,7 @@ anno libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -6396,7 +6396,7 @@ anni libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -6992,7 +6992,7 @@ Inattivo apps/client/src/app/pages/portfolio/fire/fire-page.html - 198 + 194 @@ -7064,7 +7064,7 @@ Threshold Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 29 + 22 @@ -7072,7 +7072,7 @@ Close apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 47 + 33 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 0d5d9ced0..441455ef8 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -554,7 +554,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 53 + 35 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -1058,7 +1058,7 @@ Activiteiten beheren apps/client/src/app/components/home-holdings/home-holdings.html - 65 + 62 @@ -1414,7 +1414,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 210 + 217 @@ -1426,7 +1426,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -1438,7 +1438,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -1450,7 +1450,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -1462,7 +1462,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 249 + 256 @@ -2374,7 +2374,7 @@ Portefeuille apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 117 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2890,7 +2890,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 129 + 128 @@ -2962,7 +2962,7 @@ Totaalbedrag apps/client/src/app/components/investment-chart/investment-chart.component.ts - 142 + 141 @@ -2978,7 +2978,7 @@ Spaarrente apps/client/src/app/components/investment-chart/investment-chart.component.ts - 214 + 213 @@ -3730,7 +3730,7 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 179 + 176 @@ -5843,7 +5843,7 @@ Currency Cluster Risks apps/client/src/app/pages/portfolio/fire/fire-page.html - 141 + 140 @@ -5851,7 +5851,7 @@ Account Cluster Risks apps/client/src/app/pages/portfolio/fire/fire-page.html - 160 + 158 @@ -5943,7 +5943,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 139 + 140 @@ -6311,7 +6311,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6319,7 +6319,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6327,7 +6327,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6335,7 +6335,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6343,7 +6343,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -6387,7 +6387,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -6395,7 +6395,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -6991,7 +6991,7 @@ Inactive apps/client/src/app/pages/portfolio/fire/fire-page.html - 198 + 194 @@ -7063,7 +7063,7 @@ Threshold Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 29 + 22 @@ -7071,7 +7071,7 @@ Close apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 47 + 33 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 04e410baf..e68b07f45 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -1363,7 +1363,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 53 + 35 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -2131,7 +2131,7 @@ Portfel apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 117 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2147,7 +2147,7 @@ Poziom Odniesienia (Benchmark) apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 129 + 128 @@ -2283,7 +2283,7 @@ Zarządzaj Aktywnościami apps/client/src/app/components/home-holdings/home-holdings.html - 65 + 62 @@ -2415,7 +2415,7 @@ Całkowita Kwota apps/client/src/app/components/investment-chart/investment-chart.component.ts - 142 + 141 @@ -2423,7 +2423,7 @@ Stopa Oszczędności apps/client/src/app/components/investment-chart/investment-chart.component.ts - 214 + 213 @@ -2551,7 +2551,7 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 179 + 176 @@ -2915,7 +2915,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 210 + 217 @@ -2927,7 +2927,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -2939,7 +2939,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -2951,7 +2951,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -2963,7 +2963,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 249 + 256 @@ -4727,7 +4727,7 @@ Currency Cluster Risks apps/client/src/app/pages/portfolio/fire/fire-page.html - 141 + 140 @@ -4735,7 +4735,7 @@ Account Cluster Risks apps/client/src/app/pages/portfolio/fire/fire-page.html - 160 + 158 @@ -5511,7 +5511,7 @@ Znajdź portfel akcji... libs/ui/src/lib/assistant/assistant.component.ts - 139 + 140 @@ -6311,7 +6311,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6319,7 +6319,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6327,7 +6327,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6335,7 +6335,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6343,7 +6343,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -6387,7 +6387,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -6395,7 +6395,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -6991,7 +6991,7 @@ Nieaktywny apps/client/src/app/pages/portfolio/fire/fire-page.html - 198 + 194 @@ -7063,7 +7063,7 @@ Threshold Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 29 + 22 @@ -7071,7 +7071,7 @@ Close apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 47 + 33 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 97b7805e3..8bb514d06 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -614,7 +614,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 53 + 35 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -1006,7 +1006,7 @@ Portefólio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 117 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -1022,7 +1022,7 @@ Referência apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 129 + 128 @@ -1242,7 +1242,7 @@ Gerir Atividades apps/client/src/app/components/home-holdings/home-holdings.html - 65 + 62 @@ -1298,7 +1298,7 @@ Valor Total apps/client/src/app/components/investment-chart/investment-chart.component.ts - 142 + 141 @@ -1306,7 +1306,7 @@ Taxa de Poupança apps/client/src/app/components/investment-chart/investment-chart.component.ts - 214 + 213 @@ -1706,7 +1706,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 210 + 217 @@ -1718,7 +1718,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -1730,7 +1730,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -1742,7 +1742,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -1754,7 +1754,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 249 + 256 @@ -3730,7 +3730,7 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 179 + 176 @@ -5843,7 +5843,7 @@ Currency Cluster Risks apps/client/src/app/pages/portfolio/fire/fire-page.html - 141 + 140 @@ -5851,7 +5851,7 @@ Account Cluster Risks apps/client/src/app/pages/portfolio/fire/fire-page.html - 160 + 158 @@ -5943,7 +5943,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 139 + 140 @@ -6311,7 +6311,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6319,7 +6319,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6327,7 +6327,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6335,7 +6335,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6343,7 +6343,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -6387,7 +6387,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -6395,7 +6395,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -6991,7 +6991,7 @@ Inactive apps/client/src/app/pages/portfolio/fire/fire-page.html - 198 + 194 @@ -7063,7 +7063,7 @@ Threshold Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 29 + 22 @@ -7071,7 +7071,7 @@ Close apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 47 + 33 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 204282131..e5292e342 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -1327,7 +1327,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 53 + 35 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -1995,7 +1995,7 @@ Portföy apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 117 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2011,7 +2011,7 @@ Karşılaştırma Ölçütü apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 129 + 128 @@ -2135,7 +2135,7 @@ İşlemleri Yönet apps/client/src/app/components/home-holdings/home-holdings.html - 65 + 62 @@ -2267,7 +2267,7 @@ Toplam Tutar apps/client/src/app/components/investment-chart/investment-chart.component.ts - 142 + 141 @@ -2275,7 +2275,7 @@ Tasarruf Oranı apps/client/src/app/components/investment-chart/investment-chart.component.ts - 214 + 213 @@ -2591,7 +2591,7 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 179 + 176 @@ -2759,7 +2759,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 210 + 217 @@ -2771,7 +2771,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -2783,7 +2783,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -2795,7 +2795,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -2807,7 +2807,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 249 + 256 @@ -5843,7 +5843,7 @@ Kur Kümelenme Riskleri (Currency Cluster Risks) apps/client/src/app/pages/portfolio/fire/fire-page.html - 141 + 140 @@ -5851,7 +5851,7 @@ Hesap Kümelenme Riski (Account Cluster Risks) apps/client/src/app/pages/portfolio/fire/fire-page.html - 160 + 158 @@ -5943,7 +5943,7 @@ Sahip olunan varlıkları bul... libs/ui/src/lib/assistant/assistant.component.ts - 139 + 140 @@ -6311,7 +6311,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6319,7 +6319,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6327,7 +6327,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6335,7 +6335,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6343,7 +6343,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -6387,7 +6387,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -6395,7 +6395,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -6991,7 +6991,7 @@ Inactive apps/client/src/app/pages/portfolio/fire/fire-page.html - 198 + 194 @@ -7063,7 +7063,7 @@ Threshold Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 29 + 22 @@ -7071,7 +7071,7 @@ Close apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 47 + 33 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 23cfaf65c..849b1053e 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -1312,7 +1312,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 53 + 35 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -2013,7 +2013,7 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 117 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2028,7 +2028,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 129 + 128 @@ -2151,7 +2151,7 @@ Manage Activities apps/client/src/app/components/home-holdings/home-holdings.html - 65 + 62 @@ -2268,14 +2268,14 @@ Total Amount apps/client/src/app/components/investment-chart/investment-chart.component.ts - 142 + 141 Savings Rate apps/client/src/app/components/investment-chart/investment-chart.component.ts - 214 + 213 @@ -2392,7 +2392,7 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 179 + 176 @@ -2723,7 +2723,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 210 + 217 @@ -2734,7 +2734,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -2745,7 +2745,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -2756,7 +2756,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -2767,7 +2767,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 249 + 256 @@ -4337,14 +4337,14 @@ Currency Cluster Risks apps/client/src/app/pages/portfolio/fire/fire-page.html - 141 + 140 Account Cluster Risks apps/client/src/app/pages/portfolio/fire/fire-page.html - 160 + 158 @@ -5071,7 +5071,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 139 + 140 @@ -5734,35 +5734,35 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 Week to date libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 Month to date libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 MTD libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 WTD libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -5801,14 +5801,14 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 years libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -6331,7 +6331,7 @@ Inactive apps/client/src/app/pages/portfolio/fire/fire-page.html - 198 + 194 @@ -6359,7 +6359,7 @@ Threshold Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 29 + 22 @@ -6408,7 +6408,7 @@ Close apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 47 + 33 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 97c8c71ab..22aa783d6 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -1372,7 +1372,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 53 + 35 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -2148,7 +2148,7 @@ 文件夹 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 117 + 116 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2164,7 +2164,7 @@ 基准 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 129 + 128 @@ -2300,7 +2300,7 @@ 管理活动 apps/client/src/app/components/home-holdings/home-holdings.html - 65 + 62 @@ -2432,7 +2432,7 @@ 总金额 apps/client/src/app/components/investment-chart/investment-chart.component.ts - 142 + 141 @@ -2440,7 +2440,7 @@ 储蓄率 apps/client/src/app/components/investment-chart/investment-chart.component.ts - 214 + 213 @@ -2568,7 +2568,7 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 179 + 176 @@ -2932,7 +2932,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 210 + 217 @@ -2944,7 +2944,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -2956,7 +2956,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -2968,7 +2968,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -2980,7 +2980,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 249 + 256 @@ -4744,7 +4744,7 @@ 货币集群风险 apps/client/src/app/pages/portfolio/fire/fire-page.html - 141 + 140 @@ -4752,7 +4752,7 @@ 账户集群风险 apps/client/src/app/pages/portfolio/fire/fire-page.html - 160 + 158 @@ -5560,7 +5560,7 @@ 查找持有... libs/ui/src/lib/assistant/assistant.component.ts - 139 + 140 @@ -6312,7 +6312,7 @@ 今年迄今为止 libs/ui/src/lib/assistant/assistant.component.ts - 220 + 227 @@ -6320,7 +6320,7 @@ 本周至今 libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6328,7 +6328,7 @@ 本月至今 libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6336,7 +6336,7 @@ 最大输运量 libs/ui/src/lib/assistant/assistant.component.ts - 216 + 223 @@ -6344,7 +6344,7 @@ 世界贸易组织 libs/ui/src/lib/assistant/assistant.component.ts - 212 + 219 @@ -6388,7 +6388,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 224 + 231 @@ -6396,7 +6396,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 246 + 253 @@ -6992,7 +6992,7 @@ Inactive apps/client/src/app/pages/portfolio/fire/fire-page.html - 198 + 194 @@ -7064,7 +7064,7 @@ Threshold Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 29 + 22 @@ -7072,7 +7072,7 @@ Close apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 47 + 33 diff --git a/libs/common/src/lib/chart-helper.ts b/libs/common/src/lib/chart-helper.ts index 4181ebbbf..5b65d4a87 100644 --- a/libs/common/src/lib/chart-helper.ts +++ b/libs/common/src/lib/chart-helper.ts @@ -103,7 +103,7 @@ export function getVerticalHoverLinePlugin( colorScheme?: ColorScheme ) { return { - afterDatasetsDraw: (chart, _, options) => { + afterDatasetsDraw: (chart, x, options) => { const active = chart.getActiveElements(); if (!active || active.length === 0) { diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 4580ef4df..19ec965fa 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -40,20 +40,17 @@ export const DATA_GATHERING_QUEUE_PRIORITY_MEDIUM = Math.round( DATA_GATHERING_QUEUE_PRIORITY_LOW / 2 ); -export const PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE = - 'PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE'; -export const PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_HIGH = 1; -export const PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_LOW = - Number.MAX_SAFE_INTEGER; +export const PORTFOLIO_SNAPSHOT_QUEUE = 'PORTFOLIO_SNAPSHOT_QUEUE'; +export const PORTFOLIO_SNAPSHOT_QUEUE_PRIORITY_HIGH = 1; +export const PORTFOLIO_SNAPSHOT_QUEUE_PRIORITY_LOW = Number.MAX_SAFE_INTEGER; export const DEFAULT_CURRENCY = 'USD'; export const DEFAULT_DATE_FORMAT_MONTH_YEAR = 'MMM yyyy'; export const DEFAULT_LANGUAGE_CODE = 'en'; export const DEFAULT_PAGE_SIZE = 50; -export const DEFAULT_PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY = 1; -export const DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY = 1; -export const DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY = 1; -export const DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT = 30000; +export const DEFAULT_PROCESSOR_CONCURRENCY_GATHER_ASSET_PROFILE = 1; +export const DEFAULT_PROCESSOR_CONCURRENCY_GATHER_HISTORICAL_MARKET_DATA = 1; +export const DEFAULT_PROCESSOR_CONCURRENCY_PORTFOLIO_SNAPSHOT = 1; export const DEFAULT_ROOT_URL = 'https://localhost:4200'; // USX is handled separately diff --git a/libs/common/src/lib/interfaces/portfolio-report-rule.interface.ts b/libs/common/src/lib/interfaces/portfolio-report-rule.interface.ts index 0296606b8..29cbb4a8f 100644 --- a/libs/common/src/lib/interfaces/portfolio-report-rule.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-report-rule.interface.ts @@ -1,17 +1,11 @@ export interface PortfolioReportRule { - configuration?: { - threshold?: { - max: number; - min: number; - step: number; - unit?: string; - }; - thresholdMax?: boolean; - thresholdMin?: boolean; - }; evaluation?: string; isActive: boolean; key: string; name: string; + settings?: { + thresholdMax?: number; + thresholdMin?: number; + }; value?: boolean; } diff --git a/libs/common/src/lib/personal-finance-tools.ts b/libs/common/src/lib/personal-finance-tools.ts index 1ec5fbbc2..b5aeed19d 100644 --- a/libs/common/src/lib/personal-finance-tools.ts +++ b/libs/common/src/lib/personal-finance-tools.ts @@ -115,7 +115,6 @@ export const personalFinanceTools: Product[] = [ }, { founded: 2022, - isArchived: true, key: 'capmon', name: 'CapMon.org', origin: 'Germany', @@ -251,17 +250,6 @@ export const personalFinanceTools: Product[] = [ pricingPerYear: '€69.99', slogan: 'Personal finances, simplified' }, - { - founded: 2021, - hasFreePlan: true, - hasSelfHostingAbility: false, - key: 'firekit', - languages: ['English', 'українська мова'], - name: 'FIREkit', - origin: 'Ukraine', - pricingPerYear: '$40', - slogan: 'A simple solution to track your wealth online' - }, { hasFreePlan: true, hasSelfHostingAbility: false, @@ -304,7 +292,6 @@ export const personalFinanceTools: Product[] = [ { hasFreePlan: true, hasSelfHostingAbility: false, - isArchived: true, key: 'intuit-mint', name: 'Intuit Mint', note: 'Intuit Mint was discontinued in 2023', @@ -350,15 +337,6 @@ export const personalFinanceTools: Product[] = [ pricingPerYear: '$150', slogan: 'The Time Machine for your Net Worth' }, - { - founded: 2021, - hasFreePlan: false, - key: 'leafs', - languages: ['Deutsch', 'English'], - name: 'Leafs', - origin: 'Switzerland', - slogan: 'Sustainability insights for wealth managers' - }, { founded: 2018, hasFreePlan: false, @@ -415,7 +393,6 @@ export const personalFinanceTools: Product[] = [ { founded: 1991, hasSelfHostingAbility: true, - isArchived: true, key: 'microsoft-money', name: 'Microsoft Money', note: 'Microsoft Money was discontinued in 2010', @@ -523,7 +500,6 @@ export const personalFinanceTools: Product[] = [ }, { hasFreePlan: true, - isArchived: true, key: 'portfoloo', name: 'Portfoloo', note: 'Portfoloo was discontinued', @@ -562,7 +538,6 @@ export const personalFinanceTools: Product[] = [ { founded: 2019, hasSelfHostingAbility: false, - isArchived: true, key: 'sarmaaya.pk', name: 'Sarmaaya.pk Portfolio Tracking', note: 'Sarmaaya.pk Portfolio Tracking was discontinued in 2024', @@ -599,7 +574,6 @@ export const personalFinanceTools: Product[] = [ }, { hasFreePlan: true, - isArchived: true, key: 'sharesmaster', name: 'SharesMaster', note: 'SharesMaster was discontinued', @@ -640,7 +614,6 @@ export const personalFinanceTools: Product[] = [ }, { founded: 2008, - isArchived: true, key: 'stockmarketeye', name: 'StockMarketEye', origin: 'France', @@ -753,7 +726,6 @@ export const personalFinanceTools: Product[] = [ founded: 2021, hasFreePlan: true, hasSelfHostingAbility: false, - isArchived: true, key: 'yeekatee', languages: ['Deutsch', 'English', 'Español', 'Français', 'Italiano'], name: 'yeekatee', diff --git a/libs/common/src/lib/types/x-ray-rules-settings.type.ts b/libs/common/src/lib/types/x-ray-rules-settings.type.ts index fddd708cc..a55487f0b 100644 --- a/libs/common/src/lib/types/x-ray-rules-settings.type.ts +++ b/libs/common/src/lib/types/x-ray-rules-settings.type.ts @@ -1,3 +1,5 @@ +import { PortfolioReportRule } from '@ghostfolio/common/interfaces'; + export type XRayRulesSettings = { AccountClusterRiskCurrentInvestment?: RuleSettings; AccountClusterRiskSingleAccount?: RuleSettings; @@ -7,8 +9,6 @@ export type XRayRulesSettings = { FeeRatioInitialInvestment?: RuleSettings; }; -interface RuleSettings { +interface RuleSettings extends Pick { isActive: boolean; - thresholdMax?: number; - thresholdMin?: number; } diff --git a/libs/ui/src/lib/benchmark/benchmark.component.html b/libs/ui/src/lib/benchmark/benchmark.component.html index 8867e1c9e..ec92554de 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.html +++ b/libs/ui/src/lib/benchmark/benchmark.component.html @@ -122,18 +122,3 @@ " > - -@if (isLoading) { - -} @else if (benchmarks?.length === 0) { -
      - No data available -
      -} diff --git a/libs/ui/src/lib/benchmark/benchmark.component.ts b/libs/ui/src/lib/benchmark/benchmark.component.ts index 22bc9a128..764d65c2c 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.ts +++ b/libs/ui/src/lib/benchmark/benchmark.component.ts @@ -49,7 +49,6 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy { @Input() user: User; public displayedColumns = ['name', 'date', 'change', 'marketCondition']; - public isLoading = true; public resolveMarketCondition = resolveMarketCondition; public translate = translate; @@ -77,10 +76,6 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy { } public ngOnChanges() { - if (this.benchmarks) { - this.isLoading = false; - } - if (this.user?.settings?.isExperimentalFeatures) { this.displayedColumns = [ 'name', diff --git a/libs/ui/src/lib/carousel/carousel.component.scss b/libs/ui/src/lib/carousel/carousel.component.scss index 05ab9ff93..546c92194 100644 --- a/libs/ui/src/lib/carousel/carousel.component.scss +++ b/libs/ui/src/lib/carousel/carousel.component.scss @@ -3,7 +3,7 @@ position: relative; ::ng-deep { - [gfCarouselItem] { + [gf-carousel-item] { flex-shrink: 0; width: 100%; } diff --git a/libs/ui/src/lib/i18n.ts b/libs/ui/src/lib/i18n.ts index 46a8cd0fa..a98cbd704 100644 --- a/libs/ui/src/lib/i18n.ts +++ b/libs/ui/src/lib/i18n.ts @@ -88,7 +88,6 @@ const locales = { 'South Africa': $localize`South Africa`, Switzerland: $localize`Switzerland`, Thailand: $localize`Thailand`, - Ukraine: $localize`Ukraine`, 'United States': $localize`United States`, // Fear and Greed Index diff --git a/libs/ui/src/lib/line-chart/line-chart.component.ts b/libs/ui/src/lib/line-chart/line-chart.component.ts index e48ead9d9..4098e1d5b 100644 --- a/libs/ui/src/lib/line-chart/line-chart.component.ts +++ b/libs/ui/src/lib/line-chart/line-chart.component.ts @@ -27,13 +27,12 @@ import { import { Chart, Filler, - LinearScale, LineController, LineElement, + LinearScale, PointElement, TimeScale, - Tooltip, - TooltipPosition + Tooltip } from 'chart.js'; import 'chartjs-adapter-date-fns'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @@ -86,7 +85,7 @@ export class GfLineChartComponent Tooltip ); - Tooltip.positioners['top'] = (_elements, position: TooltipPosition) => + Tooltip.positioners['top'] = (elements, position) => getTooltipPositionerMapTop(this.chart, position); } diff --git a/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts b/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts index 7f74a81e1..0e694f6dc 100644 --- a/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts +++ b/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -87,11 +87,11 @@ export class GfTreemapChartComponent const { endDate, startDate } = getIntervalFromDateRange(this.dateRange); - const data: ChartConfiguration['data'] = { + const data: ChartConfiguration['data'] = { datasets: [ { backgroundColor(ctx) { - let annualizedNetPerformancePercentWithCurrencyEffect = + const annualizedNetPerformancePercentWithCurrencyEffect = getAnnualizedPerformancePercent({ daysInMarket: differenceInDays( endDate, @@ -105,12 +105,6 @@ export class GfTreemapChartComponent ) }).toNumber(); - // Round to 2 decimal places - annualizedNetPerformancePercentWithCurrencyEffect = - Math.round( - annualizedNetPerformancePercentWithCurrencyEffect * 100 - ) / 100; - if ( annualizedNetPerformancePercentWithCurrencyEffect > 0.03 * GfTreemapChartComponent.HEAT_MULTIPLIER @@ -129,11 +123,8 @@ export class GfTreemapChartComponent } else if (annualizedNetPerformancePercentWithCurrencyEffect > 0) { return green[3]; } else if ( - Math.abs(annualizedNetPerformancePercentWithCurrencyEffect) === 0 + annualizedNetPerformancePercentWithCurrencyEffect === 0 ) { - annualizedNetPerformancePercentWithCurrencyEffect = Math.abs( - annualizedNetPerformancePercentWithCurrencyEffect - ); return gray[3]; } else if ( annualizedNetPerformancePercentWithCurrencyEffect > @@ -160,35 +151,36 @@ export class GfTreemapChartComponent align: 'left', color: ['white'], display: true, - font: [{ size: 16 }, { lineHeight: 1.5, size: 14 }], + font: [{ size: 14 }, { size: 11 }, { lineHeight: 2, size: 14 }], formatter(ctx) { const netPerformancePercentWithCurrencyEffect = ctx.raw._data.netPerformancePercentWithCurrencyEffect; return [ + ctx.raw._data.name, ctx.raw._data.symbol, `${netPerformancePercentWithCurrencyEffect > 0 ? '+' : ''}${(ctx.raw._data.netPerformancePercentWithCurrencyEffect * 100).toFixed(2)}%` ]; }, - hoverColor: 'white', position: 'top' }, spacing: 1, tree: this.holdings } ] - } as any; + }; if (this.chartCanvas) { if (this.chart) { this.chart.data = data; - this.chart.options.plugins.tooltip = - this.getTooltipPluginConfiguration() as unknown; + this.chart.options.plugins.tooltip = ( + this.getTooltipPluginConfiguration() + ); this.chart.update(); } else { this.chart = new Chart(this.chartCanvas.nativeElement, { data, - options: { + options: { animation: false, onClick: (event, activeElements) => { try { @@ -217,7 +209,7 @@ export class GfTreemapChartComponent plugins: { tooltip: this.getTooltipPluginConfiguration() } - } as unknown, + }, type: 'treemap' }); } @@ -239,7 +231,7 @@ export class GfTreemapChartComponent const symbol = context.raw._data.symbol; if (context.raw._data.valueInBaseCurrency !== null) { - const value = context.raw._data.valueInBaseCurrency as number; + const value = context.raw._data.valueInBaseCurrency; return [ `${name ?? symbol}`, @@ -250,7 +242,7 @@ export class GfTreemapChartComponent ]; } else { const percentage = - (context.raw._data.allocationInPercentage as number) * 100; + context.raw._data.allocationInPercentage * 100; return [`${name ?? symbol}`, `${percentage.toFixed(2)}%`]; } diff --git a/package.json b/package.json index 3e405ef31..e283d6a23 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.116.0", + "version": "2.114.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 9fa550762..0ae1df65a 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -193,9 +193,9 @@ model SymbolProfileOverrides { holdings Json? @default("[]") name String? sectors Json? @default("[]") + url String? symbolProfileId String @id updatedAt DateTime @updatedAt - url String? SymbolProfile SymbolProfile @relation(fields: [symbolProfileId], onDelete: Cascade, references: [id]) } @@ -239,7 +239,7 @@ model User { Order Order[] Settings Settings? Subscription Subscription[] - Tag Tag[] + Tag Tag[] @@index([accessToken]) @@index([createdAt]) diff --git a/test/import/ok-novn-buy-and-sell-partially.json b/test/import/ok-novn-buy-and-sell-partially.json index 06cbc75ea..c184b4ba4 100644 --- a/test/import/ok-novn-buy-and-sell-partially.json +++ b/test/import/ok-novn-buy-and-sell-partially.json @@ -5,23 +5,23 @@ }, "activities": [ { - "fee": 1.3, + "fee": 0, "quantity": 1, "type": "SELL", "unitPrice": 85.73, "currency": "CHF", "dataSource": "YAHOO", - "date": "2022-04-08T00:00:00.000Z", + "date": "2022-04-07T22:00:00.000Z", "symbol": "NOVN.SW" }, { - "fee": 2.95, + "fee": 0, "quantity": 2, "type": "BUY", "unitPrice": 75.8, "currency": "CHF", "dataSource": "YAHOO", - "date": "2022-03-07T00:00:00.000Z", + "date": "2022-03-06T23:00:00.000Z", "symbol": "NOVN.SW" } ] diff --git a/tsconfig.base.json b/tsconfig.base.json index 34ed5d559..e977a9596 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -31,8 +31,8 @@ "noImplicitThis": false, "noImplicitOverride": false, "noPropertyAccessFromIndexSignature": false, - "noUnusedLocals": true, - "noUnusedParameters": true, + "noUnusedLocals": false, + "noUnusedParameters": false, "allowUnreachableCode": true }, "exclude": ["node_modules", "tmp"]