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: () => loadChildren: () =>
import('./pages/admin/admin-page.module').then((m) => m.AdminPageModule) import('./pages/admin/admin-page.module').then((m) => m.AdminPageModule)
}, },
@ -95,7 +95,7 @@ const routes: Routes = [
) )
}, },
{ {
path: paths.open, path: paths.openStartup,
loadChildren: () => loadChildren: () =>
import('./pages/open/open-page.module').then((m) => m.OpenPageModule) 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> <li><a i18n [routerLink]="routerLinkAbout">About</a></li>
@if (hasPermissionForSubscription) { @if (hasPermissionForSubscription) {
<li> <li>
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
} }
<li> <li>
@ -91,7 +91,7 @@
} }
@if (hasPermissionForStatistics) { @if (hasPermissionForStatistics) {
<li> <li>
<a [routerLink]="['/open']">Open Startup</a> <a [routerLink]="routerLinkOpenStartup">Open Startup</a>
</li> </li>
} }
@if (hasPermissionForSubscription) { @if (hasPermissionForSubscription) {

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

@ -74,9 +74,11 @@ export class AppComponent implements OnDestroy, OnInit {
'/' + paths.about, '/' + paths.about,
paths.termsOfService paths.termsOfService
]; ];
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFaq = ['/' + paths.faq]; public routerLinkFaq = ['/' + paths.faq];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + paths.features];
public routerLinkMarkets = ['/' + paths.markets]; public routerLinkMarkets = ['/' + paths.markets];
public routerLinkOpenStartup = ['/' + paths.openStartup];
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + paths.pricing];
public routerLinkRegister = ['/' + paths.register]; public routerLinkRegister = ['/' + paths.register];
public routerLinkResources = ['/' + paths.resources]; public routerLinkResources = ['/' + paths.resources];

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

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

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

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

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

@ -20,9 +20,9 @@
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
'font-weight-bold': 'font-weight-bold':
currentRoute === 'home' || currentRoute === 'zen', currentRoute === paths.home || currentRoute === paths.zen,
'text-decoration-underline': 'text-decoration-underline':
currentRoute === 'home' || currentRoute === 'zen' currentRoute === paths.home || currentRoute === paths.zen
}" }"
[routerLink]="['/']" [routerLink]="['/']"
>Overview</a >Overview</a
@ -34,10 +34,10 @@
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
'font-weight-bold': currentRoute === 'portfolio', 'font-weight-bold': currentRoute === paths.portfolio,
'text-decoration-underline': currentRoute === 'portfolio' 'text-decoration-underline': currentRoute === paths.portfolio
}" }"
[routerLink]="['/portfolio']" [routerLink]="routerLinkPortfolio"
>Portfolio</a >Portfolio</a
> >
</li> </li>
@ -47,10 +47,10 @@
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
'font-weight-bold': currentRoute === 'accounts', 'font-weight-bold': currentRoute === paths.accounts,
'text-decoration-underline': currentRoute === 'accounts' 'text-decoration-underline': currentRoute === paths.accounts
}" }"
[routerLink]="['/accounts']" [routerLink]="routerLinkAccounts"
>Accounts</a >Accounts</a
> >
</li> </li>
@ -61,10 +61,10 @@
i18n i18n
mat-flat-button mat-flat-button
[ngClass]="{ [ngClass]="{
'font-weight-bold': currentRoute === 'admin', 'font-weight-bold': currentRoute === paths.adminControl,
'text-decoration-underline': currentRoute === 'admin' 'text-decoration-underline': currentRoute === paths.adminControl
}" }"
[routerLink]="['/admin']" [routerLink]="routerLinkAdminControl"
>Admin Control</a >Admin Control</a
> >
</li> </li>
@ -235,7 +235,7 @@
mat-menu-item mat-menu-item
[ngClass]="{ [ngClass]="{
'font-weight-bold': 'font-weight-bold':
currentRoute === 'home' || currentRoute === 'zen' currentRoute === paths.home || currentRoute === paths.zen
}" }"
[routerLink]="['/']" [routerLink]="['/']"
>Overview</a >Overview</a
@ -245,24 +245,24 @@
i18n i18n
mat-menu-item mat-menu-item
[ngClass]="{ [ngClass]="{
'font-weight-bold': currentRoute === 'portfolio' 'font-weight-bold': currentRoute === paths.portfolio
}" }"
[routerLink]="['/portfolio']" [routerLink]="routerLinkPortfolio"
>Portfolio</a >Portfolio</a
> >
<a <a
class="d-flex d-sm-none" class="d-flex d-sm-none"
i18n i18n
mat-menu-item mat-menu-item
[ngClass]="{ 'font-weight-bold': currentRoute === 'accounts' }" [ngClass]="{ 'font-weight-bold': currentRoute === paths.accounts }"
[routerLink]="['/accounts']" [routerLink]="routerLinkAccounts"
>Accounts</a >Accounts</a
> >
<a <a
i18n i18n
mat-menu-item mat-menu-item
[ngClass]="{ 'font-weight-bold': currentRoute === 'account' }" [ngClass]="{ 'font-weight-bold': currentRoute === paths.account }"
[routerLink]="['/account']" [routerLink]="routerLinkAccount"
>My Ghostfolio</a >My Ghostfolio</a
> >
@if (hasPermissionToAccessAdminControl) { @if (hasPermissionToAccessAdminControl) {
@ -270,8 +270,10 @@
class="d-flex d-sm-none" class="d-flex d-sm-none"
i18n i18n
mat-menu-item mat-menu-item
[ngClass]="{ 'font-weight-bold': currentRoute === 'admin' }" [ngClass]="{
[routerLink]="['/admin']" 'font-weight-bold': currentRoute === paths.adminControl
}"
[routerLink]="routerLinkAdminControl"
>Admin Control</a >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 hasPermissionToCreateUser: boolean;
public impersonationId: string; public impersonationId: string;
public isMenuOpen: boolean; public isMenuOpen: boolean;
public paths = paths;
public routeAbout = paths.about; public routeAbout = paths.about;
public routeFeatures = paths.features; public routeFeatures = paths.features;
public routeMarkets = paths.markets; public routeMarkets = paths.markets;
public routePricing = paths.pricing; public routePricing = paths.pricing;
public routeResources = paths.resources; public routeResources = paths.resources;
public routerLinkAbout = ['/' + paths.about]; public routerLinkAbout = ['/' + paths.about];
public routerLinkAccount = ['/' + paths.account];
public routerLinkAccounts = ['/' + paths.accounts];
public routerLinkAdminControl = ['/' + paths.adminControl];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + paths.features];
public routerLinkMarkets = ['/' + paths.markets]; public routerLinkMarkets = ['/' + paths.markets];
public routerLinkPortfolio = ['/' + paths.portfolio];
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + paths.pricing];
public routerLinkRegister = ['/' + paths.register]; public routerLinkRegister = ['/' + paths.register];
public routerLinkResources = ['/' + paths.resources]; public routerLinkResources = ['/' + paths.resources];

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

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

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

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

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

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

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

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

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

