diff --git a/src/app/components/shared/_dialogs/remind-of-tokens/remind-of-tokens.component.html b/src/app/components/shared/_dialogs/remind-of-tokens/remind-of-tokens.component.html new file mode 100644 index 0000000000000000000000000000000000000000..9e0aa86770ab8d3dc8e03f072df0770cd7e28061 --- /dev/null +++ b/src/app/components/shared/_dialogs/remind-of-tokens/remind-of-tokens.component.html @@ -0,0 +1,13 @@ +<div mat-dialog-content> + <div style="overflow-y: scroll; max-height: 15rem"> + <h2 tabindex="0">{{ 'header.sure' | translate }}</h2> + <mat-divider></mat-divider> + <p tabindex="0">{{ 'header.user-got-tokens' | translate }}</p> + </div> + <app-dialog-action-buttons + buttonsLabelSection="header" + confirmButtonLabel="logout" + [cancelButtonClickAction]="buildCloseDialogActionCallback()" + [confirmButtonClickAction]="buildLogoutActionCallback()" + ></app-dialog-action-buttons> +</div> diff --git a/src/app/components/shared/_dialogs/remind-of-tokens/remind-of-tokens.component.scss b/src/app/components/shared/_dialogs/remind-of-tokens/remind-of-tokens.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..a72ea0e88078ea4ee14001ef60b54f3a9f086af6 --- /dev/null +++ b/src/app/components/shared/_dialogs/remind-of-tokens/remind-of-tokens.component.scss @@ -0,0 +1,7 @@ +p { + margin-bottom: 0; +} + +li { + color: var(--on-surface); +} diff --git a/src/app/components/shared/_dialogs/remind-of-tokens/remind-of-tokens.component.ts b/src/app/components/shared/_dialogs/remind-of-tokens/remind-of-tokens.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..c704936694ad4c436fae292114accced1b56e0de --- /dev/null +++ b/src/app/components/shared/_dialogs/remind-of-tokens/remind-of-tokens.component.ts @@ -0,0 +1,42 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; +import { RoomEditComponent } from '../../../creator/_dialogs/room-edit/room-edit.component'; + +@Component({ + selector: 'app-remind-of-tokens', + templateUrl: './remind-of-tokens.component.html', + styleUrls: ['./remind-of-tokens.component.scss'] +}) +export class RemindOfTokensComponent implements OnInit { + + constructor( + public dialogRef: MatDialogRef<RoomEditComponent>, + @Inject(MAT_DIALOG_DATA) public data: any + ) { + } + + ngOnInit() { + + } + + + close(type: string): void { + this.dialogRef.close(type); + } + + + /** + * Returns a lambda which closes the dialog on call. + */ + buildCloseDialogActionCallback(): () => void { + return () => this.close('abort'); + } + + + /** + * Returns a lambda which executes the dialog dedicated action on call. + */ + buildLogoutActionCallback(): () => void { + return () => this.close('logout'); + } +} diff --git a/src/app/components/shared/header/header.component.ts b/src/app/components/shared/header/header.component.ts index 7ba46f53f292071130a62a7666aec9086b96c575..3b21a4ce51e8487a4f77427f18f52ba397c07741 100644 --- a/src/app/components/shared/header/header.component.ts +++ b/src/app/components/shared/header/header.component.ts @@ -16,7 +16,11 @@ import { Rescale } from '../../../models/rescale'; import { KeyboardUtils } from '../../../utils/keyboard'; import { KeyboardKey } from '../../../utils/keyboard/keys'; import { UserBonusTokenComponent } from '../_dialogs/user-bonus-token/user-bonus-token.component'; +import { RemindOfTokensComponent } from '../_dialogs/remind-of-tokens/remind-of-tokens.component'; import { QrCodeDialogComponent } from '../_dialogs/qr-code-dialog/qr-code-dialog.component'; +import { BonusTokenService } from '../../../services/http/bonus-token.service'; +import { BonusToken } from '../../../models/bonus-token'; +import { AuthProvider } from '../../../models/auth-provider'; @Component({ selector: 'app-header', @@ -38,6 +42,7 @@ export class HeaderComponent implements OnInit { public dialog: MatDialog, private userService: UserService, public eventService: EventService, + private bonusTokenService: BonusTokenService, private _r: Renderer2 ) { } @@ -110,6 +115,31 @@ export class HeaderComponent implements OnInit { } logout() { + // ToDo: Fix this madness. + if (this.user.authProvider === 'ARSNOVA_GUEST') { + this.bonusTokenService.getTokensByUserId(this.user.id).subscribe( list => { + if (list && list.length > 0) { + const dialogRef = this.dialog.open(RemindOfTokensComponent, { + width: '600px' + }); + dialogRef.afterClosed() + .subscribe(result => { + if (result === 'abort') { + return; + } else if (result === 'logout') { + this.logoutUser(); + } + }); + } else { + this.logoutUser(); + } + }); + } else { + this.logoutUser(); + } + } + + logoutUser() { this.authenticationService.logout(); this.translationService.get('header.logged-out').subscribe(message => { this.notificationService.show(message); diff --git a/src/app/components/shared/shared.module.ts b/src/app/components/shared/shared.module.ts index f813182c563cd41c283f6a54fe7edec63404a445..7ea1d7aca4af4ceb7c5786be176d0962265a0cdd 100644 --- a/src/app/components/shared/shared.module.ts +++ b/src/app/components/shared/shared.module.ts @@ -13,6 +13,7 @@ import { ChartsModule } from 'ng2-charts'; import { RoomJoinComponent } from './room-join/room-join.component'; import { RoomCreateComponent } from './_dialogs/room-create/room-create.component'; import { UserBonusTokenComponent } from './_dialogs/user-bonus-token/user-bonus-token.component'; +import { RemindOfTokensComponent } from './_dialogs/remind-of-tokens/remind-of-tokens.component'; import { LoginComponent } from './login/login.component'; import { CommentComponent } from './comment/comment.component'; import { CreateCommentComponent } from './_dialogs/create-comment/create-comment.component'; @@ -46,6 +47,7 @@ import { ArsModule } from '../../../../projects/ars/src/lib/ars.module'; CommentListComponent, RoomCreateComponent, UserBonusTokenComponent, + RemindOfTokensComponent, LoginComponent, CommentComponent, CreateCommentComponent, @@ -77,6 +79,7 @@ import { ArsModule } from '../../../../projects/ars/src/lib/ars.module'; PresentCommentComponent, DeleteAccountComponent, UserBonusTokenComponent, + RemindOfTokensComponent, CommentAnswerTextComponent ] }) diff --git a/src/app/models/client-authentication.ts b/src/app/models/client-authentication.ts index f25df38ac7cbb66cf0e0ba20727dbd8be1b3b386..bb009d3775cf18ab8754fa6b06d30003637c6721 100644 --- a/src/app/models/client-authentication.ts +++ b/src/app/models/client-authentication.ts @@ -3,10 +3,10 @@ import { AuthProvider } from './auth-provider'; export class ClientAuthentication { userId: string; loginId: string; - authProvider: AuthProvider; + authProvider: string; token: string; - constructor(userId: string, loginId: string, authProvider: AuthProvider, token: string) { + constructor(userId: string, loginId: string, authProvider: string, token: string) { this.userId = userId; this.loginId = loginId; this.authProvider = authProvider; diff --git a/src/app/models/user.ts b/src/app/models/user.ts index 369934fdf1171884a0ca9bdeb4bfc195fe52914a..10c3e6a350fcfc6b76d47b69e187a55344037cce 100644 --- a/src/app/models/user.ts +++ b/src/app/models/user.ts @@ -4,12 +4,12 @@ import { UserRole } from './user-roles.enum'; export class User { id: string; loginId: string; - authProvider: AuthProvider; + authProvider: string; token: string; role: UserRole; isGuest: boolean; - constructor(id: string, loginId: string, authProvider: AuthProvider, token: string, role: UserRole, isGuest: boolean) { + constructor(id: string, loginId: string, authProvider: string, token: string, role: UserRole, isGuest: boolean) { this.id = id; this.loginId = loginId; this.authProvider = authProvider; diff --git a/src/app/services/http/authentication.service.ts b/src/app/services/http/authentication.service.ts index 0152fc7c50901b98e61b9e4473534a8189b39543..dc06f85790f079cb0fd7e7815e0472dd2c5db537 100644 --- a/src/app/services/http/authentication.service.ts +++ b/src/app/services/http/authentication.service.ts @@ -86,7 +86,8 @@ export class AuthenticationService extends BaseHttpService { if (this.dataStoreService.has(this.STORAGE_KEY)) { // Load user data from local data store if available const user: User = JSON.parse(this.dataStoreService.get(this.STORAGE_KEY)); - const wasGuest = (user.authProvider === AuthProvider.ARSNOVA_GUEST) ? true : false; + // ToDo: Fix this madness. + const wasGuest = (user.authProvider === 'ARSNOVA_GUEST') ? true : false; const connectionUrl: string = this.apiUrl.base + this.apiUrl.auth + this.apiUrl.login + '?refresh=true'; this.setUser(new User( user.id, @@ -221,6 +222,8 @@ export class AuthenticationService extends BaseHttpService { private checkLogin(clientAuthentication: Observable<ClientAuthentication>, userRole: UserRole, isGuest: boolean): Observable<string> { return clientAuthentication.pipe(map(result => { if (result) { + // ToDo: Fix this madness. + isGuest = result.authProvider === 'ARSNOVA_GUEST' ? true : false; this.setUser(new User( result.userId, result.loginId, diff --git a/src/assets/i18n/home/de.json b/src/assets/i18n/home/de.json index b7acc93efb14cafc497ebcfd65a0ee7e24eb6beb..be82d92ccc3311897e65b495a73b81c7d3013346 100644 --- a/src/assets/i18n/home/de.json +++ b/src/assets/i18n/home/de.json @@ -47,6 +47,7 @@ "accessibility-session": "Öffnet das Sitzungs-Menü. Hier kannst du deine besuchten Sitzungen einsehen oder dich von deinem Konto abmelden.", "account-deleted": "Dein Konto wurde gelöscht.", "back": "Abbrechen", + "cancel": "Abbrechen", "delete": "Löschen", "delete-account": "Konto löschen", "home-header": "Feedback im Hörsaal", @@ -61,6 +62,7 @@ "really-delete-account": "Willst du dein Konto mit allen Sitzungen unwiderruflich löschen? Falls du Boni vergeben hast (gelbe Sterne), exportiere die Fragen, damit du eingereichte Bonus-Tokens überprüfen kannst.", "sure": "Bist du sicher?", "user-bonus-token": "Zu deinen Bonus Tokens", + "user-got-tokens": "Du hast noch Tokens für Bonuspunkte, die verloren gehen!", "visited-sessions": "Besuchte Sitzungen", "bonus-token": "Tokens für Bonuspunkte", "no-bonus": "Noch keine Bonuspunkte erhalten." diff --git a/src/assets/i18n/home/en.json b/src/assets/i18n/home/en.json index 15cd45d1a65cb19171517b1bf3a883f87187cf46..69bcfd9f6747e867bda349937ff9f23003ac219c 100644 --- a/src/assets/i18n/home/en.json +++ b/src/assets/i18n/home/en.json @@ -48,6 +48,7 @@ "accessibility-session": "Open the session menu. Here you can view the sessions you have attended or log out of your account.", "account-deleted": "Your account has been deleted.", "back": "Cancel", + "cancel": "Cancel", "delete": "Delete", "delete-account": "Delete account", "home-header": "Feedback in the lecture hall", @@ -62,6 +63,7 @@ "really-delete-account": "Do you want to irrevocably delete your account with all sessions? If you have given bonuses (yellow stars), export the questions so that you can check submitted bonus tokens.", "sure": "Are you sure?", "user-bonus-token": "See your bonus tokens", + "user-got-tokens": "You have bonus tokens linked to this account that will be lost!", "visited-sessions": "Visited sessions", "bonus-token": "Tokens for bonus points", "no-bonus": "No bonus points earned yet."