Browse Source

Feature/restructure paths to routes (#4863)

* Restructure paths to routes
pull/4866/head
Thomas Kaul 3 weeks ago
committed by GitHub
parent
commit
766d792b10
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 50
      apps/client/src/app/app-routing.module.ts
  2. 32
      apps/client/src/app/app.component.ts
  3. 4
      apps/client/src/app/components/access-table/access-table.component.ts
  4. 20
      apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts
  5. 4
      apps/client/src/app/components/admin-settings/admin-settings.component.ts
  6. 6
      apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
  7. 26
      apps/client/src/app/components/header/header.component.html
  8. 38
      apps/client/src/app/components/header/header.component.ts
  9. 20
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts
  10. 8
      apps/client/src/app/components/home-holdings/home-holdings.component.ts
  11. 12
      apps/client/src/app/components/home-overview/home-overview.component.ts
  12. 4
      apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts
  13. 4
      apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
  14. 48
      apps/client/src/app/core/auth.guard.ts
  15. 6
      apps/client/src/app/core/http-response.interceptor.ts
  16. 12
      apps/client/src/app/pages/about/about-page-routing.module.ts
  17. 14
      apps/client/src/app/pages/about/about-page.component.ts
  18. 10
      apps/client/src/app/pages/about/overview/about-overview-page.component.ts
  19. 3
      apps/client/src/app/pages/accounts/accounts-page-routing.module.ts
  20. 10
      apps/client/src/app/pages/admin/admin-page-routing.module.ts
  21. 12
      apps/client/src/app/pages/admin/admin-page.component.ts
  22. 8
      apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts
  23. 8
      apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts
  24. 6
      apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts
  25. 4
      apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component.ts
  26. 6
      apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts
  27. 8
      apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts
  28. 4
      apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component.ts
  29. 8
      apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts
  30. 4
      apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component.ts
  31. 4
      apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component.ts
  32. 4
      apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component.ts
  33. 8
      apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts
  34. 8
      apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts
  35. 6
      apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts
  36. 6
      apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts
  37. 12
      apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts
  38. 8
      apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts
  39. 8
      apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts
  40. 8
      apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component.ts
  41. 8
      apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component.ts
  42. 8
      apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts
  43. 6
      apps/client/src/app/pages/faq/faq-page-routing.module.ts
  44. 8
      apps/client/src/app/pages/faq/faq-page.component.ts
  45. 6
      apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts
  46. 15
      apps/client/src/app/pages/faq/saas/saas-page.component.ts
  47. 4
      apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts
  48. 6
      apps/client/src/app/pages/features/features-page.component.ts
  49. 18
      apps/client/src/app/pages/home/home-page-routing.module.ts
  50. 16
      apps/client/src/app/pages/home/home-page.component.ts
  51. 10
      apps/client/src/app/pages/landing/landing-page.component.ts
  52. 3
      apps/client/src/app/pages/open/open-page-routing.module.ts
  53. 3
      apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts
  54. 15
      apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts
  55. 14
      apps/client/src/app/pages/portfolio/portfolio-page.component.ts
  56. 6
      apps/client/src/app/pages/pricing/pricing-page.component.ts
  57. 3
      apps/client/src/app/pages/register/register-page-routing.module.ts
  58. 6
      apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.component.ts
  59. 6
      apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts
  60. 10
      apps/client/src/app/pages/resources/overview/resources-overview.component.ts
  61. 4
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts
  62. 8
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts
  63. 10
      apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
  64. 10
      apps/client/src/app/pages/resources/resources-page-routing.module.ts
  65. 8
      apps/client/src/app/pages/resources/resources-page.component.ts
  66. 6
      apps/client/src/app/pages/user-account/user-account-page-routing.module.ts
  67. 8
      apps/client/src/app/pages/user-account/user-account-page.component.ts
  68. 15
      apps/client/src/app/pages/zen/zen-page-routing.module.ts
  69. 10
      apps/client/src/app/pages/zen/zen-page.component.ts
  70. 69
      libs/common/src/lib/routes.ts
  71. 4
      libs/ui/src/lib/membership-card/membership-card.component.ts
  72. 8
      libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts
  73. 4
      libs/ui/src/lib/premium-indicator/premium-indicator.component.ts

50
apps/client/src/app/app-routing.module.ts

@ -1,6 +1,10 @@
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { PageTitleStrategy } from '@ghostfolio/client/services/page-title.strategy'; import { PageTitleStrategy } from '@ghostfolio/client/services/page-title.strategy';
import { paths } from '@ghostfolio/common/paths'; import {
publicRoutes,
routes as ghostfolioRoutes,
internalRoutes
} from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes, TitleStrategy } from '@angular/router'; import { RouterModule, Routes, TitleStrategy } from '@angular/router';
@ -9,26 +13,26 @@ import { ModulePreloadService } from './core/module-preload.service';
const routes: Routes = [ const routes: Routes = [
{ {
path: paths.about, path: ghostfolioRoutes.about,
loadChildren: () => loadChildren: () =>
import('./pages/about/about-page.module').then((m) => m.AboutPageModule) import('./pages/about/about-page.module').then((m) => m.AboutPageModule)
}, },
{ {
path: paths.account, path: ghostfolioRoutes.account,
loadChildren: () => loadChildren: () =>
import('./pages/user-account/user-account-page.module').then( import('./pages/user-account/user-account-page.module').then(
(m) => m.UserAccountPageModule (m) => m.UserAccountPageModule
) )
}, },
{ {
path: paths.accounts, path: internalRoutes.accounts.path,
loadChildren: () => loadChildren: () =>
import('./pages/accounts/accounts-page.module').then( import('./pages/accounts/accounts-page.module').then(
(m) => m.AccountsPageModule (m) => m.AccountsPageModule
) )
}, },
{ {
path: paths.adminControl, path: ghostfolioRoutes.adminControl,
loadChildren: () => loadChildren: () =>
import('./pages/admin/admin-page.module').then((m) => m.AdminPageModule) import('./pages/admin/admin-page.module').then((m) => m.AdminPageModule)
}, },
@ -38,16 +42,16 @@ const routes: Routes = [
import('./pages/api/api-page.component').then( import('./pages/api/api-page.component').then(
(c) => c.GfApiPageComponent (c) => c.GfApiPageComponent
), ),
path: paths.api, path: ghostfolioRoutes.api,
title: 'Ghostfolio API' title: 'Ghostfolio API'
}, },
{ {
path: paths.auth, path: ghostfolioRoutes.auth,
loadChildren: () => loadChildren: () =>
import('./pages/auth/auth-page.module').then((m) => m.AuthPageModule) import('./pages/auth/auth-page.module').then((m) => m.AuthPageModule)
}, },
{ {
path: paths.blog, path: ghostfolioRoutes.blog,
loadChildren: () => loadChildren: () =>
import('./pages/blog/blog-page.module').then((m) => m.BlogPageModule) import('./pages/blog/blog-page.module').then((m) => m.BlogPageModule)
}, },
@ -57,10 +61,10 @@ const routes: Routes = [
import('./pages/demo/demo-page.component').then( import('./pages/demo/demo-page.component').then(
(c) => c.GfDemoPageComponent (c) => c.GfDemoPageComponent
), ),
path: paths.demo path: ghostfolioRoutes.demo
}, },
{ {
path: paths.faq, path: ghostfolioRoutes.faq,
loadChildren: () => loadChildren: () =>
import('./pages/faq/faq-page.module').then((m) => m.FaqPageModule) import('./pages/faq/faq-page.module').then((m) => m.FaqPageModule)
}, },
@ -70,11 +74,11 @@ const routes: Routes = [
import('./pages/features/features-page.component').then( import('./pages/features/features-page.component').then(
(c) => c.GfFeaturesPageComponent (c) => c.GfFeaturesPageComponent
), ),
path: paths.features, path: ghostfolioRoutes.features,
title: $localize`Features` title: $localize`Features`
}, },
{ {
path: paths.home, path: internalRoutes.home.path,
loadChildren: () => loadChildren: () =>
import('./pages/home/home-page.module').then((m) => m.HomePageModule) import('./pages/home/home-page.module').then((m) => m.HomePageModule)
}, },
@ -84,58 +88,58 @@ const routes: Routes = [
import('./pages/i18n/i18n-page.component').then( import('./pages/i18n/i18n-page.component').then(
(c) => c.GfI18nPageComponent (c) => c.GfI18nPageComponent
), ),
path: paths.i18n, path: ghostfolioRoutes.i18n,
title: $localize`Internationalization` title: $localize`Internationalization`
}, },
{ {
path: paths.markets, path: ghostfolioRoutes.markets,
loadChildren: () => loadChildren: () =>
import('./pages/markets/markets-page.module').then( import('./pages/markets/markets-page.module').then(
(m) => m.MarketsPageModule (m) => m.MarketsPageModule
) )
}, },
{ {
path: paths.openStartup, path: publicRoutes.openStartup.path,
loadChildren: () => loadChildren: () =>
import('./pages/open/open-page.module').then((m) => m.OpenPageModule) import('./pages/open/open-page.module').then((m) => m.OpenPageModule)
}, },
{ {
path: paths.portfolio, path: internalRoutes.portfolio.path,
loadChildren: () => loadChildren: () =>
import('./pages/portfolio/portfolio-page.module').then( import('./pages/portfolio/portfolio-page.module').then(
(m) => m.PortfolioPageModule (m) => m.PortfolioPageModule
) )
}, },
{ {
path: paths.pricing, path: ghostfolioRoutes.pricing,
loadChildren: () => loadChildren: () =>
import('./pages/pricing/pricing-page.module').then( import('./pages/pricing/pricing-page.module').then(
(m) => m.PricingPageModule (m) => m.PricingPageModule
) )
}, },
{ {
path: paths.public, path: ghostfolioRoutes.public,
loadChildren: () => loadChildren: () =>
import('./pages/public/public-page.module').then( import('./pages/public/public-page.module').then(
(m) => m.PublicPageModule (m) => m.PublicPageModule
) )
}, },
{ {
path: paths.register, path: publicRoutes.register.path,
loadChildren: () => loadChildren: () =>
import('./pages/register/register-page.module').then( import('./pages/register/register-page.module').then(
(m) => m.RegisterPageModule (m) => m.RegisterPageModule
) )
}, },
{ {
path: paths.resources, path: ghostfolioRoutes.resources,
loadChildren: () => loadChildren: () =>
import('./pages/resources/resources-page.module').then( import('./pages/resources/resources-page.module').then(
(m) => m.ResourcesPageModule (m) => m.ResourcesPageModule
) )
}, },
{ {
path: paths.start, path: ghostfolioRoutes.start,
loadChildren: () => loadChildren: () =>
import('./pages/landing/landing-page.module').then( import('./pages/landing/landing-page.module').then(
(m) => m.LandingPageModule (m) => m.LandingPageModule
@ -146,11 +150,11 @@ const routes: Routes = [
import('./pages/webauthn/webauthn-page.component').then( import('./pages/webauthn/webauthn-page.component').then(
(c) => c.GfWebauthnPageComponent (c) => c.GfWebauthnPageComponent
), ),
path: paths.webauthn, path: ghostfolioRoutes.webauthn,
title: $localize`Sign in` title: $localize`Sign in`
}, },
{ {
path: paths.zen, path: internalRoutes.zen.path,
loadChildren: () => loadChildren: () =>
import('./pages/zen/zen-page.module').then((m) => m.ZenPageModule) import('./pages/zen/zen-page.module').then((m) => m.ZenPageModule)
}, },

32
apps/client/src/app/app.component.ts

@ -2,8 +2,8 @@ import { GfHoldingDetailDialogComponent } from '@ghostfolio/client/components/ho
import { HoldingDetailDialogParams } from '@ghostfolio/client/components/holding-detail-dialog/interfaces/interfaces'; import { HoldingDetailDialogParams } from '@ghostfolio/client/components/holding-detail-dialog/interfaces/interfaces';
import { getCssVariable } from '@ghostfolio/common/helper'; import { getCssVariable } from '@ghostfolio/common/helper';
import { InfoItem, User } from '@ghostfolio/common/interfaces'; import { InfoItem, User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes, routes } from '@ghostfolio/common/routes';
import { ColorScheme } from '@ghostfolio/common/types'; import { ColorScheme } from '@ghostfolio/common/types';
import { DOCUMENT } from '@angular/common'; import { DOCUMENT } from '@angular/common';
@ -63,25 +63,25 @@ export class AppComponent implements OnDestroy, OnInit {
public hasTabs = false; public hasTabs = false;
public info: InfoItem; public info: InfoItem;
public pageTitle: string; public pageTitle: string;
public routerLinkAbout = ['/' + paths.about]; public routerLinkAbout = ['/' + routes.about];
public routerLinkAboutChangelog = ['/' + paths.about, paths.changelog]; public routerLinkAboutChangelog = ['/' + routes.about, routes.changelog];
public routerLinkAboutLicense = ['/' + paths.about, paths.license]; public routerLinkAboutLicense = ['/' + routes.about, routes.license];
public routerLinkAboutPrivacyPolicy = [ public routerLinkAboutPrivacyPolicy = [
'/' + paths.about, '/' + routes.about,
paths.privacyPolicy routes.privacyPolicy
]; ];
public routerLinkAboutTermsOfService = [ public routerLinkAboutTermsOfService = [
'/' + paths.about, '/' + routes.about,
paths.termsOfService routes.termsOfService
]; ];
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkFaq = ['/' + paths.faq]; public routerLinkFaq = ['/' + routes.faq];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + routes.features];
public routerLinkMarkets = ['/' + paths.markets]; public routerLinkMarkets = ['/' + routes.markets];
public routerLinkOpenStartup = ['/' + paths.openStartup]; public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path];
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + routes.pricing];
public routerLinkRegister = ['/' + paths.register]; public routerLinkRegister = ['/' + publicRoutes.register.path];
public routerLinkResources = ['/' + paths.resources]; public routerLinkResources = ['/' + routes.resources];
public showFooter = false; public showFooter = false;
public user: User; public user: User;

4
apps/client/src/app/components/access-table/access-table.component.ts

@ -1,7 +1,7 @@
import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type';
import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service';
import { Access, User } from '@ghostfolio/common/interfaces'; import { Access, User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Clipboard } from '@angular/cdk/clipboard'; import { Clipboard } from '@angular/cdk/clipboard';
import { import {
@ -55,7 +55,7 @@ export class AccessTableComponent implements OnChanges {
public getPublicUrl(aId: string): string { public getPublicUrl(aId: string): string {
const languageCode = this.user.settings.language; const languageCode = this.user.settings.language;
return `${this.baseUrl}/${languageCode}/${paths.public}/${aId}`; return `${this.baseUrl}/${languageCode}/${routes.public}/${aId}`;
} }
public onCopyUrlToClipboard(aId: string): void { public onCopyUrlToClipboard(aId: string): void {

20
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts

@ -9,8 +9,8 @@ import {
PortfolioPosition, PortfolioPosition,
User User
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes } from '@ghostfolio/common/routes';
import { OrderWithAccount } from '@ghostfolio/common/types'; import { OrderWithAccount } from '@ghostfolio/common/types';
import { import {
@ -93,9 +93,12 @@ export class AccountDetailDialog implements OnDestroy, OnInit {
} }
public onCloneActivity(aActivity: Activity) { public onCloneActivity(aActivity: Activity) {
this.router.navigate(['/' + paths.portfolio, paths.activities], { this.router.navigate(
queryParams: { activityId: aActivity.id, createDialog: true } internalRoutes.portfolio.subRoutes.activities.routerLink,
}); {
queryParams: { activityId: aActivity.id, createDialog: true }
}
);
this.dialogRef.close(); this.dialogRef.close();
} }
@ -152,9 +155,12 @@ export class AccountDetailDialog implements OnDestroy, OnInit {
} }
public onUpdateActivity(aActivity: Activity) { public onUpdateActivity(aActivity: Activity) {
this.router.navigate(['/' + paths.portfolio, paths.activities], { this.router.navigate(
queryParams: { activityId: aActivity.id, editDialog: true } internalRoutes.portfolio.subRoutes.activities.routerLink,
}); {
queryParams: { activityId: aActivity.id, editDialog: true }
}
);
this.dialogRef.close(); this.dialogRef.close();
} }

4
apps/client/src/app/components/admin-settings/admin-settings.component.ts

@ -10,7 +10,7 @@ import {
DataProviderInfo, DataProviderInfo,
User User
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
@ -72,7 +72,7 @@ export class AdminSettingsComponent implements OnDestroy, OnInit {
const languageCode = this.user.settings.language; const languageCode = this.user.settings.language;
this.pricingUrl = `https://ghostfol.io/${languageCode}/${paths.pricing}`; this.pricingUrl = `https://ghostfol.io/${languageCode}/${routes.pricing}`;
this.changeDetectorRef.markForCheck(); this.changeDetectorRef.markForCheck();
} }

6
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts

@ -12,8 +12,8 @@ import {
parseDate parseDate
} from '@ghostfolio/common/helper'; } from '@ghostfolio/common/helper';
import { LineChartItem, User } from '@ghostfolio/common/interfaces'; import { LineChartItem, User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { routes } from '@ghostfolio/common/routes';
import { ColorScheme } from '@ghostfolio/common/types'; import { ColorScheme } from '@ghostfolio/common/types';
import { import {
@ -65,8 +65,8 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy {
public chart: Chart<'line'>; public chart: Chart<'line'>;
public hasPermissionToAccessAdminControl: boolean; public hasPermissionToAccessAdminControl: boolean;
public routerLinkAdminControlMarketData = [ public routerLinkAdminControlMarketData = [
'/' + paths.adminControl, '/' + routes.adminControl,
paths.marketData routes.marketData
]; ];
public constructor() { public constructor() {

26
apps/client/src/app/components/header/header.component.html

@ -20,9 +20,9 @@
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
'font-weight-bold': 'font-weight-bold':
currentRoute === paths.home || currentRoute === paths.zen, currentRoute === routes.home || currentRoute === routes.zen,
'text-decoration-underline': 'text-decoration-underline':
currentRoute === paths.home || currentRoute === paths.zen currentRoute === routes.home || currentRoute === routes.zen
}" }"
[routerLink]="['/']" [routerLink]="['/']"
>Overview</a >Overview</a
@ -34,8 +34,8 @@
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
'font-weight-bold': currentRoute === paths.portfolio, 'font-weight-bold': currentRoute === routes.portfolio,
'text-decoration-underline': currentRoute === paths.portfolio 'text-decoration-underline': currentRoute === routes.portfolio
}" }"
[routerLink]="routerLinkPortfolio" [routerLink]="routerLinkPortfolio"
>Portfolio</a >Portfolio</a
@ -47,8 +47,8 @@
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
'font-weight-bold': currentRoute === paths.accounts, 'font-weight-bold': currentRoute === routes.accounts,
'text-decoration-underline': currentRoute === paths.accounts 'text-decoration-underline': currentRoute === routes.accounts
}" }"
[routerLink]="routerLinkAccounts" [routerLink]="routerLinkAccounts"
>Accounts</a >Accounts</a
@ -61,8 +61,8 @@
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
'font-weight-bold': currentRoute === paths.adminControl, 'font-weight-bold': currentRoute === routes.adminControl,
'text-decoration-underline': currentRoute === paths.adminControl 'text-decoration-underline': currentRoute === routes.adminControl
}" }"
[routerLink]="routerLinkAdminControl" [routerLink]="routerLinkAdminControl"
>Admin Control</a >Admin Control</a
@ -235,7 +235,7 @@
mat-menu-item mat-menu-item
[ngClass]="{ [ngClass]="{
'font-weight-bold': 'font-weight-bold':
currentRoute === paths.home || currentRoute === paths.zen currentRoute === routes.home || currentRoute === routes.zen
}" }"
[routerLink]="['/']" [routerLink]="['/']"
>Overview</a >Overview</a
@ -245,7 +245,7 @@
i18n i18n
mat-menu-item mat-menu-item
[ngClass]="{ [ngClass]="{
'font-weight-bold': currentRoute === paths.portfolio 'font-weight-bold': currentRoute === routes.portfolio
}" }"
[routerLink]="routerLinkPortfolio" [routerLink]="routerLinkPortfolio"
>Portfolio</a >Portfolio</a
@ -254,14 +254,14 @@
class="d-flex d-sm-none" class="d-flex d-sm-none"
i18n i18n
mat-menu-item mat-menu-item
[ngClass]="{ 'font-weight-bold': currentRoute === paths.accounts }" [ngClass]="{ 'font-weight-bold': currentRoute === routes.accounts }"
[routerLink]="routerLinkAccounts" [routerLink]="routerLinkAccounts"
>Accounts</a >Accounts</a
> >
<a <a
i18n i18n
mat-menu-item mat-menu-item
[ngClass]="{ 'font-weight-bold': currentRoute === paths.account }" [ngClass]="{ 'font-weight-bold': currentRoute === routes.account }"
[routerLink]="routerLinkAccount" [routerLink]="routerLinkAccount"
>My Ghostfolio</a >My Ghostfolio</a
> >
@ -271,7 +271,7 @@
i18n i18n
mat-menu-item mat-menu-item
[ngClass]="{ [ngClass]="{
'font-weight-bold': currentRoute === paths.adminControl 'font-weight-bold': currentRoute === routes.adminControl
}" }"
[routerLink]="routerLinkAdminControl" [routerLink]="routerLinkAdminControl"
>Admin Control</a >Admin Control</a

38
apps/client/src/app/components/header/header.component.ts

@ -11,8 +11,12 @@ import {
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { Filter, InfoItem, User } from '@ghostfolio/common/interfaces'; import { Filter, InfoItem, User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import {
internalRoutes,
publicRoutes,
routes
} from '@ghostfolio/common/routes';
import { DateRange } from '@ghostfolio/common/types'; import { DateRange } from '@ghostfolio/common/types';
import { GfAssistantComponent } from '@ghostfolio/ui/assistant/assistant.component'; import { GfAssistantComponent } from '@ghostfolio/ui/assistant/assistant.component';
@ -80,22 +84,22 @@ export class HeaderComponent implements OnChanges {
public hasPermissionToCreateUser: boolean; public hasPermissionToCreateUser: boolean;
public impersonationId: string; public impersonationId: string;
public isMenuOpen: boolean; public isMenuOpen: boolean;
public paths = paths; public routeAbout = routes.about;
public routeAbout = paths.about; public routeFeatures = routes.features;
public routeFeatures = paths.features; public routeMarkets = routes.markets;
public routeMarkets = paths.markets; public routePricing = routes.pricing;
public routePricing = paths.pricing; public routeResources = routes.resources;
public routeResources = paths.resources; public routes = routes;
public routerLinkAbout = ['/' + paths.about]; public routerLinkAbout = ['/' + routes.about];
public routerLinkAccount = ['/' + paths.account]; public routerLinkAccount = ['/' + routes.account];
public routerLinkAccounts = ['/' + paths.accounts]; public routerLinkAccounts = internalRoutes.accounts.routerLink;
public routerLinkAdminControl = ['/' + paths.adminControl]; public routerLinkAdminControl = ['/' + routes.adminControl];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + routes.features];
public routerLinkMarkets = ['/' + paths.markets]; public routerLinkMarkets = ['/' + routes.markets];
public routerLinkPortfolio = ['/' + paths.portfolio]; public routerLinkPortfolio = internalRoutes.portfolio.routerLink;
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + routes.pricing];
public routerLinkRegister = ['/' + paths.register]; public routerLinkRegister = ['/' + publicRoutes.register.path];
public routerLinkResources = ['/' + paths.resources]; public routerLinkResources = ['/' + routes.resources];
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();

20
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts

@ -13,8 +13,8 @@ import {
LineChartItem, LineChartItem,
User User
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes } from '@ghostfolio/common/routes';
import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table';
import { GfDataProviderCreditsComponent } from '@ghostfolio/ui/data-provider-credits'; import { GfDataProviderCreditsComponent } from '@ghostfolio/ui/data-provider-credits';
import { GfHistoricalMarketDataEditorComponent } from '@ghostfolio/ui/historical-market-data-editor'; import { GfHistoricalMarketDataEditorComponent } from '@ghostfolio/ui/historical-market-data-editor';
@ -470,9 +470,12 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
} }
public onCloneActivity(aActivity: Activity) { public onCloneActivity(aActivity: Activity) {
this.router.navigate(['/' + paths.portfolio, paths.activities], { this.router.navigate(
queryParams: { activityId: aActivity.id, createDialog: true } internalRoutes.portfolio.subRoutes.activities.routerLink,
}); {
queryParams: { activityId: aActivity.id, createDialog: true }
}
);
this.dialogRef.close(); this.dialogRef.close();
} }
@ -512,9 +515,12 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
} }
public onUpdateActivity(aActivity: Activity) { public onUpdateActivity(aActivity: Activity) {
this.router.navigate(['/' + paths.portfolio, paths.activities], { this.router.navigate(
queryParams: { activityId: aActivity.id, editDialog: true } internalRoutes.portfolio.subRoutes.activities.routerLink,
}); {
queryParams: { activityId: aActivity.id, editDialog: true }
}
);
this.dialogRef.close(); this.dialogRef.close();
} }

8
apps/client/src/app/components/home-holdings/home-holdings.component.ts

@ -7,8 +7,8 @@ import {
ToggleOption, ToggleOption,
User User
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes } from '@ghostfolio/common/routes';
import { HoldingType, HoldingsViewMode } from '@ghostfolio/common/types'; import { HoldingType, HoldingsViewMode } from '@ghostfolio/common/types';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
@ -37,10 +37,8 @@ export class HomeHoldingsComponent implements OnDestroy, OnInit {
{ label: $localize`Active`, value: 'ACTIVE' }, { label: $localize`Active`, value: 'ACTIVE' },
{ label: $localize`Closed`, value: 'CLOSED' } { label: $localize`Closed`, value: 'CLOSED' }
]; ];
public routerLinkPortfolioActivities = [ public routerLinkPortfolioActivities =
'/' + paths.portfolio, internalRoutes.portfolio.subRoutes.activities.routerLink;
paths.activities
];
public user: User; public user: User;
public viewModeFormControl = new FormControl<HoldingsViewMode>( public viewModeFormControl = new FormControl<HoldingsViewMode>(
HomeHoldingsComponent.DEFAULT_HOLDINGS_VIEW_MODE HomeHoldingsComponent.DEFAULT_HOLDINGS_VIEW_MODE

12
apps/client/src/app/components/home-overview/home-overview.component.ts

@ -10,8 +10,8 @@ import {
PortfolioPerformance, PortfolioPerformance,
User User
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes } from '@ghostfolio/common/routes';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
@ -37,12 +37,10 @@ export class HomeOverviewComponent implements OnDestroy, OnInit {
public isLoadingPerformance = true; public isLoadingPerformance = true;
public performance: PortfolioPerformance; public performance: PortfolioPerformance;
public precision = 2; public precision = 2;
public routerLinkAccounts = ['/' + paths.accounts]; public routerLinkAccounts = internalRoutes.accounts.routerLink;
public routerLinkPortfolio = ['/' + paths.portfolio]; public routerLinkPortfolio = internalRoutes.portfolio.routerLink;
public routerLinkPortfolioActivities = [ public routerLinkPortfolioActivities =
'/' + paths.portfolio, internalRoutes.portfolio.subRoutes.activities.routerLink;
paths.activities
];
public showDetails = false; public showDetails = false;
public unit: string; public unit: string;
public user: User; public user: User;

4
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
@ -28,7 +28,7 @@ export class SubscriptionInterstitialDialog implements OnInit {
public remainingSkipButtonDelay = public remainingSkipButtonDelay =
SubscriptionInterstitialDialog.SKIP_BUTTON_DELAY_IN_SECONDS; SubscriptionInterstitialDialog.SKIP_BUTTON_DELAY_IN_SECONDS;
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + routes.pricing];
public variantIndex: number; public variantIndex: number;
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();

4
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts

@ -4,8 +4,8 @@ import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { getDateFormatString } from '@ghostfolio/common/helper'; import { getDateFormatString } from '@ghostfolio/common/helper';
import { User } from '@ghostfolio/common/interfaces'; import { User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { routes } from '@ghostfolio/common/routes';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
@ -37,7 +37,7 @@ export class UserAccountMembershipComponent implements OnDestroy {
public hasPermissionToUpdateUserSettings: boolean; public hasPermissionToUpdateUserSettings: boolean;
public price: number; public price: number;
public priceId: string; public priceId: string;
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + routes.pricing];
public trySubscriptionMail = public trySubscriptionMail =
'mailto:hi@ghostfol.io?Subject=Ghostfolio Premium Trial&body=Hello%0D%0DI am interested in Ghostfolio Premium. Can you please send me a coupon code to try it for some time?%0D%0DKind regards'; 'mailto:hi@ghostfol.io?Subject=Ghostfolio Premium Trial&body=Hello%0D%0DI am interested in Ghostfolio Premium. Can you please send me a coupon code to try it for some time?%0D%0DKind regards';
public user: User; public user: User;

48
apps/client/src/app/core/auth.guard.ts

@ -1,7 +1,11 @@
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service'; import { SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { paths } from '@ghostfolio/common/paths'; import {
internalRoutes,
publicRoutes,
routes
} from '@ghostfolio/common/routes';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { import {
@ -15,17 +19,17 @@ import { catchError } from 'rxjs/operators';
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class AuthGuard { export class AuthGuard {
private static PUBLIC_PAGE_ROUTES = [ private static PUBLIC_PAGE_ROUTES = [
`/${paths.about}`, `/${routes.about}`,
`/${paths.blog}`, `/${routes.blog}`,
`/${paths.demo}`, `/${routes.demo}`,
`/${paths.faq}`, `/${routes.faq}`,
`/${paths.features}`, `/${routes.features}`,
`/${paths.markets}`, `/${routes.markets}`,
`/${paths.openStartup}`, `/${publicRoutes.openStartup.path}`,
`/${paths.pricing}`, `/${routes.pricing}`,
`/${paths.public}`, `/${routes.public}`,
`/${paths.register}`, `/${publicRoutes.register.path}`,
`/${paths.resources}` `/${routes.resources}`
]; ];
public constructor( public constructor(
@ -48,10 +52,10 @@ export class AuthGuard {
.pipe( .pipe(
catchError(() => { catchError(() => {
if (utmSource === 'ios') { if (utmSource === 'ios') {
this.router.navigate(['/' + paths.demo]); this.router.navigate(['/' + routes.demo]);
resolve(false); resolve(false);
} else if (utmSource === 'trusted-web-activity') { } else if (utmSource === 'trusted-web-activity') {
this.router.navigate(['/' + paths.register]); this.router.navigate(['/' + publicRoutes.register.path]);
resolve(false); resolve(false);
} else if ( } else if (
AuthGuard.PUBLIC_PAGE_ROUTES.some((publicPageRoute) => { AuthGuard.PUBLIC_PAGE_ROUTES.some((publicPageRoute) => {
@ -62,7 +66,7 @@ export class AuthGuard {
resolve(true); resolve(true);
return EMPTY; return EMPTY;
} else if (state.url !== '/start') { } else if (state.url !== '/start') {
this.router.navigate(['/' + paths.start]); this.router.navigate(['/' + routes.start]);
resolve(false); resolve(false);
return EMPTY; return EMPTY;
} }
@ -88,26 +92,26 @@ export class AuthGuard {
resolve(true); resolve(true);
return; return;
} else if ( } else if (
state.url.startsWith(`/${paths.home}`) && state.url.startsWith(`/${internalRoutes.home.path}`) &&
user.settings.viewMode === 'ZEN' user.settings.viewMode === 'ZEN'
) { ) {
this.router.navigate(['/' + paths.zen]); this.router.navigate(internalRoutes.zen.routerLink);
resolve(false); resolve(false);
return; return;
} else if (state.url.startsWith(`/${paths.start}`)) { } else if (state.url.startsWith(`/${routes.start}`)) {
if (user.settings.viewMode === 'ZEN') { if (user.settings.viewMode === 'ZEN') {
this.router.navigate(['/' + paths.zen]); this.router.navigate(internalRoutes.zen.routerLink);
} else { } else {
this.router.navigate(['/' + paths.home]); this.router.navigate(internalRoutes.home.routerLink);
} }
resolve(false); resolve(false);
return; return;
} else if ( } else if (
state.url.startsWith(`/${paths.zen}`) && state.url.startsWith(`/${internalRoutes.zen.path}`) &&
user.settings.viewMode === 'DEFAULT' user.settings.viewMode === 'DEFAULT'
) { ) {
this.router.navigate(['/' + paths.home]); this.router.navigate(internalRoutes.home.routerLink);
resolve(false); resolve(false);
return; return;
} }

6
apps/client/src/app/core/http-response.interceptor.ts

@ -2,7 +2,7 @@ import { DataService } from '@ghostfolio/client/services/data.service';
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service'; import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service';
import { InfoItem } from '@ghostfolio/common/interfaces'; import { InfoItem } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { import {
HTTP_INTERCEPTORS, HTTP_INTERCEPTORS,
@ -75,7 +75,7 @@ export class HttpResponseInterceptor implements HttpInterceptor {
}); });
this.snackBarRef.onAction().subscribe(() => { this.snackBarRef.onAction().subscribe(() => {
this.router.navigate(['/' + paths.pricing]); this.router.navigate(['/' + routes.pricing]);
}); });
} }
} else if (error.status === StatusCodes.INTERNAL_SERVER_ERROR) { } else if (error.status === StatusCodes.INTERNAL_SERVER_ERROR) {
@ -111,7 +111,7 @@ export class HttpResponseInterceptor implements HttpInterceptor {
} else if (error.status === StatusCodes.UNAUTHORIZED) { } else if (error.status === StatusCodes.UNAUTHORIZED) {
if (!error.url.includes('/data-providers/ghostfolio/status')) { if (!error.url.includes('/data-providers/ghostfolio/status')) {
if (this.webAuthnService.isEnabled()) { if (this.webAuthnService.isEnabled()) {
this.router.navigate(['/' + paths.webauthn]); this.router.navigate(['/' + routes.webauthn]);
} else { } else {
this.tokenStorageService.signOut(); this.tokenStorageService.signOut();
} }

12
apps/client/src/app/pages/about/about-page-routing.module.ts

@ -1,5 +1,5 @@
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { paths } from '@ghostfolio/common/paths'; import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -18,35 +18,35 @@ const routes: Routes = [
) )
}, },
{ {
path: paths.changelog, path: ghostfolioRoutes.changelog,
loadChildren: () => loadChildren: () =>
import('./changelog/changelog-page.module').then( import('./changelog/changelog-page.module').then(
(m) => m.ChangelogPageModule (m) => m.ChangelogPageModule
) )
}, },
{ {
path: paths.license, path: ghostfolioRoutes.license,
loadChildren: () => loadChildren: () =>
import('./license/license-page.module').then( import('./license/license-page.module').then(
(m) => m.LicensePageModule (m) => m.LicensePageModule
) )
}, },
{ {
path: paths.ossFriends, path: ghostfolioRoutes.ossFriends,
loadChildren: () => loadChildren: () =>
import('./oss-friends/oss-friends-page.module').then( import('./oss-friends/oss-friends-page.module').then(
(m) => m.OpenSourceSoftwareFriendsPageModule (m) => m.OpenSourceSoftwareFriendsPageModule
) )
}, },
{ {
path: paths.privacyPolicy, path: ghostfolioRoutes.privacyPolicy,
loadChildren: () => loadChildren: () =>
import('./privacy-policy/privacy-policy-page.module').then( import('./privacy-policy/privacy-policy-page.module').then(
(m) => m.PrivacyPolicyPageModule (m) => m.PrivacyPolicyPageModule
) )
}, },
{ {
path: paths.termsOfService, path: ghostfolioRoutes.termsOfService,
loadChildren: () => loadChildren: () =>
import('./terms-of-service/terms-of-service-page.module').then( import('./terms-of-service/terms-of-service-page.module').then(
(m) => m.TermsOfServicePageModule (m) => m.TermsOfServicePageModule

14
apps/client/src/app/pages/about/about-page.component.ts

@ -1,8 +1,8 @@
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { routes } from '@ghostfolio/common/routes';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
@ -44,17 +44,17 @@ export class AboutPageComponent implements OnDestroy, OnInit {
{ {
iconName: 'information-circle-outline', iconName: 'information-circle-outline',
label: $localize`About`, label: $localize`About`,
path: ['/' + paths.about] path: ['/' + routes.about]
}, },
{ {
iconName: 'sparkles-outline', iconName: 'sparkles-outline',
label: $localize`Changelog`, label: $localize`Changelog`,
path: ['/' + paths.about, paths.changelog] path: ['/' + routes.about, routes.changelog]
}, },
{ {
iconName: 'ribbon-outline', iconName: 'ribbon-outline',
label: $localize`License`, label: $localize`License`,
path: ['/' + paths.about, paths.license], path: ['/' + routes.about, routes.license],
showCondition: !this.hasPermissionForSubscription showCondition: !this.hasPermissionForSubscription
} }
]; ];
@ -63,14 +63,14 @@ export class AboutPageComponent implements OnDestroy, OnInit {
this.tabs.push({ this.tabs.push({
iconName: 'shield-checkmark-outline', iconName: 'shield-checkmark-outline',
label: $localize`Privacy Policy`, label: $localize`Privacy Policy`,
path: ['/' + paths.about, paths.privacyPolicy], path: ['/' + routes.about, routes.privacyPolicy],
showCondition: this.hasPermissionForSubscription showCondition: this.hasPermissionForSubscription
}); });
this.tabs.push({ this.tabs.push({
iconName: 'document-text-outline', iconName: 'document-text-outline',
label: $localize`Terms of Service`, label: $localize`Terms of Service`,
path: ['/' + paths.about, paths.termsOfService], path: ['/' + routes.about, routes.termsOfService],
showCondition: this.hasPermissionForSubscription showCondition: this.hasPermissionForSubscription
}); });
@ -82,7 +82,7 @@ export class AboutPageComponent implements OnDestroy, OnInit {
this.tabs.push({ this.tabs.push({
iconName: 'happy-outline', iconName: 'happy-outline',
label: 'OSS Friends', label: 'OSS Friends',
path: ['/' + paths.about, paths.ossFriends] path: ['/' + routes.about, routes.ossFriends]
}); });
}); });
} }

10
apps/client/src/app/pages/about/overview/about-overview-page.component.ts

@ -1,8 +1,8 @@
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { User } from '@ghostfolio/common/interfaces'; import { User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes, routes } from '@ghostfolio/common/routes';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
@ -18,10 +18,10 @@ export class AboutOverviewPageComponent implements OnDestroy, OnInit {
public hasPermissionForStatistics: boolean; public hasPermissionForStatistics: boolean;
public hasPermissionForSubscription: boolean; public hasPermissionForSubscription: boolean;
public isLoggedIn: boolean; public isLoggedIn: boolean;
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkFaq = ['/' + paths.faq]; public routerLinkFaq = ['/' + routes.faq];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + routes.features];
public routerLinkOpenStartup = ['/' + paths.openStartup]; public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path];
public user: User; public user: User;
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();

3
apps/client/src/app/pages/accounts/accounts-page-routing.module.ts

@ -1,4 +1,5 @@
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { internalRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -10,7 +11,7 @@ const routes: Routes = [
canActivate: [AuthGuard], canActivate: [AuthGuard],
component: AccountsPageComponent, component: AccountsPageComponent,
path: '', path: '',
title: $localize`Accounts` title: internalRoutes.accounts.title
} }
]; ];

10
apps/client/src/app/pages/admin/admin-page-routing.module.ts

@ -4,7 +4,7 @@ import { AdminOverviewComponent } from '@ghostfolio/client/components/admin-over
import { AdminSettingsComponent } from '@ghostfolio/client/components/admin-settings/admin-settings.component'; import { AdminSettingsComponent } from '@ghostfolio/client/components/admin-settings/admin-settings.component';
import { AdminUsersComponent } from '@ghostfolio/client/components/admin-users/admin-users.component'; import { AdminUsersComponent } from '@ghostfolio/client/components/admin-users/admin-users.component';
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { paths } from '@ghostfolio/common/paths'; import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -21,22 +21,22 @@ const routes: Routes = [
title: $localize`Admin Control` title: $localize`Admin Control`
}, },
{ {
path: paths.jobs, path: ghostfolioRoutes.jobs,
component: AdminJobsComponent, component: AdminJobsComponent,
title: $localize`Job Queue` title: $localize`Job Queue`
}, },
{ {
path: paths.marketData, path: ghostfolioRoutes.marketData,
component: AdminMarketDataComponent, component: AdminMarketDataComponent,
title: $localize`Market Data` title: $localize`Market Data`
}, },
{ {
path: paths.settings, path: ghostfolioRoutes.settings,
component: AdminSettingsComponent, component: AdminSettingsComponent,
title: $localize`Settings` title: $localize`Settings`
}, },
{ {
path: paths.users, path: ghostfolioRoutes.users,
component: AdminUsersComponent, component: AdminUsersComponent,
title: $localize`Users` title: $localize`Users`
} }

12
apps/client/src/app/pages/admin/admin-page.component.ts

@ -1,5 +1,5 @@
import { TabConfiguration } from '@ghostfolio/common/interfaces'; import { TabConfiguration } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component, OnDestroy, OnInit } from '@angular/core'; import { Component, OnDestroy, OnInit } from '@angular/core';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
@ -27,27 +27,27 @@ export class AdminPageComponent implements OnDestroy, OnInit {
{ {
iconName: 'reader-outline', iconName: 'reader-outline',
label: $localize`Overview`, label: $localize`Overview`,
path: ['/' + paths.adminControl] path: ['/' + routes.adminControl]
}, },
{ {
iconName: 'settings-outline', iconName: 'settings-outline',
label: $localize`Settings`, label: $localize`Settings`,
path: ['/' + paths.adminControl, paths.settings] path: ['/' + routes.adminControl, routes.settings]
}, },
{ {
iconName: 'server-outline', iconName: 'server-outline',
label: $localize`Market Data`, label: $localize`Market Data`,
path: ['/' + paths.adminControl, paths.marketData] path: ['/' + routes.adminControl, routes.marketData]
}, },
{ {
iconName: 'flash-outline', iconName: 'flash-outline',
label: $localize`Job Queue`, label: $localize`Job Queue`,
path: ['/' + paths.adminControl, paths.jobs] path: ['/' + routes.adminControl, routes.jobs]
}, },
{ {
iconName: 'people-outline', iconName: 'people-outline',
label: $localize`Users`, label: $localize`Users`,
path: ['/' + paths.adminControl, paths.users] path: ['/' + routes.adminControl, routes.users]
} }
]; ];
} }

8
apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './hallo-ghostfolio-page.html' templateUrl: './hallo-ghostfolio-page.html'
}) })
export class HalloGhostfolioPageComponent { export class HalloGhostfolioPageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + routes.pricing];
public routerLinkResources = ['/' + paths.resources]; public routerLinkResources = ['/' + routes.resources];
} }

8
apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './hello-ghostfolio-page.html' templateUrl: './hello-ghostfolio-page.html'
}) })
export class HelloGhostfolioPageComponent { export class HelloGhostfolioPageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + routes.pricing];
public routerLinkResources = ['/' + paths.resources]; public routerLinkResources = ['/' + routes.resources];
} }

