diff --git a/CHANGELOG.md b/CHANGELOG.md index 35c87f60f..44e719ff9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,47 @@ 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 + +### Changed + +- Migrated the clone, create and edit activity dialogs to dedicated routes +- Improved the language localization in the tag management of the admin control panel + +### Fixed + +- Fixed the missing validation of the tags when creating or updating an activity +- Fixed the missing validation of the tags when updating the tags of a holding +- Fixed an issue where the tags of an activity were lost if updating the activity failed +- Fixed an issue where the dividends, the interest and the liabilities of asset profiles without market data have been valued at zero in the portfolio calculation +- Fixed an issue where an error has been reported for asset profiles without market data which do not hold any units +- Fixed an issue with removing a linked account from a buy, sell or dividend activity + +## 3.27.0 - 2026-07-15 + +### Changed + +- Hardened the validation of the URL in the logo endpoint +- Set the change detection strategy to `OnPush` in the about pages +- Set the change detection strategy to `OnPush` in the accounts page +- Set the change detection strategy to `OnPush` in the demo page +- Set the change detection strategy to `OnPush` in the features page +- Set the change detection strategy to `OnPush` in the Frequently Asked Questions (FAQ) pages +- Set the change detection strategy to `OnPush` in the landing page +- Set the change detection strategy to `OnPush` in the markets page +- Set the change detection strategy to `OnPush` in the _Open Startup_ (`/open`) page +- Set the change detection strategy to `OnPush` in the pricing page +- Set the change detection strategy to `OnPush` in the public page +- Set the change detection strategy to `OnPush` in the registration page +- Set the change detection strategy to `OnPush` in the resources pages + +### Fixed + +- Fixed an issue where the symbol was not selected when cloning an activity +- Resolved a startup error in data gathering caused by uninitialized data provider mappings +- Improved the error handling in the `HtmlTemplateMiddleware` +- Improved the error handling in the get quotes functionality of the _Financial Modeling Prep_ service + ## 3.26.0 - 2026-07-14 ### Added diff --git a/README.md b/README.md index ce89412a3..473d5c367 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,8 @@ The frontend is built with [Angular](https://angular.dev) and uses [Angular Mate We provide official container images hosted on [Docker Hub](https://hub.docker.com/r/ghostfolio/ghostfolio) for `linux/amd64`, `linux/arm/v7` and `linux/arm64`. +Find answers to commonly asked questions about self-hosting Ghostfolio in our [Frequently Asked Questions (FAQ)](https://ghostfol.io/en/faq/self-hosting) section. +
](https://www.buymeacoffee.com/ghostfolio)
diff --git a/apps/api/src/app/account-balance/account-balance.module.ts b/apps/api/src/app/account-balance/account-balance.module.ts
index 02323acc9..f7b1efc51 100644
--- a/apps/api/src/app/account-balance/account-balance.module.ts
+++ b/apps/api/src/app/account-balance/account-balance.module.ts
@@ -1,6 +1,7 @@
import { AccountService } from '@ghostfolio/api/app/account/account.service';
import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module';
import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module';
+import { TagModule } from '@ghostfolio/api/services/tag/tag.module';
import { Module } from '@nestjs/common';
@@ -10,7 +11,7 @@ import { AccountBalanceService } from './account-balance.service';
@Module({
controllers: [AccountBalanceController],
exports: [AccountBalanceService],
- imports: [ExchangeRateDataModule, PrismaModule],
+ imports: [ExchangeRateDataModule, PrismaModule, TagModule],
providers: [AccountBalanceService, AccountService]
})
export class AccountBalanceModule {}
diff --git a/apps/api/src/app/account/account.module.ts b/apps/api/src/app/account/account.module.ts
index 253c7fb1d..47b859ba3 100644
--- a/apps/api/src/app/account/account.module.ts
+++ b/apps/api/src/app/account/account.module.ts
@@ -7,6 +7,7 @@ import { ConfigurationModule } from '@ghostfolio/api/services/configuration/conf
import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module';
import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module';
import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module';
+import { TagModule } from '@ghostfolio/api/services/tag/tag.module';
import { Module } from '@nestjs/common';
@@ -25,6 +26,7 @@ import { AccountService } from './account.service';
PortfolioModule,
PrismaModule,
RedactValuesInResponseModule,
+ TagModule,
UserModule
],
providers: [AccountService]
diff --git a/apps/api/src/app/account/account.service.ts b/apps/api/src/app/account/account.service.ts
index d1f4009a9..f84f085a3 100644
--- a/apps/api/src/app/account/account.service.ts
+++ b/apps/api/src/app/account/account.service.ts
@@ -3,10 +3,11 @@ import { PortfolioChangedEvent } from '@ghostfolio/api/events/portfolio-changed.
import { WHERE_ACCOUNT_NOT_EXCLUDED } from '@ghostfolio/api/helper/account.helper';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
+import { TagService } from '@ghostfolio/api/services/tag/tag.service';
import { DATE_FORMAT } from '@ghostfolio/common/helper';
import { Filter } from '@ghostfolio/common/interfaces';
-import { HttpException, Injectable } from '@nestjs/common';
+import { Injectable } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter';
import {
Account,
@@ -19,7 +20,6 @@ import {
} from '@prisma/client';
import { Big } from 'big.js';
import { format } from 'date-fns';
-import { StatusCodes, getReasonPhrase } from 'http-status-codes';
import { groupBy } from 'lodash';
import { CashDetails } from './interfaces/cash-details.interface';
@@ -30,7 +30,8 @@ export class AccountService {
private readonly accountBalanceService: AccountBalanceService,
private readonly eventEmitter: EventEmitter2,
private readonly exchangeRateDataService: ExchangeRateDataService,
- private readonly prismaService: PrismaService
+ private readonly prismaService: PrismaService,
+ private readonly tagService: TagService
) {}
public async account({
@@ -127,7 +128,7 @@ export class AccountService {
aUserId: string,
tagIds?: string[]
): Promise