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 272e5558709a1ff4e98cce18bb1a733bcfa7f49c..59720f99287d66ccd6cc82eecd46227a9d477053 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 c50e79b6b898bf58d8740ed38e70b6bcfff978db..f3acea17e1c178db1e636577e80fa44c3a02a26a 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 a5d76865344e1df713339c3233d15c3102bbaa9c..b8bba073c7345a3b03a186a95456a5584fcd37f0 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 e3eb04d1d7ba1f5f1cb33373e16bde20d5676dcf..9bb0703a3cb527b6401af73f63262fe91cc1a9dc 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 1a6c068d5aca349ef22535a12ec98884d85b013b..891b14fac670328f6a27ccee024002cd64121ebd 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 037bc0bf3a37aeb581000e47be149454bd2672df..492c433e03162d7db51f70cab8e53f40d614900b 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",