6
apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,6 +11,6 @@ import { RouterModule } from '@angular/router';
templateUrl: './first-months-in-open-source-page.html' templateUrl: './first-months-in-open-source-page.html'
}) })
export class FirstMonthsInOpenSourcePageComponent { export class FirstMonthsInOpenSourcePageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + routes.pricing];
} }

4
apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,5 +11,5 @@ import { RouterModule } from '@angular/router';
templateUrl: './ghostfolio-meets-internet-identity-page.html' templateUrl: './ghostfolio-meets-internet-identity-page.html'
}) })
export class GhostfolioMeetsInternetIdentityPageComponent { export class GhostfolioMeetsInternetIdentityPageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
} }

6
apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,6 +11,6 @@ import { RouterModule } from '@angular/router';
templateUrl: './how-do-i-get-my-finances-in-order-page.html' templateUrl: './how-do-i-get-my-finances-in-order-page.html'
}) })
export class HowDoIGetMyFinancesInOrderPageComponent { export class HowDoIGetMyFinancesInOrderPageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkResources = ['/' + paths.resources]; public routerLinkResources = ['/' + routes.resources];
} }

8
apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './500-stars-on-github-page.html' templateUrl: './500-stars-on-github-page.html'
}) })
export class FiveHundredStarsOnGitHubPageComponent { export class FiveHundredStarsOnGitHubPageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkMarkets = ['/' + paths.markets]; public routerLinkMarkets = ['/' + routes.markets];
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + routes.pricing];
} }

