diff --git a/src/app/creator-home-screen/creator-home-screen.component.ts b/src/app/creator-home-screen/creator-home-screen.component.ts index e026cbc3ed3e95d28284bfee0ac64ac8605ac5b5..6b964e39626851567fc3c3b9b49a0da64b9b1ec1 100644 --- a/src/app/creator-home-screen/creator-home-screen.component.ts +++ b/src/app/creator-home-screen/creator-home-screen.component.ts @@ -1,8 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { MatDialog } from '@angular/material'; import { RoomCreationComponent } from '../room-creation/room-creation.component'; -import { RoomListComponent } from '../room-list/room-list.component'; -import { Room } from '../room'; @Component({ selector: 'app-creator-home-screen', diff --git a/src/app/creator-room/creator-room.component.html b/src/app/creator-room/creator-room.component.html index 79ca12101fc5b56db7f08b1334709605825578c8..704641eb1ee18f3b9d7dfcd5ce5061d5e0e6f5ab 100644 --- a/src/app/creator-room/creator-room.component.html +++ b/src/app/creator-room/creator-room.component.html @@ -1,6 +1,7 @@ <div fxLayout="column" fxLayoutAlign="start" fxLayoutGap="20px" fxFill> <div fxLayout="row" fxLayoutAlign="center"> - <mat-card *ngIf="room"> + <mat-progress-spinner *ngIf="isLoading" mode="indeterminate"></mat-progress-spinner> + <mat-card *ngIf="room && !deleteDialog"> <mat-card-header> <mat-card-title><h3 class="subheading-2">{{ room.name }}</h3></mat-card-title> <mat-card-subtitle>{{ room.id }}</mat-card-subtitle> @@ -19,17 +20,30 @@ <button mat-button color="primary" matTooltip="See contents"> Contents </button> - <button mat-button color="primary" matTooltip="See room comments" routerLink="/creator/room/{{room.id}}/comments"> + <button mat-button color="primary" matTooltip="See room comments" + routerLink="/creator/room/{{room.id}}/comments"> Comments </button> - <button mat-button color="warn" matTooltip="Delete selected room"> + <button mat-button color="warn" (click)="showDeletionDialog()"> Delete room </button> - <button mat-button color="primary" matTooltip="Go back to last page" (click)="goBack()"> + <button mat-button color="primary" (click)="goBack()"> Go back </button> </mat-card-actions> </mat-card> - <div *ngIf="!isLoading && !room">Error</div> + <mat-card *ngIf="deleteDialog"> + <mat-card-header><h3>Do you really want to delete this room?<br>This action can not be undone.</h3> + </mat-card-header> + <mat-card-content> + <button mat-raised-button color="warn" (click)="deleteRoom(room)"> + Delete room + </button> + <button mat-raised-button color="primary" (click)="hideDeletionDialog()"> + Leave + </button> + </mat-card-content> + </mat-card> + <div *ngIf="!isLoading && !room">Error: room could not be found!</div> </div> </div> diff --git a/src/app/creator-room/creator-room.component.ts b/src/app/creator-room/creator-room.component.ts index ed782a4a2a2de6c1f8eec65afd88d4974117aa92..aed237218bb958e9404c32e970f6db1f31c93e08 100644 --- a/src/app/creator-room/creator-room.component.ts +++ b/src/app/creator-room/creator-room.component.ts @@ -4,6 +4,7 @@ import { ActivatedRoute } from '@angular/router'; import { RoomComponent } from '../room/room.component'; import { Room } from '../room'; import { Location } from '@angular/common'; +import { NotificationService } from '../notification.service'; @Component({ selector: 'app-creator-room', @@ -12,11 +13,13 @@ import { Location } from '@angular/common'; }) export class CreatorRoomComponent extends RoomComponent implements OnInit { room: Room; + deleteDialog = false; constructor(protected roomService: RoomService, + protected notification: NotificationService, protected route: ActivatedRoute, - private location: Location) { - super(roomService, route); + protected location: Location) { + super(roomService, route, location); } ngOnInit() { @@ -29,4 +32,17 @@ export class CreatorRoomComponent extends RoomComponent implements OnInit { this.location.back(); } + showDeletionDialog(): void { + this.deleteDialog = true; + } + + hideDeletionDialog(): void { + this.deleteDialog = false; + } + + deleteRoom(room: Room): void { + const msg = room.name + ' deleted'; + this.notification.show(msg); + this.delete(room); + } } diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html index 9a4d84a58c240ef460c7edd301c61d34af11e2fc..6a4876b571b7a370a9a2f5ef726b7e4c88a287e8 100644 --- a/src/app/login/login.component.html +++ b/src/app/login/login.component.html @@ -3,17 +3,16 @@ <mat-form-field class="input-block"> <input matInput #userEmail placeholder="E-mail" [formControl]="usernameFormControl" [errorStateMatcher]="matcher" name="username"/> - <mat-error *ngIf="usernameFormControl.hasError('email') && !usernameFormControl.hasError('required')">Please enter a <strong>valid</strong> e-mail address. + <mat-error *ngIf="usernameFormControl.hasError('email') && !usernameFormControl.hasError('required')">Please enter a + <strong>valid</strong> e-mail address. </mat-error> <mat-error *ngIf="usernameFormControl.hasError('required')">E-mail is <strong>required</strong>.</mat-error> </mat-form-field> - <mat-form-field class="input-block"> <input matInput #userPassword type="password" placeholder="Password" [formControl]="passwordFormControl" [errorStateMatcher]="matcher" name="password"/> <mat-error *ngIf="passwordFormControl.hasError('required')">Password is <strong>required</strong>.</mat-error> </mat-form-field> - <button mat-raised-button color="primary" type="submit">Login</button> <button mat-raised-button *ngIf="role === UserRole.PARTICIPANT" (click)="guestLogin()">Login as guest diff --git a/src/app/room-creation/room-creation.component.html b/src/app/room-creation/room-creation.component.html index 23b91198447d7634d77c4b21d18aeae6b0b39ae4..75666e5360428f647b6b8b9102f828f3d6bac522 100644 --- a/src/app/room-creation/room-creation.component.html +++ b/src/app/room-creation/room-creation.component.html @@ -1,24 +1,28 @@ <form (ngSubmit)="addRoom(longRoomName.value, shortRoomName.value)"> <div fxLayout="column" fxLayoutAlign="center" fxLayoutGap="10px"> <mat-form-field> - <input matInput #longRoomName class="input-block" type="text" placeholder="Name" maxlength="50" + <input (keypress)="resetEmptyInputs()" matInput #longRoomName class="input-block" type="text" placeholder="Name" + maxlength="50" [(ngModel)]="longName"/> - <mat-hint align="start"><strong>Max. letters / signs:</strong></mat-hint> - <mat-hint align="end">{{longRoomName.value.length}} / 50</mat-hint> + <mat-hint align="start" *ngIf="!emptyInputs"><strong>Max. letters / signs:</strong></mat-hint> + <mat-hint align="end" *ngIf="!emptyInputs">{{longRoomName.value.length}} / 50</mat-hint> + <mat-hint align="start" *ngIf="emptyInputs"><strong>Input is required</strong></mat-hint> <button mat-button *ngIf="longName" matSuffix mat-icon-button aria-label="Clear" (click)="longName=''"> <mat-icon>close</mat-icon> </button> </mat-form-field> - <mat-form-field> - <input matInput #shortRoomName class="input-block" type="text" placeholder="Short name" maxlength="8" + <input (keypress)="resetEmptyInputs()" matInput #shortRoomName class="input-block" type="text" + placeholder="Short name" maxlength="8" [(ngModel)]="shortName"/> - <mat-hint align="start"><strong>Max. letters / signs:</strong></mat-hint> - <mat-hint align="end">{{shortRoomName.value.length}} / 8</mat-hint> + <mat-hint align="start" *ngIf="!emptyInputs"><strong>Max. letters / signs:</strong></mat-hint> + <mat-hint align="end" *ngIf="!emptyInputs">{{shortRoomName.value.length}} / 8</mat-hint> + <mat-hint align="start" *ngIf="emptyInputs"><strong>Input is required</strong></mat-hint> <button mat-button *ngIf="shortName" matSuffix mat-icon-button aria-label="Clear" (click)="shortName=''"> <mat-icon>close</mat-icon> </button> </mat-form-field> - <button mat-raised-button color="primary" type="submit">Create room</button> + <button mat-raised-button color="primary" type="submit">Create room + </button> </div> </form> diff --git a/src/app/room-creation/room-creation.component.ts b/src/app/room-creation/room-creation.component.ts index dddc2900b19009c4d8cffbc99bbbc74415fd0480..ffb25d98e74d5820a7e63ba81e079b14c92e88fa 100644 --- a/src/app/room-creation/room-creation.component.ts +++ b/src/app/room-creation/room-creation.component.ts @@ -13,6 +13,7 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; export class RoomCreationComponent implements OnInit { longName: string; shortName: string; + emptyInputs = false; constructor(private roomService: RoomService, private router: Router, @@ -28,10 +29,15 @@ export class RoomCreationComponent implements OnInit { ngOnInit() { } + resetEmptyInputs(): void { + this.emptyInputs = false; + } + addRoom(longRoomName: string, shortRoomName: string) { longRoomName = longRoomName.trim(); shortRoomName = shortRoomName.trim(); if (!longRoomName || !shortRoomName) { + this.emptyInputs = true; return; } this.roomService.addRoom({ name: longRoomName, abbreviation: shortRoomName } as Room) diff --git a/src/app/room-list/room-list.component.ts b/src/app/room-list/room-list.component.ts index a5dd6a3d2de3f4a0ddc07df670d6be02b3e9cea1..f89e1e2d77cb5f0c52515b57441ed0a25b490a48 100644 --- a/src/app/room-list/room-list.component.ts +++ b/src/app/room-list/room-list.component.ts @@ -1,8 +1,8 @@ import { Component, OnInit } from '@angular/core'; import { Room } from '../room'; import { RoomService } from '../room.service'; -import { AuthenticationService} from '../authentication.service'; -import {UserRole} from '../user-roles.enum'; +import { AuthenticationService } from '../authentication.service'; +import { UserRole } from '../user-roles.enum'; @Component({ selector: 'app-room-list', diff --git a/src/app/room.service.ts b/src/app/room.service.ts index 5f4fc2796b9dc7e031a00103aeca388e111c1e8a..7a6b3f9d1468f0db5bfe59dc6db7c735470b1e58 100644 --- a/src/app/room.service.ts +++ b/src/app/room.service.ts @@ -37,4 +37,14 @@ export class RoomService extends ErrorHandlingService { catchError(this.handleError<Room>(`getRoom id=${id}`)) ); } + + deleteRoom (room: Room | string): Observable<Room> { + const id = typeof room === 'string' ? room : room.id; + const url = `${this.roomsUrl}/${id}`; + + return this.http.delete<Room>(url, httpOptions).pipe( + tap(_ => ''), + catchError(this.handleError<Room>('deleteRoom')) + ); + } } diff --git a/src/app/room/room.component.ts b/src/app/room/room.component.ts index 800b70b5bfaa7a6e21094e78179168e53b6bdc44..1d4c01da8ed94fde5aba068d3b5b4b396355f117 100644 --- a/src/app/room/room.component.ts +++ b/src/app/room/room.component.ts @@ -2,6 +2,7 @@ import { Component, OnInit } from '@angular/core'; import { Room } from '../room'; import { RoomService } from '../room.service'; import { ActivatedRoute } from '@angular/router'; +import { Location } from '@angular/common'; @Component({ selector: 'app-room', @@ -10,9 +11,11 @@ import { ActivatedRoute } from '@angular/router'; }) export class RoomComponent implements OnInit { room: Room = null; + isLoading = true; constructor(protected roomService: RoomService, - protected route: ActivatedRoute) { + protected route: ActivatedRoute, + protected location: Location) { } ngOnInit() { @@ -22,6 +25,14 @@ export class RoomComponent implements OnInit { } getRoom(id: string): void { - this.roomService.getRoom(id).subscribe(room => this.room = room); + this.roomService.getRoom(id).subscribe(room => { + this.room = room; + this.isLoading = false; + }); + } + + delete(room: Room): void { + this.roomService.deleteRoom(room).subscribe(); + this.location.back(); } }