From c15f2274552281729c7fe887351134981dd69527 Mon Sep 17 00:00:00 2001
From: Lukas Haase <lukas.haase@mni.thm.de>
Date: Tue, 10 Aug 2021 13:01:37 +0200
Subject: [PATCH] add profanity filter settings, add session description
 settings

---
 .../profanity-settings.component.html         | 24 ++++++
 .../profanity-settings.component.scss         |  0
 .../profanity-settings.component.spec.ts      | 25 ++++++
 .../profanity-settings.component.ts           | 85 +++++++++++++++++++
 .../room-description-settings.component.html  | 43 ++++++++++
 .../room-description-settings.component.scss  |  0
 ...oom-description-settings.component.spec.ts | 25 ++++++
 .../room-description-settings.component.ts    | 57 +++++++++++++
 src/app/components/creator/creator.module.ts  |  6 +-
 .../room-creator-page.component.html          |  9 --
 .../room-creator-page.component.ts            | 19 +++--
 .../shared/header/header.component.html       |  4 +-
 .../shared/header/header.component.ts         |  4 -
 13 files changed, 277 insertions(+), 24 deletions(-)
 create mode 100644 src/app/components/creator/_dialogs/profanity-settings/profanity-settings.component.html
 create mode 100644 src/app/components/creator/_dialogs/profanity-settings/profanity-settings.component.scss
 create mode 100644 src/app/components/creator/_dialogs/profanity-settings/profanity-settings.component.spec.ts
 create mode 100644 src/app/components/creator/_dialogs/profanity-settings/profanity-settings.component.ts
 create mode 100644 src/app/components/creator/_dialogs/room-description-settings/room-description-settings.component.html
 create mode 100644 src/app/components/creator/_dialogs/room-description-settings/room-description-settings.component.scss
 create mode 100644 src/app/components/creator/_dialogs/room-description-settings/room-description-settings.component.spec.ts
 create mode 100644 src/app/components/creator/_dialogs/room-description-settings/room-description-settings.component.ts

