From b081cf1df2ea0d0141b9640ec72455d40b7fe29a Mon Sep 17 00:00:00 2001 From: tekay <tom.kaesler@mni.thm.de> Date: Sun, 8 Mar 2020 14:40:47 +0100 Subject: [PATCH] Error handling for updating general room settings --- .../_dialogs/room-edit/room-edit.component.html | 7 +++++++ .../_dialogs/room-edit/room-edit.component.ts | 13 ++++++++++++- .../room-creator-page.component.ts | 17 +++++++++-------- src/app/services/http/base-http.service.ts | 4 ++-- src/assets/i18n/creator/de.json | 2 ++ src/assets/i18n/creator/en.json | 2 ++ 6 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/app/components/creator/_dialogs/room-edit/room-edit.component.html b/src/app/components/creator/_dialogs/room-edit/room-edit.component.html index 272e55587..59720f992 100644 --- a/src/app/components/creator/_dialogs/room-edit/room-edit.component.html +++ b/src/app/components/creator/_dialogs/room-edit/room-edit.component.html @@ -6,9 +6,16 @@ <mat-form-field class="input-block"> <input (focus)="eventService.makeFocusOnInputTrue()" (blur)="eventService.makeFocusOnInputFalse()" [(ngModel)]="editRoom.name" matInput + [formControl]="roomNameFormControl" name="room-name" maxlength="20" aria-labelledby="room-name"/> <mat-placeholder class="placeholder">{{ 'session.session-name' | translate }}</mat-placeholder> <mat-hint align="end"><span aria-hidden="true">{{ editRoom.name.length }} / 20</span></mat-hint> + <mat-error *ngIf=" + roomNameFormControl.hasError() + || roomNameFormControl.hasError('minlength') + || roomNameFormControl.hasError('maxlength')"> + {{ 'room-page.name-length-error' | translate }} + </mat-error> </mat-form-field> <mat-tab-group> <mat-tab label="{{'room-page.description' | translate}}"> diff --git a/src/app/components/creator/_dialogs/room-edit/room-edit.component.ts b/src/app/components/creator/_dialogs/room-edit/room-edit.component.ts index c50e79b6b..f3acea17e 100644 --- a/src/app/components/creator/_dialogs/room-edit/room-edit.component.ts +++ b/src/app/components/creator/_dialogs/room-edit/room-edit.component.ts @@ -1,4 +1,5 @@ import { Component, Inject, OnInit } from '@angular/core'; +import { FormControl, Validators } from '@angular/forms'; import { Room } from '../../../../models/room'; import { MAT_DIALOG_DATA, MatDialog, MatDialogRef } from '@angular/material/dialog'; import { RoomDeleteComponent } from '../room-delete/room-delete.component'; @@ -18,6 +19,8 @@ import { RoomDeleted } from '../../../../models/events/room-deleted'; export class RoomEditComponent implements OnInit { editRoom: Room; + roomNameFormControl = new FormControl('', [Validators.required, Validators.minLength(3), Validators.maxLength(20)]); + constructor(public dialogRef: MatDialogRef<RoomCreatorPageComponent>, public dialog: MatDialog, public notificationService: NotificationService, @@ -64,6 +67,14 @@ export class RoomEditComponent implements OnInit { this.dialogRef.close(type); } + save(): void { + if (!this.roomNameFormControl.hasError('required') + && !this.roomNameFormControl.hasError('minlength') + && !this.roomNameFormControl.hasError('maxlength')) { + this.closeDialog('update'); + } + } + /** * Returns a lambda which closes the dialog on call. @@ -77,6 +88,6 @@ export class RoomEditComponent implements OnInit { * Returns a lambda which executes the dialog dedicated action on call. */ buildSaveActionCallback(): () => void { - return () => this.closeDialog('update'); + return () => this.save(); } } 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 a5d768653..b8bba073c 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 @@ -107,12 +107,6 @@ export class RoomCreatorPageComponent extends RoomPageComponent implements OnIni } - updateGeneralSettings() { - this.room.name = this.updRoom.name; - this.room.description = this.updRoom.description; - this.saveChanges(); - } - updateCommentSettings(settings: CommentSettingsDialog) { const commentExtension: TSMap<string, any> = new TSMap(); commentExtension.set('enableThreshold', settings.enableThreshold); @@ -130,6 +124,8 @@ export class RoomCreatorPageComponent extends RoomPageComponent implements OnIni this.moderationEnabled = settings.enableModeration; localStorage.setItem('moderationEnabled', String(this.moderationEnabled)); + + this.updRoom.extensions['comments'] = commentExtension; } resetThreshold(): void { @@ -139,12 +135,17 @@ export class RoomCreatorPageComponent extends RoomPageComponent implements OnIni } saveChanges() { - this.roomService.updateRoom(this.room) + this.roomService.updateRoom(this.updRoom) .subscribe((room) => { this.room = room; this.translateService.get('room-page.changes-successful').subscribe(msg => { this.notification.show(msg); }); + }, + error => { + this.translateService.get('room-page.changes-gone-wrong').subscribe(msg => { + this.notification.show(msg); + }); }); } @@ -159,7 +160,7 @@ export class RoomCreatorPageComponent extends RoomPageComponent implements OnIni if (result === 'abort') { return; } else if (result !== 'delete') { - this.updateGeneralSettings(); + this.saveChanges(); } }); dialogRef.backdropClick().subscribe( res => { diff --git a/src/app/services/http/base-http.service.ts b/src/app/services/http/base-http.service.ts index e3eb04d1d..9bb0703a3 100644 --- a/src/app/services/http/base-http.service.ts +++ b/src/app/services/http/base-http.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { of , Observable } from 'rxjs'; +import { of , Observable, throwError } from 'rxjs'; @Injectable() export class BaseHttpService { @@ -10,7 +10,7 @@ export class BaseHttpService { public handleError<T>(operation = 'operation', result?: T) { return (error: any): Observable<T> => { console.error(error); - return of(result as T); + return throwError(error); }; } } diff --git a/src/assets/i18n/creator/de.json b/src/assets/i18n/creator/de.json index 1a6c068d5..891b14fac 100644 --- a/src/assets/i18n/creator/de.json +++ b/src/assets/i18n/creator/de.json @@ -183,6 +183,7 @@ "no-bonus": "Es wurden noch keine Bonuspunkte vergeben.", "cancel": "Abbrechen", "cancel-description": "Abbrechen", + "changes-gone-wrong": "Etwas ist schief gelaufen!", "changes-successful": "Änderungen gespeichert.", "comments": "Fragen", "comments-deleted": "Alle Fragen wurden gelöscht.", @@ -206,6 +207,7 @@ "moderator-not-found": "Kein User mit dieser Mail-Adresse gefunden.", "moderator-removed": "Moderator wurde entfernt.", "moderators": "Moderatoren", + "name-length-error": "Titel muss zwischen 3 und 20 Zeichen liegen", "no-moderators": "", "present": "Präsentieren", "public-stream": "Fragen", diff --git a/src/assets/i18n/creator/en.json b/src/assets/i18n/creator/en.json index 037bc0bf3..492c433e0 100644 --- a/src/assets/i18n/creator/en.json +++ b/src/assets/i18n/creator/en.json @@ -184,6 +184,7 @@ "no-bonus": "No bonus points have been given yet.", "cancel": "Cancel", "cancel-description": "Cancel", + "changes-gone-wrong": "Something went wrong!", "changes-successful": "Successfully updated.", "comments": "Questions", "comments-deleted": "All questions have been deleted.", @@ -207,6 +208,7 @@ "moderator-not-found": "No user was found with this E-Mail.", "moderator-removed": "Moderator has been removed.", "moderators": "Moderators", + "name-length-error": "Titel must be between 3 and 20 characters.", "no-moderators": "No moderators yet", "present": "Present", "public-stream": "Questions", -- GitLab