diff --git a/proxy.conf.json b/proxy.conf.json index 86e0c8f7a51a795c65c599fc11653a4008994b31..64aac1fae4c1ba022285310c6df4fadf402edbd7 100644 --- a/proxy.conf.json +++ b/proxy.conf.json @@ -15,6 +15,14 @@ }, "logLevel": "debug" }, + "/api/bonustoken": { + "target": "http://localhost:8088", + "secure": false, + "pathRewrite": { + "^/api": "" + }, + "logLevel": "debug" + }, "/api/settings": { "target": "http://localhost:8088", "secure": false, diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 75d38da8e968e9955baa865528047cc149bf2a2f..7720c73aca2fd1f54c9c2cc65c12b655f9825028 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -41,6 +41,7 @@ import { DemoVideoComponent } from './components/home/_dialogs/demo-video/demo-v import { HomeCreatorPageComponent } from './components/home/home-creator-page/home-creator-page.component'; import { HomeParticipantPageComponent } from './components/home/home-participant-page/home-participant-page.component'; import { CommentSettingsService } from './services/http/comment-settings.service'; +import { BonusTokenService } from './services/http/bonus-token.service'; import { ModeratorModule } from './components/moderator/moderator.module'; import { ImprintComponent } from './components/home/_dialogs/imprint/imprint.component'; import { DataProtectionComponent } from './components/home/_dialogs/data-protection/data-protection.component'; @@ -150,6 +151,7 @@ export function initializeApp(appConfig: AppConfig) { VoteService, ModeratorService, CommentSettingsService, + BonusTokenService, WsConnectorService, { provide: MatDialogRef, diff --git a/src/app/components/creator/_dialogs/bonus-token/bonus-token.component.html b/src/app/components/creator/_dialogs/bonus-token/bonus-token.component.html new file mode 100644 index 0000000000000000000000000000000000000000..0bf87b73ce8ab524580ed75266029ba3ea56fd35 --- /dev/null +++ b/src/app/components/creator/_dialogs/bonus-token/bonus-token.component.html @@ -0,0 +1,9 @@ +<div mat-dialog-content> + <h1>{{'room-page.bonus-token-header' | translate }}</h1> + <mat-divider></mat-divider> + <div fxLayout="row" *ngFor="let bonusToken of bonusTokens"> + <h2> + {{bonusToken.token}} + </h2> + </div> +</div> diff --git a/src/app/components/creator/_dialogs/bonus-token/bonus-token.component.scss b/src/app/components/creator/_dialogs/bonus-token/bonus-token.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..1ca5302796251bf2d66dd74a6cf6e228464b83ad --- /dev/null +++ b/src/app/components/creator/_dialogs/bonus-token/bonus-token.component.scss @@ -0,0 +1,3 @@ +h1,h2,h3,h4,h5,p{ + color: var(--on-surface); +} diff --git a/src/app/components/creator/_dialogs/bonus-token/bonus-token.component.ts b/src/app/components/creator/_dialogs/bonus-token/bonus-token.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..f270f68dcdd1d977265ab74a954be4eae6f1c59d --- /dev/null +++ b/src/app/components/creator/_dialogs/bonus-token/bonus-token.component.ts @@ -0,0 +1,25 @@ +import { Component, OnInit } from '@angular/core'; +import { BonusTokenService } from '../../../../services/http/bonus-token.service'; +import { BonusToken } from '../../../../models/bonus-token'; + +@Component({ + selector: 'app-bonus-token', + templateUrl: './bonus-token.component.html', + styleUrls: ['./bonus-token.component.scss'] +}) +export class BonusTokenComponent implements OnInit { + roomId: string; + bonusTokens: BonusToken[] = []; + + constructor( + private bonusTokenService: BonusTokenService + ) { + + } + + ngOnInit() { + this.bonusTokenService.getTokensByRoomId(this.roomId).subscribe( list => { + this.bonusTokens = list; + }); + } +} diff --git a/src/app/components/creator/creator.module.ts b/src/app/components/creator/creator.module.ts index 049446dea46f00237b10a7f811c3b77c2431542c..b6ec2e716b7c1a2c85e344ab1f5620fe5eee073a 100644 --- a/src/app/components/creator/creator.module.ts +++ b/src/app/components/creator/creator.module.ts @@ -23,6 +23,7 @@ import { ContentEditComponent } from './_dialogs/content-edit/content-edit.compo import { ContentPresentationComponent } from './content-presentation/content-presentation.component'; import { CommentExportComponent } from './_dialogs/comment-export/comment-export.component'; import { ModeratorsComponent } from './_dialogs/moderators/moderators.component'; +import { BonusTokenComponent } from './_dialogs/bonus-token/bonus-token.component'; import { CommentSettingsComponent } from './_dialogs/comment-settings/comment-settings.component'; import { ModeratorDeleteComponent } from './_dialogs/moderator-delete/moderator-delete.component'; import { DeleteCommentComponent } from './_dialogs/delete-comment/delete-comment.component'; @@ -59,6 +60,7 @@ import { DeleteCommentsComponent } from './_dialogs/delete-comments/delete-comme ContentPresentationComponent, CommentExportComponent, ModeratorsComponent, + BonusTokenComponent, CommentSettingsComponent, ModeratorDeleteComponent, DeleteCommentsComponent, @@ -77,6 +79,7 @@ import { DeleteCommentsComponent } from './_dialogs/delete-comments/delete-comme ContentEditComponent, CommentExportComponent, ModeratorsComponent, + BonusTokenComponent, CommentSettingsComponent, ModeratorDeleteComponent, DeleteCommentsComponent, diff --git a/src/app/components/creator/room-creator-page/room-creator-page.component.html b/src/app/components/creator/room-creator-page/room-creator-page.component.html index 0c0c5543a6cd1ed6bbfc9ddf0fed4ab884b6b002..f0f4c815087cc77be517c68994ebe2d6bbce2ea3 100644 --- a/src/app/components/creator/room-creator-page/room-creator-page.component.html +++ b/src/app/components/creator/room-creator-page/room-creator-page.component.html @@ -35,6 +35,10 @@ <mat-icon>gavel</mat-icon> {{ 'room-page.moderators' | translate}} </button> + <button mat-menu-item (click)="showBonusTokenDialog()" aria-labelledby= "person"> + <mat-icon>grade</mat-icon> + {{ 'room-page.bonus-token' | translate}} + </button> </mat-menu> <button id="settings-menu" mat-icon-button class="corner-icons" [matMenuTriggerFor]="settingsMenu" aria-labelledby="settings"> diff --git a/src/app/components/creator/room-creator-page/room-creator-page.component.ts b/src/app/components/creator/room-creator-page/room-creator-page.component.ts index fa6f258398399ad74357c924dd170665b3441f49..a21e930f5e76d8317b134d86634e5ce93794b275 100644 --- a/src/app/components/creator/room-creator-page/room-creator-page.component.ts +++ b/src/app/components/creator/room-creator-page/room-creator-page.component.ts @@ -14,6 +14,7 @@ import { TSMap } from 'typescript-map'; import { WsCommentServiceService } from '../../../services/websockets/ws-comment-service.service'; import { CommentService } from '../../../services/http/comment.service'; import { ModeratorsComponent } from '../_dialogs/moderators/moderators.component'; +import { BonusTokenComponent } from '../_dialogs/bonus-token/bonus-token.component'; import { CommentSettingsComponent } from '../_dialogs/comment-settings/comment-settings.component'; import { LiveAnnouncer } from '@angular/cdk/a11y'; import { EventService } from '../../../services/util/event.service'; @@ -202,6 +203,13 @@ export class RoomCreatorPageComponent extends RoomPageComponent implements OnIni dialogRef.componentInstance.roomId = this.room.id; } + showBonusTokenDialog(): void { + const dialogRef = this.dialog.open(BonusTokenComponent, { + width: '400px' + }); + dialogRef.componentInstance.roomId = this.room.id; + } + copyShortId(): void { const selBox = document.createElement('textarea'); selBox.style.position = 'fixed'; diff --git a/src/app/components/shared/_dialogs/user-bonus-token/user-bonus-token.component.html b/src/app/components/shared/_dialogs/user-bonus-token/user-bonus-token.component.html new file mode 100644 index 0000000000000000000000000000000000000000..6584f5b1de946ac9e3748e70b4b665a5211d10bf --- /dev/null +++ b/src/app/components/shared/_dialogs/user-bonus-token/user-bonus-token.component.html @@ -0,0 +1,9 @@ +<div mat-dialog-content> + <h1>{{'user-bonus-token-dialog.header' | translate }}</h1> + <mat-divider></mat-divider> + <div fxLayout="row" *ngFor="let bonusToken of bonusTokens"> + <h2> + {{bonusToken.token}} + </h2> + </div> +</div> diff --git a/src/app/components/shared/_dialogs/user-bonus-token/user-bonus-token.component.scss b/src/app/components/shared/_dialogs/user-bonus-token/user-bonus-token.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..1ca5302796251bf2d66dd74a6cf6e228464b83ad --- /dev/null +++ b/src/app/components/shared/_dialogs/user-bonus-token/user-bonus-token.component.scss @@ -0,0 +1,3 @@ +h1,h2,h3,h4,h5,p{ + color: var(--on-surface); +} diff --git a/src/app/components/shared/_dialogs/user-bonus-token/user-bonus-token.component.ts b/src/app/components/shared/_dialogs/user-bonus-token/user-bonus-token.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..e9cab7ee728e1424e830fb68aa58f49d3133843e --- /dev/null +++ b/src/app/components/shared/_dialogs/user-bonus-token/user-bonus-token.component.ts @@ -0,0 +1,25 @@ +import { Component, OnInit } from '@angular/core'; +import { BonusTokenService } from '../../../../services/http/bonus-token.service'; +import { BonusToken } from '../../../../models/bonus-token'; + +@Component({ + selector: 'app-user-bonus-token', + templateUrl: './user-bonus-token.component.html', + styleUrls: ['./user-bonus-token.component.scss'] +}) +export class UserBonusTokenComponent implements OnInit { + userId: string; + bonusTokens: BonusToken[] = []; + + constructor( + private bonusTokenService: BonusTokenService + ) { + + } + + ngOnInit() { + this.bonusTokenService.getTokensByUserId(this.userId).subscribe( list => { + this.bonusTokens = list; + }); + } +} diff --git a/src/app/components/shared/comment-list/comment-list.component.ts b/src/app/components/shared/comment-list/comment-list.component.ts index ee51099102650c28e50b1a45203fe49f5e7fbf75..d24eb3271adc0b8eb4a059c1aafd0065071fa553 100644 --- a/src/app/components/shared/comment-list/comment-list.component.ts +++ b/src/app/components/shared/comment-list/comment-list.component.ts @@ -196,8 +196,8 @@ export class CommentListComponent implements OnInit { this.comments[i].favorite = <boolean>value; console.log(this.comments[i]); if (this.user.id === this.comments[i].creatorId && <boolean>value) { - this.translateService.get('comment-list.comment-got-favorited').subscribe( msg => { - this.notificationService.show(msg); + this.translateService.get('comment-list.comment-got-favorited').subscribe(ret => { + this.notificationService.show(ret); }); } break; diff --git a/src/app/components/shared/header/header.component.html b/src/app/components/shared/header/header.component.html index 2787fecc6b79c305f1a721693e403231ccc366c1..29c3faa3c7a14304a28900e8c76ee85df985f34f 100644 --- a/src/app/components/shared/header/header.component.html +++ b/src/app/components/shared/header/header.component.html @@ -34,6 +34,10 @@ <span *ngIf="!user.isGuest">{{'header.my-sessions' | translate}}</span> <span *ngIf="user.isGuest" svgIcon="meeting_room">{{'header.visited-sessions' | translate}}</span> </button> + <button mat-menu-item *ngIf="user" (click)="openUserBonusTokenDialog()"> + <mat-icon color="warn">grade</mat-icon> + <span>{{'header.user-bonus-token' | translate}}</span> + </button> <button mat-menu-item *ngIf="user && !user.isGuest" (click)="openDeleteUserDialog()"> <mat-icon color="warn">delete</mat-icon> <span>{{'header.delete-account' | translate}}</span> diff --git a/src/app/components/shared/header/header.component.ts b/src/app/components/shared/header/header.component.ts index 9ebd8deabae25f21d07ef6dc6e8eae502efd3c19..16ad1a1fce8799c76f6c50e85b4c63241d7fac46 100644 --- a/src/app/components/shared/header/header.component.ts +++ b/src/app/components/shared/header/header.component.ts @@ -15,6 +15,7 @@ import { AppComponent } from '../../../app.component'; 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'; @Component({ selector: 'app-header', @@ -151,6 +152,13 @@ export class HeaderComponent implements OnInit { }); } + openUserBonusTokenDialog() { + const dialogRef = this.dialog.open(UserBonusTokenComponent, { + width: '600px' + }); + dialogRef.componentInstance.userId = this.user.id; + } + cookiesDisabled(): boolean { return localStorage.getItem('cookieAccepted') === 'false'; } diff --git a/src/app/components/shared/shared.module.ts b/src/app/components/shared/shared.module.ts index 215e162dc5b3f7945410fe3b26c3f9927776a885..b35a47dba07aca62db06b77f0385f6637b7bf0fa 100644 --- a/src/app/components/shared/shared.module.ts +++ b/src/app/components/shared/shared.module.ts @@ -19,6 +19,7 @@ import { ChartsModule } from 'ng2-charts'; import { StatisticComponent } from './statistic/statistic.component'; 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 { LoginComponent } from './login/login.component'; import { StatisticHelpComponent } from './_dialogs/statistic-help/statistic-help.component'; import { CommentComponent } from './comment/comment.component'; @@ -54,6 +55,7 @@ import { MatRippleModule } from '@angular/material'; ListStatisticComponent, StatisticComponent, RoomCreateComponent, + UserBonusTokenComponent, LoginComponent, StatisticHelpComponent, CommentComponent, @@ -88,7 +90,8 @@ import { MatRippleModule } from '@angular/material'; StatisticHelpComponent, CreateCommentComponent, PresentCommentComponent, - DeleteAccountComponent + DeleteAccountComponent, + UserBonusTokenComponent ] }) export class SharedModule { diff --git a/src/app/models/bonus-token.ts b/src/app/models/bonus-token.ts new file mode 100644 index 0000000000000000000000000000000000000000..2c1ac3fd2cb3dada67b59926076f0f22b1205001 --- /dev/null +++ b/src/app/models/bonus-token.ts @@ -0,0 +1,15 @@ +export class BonusToken { + roomId: string; + userId: string; + token: string; + + constructor( + roomId: string, + userId: string, + token: string + ) { + this.roomId = roomId; + this.userId = userId; + this.token = token; + } +} diff --git a/src/app/services/http/bonus-token.service.ts b/src/app/services/http/bonus-token.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..e85583249af7624fe545d01be0bef5b2ffa16354 --- /dev/null +++ b/src/app/services/http/bonus-token.service.ts @@ -0,0 +1,47 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { BonusToken } from '../../models/bonus-token'; +import { catchError, tap } from 'rxjs/operators'; +import { BaseHttpService } from './base-http.service'; + +const httpOptions = { + headers: new HttpHeaders({ 'Content-Type': 'application/json' }) +}; + +@Injectable() +export class BonusTokenService extends BaseHttpService { + private apiUrl = { + base: '/api', + bonustoken: '/bonustoken', + find: '/find' + }; + + constructor(private http: HttpClient) { + super(); + } + + getTokensByRoomId(roomId: string): Observable<BonusToken[]> { + const connectionUrl = `${this.apiUrl.base + this.apiUrl.bonustoken + this.apiUrl.find}`; + return this.http.post<BonusToken[]>(connectionUrl, { + properties: { + roomId: roomId + } + }).pipe( + tap(() => ''), + catchError(this.handleError<BonusToken[]>(`get bonus token by roomid = ${roomId}`)) + ); + } + + getTokensByUserId(userId: string): Observable<BonusToken[]> { + const connectionUrl = `${this.apiUrl.base + this.apiUrl.bonustoken + this.apiUrl.find}`; + return this.http.post<BonusToken[]>(connectionUrl, { + properties: { + userId: userId + } + }).pipe( + tap(() => ''), + catchError(this.handleError<BonusToken[]>(`get bonus token by userId = ${userId}`)) + ); + } +} diff --git a/src/assets/i18n/creator/de.json b/src/assets/i18n/creator/de.json index 187d4f215e99663057f7cd171a8e529ed783caa3..9e77aad3f1c3b2dee85e282048aad762d9898379 100644 --- a/src/assets/i18n/creator/de.json +++ b/src/assets/i18n/creator/de.json @@ -161,6 +161,8 @@ "a11y-threshold": "Schieberegler zum Einstellen des Schwellenwerts für sichtbare Fragen", "abort": "Abbrechen", "answer-statistics": "Statistiken", + "bonus-token": "Tokens für Bonuspunkte", + "bonus-token-header": "Tokens für Bonuspunkte", "cancel": "Abbrechen", "cancel-description": "Abbrechen", "changes-successful": "Änderungen gespeichert.", diff --git a/src/assets/i18n/creator/en.json b/src/assets/i18n/creator/en.json index 8213a39016821a2453d9aca055f73972feba0e45..3d501f59f634efd176566b1fb1f32485e0db9c4f 100644 --- a/src/assets/i18n/creator/en.json +++ b/src/assets/i18n/creator/en.json @@ -162,6 +162,8 @@ "a11y-threshold": "Slider for setting the threshold for visible questions", "abort": "Abort", "answer-statistics": "Statistics", + "bonus-token": "Tokens for bonus points", + "bonus-token-header": "Tokens for bonus points", "cancel": "Cancel", "cancel-description": "Cancel", "changes-successful": "Successfully updated.", diff --git a/src/assets/i18n/home/de.json b/src/assets/i18n/home/de.json index 17fd185d8836bb310c1e98e1e57bb0d80748b3c3..817940cc1f27bda5d91dc94b7d21c28d05d83fbc 100644 --- a/src/assets/i18n/home/de.json +++ b/src/assets/i18n/home/de.json @@ -59,6 +59,7 @@ "my-sessions": "Meine Sitzungen", "really-delete-account": "Willst du dein Konto mit allen Sitzungen unwiderruflich löschen?", "sure": "Bist du sicher?", + "user-bonus-token": "Zu deinen Bonus Tokens", "visited-sessions": "Besuchte Sitzungen" }, "help": { @@ -220,5 +221,8 @@ "activation-key-input-description": "Gib hier den Aktivierungs-Schlüssel ein, den du per E-Mail zugesendet bekommen hast.", "cancel": "Abbrechen", "cancel-description": "Abbrechen" + }, + "user-bonus-token": { + "header": "Tokens für Bonuspunkte" } } diff --git a/src/assets/i18n/home/en.json b/src/assets/i18n/home/en.json index c863114fa9e4b3eee0f5d9d7b67a3b878e77137f..6c0a845a53e56afbbb24f8f4be49eeb030243761 100644 --- a/src/assets/i18n/home/en.json +++ b/src/assets/i18n/home/en.json @@ -60,6 +60,7 @@ "my-sessions": "My sessions", "really-delete-account": "Do you really want to irrevocably delete your account with the associated sessions?", "sure": "Are you sure?", + "user-bonus-token": "See your bonus tokens", "visited-sessions": "Visited sessions" }, "help": { @@ -222,5 +223,8 @@ "activation-key-input-description": "Enter the activation key that you received by e-mail.", "cancel": "Cancel", "cancel-description": "Cancel" + }, + "user-bonus-token-dialog": { + "header": "Tokens for bonus points" } }