diff --git a/src/app/components/creator/_dialogs/profanity-settings/profanity-settings.component.html b/src/app/components/creator/_dialogs/profanity-settings/profanity-settings.component.html
new file mode 100644
index 000000000..1915d7b3d
--- /dev/null
+++ b/src/app/components/creator/_dialogs/profanity-settings/profanity-settings.component.html
@@ -0,0 +1,24 @@
+<div mat-dialog-content
+     *ngIf="editRoom">
+  <div fxLayout="column">
+    <mat-slide-toggle (change)="showMessage('words-will-be-overwritten', $event.checked)" [(ngModel)]="profanityCheck">
+      {{ 'room-page.profanity-filter' | translate }}
+    </mat-slide-toggle>
+    <mat-slide-toggle *ngIf="profanityCheck"
+                      (change)="showMessage('only-specific-language-will-be-filtered', $event.checked)"
+                      [(ngModel)]="censorLanguageSpecificCheck">
+      {{ 'room-page.language-specific-filter' | translate }}
+    </mat-slide-toggle>
+    <mat-slide-toggle *ngIf="profanityCheck" (change)="showMessage('partial-words-will-be-filtered', $event.checked)"
+                      [(ngModel)]="censorPartialWordsCheck">
+      {{ 'room-page.partial-words-filter' | translate }}
+    </mat-slide-toggle>
+  </div>
+</div>
+<app-dialog-action-buttons
+  buttonsLabelSection="room-page"
+  confirmButtonLabel="update"
+
+  [cancelButtonClickAction]="buildCloseDialogActionCallback()"
+  [confirmButtonClickAction]="buildSaveActionCallback()"
+></app-dialog-action-buttons>
diff --git a/src/app/components/creator/_dialogs/profanity-settings/profanity-settings.component.scss b/src/app/components/creator/_dialogs/profanity-settings/profanity-settings.component.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/app/components/creator/_dialogs/profanity-settings/profanity-settings.component.spec.ts b/src/app/components/creator/_dialogs/profanity-settings/profanity-settings.component.spec.ts
new file mode 100644
index 000000000..7e625fee1
--- /dev/null
+++ b/src/app/components/creator/_dialogs/profanity-settings/profanity-settings.component.spec.ts
@@ -0,0 +1,25 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ProfanitySettingsComponent } from './profanity-settings.component';
+
+describe('ProfanitySettingsComponent', () => {
+  let component: ProfanitySettingsComponent;
+  let fixture: ComponentFixture<ProfanitySettingsComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [ ProfanitySettingsComponent ]
+    })
+    .compileComponents();
+  });
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(ProfanitySettingsComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/src/app/components/creator/_dialogs/profanity-settings/profanity-settings.component.ts b/src/app/components/creator/_dialogs/profanity-settings/profanity-settings.component.ts
new file mode 100644
index 000000000..ad81ba4ea
--- /dev/null
+++ b/src/app/components/creator/_dialogs/profanity-settings/profanity-settings.component.ts
@@ -0,0 +1,85 @@
+import {Component,Inject,OnInit} from '@angular/core';
+import {MAT_DIALOG_DATA,MatDialog,MatDialogRef} from '@angular/material/dialog';
+import {RoomCreatorPageComponent} from '../../room-creator-page/room-creator-page.component';
+import {NotificationService} from '../../../../services/util/notification.service';
+import {TranslateService} from '@ngx-translate/core';
+import {RoomService} from '../../../../services/http/room.service';
+import {Router} from '@angular/router';
+import {EventService} from '../../../../services/util/event.service';
+import {ProfanityFilter,Room} from '../../../../models/room';
+
+@Component({
+  selector:'app-profanity-settings',
+  templateUrl:'./profanity-settings.component.html',
+  styleUrls:['./profanity-settings.component.scss']
+})
+export class ProfanitySettingsComponent implements OnInit{
+
+  editRoom: Room;
+  check=false;
+  profanityCheck: boolean;
+  censorPartialWordsCheck: boolean;
+  censorLanguageSpecificCheck: boolean;
+
+  constructor(public dialogRef: MatDialogRef<RoomCreatorPageComponent>,
+              public dialog: MatDialog,
+              public notificationService: NotificationService,
+              public translationService: TranslateService,
+              protected roomService: RoomService,
+              public router: Router,
+              public eventService: EventService,
+              @Inject(MAT_DIALOG_DATA) public data: any){
+  }
+
+  ngOnInit(){
+    this.profanityCheck=this.editRoom.profanityFilter!==ProfanityFilter.deactivated;
+    if(this.editRoom.profanityFilter===ProfanityFilter.all){
+      this.censorLanguageSpecificCheck=this.censorPartialWordsCheck=true;
+    }else if(this.profanityCheck){
+      this.censorLanguageSpecificCheck=this.editRoom.profanityFilter===ProfanityFilter.languageSpecific;
+      this.censorPartialWordsCheck=this.editRoom.profanityFilter===ProfanityFilter.partialWords;
+    }
+  }
+
+  showMessage(label: string,event: boolean){
+    if(event){
+      this.translationService.get('room-page.'+label).subscribe(msg=>{
+        this.notificationService.show(msg);
+      });
+    }
+  }
+
+
+  /**
+   * Returns a lambda which closes the dialog on call.
+   */
+  buildCloseDialogActionCallback(): () => void{
+    return ()=>this.closeDialog('abort');
+  }
+
+  /**
+   * Returns a lambda which executes the dialog dedicated action on call.
+   */
+  buildSaveActionCallback(): () => void{
+    return ()=>this.save();
+  }
+
+  closeDialog(type: string): void{
+    this.dialogRef.close(type);
+  }
+
+  save(): void{
+    this.editRoom.questionsBlocked=this.check;
+    this.editRoom.profanityFilter=this.profanityCheck?ProfanityFilter.none:ProfanityFilter.deactivated;
+    if(this.profanityCheck){
+      if(this.censorLanguageSpecificCheck&&this.censorPartialWordsCheck){
+        this.editRoom.profanityFilter=ProfanityFilter.all;
+      }else{
+        this.editRoom.profanityFilter=this.censorLanguageSpecificCheck?ProfanityFilter.languageSpecific:ProfanityFilter.none;
+        this.editRoom.profanityFilter=this.censorPartialWordsCheck?ProfanityFilter.partialWords:this.editRoom.profanityFilter;
+      }
+    }
+    this.closeDialog('update');
+  }
+
+}
diff --git a/src/app/components/creator/_dialogs/room-description-settings/room-description-settings.component.html b/src/app/components/creator/_dialogs/room-description-settings/room-description-settings.component.html
new file mode 100644
index 000000000..50b4fdab3
--- /dev/null
+++ b/src/app/components/creator/_dialogs/room-description-settings/room-description-settings.component.html
@@ -0,0 +1,43 @@
+<div mat-dialog-content
+     *ngIf="editRoom">
+  <mat-tab-group>
+    <mat-tab label="{{'room-page.description' | translate}}">
+      <mat-form-field class="input-block">
+      <textarea
+        (focus)="eventService.makeFocusOnInputTrue()"
+        (blur)="eventService.makeFocusOnInputFalse()"
+        [(ngModel)]="editRoom.description"
+        matInput
+        matTextareaAutosize
+        matAutosizeMinRows="2"
+        matAutosizeMaxRows="5"
+        maxlength="500"
+        name="description"
+        aria-labelledby="description"
+      ></textarea>
+        <mat-hint align="start">
+              <span aria-hidden="true">
+                {{ 'room-page.Markdown-hint' | translate }}
+              </span>
+        </mat-hint>
+        <mat-hint align="end">
+            <span aria-hidden="true">
+              {{ editRoom.description?editRoom.description.length:0 }} / 500
+            </span>
+        </mat-hint>
+      </mat-form-field>
+    </mat-tab>
+    <mat-tab label="{{'session.preview' | translate}}"
+             [disabled]="!editRoom.description">
+      <markdown class="images" katex emoji lineNumbers lineHighlight
+                [data]="editRoom.description"></markdown>
+    </mat-tab>
+  </mat-tab-group>
+</div>
+<app-dialog-action-buttons
+  buttonsLabelSection="room-page"
+  confirmButtonLabel="update"
+
+  [cancelButtonClickAction]="buildCloseDialogActionCallback()"
+  [confirmButtonClickAction]="buildSaveActionCallback()"
+></app-dialog-action-buttons>
diff --git a/src/app/components/creator/_dialogs/room-description-settings/room-description-settings.component.scss b/src/app/components/creator/_dialogs/room-description-settings/room-description-settings.component.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/app/components/creator/_dialogs/room-description-settings/room-description-settings.component.spec.ts b/src/app/components/creator/_dialogs/room-description-settings/room-description-settings.component.spec.ts
new file mode 100644
index 000000000..24f8fa8dd
--- /dev/null
+++ b/src/app/components/creator/_dialogs/room-description-settings/room-description-settings.component.spec.ts
@@ -0,0 +1,25 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { RoomDescriptionSettingsComponent } from './room-description-settings.component';
+
+describe('RoomDescriptionSettingsComponent', () => {
+  let component: RoomDescriptionSettingsComponent;
+  let fixture: ComponentFixture<RoomDescriptionSettingsComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [ RoomDescriptionSettingsComponent ]
+    })
+    .compileComponents();
+  });
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(RoomDescriptionSettingsComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/src/app/components/creator/_dialogs/room-description-settings/room-description-settings.component.ts b/src/app/components/creator/_dialogs/room-description-settings/room-description-settings.component.ts
new file mode 100644
index 000000000..cd5f3ac74
--- /dev/null
+++ b/src/app/components/creator/_dialogs/room-description-settings/room-description-settings.component.ts
@@ -0,0 +1,57 @@
+import {Component,Inject,OnInit} from '@angular/core';
+import {MAT_DIALOG_DATA,MatDialog,MatDialogRef} from '@angular/material/dialog';
+import {RoomCreatorPageComponent} from '../../room-creator-page/room-creator-page.component';
+import {NotificationService} from '../../../../services/util/notification.service';
+import {TranslateService} from '@ngx-translate/core';
+import {RoomService} from '../../../../services/http/room.service';
+import {Router} from '@angular/router';
+import {EventService} from '../../../../services/util/event.service';
+import {ProfanityFilter,Room} from '../../../../models/room';
+import {FormControl,Validators} from '@angular/forms';
+
+@Component({
+  selector:'app-room-description-settings',
+  templateUrl:'./room-description-settings.component.html',
+  styleUrls:['./room-description-settings.component.scss']
+})
+export class RoomDescriptionSettingsComponent implements OnInit{
+  editRoom: Room;
+  roomNameFormControl=new FormControl('',[Validators.required,Validators.minLength(3),Validators.maxLength(30)]);
+
+  constructor(public dialogRef: MatDialogRef<RoomCreatorPageComponent>,
+              public dialog: MatDialog,
+              public notificationService: NotificationService,
+              public translationService: TranslateService,
+              protected roomService: RoomService,
+              public router: Router,
+              public eventService: EventService,
+              @Inject(MAT_DIALOG_DATA) public data: any){
+  }
+
+
+  ngOnInit(){
+  }
+
+  buildCloseDialogActionCallback(): () => void{
+    return ()=>this.closeDialog('abort');
+  }
+
+  buildSaveActionCallback(): () => void{
+    return ()=>this.save();
+  }
+
+  closeDialog(type: string): void{
+    this.dialogRef.close(type);
+  }
+
+  save(): void{
+    this.roomService.updateRoom(this.editRoom).subscribe(r=>this.editRoom=r);
+    if(!this.roomNameFormControl.hasError('required')
+      && !this.roomNameFormControl.hasError('minlength')
+      && !this.roomNameFormControl.hasError('maxlength')){
+      this.closeDialog('update');
+    }
+    this.closeDialog('update');
+  }
+
+}
diff --git a/src/app/components/creator/creator.module.ts b/src/app/components/creator/creator.module.ts
index 10b0706bd..b876aea13 100644
--- a/src/app/components/creator/creator.module.ts
+++ b/src/app/components/creator/creator.module.ts
@@ -23,6 +23,8 @@ import { DeleteAnswerComponent } from './_dialogs/delete-answer/delete-answer.co
 import { QuestionWallComponent } from '../shared/questionwall/question-wall/question-wall.component';
 import { ArsModule } from '../../../../projects/ars/src/lib/ars.module';
 import { MatRippleModule } from '@angular/material/core';
+import { ProfanitySettingsComponent } from './_dialogs/profanity-settings/profanity-settings.component';
+import { RoomDescriptionSettingsComponent } from './_dialogs/room-description-settings/room-description-settings.component';
 
 @NgModule({
   imports: [
@@ -56,7 +58,9 @@ import { MatRippleModule } from '@angular/material/core';
     DeleteCommentComponent,
     BonusDeleteComponent,
     DeleteAnswerComponent,
-    QuestionWallComponent
+    QuestionWallComponent,
+    ProfanitySettingsComponent,
+    RoomDescriptionSettingsComponent
   ],
   exports: []
 })
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 7e675f2bf..887173270 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
@@ -65,15 +65,6 @@
             {{ 'room-page.tags' | translate}}
           </button>
         </mat-menu>
-        <button id="settings-menu"
-                mat-icon-button
-                class="corner-icons"
-                [matMenuTriggerFor]="settingsMenu"
-                aria-labelledby="settings">
-          <mat-icon class="corner-icon"
-                    matTooltip="{{ 'room-page.session-settings' | translate}}">settings
-          </mat-icon>
-        </button>
       </div>
       <mat-card-content *ngIf="room.description"
                         fxLayoutAlign="center">
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 a0a7629b5..6783a5283 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
@@ -2,7 +2,7 @@ import { Component, OnInit, Renderer2, OnDestroy, AfterContentInit } from '@angu
 import { RoomService } from '../../../services/http/room.service';
 import {ActivatedRoute,Router} from '@angular/router';
 import { RoomPageComponent } from '../../shared/room-page/room-page.component';
-import { Room } from '../../../models/room';
+import {ProfanityFilter,Room} from '../../../models/room';
 import { CommentSettingsDialog } from '../../../models/comment-settings-dialog';
 import { Location } from '@angular/common';
 import { NotificationService } from '../../../services/util/notification.service';
@@ -29,6 +29,8 @@ import { TopicCloudFilterComponent } from '../../shared/_dialogs/topic-cloud-fil
 import {HeaderService} from '../../../services/util/header.service';
 import {RoomDeleteComponent} from '../_dialogs/room-delete/room-delete.component';
 import {RoomDeleted} from '../../../models/events/room-deleted';
+import {ProfanitySettingsComponent} from '../_dialogs/profanity-settings/profanity-settings.component';
+import {RoomDescriptionSettingsComponent} from '../_dialogs/room-description-settings/room-description-settings.component';
 
 @Component({
   selector: 'app-room-creator-page',
@@ -78,7 +80,6 @@ export class RoomCreatorPageComponent extends RoomPageComponent implements OnIni
     nav('deleteRoom',()=>this.openDeleteRoomDialog());
     nav('profanityFilter',()=>this.toggleProfanityFilter());
     nav('editSessionDescription',()=>this.editSessionDescription());
-    nav('moderatorMode',()=>this.moderatorView());
     nav('roomBonusToken', () => this.showBonusTokenDialog());
     nav('moderator', () => this.showModeratorsDialog());
     nav('tags', () => this.showTagsDialog());
@@ -93,15 +94,17 @@ export class RoomCreatorPageComponent extends RoomPageComponent implements OnIni
   }
 
   toggleProfanityFilter(){
-
+    const dialogRef = this.dialog.open(ProfanitySettingsComponent, {
+      width: '400px'
+    });
+    dialogRef.componentInstance.editRoom=this.room;
   }
 
   editSessionDescription(){
-
-  }
-
-  moderatorView(){
-
+    const dialogRef = this.dialog.open(RoomDescriptionSettingsComponent, {
+      width: '400px'
+    });
+    dialogRef.componentInstance.editRoom=this.room;
   }
 
   exportQuestions(){
diff --git a/src/app/components/shared/header/header.component.html b/src/app/components/shared/header/header.component.html
index 81e46d84d..28738808f 100644
--- a/src/app/components/shared/header/header.component.html
+++ b/src/app/components/shared/header/header.component.html
@@ -242,8 +242,8 @@
 
               <button mat-menu-item
                       *ngIf="user"
-                      (click)="navigateModeratorMode()"
-                      tabindex="0">
+                      tabindex="0"
+                      routerLink="moderator/room/{{shortId}}/moderator/comments">
                 <mat-icon class="gavel">visibility_off</mat-icon>
                 <span>{{'header.moderation-mode' | translate}}</span>
               </button>
diff --git a/src/app/components/shared/header/header.component.ts b/src/app/components/shared/header/header.component.ts
index c75401d1f..43159cf93 100644
--- a/src/app/components/shared/header/header.component.ts
+++ b/src/app/components/shared/header/header.component.ts
@@ -343,10 +343,6 @@ export class HeaderComponent implements OnInit {
     this.eventService.broadcast('navigate', 'profanityFilter');
   }
 
-  public navgiateModeratorMode() {
-    this.eventService.broadcast('navigate', 'moderatorMode');
-  }
-
   public navigateEditSessionDescription() {
     this.eventService.broadcast('navigate', 'editSessionDescription');
   }
-- 
GitLab