Browse Source

Merge branch 'main' into task/upgrade-ai-to-version-6.0.174

pull/6828/head
Thomas Kaul 2 weeks ago
committed by GitHub
parent
commit
9e68236d70
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 15
      CHANGELOG.md
  2. 4
      apps/client/src/app/app.component.ts
  3. 6
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
  4. 4
      apps/client/src/app/pages/portfolio/fire/fire-page.component.ts
  5. 22
      apps/client/src/styles/theme.scss
  6. 12
      libs/common/src/lib/dtos/update-user-setting.dto.ts
  7. 52
      libs/ui/src/lib/value/value.component.html
  8. 4
      package-lock.json
  9. 2
      package.json

15
CHANGELOG.md

@ -7,16 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
### Changed
- Upgraded `@openrouter/ai-sdk-provider` from version `0.7.2` to `2.9.0`
- Upgraded `ai` from version `4.3.16` to `6.0.174`
## 3.2.0 - 2026-05-03
### Added
- Added `angular-developer` skills
### Changed
- Upgraded `@openrouter/ai-sdk-provider` from version `0.7.2` to `2.9.0`
- Upgraded `ai` from version `4.3.16` to `6.0.174`
- Harmonized the unit styling in the value component
- Upgraded `stripe` from version `20.4.1` to `21.0.1`
### 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
### Added

4
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);

6
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 {

4
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))

22
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
)
);

12
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()

52
libs/ui/src/lib/value/value.component.html

@ -38,45 +38,23 @@
<div class="mr-1 text-danger">-</div>
}
}
@if (isPercent) {
<div
class="mb-0 value"
[ngClass]="{
'font-weight-bold h2': size === 'large',
h4: size === 'medium'
}"
>
@if (value === null) {
<span class="text-monospace text-muted">*****</span>%
} @else {
{{ formattedValue }}%
}
</div>
} @else {
<div
class="mb-0 value"
[ngClass]="{
'font-weight-bold h2': size === 'large',
h4: size === 'medium'
}"
>
@if (value === null) {
<span class="text-monospace text-muted">*****</span>
} @else {
{{ formattedValue }}
}
</div>
}
@if (unit) {
@if (size === 'medium') {
<small class="ml-1">
{{ unit }}
</small>
<div
class="mb-0 value"
[ngClass]="{
'font-weight-bold h2': size === 'large',
h4: size === 'medium'
}"
>
@if (value === null) {
<span class="text-monospace text-muted">*****</span>
} @else {
<div class="ml-1">
{{ unit }}
</div>
{{ formattedValue }}
}
</div>
@if (isPercent || unit) {
<div class="ml-1">
{{ isPercent ? '%' : unit }}
</div>
}
}
@if (isString) {

4
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": {

2
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",

Loading…
Cancel
Save