Browse Source

Feature/refactor router links (#4752)

* Refactor router links
pull/4753/head
Thomas Kaul 1 month ago
committed by GitHub
parent
commit
13b544c67d
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 4
      apps/client/src/app/app-routing.module.ts
  2. 4
      apps/client/src/app/app.component.html
  3. 2
      apps/client/src/app/app.component.ts
  4. 2
      apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html
  5. 5
      apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
  6. 42
      apps/client/src/app/components/header/header.component.html
  7. 5
      apps/client/src/app/components/header/header.component.ts
  8. 5
      apps/client/src/app/components/home-holdings/home-holdings.component.ts
  9. 2
      apps/client/src/app/components/home-holdings/home-holdings.html
  10. 7
      apps/client/src/app/components/home-overview/home-overview.component.ts
  11. 14
      apps/client/src/app/components/home-overview/home-overview.html
  12. 2
      apps/client/src/app/core/auth.guard.ts
  13. 2
      apps/client/src/app/pages/about/overview/about-overview-page.component.ts
  14. 6
      apps/client/src/app/pages/about/overview/about-overview-page.html
  15. 10
      apps/client/src/app/pages/admin/admin-page.component.ts
  16. 1
      apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts
  17. 2
      apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html
  18. 1
      apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts
  19. 2
      apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html
  20. 1
      apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts
  21. 2
      apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html
  22. 6
      apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component.ts
  23. 2
      apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html
  24. 1
      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
  25. 2
      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.html
  26. 1
      apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts
  27. 2
      apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html
  28. 6
      apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component.ts
  29. 2
      apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html
  30. 1
      apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts
  31. 2
      apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.html
  32. 6
      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
  33. 2
      apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.html
  34. 6
      apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component.ts
  35. 2
      apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.html
  36. 6
      apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component.ts
  37. 2
      apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.html
  38. 1
      apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts
  39. 2
      apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html
  40. 1
      apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts
  41. 2
      apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html
  42. 1
      apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts
  43. 2
      apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.html
  44. 1
      apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts
  45. 2
      apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.html
  46. 1
      apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts
  47. 2
      apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html
  48. 2
      apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts
  49. 12
      apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.html
  50. 1
      apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts
  51. 2
      apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.html
  52. 1
      apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component.ts
  53. 2
      apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.html
  54. 2
      apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component.ts
  55. 12
      apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.html
  56. 1
      apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts
  57. 2
      apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.html
  58. 2
      apps/client/src/app/pages/faq/saas/saas-page.component.ts
  59. 4
      apps/client/src/app/pages/faq/saas/saas-page.html
  60. 2
      apps/client/src/app/pages/landing/landing-page.component.ts
  61. 12
      apps/client/src/app/pages/landing/landing-page.html
  62. 4
      libs/common/src/lib/paths.ts
  63. 2
      libs/ui/src/lib/no-transactions-info/no-transactions-info.component.html
  64. 7
      libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts

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

@ -28,7 +28,7 @@ const routes: Routes = [
)
},
{
path: paths.admin,
path: paths.adminControl,
loadChildren: () =>
import('./pages/admin/admin-page.module').then((m) => m.AdminPageModule)
},
@ -95,7 +95,7 @@ const routes: Routes = [
)
},
{
path: paths.open,
path: paths.openStartup,
loadChildren: () =>
import('./pages/open/open-page.module').then((m) => m.OpenPageModule)
},

4
apps/client/src/app/app.component.html

