From 73916f0aae5c13dd916642e861d5e1db48b1b4c3 Mon Sep 17 00:00:00 2001 From: akastijn Date: Fri, 4 Jul 2025 21:14:45 +0200 Subject: [PATCH] Add login button to header --- .../pages/header/header/header.component.html | 12 ++++++ .../pages/header/header/header.component.ts | 43 +++++++++++++++++-- frontend/src/app/services/auth.service.ts | 4 ++ .../login/login.component.html | 13 +++++- .../login/login.component.ts | 20 ++++++++- 5 files changed, 85 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/pages/header/header/header.component.html b/frontend/src/app/pages/header/header/header.component.html index edd63f4..6cc8e61 100644 --- a/frontend/src/app/pages/header/header/header.component.html +++ b/frontend/src/app/pages/header/header/header.component.html @@ -130,7 +130,19 @@ + + + + diff --git a/frontend/src/app/pages/header/header/header.component.ts b/frontend/src/app/pages/header/header/header.component.ts index 89f3986..21d1d29 100644 --- a/frontend/src/app/pages/header/header/header.component.ts +++ b/frontend/src/app/pages/header/header/header.component.ts @@ -1,7 +1,12 @@ -import {Component, HostListener, Input} from '@angular/core'; +import {Component, HostListener, Input, OnDestroy, OnInit} from '@angular/core'; import {CommonModule, NgOptimizedImage} from '@angular/common'; import {ThemeComponent} from '@shared-components/theme/theme.component'; import {RouterLink} from '@angular/router'; +import {AuthService} from '@services/auth.service'; +import {Subscription} from 'rxjs'; +import {LoginDialogComponent} from '@shared-components/login/login.component'; +import {MatButton} from '@angular/material/button'; +import {MatDialog} from '@angular/material/dialog'; @Component({ standalone: true, @@ -9,13 +14,14 @@ import {RouterLink} from '@angular/router'; CommonModule, ThemeComponent, RouterLink, - NgOptimizedImage + NgOptimizedImage, + MatButton ], selector: 'app-header', templateUrl: './header.component.html', styleUrls: ['./header.component.scss'] }) -export class HeaderComponent { +export class HeaderComponent implements OnInit, OnDestroy { @Input() current_page: string = ''; @Input() background_image: string = ''; @Input() height: string = ''; @@ -23,6 +29,24 @@ export class HeaderComponent { public active: string = ''; public inverseYPos: number = 0; + private subscription: Subscription | undefined; + public isAuthenticated: boolean = false; + + constructor(protected authService: AuthService, + private dialog: MatDialog) { + + } + + ngOnInit(): void { + this.subscription = this.authService.isAuthenticated$.subscribe(isAuthenticated => { + this.isAuthenticated = isAuthenticated; + } + ); + } + + ngOnDestroy(): void { + this.subscription?.unsubscribe(); + } @HostListener('window:scroll', []) onWindowScroll(): void { @@ -59,4 +83,17 @@ export class HeaderComponent { return ''; } } + + public openLoginDialog() { + const dialogRef = this.dialog.open(LoginDialogComponent, { + width: '400px', + }) + dialogRef.afterClosed().subscribe(result => { + console.log(result); + }); + } + + public hasAccess(claims: string[]): boolean { + return this.authService.hasAccess(claims) + } } diff --git a/frontend/src/app/services/auth.service.ts b/frontend/src/app/services/auth.service.ts index 114dbed..d7af5d6 100644 --- a/frontend/src/app/services/auth.service.ts +++ b/frontend/src/app/services/auth.service.ts @@ -112,4 +112,8 @@ export class AuthService { const claims = this.userClaimsSubject.getValue(); return claims?.authorizations || []; } + + public hasAccess(authorization: string[]): boolean { + return this.getUserAuthorizations().filter(entry => authorization.includes(entry)).length > 0; + } } diff --git a/frontend/src/app/shared-components/login/login.component.html b/frontend/src/app/shared-components/login/login.component.html index 3c8865a..81ef567 100644 --- a/frontend/src/app/shared-components/login/login.component.html +++ b/frontend/src/app/shared-components/login/login.component.html @@ -3,10 +3,19 @@
Enter your code - - + + Code is required + + Code must be 8 characters + + + Code cannot exceed 8 characters + + + Code contains invalid characters +
diff --git a/frontend/src/app/shared-components/login/login.component.ts b/frontend/src/app/shared-components/login/login.component.ts index f729541..76e63f1 100644 --- a/frontend/src/app/shared-components/login/login.component.ts +++ b/frontend/src/app/shared-components/login/login.component.ts @@ -65,7 +65,23 @@ export class LoginDialogComponent { }); } - public formHasError() { - return this.loginForm.get('code')?.hasError('required'); + onKeyDown(event: KeyboardEvent): void { + if (event.key.length === 1 && event.key >= 'a' && event.key <= 'z') { + event.preventDefault(); + const input = event.target as HTMLInputElement; + const start = input.selectionStart || 0; + const end = input.selectionEnd || 0; + + const value = this.loginForm.get('code')?.value || ''; + const newValue = + value.substring(0, start) + + event.key.toUpperCase() + + value.substring(end); + + this.loginForm.get('code')?.setValue(newValue); + setTimeout(() => { + input.setSelectionRange(start + 1, start + 1); + }); + } } }