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