@ -70,7 +70,7 @@
<li><a i18n [routerLink]="routerLinkAbout">About</a></li>
@if (hasPermissionForSubscription) {
<li>
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
}
<li>
@ -91,7 +91,7 @@
}
@if (hasPermissionForStatistics) {
<li>
<a [routerLink]="['/open']">Open Startup</a>
<a [routerLink]="routerLinkOpenStartup">Open Startup</a>
</li>
}
@if (hasPermissionForSubscription) {

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

@ -74,9 +74,11 @@ export class AppComponent implements OnDestroy, OnInit {
'/' + paths.about,
paths.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];

2
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html

@ -29,7 +29,7 @@
}}</mat-option>
}
@if (hasPermissionToAccessAdminControl) {
<mat-option [routerLink]="['/admin', 'market-data']">
<mat-option [routerLink]="routerLinkAdminControlMarketData">
<div class="align-items-center d-flex">
<ion-icon class="mr-2 text-muted" name="arrow-forward-outline" />
<span i18n>Manage Benchmarks</span>

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

@ -12,6 +12,7 @@ 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 { ColorScheme } from '@ghostfolio/common/types';
@ -63,6 +64,10 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy {
public chart: Chart<'line'>;
public hasPermissionToAccessAdminControl: boolean;
public routerLinkAdminControlMarketData = [
'/' + paths.adminControl,
paths.marketData
];
public constructor() {
Chart.register(

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

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

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

@ -80,14 +80,19 @@ 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];

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

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

2
apps/client/src/app/components/home-holdings/home-holdings.html

@ -58,7 +58,7 @@
class="mt-3"
i18n
mat-stroked-button
[routerLink]="['/portfolio', 'activities']"
[routerLink]="routerLinkPortfolioActivities"
>Manage Activities</a
>
</div>

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

@ -10,6 +10,7 @@ import {
PortfolioPerformance,
User
} from '@ghostfolio/common/interfaces';
import { paths } from '@ghostfolio/common/paths';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
@ -36,6 +37,12 @@ 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 showDetails = false;
public unit: string;
public user: User;

14
apps/client/src/app/components/home-overview/home-overview.html

@ -11,7 +11,7 @@
class="mb-2"
[ngClass]="{ 'text-muted': user?.accounts?.length > 1 }"
>
<a class="d-block" [routerLink]="['/accounts']"
<a class="d-block" [routerLink]="routerLinkAccounts"
><span i18n>Setup your accounts</span><br />
<span class="font-weight-normal" i18n
>Get a comprehensive financial overview by adding your bank and
@ -20,7 +20,7 @@
>
</li>
<li class="mb-2">
<a class="d-block" [routerLink]="['/portfolio', 'activities']">
<a class="d-block" [routerLink]="routerLinkPortfolioActivities">
<span i18n>Capture your activities</span><br />
<span class="font-weight-normal" i18n
>Record your investment activities to keep your portfolio up to
@ -29,7 +29,7 @@
>
</li>
<li class="mb-2">
<a class="d-block" [routerLink]="['/portfolio']">
<a class="d-block" [routerLink]="routerLinkPortfolio">
<span i18n>Monitor and analyze your portfolio</span><br />
<span class="font-weight-normal" i18n
>Track your progress in real-time with comprehensive analysis
@ -40,14 +40,18 @@
</ol>
<div class="d-flex justify-content-center">
@if (user?.accounts?.length === 1) {
<a color="primary" mat-flat-button [routerLink]="['/accounts']">
<a
color="primary"
mat-flat-button
[routerLink]="routerLinkAccounts"
>
<ng-container i18n>Setup accounts</ng-container>
</a>
} @else if (user?.accounts?.length > 1) {
<a
color="primary"
mat-flat-button
[routerLink]="['/portfolio', 'activities']"
[routerLink]="routerLinkPortfolioActivities"
>
<ng-container i18n>Add activity</ng-container>
</a>

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

@ -21,7 +21,7 @@ export class AuthGuard {
`/${paths.faq}`,
`/${paths.features}`,
`/${paths.markets}`,
`/${paths.open}`,
`/${paths.openStartup}`,
`/${paths.pricing}`,
`/${paths.public}`,
`/${paths.register}`,

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

@ -18,8 +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 user: User;
private unsubscribeSubject = new Subject<void>();

6
apps/client/src/app/pages/about/overview/about-overview-page.html

@ -23,7 +23,9 @@
>
@if (hasPermissionForStatistics) {
and we share aggregated
<a title="Open Startup" [routerLink]="['/open']">key metrics</a>
<a title="Open Startup" [routerLink]="routerLinkOpenStartup"
>key metrics</a
>
of the platform’s performance
}
. The project has been initiated by
@ -160,7 +162,7 @@
class="py-4 w-100"
color="primary"
mat-flat-button
[routerLink]="['/blog']"
[routerLink]="routerLinkBlog"
>Blog</a
>
</div>

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

@ -27,27 +27,27 @@ export class AdminPageComponent implements OnDestroy, OnInit {
{
iconName: 'reader-outline',
label: $localize`Overview`,
path: ['/' + paths.admin]
path: ['/' + paths.adminControl]
},
{
iconName: 'settings-outline',
label: $localize`Settings`,
path: ['/' + paths.admin, paths.settings]
path: ['/' + paths.adminControl, paths.settings]
},
{
iconName: 'server-outline',
label: $localize`Market Data`,
path: ['/' + paths.admin, paths.marketData]
path: ['/' + paths.adminControl, paths.marketData]
},
{
iconName: 'flash-outline',
label: $localize`Job Queue`,
path: ['/' + paths.admin, paths.jobs]
path: ['/' + paths.adminControl, paths.jobs]
},
{
iconName: 'people-outline',
label: $localize`Users`,
path: ['/' + paths.admin, paths.users]
path: ['/' + paths.adminControl, paths.users]
}
];
}

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

@ -11,6 +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];
}

2
apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html

@ -201,7 +201,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

@ -11,6 +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];
}

