From 2ff02a0a9ce4ef23b27eaf33cd9681c808d259f9 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 13 Oct 2025 17:40:28 +0200 Subject: [PATCH 01/11] Feature/improve currency validation in search functionality of data provider service (#5745) * Improve currency validation * Update changelog --- CHANGELOG.md | 1 + .../services/data-provider/data-provider.service.ts | 7 +++++-- libs/common/src/lib/helper.ts | 10 +++++++--- package-lock.json | 7 ------- package.json | 1 - 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a555fa34..38981a8c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Disabled the zoom functionality in the _Progressive Web App_ (PWA) +- Improved the currency validation in the search functionality of the data provider service - Optimized the get quotes functionality by utilizing the asset profile resolutions in the _Financial Modeling Prep_ service - Extracted the footer to a component diff --git a/apps/api/src/services/data-provider/data-provider.service.ts b/apps/api/src/services/data-provider/data-provider.service.ts index 8754c3537..c70d643db 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -645,8 +645,11 @@ export class DataProviderService implements OnModuleInit { const filteredItems = lookupItems .filter(({ currency }) => { - // Only allow symbols with supported currency - return currency ? true : false; + if (includeIndices) { + return true; + } + + return currency ? isCurrency(currency) : false; }) .map((lookupItem) => { if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index e5dc187ff..97b762267 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -1,7 +1,7 @@ -import * as currencies from '@dinero.js/currencies'; import { NumberParser } from '@internationalized/number'; import { Type as ActivityType, DataSource, MarketData } from '@prisma/client'; import { Big } from 'big.js'; +import { isISO4217CurrencyCode } from 'class-validator'; import { getDate, getMonth, @@ -340,8 +340,12 @@ export function interpolate(template: string, context: any) { }); } -export function isCurrency(aCurrency = '') { - return currencies[aCurrency] || isDerivedCurrency(aCurrency); +export function isCurrency(aCurrency: string) { + if (!aCurrency) { + return false; + } + + return isISO4217CurrencyCode(aCurrency) || isDerivedCurrency(aCurrency); } export function isDerivedCurrency(aCurrency: string) { diff --git a/package-lock.json b/package-lock.json index 75e1f50fe..e65c23ac7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,6 @@ "@dfinity/candid": "0.15.7", "@dfinity/identity": "0.15.7", "@dfinity/principal": "0.15.7", - "@dinero.js/currencies": "2.0.0-alpha.8", "@internationalized/number": "3.6.3", "@ionic/angular": "8.7.3", "@keyv/redis": "4.4.0", @@ -5018,12 +5017,6 @@ "ts-node": "^10.8.2" } }, - "node_modules/@dinero.js/currencies": { - "version": "2.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/@dinero.js/currencies/-/currencies-2.0.0-alpha.8.tgz", - "integrity": "sha512-zApiqtuuPwjiM9LJA5/kNcT48VSHRiz2/mktkXjIpfxrJKzthXybUAgEenExIH6dYhLDgVmsLQZtZFOsdYl0Ag==", - "license": "MIT" - }, "node_modules/@discoveryjs/json-ext": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", diff --git a/package.json b/package.json index 28968c2c0..cb0ba6731 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,6 @@ "@dfinity/candid": "0.15.7", "@dfinity/identity": "0.15.7", "@dfinity/principal": "0.15.7", - "@dinero.js/currencies": "2.0.0-alpha.8", "@internationalized/number": "3.6.3", "@ionic/angular": "8.7.3", "@keyv/redis": "4.4.0", From 948df81a0d32f1f9d48b18a5bddf4906c2d89a25 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 13 Oct 2025 17:41:53 +0200 Subject: [PATCH 02/11] Feature/use asset profile resolutions in getQuotes() of FMP service (part 2) (#5750) * Use asset profile resolutions in getQuotes() --- .../financial-modeling-prep.service.ts | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) 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 3b0d8ba72..7c1395a23 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 @@ -373,26 +373,42 @@ export class FinancialModelingPrepService implements DataProviderInterface { { signal: AbortSignal.timeout(requestTimeout) } - ).then((res) => res.json()) + ).then( + (res) => res.json() as unknown as { price: number; symbol: string }[] + ) ]); - if (assetProfileResolutions.length === symbols.length) { - for (const { currency, symbolTarget } of assetProfileResolutions) { - currencyBySymbolMap[symbolTarget] = { currency }; + for (const { currency, symbolTarget } of assetProfileResolutions) { + currencyBySymbolMap[symbolTarget] = { currency }; + } + + const resolvedSymbols = assetProfileResolutions.map( + ({ symbolTarget }) => { + return symbolTarget; } - } else { + ); + + const symbolsToFetch = quotes + .map(({ symbol }) => { + return symbol; + }) + .filter((symbol) => { + return !resolvedSymbols.includes(symbol); + }); + + if (symbolsToFetch.length > 0) { await Promise.all( - quotes.map(({ symbol }) => { - return this.getAssetProfile({ + symbolsToFetch.map(async (symbol) => { + const assetProfile = await this.getAssetProfile({ requestTimeout, symbol - }).then((assetProfile) => { - if (assetProfile?.currency) { - currencyBySymbolMap[symbol] = { - currency: assetProfile.currency - }; - } }); + + if (assetProfile?.currency) { + currencyBySymbolMap[symbol] = { + currency: assetProfile.currency + }; + } }) ); } From 058d7caacdbe5eb2c91d2a5794f31ab5901835a2 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 13 Oct 2025 17:43:21 +0200 Subject: [PATCH 03/11] Bugfix/respect includeIndices flag in search functionality of FMP service (#5746) * Respect includeIndices in search() * Update changelog --- CHANGELOG.md | 4 +++ .../financial-modeling-prep.service.ts | 31 ++++++++++++------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 38981a8c6..bb4e798ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Optimized the get quotes functionality by utilizing the asset profile resolutions in the _Financial Modeling Prep_ service - Extracted the footer to a component +### Fixed + +- Respected the include indices flag in the search functionality of the _Financial Modeling Prep_ service + ## 2.208.0 - 2025-10-11 ### Added 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 7c1395a23..2e59acb01 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 @@ -454,6 +454,7 @@ export class FinancialModelingPrepService implements DataProviderInterface { } public async search({ + includeIndices = false, query, requestTimeout = this.configurationService.get('REQUEST_TIMEOUT') }: GetSearchParams): Promise { @@ -500,17 +501,25 @@ export class FinancialModelingPrepService implements DataProviderInterface { } ).then((res) => res.json()); - items = result.map(({ currency, name, symbol }) => { - return { - currency, - symbol, - assetClass: undefined, // TODO - assetSubClass: undefined, // TODO - dataProviderInfo: this.getDataProviderInfo(), - dataSource: this.getName(), - name: this.formatName({ name }) - }; - }); + items = result + .filter(({ symbol }) => { + if (includeIndices === false && symbol.startsWith('^')) { + return false; + } + + return true; + }) + .map(({ currency, name, symbol }) => { + return { + currency, + symbol, + assetClass: undefined, // TODO + assetSubClass: undefined, // TODO + dataProviderInfo: this.getDataProviderInfo(), + dataSource: this.getName(), + name: this.formatName({ name }) + }; + }); } } catch (error) { let message = error; From 3034745e7d87495b70c494e0a936fbedd54f219f Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 13 Oct 2025 17:46:32 +0200 Subject: [PATCH 04/11] Feature/improve currency validation in getAssetProfiles() functionality of data provider service (#5747) * Improve currency validation * Update changelog --- CHANGELOG.md | 1 + .../ghostfolio/ghostfolio.controller.ts | 10 +++++++++- .../ghostfolio/ghostfolio.service.ts | 20 +++++++++---------- .../data-provider/data-provider.service.ts | 14 ++++++++++--- .../errors/asset-profile-invalid.error.ts | 7 +++++++ .../financial-modeling-prep.service.ts | 4 ++++ 6 files changed, 42 insertions(+), 14 deletions(-) create mode 100644 apps/api/src/services/data-provider/errors/asset-profile-invalid.error.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index bb4e798ca..31d691c87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Disabled the zoom functionality in the _Progressive Web App_ (PWA) +- Improved the currency validation in the get asset profiles functionality of the data provider service - Improved the currency validation in the search functionality of the data provider service - Optimized the get quotes functionality by utilizing the asset profile resolutions in the _Financial Modeling Prep_ service - Extracted the footer to a component diff --git a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.controller.ts b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.controller.ts index 7cb2520bb..04165e9a1 100644 --- a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.controller.ts +++ b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.controller.ts @@ -1,5 +1,6 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { AssetProfileInvalidError } from '@ghostfolio/api/services/data-provider/errors/asset-profile-invalid.error'; import { parseDate } from '@ghostfolio/common/helper'; import { DataProviderGhostfolioAssetProfileResponse, @@ -66,7 +67,14 @@ export class GhostfolioController { }); return assetProfile; - } catch { + } catch (error) { + if (error instanceof AssetProfileInvalidError) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } + throw new HttpException( getReasonPhrase(StatusCodes.INTERNAL_SERVER_ERROR), StatusCodes.INTERNAL_SERVER_ERROR diff --git a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts index cc92efa02..ac5881c4d 100644 --- a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts @@ -40,10 +40,7 @@ export class GhostfolioService { private readonly propertyService: PropertyService ) {} - public async getAssetProfile({ - requestTimeout = this.configurationService.get('REQUEST_TIMEOUT'), - symbol - }: GetAssetProfileParams) { + public async getAssetProfile({ symbol }: GetAssetProfileParams) { let result: DataProviderGhostfolioAssetProfileResponse = {}; try { @@ -51,12 +48,15 @@ export class GhostfolioService { for (const dataProviderService of this.getDataProviderServices()) { promises.push( - dataProviderService - .getAssetProfile({ - requestTimeout, - symbol - }) - .then(async (assetProfile) => { + this.dataProviderService + .getAssetProfiles([ + { + symbol, + dataSource: dataProviderService.getName() + } + ]) + .then(async (assetProfiles) => { + const assetProfile = assetProfiles[symbol]; const dataSourceOrigin = DataSource.GHOSTFOLIO; if (assetProfile) { diff --git a/apps/api/src/services/data-provider/data-provider.service.ts b/apps/api/src/services/data-provider/data-provider.service.ts index c70d643db..6d6054287 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -35,6 +35,8 @@ import { eachDayOfInterval, format, isValid } from 'date-fns'; import { groupBy, isEmpty, isNumber, uniqWith } from 'lodash'; import ms from 'ms'; +import { AssetProfileInvalidError } from './errors/asset-profile-invalid.error'; + @Injectable() export class DataProviderService implements OnModuleInit { private dataProviderMapping: { [dataProviderName: string]: string }; @@ -106,9 +108,9 @@ export class DataProviderService implements OnModuleInit { ); promises.push( - promise.then((symbolProfile) => { - if (symbolProfile) { - response[symbol] = symbolProfile; + promise.then((assetProfile) => { + if (isCurrency(assetProfile?.currency)) { + response[symbol] = assetProfile; } }) ); @@ -117,6 +119,12 @@ export class DataProviderService implements OnModuleInit { try { await Promise.all(promises); + + if (isEmpty(response)) { + throw new AssetProfileInvalidError( + 'No valid asset profiles have been found' + ); + } } catch (error) { Logger.error(error, 'DataProviderService'); diff --git a/apps/api/src/services/data-provider/errors/asset-profile-invalid.error.ts b/apps/api/src/services/data-provider/errors/asset-profile-invalid.error.ts new file mode 100644 index 000000000..bfbea6040 --- /dev/null +++ b/apps/api/src/services/data-provider/errors/asset-profile-invalid.error.ts @@ -0,0 +1,7 @@ +export class AssetProfileInvalidError extends Error { + public constructor(message: string) { + super(message); + + this.name = 'AssetProfileInvalidError'; + } +} 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 2e59acb01..689f59fec 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 @@ -102,6 +102,10 @@ export class FinancialModelingPrepService implements DataProviderInterface { } ).then((res) => res.json()); + if (!assetProfile) { + throw new Error(`${symbol} not found`); + } + const { assetClass, assetSubClass } = this.parseAssetClass(assetProfile); From 7dacc10946cc51a048d6db76d4ad32427cc0db96 Mon Sep 17 00:00:00 2001 From: Mariam Saeed <69825646+Mariam-Saeed@users.noreply.github.com> Date: Wed, 15 Oct 2025 21:10:19 +0300 Subject: [PATCH 05/11] Bugfix/reset scroll position on page change (#5753) * Reset scroll position on page change * Update changelog --- CHANGELOG.md | 1 + apps/client/src/app/app-routing.module.ts | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31d691c87..fff28224a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Respected the include indices flag in the search functionality of the _Financial Modeling Prep_ service +- Fixed an issue where the scroll position was not restored when changing pages ## 2.208.0 - 2025-10-11 diff --git a/apps/client/src/app/app-routing.module.ts b/apps/client/src/app/app-routing.module.ts index 0e5a2dead..0ceee3725 100644 --- a/apps/client/src/app/app-routing.module.ts +++ b/apps/client/src/app/app-routing.module.ts @@ -155,8 +155,9 @@ const routes: Routes = [ // Preload all lazy loaded modules with the attribute preload === true { anchorScrolling: 'enabled', - preloadingStrategy: ModulePreloadService - // enableTracing: true // <-- debugging purposes only + // enableTracing: true, // <-- debugging purposes only + preloadingStrategy: ModulePreloadService, + scrollPositionRestoration: 'top' } ) ], From 33d9ba0063d8e9b95b3df7bf7f26fe65b464ffc9 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 16 Oct 2025 17:45:43 +0200 Subject: [PATCH 06/11] Feature/add Stealth Wealth to glossary (#5754) * Add Stealth Wealth * Update changelog --- CHANGELOG.md | 1 + .../glossary/resources-glossary.component.html | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fff28224a..5024d0541 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 ### Added +- Extended the glossary of the resources page by _Stealth Wealth_ - Added a _Storybook_ story for the holdings table component ### Changed diff --git a/apps/client/src/app/pages/resources/glossary/resources-glossary.component.html b/apps/client/src/app/pages/resources/glossary/resources-glossary.component.html index 123b4dac9..b028734a7 100644 --- a/apps/client/src/app/pages/resources/glossary/resources-glossary.component.html +++ b/apps/client/src/app/pages/resources/glossary/resources-glossary.component.html @@ -132,6 +132,23 @@ +
+
+

Stealth Wealth

+
+ Stealth wealth is a lifestyle choice where you don’t openly show + off your wealth, but instead live quietly to maintain privacy and + security. +
+
+ Stealth Wealth → +
+
+
From 3caa3c010efc289d1b13a76349110de34f782f86 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 16 Oct 2025 17:46:26 +0200 Subject: [PATCH 07/11] Bugfix/dark mode in logo carousel component (#5758) * Fix dark mode * Update changelog --- CHANGELOG.md | 1 + .../logo-carousel.component.scss | 20 +++++++------------ 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5024d0541..adc9dbf53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Respected the include indices flag in the search functionality of the _Financial Modeling Prep_ service - Fixed an issue where the scroll position was not restored when changing pages +- Fixed the dark mode in the _As seen in_ section on the landing page ## 2.208.0 - 2025-10-11 diff --git a/libs/ui/src/lib/logo-carousel/logo-carousel.component.scss b/libs/ui/src/lib/logo-carousel/logo-carousel.component.scss index d8a8865f7..18c3a26cb 100644 --- a/libs/ui/src/lib/logo-carousel/logo-carousel.component.scss +++ b/libs/ui/src/lib/logo-carousel/logo-carousel.component.scss @@ -194,19 +194,13 @@ ); } - .logo { - &.logo-alternative-to, - &.logo-dev-community, - &.logo-hacker-news, - &.logo-openalternative, - &.logo-privacy-tools, - &.logo-reddit, - &.logo-sackgeld, - &.logo-selfh-st, - &.logo-sourceforge, - &.logo-umbrel, - &.logo-unraid { - background-color: rgba(var(--light-primary-text)); + .logo-carousel-track { + .logo-carousel-item { + .logo { + &.mask { + background-color: rgba(var(--light-secondary-text)); + } + } } } } From db2c2426c648ec39e5d9393c3b0e80c63dad506c Mon Sep 17 00:00:00 2001 From: Dibyendu Sahoo Date: Fri, 17 Oct 2025 00:16:24 +0530 Subject: [PATCH 08/11] Task/refactor interest to interestInBaseCurrency in portfolio summary interface (#5763) * Refactor interest to interestInBaseCurrency --- apps/api/src/app/portfolio/portfolio.controller.ts | 2 +- apps/api/src/app/portfolio/portfolio.service.ts | 2 +- apps/api/src/helper/object.helper.spec.ts | 4 ++-- .../portfolio-summary/portfolio-summary.component.html | 2 +- libs/common/src/lib/interfaces/portfolio-summary.interface.ts | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index 19b0636c7..f6f8e3d80 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -197,7 +197,7 @@ export class PortfolioController { 'filteredValueInBaseCurrency', 'grossPerformance', 'grossPerformanceWithCurrencyEffect', - 'interest', + 'interestInBaseCurrency', 'items', 'liabilities', 'netPerformance', diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index a5bc10fbd..bbfb31b79 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -2105,7 +2105,7 @@ export class PortfolioService { ) .plus(fees) .toNumber(), - interest: interest.toNumber(), + interestInBaseCurrency: interest.toNumber(), liabilitiesInBaseCurrency: liabilities.toNumber(), totalInvestment: totalInvestment.toNumber(), totalValueInBaseCurrency: netWorth diff --git a/apps/api/src/helper/object.helper.spec.ts b/apps/api/src/helper/object.helper.spec.ts index d7caf9bc9..433490325 100644 --- a/apps/api/src/helper/object.helper.spec.ts +++ b/apps/api/src/helper/object.helper.spec.ts @@ -1536,7 +1536,7 @@ describe('redactAttributes', () => { fireWealth: null, grossPerformance: null, grossPerformanceWithCurrencyEffect: null, - interest: null, + interestInBaseCurrency: null, items: null, liabilities: null, totalInvestment: null, @@ -3039,7 +3039,7 @@ describe('redactAttributes', () => { fireWealth: null, grossPerformance: null, grossPerformanceWithCurrencyEffect: null, - interest: null, + interestInBaseCurrency: null, items: null, liabilities: null, totalInvestment: null, diff --git a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html index c8d710019..b20b6b263 100644 --- a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html +++ b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html @@ -302,7 +302,7 @@ [isCurrency]="true" [locale]="locale" [unit]="baseCurrency" - [value]="isLoading ? undefined : summary?.interest" + [value]="isLoading ? undefined : summary?.interestInBaseCurrency" /> diff --git a/libs/common/src/lib/interfaces/portfolio-summary.interface.ts b/libs/common/src/lib/interfaces/portfolio-summary.interface.ts index 092a4bb97..f08eb61b8 100644 --- a/libs/common/src/lib/interfaces/portfolio-summary.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-summary.interface.ts @@ -20,7 +20,7 @@ export interface PortfolioSummary extends PortfolioPerformance { fireWealth: FireWealth; grossPerformance: number; grossPerformanceWithCurrencyEffect: number; - interest: number; + interestInBaseCurrency: number; liabilitiesInBaseCurrency: number; totalBuy: number; totalSell: number; From 835bde6662c2aa5118fc0dccb38aa972caffb640 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 16 Oct 2025 20:51:14 +0200 Subject: [PATCH 09/11] Feature/extend pricing page (#5761) * Extend pricing page * Update changelog --- CHANGELOG.md | 1 + .../pages/pricing/pricing-page.component.ts | 10 +++++ .../src/app/pages/pricing/pricing-page.html | 43 +++++++++++++++---- 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index adc9dbf53..0fb55409a 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 ### Added - Extended the glossary of the resources page by _Stealth Wealth_ +- Extended the content of the pricing page - Added a _Storybook_ story for the holdings table component ### Changed diff --git a/apps/client/src/app/pages/pricing/pricing-page.component.ts b/apps/client/src/app/pages/pricing/pricing-page.component.ts index 170d70914..8bc3e3a67 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.component.ts +++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -69,6 +69,16 @@ export class GfPricingPageComponent implements OnDestroy, OnInit { public professionalDataProviderTooltipPremium = translate( 'PROFESSIONAL_DATA_PROVIDER_TOOLTIP_PREMIUM' ); + public referralBrokers = [ + 'DEGIRO', + 'finpension', + 'frankly', + 'Interactive Brokers', + 'Mintos', + 'Swissquote', + 'VIAC', + 'Zak' + ]; public routerLinkFeatures = publicRoutes.features.routerLink; public routerLinkRegister = publicRoutes.register.routerLink; public user: User; diff --git a/apps/client/src/app/pages/pricing/pricing-page.html b/apps/client/src/app/pages/pricing/pricing-page.html index ea68b74eb..ee006b2d6 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.html +++ b/apps/client/src/app/pages/pricing/pricing-page.html @@ -326,16 +326,43 @@

- If you plan to open an account at DEGIRO, finpension, - frankly, Interactive Brokers, Swissquote, - VIAC, or Zak, please - If you plan to open an account at +   + @for ( + broker of referralBrokers; + track broker; + let i = $index; + let last = $last + ) { + {{ broker }} + @if (last) { + , + } @else { + @if (i === referralBrokers.length - 2) { +   + or +   + } @else { + , + } + } + } + please +   + contact us - to use our referral link and get a Ghostfolio Premium membership for - one year. Looking for a student discount? Request it - here - with your university e-mail address. +   + to use our referral link and get a Ghostfolio Premium membership + for one year. Looking for a student discount? +   + Request it +   + here +   + with your university e-mail address.

From ba1ee013d7868f549427df92bc379ab072bf372a Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 16 Oct 2025 20:51:39 +0200 Subject: [PATCH 10/11] Bugfix/fix word wrap in menus of activities table (#5764) * Fix word wrap * Update changelog --- CHANGELOG.md | 1 + .../activities-table/activities-table.component.html | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fb55409a..a024cc722 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Respected the include indices flag in the search functionality of the _Financial Modeling Prep_ service - Fixed an issue where the scroll position was not restored when changing pages +- Fixed the word wrap in the menus of the activities table component - Fixed the dark mode in the _As seen in_ section on the landing page ## 2.208.0 - 2025-10-11 diff --git a/libs/ui/src/lib/activities-table/activities-table.component.html b/libs/ui/src/lib/activities-table/activities-table.component.html index 472c24e2b..8079a6258 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.html +++ b/libs/ui/src/lib/activities-table/activities-table.component.html @@ -361,7 +361,11 @@ } - + @if (hasPermissionToCreateActivity) { } - +