From 2af973bedba2f7b429aa16c80fd8aa772db77e6b Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Sat, 2 May 2026 22:26:34 +0700 Subject: [PATCH 1/5] Bugfix/reactivate auto calculate for retirement date and projected total amount in FIRE page (#6831) * fix(lib): update fields to accept null * fix(client): set to null --- .../app/pages/portfolio/fire/fire-page.component.ts | 4 ++-- libs/common/src/lib/dtos/update-user-setting.dto.ts | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) 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 4ab7d6392..dc0a1d776 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 @@ -174,7 +174,7 @@ export class GfFirePageComponent implements OnInit { this.dataService .putUserSetting({ projectedTotalAmount, - retirementDate: undefined + retirementDate: null }) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(() => { @@ -192,7 +192,7 @@ export class GfFirePageComponent implements OnInit { protected onRetirementDateChange(retirementDate: Date) { this.dataService .putUserSetting({ - projectedTotalAmount: undefined, + projectedTotalAmount: null, retirementDate: retirementDate.toISOString() }) .pipe(takeUntilDestroyed(this.destroyRef)) diff --git a/libs/common/src/lib/dtos/update-user-setting.dto.ts b/libs/common/src/lib/dtos/update-user-setting.dto.ts index cf7dff7e8..f2781835c 100644 --- a/libs/common/src/lib/dtos/update-user-setting.dto.ts +++ b/libs/common/src/lib/dtos/update-user-setting.dto.ts @@ -96,13 +96,21 @@ export class UpdateUserSettingDto { @IsOptional() locale?: string; + /** + * The target financial amount the user aims to reach before retiring. + * Can be explicitly set to null to clear the value and calculate it dynamically. + */ @IsNumber() @IsOptional() - projectedTotalAmount?: number; + projectedTotalAmount?: number | null; + /** + * The target date when the user plans to retire. + * Can be explicitly set to null to clear the value and calculate it dynamically. + */ @IsISO8601() @IsOptional() - retirementDate?: string; + retirementDate?: string | null; @IsNumber() @IsOptional() From fff9c1667064f176b68530a79f9bb64dcbfec708 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 2 May 2026 19:02:06 +0200 Subject: [PATCH 2/5] Task/harmonize unit styling in value component (#6832) * Harmonize unit styling * Update changelog --- CHANGELOG.md | 1 + libs/ui/src/lib/value/value.component.html | 52 +++++++--------------- 2 files changed, 16 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 460f54d3f..045f92c2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Harmonized the unit styling in the value component - Upgraded `stripe` from version `20.4.1` to `21.0.1` ## 3.1.0 - 2026-04-29 diff --git a/libs/ui/src/lib/value/value.component.html b/libs/ui/src/lib/value/value.component.html index c4d6532a7..48e9c02e7 100644 --- a/libs/ui/src/lib/value/value.component.html +++ b/libs/ui/src/lib/value/value.component.html @@ -38,45 +38,23 @@
-
} } - @if (isPercent) { -
- @if (value === null) { - *****% - } @else { - {{ formattedValue }}% - } -
- } @else { -
- @if (value === null) { - ***** - } @else { - {{ formattedValue }} - } -
- } - @if (unit) { - @if (size === 'medium') { - - {{ unit }} - +
+ @if (value === null) { + ***** } @else { -
- {{ unit }} -
+ {{ formattedValue }} } +
+ @if (isPercent || unit) { +
+ {{ isPercent ? '%' : unit }} +
} } @if (isString) { From 4a81658f60226617dc6b8cf85d86e6c603885799 Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Sun, 3 May 2026 14:43:06 +0700 Subject: [PATCH 3/5] Bugfix/improve typography for client app and charts (#6833) * Improve typography for client app and charts * Update changelog --- CHANGELOG.md | 4 ++++ apps/client/src/app/app.component.ts | 4 ++++ apps/client/src/styles/theme.scss | 22 +++++++++++++++------- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 045f92c2c..e0b601427 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Harmonized the unit styling in the value component - Upgraded `stripe` from version `20.4.1` to `21.0.1` +### Fixed + +- Resolved an issue where charts and components defaulted to _Roboto_ instead of the preconfigured _Inter_ font family + ## 3.1.0 - 2026-04-29 ### Added diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index 0a9be3a75..e1967970d 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -28,6 +28,7 @@ import { RouterOutlet } from '@angular/router'; import { DataSource } from '@prisma/client'; +import { Chart } from 'chart.js'; import { addIcons } from 'ionicons'; import { openOutline } from 'ionicons/icons'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -255,6 +256,9 @@ export class GfAppComponent implements OnInit { this.toggleTheme(isDarkTheme); + // Default chart styles + Chart.defaults.font.family = getCssVariable('--font-family-sans-serif'); + window.matchMedia('(prefers-color-scheme: dark)').addListener((event) => { if (!this.user?.settings.colorScheme) { this.toggleTheme(event.matches); diff --git a/apps/client/src/styles/theme.scss b/apps/client/src/styles/theme.scss index dfde47c77..296270e7f 100644 --- a/apps/client/src/styles/theme.scss +++ b/apps/client/src/styles/theme.scss @@ -139,20 +139,28 @@ $_tertiary: map.merge(map.get($_palettes, tertiary), $_rest); @include mat.elevation-classes(); @include mat.table-density(-1); -// $gf-typography: mat.m2-define-typography-config(); +$gf-typography: ( + // Font families + brand-family: var(--font-family-sans-serif), + plain-family: var(--font-family-sans-serif), + // Font weights + bold-weight: 700, + medium-weight: 500, + regular-weight: 400 +); .theme-light { $gf-theme-default: mat.define-theme( ( color: ( primary: $_primary, - theme-type: light, - tertiary: $_tertiary + tertiary: $_tertiary, + theme-type: light ), density: ( scale: -3 ), - // typography: $gf-typography + typography: $gf-typography ) ); @@ -229,13 +237,13 @@ $_tertiary: map.merge(map.get($_palettes, tertiary), $_rest); ( color: ( primary: $_primary, - theme-type: dark, - tertiary: $_tertiary + tertiary: $_tertiary, + theme-type: dark ), density: ( scale: -3 ), - // typography: $gf-typography + typography: $gf-typography ) ); From 19abb6cbea84a592586ac5b875b4a6308a943f9d Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 3 May 2026 10:00:46 +0200 Subject: [PATCH 4/5] Bugfix/handling of string inputs in form of asset profile dialog (#6834) * Fix string inputs handling * Update changelog --- CHANGELOG.md | 1 + .../asset-profile-dialog/asset-profile-dialog.component.ts | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0b601427..534477a89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Resolved a validation error with an empty URL in the asset profile details dialog of the admin control panel - Resolved an issue where charts and components defaulted to _Roboto_ instead of the preconfigured _Inter_ font family ## 3.1.0 - 2026-04-29 diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts index 76f6cb9c2..f0721c87f 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts @@ -575,13 +575,13 @@ export class GfAssetProfileDialogComponent implements OnInit { assetClass: this.assetProfileForm.controls.assetClass.value ?? undefined, assetSubClass: this.assetProfileForm.controls.assetSubClass.value ?? undefined, - comment: this.assetProfileForm.controls.comment.value ?? undefined, + comment: this.assetProfileForm.controls.comment.value || undefined, currency: this.assetProfileForm.controls.currency.value ?? undefined, isActive: isBoolean(this.assetProfileForm.controls.isActive.value) ? this.assetProfileForm.controls.isActive.value : undefined, - name: this.assetProfileForm.controls.name.value ?? undefined, - url: this.assetProfileForm.controls.url.value ?? undefined + name: this.assetProfileForm.controls.name.value || undefined, + url: this.assetProfileForm.controls.url.value || undefined }; try { From 03f10c35dfefda1cf1c1486df2dde4d291051910 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 3 May 2026 10:04:28 +0200 Subject: [PATCH 5/5] Release 3.2.0 (#6836) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 534477a89..43119ff4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +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 +## 3.2.0 - 2026-05-03 ### Added diff --git a/package-lock.json b/package-lock.json index 3e35d09fc..f507d8eb8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.1.0", + "version": "3.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.1.0", + "version": "3.2.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 99b774bfb..54c1f048f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.1.0", + "version": "3.2.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio",