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 { 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 { RouterModule, Routes, TitleStrategy } from '@angular/router';
@ -9,26 +13,26 @@ import { ModulePreloadService } from './core/module-preload.service';
const routes: Routes = [
{
path: paths.about,
path: ghostfolioRoutes.about,
loadChildren: () =>
import('./pages/about/about-page.module').then((m) => m.AboutPageModule)
},
{
path: paths.account,
path: ghostfolioRoutes.account,
loadChildren: () =>
import('./pages/user-account/user-account-page.module').then(
(m) => m.UserAccountPageModule
)
},
{
path: paths.accounts,
path: internalRoutes.accounts.path,
loadChildren: () =>
import('./pages/accounts/accounts-page.module').then(
(m) => m.AccountsPageModule
)
},
{
path: paths.adminControl,
path: ghostfolioRoutes.adminControl,
loadChildren: () =>
import('./pages/admin/admin-page.module').then((m) => m.AdminPageModule)
},
@ -38,16 +42,16 @@ const routes: Routes = [
import('./pages/api/api-page.component').then(
(c) => c.GfApiPageComponent
),
path: paths.api,
path: ghostfolioRoutes.api,
title: 'Ghostfolio API'
},
{
path: paths.auth,
path: ghostfolioRoutes.auth,
loadChildren: () =>
import('./pages/auth/auth-page.module').then((m) => m.AuthPageModule)
},
{
path: paths.blog,
path: ghostfolioRoutes.blog,
loadChildren: () =>
import('./pages/blog/blog-page.module').then((m) => m.BlogPageModule)
},
@ -57,10 +61,10 @@ const routes: Routes = [
import('./pages/demo/demo-page.component').then(
(c) => c.GfDemoPageComponent
),
path: paths.demo
path: ghostfolioRoutes.demo
},
{
path: paths.faq,
path: ghostfolioRoutes.faq,
loadChildren: () =>
import('./pages/faq/faq-page.module').then((m) => m.FaqPageModule)
},
@ -70,11 +74,11 @@ const routes: Routes = [
import('./pages/features/features-page.component').then(
(c) => c.GfFeaturesPageComponent
),
path: paths.features,
path: ghostfolioRoutes.features,
title: $localize`Features`
},
{
path: paths.home,
path: internalRoutes.home.path,
loadChildren: () =>
import('./pages/home/home-page.module').then((m) => m.HomePageModule)
},
@ -84,58 +88,58 @@ const routes: Routes = [
import('./pages/i18n/i18n-page.component').then(
(c) => c.GfI18nPageComponent
),
path: paths.i18n,
path: ghostfolioRoutes.i18n,
title: $localize`Internationalization`
},
{
path: paths.markets,
path: ghostfolioRoutes.markets,
loadChildren: () =>
import('./pages/markets/markets-page.module').then(
(m) => m.MarketsPageModule
)
},
{
path: paths.openStartup,
path: publicRoutes.openStartup.path,
loadChildren: () =>
import('./pages/open/open-page.module').then((m) => m.OpenPageModule)
},
{
path: paths.portfolio,
path: internalRoutes.portfolio.path,
loadChildren: () =>
import('./pages/portfolio/portfolio-page.module').then(
(m) => m.PortfolioPageModule
)
},
{
path: paths.pricing,
path: ghostfolioRoutes.pricing,
loadChildren: () =>
import('./pages/pricing/pricing-page.module').then(
(m) => m.PricingPageModule
)
},
{
path: paths.public,
path: ghostfolioRoutes.public,
loadChildren: () =>
import('./pages/public/public-page.module').then(
(m) => m.PublicPageModule
)
},
{
path: paths.register,
path: publicRoutes.register.path,
loadChildren: () =>
import('./pages/register/register-page.module').then(
(m) => m.RegisterPageModule
)
},
{
path: paths.resources,
path: ghostfolioRoutes.resources,
loadChildren: () =>
import('./pages/resources/resources-page.module').then(
(m) => m.ResourcesPageModule
)
},
{
path: paths.start,
path: ghostfolioRoutes.start,
loadChildren: () =>
import('./pages/landing/landing-page.module').then(
(m) => m.LandingPageModule
@ -146,11 +150,11 @@ const routes: Routes = [
import('./pages/webauthn/webauthn-page.component').then(
(c) => c.GfWebauthnPageComponent
),
path: paths.webauthn,
path: ghostfolioRoutes.webauthn,
title: $localize`Sign in`
},
{
path: paths.zen,
path: internalRoutes.zen.path,
loadChildren: () =>
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 { getCssVariable } from '@ghostfolio/common/helper';
import { InfoItem, User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes, routes } from '@ghostfolio/common/routes';
import { ColorScheme } from '@ghostfolio/common/types';
import { DOCUMENT } from '@angular/common';
@ -63,25 +63,25 @@ export class AppComponent implements OnDestroy, OnInit {
public hasTabs = false;
public info: InfoItem;
public pageTitle: string;
public routerLinkAbout = ['/' + paths.about];
public routerLinkAboutChangelog = ['/' + paths.about, paths.changelog];
public routerLinkAboutLicense = ['/' + paths.about, paths.license];
public routerLinkAbout = ['/' + routes.about];
public routerLinkAboutChangelog = ['/' + routes.about, routes.changelog];
public routerLinkAboutLicense = ['/' + routes.about, routes.license];
public routerLinkAboutPrivacyPolicy = [
'/' + paths.about,
paths.privacyPolicy
'/' + routes.about,
routes.privacyPolicy
];
public routerLinkAboutTermsOfService = [
'/' + paths.about,
paths.termsOfService
'/' + routes.about,
routes.termsOfService
];
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFaq = ['/' + paths.faq];
public routerLinkFeatures = ['/' + paths.features];
public routerLinkMarkets = ['/' + paths.markets];
public routerLinkOpenStartup = ['/' + paths.openStartup];
public routerLinkPricing = ['/' + paths.pricing];
public routerLinkRegister = ['/' + paths.register];
public routerLinkResources = ['/' + paths.resources];
public routerLinkBlog = ['/' + routes.blog];
public routerLinkFaq = ['/' + routes.faq];
public routerLinkFeatures = ['/' + routes.features];
public routerLinkMarkets = ['/' + routes.markets];
public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path];
public routerLinkPricing = ['/' + routes.pricing];
public routerLinkRegister = ['/' + publicRoutes.register.path];
public routerLinkResources = ['/' + routes.resources];
public showFooter = false;
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 { NotificationService } from '@ghostfolio/client/core/notification/notification.service';
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 {
@ -55,7 +55,7 @@ export class AccessTableComponent implements OnChanges {
public getPublicUrl(aId: string): string {
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 {

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

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

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

@ -10,7 +10,7 @@ import {
DataProviderInfo,
User
} from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { routes } from '@ghostfolio/common/routes';
import {
ChangeDetectionStrategy,
@ -72,7 +72,7 @@ export class AdminSettingsComponent implements OnDestroy, OnInit {
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();
}

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

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

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

@ -20,9 +20,9 @@
mat-flat-button
[ngClass]="{
'font-weight-bold':
currentRoute === paths.home || currentRoute === paths.zen,
currentRoute === routes.home || currentRoute === routes.zen,
'text-decoration-underline':
currentRoute === paths.home || currentRoute === paths.zen
currentRoute === routes.home || currentRoute === routes.zen
}"
[routerLink]="['/']"
>Overview</a
@ -34,8 +34,8 @@
i18n
mat-flat-button
[ngClass]="{
'font-weight-bold': currentRoute === paths.portfolio,
'text-decoration-underline': currentRoute === paths.portfolio
'font-weight-bold': currentRoute === routes.portfolio,
'text-decoration-underline': currentRoute === routes.portfolio
}"
[routerLink]="routerLinkPortfolio"
>Portfolio</a
@ -47,8 +47,8 @@
i18n
mat-flat-button
[ngClass]="{
'font-weight-bold': currentRoute === paths.accounts,
'text-decoration-underline': currentRoute === paths.accounts
'font-weight-bold': currentRoute === routes.accounts,
'text-decoration-underline': currentRoute === routes.accounts
}"
[routerLink]="routerLinkAccounts"
>Accounts</a
@ -61,8 +61,8 @@
i18n
mat-flat-button
[ngClass]="{
'font-weight-bold': currentRoute === paths.adminControl,
'text-decoration-underline': currentRoute === paths.adminControl
'font-weight-bold': currentRoute === routes.adminControl,
'text-decoration-underline': currentRoute === routes.adminControl
}"
[routerLink]="routerLinkAdminControl"
>Admin Control</a
@ -235,7 +235,7 @@
mat-menu-item
[ngClass]="{
'font-weight-bold':
currentRoute === paths.home || currentRoute === paths.zen
currentRoute === routes.home || currentRoute === routes.zen
}"
[routerLink]="['/']"
>Overview</a
@ -245,7 +245,7 @@
i18n
mat-menu-item
[ngClass]="{
'font-weight-bold': currentRoute === paths.portfolio
'font-weight-bold': currentRoute === routes.portfolio
}"
[routerLink]="routerLinkPortfolio"
>Portfolio</a
@ -254,14 +254,14 @@
class="d-flex d-sm-none"
i18n
mat-menu-item
[ngClass]="{ 'font-weight-bold': currentRoute === paths.accounts }"
[ngClass]="{ 'font-weight-bold': currentRoute === routes.accounts }"
[routerLink]="routerLinkAccounts"
>Accounts</a
>
<a
i18n
mat-menu-item
[ngClass]="{ 'font-weight-bold': currentRoute === paths.account }"
[ngClass]="{ 'font-weight-bold': currentRoute === routes.account }"
[routerLink]="routerLinkAccount"
>My Ghostfolio</a
>
@ -271,7 +271,7 @@
i18n
mat-menu-item
[ngClass]="{
'font-weight-bold': currentRoute === paths.adminControl
'font-weight-bold': currentRoute === routes.adminControl
}"
[routerLink]="routerLinkAdminControl"
>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 { UserService } from '@ghostfolio/client/services/user/user.service';
import { Filter, InfoItem, User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import {
internalRoutes,
publicRoutes,
routes
} from '@ghostfolio/common/routes';
import { DateRange } from '@ghostfolio/common/types';
import { GfAssistantComponent } from '@ghostfolio/ui/assistant/assistant.component';
@ -80,22 +84,22 @@ export class HeaderComponent implements OnChanges {
public hasPermissionToCreateUser: boolean;
public impersonationId: string;
public isMenuOpen: boolean;
public paths = paths;
public routeAbout = paths.about;
public routeFeatures = paths.features;
public routeMarkets = paths.markets;
public routePricing = paths.pricing;
public routeResources = paths.resources;
public routerLinkAbout = ['/' + paths.about];
public routerLinkAccount = ['/' + paths.account];
public routerLinkAccounts = ['/' + paths.accounts];
public routerLinkAdminControl = ['/' + paths.adminControl];
public routerLinkFeatures = ['/' + paths.features];
public routerLinkMarkets = ['/' + paths.markets];
public routerLinkPortfolio = ['/' + paths.portfolio];
public routerLinkPricing = ['/' + paths.pricing];
public routerLinkRegister = ['/' + paths.register];
public routerLinkResources = ['/' + paths.resources];
public routeAbout = routes.about;
public routeFeatures = routes.features;
public routeMarkets = routes.markets;
public routePricing = routes.pricing;
public routeResources = routes.resources;
public routes = routes;
public routerLinkAbout = ['/' + routes.about];
public routerLinkAccount = ['/' + routes.account];
public routerLinkAccounts = internalRoutes.accounts.routerLink;
public routerLinkAdminControl = ['/' + routes.adminControl];
public routerLinkFeatures = ['/' + routes.features];
public routerLinkMarkets = ['/' + routes.markets];
public routerLinkPortfolio = internalRoutes.portfolio.routerLink;
public routerLinkPricing = ['/' + routes.pricing];
public routerLinkRegister = ['/' + publicRoutes.register.path];
public routerLinkResources = ['/' + routes.resources];
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,
User
} from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes } from '@ghostfolio/common/routes';
import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table';
import { GfDataProviderCreditsComponent } from '@ghostfolio/ui/data-provider-credits';
import { GfHistoricalMarketDataEditorComponent } from '@ghostfolio/ui/historical-market-data-editor';
@ -470,9 +470,12 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
}
public onCloneActivity(aActivity: Activity) {
this.router.navigate(['/' + paths.portfolio, paths.activities], {
queryParams: { activityId: aActivity.id, createDialog: true }
});
this.router.navigate(
internalRoutes.portfolio.subRoutes.activities.routerLink,
{
queryParams: { activityId: aActivity.id, createDialog: true }
}
);
this.dialogRef.close();
}
@ -512,9 +515,12 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
}
public onUpdateActivity(aActivity: Activity) {
this.router.navigate(['/' + paths.portfolio, paths.activities], {
queryParams: { activityId: aActivity.id, editDialog: true }
});
this.router.navigate(
internalRoutes.portfolio.subRoutes.activities.routerLink,
{
queryParams: { activityId: aActivity.id, editDialog: true }
}
);
this.dialogRef.close();
}

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

@ -7,8 +7,8 @@ import {
ToggleOption,
User
} from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes } from '@ghostfolio/common/routes';
import { HoldingType, HoldingsViewMode } from '@ghostfolio/common/types';
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`Closed`, value: 'CLOSED' }
];
public routerLinkPortfolioActivities = [
'/' + paths.portfolio,
paths.activities
];
public routerLinkPortfolioActivities =
internalRoutes.portfolio.subRoutes.activities.routerLink;
public user: User;
public viewModeFormControl = new FormControl<HoldingsViewMode>(
HomeHoldingsComponent.DEFAULT_HOLDINGS_VIEW_MODE

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

@ -10,8 +10,8 @@ import {
PortfolioPerformance,
User
} from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes } from '@ghostfolio/common/routes';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { DeviceDetectorService } from 'ngx-device-detector';
@ -37,12 +37,10 @@ export class HomeOverviewComponent implements OnDestroy, OnInit {
public isLoadingPerformance = true;
public performance: PortfolioPerformance;
public precision = 2;
public routerLinkAccounts = ['/' + paths.accounts];
public routerLinkPortfolio = ['/' + paths.portfolio];
public routerLinkPortfolioActivities = [
'/' + paths.portfolio,
paths.activities
];
public routerLinkAccounts = internalRoutes.accounts.routerLink;
public routerLinkPortfolio = internalRoutes.portfolio.routerLink;
public routerLinkPortfolioActivities =
internalRoutes.portfolio.subRoutes.activities.routerLink;
public showDetails = false;
public unit: string;
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 {
ChangeDetectionStrategy,
@ -28,7 +28,7 @@ export class SubscriptionInterstitialDialog implements OnInit {
public remainingSkipButtonDelay =
SubscriptionInterstitialDialog.SKIP_BUTTON_DELAY_IN_SECONDS;
public routerLinkPricing = ['/' + paths.pricing];
public routerLinkPricing = ['/' + routes.pricing];
public variantIndex: number;
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 { getDateFormatString } from '@ghostfolio/common/helper';
import { User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { routes } from '@ghostfolio/common/routes';
import {
ChangeDetectionStrategy,
@ -37,7 +37,7 @@ export class UserAccountMembershipComponent implements OnDestroy {
public hasPermissionToUpdateUserSettings: boolean;
public price: number;
public priceId: string;
public routerLinkPricing = ['/' + paths.pricing];
public routerLinkPricing = ['/' + routes.pricing];
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';
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 { SettingsStorageService } from '@ghostfolio/client/services/settings-storage.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 {
@ -15,17 +19,17 @@ import { catchError } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class AuthGuard {
private static PUBLIC_PAGE_ROUTES = [
`/${paths.about}`,
`/${paths.blog}`,
`/${paths.demo}`,
`/${paths.faq}`,
`/${paths.features}`,
`/${paths.markets}`,
`/${paths.openStartup}`,
`/${paths.pricing}`,
`/${paths.public}`,
`/${paths.register}`,
`/${paths.resources}`
`/${routes.about}`,
`/${routes.blog}`,
`/${routes.demo}`,
`/${routes.faq}`,
`/${routes.features}`,
`/${routes.markets}`,
`/${publicRoutes.openStartup.path}`,
`/${routes.pricing}`,
`/${routes.public}`,
`/${publicRoutes.register.path}`,
`/${routes.resources}`
];
public constructor(
@ -48,10 +52,10 @@ export class AuthGuard {
.pipe(
catchError(() => {
if (utmSource === 'ios') {
this.router.navigate(['/' + paths.demo]);
this.router.navigate(['/' + routes.demo]);
resolve(false);
} else if (utmSource === 'trusted-web-activity') {
this.router.navigate(['/' + paths.register]);
this.router.navigate(['/' + publicRoutes.register.path]);
resolve(false);
} else if (
AuthGuard.PUBLIC_PAGE_ROUTES.some((publicPageRoute) => {
@ -62,7 +66,7 @@ export class AuthGuard {
resolve(true);
return EMPTY;
} else if (state.url !== '/start') {
this.router.navigate(['/' + paths.start]);
this.router.navigate(['/' + routes.start]);
resolve(false);
return EMPTY;
}
@ -88,26 +92,26 @@ export class AuthGuard {
resolve(true);
return;
} else if (
state.url.startsWith(`/${paths.home}`) &&
state.url.startsWith(`/${internalRoutes.home.path}`) &&
user.settings.viewMode === 'ZEN'
) {
this.router.navigate(['/' + paths.zen]);
this.router.navigate(internalRoutes.zen.routerLink);
resolve(false);
return;
} else if (state.url.startsWith(`/${paths.start}`)) {
} else if (state.url.startsWith(`/${routes.start}`)) {
if (user.settings.viewMode === 'ZEN') {
this.router.navigate(['/' + paths.zen]);
this.router.navigate(internalRoutes.zen.routerLink);
} else {
this.router.navigate(['/' + paths.home]);
this.router.navigate(internalRoutes.home.routerLink);
}
resolve(false);
return;
} else if (
state.url.startsWith(`/${paths.zen}`) &&
state.url.startsWith(`/${internalRoutes.zen.path}`) &&
user.settings.viewMode === 'DEFAULT'
) {
this.router.navigate(['/' + paths.home]);
this.router.navigate(internalRoutes.home.routerLink);
resolve(false);
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 { WebAuthnService } from '@ghostfolio/client/services/web-authn.service';
import { InfoItem } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { routes } from '@ghostfolio/common/routes';
import {
HTTP_INTERCEPTORS,
@ -75,7 +75,7 @@ export class HttpResponseInterceptor implements HttpInterceptor {
});
this.snackBarRef.onAction().subscribe(() => {
this.router.navigate(['/' + paths.pricing]);
this.router.navigate(['/' + routes.pricing]);
});
}
} else if (error.status === StatusCodes.INTERNAL_SERVER_ERROR) {
@ -111,7 +111,7 @@ export class HttpResponseInterceptor implements HttpInterceptor {
} else if (error.status === StatusCodes.UNAUTHORIZED) {
if (!error.url.includes('/data-providers/ghostfolio/status')) {
if (this.webAuthnService.isEnabled()) {
this.router.navigate(['/' + paths.webauthn]);
this.router.navigate(['/' + routes.webauthn]);
} else {
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 { paths } from '@ghostfolio/common/paths';
import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
@ -18,35 +18,35 @@ const routes: Routes = [
)
},
{
path: paths.changelog,
path: ghostfolioRoutes.changelog,
loadChildren: () =>
import('./changelog/changelog-page.module').then(
(m) => m.ChangelogPageModule
)
},
{
path: paths.license,
path: ghostfolioRoutes.license,
loadChildren: () =>
import('./license/license-page.module').then(
(m) => m.LicensePageModule
)
},
{
path: paths.ossFriends,
path: ghostfolioRoutes.ossFriends,
loadChildren: () =>
import('./oss-friends/oss-friends-page.module').then(
(m) => m.OpenSourceSoftwareFriendsPageModule
)
},
{
path: paths.privacyPolicy,
path: ghostfolioRoutes.privacyPolicy,
loadChildren: () =>
import('./privacy-policy/privacy-policy-page.module').then(
(m) => m.PrivacyPolicyPageModule
)
},
{
path: paths.termsOfService,
path: ghostfolioRoutes.termsOfService,
loadChildren: () =>
import('./terms-of-service/terms-of-service-page.module').then(
(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 { UserService } from '@ghostfolio/client/services/user/user.service';
import { TabConfiguration, User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { routes } from '@ghostfolio/common/routes';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { DeviceDetectorService } from 'ngx-device-detector';
@ -44,17 +44,17 @@ export class AboutPageComponent implements OnDestroy, OnInit {
{
iconName: 'information-circle-outline',
label: $localize`About`,
path: ['/' + paths.about]
path: ['/' + routes.about]
},
{
iconName: 'sparkles-outline',
label: $localize`Changelog`,
path: ['/' + paths.about, paths.changelog]
path: ['/' + routes.about, routes.changelog]
},
{
iconName: 'ribbon-outline',
label: $localize`License`,
path: ['/' + paths.about, paths.license],
path: ['/' + routes.about, routes.license],
showCondition: !this.hasPermissionForSubscription
}
];
@ -63,14 +63,14 @@ export class AboutPageComponent implements OnDestroy, OnInit {
this.tabs.push({
iconName: 'shield-checkmark-outline',
label: $localize`Privacy Policy`,
path: ['/' + paths.about, paths.privacyPolicy],
path: ['/' + routes.about, routes.privacyPolicy],
showCondition: this.hasPermissionForSubscription
});
this.tabs.push({
iconName: 'document-text-outline',
label: $localize`Terms of Service`,
path: ['/' + paths.about, paths.termsOfService],
path: ['/' + routes.about, routes.termsOfService],
showCondition: this.hasPermissionForSubscription
});
@ -82,7 +82,7 @@ export class AboutPageComponent implements OnDestroy, OnInit {
this.tabs.push({
iconName: 'happy-outline',
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 { UserService } from '@ghostfolio/client/services/user/user.service';
import { User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes, routes } from '@ghostfolio/common/routes';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { Subject } from 'rxjs';
@ -18,10 +18,10 @@ export class AboutOverviewPageComponent implements OnDestroy, OnInit {
public hasPermissionForStatistics: boolean;
public hasPermissionForSubscription: boolean;
public isLoggedIn: boolean;
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFaq = ['/' + paths.faq];
public routerLinkFeatures = ['/' + paths.features];
public routerLinkOpenStartup = ['/' + paths.openStartup];
public routerLinkBlog = ['/' + routes.blog];
public routerLinkFaq = ['/' + routes.faq];
public routerLinkFeatures = ['/' + routes.features];
public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path];
public user: User;
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 { internalRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
@ -10,7 +11,7 @@ const routes: Routes = [
canActivate: [AuthGuard],
component: AccountsPageComponent,
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 { AdminUsersComponent } from '@ghostfolio/client/components/admin-users/admin-users.component';
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 { RouterModule, Routes } from '@angular/router';
@ -21,22 +21,22 @@ const routes: Routes = [
title: $localize`Admin Control`
},
{
path: paths.jobs,
path: ghostfolioRoutes.jobs,
component: AdminJobsComponent,
title: $localize`Job Queue`
},
{
path: paths.marketData,
path: ghostfolioRoutes.marketData,
component: AdminMarketDataComponent,
title: $localize`Market Data`
},
{
path: paths.settings,
path: ghostfolioRoutes.settings,
component: AdminSettingsComponent,
title: $localize`Settings`
},
{
path: paths.users,
path: ghostfolioRoutes.users,
component: AdminUsersComponent,
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 { paths } from '@ghostfolio/common/paths';
import { routes } from '@ghostfolio/common/routes';
import { Component, OnDestroy, OnInit } from '@angular/core';
import { DeviceDetectorService } from 'ngx-device-detector';
@ -27,27 +27,27 @@ export class AdminPageComponent implements OnDestroy, OnInit {
{
iconName: 'reader-outline',
label: $localize`Overview`,
path: ['/' + paths.adminControl]
path: ['/' + routes.adminControl]
},
{
iconName: 'settings-outline',
label: $localize`Settings`,
path: ['/' + paths.adminControl, paths.settings]
path: ['/' + routes.adminControl, routes.settings]
},
{
iconName: 'server-outline',
label: $localize`Market Data`,
path: ['/' + paths.adminControl, paths.marketData]
path: ['/' + routes.adminControl, routes.marketData]
},
{
iconName: 'flash-outline',
label: $localize`Job Queue`,
path: ['/' + paths.adminControl, paths.jobs]
path: ['/' + routes.adminControl, routes.jobs]
},
{
iconName: 'people-outline',
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 { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './hallo-ghostfolio-page.html'
})
export class HalloGhostfolioPageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkPricing = ['/' + paths.pricing];
public routerLinkResources = ['/' + paths.resources];
public routerLinkBlog = ['/' + routes.blog];
public routerLinkPricing = ['/' + routes.pricing];
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 { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './hello-ghostfolio-page.html'
})
export class HelloGhostfolioPageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkPricing = ['/' + paths.pricing];
public routerLinkResources = ['/' + paths.resources];
public routerLinkBlog = ['/' + routes.blog];
public routerLinkPricing = ['/' + routes.pricing];
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 { MatButtonModule } from '@angular/material/button';
@ -11,6 +11,6 @@ import { RouterModule } from '@angular/router';
templateUrl: './first-months-in-open-source-page.html'
})
export class FirstMonthsInOpenSourcePageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkPricing = ['/' + paths.pricing];
public routerLinkBlog = ['/' + routes.blog];
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 { MatButtonModule } from '@angular/material/button';
@ -11,5 +11,5 @@ import { RouterModule } from '@angular/router';
templateUrl: './ghostfolio-meets-internet-identity-page.html'
})
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 { 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'
})
export class HowDoIGetMyFinancesInOrderPageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkResources = ['/' + paths.resources];
public routerLinkBlog = ['/' + routes.blog];
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 { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './500-stars-on-github-page.html'
})
export class FiveHundredStarsOnGitHubPageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkMarkets = ['/' + paths.markets];
public routerLinkPricing = ['/' + paths.pricing];
public routerLinkBlog = ['/' + routes.blog];
public routerLinkMarkets = ['/' + routes.markets];
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 { MatButtonModule } from '@angular/material/button';
@ -11,5 +11,5 @@ import { RouterModule } from '@angular/router';
templateUrl: './hacktoberfest-2022-page.html'
})
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 { Component } from '@angular/core';
@ -12,7 +12,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './black-friday-2022-page.html'
})
export class BlackFriday2022PageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features];
public routerLinkPricing = ['/' + paths.pricing];
public routerLinkBlog = ['/' + routes.blog];
public routerLinkFeatures = ['/' + routes.features];
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 { MatButtonModule } from '@angular/material/button';
@ -11,5 +11,5 @@ import { RouterModule } from '@angular/router';
templateUrl: './the-importance-of-tracking-your-personal-finances-page.html'
})
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 { MatButtonModule } from '@angular/material/button';
@ -11,5 +11,5 @@ import { RouterModule } from '@angular/router';
templateUrl: './ghostfolio-auf-sackgeld-vorgestellt-page.html'
})
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 { MatButtonModule } from '@angular/material/button';
@ -11,5 +11,5 @@ import { RouterModule } from '@angular/router';
templateUrl: './ghostfolio-meets-umbrel-page.html'
})
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 { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './1000-stars-on-github-page.html'
})
export class ThousandStarsOnGitHubPageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features];
public routerLinkPricing = ['/' + paths.pricing];
public routerLinkBlog = ['/' + routes.blog];
public routerLinkFeatures = ['/' + routes.features];
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 { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './unlock-your-financial-potential-with-ghostfolio-page.html'
})
export class UnlockYourFinancialPotentialWithGhostfolioPageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features];
public routerLinkResources = ['/' + paths.resources];
public routerLinkBlog = ['/' + routes.blog];
public routerLinkFeatures = ['/' + routes.features];
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 { MatButtonModule } from '@angular/material/button';
@ -11,6 +11,6 @@ import { RouterModule } from '@angular/router';
templateUrl: './exploring-the-path-to-fire-page.html'
})
export class ExploringThePathToFirePageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features];
public routerLinkBlog = ['/' + routes.blog];
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 { MatButtonModule } from '@angular/material/button';
@ -11,6 +11,6 @@ import { RouterModule } from '@angular/router';
templateUrl: './ghostfolio-joins-oss-friends-page.html'
})
export class GhostfolioJoinsOssFriendsPageComponent {
public routerLinkAboutOssFriends = ['/' + paths.about, paths.ossFriends];
public routerLinkBlog = ['/' + paths.blog];
public routerLinkAboutOssFriends = ['/' + routes.about, routes.ossFriends];
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 { MatButtonModule } from '@angular/material/button';
@ -11,9 +11,9 @@ import { RouterModule } from '@angular/router';
templateUrl: './ghostfolio-2-page.html'
})
export class Ghostfolio2PageComponent {
public routerLinkAbout = ['/' + paths.about];
public routerLinkAboutChangelog = ['/' + paths.about, paths.changelog];
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features];
public routerLinkMarkets = ['/' + paths.markets];
public routerLinkAbout = ['/' + routes.about];
public routerLinkAboutChangelog = ['/' + routes.about, routes.changelog];
public routerLinkBlog = ['/' + routes.blog];
public routerLinkFeatures = ['/' + routes.features];
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 { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './hacktoberfest-2023-page.html'
})
export class Hacktoberfest2023PageComponent {
public routerLinkAbout = ['/' + paths.about];
public routerLinkBlog = ['/' + paths.blog];
public routerLinkOpenStartup = ['/' + paths.openStartup];
public routerLinkAbout = ['/' + routes.about];
public routerLinkBlog = ['/' + routes.blog];
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 { Component } from '@angular/core';
@ -12,7 +12,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './black-week-2023-page.html'
})
export class BlackWeek2023PageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features];
public routerLinkPricing = ['/' + paths.pricing];
public routerLinkBlog = ['/' + routes.blog];
public routerLinkFeatures = ['/' + routes.features];
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 { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './hacktoberfest-2023-debriefing-page.html'
})
export class Hacktoberfest2023DebriefingPageComponent {
public routerLinkAbout = ['/' + paths.about];
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features];
public routerLinkAbout = ['/' + routes.about];
public routerLinkBlog = ['/' + routes.blog];
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 { MatButtonModule } from '@angular/material/button';
@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './hacktoberfest-2024-page.html'
})
export class Hacktoberfest2024PageComponent {
public routerLinkAbout = ['/' + paths.about];
public routerLinkBlog = ['/' + paths.blog];
public routerLinkOpenStartup = ['/' + paths.openStartup];
public routerLinkAbout = ['/' + routes.about];
public routerLinkBlog = ['/' + routes.blog];
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 { Component } from '@angular/core';
@ -12,7 +12,7 @@ import { RouterModule } from '@angular/router';
templateUrl: './black-weeks-2024-page.html'
})
export class BlackWeeks2024PageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features];
public routerLinkPricing = ['/' + paths.pricing];
public routerLinkBlog = ['/' + routes.blog];
public routerLinkFeatures = ['/' + routes.features];
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 { paths } from '@ghostfolio/common/paths';
import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
@ -18,12 +18,12 @@ const routes: Routes = [
)
},
{
path: paths.saas,
path: ghostfolioRoutes.saas,
loadChildren: () =>
import('./saas/saas-page.module').then((m) => m.SaasPageModule)
},
{
path: paths.selfHosting,
path: ghostfolioRoutes.selfHosting,
loadChildren: () =>
import('./self-hosting/self-hosting-page.module').then(
(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 { TabConfiguration } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { routes } from '@ghostfolio/common/routes';
import { Component, OnDestroy, OnInit } from '@angular/core';
import { DeviceDetectorService } from 'ngx-device-detector';
@ -36,18 +36,18 @@ export class FaqPageComponent implements OnDestroy, OnInit {
{
iconName: 'reader-outline',
label: $localize`General`,
path: ['/' + paths.faq]
path: ['/' + routes.faq]
},
{
iconName: 'cloudy-outline',
label: $localize`Cloud` + ' (SaaS)',
path: ['/' + paths.faq, paths.saas],
path: ['/' + routes.faq, routes.saas],
showCondition: this.hasPermissionForSubscription
},
{
iconName: 'server-outline',
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 { 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 { Subject, takeUntil } from 'rxjs';
@ -13,8 +13,8 @@ import { Subject, takeUntil } from 'rxjs';
standalone: false
})
export class FaqOverviewPageComponent implements OnDestroy {
public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${paths.pricing}`;
public routerLinkFeatures = ['/' + paths.features];
public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${routes.pricing}`;
public routerLinkFeatures = ['/' + routes.features];
public user: User;
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 { 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 { Subject, takeUntil } from 'rxjs';
@ -13,11 +13,14 @@ import { Subject, takeUntil } from 'rxjs';
standalone: false
})
export class SaasPageComponent implements OnDestroy {
public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${paths.pricing}`;
public routerLinkAccount = ['/' + paths.account];
public routerLinkAccountMembership = ['/' + paths.account, paths.membership];
public routerLinkMarkets = ['/' + paths.markets];
public routerLinkRegister = ['/' + paths.register];
public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${routes.pricing}`;
public routerLinkAccount = ['/' + routes.account];
public routerLinkAccountMembership = [
'/' + routes.account,
routes.membership
];
public routerLinkMarkets = ['/' + routes.markets];
public routerLinkRegister = ['/' + publicRoutes.register.path];
public user: User;
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 { Subject } from 'rxjs';
@ -11,7 +11,7 @@ import { Subject } from 'rxjs';
standalone: false
})
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>();

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

@ -1,8 +1,8 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { InfoItem, User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes, routes } from '@ghostfolio/common/routes';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core';
@ -26,8 +26,8 @@ import { Subject, takeUntil } from 'rxjs';
export class GfFeaturesPageComponent implements OnDestroy {
public hasPermissionForSubscription: boolean;
public info: InfoItem;
public routerLinkRegister = ['/' + paths.register];
public routerLinkResources = ['/' + paths.resources];
public routerLinkRegister = ['/' + publicRoutes.register.path];
public routerLinkResources = ['/' + routes.resources];
public user: User;
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 { HomeWatchlistComponent } from '@ghostfolio/client/components/home-watchlist/home-watchlist.component';
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 { RouterModule, Routes } from '@angular/router';
@ -20,28 +23,29 @@ const routes: Routes = [
component: HomeOverviewComponent
},
{
path: paths.holdings,
path: internalRoutes.home.subRoutes.holdings.path,
component: HomeHoldingsComponent,
title: $localize`Holdings`
title: internalRoutes.home.subRoutes.holdings.title
},
{
path: paths.summary,
path: ghostfolioRoutes.summary,
component: HomeSummaryComponent,
title: $localize`Summary`
},
{
path: paths.market,
path: ghostfolioRoutes.market,
component: HomeMarketComponent,
title: $localize`Markets`
},
{
path: paths.watchlist,
path: ghostfolioRoutes.watchlist,
component: HomeWatchlistComponent,
title: $localize`Watchlist`
}
],
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 { UserService } from '@ghostfolio/client/services/user/user.service';
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 { DeviceDetectorService } from 'ngx-device-detector';
@ -36,28 +36,28 @@ export class HomePageComponent implements OnDestroy, OnInit {
this.tabs = [
{
iconName: 'analytics-outline',
label: $localize`Overview`,
path: ['/' + paths.home]
label: internalRoutes.home.title,
path: internalRoutes.home.routerLink
},
{
iconName: 'wallet-outline',
label: $localize`Holdings`,
path: ['/' + paths.home, paths.holdings]
label: internalRoutes.home.subRoutes.holdings.title,
path: internalRoutes.home.subRoutes.holdings.routerLink
},
{
iconName: 'reader-outline',
label: $localize`Summary`,
path: ['/' + paths.home, paths.summary]
path: ['/' + internalRoutes.home.path, routes.summary]
},
{
iconName: 'bookmark-outline',
label: $localize`Watchlist`,
path: ['/' + paths.home, paths.watchlist]
path: ['/' + internalRoutes.home.path, routes.watchlist]
},
{
iconName: 'newspaper-outline',
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 { Statistics } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes, routes } from '@ghostfolio/common/routes';
import { Component, OnDestroy, OnInit } from '@angular/core';
import { format } from 'date-fns';
@ -25,10 +25,10 @@ export class LandingPageComponent implements OnDestroy, OnInit {
public hasPermissionForStatistics: boolean;
public hasPermissionForSubscription: boolean;
public hasPermissionToCreateUser: boolean;
public routerLinkAbout = ['/' + paths.about];
public routerLinkDemo = ['/' + paths.demo];
public routerLinkOpenStartup = ['/' + paths.openStartup];
public routerLinkRegister = ['/' + paths.register];
public routerLinkAbout = ['/' + routes.about];
public routerLinkDemo = ['/' + routes.demo];
public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path];
public routerLinkRegister = ['/' + publicRoutes.register.path];
public statistics: Statistics;
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 { publicRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
@ -10,7 +11,7 @@ const routes: Routes = [
canActivate: [AuthGuard],
component: OpenPageComponent,
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 { internalRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
@ -10,7 +11,7 @@ const routes: Routes = [
canActivate: [AuthGuard],
component: ActivitiesPageComponent,
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 { paths } from '@ghostfolio/common/paths';
import {
routes as ghostfolioRoutes,
internalRoutes
} from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
@ -18,33 +21,33 @@ const routes: Routes = [
)
},
{
path: paths.activities,
path: internalRoutes.portfolio.subRoutes.activities.path,
loadChildren: () =>
import('./activities/activities-page.module').then(
(m) => m.ActivitiesPageModule
)
},
{
path: paths.allocations,
path: ghostfolioRoutes.allocations,
loadChildren: () =>
import('./allocations/allocations-page.module').then(
(m) => m.AllocationsPageModule
)
},
{
path: paths.fire,
path: ghostfolioRoutes.fire,
loadChildren: () =>
import('./fire/fire-page.module').then((m) => m.FirePageModule)
},
{
path: paths.xRay,
path: ghostfolioRoutes.xRay,
loadChildren: () =>
import('./x-ray/x-ray-page.module').then((m) => m.XRayPageModule)
}
],
component: PortfolioPageComponent,
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 { 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 { DeviceDetectorService } from 'ngx-device-detector';
@ -34,27 +34,27 @@ export class PortfolioPageComponent implements OnDestroy, OnInit {
{
iconName: 'analytics-outline',
label: $localize`Analysis`,
path: ['/' + paths.portfolio]
path: internalRoutes.portfolio.routerLink
},
{
iconName: 'swap-vertical-outline',
label: $localize`Activities`,
path: ['/' + paths.portfolio, paths.activities]
label: internalRoutes.portfolio.subRoutes.activities.title,
path: internalRoutes.portfolio.subRoutes.activities.routerLink
},
{
iconName: 'pie-chart-outline',
label: $localize`Allocations`,
path: ['/' + paths.portfolio, paths.allocations]
path: ['/' + internalRoutes.portfolio.path, routes.allocations]
},
{
iconName: 'calculator-outline',
label: 'FIRE ',
path: ['/' + paths.portfolio, paths.fire]
path: ['/' + internalRoutes.portfolio.path, routes.fire]
},
{
iconName: 'scan-outline',
label: 'X-ray',
path: ['/' + paths.portfolio, paths.xRay]
path: ['/' + internalRoutes.portfolio.path, routes.xRay]
}
];
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 { UserService } from '@ghostfolio/client/services/user/user.service';
import { User } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes, routes } from '@ghostfolio/common/routes';
import { translate } from '@ghostfolio/ui/i18n';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
@ -41,8 +41,8 @@ export class PricingPageComponent implements OnDestroy, OnInit {
public professionalDataProviderTooltipPremium = translate(
'PROFESSIONAL_DATA_PROVIDER_TOOLTIP_PREMIUM'
);
public routerLinkFeatures = ['/' + paths.features];
public routerLinkRegister = ['/' + paths.register];
public routerLinkFeatures = ['/' + routes.features];
public routerLinkRegister = ['/' + publicRoutes.register.path];
public user: User;
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 { publicRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
@ -10,7 +11,7 @@ const routes: Routes = [
canActivate: [AuthGuard],
component: RegisterPageComponent,
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 { paths } from '@ghostfolio/common/paths';
import { routes } from '@ghostfolio/common/routes';
import {
ChangeDetectionStrategy,
@ -31,8 +31,8 @@ export class ShowAccessTokenDialog {
public isDisclaimerChecked = false;
public role: string;
public routerLinkAboutTermsOfService = [
'/' + paths.about,
paths.termsOfService
'/' + routes.about,
routes.termsOfService
];
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 { InfoItem } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { routes } from '@ghostfolio/common/routes';
import { Component, OnInit } from '@angular/core';
@ -15,8 +15,8 @@ export class ResourcesGlossaryPageComponent implements OnInit {
public hasPermissionForSubscription: boolean;
public info: InfoItem;
public routerLinkResourcesPersonalFinanceTools = [
'/' + paths.resources,
paths.personalFinanceTools
'/' + routes.resources,
routes.personalFinanceTools
];
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';
@ -14,25 +14,25 @@ export class ResourcesOverviewComponent {
title: 'Frequently Asked Questions (FAQ)',
description:
'Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section.',
link: ['/' + paths.faq]
link: ['/' + routes.faq]
},
{
title: 'Guides',
description:
'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',
description:
'Access various market resources and tools to stay informed about financial markets.',
link: ['/' + paths.resources, paths.markets]
link: ['/' + routes.resources, routes.markets]
},
{
title: 'Glossary',
description:
'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 { paths } from '@ghostfolio/common/paths';
import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools';
import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
@ -24,7 +24,7 @@ const routes: Routes = [
return GfProductPageComponent;
}
),
path: `${paths.openSourceAlternativeTo}-${alias ?? key}`,
path: `${ghostfolioRoutes.openSourceAlternativeTo}-${alias ?? key}`,
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 { routes } from '@ghostfolio/common/routes';
import { Component, OnDestroy } from '@angular/core';
import { Subject } from 'rxjs';
@ -12,12 +12,12 @@ import { Subject } from 'rxjs';
standalone: false
})
export class PersonalFinanceToolsPageComponent implements OnDestroy {
public pathAlternativeTo = paths.openSourceAlternativeTo + '-';
public pathResources = '/' + paths.resources;
public pathAlternativeTo = routes.openSourceAlternativeTo + '-';
public pathResources = '/' + routes.resources;
public personalFinanceTools = personalFinanceTools.sort((a, b) => {
return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' });
});
public routerLinkAbout = ['/' + paths.about];
public routerLinkAbout = ['/' + routes.about];
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 { Product } from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools';
import { routes } from '@ghostfolio/common/routes';
import { translate } from '@ghostfolio/ui/i18n';
import { Component, OnInit } from '@angular/core';
@ -20,11 +20,11 @@ export class GfProductPageComponent implements OnInit {
public price: number;
public product1: Product;
public product2: Product;
public routerLinkAbout = ['/' + paths.about];
public routerLinkFeatures = ['/' + paths.features];
public routerLinkAbout = ['/' + routes.about];
public routerLinkFeatures = ['/' + routes.features];
public routerLinkResourcesPersonalFinanceTools = [
'/' + paths.resources,
paths.personalFinanceTools
'/' + routes.resources,
routes.personalFinanceTools
];
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 { paths } from '@ghostfolio/common/paths';
import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes';
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
@ -19,27 +19,27 @@ const routes: Routes = [
)
},
{
path: paths.glossary,
path: ghostfolioRoutes.glossary,
loadChildren: () =>
import('./glossary/resources-glossary.module').then(
(m) => m.ResourcesGlossaryPageModule
)
},
{
path: paths.guides,
path: ghostfolioRoutes.guides,
loadChildren: () =>
import('./guides/resources-guides.module').then(
(m) => m.ResourcesGuidesModule
)
},
{
path: paths.markets,
path: ghostfolioRoutes.markets,
loadChildren: () =>
import('./markets/resources-markets.module').then(
(m) => m.ResourcesMarketsModule
)
},
...[paths.personalFinanceTools].map((path) => ({
...[ghostfolioRoutes.personalFinanceTools].map((path) => ({
path,
loadChildren: () =>
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 { DeviceDetectorService } from 'ngx-device-detector';
@ -20,17 +20,17 @@ export class ResourcesPageComponent implements OnInit {
iconName: 'reader-outline'
},
{
path: paths.guides,
path: routes.guides,
label: $localize`Guides`,
iconName: 'book-outline'
},
{
path: paths.markets,
path: routes.markets,
label: $localize`Markets`,
iconName: 'newspaper-outline'
},
{
path: paths.glossary,
path: routes.glossary,
label: $localize`Glossary`,
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 { UserAccountSettingsComponent } from '@ghostfolio/client/components/user-account-settings/user-account-settings.component';
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 { RouterModule, Routes } from '@angular/router';
@ -19,12 +19,12 @@ const routes: Routes = [
title: $localize`Settings`
},
{
path: paths.membership,
path: ghostfolioRoutes.membership,
component: UserAccountMembershipComponent,
title: $localize`Membership`
},
{
path: paths.access,
path: ghostfolioRoutes.access,
component: UserAccountAccessComponent,
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 { 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 { DeviceDetectorService } from 'ngx-device-detector';
@ -35,18 +35,18 @@ export class UserAccountPageComponent implements OnDestroy, OnInit {
{
iconName: 'settings-outline',
label: $localize`Settings`,
path: ['/' + paths.account]
path: ['/' + routes.account]
},
{
iconName: 'diamond-outline',
label: $localize`Membership`,
path: ['/' + paths.account, paths.membership],
path: ['/' + routes.account, routes.membership],
showCondition: !!this.user?.subscription
},
{
iconName: 'key-outline',
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 { HomeOverviewComponent } from '@ghostfolio/client/components/home-overview/home-overview.component';
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 { RouterModule, Routes } from '@angular/router';
@ -12,12 +12,19 @@ const routes: Routes = [
{
canActivate: [AuthGuard],
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,
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 { 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 { DeviceDetectorService } from 'ngx-device-detector';
@ -33,13 +33,13 @@ export class ZenPageComponent implements OnDestroy, OnInit {
this.tabs = [
{
iconName: 'analytics-outline',
label: $localize`Overview`,
path: ['/' + paths.zen]
label: internalRoutes.zen.title,
path: internalRoutes.zen.routerLink
},
{
iconName: 'wallet-outline',
label: $localize`Holdings`,
path: ['/' + paths.zen, paths.holdings]
label: internalRoutes.zen.subRoutes.holdings.title,
path: internalRoutes.zen.subRoutes.holdings.routerLink
}
];
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';
export const paths = {
export const routes = {
access: 'access',
account: 'account',
accounts: 'accounts',
activities: 'activities',
adminControl: 'admin',
allocations: 'allocations',
api: 'api',
auth: 'auth',
blog: 'blog',
demo: 'demo',
fire: 'fire',
holdings: 'holdings',
home: 'home',
i18n: 'i18n',
jobs: 'jobs',
market: 'market',
marketData: 'market-data',
membership: 'membership',
personalFinanceTools: 'personal-finance-tools',
portfolio: 'portfolio',
public: 'p',
saas: 'saas',
settings: 'settings',
@ -30,10 +24,10 @@ export const paths = {
watchlist: 'watchlist',
webauthn: 'webauthn',
xRay: 'x-ray',
zen: 'zen',
// Publicly accessible pages
about: $localize`:kebab-case:about`,
blog: 'blog',
changelog: $localize`:kebab-case:changelog`,
faq: $localize`:kebab-case:faq`,
features: $localize`:kebab-case:features`,
@ -42,12 +36,67 @@ export const paths = {
license: $localize`:kebab-case:license`,
markets: $localize`:kebab-case:markets`,
openSourceAlternativeTo: $localize`:kebab-case:open-source-alternative-to`,
openStartup: 'open',
ossFriends: 'oss-friends',
pricing: $localize`:kebab-case:pricing`,
privacyPolicy: $localize`:kebab-case:privacy-policy`,
register: $localize`:kebab-case:register`,
resources: $localize`:kebab-case:resources`,
selfHosting: $localize`:kebab-case:self-hosting`,
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 {
@ -29,7 +29,7 @@ export class GfMembershipCardComponent {
@Output() generateApiKeyClicked = new EventEmitter<void>();
public routerLinkPricing = ['/' + paths.pricing];
public routerLinkPricing = ['/' + routes.pricing];
public onGenerateApiKey(event: MouseEvent) {
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 {
CUSTOM_ELEMENTS_SCHEMA,
@ -23,8 +23,6 @@ import { GfLogoComponent } from '../logo';
export class GfNoTransactionsInfoComponent {
@HostBinding('class.has-border') @Input() hasBorder = true;
public routerLinkPortfolioActivities = [
'/' + paths.portfolio,
paths.activities
];
public routerLinkPortfolioActivities =
internalRoutes.portfolio.subRoutes.activities.routerLink;
}

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 {
@ -20,5 +20,5 @@ import { RouterModule } from '@angular/router';
export class GfPremiumIndicatorComponent {
@Input() enableLink = true;
public routerLinkPricing = ['/' + paths.pricing];
public routerLinkPricing = ['/' + routes.pricing];
}

Loading…
Cancel
Save