From 908a731989f08f12aac4a68dad82334ca549cfaa Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 15 Jun 2025 09:48:32 +0200 Subject: [PATCH] Feature/refactor public routes: faq (#4933) * Refactor public routes: faq --- apps/client/src/app/app-routing.module.ts | 2 +- apps/client/src/app/app.component.ts | 4 ++-- apps/client/src/app/core/auth.guard.ts | 2 +- .../overview/about-overview-page.component.ts | 4 ++-- .../app/pages/faq/faq-page-routing.module.ts | 8 +++---- .../src/app/pages/faq/faq-page.component.ts | 8 +++---- .../faq/saas/saas-page-routing.module.ts | 3 ++- .../self-hosting-page-routing.module.ts | 3 ++- .../resources-overview.component.html | 2 +- .../overview/resources-overview.component.ts | 18 +++++++-------- libs/common/src/lib/routes/routes.ts | 23 ++++++++++++++++--- 11 files changed, 48 insertions(+), 29 deletions(-) diff --git a/apps/client/src/app/app-routing.module.ts b/apps/client/src/app/app-routing.module.ts index 241d95493..8cb4155c9 100644 --- a/apps/client/src/app/app-routing.module.ts +++ b/apps/client/src/app/app-routing.module.ts @@ -64,7 +64,7 @@ const routes: Routes = [ path: ghostfolioRoutes.demo }, { - path: ghostfolioRoutes.faq, + path: publicRoutes.faq.path, loadChildren: () => import('./pages/faq/faq-page.module').then((m) => m.FaqPageModule) }, diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index d2805314d..6bd1773f3 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -79,7 +79,7 @@ export class AppComponent implements OnDestroy, OnInit { routes.termsOfService ]; public routerLinkBlog = publicRoutes.blog.routerLink; - public routerLinkFaq = ['/' + routes.faq]; + public routerLinkFaq = publicRoutes.faq.routerLink; public routerLinkFeatures = publicRoutes.features.routerLink; public routerLinkMarkets = ['/' + routes.markets]; public routerLinkOpenStartup = publicRoutes.openStartup.routerLink; @@ -201,7 +201,7 @@ export class AppComponent implements OnDestroy, OnInit { this.hasTabs = (this.currentRoute === routes.about || - this.currentRoute === routes.faq || + this.currentRoute === publicRoutes.faq.path || this.currentRoute === routes.resources || this.currentRoute === internalRoutes.account.path || this.currentRoute === routes.adminControl || diff --git a/apps/client/src/app/core/auth.guard.ts b/apps/client/src/app/core/auth.guard.ts index f472dd63e..e2135eea3 100644 --- a/apps/client/src/app/core/auth.guard.ts +++ b/apps/client/src/app/core/auth.guard.ts @@ -22,7 +22,7 @@ export class AuthGuard { `/${routes.about}`, `/${publicRoutes.blog.path}`, `/${routes.demo}`, - `/${routes.faq}`, + `/${publicRoutes.faq.path}`, `/${publicRoutes.features.path}`, `/${routes.markets}`, `/${publicRoutes.openStartup.path}`, diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.component.ts b/apps/client/src/app/pages/about/overview/about-overview-page.component.ts index 25d1fec4e..afb260d20 100644 --- a/apps/client/src/app/pages/about/overview/about-overview-page.component.ts +++ b/apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -2,7 +2,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { Subject } from 'rxjs'; @@ -19,7 +19,7 @@ export class AboutOverviewPageComponent implements OnDestroy, OnInit { public hasPermissionForSubscription: boolean; public isLoggedIn: boolean; public routerLinkBlog = publicRoutes.blog.routerLink; - public routerLinkFaq = ['/' + routes.faq]; + public routerLinkFaq = publicRoutes.faq.routerLink; public routerLinkFeatures = publicRoutes.features.routerLink; public routerLinkOpenStartup = publicRoutes.openStartup.routerLink; public user: User; diff --git a/apps/client/src/app/pages/faq/faq-page-routing.module.ts b/apps/client/src/app/pages/faq/faq-page-routing.module.ts index 984410e67..e48c07b8f 100644 --- a/apps/client/src/app/pages/faq/faq-page-routing.module.ts +++ b/apps/client/src/app/pages/faq/faq-page-routing.module.ts @@ -1,5 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -18,12 +18,12 @@ const routes: Routes = [ ) }, { - path: ghostfolioRoutes.saas, + path: publicRoutes.faq.subRoutes.saas.path, loadChildren: () => import('./saas/saas-page.module').then((m) => m.SaasPageModule) }, { - path: ghostfolioRoutes.selfHosting, + path: publicRoutes.faq.subRoutes.selfHosting.path, loadChildren: () => import('./self-hosting/self-hosting-page.module').then( (m) => m.SelfHostingPageModule @@ -32,7 +32,7 @@ const routes: Routes = [ ], component: FaqPageComponent, path: '', - title: $localize`Frequently Asked Questions (FAQ)` + title: publicRoutes.faq.title } ]; diff --git a/apps/client/src/app/pages/faq/faq-page.component.ts b/apps/client/src/app/pages/faq/faq-page.component.ts index 27f642c2f..1d0888298 100644 --- a/apps/client/src/app/pages/faq/faq-page.component.ts +++ b/apps/client/src/app/pages/faq/faq-page.component.ts @@ -1,7 +1,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { TabConfiguration } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { routes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -36,18 +36,18 @@ export class FaqPageComponent implements OnDestroy, OnInit { { iconName: 'reader-outline', label: $localize`General`, - routerLink: ['/' + routes.faq] + routerLink: publicRoutes.faq.routerLink }, { iconName: 'cloudy-outline', label: $localize`Cloud` + ' (SaaS)', - routerLink: ['/' + routes.faq, routes.saas], + routerLink: publicRoutes.faq.subRoutes.saas.routerLink, showCondition: this.hasPermissionForSubscription }, { iconName: 'server-outline', label: $localize`Self-Hosting`, - routerLink: ['/' + routes.faq, routes.selfHosting] + routerLink: publicRoutes.faq.subRoutes.selfHosting.routerLink } ]; } diff --git a/apps/client/src/app/pages/faq/saas/saas-page-routing.module.ts b/apps/client/src/app/pages/faq/saas/saas-page-routing.module.ts index 4c4c3d62c..62017df69 100644 --- a/apps/client/src/app/pages/faq/saas/saas-page-routing.module.ts +++ b/apps/client/src/app/pages/faq/saas/saas-page-routing.module.ts @@ -1,4 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; +import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -10,7 +11,7 @@ const routes: Routes = [ canActivate: [AuthGuard], component: SaasPageComponent, path: '', - title: $localize`Cloud` + ' (SaaS) – ' + $localize`FAQ` + title: `${publicRoutes.faq.subRoutes.saas.title} - ${publicRoutes.faq.title}` } ]; diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page-routing.module.ts b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page-routing.module.ts index 3879f7dbb..60e4616af 100644 --- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page-routing.module.ts +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page-routing.module.ts @@ -1,4 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; +import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -10,7 +11,7 @@ const routes: Routes = [ canActivate: [AuthGuard], component: SelfHostingPageComponent, path: '', - title: $localize`Self-Hosting` + ' – ' + $localize`FAQ` + title: `${publicRoutes.faq.subRoutes.selfHosting.title} - ${publicRoutes.faq.title}` } ]; diff --git a/apps/client/src/app/pages/resources/overview/resources-overview.component.html b/apps/client/src/app/pages/resources/overview/resources-overview.component.html index ad424f05c..39d7c1e62 100644 --- a/apps/client/src/app/pages/resources/overview/resources-overview.component.html +++ b/apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -7,7 +7,7 @@
} diff --git a/apps/client/src/app/pages/resources/overview/resources-overview.component.ts b/apps/client/src/app/pages/resources/overview/resources-overview.component.ts index 4db78d512..f4ce372e7 100644 --- a/apps/client/src/app/pages/resources/overview/resources-overview.component.ts +++ b/apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes/routes'; +import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; @@ -11,28 +11,28 @@ import { Component } from '@angular/core'; export class ResourcesOverviewComponent { public overviewItems = [ { - title: 'Frequently Asked Questions (FAQ)', description: 'Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section.', - link: ['/' + routes.faq] + routerLink: publicRoutes.faq.routerLink, + title: publicRoutes.faq.title }, { - title: 'Guides', description: 'Explore our guides to help you get started with investing and managing your finances.', - link: ['/' + routes.resources, routes.guides] + routerLink: ['/' + routes.resources, routes.guides], + title: 'Guides' }, { - title: 'Markets', description: 'Access various market resources and tools to stay informed about financial markets.', - link: ['/' + routes.resources, routes.markets] + routerLink: ['/' + routes.resources, routes.markets], + title: 'Markets' }, { - title: 'Glossary', description: 'Learn key financial terms and concepts in our comprehensive glossary.', - link: ['/' + routes.resources, routes.glossary] + routerLink: ['/' + routes.resources, routes.glossary], + title: 'Glossary' } ]; } diff --git a/libs/common/src/lib/routes/routes.ts b/libs/common/src/lib/routes/routes.ts index 933b2ecf0..cf5a88617 100644 --- a/libs/common/src/lib/routes/routes.ts +++ b/libs/common/src/lib/routes/routes.ts @@ -15,7 +15,6 @@ export const routes = { membership: 'membership', personalFinanceTools: 'personal-finance-tools', public: 'p', - saas: 'saas', settings: 'settings', start: 'start', users: 'users', @@ -24,7 +23,6 @@ export const routes = { // Publicly accessible pages about: $localize`:kebab-case:about`, changelog: $localize`:kebab-case:changelog`, - faq: $localize`:kebab-case:faq`, glossary: $localize`:kebab-case:glossary`, guides: $localize`:kebab-case:guides`, license: $localize`:kebab-case:license`, @@ -32,7 +30,6 @@ export const routes = { openSourceAlternativeTo: $localize`:kebab-case:open-source-alternative-to`, privacyPolicy: $localize`:kebab-case:privacy-policy`, resources: $localize`:kebab-case:resources`, - selfHosting: $localize`:kebab-case:self-hosting`, termsOfService: $localize`:kebab-case:terms-of-service` }; @@ -134,6 +131,26 @@ export const publicRoutes = { routerLink: ['/blog'], title: $localize`Blog` }, + faq: { + path: $localize`:kebab-case:faq`, + routerLink: ['/' + $localize`:kebab-case:faq`], + subRoutes: { + saas: { + path: 'saas', + routerLink: ['/' + $localize`:kebab-case:faq`, 'saas'], + title: $localize`Cloud` + ' (SaaS)' + }, + selfHosting: { + path: $localize`:kebab-case:self-hosting`, + routerLink: [ + '/' + $localize`:kebab-case:faq`, + $localize`:kebab-case:self-hosting` + ], + title: $localize`Self-Hosting` + } + }, + title: $localize`Frequently Asked Questions (FAQ)` + }, features: { path: $localize`:kebab-case:features`, routerLink: ['/' + $localize`:kebab-case:features`],