4
apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,5 +11,5 @@ import { RouterModule } from '@angular/router';
templateUrl: './hacktoberfest-2022-page.html' templateUrl: './hacktoberfest-2022-page.html'
}) })
export class Hacktoberfest2022PageComponent { export class Hacktoberfest2022PageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
} }

8
apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
@ -12,7 +12,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './black-friday-2022-page.html' templateUrl: './black-friday-2022-page.html'
}) })
export class BlackFriday2022PageComponent { export class BlackFriday2022PageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + routes.features];
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + routes.pricing];
} }

4
apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,5 +11,5 @@ import { RouterModule } from '@angular/router';
templateUrl: './the-importance-of-tracking-your-personal-finances-page.html' templateUrl: './the-importance-of-tracking-your-personal-finances-page.html'
}) })
export class TheImportanceOfTrackingYourPersonalFinancesPageComponent { export class TheImportanceOfTrackingYourPersonalFinancesPageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
} }

4
apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,5 +11,5 @@ import { RouterModule } from '@angular/router';
templateUrl: './ghostfolio-auf-sackgeld-vorgestellt-page.html' templateUrl: './ghostfolio-auf-sackgeld-vorgestellt-page.html'
}) })
export class GhostfolioAufSackgeldVorgestelltPageComponent { export class GhostfolioAufSackgeldVorgestelltPageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
} }

