From 896e96c9afaf3bcb49c7305afeb1e0d9cc8021d8 Mon Sep 17 00:00:00 2001 From: Akash Negi <95514575+AkashNegi1@users.noreply.github.com> Date: Fri, 3 Jul 2026 23:31:21 +0530 Subject: [PATCH 01/17] Bugfix/missing navigation on landing page for unauthenticated users (#7192) Fix missing navigation on landing page for unauthenticated users --- apps/client/src/app/components/header/header.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/app/components/header/header.component.html b/apps/client/src/app/components/header/header.component.html index ae3121861..35f072d72 100644 --- a/apps/client/src/app/components/header/header.component.html +++ b/apps/client/src/app/components/header/header.component.html @@ -332,7 +332,7 @@ } - @if (user() === null) { + @if (!user()) {
Date: Fri, 3 Jul 2026 20:03:38 +0200 Subject: [PATCH 02/17] Bugfix/handling of values rounding to zero (#7201) * Fix handling of values rounding to zero * Update changelog --- CHANGELOG.md | 8 ++++++++ .../src/services/benchmark/benchmark.service.spec.ts | 12 ++++++++++++ apps/api/src/services/benchmark/benchmark.service.ts | 8 +++++--- libs/ui/src/lib/benchmark/benchmark.component.html | 10 ++++++++-- libs/ui/src/lib/benchmark/benchmark.component.ts | 3 ++- libs/ui/src/lib/value/value.component.ts | 4 +++- 6 files changed, 38 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8be159930..c14452d4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Fixed + +- Fixed the colorization of the change from all time high in the benchmark component when values round to zero +- Fixed the market condition of the benchmarks when values round to zero +- Fixed an issue where values incorrectly rounded to negative zero in the value component + ## 3.19.0 - 2026-07-02 ### Added diff --git a/apps/api/src/services/benchmark/benchmark.service.spec.ts b/apps/api/src/services/benchmark/benchmark.service.spec.ts index 833dbcdfc..0e7119b04 100644 --- a/apps/api/src/services/benchmark/benchmark.service.spec.ts +++ b/apps/api/src/services/benchmark/benchmark.service.spec.ts @@ -12,4 +12,16 @@ describe('BenchmarkService', () => { expect(benchmarkService.calculateChangeInPercentage(2, 2)).toEqual(0); expect(benchmarkService.calculateChangeInPercentage(2, 1)).toEqual(-0.5); }); + + it('getMarketCondition', async () => { + expect(benchmarkService.getMarketCondition(0)).toEqual('ALL_TIME_HIGH'); + expect(benchmarkService.getMarketCondition(-5.90736454893e-9)).toEqual( + 'ALL_TIME_HIGH' + ); + expect(benchmarkService.getMarketCondition(-0.1)).toEqual('NEUTRAL_MARKET'); + expect(benchmarkService.getMarketCondition(-0.19996)).toEqual( + 'BEAR_MARKET' + ); + expect(benchmarkService.getMarketCondition(-0.2)).toEqual('BEAR_MARKET'); + }); }); diff --git a/apps/api/src/services/benchmark/benchmark.service.ts b/apps/api/src/services/benchmark/benchmark.service.ts index 56a629163..99ceaf21e 100644 --- a/apps/api/src/services/benchmark/benchmark.service.ts +++ b/apps/api/src/services/benchmark/benchmark.service.ts @@ -24,7 +24,7 @@ import { Injectable, Logger } from '@nestjs/common'; import { SymbolProfile } from '@prisma/client'; import { Big } from 'big.js'; import { addHours, isAfter, subDays } from 'date-fns'; -import { uniqBy } from 'lodash'; +import { round, uniqBy } from 'lodash'; import ms from 'ms'; import { BenchmarkValue } from './interfaces/benchmark-value.interface'; @@ -220,9 +220,11 @@ export class BenchmarkService { public getMarketCondition( aPerformanceInPercent: number ): Benchmark['marketCondition'] { - if (aPerformanceInPercent >= 0) { + const performanceInPercent = round(aPerformanceInPercent, 4); + + if (performanceInPercent >= 0) { return 'ALL_TIME_HIGH'; - } else if (aPerformanceInPercent <= -0.2) { + } else if (performanceInPercent <= -0.2) { return 'BEAR_MARKET'; } else { return 'NEUTRAL_MARKET'; diff --git a/libs/ui/src/lib/benchmark/benchmark.component.html b/libs/ui/src/lib/benchmark/benchmark.component.html index a950f0c44..d60eba7c4 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.html +++ b/libs/ui/src/lib/benchmark/benchmark.component.html @@ -135,9 +135,15 @@ class="d-inline-block justify-content-end" [class]="{ 'text-danger': - element?.performances?.allTimeHigh?.performancePercent < 0, + round( + element?.performances?.allTimeHigh?.performancePercent, + 4 + ) < 0, 'text-success': - element?.performances?.allTimeHigh?.performancePercent === 0 + round( + element?.performances?.allTimeHigh?.performancePercent, + 4 + ) === 0 }" [isPercent]="true" [locale]="locale()" diff --git a/libs/ui/src/lib/benchmark/benchmark.component.ts b/libs/ui/src/lib/benchmark/benchmark.component.ts index 0b78ffa0d..0d9aba0ca 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.ts +++ b/libs/ui/src/lib/benchmark/benchmark.component.ts @@ -33,7 +33,7 @@ import { ActivatedRoute, Router, RouterModule } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; import { addIcons } from 'ionicons'; import { ellipsisHorizontal, trashOutline } from 'ionicons/icons'; -import { isNumber } from 'lodash'; +import { isNumber, round } from 'lodash'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { GfEntityLogoComponent } from '../entity-logo/entity-logo.component'; @@ -92,6 +92,7 @@ export class GfBenchmarkComponent { protected isLoading = true; protected readonly isNumber = isNumber; protected readonly resolveMarketCondition = resolveMarketCondition; + protected readonly round = round; protected readonly translate = translate; private readonly destroyRef = inject(DestroyRef); diff --git a/libs/ui/src/lib/value/value.component.ts b/libs/ui/src/lib/value/value.component.ts index 9c3330466..dffcb89e7 100644 --- a/libs/ui/src/lib/value/value.component.ts +++ b/libs/ui/src/lib/value/value.component.ts @@ -168,7 +168,9 @@ export class GfValueComponent implements AfterViewInit, OnChanges { } } - if (this.formattedValue === '0.00') { + if (/^-?0([.,]0*)?$/.test(this.formattedValue)) { + // Remove algebraic sign of values rounding to zero + this.formattedValue = this.formattedValue.replace(/^-/, ''); this.useAbsoluteValue = true; } } From 5609aaa98c50e956bbe6676bf15f58d73a983d42 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 3 Jul 2026 20:04:37 +0200 Subject: [PATCH 03/17] Task/harmonize date picker styling (#7194) * Harmonize date picker styling * Update changelog --- CHANGELOG.md | 1 + .../create-or-update-activity-dialog.html | 2 +- .../account-balances.component.html | 2 +- .../fire-calculator.component.html | 19 +++++++++++++------ .../fire-calculator.component.ts | 6 ++++++ 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c14452d4b..807180092 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Harmonized the date picker styling across various components - Updated the _Privacy Policy_ - Updated the _Terms of Service_ - Improved the parsing of integer query parameters (`skip` and `take`) in the `GET api/v1/activities` endpoint diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html index 20c50d0fe..8f2dfebfd 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -167,7 +167,7 @@ name="calendar-clear-outline" /> - +
- + + [for]="date" + > + + diff --git a/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts b/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts index c8e281609..fa998778d 100644 --- a/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts +++ b/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -34,6 +34,7 @@ import { } from '@angular/material/datepicker'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; +import { IonIcon } from '@ionic/angular/standalone'; import { BarController, BarElement, @@ -56,6 +57,8 @@ import { startOfMonth, sub } from 'date-fns'; +import { addIcons } from 'ionicons'; +import { calendarClearOutline } from 'ionicons/icons'; import { isNumber } from 'lodash'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { debounceTime } from 'rxjs'; @@ -67,6 +70,7 @@ import { FireCalculatorService } from './fire-calculator.service'; imports: [ CommonModule, FormsModule, + IonIcon, MatButtonModule, MatDatepickerModule, MatFormFieldModule, @@ -136,6 +140,8 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy { Tooltip ); + addIcons({ calendarClearOutline }); + this.calculatorForm.valueChanges .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(() => { From 156b6e2d7fbb032553134e8039c789cdd7df246a Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 3 Jul 2026 20:09:08 +0200 Subject: [PATCH 04/17] Release 3.19.1 (#7203) --- CHANGELOG.md | 13 ++++--------- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 807180092..06fe37822 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,15 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased - -### Fixed - -- Fixed the colorization of the change from all time high in the benchmark component when values round to zero -- Fixed the market condition of the benchmarks when values round to zero -- Fixed an issue where values incorrectly rounded to negative zero in the value component - -## 3.19.0 - 2026-07-02 +## 3.19.1 - 2026-07-03 ### Added @@ -33,6 +25,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Fixed an issue where values incorrectly rounded to negative zero in the value component +- Fixed the colorization of the change from all time high in the benchmark component when values round to zero +- Fixed the market condition of the benchmarks when values round to zero - Fixed the validation of the data source field of an asset profile with market data - Fixed a recurring issue where single-value fields were incorrectly validated as arrays in various endpoints diff --git a/package-lock.json b/package-lock.json index 4c7357b51..8370a5765 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.19.0", + "version": "3.19.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.19.0", + "version": "3.19.1", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 1599fc447..4585d34ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.19.0", + "version": "3.19.1", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From af3d7db4263b98a5fbfee4ec5a2886ae9c1dd0a5 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 4 Jul 2026 08:03:57 +0200 Subject: [PATCH 05/17] Task/improve language localization by translating various tooltips (#7190) * Improve language localization by translating various tooltips * Update changelog --- CHANGELOG.md | 6 ++++++ .../src/app/pages/about/overview/about-overview-page.html | 4 ++++ apps/client/src/app/pages/landing/landing-page.html | 4 ++++ apps/client/src/app/pages/open/open-page.html | 1 + .../create-or-update-activity-dialog.html | 1 + .../personal-finance-tools/personal-finance-tools-page.html | 1 + .../ui/src/lib/accounts-table/accounts-table.component.html | 1 + .../lib/activities-table/activities-table.component.html | 1 + .../historical-market-data-editor-dialog.html | 1 + .../ui/src/lib/holdings-table/holdings-table.component.html | 4 ++-- .../lib/premium-indicator/premium-indicator.component.html | 1 + libs/ui/src/lib/top-holdings/top-holdings.component.html | 2 +- 12 files changed, 24 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06fe37822..9c6a4fc79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Changed + +- Improved the language localization by translating various tooltips across the application + ## 3.19.1 - 2026-07-03 ### Added diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.html b/apps/client/src/app/pages/about/overview/about-overview-page.html index ede2be190..6e0b0323d 100644 --- a/apps/client/src/app/pages/about/overview/about-overview-page.html +++ b/apps/client/src/app/pages/about/overview/about-overview-page.html @@ -16,6 +16,7 @@ >The source code is fully available as open source software @@ -49,6 +50,7 @@ >and is driven by the efforts of its contributorsSlack community, post to @ghostfolio_ @@ -58,6 +59,7 @@ > @@ -76,6 +78,7 @@ > @@ -94,6 +97,7 @@ > diff --git a/apps/client/src/app/pages/open/open-page.html b/apps/client/src/app/pages/open/open-page.html index e7ff2719c..7ba6c1f4c 100644 --- a/apps/client/src/app/pages/open/open-page.html +++ b/apps/client/src/app/pages/open/open-page.html @@ -8,6 +8,7 @@ the source code as open source software diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html index 8f2dfebfd..b5dbf4669 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -233,6 +233,7 @@ ) {