2
apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html

@ -181,7 +181,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

@ -11,5 +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];
}

2
apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html

@ -181,7 +181,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

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

2
apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html

@ -181,7 +181,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

1
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

@ -11,5 +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];
}

2
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.html

@ -206,7 +206,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

@ -11,6 +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];
}

2
apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html

@ -193,7 +193,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

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

2
apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html

@ -178,7 +178,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

@ -12,6 +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];
}

2
apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.html

@ -138,7 +138,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

6
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,3 +1,5 @@
import { paths } from '@ghostfolio/common/paths';
import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { RouterModule } from '@angular/router';
@ -8,4 +10,6 @@ import { RouterModule } from '@angular/router';
selector: 'gf-the-importance-of-tracking-your-personal-finances-page',
templateUrl: './the-importance-of-tracking-your-personal-finances-page.html'
})
export class TheImportanceOfTrackingYourPersonalFinancesPageComponent {}
export class TheImportanceOfTrackingYourPersonalFinancesPageComponent {
public routerLinkBlog = ['/' + paths.blog];
}

2
apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.html

@ -165,7 +165,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

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

2
apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.html

@ -175,7 +175,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

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

2
apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.html

@ -199,7 +199,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

@ -11,6 +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];
}

2
apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html

@ -250,7 +250,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

@ -11,6 +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];
}

2
apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html

@ -230,7 +230,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

@ -11,5 +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];
}

2
apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.html

@ -240,7 +240,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

@ -12,4 +12,5 @@ import { RouterModule } from '@angular/router';
})
export class GhostfolioJoinsOssFriendsPageComponent {
public routerLinkAboutOssFriends = ['/' + paths.about, paths.ossFriends];
public routerLinkBlog = ['/' + paths.blog];
}

2
apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.html

@ -151,7 +151,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

@ -13,6 +13,7 @@ import { RouterModule } from '@angular/router';
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];
}

2
apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html

@ -270,7 +270,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

@ -12,4 +12,6 @@ import { RouterModule } from '@angular/router';
})
export class Hacktoberfest2023PageComponent {
public routerLinkAbout = ['/' + paths.about];
public routerLinkBlog = ['/' + paths.blog];
public routerLinkOpenStartup = ['/' + paths.openStartup];
}

12
apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.html

@ -48,10 +48,12 @@
</p>
<p>
The software is used daily by a thriving global community. With over
<a [routerLink]="['/open']">2’600 stars on GitHub</a> and
<a [routerLink]="['/open']">300’000+ pulls on Docker Hub</a>,
Ghostfolio has gained widespread recognition for its user-friendly
experience and simplicity.
<a [routerLink]="routerLinkOpenStartup">2’600 stars on GitHub</a>
and
<a [routerLink]="routerLinkOpenStartup"
>300’000+ pulls on Docker Hub</a
>, Ghostfolio has gained widespread recognition for its
user-friendly experience and simplicity.
</p>
</section>
<section class="mb-4">
@ -178,7 +180,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

@ -12,6 +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];
}

2
apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.html

@ -145,7 +145,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

@ -12,5 +12,6 @@ import { RouterModule } from '@angular/router';
})
export class Hacktoberfest2023DebriefingPageComponent {
public routerLinkAbout = ['/' + paths.about];
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features];
}

2
apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.html

@ -267,7 +267,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

@ -12,4 +12,6 @@ import { RouterModule } from '@angular/router';
})
export class Hacktoberfest2024PageComponent {
public routerLinkAbout = ['/' + paths.about];
public routerLinkBlog = ['/' + paths.blog];
public routerLinkOpenStartup = ['/' + paths.openStartup];
}

12
apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.html

@ -51,10 +51,12 @@
<p>
The OSS project counting more than 100 contributors is used daily by
its growing global community. With over
<a [routerLink]="['/open']">4’000 stars on GitHub</a> and
<a [routerLink]="['/open']">800’000+ pulls on Docker Hub</a>,
Ghostfolio has gained widespread recognition for its user-friendly
experience and simplicity.
<a [routerLink]="routerLinkOpenStartup">4’000 stars on GitHub</a>
and
<a [routerLink]="routerLinkOpenStartup"
>800’000+ pulls on Docker Hub</a
>, Ghostfolio has gained widespread recognition for its
user-friendly experience and simplicity.
</p>
</section>
<section class="mb-4">
@ -184,7 +186,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

@ -12,6 +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];
}

2
apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.html

@ -164,7 +164,7 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"

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

