From 4256cdee34fdb17cff146cb95edd2ead5e78bb9a Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 4 Oct 2025 09:51:51 +0200
Subject: [PATCH 1/5] Bugfix/add missing CommonModule import in import
activities dialog (#5674)
* Add missing CommonModule import
* Update changelog
---
CHANGELOG.md | 1 +
.../import-activities-dialog.component.ts | 2 ++
2 files changed, 3 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 524dcc47b..9ad8f2267 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
- Handled an exception in the get asset profile functionality of the _Financial Modeling Prep_ service
+- Added the missing `CommonModule` import in the import activities dialog
## 2.205.0 - 2025-10-01
diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
index d1eaf0fe1..2439a4b65 100644
--- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
+++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
@@ -15,6 +15,7 @@ import {
StepperOrientation,
StepperSelectionEvent
} from '@angular/cdk/stepper';
+import { CommonModule } from '@angular/common';
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
@@ -59,6 +60,7 @@ import { ImportActivitiesDialogParams } from './interfaces/interfaces';
changeDetection: ChangeDetectionStrategy.OnPush,
host: { class: 'd-flex flex-column h-100' },
imports: [
+ CommonModule,
GfActivitiesTableComponent,
GfDialogFooterComponent,
GfDialogHeaderComponent,
From d715143299354272459a4e6949e3575aaac630e3 Mon Sep 17 00:00:00 2001
From: Malay Kumar <91375797+Malay-dev@users.noreply.github.com>
Date: Sat, 4 Oct 2025 13:58:08 +0530
Subject: [PATCH 2/5] Task/add value components to rule settings dialog (#5653)
* Add value components to rule settings dialog
* Update changelog
---
CHANGELOG.md | 1 +
.../interfaces/interfaces.ts | 1 +
.../rule-settings-dialog.component.ts | 2 +
.../rule-settings-dialog.html | 133 +++++++++---------
4 files changed, 71 insertions(+), 66 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9ad8f2267..4a58a725c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
+- Localized the number formatting in the settings dialog to customize the rule thresholds of the _X-ray_ page
- Improved the usability of the _Cancel_ / _Close_ buttons in the create watchlist item dialog
- Refactored the `fireWealth` from `number` type to a structured object in the summary of the portfolio details endpoint
- Refactored the _Open Startup_ (`/open`) page to standalone
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 9811a6564..51c2b8951 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
@@ -5,6 +5,7 @@ import {
export interface IRuleSettingsDialogParams {
categoryName: string;
+ locale: string;
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 7ee9c66cf..f8ce13e0d 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,5 @@
import { XRayRulesSettings } from '@ghostfolio/common/interfaces';
+import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { Component, Inject } from '@angular/core';
@@ -17,6 +18,7 @@ import { IRuleSettingsDialogParams } from './interfaces/interfaces';
imports: [
CommonModule,
FormsModule,
+ GfValueComponent,
MatButtonModule,
MatDialogModule,
MatSliderModule
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 9fdc0cd57..83d4e2d19 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
@@ -5,28 +5,30 @@
data.rule.configuration.thresholdMin && data.rule.configuration.thresholdMax
) {
} @else {
@@ -50,22 +51,23 @@
class="w-100"
[ngClass]="{ 'd-none': !data.rule.configuration.thresholdMin }"
>
-
+
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 {
-
- }
+
- @if (data.rule.configuration.threshold.unit === '%') {
-
- } @else {
-
- }
+
}
From 2248eb77f9ba7e1102ac068276e4841bd9cbab53 Mon Sep 17 00:00:00 2001
From: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Date: Sat, 4 Oct 2025 23:29:28 +0530
Subject: [PATCH 3/5] Feature/preselect first search result item in assistant
(#5656)
* Preselect first search result item in assistant
* Update changelog
---
CHANGELOG.md | 1 +
.../src/lib/assistant/assistant.component.ts | 63 +++++++++++++++++++
2 files changed, 64 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4a58a725c..008ec3055 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Localized the number formatting in the settings dialog to customize the rule thresholds of the _X-ray_ page
+- Improved the usability of the assistant by preselecting the first search result
- Improved the usability of the _Cancel_ / _Close_ buttons in the create watchlist item dialog
- Refactored the `fireWealth` from `number` type to a structured object in the summary of the portfolio details endpoint
- Refactored the _Open Startup_ (`/open`) page to standalone
diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts
index 57c440bdb..3fc1cc232 100644
--- a/libs/ui/src/lib/assistant/assistant.component.ts
+++ b/libs/ui/src/lib/assistant/assistant.component.ts
@@ -169,6 +169,8 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
};
public tags: Filter[] = [];
+ private readonly PRESELECTION_DELAY = 100;
+
private filterTypes: Filter['type'][] = [
'ACCOUNT',
'ASSET_CLASS',
@@ -176,7 +178,9 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
'SYMBOL',
'TAG'
];
+
private keyManager: FocusKeyManager;
+ private preselectionTimeout: ReturnType;
private unsubscribeSubject = new Subject();
public constructor(
@@ -344,6 +348,9 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
.subscribe({
next: (searchResults) => {
this.searchResults = searchResults;
+
+ this.preselectFirstItem();
+
this.changeDetectorRef.markForCheck();
},
error: (error) => {
@@ -585,6 +592,10 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
}
public ngOnDestroy() {
+ if (this.preselectionTimeout) {
+ clearTimeout(this.preselectionTimeout);
+ }
+
this.unsubscribeSubject.next();
this.unsubscribeSubject.complete();
}
@@ -595,6 +606,58 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
});
}
+ private getFirstSearchResultItem() {
+ if (this.searchResults.quickLinks?.length > 0) {
+ return this.searchResults.quickLinks[0];
+ }
+
+ if (this.searchResults.accounts?.length > 0) {
+ return this.searchResults.accounts[0];
+ }
+
+ if (this.searchResults.holdings?.length > 0) {
+ return this.searchResults.holdings[0];
+ }
+
+ if (this.searchResults.assetProfiles?.length > 0) {
+ return this.searchResults.assetProfiles[0];
+ }
+
+ return null;
+ }
+
+ private preselectFirstItem() {
+ if (this.preselectionTimeout) {
+ clearTimeout(this.preselectionTimeout);
+ }
+
+ this.preselectionTimeout = setTimeout(() => {
+ if (!this.isOpen || !this.searchFormControl.value) {
+ return;
+ }
+
+ const firstItem = this.getFirstSearchResultItem();
+
+ if (!firstItem) {
+ return;
+ }
+
+ for (const item of this.assistantListItems) {
+ item.removeFocus();
+ }
+
+ this.keyManager.setFirstItemActive();
+
+ const currentFocusedItem = this.getCurrentAssistantListItem();
+
+ if (currentFocusedItem) {
+ currentFocusedItem.focus();
+ }
+
+ this.changeDetectorRef.markForCheck();
+ }, this.PRESELECTION_DELAY);
+ }
+
private searchAccounts(aSearchTerm: string): Observable {
return this.dataService
.fetchAccounts({
From 6dc7edb7b57a57efc9465221d0751ed9100a9996 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 4 Oct 2025 20:11:48 +0200
Subject: [PATCH 4/5] Task/clean up unused import in holdings table component
(#5682)
* Clean up
---
libs/ui/src/lib/holdings-table/holdings-table.component.ts | 2 --
1 file changed, 2 deletions(-)
diff --git a/libs/ui/src/lib/holdings-table/holdings-table.component.ts b/libs/ui/src/lib/holdings-table/holdings-table.component.ts
index 83faf7621..1c46e18db 100644
--- a/libs/ui/src/lib/holdings-table/holdings-table.component.ts
+++ b/libs/ui/src/lib/holdings-table/holdings-table.component.ts
@@ -1,4 +1,3 @@
-import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { getLocale } from '@ghostfolio/common/helper';
import {
AssetProfileIdentifier,
@@ -34,7 +33,6 @@ import { GfValueComponent } from '../value/value.component';
imports: [
CommonModule,
GfEntityLogoComponent,
- GfSymbolPipe,
GfValueComponent,
MatButtonModule,
MatDialogModule,
From 400d4ae7b49bb5a78ec290a531cfc258be5a0731 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 4 Oct 2025 20:14:19 +0200
Subject: [PATCH 5/5] Release 2.206.0 (#5683)
---
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 008ec3055..5583fd59d 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
+## 2.206.0 - 2025-10-04
### Changed
diff --git a/package-lock.json b/package-lock.json
index 8f8676556..2ed25d7c2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ghostfolio",
- "version": "2.205.0",
+ "version": "2.206.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
- "version": "2.205.0",
+ "version": "2.206.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
diff --git a/package.json b/package.json
index 28881f546..8717f58df 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ghostfolio",
- "version": "2.205.0",
+ "version": "2.206.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",