diff --git a/CHANGELOG.md b/CHANGELOG.md
index 73b8b33d4..75a24851d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
+### Changed
+
+- Refactored the toggle component to standalone
+- Upgraded `nx` from version `21.1.2` to `21.2.4`
+- Upgraded `angular` from version `19.2.1` to `20.0.7`
+- Upgraded `ngx-device-detector` from version `9.0.0` to `10.0.2`
+- Upgraded `ngx-markdown` from version `19.0.0` to `20.0.0`
+- Upgraded `ngx-stripe` from version `19.7.0` to `20.7.0`
+- Upgraded `storybook` from version `8.6.12` to `9.0.17`
+
+## 2.184.0 - 2025-07-22
+
### Added
- Set up the language localization for the static portfolio analysis rule: _Regional Market Cluster Risks_ (Asia-Pacific)
@@ -17,17 +29,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
+- Localized the tooltips of the about page
- Improved the language localization for Catalan (`ca`)
- Improved the language localization for Dutch (`nl`)
- Improved the language localization for German (`de`)
- Improved the language localization for Spanish (`es`)
- Upgraded `countries-and-timezones` from version `3.7.2` to `3.8.0`
-- Upgraded `nx` from version `21.1.2` to `21.2.4`
-- Upgraded `angular` from version `19.2.1` to `20.0.7`
-- Upgraded `ngx-device-detector` from version `9.0.0` to `10.0.2`
-- Upgraded `ngx-markdown` from version `19.0.0` to `20.0.0`
-- Upgraded `ngx-stripe` from version `19.7.0` to `20.7.0`
-- Upgraded `storybook` from version `8.6.12` to `9.0.17`
+- Upgraded `prisma` from version `6.11.1` to `6.12.0`
+
+### Fixed
+
+- Fixed an issue with the landing page related to the public page routes of the `AuthGuard`
## 2.183.0 - 2025-07-20
diff --git a/apps/client/src/app/components/home-holdings/home-holdings.component.ts b/apps/client/src/app/components/home-holdings/home-holdings.component.ts
index 54202feba..4388c0c72 100644
--- a/apps/client/src/app/components/home-holdings/home-holdings.component.ts
+++ b/apps/client/src/app/components/home-holdings/home-holdings.component.ts
@@ -1,4 +1,4 @@
-import { GfToggleModule } from '@ghostfolio/client/components/toggle/toggle.module';
+import { GfToggleComponent } from '@ghostfolio/client/components/toggle/toggle.component';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
@@ -38,7 +38,7 @@ import { takeUntil } from 'rxjs/operators';
CommonModule,
FormsModule,
GfHoldingsTableComponent,
- GfToggleModule,
+ GfToggleComponent,
GfTreemapChartComponent,
IonIcon,
MatButtonModule,
diff --git a/apps/client/src/app/components/home-overview/home-overview.component.ts b/apps/client/src/app/components/home-overview/home-overview.component.ts
index cda7d9e1d..abf7017a6 100644
--- a/apps/client/src/app/components/home-overview/home-overview.component.ts
+++ b/apps/client/src/app/components/home-overview/home-overview.component.ts
@@ -1,5 +1,5 @@
import { GfPortfolioPerformanceModule } from '@ghostfolio/client/components/portfolio-performance/portfolio-performance.module';
-import { ToggleComponent } from '@ghostfolio/client/components/toggle/toggle.component';
+import { GfToggleComponent } from '@ghostfolio/client/components/toggle/toggle.component';
import { LayoutService } from '@ghostfolio/client/core/layout.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
@@ -43,7 +43,7 @@ import { takeUntil } from 'rxjs/operators';
templateUrl: './home-overview.html'
})
export class GfHomeOverviewComponent implements OnDestroy, OnInit {
- public dateRangeOptions = ToggleComponent.DEFAULT_DATE_RANGE_OPTIONS;
+ public dateRangeOptions = GfToggleComponent.DEFAULT_DATE_RANGE_OPTIONS;
public deviceType: string;
public errors: AssetProfileIdentifier[];
public hasError: boolean;
diff --git a/apps/client/src/app/components/markets/markets.component.ts b/apps/client/src/app/components/markets/markets.component.ts
index c061739df..153c1ea14 100644
--- a/apps/client/src/app/components/markets/markets.component.ts
+++ b/apps/client/src/app/components/markets/markets.component.ts
@@ -1,5 +1,5 @@
import { GfFearAndGreedIndexModule } from '@ghostfolio/client/components/fear-and-greed-index/fear-and-greed-index.module';
-import { GfToggleModule } from '@ghostfolio/client/components/toggle/toggle.module';
+import { GfToggleComponent } from '@ghostfolio/client/components/toggle/toggle.component';
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { resetHours } from '@ghostfolio/common/helper';
@@ -32,7 +32,7 @@ import { takeUntil } from 'rxjs/operators';
GfBenchmarkComponent,
GfFearAndGreedIndexModule,
GfLineChartComponent,
- GfToggleModule
+ GfToggleComponent
],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
selector: 'gf-markets',
diff --git a/apps/client/src/app/components/toggle/toggle.component.ts b/apps/client/src/app/components/toggle/toggle.component.ts
index d5f451aaa..8f1a13df3 100644
--- a/apps/client/src/app/components/toggle/toggle.component.ts
+++ b/apps/client/src/app/components/toggle/toggle.component.ts
@@ -1,5 +1,6 @@
import { ToggleOption } from '@ghostfolio/common/interfaces';
+import { CommonModule } from '@angular/common';
import {
ChangeDetectionStrategy,
Component,
@@ -8,16 +9,17 @@ import {
OnChanges,
Output
} from '@angular/core';
-import { FormControl } from '@angular/forms';
+import { FormControl, ReactiveFormsModule } from '@angular/forms';
+import { MatRadioModule } from '@angular/material/radio';
@Component({
- selector: 'gf-toggle',
changeDetection: ChangeDetectionStrategy.OnPush,
- templateUrl: './toggle.component.html',
+ imports: [CommonModule, MatRadioModule, ReactiveFormsModule],
+ selector: 'gf-toggle',
styleUrls: ['./toggle.component.scss'],
- standalone: false
+ templateUrl: './toggle.component.html'
})
-export class ToggleComponent implements OnChanges {
+export class GfToggleComponent implements OnChanges {
public static DEFAULT_DATE_RANGE_OPTIONS: ToggleOption[] = [
{ label: $localize`Today`, value: '1d' },
{ label: $localize`YTD`, value: 'ytd' },
diff --git a/apps/client/src/app/components/toggle/toggle.module.ts b/apps/client/src/app/components/toggle/toggle.module.ts
deleted file mode 100644
index d27ff4a16..000000000
--- a/apps/client/src/app/components/toggle/toggle.module.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { ReactiveFormsModule } from '@angular/forms';
-import { MatRadioModule } from '@angular/material/radio';
-
-import { ToggleComponent } from './toggle.component';
-
-@NgModule({
- declarations: [ToggleComponent],
- exports: [ToggleComponent],
- imports: [CommonModule, MatRadioModule, ReactiveFormsModule]
-})
-export class GfToggleModule {}
diff --git a/apps/client/src/app/core/auth.guard.ts b/apps/client/src/app/core/auth.guard.ts
index 69280af6a..c26419031 100644
--- a/apps/client/src/app/core/auth.guard.ts
+++ b/apps/client/src/app/core/auth.guard.ts
@@ -14,20 +14,6 @@ import { catchError } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class AuthGuard {
- private static PUBLIC_PAGE_ROUTES = [
- `/${publicRoutes.about.path}`,
- `/${publicRoutes.blog.path}`,
- `/${publicRoutes.demo.path}`,
- `/${publicRoutes.faq.path}`,
- `/${publicRoutes.features.path}`,
- `/${publicRoutes.markets.path}`,
- `/${publicRoutes.openStartup.path}`,
- `/${publicRoutes.pricing.path}`,
- `/${publicRoutes.public.path}`,
- `/${publicRoutes.register.path}`,
- `/${publicRoutes.resources.path}`
- ];
-
public constructor(
private dataService: DataService,
private router: Router,
@@ -54,10 +40,14 @@ export class AuthGuard {
this.router.navigate(publicRoutes.register.routerLink);
resolve(false);
} else if (
- AuthGuard.PUBLIC_PAGE_ROUTES.some((publicPageRoute) => {
- const [, url] = decodeURIComponent(state.url).split('/');
- return `/${url}` === publicPageRoute;
- })
+ Object.values(publicRoutes)
+ .map(({ path }) => {
+ return `/${path}`;
+ })
+ .some((publicPageRoute) => {
+ const [, url] = decodeURIComponent(state.url).split('/');
+ return `/${url}` === publicPageRoute;
+ })
) {
resolve(true);
return EMPTY;
diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.html b/apps/client/src/app/pages/about/overview/about-overview-page.html
index 9a7dd142e..ce442fe27 100644
--- a/apps/client/src/app/pages/about/overview/about-overview-page.html
+++ b/apps/client/src/app/pages/about/overview/about-overview-page.html
@@ -70,6 +70,7 @@
or start a discussion at
GitHub.
@@ -78,6 +79,7 @@
@@ -86,6 +88,7 @@
@@ -95,6 +98,7 @@
@@ -104,6 +108,7 @@
@@ -112,6 +117,7 @@
@@ -122,6 +128,7 @@
@@ -129,6 +136,7 @@
[];
public bottom3: PortfolioPosition[];
- public dateRangeOptions = ToggleComponent.DEFAULT_DATE_RANGE_OPTIONS;
+ public dateRangeOptions = GfToggleComponent.DEFAULT_DATE_RANGE_OPTIONS;
public deviceType: string;
public dividendsByGroup: InvestmentItem[];
public dividendTimelineDataLabel = $localize`Dividend`;
diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf
index 4991a34b6..b7099f1c1 100644
--- a/apps/client/src/locales/messages.ca.xlf
+++ b/apps/client/src/locales/messages.ca.xlf
@@ -262,7 +262,7 @@
apps/client/src/app/pages/about/overview/about-overview-page.html
- 156
+ 164
@@ -2915,7 +2915,7 @@
Avui
apps/client/src/app/components/toggle/toggle.component.ts
- 22
+ 24
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2927,7 +2927,7 @@
YTD
apps/client/src/app/components/toggle/toggle.component.ts
- 23
+ 25
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2939,7 +2939,7 @@
1 any
apps/client/src/app/components/toggle/toggle.component.ts
- 24
+ 26
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2951,7 +2951,7 @@
5 anys
apps/client/src/app/components/toggle/toggle.component.ts
- 25
+ 27
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2963,7 +2963,7 @@
Màx
apps/client/src/app/components/toggle/toggle.component.ts
- 26
+ 28
libs/ui/src/lib/assistant/assistant.component.ts
@@ -4692,7 +4692,7 @@
Dividend
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 75
+ 74
libs/ui/src/lib/i18n.ts
@@ -4704,11 +4704,11 @@
Inversió
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 80
+ 79
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 96
+ 95
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
@@ -4720,7 +4720,7 @@
Mensualment
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 90
+ 89
@@ -4728,7 +4728,7 @@
Anualment
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 91
+ 90
@@ -7171,7 +7171,7 @@
AI prompt has been copied to the clipboard
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 199
+ 198
@@ -7259,7 +7259,7 @@
Open Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 200
+ 199
@@ -8387,6 +8387,66 @@
219
+
+ Find Ghostfolio on GitHub
+ Find Ghostfolio on GitHub
+
+ apps/client/src/app/pages/about/overview/about-overview-page.html
+ 74
+
+
+ apps/client/src/app/pages/about/overview/about-overview-page.html
+ 113
+
+
+
+ Join the Ghostfolio Slack community
+ Join the Ghostfolio Slack community
+
+ apps/client/src/app/pages/about/overview/about-overview-page.html
+ 84
+
+
+
+ Follow Ghostfolio on X (formerly Twitter)
+ Follow Ghostfolio on X (formerly Twitter)
+
+ apps/client/src/app/pages/about/overview/about-overview-page.html
+ 93
+
+
+
+ Send an e-mail
+ Send an e-mail
+
+ apps/client/src/app/pages/about/overview/about-overview-page.html
+ 103
+
+
+
+ Follow Ghostfolio on LinkedIn
+ Follow Ghostfolio on LinkedIn
+
+ apps/client/src/app/pages/about/overview/about-overview-page.html
+ 122
+
+
+
+ Ghostfolio is an independent & bootstrapped business
+ Ghostfolio is an independent & bootstrapped business
+
+ apps/client/src/app/pages/about/overview/about-overview-page.html
+ 132
+
+
+
+ Support Ghostfolio
+ Support Ghostfolio
+
+ apps/client/src/app/pages/about/overview/about-overview-page.html
+ 141
+
+