@ -21,7 +21,7 @@ export class AuthGuard {
`/${paths.faq}`, `/${paths.faq}`,
`/${paths.features}`, `/${paths.features}`,
`/${paths.markets}`, `/${paths.markets}`,
`/${paths.open}`, `/${paths.openStartup}`,
`/${paths.pricing}`, `/${paths.pricing}`,
`/${paths.public}`, `/${paths.public}`,
`/${paths.register}`, `/${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 hasPermissionForStatistics: boolean;
public hasPermissionForSubscription: boolean; public hasPermissionForSubscription: boolean;
public isLoggedIn: boolean; public isLoggedIn: boolean;
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFaq = ['/' + paths.faq]; public routerLinkFaq = ['/' + paths.faq];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + paths.features];
public routerLinkOpenStartup = ['/' + paths.openStartup];
public user: User; public user: User;
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();

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

@ -23,7 +23,9 @@
> >
@if (hasPermissionForStatistics) { @if (hasPermissionForStatistics) {
and we share aggregated 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 of the platform’s performance
} }
. The project has been initiated by . The project has been initiated by
@ -160,7 +162,7 @@
class="py-4 w-100" class="py-4 w-100"
color="primary" color="primary"
mat-flat-button mat-flat-button
[routerLink]="['/blog']" [routerLink]="routerLinkBlog"
>Blog</a >Blog</a
> >
</div> </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', iconName: 'reader-outline',
label: $localize`Overview`, label: $localize`Overview`,
path: ['/' + paths.admin] path: ['/' + paths.adminControl]
}, },
{ {
iconName: 'settings-outline', iconName: 'settings-outline',
label: $localize`Settings`, label: $localize`Settings`,
path: ['/' + paths.admin, paths.settings] path: ['/' + paths.adminControl, paths.settings]
}, },
{ {
iconName: 'server-outline', iconName: 'server-outline',
label: $localize`Market Data`, label: $localize`Market Data`,
path: ['/' + paths.admin, paths.marketData] path: ['/' + paths.adminControl, paths.marketData]
}, },
{ {
iconName: 'flash-outline', iconName: 'flash-outline',
label: $localize`Job Queue`, label: $localize`Job Queue`,
path: ['/' + paths.admin, paths.jobs] path: ['/' + paths.adminControl, paths.jobs]
}, },
{ {
iconName: 'people-outline', iconName: 'people-outline',
label: $localize`Users`, 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' templateUrl: './hallo-ghostfolio-page.html'
}) })
export class HalloGhostfolioPageComponent { export class HalloGhostfolioPageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + paths.pricing];
public routerLinkResources = ['/' + paths.resources]; 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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' templateUrl: './hello-ghostfolio-page.html'
}) })
export class HelloGhostfolioPageComponent { export class HelloGhostfolioPageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkPricing = ['/' + paths.pricing]; public routerLinkPricing = ['/' + paths.pricing];
public routerLinkResources = ['/' + paths.resources]; 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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' templateUrl: './first-months-in-open-source-page.html'
}) })
export class FirstMonthsInOpenSourcePageComponent { export class FirstMonthsInOpenSourcePageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkPricing = ['/' + paths.pricing]; 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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 { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
@ -8,4 +10,6 @@ import { RouterModule } from '@angular/router';
selector: 'gf-ghostfolio-meets-internet-identity-page', selector: 'gf-ghostfolio-meets-internet-identity-page',
templateUrl: './ghostfolio-meets-internet-identity-page.html' 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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' templateUrl: './how-do-i-get-my-finances-in-order-page.html'
}) })
export class HowDoIGetMyFinancesInOrderPageComponent { export class HowDoIGetMyFinancesInOrderPageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkResources = ['/' + paths.resources]; 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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' templateUrl: './500-stars-on-github-page.html'
}) })
export class FiveHundredStarsOnGitHubPageComponent { export class FiveHundredStarsOnGitHubPageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkMarkets = ['/' + paths.markets]; public routerLinkMarkets = ['/' + paths.markets];
public routerLinkPricing = ['/' + paths.pricing]; 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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 { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
@ -8,4 +10,6 @@ import { RouterModule } from '@angular/router';
selector: 'gf-hacktoberfest-2022-page', selector: 'gf-hacktoberfest-2022-page',
templateUrl: './hacktoberfest-2022-page.html' 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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' templateUrl: './black-friday-2022-page.html'
}) })
export class BlackFriday2022PageComponent { export class BlackFriday2022PageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + paths.features];
public routerLinkPricing = ['/' + paths.pricing]; 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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 { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
@ -8,4 +10,6 @@ import { RouterModule } from '@angular/router';
selector: 'gf-the-importance-of-tracking-your-personal-finances-page', selector: 'gf-the-importance-of-tracking-your-personal-finances-page',
templateUrl: './the-importance-of-tracking-your-personal-finances-page.html' templateUrl: './the-importance-of-tracking-your-personal-finances-page.html'
}) })
export class TheImportanceOfTrackingYourPersonalFinancesPageComponent {} export class TheImportanceOfTrackingYourPersonalFinancesPageComponent {
public routerLinkBlog = ['/' + paths.blog];
}

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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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 { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
@ -8,4 +10,6 @@ import { RouterModule } from '@angular/router';
selector: 'gf-ghostfolio-auf-sackgeld-vorgestellt-page', selector: 'gf-ghostfolio-auf-sackgeld-vorgestellt-page',
templateUrl: './ghostfolio-auf-sackgeld-vorgestellt-page.html' 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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 { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
@ -8,4 +10,6 @@ import { RouterModule } from '@angular/router';
selector: 'gf-ghostfolio-meets-umbrel-page', selector: 'gf-ghostfolio-meets-umbrel-page',
templateUrl: './ghostfolio-meets-umbrel-page.html' 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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' templateUrl: './1000-stars-on-github-page.html'
}) })
export class ThousandStarsOnGitHubPageComponent { export class ThousandStarsOnGitHubPageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + paths.features];
public routerLinkPricing = ['/' + paths.pricing]; 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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' templateUrl: './unlock-your-financial-potential-with-ghostfolio-page.html'
}) })
export class UnlockYourFinancialPotentialWithGhostfolioPageComponent { export class UnlockYourFinancialPotentialWithGhostfolioPageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + paths.features];
public routerLinkResources = ['/' + paths.resources]; 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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' templateUrl: './exploring-the-path-to-fire-page.html'
}) })
export class ExploringThePathToFirePageComponent { export class ExploringThePathToFirePageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features]; 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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 { export class GhostfolioJoinsOssFriendsPageComponent {
public routerLinkAboutOssFriends = ['/' + paths.about, paths.ossFriends]; 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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 { export class Ghostfolio2PageComponent {
public routerLinkAbout = ['/' + paths.about]; public routerLinkAbout = ['/' + paths.about];
public routerLinkAboutChangelog = ['/' + paths.about, paths.changelog]; public routerLinkAboutChangelog = ['/' + paths.about, paths.changelog];
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + paths.features];
public routerLinkMarkets = ['/' + paths.markets]; 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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 { export class Hacktoberfest2023PageComponent {
public routerLinkAbout = ['/' + paths.about]; 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>
<p> <p>
The software is used daily by a thriving global community. With over The software is used daily by a thriving global community. With over
<a [routerLink]="['/open']">2’600 stars on GitHub</a> and <a [routerLink]="routerLinkOpenStartup">2’600 stars on GitHub</a>
<a [routerLink]="['/open']">300’000+ pulls on Docker Hub</a>, and
Ghostfolio has gained widespread recognition for its user-friendly <a [routerLink]="routerLinkOpenStartup"
experience and simplicity. >300’000+ pulls on Docker Hub</a
>, Ghostfolio has gained widespread recognition for its
user-friendly experience and simplicity.
</p> </p>
</section> </section>
<section class="mb-4"> <section class="mb-4">
@ -178,7 +180,7 @@
<nav aria-label="breadcrumb"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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' templateUrl: './black-week-2023-page.html'
}) })
export class BlackWeek2023PageComponent { export class BlackWeek2023PageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + paths.features];
public routerLinkPricing = ['/' + paths.pricing]; 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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 { export class Hacktoberfest2023DebriefingPageComponent {
public routerLinkAbout = ['/' + paths.about]; public routerLinkAbout = ['/' + paths.about];
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features]; 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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 { export class Hacktoberfest2024PageComponent {
public routerLinkAbout = ['/' + paths.about]; 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> <p>
The OSS project counting more than 100 contributors is used daily by The OSS project counting more than 100 contributors is used daily by
its growing global community. With over its growing global community. With over
<a [routerLink]="['/open']">4’000 stars on GitHub</a> and <a [routerLink]="routerLinkOpenStartup">4’000 stars on GitHub</a>
<a [routerLink]="['/open']">800’000+ pulls on Docker Hub</a>, and
Ghostfolio has gained widespread recognition for its user-friendly <a [routerLink]="routerLinkOpenStartup"
experience and simplicity. >800’000+ pulls on Docker Hub</a
>, Ghostfolio has gained widespread recognition for its
user-friendly experience and simplicity.
</p> </p>
</section> </section>
<section class="mb-4"> <section class="mb-4">
@ -184,7 +186,7 @@
<nav aria-label="breadcrumb"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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' templateUrl: './black-weeks-2024-page.html'
}) })
export class BlackWeeks2024PageComponent { export class BlackWeeks2024PageComponent {
public routerLinkBlog = ['/' + paths.blog];
public routerLinkFeatures = ['/' + paths.features]; public routerLinkFeatures = ['/' + paths.features];
public routerLinkPricing = ['/' + paths.pricing]; 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"> <nav aria-label="breadcrumb">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="routerLinkBlog">Blog</a>
</li> </li>
<li <li
aria-current="page" 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 { export class SaasPageComponent implements OnDestroy {
public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${paths.pricing}`; 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 routerLinkMarkets = ['/' + paths.markets];
public routerLinkRegister = ['/' + paths.register]; public routerLinkRegister = ['/' + paths.register];
public user: User; public user: User;

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

@ -82,7 +82,7 @@
[enableLink]="false" [enableLink]="false"
/></a> /></a>
by signing up for Ghostfolio and applying for a trial (see 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 easy, free and there is no commitment. You can stop using it at any
time.</mat-card-content time.</mat-card-content
> >
@ -158,7 +158,7 @@
</mat-card-header> </mat-card-header>
<mat-card-content <mat-card-content
>It is suggested to regularly back up your data via >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 <i>Export Data</i>.</mat-card-content
> >
</mat-card> </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 hasPermissionForSubscription: boolean;
public hasPermissionToCreateUser: boolean; public hasPermissionToCreateUser: boolean;
public routerLinkAbout = ['/' + paths.about]; public routerLinkAbout = ['/' + paths.about];
public routerLinkDemo = ['/' + paths.demo];
public routerLinkOpenStartup = ['/' + paths.openStartup];
public routerLinkRegister = ['/' + paths.register]; public routerLinkRegister = ['/' + paths.register];
public statistics: Statistics; public statistics: Statistics;
public testimonials = [ public testimonials = [

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

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

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

@ -5,7 +5,7 @@ export const paths = {
account: 'account', account: 'account',
accounts: 'accounts', accounts: 'accounts',
activities: 'activities', activities: 'activities',
admin: 'admin', adminControl: 'admin',
allocations: 'allocations', allocations: 'allocations',
api: 'api', api: 'api',
auth: 'auth', auth: 'auth',
@ -19,7 +19,6 @@ export const paths = {
market: 'market', market: 'market',
marketData: 'market-data', marketData: 'market-data',
membership: 'membership', membership: 'membership',
open: 'open',
personalFinanceTools: 'personal-finance-tools', personalFinanceTools: 'personal-finance-tools',
portfolio: 'portfolio', portfolio: 'portfolio',
public: 'p', public: 'p',
@ -43,6 +42,7 @@ export const paths = {
license: $localize`:kebab-case:license`, license: $localize`:kebab-case:license`,
markets: $localize`:kebab-case:markets`, markets: $localize`:kebab-case:markets`,
openSourceAlternativeTo: $localize`:kebab-case:open-source-alternative-to`, openSourceAlternativeTo: $localize`:kebab-case:open-source-alternative-to`,
openStartup: $localize`:kebab-case:open`,
ossFriends: $localize`:kebab-case:oss-friends`, ossFriends: $localize`:kebab-case:oss-friends`,
pricing: $localize`:kebab-case:pricing`, pricing: $localize`:kebab-case:pricing`,
privacyPolicy: $localize`:kebab-case:privacy-policy`, 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" color="primary"
mat-button mat-button
[queryParams]="{ createDialog: true }" [queryParams]="{ createDialog: true }"
[routerLink]="['/portfolio', 'activities']" [routerLink]="routerLinkPortfolioActivities"
> >
<span i18n>Time to add your first activity.</span> <span i18n>Time to add your first activity.</span>
</a> </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 { import {
CUSTOM_ELEMENTS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA,
ChangeDetectionStrategy, ChangeDetectionStrategy,
@ -20,4 +22,9 @@ import { GfLogoComponent } from '../logo';
}) })
export class GfNoTransactionsInfoComponent { export class GfNoTransactionsInfoComponent {
@HostBinding('class.has-border') @Input() hasBorder = true; @HostBinding('class.has-border') @Input() hasBorder = true;
public routerLinkPortfolioActivities = [
'/' + paths.portfolio,
paths.activities
];
} }

Loading…
Cancel
Save