From eaa5965f1b6ba4a5fd8a9c47e11411f7a4a1ad2d Mon Sep 17 00:00:00 2001
From: Red Rose <146128882+RED-ROSE515@users.noreply.github.com>
Date: Sun, 12 Jul 2026 10:10:04 -0500
Subject: [PATCH 1/3] Bugfix/truncate long labels in page tabs (#7178)
* Truncate long labels
* Update changelog
---
CHANGELOG.md | 1 +
apps/client/src/styles.scss | 8 ++++++--
.../src/lib/page-tabs/page-tabs.component.html | 16 +++++++++++-----
.../src/lib/page-tabs/page-tabs.component.scss | 5 +++++
4 files changed, 23 insertions(+), 7 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 178a1c7d9..895acc2f6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
+- Fixed the layout of the page tabs component by truncating long labels
- Fixed the display of assets without a currency in the search results of the assistant
- Fixed the display of assets without a currency in the symbol autocomplete component
diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss
index 045de2eb6..653efe376 100644
--- a/apps/client/src/styles.scss
+++ b/apps/client/src/styles.scss
@@ -376,12 +376,16 @@ ngx-skeleton-loader {
visibility: hidden;
}
+.lead {
+ font-weight: unset;
+}
+
.line-height-1 {
line-height: 1;
}
-.lead {
- font-weight: unset;
+.line-height-normal {
+ line-height: normal;
}
.mat-mdc-button-base {
diff --git a/libs/ui/src/lib/page-tabs/page-tabs.component.html b/libs/ui/src/lib/page-tabs/page-tabs.component.html
index 2898bcc79..34a5a3e26 100644
--- a/libs/ui/src/lib/page-tabs/page-tabs.component.html
+++ b/libs/ui/src/lib/page-tabs/page-tabs.component.html
@@ -45,9 +45,15 @@
-
-
+
+
+
+
diff --git a/libs/ui/src/lib/page-tabs/page-tabs.component.scss b/libs/ui/src/lib/page-tabs/page-tabs.component.scss
index ffb3ff33c..246a6147d 100644
--- a/libs/ui/src/lib/page-tabs/page-tabs.component.scss
+++ b/libs/ui/src/lib/page-tabs/page-tabs.component.scss
@@ -56,6 +56,11 @@
padding: 2rem 0;
width: 14rem;
+ .mat-mdc-tab-list,
+ .mat-mdc-tab-links {
+ width: 100%;
+ }
+
.mat-mdc-tab-links {
flex-direction: column;
From 3fdf9d7e3485b144caf30521ce88100047038afc Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 12 Jul 2026 17:37:45 +0200
Subject: [PATCH 2/3] Task/rename SymbolProfile to assetProfile in portfolio
order interface (#7310)
Rename SymbolProfile to assetProfile
---
.../calculator/portfolio-calculator.ts | 18 +++++------
.../calculator/roai/portfolio-calculator.ts | 30 ++++++++-----------
.../interfaces/portfolio-order.interface.ts | 8 ++---
3 files changed, 25 insertions(+), 31 deletions(-)
diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
index ab3f76703..e73e222ac 100644
--- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
+++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
@@ -141,9 +141,9 @@ export abstract class PortfolioCalculator {
}
return {
- SymbolProfile,
tags,
type,
+ assetProfile: SymbolProfile,
date: format(date, DATE_FORMAT),
fee: new Big(feeInAssetProfileCurrency),
feeInBaseCurrency: new Big(feeInBaseCurrency),
@@ -934,23 +934,23 @@ export abstract class PortfolioCalculator {
let lastTransactionPoint: TransactionPoint = null;
for (const {
+ assetProfile,
date,
fee,
feeInBaseCurrency,
quantity,
- SymbolProfile,
tags,
type,
unitPrice
} of this.activities) {
let currentTransactionPointItem: TransactionPointSymbol;
- const assetSubClass = SymbolProfile.assetSubClass;
- const currency = SymbolProfile.currency;
- const dataSource = SymbolProfile.dataSource;
+ const assetSubClass = assetProfile.assetSubClass;
+ const currency = assetProfile.currency;
+ const dataSource = assetProfile.dataSource;
const factor = getFactor(type);
- const skipErrors = !!SymbolProfile.userId; // Skip errors for custom asset profiles
- const symbol = SymbolProfile.symbol;
+ const skipErrors = !!assetProfile.userId; // Skip errors for custom asset profiles
+ const symbol = assetProfile.symbol;
const oldAccumulatedSymbol = symbols[symbol];
@@ -1034,12 +1034,12 @@ export abstract class PortfolioCalculator {
'id'
);
- symbols[SymbolProfile.symbol] = currentTransactionPointItem;
+ symbols[symbol] = currentTransactionPointItem;
const items = lastTransactionPoint?.items ?? [];
const newItems = items.filter(({ symbol }) => {
- return symbol !== SymbolProfile.symbol;
+ return symbol !== assetProfile.symbol;
});
newItems.push(currentTransactionPointItem);
diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
index d5efc4bf2..f79e5bc79 100644
--- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
+++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
@@ -192,12 +192,12 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
// Clone orders to keep the original values in this.orders
let orders: PortfolioOrderItem[] = cloneDeep(
- this.activities.filter(({ SymbolProfile }) => {
- return SymbolProfile.symbol === symbol;
+ this.activities.filter(({ assetProfile }) => {
+ return assetProfile.symbol === symbol;
})
);
- const isCash = orders[0]?.SymbolProfile?.assetSubClass === 'CASH';
+ const isCash = orders[0]?.assetProfile?.assetSubClass === 'CASH';
if (orders.length <= 0) {
return {
@@ -299,32 +299,30 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
};
}
+ const assetProfile: PortfolioOrderItem['assetProfile'] = {
+ dataSource,
+ symbol,
+ assetSubClass: isCash ? 'CASH' : undefined
+ };
+
// Add a synthetic order at the start and the end date
orders.push({
+ assetProfile,
date: startDateString,
fee: new Big(0),
feeInBaseCurrency: new Big(0),
itemType: 'start',
quantity: new Big(0),
- SymbolProfile: {
- dataSource,
- symbol,
- assetSubClass: isCash ? 'CASH' : undefined
- },
type: 'BUY',
unitPrice: unitPriceAtStartDate
});
orders.push({
+ assetProfile,
date: endDateString,
fee: new Big(0),
feeInBaseCurrency: new Big(0),
itemType: 'end',
- SymbolProfile: {
- dataSource,
- symbol,
- assetSubClass: isCash ? 'CASH' : undefined
- },
quantity: new Big(0),
type: 'BUY',
unitPrice: unitPriceAtEndDate
@@ -357,15 +355,11 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
}
} else {
orders.push({
+ assetProfile,
date: dateString,
fee: new Big(0),
feeInBaseCurrency: new Big(0),
quantity: new Big(0),
- SymbolProfile: {
- dataSource,
- symbol,
- assetSubClass: isCash ? 'CASH' : undefined
- },
type: 'BUY',
unitPrice: marketSymbolMap[dateString]?.[symbol] ?? lastUnitPrice,
unitPriceFromMarketData:
diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts
index 2dbd68f12..8d90c5bc6 100644
--- a/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts
+++ b/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts
@@ -1,13 +1,13 @@
import { Activity } from '@ghostfolio/common/interfaces';
export interface PortfolioOrder extends Pick {
+ assetProfile: Pick<
+ Activity['SymbolProfile'],
+ 'assetSubClass' | 'currency' | 'dataSource' | 'name' | 'symbol' | 'userId'
+ >;
date: string;
fee: Big;
feeInBaseCurrency: Big;
quantity: Big;
- SymbolProfile: Pick<
- Activity['SymbolProfile'],
- 'assetSubClass' | 'currency' | 'dataSource' | 'name' | 'symbol' | 'userId'
- >;
unitPrice: Big;
}
From 2b2ff0b883d5874fb93ee7ffae93aa1e41e8457e Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 12 Jul 2026 17:40:17 +0200
Subject: [PATCH 3/3] Release 3.25.0 (#7311)
---
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 895acc2f6..8e6752795 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.25.0 - 2026-07-12
### Changed
diff --git a/package-lock.json b/package-lock.json
index fababe870..4c0b837ee 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ghostfolio",
- "version": "3.24.0",
+ "version": "3.25.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
- "version": "3.24.0",
+ "version": "3.25.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
diff --git a/package.json b/package.json
index 1f377c3e1..bc6b86836 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ghostfolio",
- "version": "3.24.0",
+ "version": "3.25.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",