@ -14,6 +14,8 @@ import { Subject, takeUntil } from 'rxjs';
})
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 user: User;

4
apps/client/src/app/pages/faq/saas/saas-page.html

@ -82,7 +82,7 @@
[enableLink]="false"
/></a>
by signing up for Ghostfolio and applying for a trial (see
<a [routerLink]="['/account', 'membership']">Membership</a>). It is
<a [routerLink]="routerLinkAccountMembership">Membership</a>). It is
easy, free and there is no commitment. You can stop using it at any
time.</mat-card-content
>
@ -158,7 +158,7 @@
</mat-card-header>
<mat-card-content
>It is suggested to regularly back up your data via
<a [routerLink]="['/account']">My Ghostfolio</a>
<a [routerLink]="routerLinkAccount">My Ghostfolio</a>
<i>Export Data</i>.</mat-card-content
>
</mat-card>

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

@ -26,6 +26,8 @@ export class LandingPageComponent implements OnDestroy, OnInit {
public hasPermissionForSubscription: boolean;
public hasPermissionToCreateUser: boolean;
public routerLinkAbout = ['/' + paths.about];
public routerLinkDemo = ['/' + paths.demo];
public routerLinkOpenStartup = ['/' + paths.openStartup];
public routerLinkRegister = ['/' + paths.register];
public statistics: Statistics;
public testimonials = [

12
apps/client/src/app/pages/landing/landing-page.html

@ -46,7 +46,7 @@
@if (hasPermissionToCreateUser) {
<div class="mx-3 text-muted" i18n>or</div>
}
<a i18n mat-stroked-button [routerLink]="['/demo']">Live Demo</a>
<a i18n mat-stroked-button [routerLink]="routerLinkDemo">Live Demo</a>
}
</div>
</div>
@ -60,7 +60,7 @@
<a
class="d-block"
title="Ghostfolio in Numbers: Monthly Active Users (MAU)"
[routerLink]="['/open']"
[routerLink]="routerLinkOpenStartup"
>
<gf-value
i18n
@ -78,7 +78,7 @@
<a
class="d-block"
title="Ghostfolio in Numbers: Stars on GitHub"
[routerLink]="['/open']"
[routerLink]="routerLinkOpenStartup"
>
<gf-value
i18n
@ -96,7 +96,7 @@
<a
class="d-block"
title="Ghostfolio in Numbers: Pulls on Docker Hub"
[routerLink]="['/open']"
[routerLink]="routerLinkOpenStartup"
>
<gf-value
i18n
@ -448,7 +448,9 @@
</a>
@if (hasPermissionForDemo) {
<div class="mx-3 text-muted" i18n>or</div>
<a i18n mat-stroked-button [routerLink]="['/demo']">Live Demo</a>
<a i18n mat-stroked-button [routerLink]="routerLinkDemo"
>Live Demo</a
>
}
</div>
</div>

4
libs/common/src/lib/paths.ts

@ -5,7 +5,7 @@ export const paths = {
account: 'account',
accounts: 'accounts',
activities: 'activities',
admin: 'admin',
adminControl: 'admin',
allocations: 'allocations',
api: 'api',
auth: 'auth',
@ -19,7 +19,6 @@ export const paths = {
market: 'market',
marketData: 'market-data',
membership: 'membership',
open: 'open',
personalFinanceTools: 'personal-finance-tools',
portfolio: 'portfolio',
public: 'p',
@ -43,6 +42,7 @@ export const paths = {
license: $localize`:kebab-case:license`,
markets: $localize`:kebab-case:markets`,
openSourceAlternativeTo: $localize`:kebab-case:open-source-alternative-to`,
openStartup: $localize`:kebab-case:open`,
ossFriends: $localize`:kebab-case:oss-friends`,
pricing: $localize`:kebab-case:pricing`,
privacyPolicy: $localize`:kebab-case:privacy-policy`,

2
libs/ui/src/lib/no-transactions-info/no-transactions-info.component.html

@ -7,7 +7,7 @@
color="primary"
mat-button
[queryParams]="{ createDialog: true }"
[routerLink]="['/portfolio', 'activities']"
[routerLink]="routerLinkPortfolioActivities"
>
<span i18n>Time to add your first activity.</span>
</a>

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

@ -1,3 +1,5 @@
import { paths } from '@ghostfolio/common/paths';
import {
CUSTOM_ELEMENTS_SCHEMA,
ChangeDetectionStrategy,
@ -20,4 +22,9 @@ import { GfLogoComponent } from '../logo';
})
export class GfNoTransactionsInfoComponent {
@HostBinding('class.has-border') @Input() hasBorder = true;
public routerLinkPortfolioActivities = [
'/' + paths.portfolio,
paths.activities
];
}

Loading…
Cancel
Save