4
apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,5 +11,5 @@ import { RouterModule } from '@angular/router';
templateUrl: './ghostfolio-meets-umbrel-page.html' templateUrl: './ghostfolio-meets-umbrel-page.html'
}) })
export class GhostfolioMeetsUmbrelPageComponent { export class GhostfolioMeetsUmbrelPageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
} }

8
apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './1000-stars-on-github-page.html' templateUrl: './1000-stars-on-github-page.html'
}) })
export class ThousandStarsOnGitHubPageComponent { export class ThousandStarsOnGitHubPageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + routes.features];
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + routes.pricing];
} }

8
apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './unlock-your-financial-potential-with-ghostfolio-page.html' templateUrl: './unlock-your-financial-potential-with-ghostfolio-page.html'
}) })
export class UnlockYourFinancialPotentialWithGhostfolioPageComponent { export class UnlockYourFinancialPotentialWithGhostfolioPageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + routes.features];
public routerLinkResources = ['/' + paths.resources]; public routerLinkResources = ['/' + routes.resources];
} }

6
apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,6 +11,6 @@ import { RouterModule } from '@angular/router';
templateUrl: './exploring-the-path-to-fire-page.html' templateUrl: './exploring-the-path-to-fire-page.html'
}) })
export class ExploringThePathToFirePageComponent { export class ExploringThePathToFirePageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + routes.features];
} }

6
apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,6 +11,6 @@ import { RouterModule } from '@angular/router';
templateUrl: './ghostfolio-joins-oss-friends-page.html' templateUrl: './ghostfolio-joins-oss-friends-page.html'
}) })
export class GhostfolioJoinsOssFriendsPageComponent { export class GhostfolioJoinsOssFriendsPageComponent {
public routerLinkAboutOssFriends = ['/' + paths.about, paths.ossFriends]; public routerLinkAboutOssFriends = ['/' + routes.about, routes.ossFriends];
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
} }

12
apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,9 +11,9 @@ import { RouterModule } from '@angular/router';
templateUrl: './ghostfolio-2-page.html' templateUrl: './ghostfolio-2-page.html'
}) })
export class Ghostfolio2PageComponent { export class Ghostfolio2PageComponent {
public routerLinkAbout = ['/' + paths.about]; public routerLinkAbout = ['/' + routes.about];
public routerLinkAboutChangelog = ['/' + paths.about, paths.changelog]; public routerLinkAboutChangelog = ['/' + routes.about, routes.changelog];
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + routes.features];
public routerLinkMarkets = ['/' + paths.markets]; public routerLinkMarkets = ['/' + routes.markets];
} }

8
apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { publicRoutes, routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './hacktoberfest-2023-page.html' templateUrl: './hacktoberfest-2023-page.html'
}) })
export class Hacktoberfest2023PageComponent { export class Hacktoberfest2023PageComponent {
public routerLinkAbout = ['/' + paths.about]; public routerLinkAbout = ['/' + routes.about];
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkOpenStartup = ['/' + paths.openStartup]; public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path];
} }

8
apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
@ -12,7 +12,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './black-week-2023-page.html' templateUrl: './black-week-2023-page.html'
}) })
export class BlackWeek2023PageComponent { export class BlackWeek2023PageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + routes.features];
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + routes.pricing];
} }

8
apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './hacktoberfest-2023-debriefing-page.html' templateUrl: './hacktoberfest-2023-debriefing-page.html'
}) })
export class Hacktoberfest2023DebriefingPageComponent { export class Hacktoberfest2023DebriefingPageComponent {
public routerLinkAbout = ['/' + paths.about]; public routerLinkAbout = ['/' + routes.about];
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + routes.features];
} }

8
apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { publicRoutes, routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './hacktoberfest-2024-page.html' templateUrl: './hacktoberfest-2024-page.html'
}) })
export class Hacktoberfest2024PageComponent { export class Hacktoberfest2024PageComponent {
public routerLinkAbout = ['/' + paths.about]; public routerLinkAbout = ['/' + routes.about];
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkOpenStartup = ['/' + paths.openStartup]; public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path];
} }

8
apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
@ -12,7 +12,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './black-weeks-2024-page.html' templateUrl: './black-weeks-2024-page.html'
}) })
export class BlackWeeks2024PageComponent { export class BlackWeeks2024PageComponent {
public routerLinkBlog = ['/' + paths.blog]; public routerLinkBlog = ['/' + routes.blog];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + routes.features];
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + routes.pricing];
} }

6
apps/client/src/app/pages/faq/faq-page-routing.module.ts

@ -1,5 +1,5 @@
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { paths } from '@ghostfolio/common/paths'; import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -18,12 +18,12 @@ const routes: Routes = [
) )
}, },
{ {
path: paths.saas, path: ghostfolioRoutes.saas,
loadChildren: () => loadChildren: () =>
import('./saas/saas-page.module').then((m) => m.SaasPageModule) import('./saas/saas-page.module').then((m) => m.SaasPageModule)
}, },
{ {
path: paths.selfHosting, path: ghostfolioRoutes.selfHosting,
loadChildren: () => loadChildren: () =>
import('./self-hosting/self-hosting-page.module').then( import('./self-hosting/self-hosting-page.module').then(
(m) => m.SelfHostingPageModule (m) => m.SelfHostingPageModule

8
apps/client/src/app/pages/faq/faq-page.component.ts

@ -1,7 +1,7 @@
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { TabConfiguration } from '@ghostfolio/common/interfaces'; import { TabConfiguration } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { routes } from '@ghostfolio/common/routes';
import { Component, OnDestroy, OnInit } from '@angular/core'; import { Component, OnDestroy, OnInit } from '@angular/core';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
@ -36,18 +36,18 @@ export class FaqPageComponent implements OnDestroy, OnInit {
{ {
iconName: 'reader-outline', iconName: 'reader-outline',
label: $localize`General`, label: $localize`General`,
path: ['/' + paths.faq] path: ['/' + routes.faq]
}, },
{ {
iconName: 'cloudy-outline', iconName: 'cloudy-outline',
label: $localize`Cloud` + ' (SaaS)', label: $localize`Cloud` + ' (SaaS)',
path: ['/' + paths.faq, paths.saas], path: ['/' + routes.faq, routes.saas],
showCondition: this.hasPermissionForSubscription showCondition: this.hasPermissionForSubscription
}, },
{ {
iconName: 'server-outline', iconName: 'server-outline',
label: $localize`Self-Hosting`, label: $localize`Self-Hosting`,
path: ['/' + paths.faq, paths.selfHosting] path: ['/' + routes.faq, routes.selfHosting]
} }
]; ];
} }

6
apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts

@ -1,6 +1,6 @@
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { User } from '@ghostfolio/common/interfaces'; import { User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core';
import { Subject, takeUntil } from 'rxjs'; import { Subject, takeUntil } from 'rxjs';
@ -13,8 +13,8 @@ import { Subject, takeUntil } from 'rxjs';
standalone: false standalone: false
}) })
export class FaqOverviewPageComponent implements OnDestroy { export class FaqOverviewPageComponent implements OnDestroy {
public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${paths.pricing}`; public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${routes.pricing}`;
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + routes.features];
public user: User; public user: User;
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();

15
apps/client/src/app/pages/faq/saas/saas-page.component.ts

@ -1,6 +1,6 @@
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { User } from '@ghostfolio/common/interfaces'; import { User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths'; import { publicRoutes, routes } from '@ghostfolio/common/routes';
import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core';
import { Subject, takeUntil } from 'rxjs'; import { Subject, takeUntil } from 'rxjs';
@ -13,11 +13,14 @@ import { Subject, takeUntil } from 'rxjs';
standalone: false standalone: false
}) })
export class SaasPageComponent implements OnDestroy { export class SaasPageComponent implements OnDestroy {
public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${paths.pricing}`; public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${routes.pricing}`;
public routerLinkAccount = ['/' + paths.account]; public routerLinkAccount = ['/' + routes.account];
public routerLinkAccountMembership = ['/' + paths.account, paths.membership]; public routerLinkAccountMembership = [
public routerLinkMarkets = ['/' + paths.markets]; '/' + routes.account,
public routerLinkRegister = ['/' + paths.register]; routes.membership
];
public routerLinkMarkets = ['/' + routes.markets];
public routerLinkRegister = ['/' + publicRoutes.register.path];
public user: User; public user: User;
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();

4
apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component, OnDestroy } from '@angular/core'; import { Component, OnDestroy } from '@angular/core';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
@ -11,7 +11,7 @@ import { Subject } from 'rxjs';
standalone: false standalone: false
}) })
export class SelfHostingPageComponent implements OnDestroy { export class SelfHostingPageComponent implements OnDestroy {
public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${paths.pricing}`; public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${routes.pricing}`;
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();

6
apps/client/src/app/pages/features/features-page.component.ts

@ -1,8 +1,8 @@
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { InfoItem, User } from '@ghostfolio/common/interfaces'; import { InfoItem, User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes, routes } from '@ghostfolio/common/routes';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core';
@ -26,8 +26,8 @@ import { Subject, takeUntil } from 'rxjs';
export class GfFeaturesPageComponent implements OnDestroy { export class GfFeaturesPageComponent implements OnDestroy {
public hasPermissionForSubscription: boolean; public hasPermissionForSubscription: boolean;
public info: InfoItem; public info: InfoItem;
public routerLinkRegister = ['/' + paths.register]; public routerLinkRegister = ['/' + publicRoutes.register.path];
public routerLinkResources = ['/' + paths.resources]; public routerLinkResources = ['/' + routes.resources];
public user: User; public user: User;
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();

18
apps/client/src/app/pages/home/home-page-routing.module.ts

@ -4,7 +4,10 @@ import { HomeOverviewComponent } from '@ghostfolio/client/components/home-overvi
import { HomeSummaryComponent } from '@ghostfolio/client/components/home-summary/home-summary.component'; import { HomeSummaryComponent } from '@ghostfolio/client/components/home-summary/home-summary.component';
import { HomeWatchlistComponent } from '@ghostfolio/client/components/home-watchlist/home-watchlist.component'; import { HomeWatchlistComponent } from '@ghostfolio/client/components/home-watchlist/home-watchlist.component';
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { paths } from '@ghostfolio/common/paths'; import {
routes as ghostfolioRoutes,
internalRoutes
} from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -20,28 +23,29 @@ const routes: Routes = [
component: HomeOverviewComponent component: HomeOverviewComponent
}, },
{ {
path: paths.holdings, path: internalRoutes.home.subRoutes.holdings.path,
component: HomeHoldingsComponent, component: HomeHoldingsComponent,
title: $localize`Holdings` title: internalRoutes.home.subRoutes.holdings.title
}, },
{ {
path: paths.summary, path: ghostfolioRoutes.summary,
component: HomeSummaryComponent, component: HomeSummaryComponent,
title: $localize`Summary` title: $localize`Summary`
}, },
{ {
path: paths.market, path: ghostfolioRoutes.market,
component: HomeMarketComponent, component: HomeMarketComponent,
title: $localize`Markets` title: $localize`Markets`
}, },
{ {
path: paths.watchlist, path: ghostfolioRoutes.watchlist,
component: HomeWatchlistComponent, component: HomeWatchlistComponent,
title: $localize`Watchlist` title: $localize`Watchlist`
} }
], ],
component: HomePageComponent, component: HomePageComponent,
path: '' path: '',
title: internalRoutes.home.title
} }
]; ];

16
apps/client/src/app/pages/home/home-page.component.ts

@ -1,7 +1,7 @@
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths'; import { internalRoutes, routes } from '@ghostfolio/common/routes';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
@ -36,28 +36,28 @@ export class HomePageComponent implements OnDestroy, OnInit {
this.tabs = [ this.tabs = [
{ {
iconName: 'analytics-outline', iconName: 'analytics-outline',
label: $localize`Overview`, label: internalRoutes.home.title,
path: ['/' + paths.home] path: internalRoutes.home.routerLink
}, },
{ {
iconName: 'wallet-outline', iconName: 'wallet-outline',
label: $localize`Holdings`, label: internalRoutes.home.subRoutes.holdings.title,
path: ['/' + paths.home, paths.holdings] path: internalRoutes.home.subRoutes.holdings.routerLink
}, },
{ {
iconName: 'reader-outline', iconName: 'reader-outline',
label: $localize`Summary`, label: $localize`Summary`,
path: ['/' + paths.home, paths.summary] path: ['/' + internalRoutes.home.path, routes.summary]
}, },
{ {
iconName: 'bookmark-outline', iconName: 'bookmark-outline',
label: $localize`Watchlist`, label: $localize`Watchlist`,
path: ['/' + paths.home, paths.watchlist] path: ['/' + internalRoutes.home.path, routes.watchlist]
}, },
{ {
iconName: 'newspaper-outline', iconName: 'newspaper-outline',
label: $localize`Markets`, label: $localize`Markets`,
path: ['/' + paths.home, paths.market] path: ['/' + internalRoutes.home.path, routes.market]
} }
]; ];

10
apps/client/src/app/pages/landing/landing-page.component.ts

@ -1,7 +1,7 @@
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { Statistics } from '@ghostfolio/common/interfaces'; import { Statistics } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes, routes } from '@ghostfolio/common/routes';
import { Component, OnDestroy, OnInit } from '@angular/core'; import { Component, OnDestroy, OnInit } from '@angular/core';
import { format } from 'date-fns'; import { format } from 'date-fns';
@ -25,10 +25,10 @@ export class LandingPageComponent implements OnDestroy, OnInit {
public hasPermissionForStatistics: boolean; public hasPermissionForStatistics: boolean;
public hasPermissionForSubscription: boolean; public hasPermissionForSubscription: boolean;
public hasPermissionToCreateUser: boolean; public hasPermissionToCreateUser: boolean;
public routerLinkAbout = ['/' + paths.about]; public routerLinkAbout = ['/' + routes.about];
public routerLinkDemo = ['/' + paths.demo]; public routerLinkDemo = ['/' + routes.demo];
public routerLinkOpenStartup = ['/' + paths.openStartup]; public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path];
public routerLinkRegister = ['/' + paths.register]; public routerLinkRegister = ['/' + publicRoutes.register.path];
public statistics: Statistics; public statistics: Statistics;
public testimonials = [ public testimonials = [
{ {

3
apps/client/src/app/pages/open/open-page-routing.module.ts

@ -1,4 +1,5 @@
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { publicRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -10,7 +11,7 @@ const routes: Routes = [
canActivate: [AuthGuard], canActivate: [AuthGuard],
component: OpenPageComponent, component: OpenPageComponent,
path: '', path: '',
title: 'Open Startup' title: publicRoutes.openStartup.title
} }
]; ];

3
apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts

@ -1,4 +1,5 @@
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { internalRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -10,7 +11,7 @@ const routes: Routes = [
canActivate: [AuthGuard], canActivate: [AuthGuard],
component: ActivitiesPageComponent, component: ActivitiesPageComponent,
path: '', path: '',
title: $localize`Activities` title: internalRoutes.portfolio.subRoutes.activities.title
} }
]; ];

15
apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts

@ -1,5 +1,8 @@
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { paths } from '@ghostfolio/common/paths'; import {
routes as ghostfolioRoutes,
internalRoutes
} from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -18,33 +21,33 @@ const routes: Routes = [
) )
}, },
{ {
path: paths.activities, path: internalRoutes.portfolio.subRoutes.activities.path,
loadChildren: () => loadChildren: () =>
import('./activities/activities-page.module').then( import('./activities/activities-page.module').then(
(m) => m.ActivitiesPageModule (m) => m.ActivitiesPageModule
) )
}, },
{ {
path: paths.allocations, path: ghostfolioRoutes.allocations,
loadChildren: () => loadChildren: () =>
import('./allocations/allocations-page.module').then( import('./allocations/allocations-page.module').then(
(m) => m.AllocationsPageModule (m) => m.AllocationsPageModule
) )
}, },
{ {
path: paths.fire, path: ghostfolioRoutes.fire,
loadChildren: () => loadChildren: () =>
import('./fire/fire-page.module').then((m) => m.FirePageModule) import('./fire/fire-page.module').then((m) => m.FirePageModule)
}, },
{ {
path: paths.xRay, path: ghostfolioRoutes.xRay,
loadChildren: () => loadChildren: () =>
import('./x-ray/x-ray-page.module').then((m) => m.XRayPageModule) import('./x-ray/x-ray-page.module').then((m) => m.XRayPageModule)
} }
], ],
component: PortfolioPageComponent, component: PortfolioPageComponent,
path: '', path: '',
title: $localize`Portfolio` title: internalRoutes.portfolio.title
} }
]; ];

14
apps/client/src/app/pages/portfolio/portfolio-page.component.ts

@ -1,6 +1,6 @@
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths'; import { internalRoutes, routes } from '@ghostfolio/common/routes';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
@ -34,27 +34,27 @@ export class PortfolioPageComponent implements OnDestroy, OnInit {
{ {
iconName: 'analytics-outline', iconName: 'analytics-outline',
label: $localize`Analysis`, label: $localize`Analysis`,
path: ['/' + paths.portfolio] path: internalRoutes.portfolio.routerLink
}, },
{ {
iconName: 'swap-vertical-outline', iconName: 'swap-vertical-outline',
label: $localize`Activities`, label: internalRoutes.portfolio.subRoutes.activities.title,
path: ['/' + paths.portfolio, paths.activities] path: internalRoutes.portfolio.subRoutes.activities.routerLink
}, },
{ {
iconName: 'pie-chart-outline', iconName: 'pie-chart-outline',
label: $localize`Allocations`, label: $localize`Allocations`,
path: ['/' + paths.portfolio, paths.allocations] path: ['/' + internalRoutes.portfolio.path, routes.allocations]
}, },
{ {
iconName: 'calculator-outline', iconName: 'calculator-outline',
label: 'FIRE ', label: 'FIRE ',
path: ['/' + paths.portfolio, paths.fire] path: ['/' + internalRoutes.portfolio.path, routes.fire]
}, },
{ {
iconName: 'scan-outline', iconName: 'scan-outline',
label: 'X-ray', label: 'X-ray',
path: ['/' + paths.portfolio, paths.xRay] path: ['/' + internalRoutes.portfolio.path, routes.xRay]
} }
]; ];
this.user = state.user; this.user = state.user;

6
apps/client/src/app/pages/pricing/pricing-page.component.ts

@ -2,8 +2,8 @@ import { NotificationService } from '@ghostfolio/client/core/notification/notifi
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { User } from '@ghostfolio/common/interfaces'; import { User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes, routes } from '@ghostfolio/common/routes';
import { translate } from '@ghostfolio/ui/i18n'; import { translate } from '@ghostfolio/ui/i18n';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
@ -41,8 +41,8 @@ export class PricingPageComponent implements OnDestroy, OnInit {
public professionalDataProviderTooltipPremium = translate( public professionalDataProviderTooltipPremium = translate(
'PROFESSIONAL_DATA_PROVIDER_TOOLTIP_PREMIUM' 'PROFESSIONAL_DATA_PROVIDER_TOOLTIP_PREMIUM'
); );
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + routes.features];
public routerLinkRegister = ['/' + paths.register]; public routerLinkRegister = ['/' + publicRoutes.register.path];
public user: User; public user: User;
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();

3
apps/client/src/app/pages/register/register-page-routing.module.ts

@ -1,4 +1,5 @@
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { publicRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -10,7 +11,7 @@ const routes: Routes = [
canActivate: [AuthGuard], canActivate: [AuthGuard],
component: RegisterPageComponent, component: RegisterPageComponent,
path: '', path: '',
title: $localize`Registration` title: publicRoutes.register.title
} }
]; ];

6
apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.component.ts

@ -1,5 +1,5 @@
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
@ -31,8 +31,8 @@ export class ShowAccessTokenDialog {
public isDisclaimerChecked = false; public isDisclaimerChecked = false;
public role: string; public role: string;
public routerLinkAboutTermsOfService = [ public routerLinkAboutTermsOfService = [
'/' + paths.about, '/' + routes.about,
paths.termsOfService routes.termsOfService
]; ];
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();

6
apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts

@ -1,7 +1,7 @@
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { InfoItem } from '@ghostfolio/common/interfaces'; import { InfoItem } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { routes } from '@ghostfolio/common/routes';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
@ -15,8 +15,8 @@ export class ResourcesGlossaryPageComponent implements OnInit {
public hasPermissionForSubscription: boolean; public hasPermissionForSubscription: boolean;
public info: InfoItem; public info: InfoItem;
public routerLinkResourcesPersonalFinanceTools = [ public routerLinkResourcesPersonalFinanceTools = [
'/' + paths.resources, '/' + routes.resources,
paths.personalFinanceTools routes.personalFinanceTools
]; ];
public constructor(private dataService: DataService) { public constructor(private dataService: DataService) {

10
apps/client/src/app/pages/resources/overview/resources-overview.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
@ -14,25 +14,25 @@ export class ResourcesOverviewComponent {
title: 'Frequently Asked Questions (FAQ)', title: 'Frequently Asked Questions (FAQ)',
description: description:
'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.',
link: ['/' + paths.faq] link: ['/' + routes.faq]
}, },
{ {
title: 'Guides', title: 'Guides',
description: description:
'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.',
link: ['/' + paths.resources, paths.guides] link: ['/' + routes.resources, routes.guides]
}, },
{ {
title: 'Markets', title: 'Markets',
description: description:
'Access various market resources and tools to stay informed about financial markets.', 'Access various market resources and tools to stay informed about financial markets.',
link: ['/' + paths.resources, paths.markets] link: ['/' + routes.resources, routes.markets]
}, },
{ {
title: 'Glossary', title: 'Glossary',
description: description:
'Learn key financial terms and concepts in our comprehensive glossary.', 'Learn key financial terms and concepts in our comprehensive glossary.',
link: ['/' + paths.resources, paths.glossary] link: ['/' + routes.resources, routes.glossary]
} }
]; ];
} }

4
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts

@ -1,6 +1,6 @@
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { paths } from '@ghostfolio/common/paths';
import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools';
import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -24,7 +24,7 @@ const routes: Routes = [
return GfProductPageComponent; return GfProductPageComponent;
} }
), ),
path: `${paths.openSourceAlternativeTo}-${alias ?? key}`, path: `${ghostfolioRoutes.openSourceAlternativeTo}-${alias ?? key}`,
title: $localize`Open Source Alternative to ${name}` title: $localize`Open Source Alternative to ${name}`
}; };
}) })

8
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts

@ -1,5 +1,5 @@
import { paths } from '@ghostfolio/common/paths';
import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools';
import { routes } from '@ghostfolio/common/routes';
import { Component, OnDestroy } from '@angular/core'; import { Component, OnDestroy } from '@angular/core';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
@ -12,12 +12,12 @@ import { Subject } from 'rxjs';
standalone: false standalone: false
}) })
export class PersonalFinanceToolsPageComponent implements OnDestroy { export class PersonalFinanceToolsPageComponent implements OnDestroy {
public pathAlternativeTo = paths.openSourceAlternativeTo + '-'; public pathAlternativeTo = routes.openSourceAlternativeTo + '-';
public pathResources = '/' + paths.resources; public pathResources = '/' + routes.resources;
public personalFinanceTools = personalFinanceTools.sort((a, b) => { public personalFinanceTools = personalFinanceTools.sort((a, b) => {
return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' }); return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' });
}); });
public routerLinkAbout = ['/' + paths.about]; public routerLinkAbout = ['/' + routes.about];
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();

10
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts

@ -1,7 +1,7 @@
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { Product } from '@ghostfolio/common/interfaces'; import { Product } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools';
import { routes } from '@ghostfolio/common/routes';
import { translate } from '@ghostfolio/ui/i18n'; import { translate } from '@ghostfolio/ui/i18n';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
@ -20,11 +20,11 @@ export class GfProductPageComponent implements OnInit {
public price: number; public price: number;
public product1: Product; public product1: Product;
public product2: Product; public product2: Product;
public routerLinkAbout = ['/' + paths.about]; public routerLinkAbout = ['/' + routes.about];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + routes.features];
public routerLinkResourcesPersonalFinanceTools = [ public routerLinkResourcesPersonalFinanceTools = [
'/' + paths.resources, '/' + routes.resources,
paths.personalFinanceTools routes.personalFinanceTools
]; ];
public tags: string[]; public tags: string[];

10
apps/client/src/app/pages/resources/resources-page-routing.module.ts

