-
Biometric Authentication
-
- Sign in with fingerprint
+
Locale
+
+ Date and number format
-
+
+
+
+ {{ locale }}
+
+
-
-
-
Experimental Features
-
- Sneak peek at upcoming functionality
-
+
+
+ Appearance
-
+
+
+ Auto
+ Light
+ Dark
+
+
-
-
User ID
-
{{ user?.id }}
+
+
+
+
+
Zen Mode
+
+ Distraction-free experience for turbulent times
-
-
-
-
- Export Data
-
-
+
+
+
+
+
+
+
+
Biometric Authentication
+
Sign in with fingerprint
+
+
+
+
+
+
+
+
Experimental Features
+
+ Sneak peek at upcoming functionality
-
-
+
+
+
+
+
+
+
User ID
+
{{ user?.id }}
+
+
+
+
+
+ Export Data
+
+
+
diff --git a/apps/client/src/app/pages/user-account/user-account-page-routing.module.ts b/apps/client/src/app/pages/user-account/user-account-page-routing.module.ts
index f52591d21..568095009 100644
--- a/apps/client/src/app/pages/user-account/user-account-page-routing.module.ts
+++ b/apps/client/src/app/pages/user-account/user-account-page-routing.module.ts
@@ -1,5 +1,8 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
+import { UserAccountAccessComponent } from '@ghostfolio/client/components/user-account-access/user-account-access.component';
+import { UserAccountMembershipComponent } from '@ghostfolio/client/components/user-account-membership/user-account-membership.component';
+import { UserAccountSettingsComponent } from '@ghostfolio/client/components/user-account-settings/user-account-settings.component';
import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { UserAccountPageComponent } from './user-account-page.component';
@@ -7,6 +10,23 @@ import { UserAccountPageComponent } from './user-account-page.component';
const routes: Routes = [
{
canActivate: [AuthGuard],
+ children: [
+ {
+ path: '',
+ component: UserAccountSettingsComponent,
+ title: $localize`Settings`
+ },
+ {
+ path: 'membership',
+ component: UserAccountMembershipComponent,
+ title: $localize`Membership`
+ },
+ {
+ path: 'access',
+ component: UserAccountAccessComponent,
+ title: $localize`Access`
+ }
+ ],
component: UserAccountPageComponent,
path: '',
title: $localize`My Ghostfolio`
diff --git a/apps/client/src/app/pages/user-account/user-account-page.component.ts b/apps/client/src/app/pages/user-account/user-account-page.component.ts
index 25c2e60d7..970dadd6a 100644
--- a/apps/client/src/app/pages/user-account/user-account-page.component.ts
+++ b/apps/client/src/app/pages/user-account/user-account-page.component.ts
@@ -1,30 +1,60 @@
-import { Component, OnDestroy, OnInit } from '@angular/core';
+import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { UserService } from '@ghostfolio/client/services/user/user.service';
-import { User } from '@ghostfolio/common/interfaces';
+import { TabConfiguration, User } from '@ghostfolio/common/interfaces';
+import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject, takeUntil } from 'rxjs';
@Component({
- host: { class: 'page' },
+ host: { class: 'page has-tabs' },
selector: 'gf-user-account-page',
styleUrls: ['./user-account-page.scss'],
templateUrl: './user-account-page.html'
})
export class UserAccountPageComponent implements OnDestroy, OnInit {
+ public deviceType: string;
+ public tabs: TabConfiguration[] = [];
public user: User;
private unsubscribeSubject = new Subject
();
- public constructor(private userService: UserService) {
+ public constructor(
+ private changeDetectorRef: ChangeDetectorRef,
+ private deviceService: DeviceDetectorService,
+ private userService: UserService
+ ) {
this.userService.stateChanged
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
+
+ this.tabs = [
+ {
+ iconName: 'cog-outline',
+ label: $localize`Settings`,
+ path: ['/account']
+ },
+ {
+ iconName: 'diamond-outline',
+ label: $localize`Membership`,
+ path: ['/account/membership'],
+ showCondition: !!this.user?.subscription
+ },
+ {
+ iconName: 'share-social-outline',
+ label: $localize`Access`,
+ path: ['/account', 'access']
+ }
+ ];
+
+ this.changeDetectorRef.markForCheck();
}
});
}
- public ngOnInit() {}
+ public ngOnInit() {
+ this.deviceType = this.deviceService.getDeviceInfo().deviceType;
+ }
public ngOnDestroy() {
this.unsubscribeSubject.next();
diff --git a/apps/client/src/app/pages/user-account/user-account-page.html b/apps/client/src/app/pages/user-account/user-account-page.html
index d1195f690..d3fbca534 100644
--- a/apps/client/src/app/pages/user-account/user-account-page.html
+++ b/apps/client/src/app/pages/user-account/user-account-page.html
@@ -1,10 +1,29 @@
-
+
+
+
+
+
+
+
+
+ {{ tab.label }}
+
+
+
diff --git a/apps/client/src/app/pages/user-account/user-account-page.module.ts b/apps/client/src/app/pages/user-account/user-account-page.module.ts
index 97cc82003..3c6670af4 100644
--- a/apps/client/src/app/pages/user-account/user-account-page.module.ts
+++ b/apps/client/src/app/pages/user-account/user-account-page.module.ts
@@ -1,11 +1,12 @@
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
+import { MatTabsModule } from '@angular/material/tabs';
+import { GfUserAccountAccessModule } from '@ghostfolio/client/components/user-account-access/user-account-access.module';
+import { GfUserAccountMembershipModule } from '@ghostfolio/client/components/user-account-membership/user-account-membership.module';
+import { GfUserAccountSettingsModule } from '@ghostfolio/client/components/user-account-settings/user-account-settings.module';
import { UserAccountPageRoutingModule } from './user-account-page-routing.module';
import { UserAccountPageComponent } from './user-account-page.component';
-import { GfUserAccountSettingsModule } from '@ghostfolio/client/components/user-account-settings/user-account-settings.module';
-import { GfUserAccountAccessModule } from '@ghostfolio/client/components/user-account-access/user-account-access.module';
-import { GfUserAccountMembershipModule } from '@ghostfolio/client/components/user-account-membership/user-account-membership.module';
@NgModule({
declarations: [UserAccountPageComponent],
@@ -14,6 +15,7 @@ import { GfUserAccountMembershipModule } from '@ghostfolio/client/components/use
GfUserAccountAccessModule,
GfUserAccountMembershipModule,
GfUserAccountSettingsModule,
+ MatTabsModule,
UserAccountPageRoutingModule
]
})
diff --git a/apps/client/src/app/pages/user-account/user-account-page.scss b/apps/client/src/app/pages/user-account/user-account-page.scss
index 705139659..6a0b74854 100644
--- a/apps/client/src/app/pages/user-account/user-account-page.scss
+++ b/apps/client/src/app/pages/user-account/user-account-page.scss
@@ -1,5 +1,9 @@
+@import 'apps/client/src/styles/ghostfolio-style';
+
:host {
+ color: rgb(var(--dark-primary-text));
}
:host-context(.is-dark-theme) {
+ color: rgb(var(--light-primary-text));
}