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