@ -1,5 +1,5 @@
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { paths } from '@ghostfolio/common/paths'; import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -19,27 +19,27 @@ const routes: Routes = [
) )
}, },
{ {
path: paths.glossary, path: ghostfolioRoutes.glossary,
loadChildren: () => loadChildren: () =>
import('./glossary/resources-glossary.module').then( import('./glossary/resources-glossary.module').then(
(m) => m.ResourcesGlossaryPageModule (m) => m.ResourcesGlossaryPageModule
) )
}, },
{ {
path: paths.guides, path: ghostfolioRoutes.guides,
loadChildren: () => loadChildren: () =>
import('./guides/resources-guides.module').then( import('./guides/resources-guides.module').then(
(m) => m.ResourcesGuidesModule (m) => m.ResourcesGuidesModule
) )
}, },
{ {
path: paths.markets, path: ghostfolioRoutes.markets,
loadChildren: () => loadChildren: () =>
import('./markets/resources-markets.module').then( import('./markets/resources-markets.module').then(
(m) => m.ResourcesMarketsModule (m) => m.ResourcesMarketsModule
) )
}, },
...[paths.personalFinanceTools].map((path) => ({ ...[ghostfolioRoutes.personalFinanceTools].map((path) => ({
path, path,
loadChildren: () => loadChildren: () =>
import( import(

8
apps/client/src/app/pages/resources/resources-page.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
@ -20,17 +20,17 @@ export class ResourcesPageComponent implements OnInit {
iconName: 'reader-outline' iconName: 'reader-outline'
}, },
{ {
path: paths.guides, path: routes.guides,
label: $localize`Guides`, label: $localize`Guides`,
iconName: 'book-outline' iconName: 'book-outline'
}, },
{ {
path: paths.markets, path: routes.markets,
label: $localize`Markets`, label: $localize`Markets`,
iconName: 'newspaper-outline' iconName: 'newspaper-outline'
}, },
{ {
path: paths.glossary, path: routes.glossary,
label: $localize`Glossary`, label: $localize`Glossary`,
iconName: 'library-outline' iconName: 'library-outline'
} }

6
apps/client/src/app/pages/user-account/user-account-page-routing.module.ts

@ -2,7 +2,7 @@ import { UserAccountAccessComponent } from '@ghostfolio/client/components/user-a
import { UserAccountMembershipComponent } from '@ghostfolio/client/components/user-account-membership/user-account-membership.component'; import { UserAccountMembershipComponent } from '@ghostfolio/client/components/user-account-membership/user-account-membership.component';
import { UserAccountSettingsComponent } from '@ghostfolio/client/components/user-account-settings/user-account-settings.component'; import { UserAccountSettingsComponent } from '@ghostfolio/client/components/user-account-settings/user-account-settings.component';
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { paths } from '@ghostfolio/common/paths'; import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -19,12 +19,12 @@ const routes: Routes = [
title: $localize`Settings` title: $localize`Settings`
}, },
{ {
path: paths.membership, path: ghostfolioRoutes.membership,
component: UserAccountMembershipComponent, component: UserAccountMembershipComponent,
title: $localize`Membership` title: $localize`Membership`
}, },
{ {
path: paths.access, path: ghostfolioRoutes.access,
component: UserAccountAccessComponent, component: UserAccountAccessComponent,
title: $localize`Access` title: $localize`Access`
} }

8
apps/client/src/app/pages/user-account/user-account-page.component.ts

@ -1,6 +1,6 @@
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
@ -35,18 +35,18 @@ export class UserAccountPageComponent implements OnDestroy, OnInit {
{ {
iconName: 'settings-outline', iconName: 'settings-outline',
label: $localize`Settings`, label: $localize`Settings`,
path: ['/' + paths.account] path: ['/' + routes.account]
}, },
{ {
iconName: 'diamond-outline', iconName: 'diamond-outline',
label: $localize`Membership`, label: $localize`Membership`,
path: ['/' + paths.account, paths.membership], path: ['/' + routes.account, routes.membership],
showCondition: !!this.user?.subscription showCondition: !!this.user?.subscription
}, },
{ {
iconName: 'key-outline', iconName: 'key-outline',
label: $localize`Access`, label: $localize`Access`,
path: ['/' + paths.account, paths.access] path: ['/' + routes.account, routes.access]
} }
]; ];

15
apps/client/src/app/pages/zen/zen-page-routing.module.ts

@ -1,7 +1,7 @@
import { HomeHoldingsComponent } from '@ghostfolio/client/components/home-holdings/home-holdings.component'; import { HomeHoldingsComponent } from '@ghostfolio/client/components/home-holdings/home-holdings.component';
import { HomeOverviewComponent } from '@ghostfolio/client/components/home-overview/home-overview.component'; import { HomeOverviewComponent } from '@ghostfolio/client/components/home-overview/home-overview.component';
import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { paths } from '@ghostfolio/common/paths'; import { internalRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
@ -12,12 +12,19 @@ const routes: Routes = [
{ {
canActivate: [AuthGuard], canActivate: [AuthGuard],
children: [ children: [
{ path: '', component: HomeOverviewComponent }, {
{ path: paths.holdings, component: HomeHoldingsComponent } path: '',
component: HomeOverviewComponent
},
{
path: internalRoutes.zen.subRoutes.holdings.path,
component: HomeHoldingsComponent,
title: internalRoutes.home.subRoutes.holdings.title
}
], ],
component: ZenPageComponent, component: ZenPageComponent,
path: '', path: '',
title: $localize`Overview` title: internalRoutes.zen.title
} }
]; ];

10
apps/client/src/app/pages/zen/zen-page.component.ts

@ -1,6 +1,6 @@
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths'; import { internalRoutes } from '@ghostfolio/common/routes';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
@ -33,13 +33,13 @@ export class ZenPageComponent implements OnDestroy, OnInit {
this.tabs = [ this.tabs = [
{ {
iconName: 'analytics-outline', iconName: 'analytics-outline',
label: $localize`Overview`, label: internalRoutes.zen.title,
path: ['/' + paths.zen] path: internalRoutes.zen.routerLink
}, },
{ {
iconName: 'wallet-outline', iconName: 'wallet-outline',
label: $localize`Holdings`, label: internalRoutes.zen.subRoutes.holdings.title,
path: ['/' + paths.zen, paths.holdings] path: internalRoutes.zen.subRoutes.holdings.routerLink
} }
]; ];
this.user = state.user; this.user = state.user;

69
libs/common/src/lib/paths.ts → libs/common/src/lib/routes.ts

@ -1,26 +1,20 @@
import '@angular/localize/init'; import '@angular/localize/init';
export const paths = { export const routes = {
access: 'access', access: 'access',
account: 'account', account: 'account',
accounts: 'accounts',
activities: 'activities',
adminControl: 'admin', adminControl: 'admin',
allocations: 'allocations', allocations: 'allocations',
api: 'api', api: 'api',
auth: 'auth', auth: 'auth',
blog: 'blog',
demo: 'demo', demo: 'demo',
fire: 'fire', fire: 'fire',
holdings: 'holdings',
home: 'home',
i18n: 'i18n', i18n: 'i18n',
jobs: 'jobs', jobs: 'jobs',
market: 'market', market: 'market',
marketData: 'market-data', marketData: 'market-data',
membership: 'membership', membership: 'membership',
personalFinanceTools: 'personal-finance-tools', personalFinanceTools: 'personal-finance-tools',
portfolio: 'portfolio',
public: 'p', public: 'p',
saas: 'saas', saas: 'saas',
settings: 'settings', settings: 'settings',
@ -30,10 +24,10 @@ export const paths = {
watchlist: 'watchlist', watchlist: 'watchlist',
webauthn: 'webauthn', webauthn: 'webauthn',
xRay: 'x-ray', xRay: 'x-ray',
zen: 'zen',
// Publicly accessible pages // Publicly accessible pages
about: $localize`:kebab-case:about`, about: $localize`:kebab-case:about`,
blog: 'blog',
changelog: $localize`:kebab-case:changelog`, changelog: $localize`:kebab-case:changelog`,
faq: $localize`:kebab-case:faq`, faq: $localize`:kebab-case:faq`,
features: $localize`:kebab-case:features`, features: $localize`:kebab-case:features`,
@ -42,12 +36,67 @@ export const paths = {
license: $localize`:kebab-case:license`, license: $localize`:kebab-case:license`,
markets: $localize`:kebab-case:markets`, markets: $localize`:kebab-case:markets`,
openSourceAlternativeTo: $localize`:kebab-case:open-source-alternative-to`, openSourceAlternativeTo: $localize`:kebab-case:open-source-alternative-to`,
openStartup: 'open',
ossFriends: 'oss-friends', ossFriends: 'oss-friends',
pricing: $localize`:kebab-case:pricing`, pricing: $localize`:kebab-case:pricing`,
privacyPolicy: $localize`:kebab-case:privacy-policy`, privacyPolicy: $localize`:kebab-case:privacy-policy`,
register: $localize`:kebab-case:register`,
resources: $localize`:kebab-case:resources`, resources: $localize`:kebab-case:resources`,
selfHosting: $localize`:kebab-case:self-hosting`, selfHosting: $localize`:kebab-case:self-hosting`,
termsOfService: $localize`:kebab-case:terms-of-service` termsOfService: $localize`:kebab-case:terms-of-service`
}; };
export const internalRoutes = {
accounts: {
path: 'accounts',
routerLink: ['/accounts'],
title: $localize`Accounts`
},
home: {
excludeFromAssistant: true,
path: 'home',
routerLink: ['/home'],
subRoutes: {
holdings: {
path: 'holdings',
routerLink: ['/home', 'holdings'],
title: $localize`Holdings`
}
},
title: $localize`Overview`
},
portfolio: {
path: 'portfolio',
routerLink: ['/portfolio'],
subRoutes: {
activities: {
path: 'activities',
routerLink: ['/portfolio', 'activities'],
title: $localize`Activities`
}
},
title: $localize`Portfolio`
},
zen: {
excludeFromAssistant: true,
path: 'zen',
routerLink: ['/zen'],
subRoutes: {
holdings: {
path: 'holdings',
routerLink: ['/zen', 'holdings'],
title: $localize`Holdings`
}
},
title: $localize`Overview`
}
};
export const publicRoutes = {
openStartup: {
path: 'open',
title: 'Open Startup'
},
register: {
path: $localize`:kebab-case:register`,
title: $localize`Registration`
}
};

4
libs/ui/src/lib/membership-card/membership-card.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { import {
@ -29,7 +29,7 @@ export class GfMembershipCardComponent {
@Output() generateApiKeyClicked = new EventEmitter<void>(); @Output() generateApiKeyClicked = new EventEmitter<void>();
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + routes.pricing];
public onGenerateApiKey(event: MouseEvent) { public onGenerateApiKey(event: MouseEvent) {
event.preventDefault(); event.preventDefault();

8
libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { internalRoutes } from '@ghostfolio/common/routes';
import { import {
CUSTOM_ELEMENTS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA,
@ -23,8 +23,6 @@ import { GfLogoComponent } from '../logo';
export class GfNoTransactionsInfoComponent { export class GfNoTransactionsInfoComponent {
@HostBinding('class.has-border') @Input() hasBorder = true; @HostBinding('class.has-border') @Input() hasBorder = true;
public routerLinkPortfolioActivities = [ public routerLinkPortfolioActivities =
'/' + paths.portfolio, internalRoutes.portfolio.subRoutes.activities.routerLink;
paths.activities
];
} }

4
libs/ui/src/lib/premium-indicator/premium-indicator.component.ts

@ -1,4 +1,4 @@
import { paths } from '@ghostfolio/common/paths'; import { routes } from '@ghostfolio/common/routes';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { import {
@ -20,5 +20,5 @@ import { RouterModule } from '@angular/router';
export class GfPremiumIndicatorComponent { export class GfPremiumIndicatorComponent {
@Input() enableLink = true; @Input() enableLink = true;
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + routes.pricing];
} }

Loading…
Cancel
Save