RLH-12 - Start implementing /account page
This commit is contained in:
parent
68d4b82756
commit
b862f83d23
12
angular.json
12
angular.json
@ -30,9 +30,13 @@
|
|||||||
"src/assets"
|
"src/assets"
|
||||||
],
|
],
|
||||||
"styles": [
|
"styles": [
|
||||||
|
"node_modules/bootstrap/scss/bootstrap.scss",
|
||||||
|
"node_modules/bootstrap-icons/font/bootstrap-icons.css",
|
||||||
"src/styles.scss"
|
"src/styles.scss"
|
||||||
],
|
],
|
||||||
"scripts": []
|
"scripts": [
|
||||||
|
"node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"configurations": {
|
"configurations": {
|
||||||
"production": {
|
"production": {
|
||||||
@ -90,9 +94,13 @@
|
|||||||
"src/assets"
|
"src/assets"
|
||||||
],
|
],
|
||||||
"styles": [
|
"styles": [
|
||||||
|
"node_modules/bootstrap/scss/bootstrap.scss",
|
||||||
|
"node_modules/bootstrap-icons/font/bootstrap-icons.css",
|
||||||
"src/styles.scss"
|
"src/styles.scss"
|
||||||
],
|
],
|
||||||
"scripts": []
|
"scripts": [
|
||||||
|
"node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
27
package-lock.json
generated
27
package-lock.json
generated
@ -16,9 +16,10 @@
|
|||||||
"@angular/platform-browser": "^17.3.0",
|
"@angular/platform-browser": "^17.3.0",
|
||||||
"@angular/platform-browser-dynamic": "^17.3.0",
|
"@angular/platform-browser-dynamic": "^17.3.0",
|
||||||
"@angular/router": "^17.3.0",
|
"@angular/router": "^17.3.0",
|
||||||
"@ng-bootstrap/ng-bootstrap": "^16.0.0",
|
"@ng-bootstrap/ng-bootstrap": "^16.0.0-rc.2",
|
||||||
"@popperjs/core": "^2.11.8",
|
"@popperjs/core": "^2.11.8",
|
||||||
"bootstrap": "^5.3.2",
|
"bootstrap": "^5.3.3",
|
||||||
|
"bootstrap-icons": "^1.11.3",
|
||||||
"mdb-ui-kit": "^8.0.0",
|
"mdb-ui-kit": "^8.0.0",
|
||||||
"moment": "^2.30.1",
|
"moment": "^2.30.1",
|
||||||
"rxjs": "~7.8.0",
|
"rxjs": "~7.8.0",
|
||||||
@ -3078,9 +3079,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@ng-bootstrap/ng-bootstrap": {
|
"node_modules/@ng-bootstrap/ng-bootstrap": {
|
||||||
"version": "16.0.0",
|
"version": "16.0.0-rc.2",
|
||||||
"resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-16.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-16.0.0-rc.2.tgz",
|
||||||
"integrity": "sha512-+FJ3e6cX9DW2t7021Ji3oz433rk3+4jLfqzU+Jyx6/vJz1dIOaML3EAY6lYuW4TLiXgMPOMvs6KzPFALGh4Lag==",
|
"integrity": "sha512-XQUOr6OfAYA9FK1e9tsKJiuKYGkNeO3vCkbCryWDWZzWaehvOWLcB214RUVBeoxynd4c/n2PmQRGnKcJLTAeSA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tslib": "^2.3.0"
|
"tslib": "^2.3.0"
|
||||||
@ -4945,6 +4946,22 @@
|
|||||||
"@popperjs/core": "^2.11.8"
|
"@popperjs/core": "^2.11.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/bootstrap-icons": {
|
||||||
|
"version": "1.11.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.11.3.tgz",
|
||||||
|
"integrity": "sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/twbs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/bootstrap"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/brace-expansion": {
|
"node_modules/brace-expansion": {
|
||||||
"version": "1.1.11",
|
"version": "1.1.11",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
@ -18,9 +18,10 @@
|
|||||||
"@angular/platform-browser": "^17.3.0",
|
"@angular/platform-browser": "^17.3.0",
|
||||||
"@angular/platform-browser-dynamic": "^17.3.0",
|
"@angular/platform-browser-dynamic": "^17.3.0",
|
||||||
"@angular/router": "^17.3.0",
|
"@angular/router": "^17.3.0",
|
||||||
"@ng-bootstrap/ng-bootstrap": "^16.0.0",
|
"@ng-bootstrap/ng-bootstrap": "^16.0.0-rc.2",
|
||||||
"@popperjs/core": "^2.11.8",
|
"@popperjs/core": "^2.11.8",
|
||||||
"bootstrap": "^5.3.2",
|
"bootstrap": "^5.3.3",
|
||||||
|
"bootstrap-icons": "^1.11.3",
|
||||||
"mdb-ui-kit": "^8.0.0",
|
"mdb-ui-kit": "^8.0.0",
|
||||||
"moment": "^2.30.1",
|
"moment": "^2.30.1",
|
||||||
"rxjs": "~7.8.0",
|
"rxjs": "~7.8.0",
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
import {Routes} from '@angular/router';
|
import {Routes} from '@angular/router';
|
||||||
import {DashboardComponent} from "./views/dashboard/dashboard.component";
|
import {DashboardComponent} from "./views/dashboard/dashboard.component";
|
||||||
import {AppComponent} from "./app.component";
|
import {AppComponent} from "./app.component";
|
||||||
import {LoginComponent} from "./views/login/login.component";
|
|
||||||
import {AuthFormComponent} from "./views/beta/auth-form/auth-form.component";
|
import {AuthFormComponent} from "./views/beta/auth-form/auth-form.component";
|
||||||
import {RegisterComponent} from "./views/register/register.component";
|
|
||||||
import {AuthGuardService} from "./services/auth-guard.service";
|
import {AuthGuardService} from "./services/auth-guard.service";
|
||||||
|
import {AccountComponent} from "./views/account/account.component";
|
||||||
|
|
||||||
export const routes: Routes = [
|
export const routes: Routes = [
|
||||||
{path: '', redirectTo: '/dashboard', pathMatch: 'full'},
|
{path: '', redirectTo: '/dashboard', pathMatch: 'full'},
|
||||||
{path: 'dashboard', component: DashboardComponent, canActivate: [AuthGuardService]},
|
{path: 'dashboard', component: DashboardComponent, canActivate: [AuthGuardService]},
|
||||||
|
{path: 'account', component: AccountComponent, canActivate: [AuthGuardService]},
|
||||||
{path: 'login', component: AuthFormComponent},
|
{path: 'login', component: AuthFormComponent},
|
||||||
{path: 'beta/authForm', component: AuthFormComponent},
|
{path: 'beta/authForm', component: AuthFormComponent},
|
||||||
{path: '**', component: AppComponent},
|
{path: '**', component: AppComponent},
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="btn btn-link"
|
||||||
|
[disabled]="buttonDisabled()"
|
||||||
|
(click)="button.click()">
|
||||||
|
{{button.text}}
|
||||||
|
</button>
|
23
src/app/libraries/components/button/button.component.spec.ts
Normal file
23
src/app/libraries/components/button/button.component.spec.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { ButtonComponent } from './button.component';
|
||||||
|
|
||||||
|
describe('ButtonComponent', () => {
|
||||||
|
let component: ButtonComponent;
|
||||||
|
let fixture: ComponentFixture<ButtonComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
imports: [ButtonComponent]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
|
||||||
|
fixture = TestBed.createComponent(ButtonComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
40
src/app/libraries/components/button/button.component.ts
Normal file
40
src/app/libraries/components/button/button.component.ts
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import {booleanAttribute, Component, Input, OnInit} from '@angular/core';
|
||||||
|
import {ButtonModel} from "./models/button.model";
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'rlh-button',
|
||||||
|
standalone: true,
|
||||||
|
imports: [],
|
||||||
|
templateUrl: './button.component.html',
|
||||||
|
styleUrl: './button.component.scss'
|
||||||
|
})
|
||||||
|
export class ButtonComponent implements OnInit
|
||||||
|
{
|
||||||
|
|
||||||
|
@Input() button: ButtonModel = {
|
||||||
|
text: 'text',
|
||||||
|
disabled: () => false,
|
||||||
|
click: () => {}
|
||||||
|
};
|
||||||
|
|
||||||
|
buttonDisabled: () => boolean = () => {
|
||||||
|
return false;
|
||||||
|
// tslint:disable-next-line: semicolon
|
||||||
|
};
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
this.button.disabled = this.button.disabled
|
||||||
|
? this.button.disabled
|
||||||
|
: () => false;
|
||||||
|
//
|
||||||
|
setTimeout(() => {
|
||||||
|
this.buttonDisabled = () => {
|
||||||
|
return this.button.disabled();
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
export class ButtonModel {
|
||||||
|
text: string = "text";
|
||||||
|
disabled: () => boolean;
|
||||||
|
click: () => void;
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
<div class="row border p-4">
|
||||||
|
<b>Profile Management</b>
|
||||||
|
<div class="nav flex-column nav-pills">
|
||||||
|
<div>
|
||||||
|
<rlh-button
|
||||||
|
[button]="accountManagementButton"
|
||||||
|
></rlh-button>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<rlh-button
|
||||||
|
[button]="publicProfileButton"
|
||||||
|
></rlh-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -0,0 +1,23 @@
|
|||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { AccountNavigationComponent } from './account-navigation.component';
|
||||||
|
|
||||||
|
describe('AccountNavigationComponent', () => {
|
||||||
|
let component: AccountNavigationComponent;
|
||||||
|
let fixture: ComponentFixture<AccountNavigationComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
imports: [AccountNavigationComponent]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
|
||||||
|
fixture = TestBed.createComponent(AccountNavigationComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,38 @@
|
|||||||
|
import {Component, EventEmitter, Output} from '@angular/core';
|
||||||
|
import {ButtonComponent} from "../../../libraries/components/button/button.component";
|
||||||
|
import {ButtonModel} from "../../../libraries/components/button/models/button.model";
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-account-navigation',
|
||||||
|
standalone: true,
|
||||||
|
imports: [
|
||||||
|
ButtonComponent
|
||||||
|
],
|
||||||
|
templateUrl: './account-navigation.component.html',
|
||||||
|
styleUrl: './account-navigation.component.scss'
|
||||||
|
})
|
||||||
|
export class AccountNavigationComponent {
|
||||||
|
|
||||||
|
@Output() onNavChange = new EventEmitter<string>();
|
||||||
|
|
||||||
|
selectedMenu = "ACC";
|
||||||
|
|
||||||
|
accountManagementButton: ButtonModel = {
|
||||||
|
disabled: () => this.selectedMenu === 'ACC',
|
||||||
|
click: () =>
|
||||||
|
{
|
||||||
|
this.selectedMenu = 'ACC';
|
||||||
|
this.onNavChange.emit(this.selectedMenu);
|
||||||
|
},
|
||||||
|
text: 'Account Management'
|
||||||
|
}
|
||||||
|
|
||||||
|
publicProfileButton: ButtonModel = {
|
||||||
|
disabled: () => this.selectedMenu === 'PPF',
|
||||||
|
click: () => {
|
||||||
|
this.selectedMenu = 'PPF';
|
||||||
|
this.onNavChange.emit(this.selectedMenu);
|
||||||
|
},
|
||||||
|
text: 'Public Profile'
|
||||||
|
}
|
||||||
|
}
|
15
src/app/views/account/account.component.html
Normal file
15
src/app/views/account/account.component.html
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-3">
|
||||||
|
<app-account-navigation
|
||||||
|
(onNavChange)="navChanged($event)"
|
||||||
|
>
|
||||||
|
</app-account-navigation>
|
||||||
|
</div>
|
||||||
|
<div class="col-9">
|
||||||
|
<div class="row" *ngIf="selectedMenu === 'ACC'">
|
||||||
|
<app-dashboard></app-dashboard>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
0
src/app/views/account/account.component.scss
Normal file
0
src/app/views/account/account.component.scss
Normal file
23
src/app/views/account/account.component.spec.ts
Normal file
23
src/app/views/account/account.component.spec.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { AccountComponent } from './account.component';
|
||||||
|
|
||||||
|
describe('AccountComponent', () => {
|
||||||
|
let component: AccountComponent;
|
||||||
|
let fixture: ComponentFixture<AccountComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
imports: [AccountComponent]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
|
||||||
|
fixture = TestBed.createComponent(AccountComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
30
src/app/views/account/account.component.ts
Normal file
30
src/app/views/account/account.component.ts
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import { Component } from '@angular/core';
|
||||||
|
import {ButtonComponent} from "../../libraries/components/button/button.component";
|
||||||
|
import {ButtonModel} from "../../libraries/components/button/models/button.model";
|
||||||
|
import {DashboardComponent} from "../dashboard/dashboard.component";
|
||||||
|
import {NgIf} from "@angular/common";
|
||||||
|
import {LoginComponent} from "../login/login.component";
|
||||||
|
import {AccountNavigationComponent} from "./account-navigation/account-navigation.component";
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-account',
|
||||||
|
standalone: true,
|
||||||
|
imports: [
|
||||||
|
ButtonComponent,
|
||||||
|
DashboardComponent,
|
||||||
|
NgIf,
|
||||||
|
LoginComponent,
|
||||||
|
AccountNavigationComponent
|
||||||
|
],
|
||||||
|
templateUrl: './account.component.html',
|
||||||
|
styleUrl: './account.component.scss'
|
||||||
|
})
|
||||||
|
export class AccountComponent {
|
||||||
|
|
||||||
|
selectedMenu = 'ACC';
|
||||||
|
|
||||||
|
public navChanged(selected: string) {
|
||||||
|
this.selectedMenu = selected;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,4 @@
|
|||||||
<div class="container" *ngIf="isLoggedIn">
|
<div *ngIf="isLoggedIn">
|
||||||
<div class="row">
|
|
||||||
<p class="border">
|
<p class="border">
|
||||||
<b>Username: </b>{{userData.username}} |
|
<b>Username: </b>{{userData.username}} |
|
||||||
<b>eMail: </b>{{userData.email}} |
|
<b>eMail: </b>{{userData.email}} |
|
||||||
@ -7,4 +6,3 @@
|
|||||||
<b>Created At: </b>{{userData.createdAt}}
|
<b>Created At: </b>{{userData.createdAt}}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
@ -1,10 +1,2 @@
|
|||||||
/* You can add global styles to this file, and also import other style files */
|
/* You can add global styles to this file, and also import other style files */
|
||||||
|
|
||||||
@import 'mdb-ui-kit/css/mdb.min.css';
|
|
||||||
@import 'bootstrap/scss/mixins';
|
|
||||||
@import 'bootstrap/scss/functions';
|
|
||||||
@import 'bootstrap/scss/variables';
|
|
||||||
@import 'bootstrap/scss/variables-dark';
|
|
||||||
@import 'bootstrap/scss/maps';
|
|
||||||
@import 'bootstrap/scss/utilities';
|
|
||||||
@import 'bootstrap/scss/grid';
|
|
||||||
|
@ -3,7 +3,8 @@
|
|||||||
"compileOnSave": false,
|
"compileOnSave": false,
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "./dist/out-tsc",
|
"outDir": "./dist/out-tsc",
|
||||||
"strict": true,
|
"strictPropertyInitialization": false,
|
||||||
|
"strict": false,
|
||||||
"noImplicitOverride": true,
|
"noImplicitOverride": true,
|
||||||
"noPropertyAccessFromIndexSignature": true,
|
"noPropertyAccessFromIndexSignature": true,
|
||||||
"noImplicitReturns": true,
|
"noImplicitReturns": true,
|
||||||
|
Loading…
Reference in New Issue
Block a user