From 177981110c2c77bdc685188e8103d9306c566d49 Mon Sep 17 00:00:00 2001
From: Faizan Khan <108194702+jellyfishing2346@users.noreply.github.com>
Date: Thu, 8 Oct 2026 11:14:20 -0400
Subject: [PATCH 01/14] Feature/add IBKR instructions to FAQ (#7870)
* Add IBKR instructions
* Update changelog
---
CHANGELOG.md | 6 ++
.../pages/faq/overview/faq-overview-page.html | 59 +++++++++++++++++++
2 files changed, 65 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3a08d82688..413120f74c 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
+
+### Added
+
+- Extended the content of the _General_ section by information about the import of activities from _Interactive Brokers_ on the Frequently Asked Questions (FAQ) page
+
## 3.81.0 - 2026-10-07
### Changed
diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page.html b/apps/client/src/app/pages/faq/overview/faq-overview-page.html
index 66b416fbab..cca488898e 100644
--- a/apps/client/src/app/pages/faq/overview/faq-overview-page.html
+++ b/apps/client/src/app/pages/faq/overview/faq-overview-page.html
@@ -56,6 +56,65 @@
return).
+
+
+ How can I import activities from
+ Interactive Brokers (IBKR)?
+
+
+
+
Log in to your Interactive Brokers Client Portal
+
+ Navigate to Performance & Reports in the top
+ menu, then select Flex Queries
+
+
+ Click the + button next to Activity Flex Query
+
+
Select Trades under Sections
+
Select Executions on the pop-up window
+
+ Click SELECT ALL and then Save
+
+
Enter a Query Name (e.g., "Ghostfolio Export")
+
+ Under Delivery Configuration, set Format to
+ CSV,
+ Include header and trailer records to
+ No, Include column headers to
+ Yes and
+ Display single column header row to
+ Yes
+
+
Click Create
+
Run the Activity Flex Query
+
+ Under Period, select Custom Date Range and choose
+ the dates you want to export. Run separate exports for longer
+ histories if necessary
+
+
+ Set Format to CSV, click
+ Run and download your trades
+
+
+ Import the CSV file in Ghostfolio: Portfolio →
+ Activities →
+ Import Activities...
+
+
+
+ Please note: The export contains trades only. It does not contain
+ dividends, interest or taxes. Keep only rows with the asset class
+ STK. Remove all other rows before the import, for
+ example currency conversions (CASH, such as
+ EUR.USD). Symbols from exchanges outside the US might
+ need a manual change.
+
+
+ Can I use Ghostfolio anonymously?
From 4b14053b2c533bbe1fad1204f96628752cab20ac Mon Sep 17 00:00:00 2001
From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com>
Date: Thu, 8 Oct 2026 22:16:25 +0700
Subject: [PATCH 02/14] Task/resolve strict template errors in rule settings
dialog (#8084)
Resolve strict template errors
---
.../rule-settings-dialog.html | 236 +++++++++---------
1 file changed, 122 insertions(+), 114 deletions(-)
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 618626b63e..14fe4d228f 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
@@ -6,123 +6,131 @@
(ngSubmit)="onSubmit()"
>
From d81484881d961b8333d833f6d5bf3b737fc112bf Mon Sep 17 00:00:00 2001
From: Lyndros <38167685+Lyndros@users.noreply.github.com>
Date: Fri, 9 Oct 2026 09:15:25 +0200
Subject: [PATCH 03/14] Task/improve language localization for ES (20261008)
(#8087)
* Updated translations
* Update changelog
---
CHANGELOG.md | 4 +
apps/client/src/locales/messages.es.xlf | 106 ++++++++++++------------
2 files changed, 57 insertions(+), 53 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 413120f74c..bbcb107461 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Extended the content of the _General_ section by information about the import of activities from _Interactive Brokers_ on the Frequently Asked Questions (FAQ) page
+### Changed
+
+- Improved the language localization for Spanish (`es`)
+
## 3.81.0 - 2026-10-07
### Changed
diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf
index b38233ad0f..fd6f7b98d4 100644
--- a/apps/client/src/locales/messages.es.xlf
+++ b/apps/client/src/locales/messages.es.xlf
@@ -100,7 +100,7 @@
Any person who has the link can view the data.
- Any person who has the link can view the data.
+ Cualquier persona que tenga el enlace puede ver los datos.apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html42
@@ -388,7 +388,7 @@
View and manage
- View and manage
+ Ver y administrarlibs/ui/src/lib/access-level-icon/access-level-icon.component.html9
@@ -648,7 +648,7 @@
Explore our guides to help you get started with investing and managing your finances.
- Explore our guides to help you get started with investing and managing your finances.
+ Explora nuestras guías para ayudarte a empezar a invertir y gestionar tus finanzas.apps/client/src/app/pages/resources/overview/resources-overview.component.ts21
@@ -892,7 +892,7 @@
Last Used
- Last Used
+ Último usoapps/client/src/app/components/access-table/access-table.component.html31
@@ -900,7 +900,7 @@
An error occurred while merging this asset profile into ().
- An error occurred while merging this asset profile into ().
+ Se produjo un error al fusionar este perfil de activo en ().apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts946
@@ -944,7 +944,7 @@
Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section.
- Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section.
+ Encuentra respuestas rápidas a las preguntas más frecuentes sobre Ghostfolio en nuestra sección de preguntas frecuentes (FAQ).apps/client/src/app/pages/resources/overview/resources-overview.component.ts16
@@ -2188,7 +2188,7 @@
Restricted view and manage
- Restricted view and manage
+ Vista restringida y administraciónlibs/ui/src/lib/access-level-icon/access-level-icon.component.html5
@@ -2744,7 +2744,7 @@
By , this is projected to increase to per year or per month, assuming a annual interest rate.
- Para , se prevé que esto aumente a por año o por mes, asumiendo una tasa de interés anual del .
+ Para , se prevé que esto aumente a por año o por mes, asumiendo una tasa de interés anual del .apps/client/src/app/pages/portfolio/fire/fire-page.html144
@@ -3032,7 +3032,7 @@
Next
- Next
+ Siguienteapps/client/src/app/pages/resources/personal-finance-tools/product-page.html406
@@ -3160,7 +3160,7 @@
Export
- Exportar
+ Exportar libs/ui/src/lib/activities-table/activities-table.component.html72
@@ -3304,7 +3304,7 @@
Find quick answers to commonly asked questions about self-hosting Ghostfolio in our Frequently Asked Questions (FAQ) section.
- Find quick answers to commonly asked questions about self-hosting Ghostfolio in our Frequently Asked Questions (FAQ) section.
+ Encuentra respuestas rápidas a las preguntas más frecuentes sobre el autoalojamiento de Ghostfolio en nuestra sección de preguntas frecuentes (FAQ).apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html8
@@ -3328,7 +3328,7 @@
If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of
- Si te jubilas hoy, podrías retirar por año o por mes, basado en tus activos totales de y una tasa de retiro segura (SWR) de
+ Si te jubilas hoy, podrías retirar por año o por mes, basado en tus activos totales de y una tasa de retiro segura (SWR) deapps/client/src/app/pages/portfolio/fire/fire-page.html69
@@ -3404,7 +3404,7 @@
Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section.
- Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section.
+ Encuentra respuestas rápidas a las preguntas más frecuentes sobre la oferta de Ghostfolio en la nube totalmente gestionada en nuestra sección de preguntas frecuentes (FAQ).apps/client/src/app/pages/faq/saas/saas-page.html8
@@ -3484,7 +3484,7 @@
Add your first activity
- Add your first activity
+ Añade tu primera operaciónlibs/ui/src/lib/no-activities-info/no-activities-info.component.html12
@@ -3584,7 +3584,7 @@
This action cannot be undone.
- This action cannot be undone.
+ Esta acción no se puede deshacer.apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts965
@@ -4108,7 +4108,7 @@
Add to Watchlist
- Add to Watchlist
+ Añadir a la lista de seguimientolibs/common/src/lib/routes/routes.ts163
@@ -4132,7 +4132,7 @@
This asset profile cannot be merged into ().
- This asset profile cannot be merged into ().
+ Este perfil de activo no se puede fusionar en ().apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts924
@@ -4184,7 +4184,7 @@
Do you really want to remove this received access?
- Do you really want to remove this received access?
+ ¿Seguro que quieres eliminar este acceso recibido?apps/client/src/app/components/access-table/access-table.component.ts152
@@ -4216,7 +4216,7 @@
The data of this asset profile is moved to () and this asset profile is deleted.
- The data of this asset profile is moved to () and this asset profile is deleted.
+ Los datos de este perfil de activo se trasladan a () y este perfil de activo se elimina.apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts963
@@ -4308,7 +4308,7 @@
thereof Dividend Performance
- thereof Dividend Performance
+ del cual, rendimiento de dividendosapps/client/src/app/components/portfolio-summary/portfolio-summary.component.html178
@@ -4696,7 +4696,7 @@
Financial Advisor
- Financial Advisor
+ Asesor financierolibs/ui/src/lib/i18n.ts110
@@ -5384,7 +5384,7 @@
Learn key financial terms and concepts in our comprehensive glossary.
- Learn key financial terms and concepts in our comprehensive glossary.
+ Aprende términos y conceptos financieros clave en nuestro completo glosario.apps/client/src/app/pages/resources/overview/resources-overview.component.ts31
@@ -5829,7 +5829,7 @@
Expiration Date
- Expiration Date
+ Fecha de caducidadapps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html54
@@ -5926,7 +5926,7 @@
Do you really want to merge this asset profile into it?
- Do you really want to merge this asset profile into it?
+ ¿Seguro que quieres fusionar este perfil de activo en él?apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts969
@@ -6194,7 +6194,7 @@
Alternative Investment
- Alternative Investment
+ Inversión alternativalibs/ui/src/lib/i18n.ts52
@@ -6202,7 +6202,7 @@
Commodity
- Commodity
+ Materia primalibs/ui/src/lib/i18n.ts53
@@ -6210,7 +6210,7 @@
Equity
- Equity
+ Renta variablelibs/ui/src/lib/i18n.ts54
@@ -6218,7 +6218,7 @@
Fixed Income
- Fixed Income
+ Renta fijalibs/ui/src/lib/i18n.ts55
@@ -6226,7 +6226,7 @@
Liquidity
- Liquidity
+ Liquidezlibs/ui/src/lib/i18n.ts56
@@ -6234,7 +6234,7 @@
Real Estate
- Real Estate
+ Inmobiliariolibs/ui/src/lib/i18n.ts57
@@ -6242,7 +6242,7 @@
Bond
- Bond
+ Bonolibs/ui/src/lib/i18n.ts60
@@ -6250,7 +6250,7 @@
Cash
- Cash
+ Efectivolibs/ui/src/lib/i18n.ts61
@@ -6258,7 +6258,7 @@
Collectible
- Collectible
+ Objeto de colecciónlibs/ui/src/lib/i18n.ts62
@@ -6266,7 +6266,7 @@
Commodity
- Commodity
+ Materia primaapps/client/src/app/pages/i18n/i18n-page.html5
@@ -6274,7 +6274,7 @@
Cryptocurrency
- Cryptocurrency
+ Criptomonedalibs/ui/src/lib/i18n.ts63
@@ -6282,7 +6282,7 @@
ETF
- ETF
+ ETFlibs/ui/src/lib/i18n.ts64
@@ -6290,7 +6290,7 @@
Loan
- Loan
+ Préstamolibs/ui/src/lib/i18n.ts65
@@ -6298,7 +6298,7 @@
Mutual Fund
- Mutual Fund
+ Fondo de inversiónlibs/ui/src/lib/i18n.ts66
@@ -6306,7 +6306,7 @@
Precious Metal
- Precious Metal
+ Metal preciosolibs/ui/src/lib/i18n.ts67
@@ -6314,7 +6314,7 @@
Private Equity
- Private Equity
+ Capital privadolibs/ui/src/lib/i18n.ts68
@@ -6322,7 +6322,7 @@
Stock
- Stock
+ Acciónlibs/ui/src/lib/i18n.ts69
@@ -6666,7 +6666,7 @@
Expires ()
- Caduca ()
+ Caduca ()apps/client/src/app/components/admin-users/admin-users.html34
@@ -6690,7 +6690,7 @@
Date must be in the future.
- Date must be in the future.
+ La fecha debe estar en el futuro.apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html70
@@ -7071,7 +7071,7 @@
Previous
- Previous
+ Anteriorapps/client/src/app/pages/resources/personal-finance-tools/product-page.html396
@@ -7243,7 +7243,7 @@
Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section. Discover what Ghostfolio is, explore its features, and learn about our privacy practices. Get all the information you need in one place.
- Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section. Discover what Ghostfolio is, explore its features, and learn about our privacy practices. Get all the information you need in one place.
+ Encuentra respuestas rápidas a las preguntas más frecuentes sobre Ghostfolio en nuestra sección de preguntas frecuentes (FAQ). Descubre qué es Ghostfolio, explora sus funciones y conoce nuestras prácticas de privacidad. Obtén toda la información que necesitas en un solo lugar.apps/client/src/app/pages/faq/overview/faq-overview-page.html8
@@ -7395,7 +7395,7 @@
thereof Dividend
- thereof Dividend
+ de los cuales, dividendosapps/client/src/app/components/portfolio-summary/portfolio-summary.component.html102
@@ -7937,7 +7937,7 @@
Access various market resources and tools to stay informed about financial markets.
- Access various market resources and tools to stay informed about financial markets.
+ Accede a diversos recursos y herramientas del mercado para mantenerte informado sobre los mercados financieros.apps/client/src/app/pages/resources/overview/resources-overview.component.ts26
@@ -8217,7 +8217,7 @@
Oops! Could not remove the received access.
- Oops! Could not remove the received access.
+ ¡Vaya! No se pudo eliminar el acceso recibido.apps/client/src/app/components/user-account-access/user-account-access.component.ts156
@@ -8301,7 +8301,7 @@
Additional requests are granted while you are setting up your instance
- Additional requests are granted while you are setting up your instance
+ Se conceden solicitudes adicionales mientras configuras tu instanciaapps/client/src/app/components/admin-settings/admin-settings.component.ts88
@@ -8402,7 +8402,7 @@
() is already in use.
- () ya está en uso.
+ () ya está en uso.apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts967
@@ -8833,7 +8833,7 @@
new
- new
+ nuevoapps/client/src/app/pages/features/features-page.html223
@@ -9154,7 +9154,7 @@
Return on Average Investment (total return with dividends)
- Return on Average Investment (total return with dividends)
+ Rentabilidad sobre la inversión media (rentabilidad total con dividendos)apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html159
@@ -9466,7 +9466,7 @@
Oops! Could not revoke the granted access.
- Oops! Could not revoke the granted access.
+ ¡Vaya! No se pudo revocar el acceso concedido.apps/client/src/app/components/user-account-access/user-account-access.component.ts135
From 696d5d9882e432517b6f77d622ebe661403b4d31 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Fri, 9 Oct 2026 10:43:55 +0200
Subject: [PATCH 04/14] Bugfix/missing first data point in portfolio evolution
chart (#8089)
* Fix missing first data point in portfolio evolution chart
* Update changelog
---
CHANGELOG.md | 4 ++
.../analysis/analysis-page.component.ts | 48 ++++++++-----------
2 files changed, 25 insertions(+), 27 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bbcb107461..2682a7b753 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Improved the language localization for Spanish (`es`)
+### Fixed
+
+- Fixed the missing first data point in the portfolio evolution chart on the analysis page
+
## 3.81.0 - 2026-10-07
### Changed
diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
index 5629965006..62debb78a5 100644
--- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
+++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
@@ -329,36 +329,30 @@ export class GfAnalysisPageComponent implements OnInit {
this.performanceDataItems = [];
this.performanceDataItemsInPercentage = [];
- for (const [
- index,
- {
- date,
- dividendInPercentageWithCurrencyEffect,
- netPerformanceInPercentageWithCurrencyEffect,
- totalInvestmentValueWithCurrencyEffect,
- valueInPercentage,
- valueWithCurrencyEffect
+ for (const {
+ date,
+ dividendInPercentageWithCurrencyEffect,
+ netPerformanceInPercentageWithCurrencyEffect,
+ totalInvestmentValueWithCurrencyEffect,
+ valueInPercentage,
+ valueWithCurrencyEffect
+ } of chart ?? []) {
+ if (totalInvestmentValueWithCurrencyEffect !== undefined) {
+ this.investments.push({
+ date,
+ investment: totalInvestmentValueWithCurrencyEffect
+ });
}
- ] of (chart ?? []).entries()) {
- // Ignore first item where value is 0
- if (index > 0 || this.user?.settings?.dateRange === 'max') {
- if (totalInvestmentValueWithCurrencyEffect !== undefined) {
- this.investments.push({
- date,
- investment: totalInvestmentValueWithCurrencyEffect
- });
- }
- const value = isNumber(valueWithCurrencyEffect)
- ? valueWithCurrencyEffect
- : valueInPercentage;
+ const value = isNumber(valueWithCurrencyEffect)
+ ? valueWithCurrencyEffect
+ : valueInPercentage;
- if (isNumber(value)) {
- this.performanceDataItems.push({
- date,
- value
- });
- }
+ if (isNumber(value)) {
+ this.performanceDataItems.push({
+ date,
+ value
+ });
}
if (isNumber(netPerformanceInPercentageWithCurrencyEffect)) {
From 26f9e6e1c9e6aecf86b094594c1f314ace76caaf Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Fri, 9 Oct 2026 11:23:25 +0200
Subject: [PATCH 05/14] Bugfix/add missing country mapping for Korea in FMP
service (#8096)
* Add missing country mapping for Korea
* Update changelog
---
CHANGELOG.md | 1 +
.../financial-modeling-prep/financial-modeling-prep.service.ts | 1 +
2 files changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2682a7b753..ed2c5e26ba 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
- Fixed the missing first data point in the portfolio evolution chart on the analysis page
+- Fixed the missing mapping for Korea in the country weightings of the _Financial Modeling Prep_ service
## 3.81.0 - 2026-10-07
diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
index d3b72ab349..e6ad639b84 100644
--- a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
+++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
@@ -58,6 +58,7 @@ export class FinancialModelingPrepService
'Congo (Dem. Rep. of the)': 'CD',
'Congo (Rep. of)': 'CG',
'Czech Republic': 'CZ',
+ Korea: 'KR',
'Korea (the Republic of)': 'KR',
Macau: 'MO',
'Russian Federation': 'RU',
From 75f0b0cf53ea6367837244994d074968bae4748f Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Fri, 9 Oct 2026 11:23:55 +0200
Subject: [PATCH 06/14] Task/extend personal finance tools (20261008) (#8092)
Extend personal finance tools
---
libs/common/src/lib/personal-finance-tools.ts | 90 +++++++++++++++++++
1 file changed, 90 insertions(+)
diff --git a/libs/common/src/lib/personal-finance-tools.ts b/libs/common/src/lib/personal-finance-tools.ts
index 9f891d3818..e610730472 100644
--- a/libs/common/src/lib/personal-finance-tools.ts
+++ b/libs/common/src/lib/personal-finance-tools.ts
@@ -794,6 +794,28 @@ export const personalFinanceTools: Product[] = (
updatedAt: '2026-09-23',
url: 'https://www.comarch.com/finance/banking/comarch-wealth-management'
},
+ {
+ categories: [
+ 'BUDGETING',
+ 'CRYPTOCURRENCY',
+ 'DIVIDEND_TRACKING',
+ 'ETF_TRACKING',
+ 'NET_WORTH_TRACKING',
+ 'STOCK_TRACKING'
+ ],
+ founded: 2019,
+ hasFreePlan: true,
+ key: 'compiledsanity-personal-finance',
+ languages: ['English'],
+ name: 'CompiledSanity Personal Finance',
+ note: 'License is a perpetual license',
+ origin: 'AU',
+ platforms: ['WEB'],
+ pricingPerYear: 'AUD 12',
+ slogan: 'Understand Your Money. Grow Your Wealth.',
+ updatedAt: '2026-10-08',
+ url: 'https://cspersonalfinance.io'
+ },
{
categories: ['WEALTH_MANAGEMENT'],
founded: 2019,
@@ -1458,6 +1480,26 @@ export const personalFinanceTools: Product[] = (
updatedAt: '2026-07-05',
url: 'https://finateka.com'
},
+ {
+ categories: [
+ 'BUDGETING',
+ 'CRYPTOCURRENCY',
+ 'DIVIDEND_TRACKING',
+ 'NET_WORTH_TRACKING',
+ 'STOCK_TRACKING'
+ ],
+ hasFreePlan: true,
+ hasSelfHostingAbility: false,
+ key: 'finboard',
+ languages: ['Deutsch', 'English', 'Español'],
+ name: 'FinBoard',
+ origin: 'ES',
+ platforms: ['WEB'],
+ pricingPerYear: '€49.90',
+ slogan: 'Your Personal Finance Dashboard',
+ updatedAt: '2026-10-08',
+ url: 'https://finboard.me'
+ },
{
categories: ['NET_WORTH_TRACKING', 'STOCK_TRACKING'],
founded: 2022,
@@ -2576,6 +2618,33 @@ export const personalFinanceTools: Product[] = (
updatedAt: '2026-09-02',
url: 'https://neontra.com'
},
+ {
+ categories: [
+ 'BUDGETING',
+ 'CRYPTOCURRENCY',
+ 'ETF_TRACKING',
+ 'NET_WORTH_TRACKING',
+ 'STOCK_TRACKING'
+ ],
+ hasFreePlan: true,
+ hasSelfHostingAbility: false,
+ key: 'neto',
+ languages: [
+ 'Deutsch',
+ 'English',
+ 'Español',
+ 'Français',
+ 'Italiano',
+ 'Português'
+ ],
+ name: 'Neto',
+ origin: 'ES',
+ platforms: ['ANDROID', 'IOS'],
+ pricingPerYear: '€49.99',
+ slogan: 'Tus gastos, tus ahorros y tu patrimonio en una sola app',
+ updatedAt: '2026-10-08',
+ url: 'https://netoapp.es'
+ },
{
categories: ['INVESTMENT_RESEARCH', 'STOCK_TRACKING'],
hasFreePlan: true,
@@ -2672,6 +2741,27 @@ export const personalFinanceTools: Product[] = (
updatedAt: '2026-09-23',
url: 'https://orion.com/advisor-tech/risk-intelligence'
},
+ {
+ categories: [
+ 'CRYPTOCURRENCY',
+ 'ETF_TRACKING',
+ 'FAMILY_OFFICE',
+ 'NET_WORTH_TRACKING',
+ 'STOCK_TRACKING',
+ 'WEALTH_MANAGEMENT'
+ ],
+ hasFreePlan: false,
+ hasSelfHostingAbility: false,
+ key: 'ormax',
+ languages: ['English'],
+ name: 'Ormax',
+ origin: 'CY',
+ platforms: ['WEB'],
+ pricingPerYear: '$240',
+ slogan: 'AI Wealth Management',
+ updatedAt: '2026-10-08',
+ url: 'https://ormax.ai'
+ },
{
categories: [
'CRYPTOCURRENCY',
From b7c18ca44ed0c9905b82997b7d0e1d4c0b3cc82f Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Fri, 9 Oct 2026 11:24:18 +0200
Subject: [PATCH 07/14] Task/improve entity logos in Storybook (#8088)
* Improve entity logos
* Update changelog
---
CHANGELOG.md | 1 +
.../account-selector.component.stories.ts | 27 ++++++++---
.../accounts-table.component.stories.ts | 10 +++-
.../activities-table.component.stories.ts | 10 +++-
.../entity-logo-image-source.service.ts | 5 +-
.../entity-logo-image-source.service.mock.ts | 46 +++++++++++++++----
6 files changed, 81 insertions(+), 18 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ed2c5e26ba..8569d69a13 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
+- Improved the _Storybook_ stories of the account selector, accounts table, activities table and holdings table components
- Improved the language localization for Spanish (`es`)
### Fixed
diff --git a/libs/ui/src/lib/account-selector/account-selector.component.stories.ts b/libs/ui/src/lib/account-selector/account-selector.component.stories.ts
index d974145aae..619754b830 100644
--- a/libs/ui/src/lib/account-selector/account-selector.component.stories.ts
+++ b/libs/ui/src/lib/account-selector/account-selector.component.stories.ts
@@ -24,7 +24,7 @@ const ACCOUNTS: AccountWithPlatform[] = [
platform: {
id: '9da3a8a7-4795-43e3-a6db-ccb914189737',
name: 'Coinbase',
- url: 'https://coinbase.com'
+ url: 'https://www.coinbase.com'
},
platformId: '9da3a8a7-4795-43e3-a6db-ccb914189737',
updatedAt: new Date('2024-01-01'),
@@ -33,13 +33,28 @@ const ACCOUNTS: AccountWithPlatform[] = [
{
comment: null,
createdAt: new Date('2024-01-01'),
- currency: 'CHF',
+ currency: 'USD',
+ id: 'd191b2d5-9d5a-4c5f-9d55-6f0e5f6a7b8c',
+ name: 'Private Banking Account',
+ platform: {
+ id: '43e8fcd1-5b79-4100-b678-d2229bd1660d',
+ name: 'J.P. Morgan',
+ url: 'https://www.jpmorgan.com'
+ },
+ platformId: '43e8fcd1-5b79-4100-b678-d2229bd1660d',
+ updatedAt: new Date('2024-01-01'),
+ userId: '081aa387-487d-4438-83a4-3060eb2a016e'
+ },
+ {
+ comment: null,
+ createdAt: new Date('2024-01-01'),
+ currency: 'USD',
id: '9da3a8a7-4795-43e3-a6db-ccb914189737',
- name: 'Ghostfolio Account',
+ name: 'Trading Account',
platform: {
id: 'f3e9d0e5-1e0f-4a3c-8b12-1f2a3b4c5d6e',
- name: 'Ghostfolio',
- url: 'https://ghostfol.io'
+ name: 'Interactive Brokers',
+ url: 'https://interactivebrokers.com'
},
platformId: 'f3e9d0e5-1e0f-4a3c-8b12-1f2a3b4c5d6e',
updatedAt: new Date('2024-01-01'),
@@ -49,7 +64,7 @@ const ACCOUNTS: AccountWithPlatform[] = [
comment: null,
createdAt: new Date('2024-01-01'),
currency: 'EUR',
- id: 'd191b2d5-9d5a-4c5f-9d55-6f0e5f6a7b8c',
+ id: '267ec888-cb57-45d0-8085-938017417a2e',
name: 'Savings Account',
platformId: null,
updatedAt: new Date('2024-01-01'),
diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts b/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts
index 8eed29b576..eab3d14a14 100644
--- a/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts
+++ b/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts
@@ -12,6 +12,8 @@ import type { Meta, StoryObj } from '@storybook/angular';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { GfEntityLogoComponent } from '../entity-logo';
+import { EntityLogoImageSourceService } from '../entity-logo/entity-logo-image-source.service';
+import { EntityLogoImageSourceServiceMock } from '../mocks/entity-logo-image-source.service.mock';
import { NotificationService } from '../notifications';
import { GfValueComponent } from '../value';
import { GfAccountsTableComponent } from './accounts-table.component';
@@ -108,7 +110,13 @@ export default {
NgxSkeletonLoaderModule,
RouterModule.forChild([])
],
- providers: [NotificationService]
+ providers: [
+ NotificationService,
+ {
+ provide: EntityLogoImageSourceService,
+ useValue: new EntityLogoImageSourceServiceMock()
+ }
+ ]
})
]
} as Meta;
diff --git a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts
index b83555be18..b78b23357f 100644
--- a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts
+++ b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts
@@ -16,6 +16,8 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { GfActivityTypeComponent } from '../activity-type/activity-type.component';
import { GfEntityLogoComponent } from '../entity-logo';
+import { EntityLogoImageSourceService } from '../entity-logo/entity-logo-image-source.service';
+import { EntityLogoImageSourceServiceMock } from '../mocks/entity-logo-image-source.service.mock';
import { GfNoActivitiesInfoComponent } from '../no-activities-info/no-activities-info.component';
import { NotificationService } from '../notifications';
import { GfValueComponent } from '../value';
@@ -371,7 +373,13 @@ export default {
NgxSkeletonLoaderModule,
RouterModule.forChild([])
],
- providers: [NotificationService]
+ providers: [
+ NotificationService,
+ {
+ provide: EntityLogoImageSourceService,
+ useValue: new EntityLogoImageSourceServiceMock()
+ }
+ ]
})
]
} as Meta;
diff --git a/libs/ui/src/lib/entity-logo/entity-logo-image-source.service.ts b/libs/ui/src/lib/entity-logo/entity-logo-image-source.service.ts
index dc937e6b9b..32a3a18af7 100644
--- a/libs/ui/src/lib/entity-logo/entity-logo-image-source.service.ts
+++ b/libs/ui/src/lib/entity-logo/entity-logo-image-source.service.ts
@@ -2,8 +2,9 @@ import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import { Service } from '@angular/core';
-// Must stay auto-provided: several table stories render gf-entity-logo
-// without providing an override and resolve this from the root injector
+// Must stay auto-provided: the currency selector and portfolio filter form
+// stories render gf-entity-logo without providing an override and resolve
+// this from the root injector
@Service()
export class EntityLogoImageSourceService {
public getLogoUrlByAssetProfileIdentifier({
diff --git a/libs/ui/src/lib/mocks/entity-logo-image-source.service.mock.ts b/libs/ui/src/lib/mocks/entity-logo-image-source.service.mock.ts
index 4160485bce..45e7fda0dd 100644
--- a/libs/ui/src/lib/mocks/entity-logo-image-source.service.mock.ts
+++ b/libs/ui/src/lib/mocks/entity-logo-image-source.service.mock.ts
@@ -1,3 +1,4 @@
+import { getAssetProfileIdentifier } from '@ghostfolio/common/helper';
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import { DataSource } from '@ghostfolio/prisma/enums';
@@ -9,18 +10,47 @@ export class EntityLogoImageSourceServiceMock {
dataSource,
symbol
}: AssetProfileIdentifier) {
- if (dataSource === DataSource.YAHOO && symbol === 'AAPL') {
- return 'data:image/png;base64,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';
+ switch (getAssetProfileIdentifier({ dataSource, symbol })) {
+ case getAssetProfileIdentifier({
+ dataSource: DataSource.YAHOO,
+ symbol: 'AAPL'
+ }):
+ return 'data:image/png;base64,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';
+ case getAssetProfileIdentifier({
+ dataSource: DataSource.YAHOO,
+ symbol: 'BNDW'
+ }):
+ case getAssetProfileIdentifier({
+ dataSource: DataSource.YAHOO,
+ symbol: 'VT'
+ }):
+ case getAssetProfileIdentifier({
+ dataSource: DataSource.YAHOO,
+ symbol: 'VTI'
+ }):
+ return 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJx8fLT0tMTU3Ojo6Iys/RD84QzQ5OjcBCgoKDQwNGg8PGjclHyU3Nzc3Nzc3Nzc3Nzc3Nzc3Njc3Nzc3Nzc4NzU3Nzc3MDU1NTc1NTE3Ny0rMC0tLTctLf/AABEIACAAIAMBEQACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAEBwMFBgD/xAArEAACAQQAAggHAAAAAAAAAAABAgMABAURElEGBxMhQWFxgSIxMoKRkqH/xAAaAQACAwEBAAAAAAAAAAAAAAABAwIEBgAF/8QAKBEAAgICAAQEBwAAAAAAAAAAAQIAEQMEBTFBwRIhQnEGEyOhsdHh/9oADAMBAAIRAxEAPwB1XdzHaW8lxOWEcalmKoWIA8gCTQupJELsFXmZT4jpjgMxerZY7ICa4YEqnZOuwBs97KBURkVjQMt5+G7WunjyLQ9x2MNzWax+Dt1uMpM0MLNwhxE7jfnwg6oswXnE6+rl2W8OIWfcD8wmwvbfI2cV5ZuXgmXijYqV2Oej30QbFiLy4mxOUfyIhFGQiAyCN0N6wC0YKxW1yJEA8Ym79fqSKon6bzd4iN/Qo8yPuP7Nz1qXDZOXCdH7NwWvpxIxHgv0qfT4mP207MbpR1nicFQYRl2X9Ir9xg2tvHa20NvAvDFCgRF5KBoD8U8Cp4LuXYs3MyajIxWddOFZ47TNQxk9mOwnIHyG9qT7kj3FVthes03w9sgFsBPPzHeBdVqXOd6SLkb08aYqzWCI8joqv846GG2az0juMlNbW+UnrN9z2jgq1MnOrp0imijnieKaNZI3GmR1BDDkRXQqxU2poiB4rDY7ELMuMtI7ZZn43Cb0TrXt6DuoKoXlHZ9nLno5WupY0Yif/9k=';
+ case getAssetProfileIdentifier({
+ dataSource: DataSource.YAHOO,
+ symbol: 'IBIT'
+ }):
+ return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAbklEQVRYhe3UsQ2AMAwEwA8iksdhgzASozASbMA4llKEhtbFS0Ru/lsr9ilRXMYYYFLNLgAtKN/dfWf6LdT0CRFAgML+gr+TfgMre6CanQC2oPx092Mq4BseLSI66U8ggAACCCCAAAIIIIAA6YAXmvMQrFvWq40AAAAASUVORK5CYII=';
+ default:
+ return UNAVAILABLE_LOGO_URL;
}
-
- return UNAVAILABLE_LOGO_URL;
}
public getLogoUrlByUrl(url: string) {
- if (url === 'https://ghostfol.io') {
- return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAP1BMVEU2z8v////x/Pspzcn0/Px73drR8/KC3tz6/v6e5eOl5+WM4d7n+PhI08/i9/eu6edV1dJk2NVx2teV4+G87evvttLSAAABDElEQVRYhe2V3Y6EIAyFrQXlTwHd93/WpeBsdiKbtF7tJJwbCKFfDlKO0zQ0NPQJwqrn1ZO2zlk9PWPgusClRcsJmHb4pWUTItDDu4zMBJ5w0yog4HGvB0gCgOoBZrYFdL16AMsmmD5AcQ3ofj3AwbOAX38BIhMw02ZjtQ+tLnht66mCAGA2eka1G3eabUZwD/PLbeuHenKMBODVV0Dru/TTQLgKAc1BvQ/9yAEkOnlon66oehEBIHp7dbSyPoIc0NEADMDnAa4wAvVK+CADRGx/VpNSi+iF3jMTUH4rJQ0aISPmVk+JoJiZeJw1QnaqL2OmWKSFkxnrZWsbXK4TzO5tmS+8TYaGhv6xvgEEfAgHGc7HRgAAAABJRU5ErkJggg==';
+ switch (url) {
+ case 'https://ghostfol.io':
+ return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAP1BMVEU2z8v////x/Pspzcn0/Px73drR8/KC3tz6/v6e5eOl5+WM4d7n+PhI08/i9/eu6edV1dJk2NVx2teV4+G87evvttLSAAABDElEQVRYhe2V3Y6EIAyFrQXlTwHd93/WpeBsdiKbtF7tJJwbCKFfDlKO0zQ0NPQJwqrn1ZO2zlk9PWPgusClRcsJmHb4pWUTItDDu4zMBJ5w0yog4HGvB0gCgOoBZrYFdL16AMsmmD5AcQ3ofj3AwbOAX38BIhMw02ZjtQ+tLnht66mCAGA2eka1G3eabUZwD/PLbeuHenKMBODVV0Dru/TTQLgKAc1BvQ/9yAEkOnlon66oehEBIHp7dbSyPoIc0NEADMDnAa4wAvVK+CADRGx/VpNSi+iF3jMTUH4rJQ0aISPmVk+JoJiZeJw1QnaqL2OmWKSFkxnrZWsbXK4TzO5tmS+8TYaGhv6xvgEEfAgHGc7HRgAAAABJRU5ErkJggg==';
+ case 'https://interactivebrokers.com':
+ return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAkFBMVEXZICceHh4dHR0fHx8gICAUFBQTExMZGRkhISEaGhoVFRUYGBgSEhIXFxcWFhYcHBwbGxsiIiIRERG5HyTiICiyHyPEHyWtHiO/HyUvGxzOICYAFBMVGRkKFhYAGRgQFRVdGRtxHR+JHiGDHiI/HB2UHyJYGhxmGBolGxtIGxw2GxulHyN4HSCcHSIPHBxRHB764qjxAAADtUlEQVRYhYWXbZeiOBCFa5zpYW1X6W0gvBhAFBQV8f//u00RSFIh0HX6S3vOfby3kpQJ/Kfrn7H+DPUb6xfWBsvH+sLaivKwdqL28LNeA+Z6E+DQuwxsJ4DUrwOIvk2JgVGvAUsGNiNgU7UuAwrwU4DiXPUu/QSg+nmAosp8p34ErOs3fn+HSzFfAVEHAvizEKC/Z2HhNHCQgB8C8DoIm8IZgAIWAvDHE6DmzgASsL4CPG0gfPoLBhCwrv/aXDKAE1/QG4CFBvKb0McPvnUGQMCqAVwAAOgsA3tl4BN+aECP+uDOFwJ8KoCp12eA+0zo4Sz11MCBANxbiLcx6pNrv2iAAmb6BvXwWlqBTwVwbiG/xQUEyKp+McAImOmlgWrQQ9RyMgWJ3gTY+uvQQMi6YrYDNOADFhtQJ4MeWDozcNAGbIAy4PuR1MO5mAXYaz0CnPo+DqU+ww54Cx34QIA7wHnUh6+5ASOABVAGeAdTPfhaAAFwjfF+XEBRcWFvIf39BoAG6E9s0oe4i1cCEIDSvwMVIBAtdAwBrZcAEqCvY6UPK74e4OMv2Ab88QQNldRogPO8KHLuCvB3ANAVnBYQDVzE93Pe3qtLd033pUOPAKL3U60H9u493p6iECvrHuUsAAJ+LwOalvPdWf0b1+VMPwH0EDAA2a33Cr2lxGRBD8YKDAD7EBuAOOV8mxkAuJW23gTInwENyLre629GInEw0pIGGAHm74gGBCn3itg0AOxeWgY0YLxJGICm8LyCEQC8c8vAv0ACmAD24AJAWgDhADD1CCB3MQ14CQNeERFAhhE+XAB1F9QA0ULPO3ZmE+H5KC0DAvBrAfB8596Ot8RBZ3+/AFiXUQVIotc73+2KS0gNOAHGZVYBoih43fMdNw5n8J7rNWC8DE+ARACCV53vedqxUHwWQlNTvQZsHIAIAUHTlnu+T0/N81XVh0lvGlCA6TY+ApgEJOdWzJEyP4oqP+cdlABymx8BgQQE7CImkTUFiV4A6HNCAlg8AhJWcXuMEsA3WO8ZCQgUIGG3fM2AAZDPiQHAIgMQ3I4regkw3kMDIIkNAItOR3sIqAASYL6HEJBFBMDi69GtNwFfBoDFFJDFde5s4LcEkAedAKABCsBD4GzAAPBtABogAEEQw9DVAAXQDzoBCOaADJqydAUQAOtFytPs6QBkcN7PG0gA2wkw7MJRnQxiORfPucvAACAPyu3pKusk63YTf1in0qVHwBcB7PJ54WE85q4ACrBym7anKNV//w9w4apH/GbnrAAAAABJRU5ErkJggg==';
+ case 'https://www.coinbase.com':
+ return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAclBMVEVHcEz////////////////////////9/v////////////////////////////////////////////////8AUv8AUP8ATP/4+/8ARv9sjv8laP/F1f8KWv+rwf9Mgf/u9f/R3v/h6f80c/91nv+8zf+Pq/9HDuvmAAAAE3RSTlMAxpwd5o4v/gZyD0axz8tb2NVC3+ryxwAAA01JREFUWIWlV2uXgiAQ1cxIa2tLQFTEZ///L64C0qBonvZ+6RybGWCedzzPiXMcXKKrf0RJgo63Q3QJ4rNb0ongEv4kI1Bi8BM+g53qp+iauID86LRHPfx1qks8wviT/v24rj7iGG0f71t3TjUQ/Oivv+McvY9Pm6bsRMsx5rnoyqZJwSVWAnIOzSlV/2oJo5SSEZQyLF59Zf4OnRbOh0mgKjM86GIAQhnPSmPi4LDw1i8Et7UnGzwrpjssLRj9tHOqSxMEZ+nKHcz7G85W1CVYXmvBmR8ifbUipxvqA2he6KBaCXFS8UP9J/3hHXkvLaAjzAedPx/P13dQ0v7iAXW+9Xxwh0bJ3yf9WD0g3XO+vANXsTCP0BHI2PIwicVn1ulIaA8+lAPwTHLIPpIPwGyeGIQrN/yegAeqbCZFqSiLekBRCjx7HBXVO5SBCkHJ7eRnoq7QVFuFsNOL8FL+cx273BNJmYy6JEwBzuzTTF3hYpK4twRIWyQzFFaMiU6GIaFj2X/TFwwB4fVcf34EfclQ/sReoGpIwBewcqk/eAmeQYXKpsC7KAMw2lS49FHagkMIbrQTooV1ghcOUKhhPrBefos82UhQR+EFKreBSoxtUoN1MshX7yZ9CF3ASuQ2gPoM4CWlfE8WUmrFaOUFYFC8h8XRk78pCBHJHTFcBfLkT4q/NZD838C/n6CcCHJkNQ1GOQj55aj66b4wpo4w3jzJRr5PpIMrlemKE3pYTbrgov3FlCS5s5gCeZOm/bqcY1UML2hg6roWCquhMNNQppaG7Za2cEPfWk2Rm5amnfChqc6btm6q6Dm29atTgoni3dbrlbbuB2CwiPnwwO/BQmf/kQwMFu+kqKlrtOHt0fY4WcO1+3a4Tvwk5XvHe6sLyRDnuzLY7CMIpt4BS/qG4iBAcQDJ+khyJpKVWCTrC5qHbN5viGadbxFNwrgmWHOiCahuhh2BU+qUd2tU1yLb2RrZFqZIXXTdg3Sfszndp/gD3YcLRzIsHGLI4GnfGHK6BQvH4v3GwmLlyceVp9Urz9SrV1ceb9fSlWwsXSOiT2vffVN9QBw+1tV/w127a+S7R9N11+o7Injq5Rv4ww8ve5fvEXL9P9zU+u9fN9b/P6gEACs+iQ7UAAAAAElFTkSuQmCC';
+ case 'https://www.jpmorgan.com':
+ return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAY1BMVEUkJSb///8hIiMvMDHd3d0AAACoqaknKCmzs7SioqIODxGlpaYZGxxub2+XmJiNjY0TFRY4ODk/QEDn5+fu7u7V1tb29vbBwcGCg4NTU1TP0NB4eXpdXV5kZGQDBwlqamtGR0icW6P1AAACGElEQVRYhe2Ua5qrIAyGDYpYGhFBxVqr7n+VJ/HWqT3zjAvw+yOE8BJDSBRdunTp0qX/SKx6j5bZNv/2PQCcK0nOxWoeOVYZC+QVNvzwF/Hs+Ml0iW8AGp88+9oDQOV91UBiHlh2vAJOvPcn7Hmzn38gpQG4SYkoLTm85BD3GUAyopT0BaM3V3zRNBt0dNQN4K63E3KMBNoCIMRCZRRCNWx+MjBAfafxCOCwGvAvVPfgV8u8DN1ZQCRrgNaq1NCh9RqzNlVxGqDJVjAgr6AaZ5MQjWlPA4awRmAplDCbbNvE5yNYc5AaSXuSfs5LF+xpwPBcbiE1WtFFGLJh75+nAKO2Wj4bqHpkgNUpQDeJSN+TCc8ATG5SD00a06kMoMujdKCY6sKKM4CQpmkxqoELmAERZvw72FImTgFGqbXFpf4XwEgh9CoEJU4BtrrbAcJR/aVT1dLwALBSir8BEacObp5e8QFgW6jnt00AdvwV8KiZQEccAUuVipiyNFfrNyAL/BQt3WTFbeETIBQBckrSlICfl5Es0Oq9gSB2gWf48hAkO6Rc1/sJXO9ZJF0GzZP3lz2/d99O2xkP01SG0dgBlVI0tXRAYx57CI42UAODkCtatiYkrC57LC21zOokqQvCYR40zzter7O9TQrlXmPel2putNQx41nlFsEyXbIh9vlqWQgCSVuf/mjpb8My/OkQXbp06dKlD/0Do0chlGcV4zUAAAAASUVORK5CYII=';
+ default:
+ return UNAVAILABLE_LOGO_URL;
}
-
- return UNAVAILABLE_LOGO_URL;
}
}
From 50363532505aa12b729ec52671769a5596f74b24 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Fri, 9 Oct 2026 17:08:52 +0200
Subject: [PATCH 08/14] Bugfix/missing list numbers of top and bottom holdings
in Safari (#8090)
* Fix missing list numbers
* Update changelog
---
CHANGELOG.md | 1 +
.../pages/portfolio/analysis/analysis-page.html | 16 ++++++++++------
.../pages/portfolio/analysis/analysis-page.scss | 8 ++++++++
3 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8569d69a13..8d87e1535b 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
+- Fixed the missing list numbers in the top and bottom holdings on the analysis page in Safari
- Fixed the missing first data point in the portfolio evolution chart on the analysis page
- Fixed the missing mapping for Korea in the country weightings of the _Financial Modeling Prep_ service
diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html
index 96dfe24c45..c39b774f4b 100644
--- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html
@@ -330,7 +330,7 @@
>
-
+
@for (holding of top3; track holding) {