diff --git a/src/app/components/shared/_dialogs/topic-cloud-administration/topic-cloud-administration.component.html b/src/app/components/shared/_dialogs/topic-cloud-administration/topic-cloud-administration.component.html index 8d3c9cb279967a8210db68623b62a370cae10f97..534e18691f6844376bfdb455849e4200aa7fcfc0 100644 --- a/src/app/components/shared/_dialogs/topic-cloud-administration/topic-cloud-administration.component.html +++ b/src/app/components/shared/_dialogs/topic-cloud-administration/topic-cloud-administration.component.html @@ -27,7 +27,7 @@ </mat-radio-button> </mat-radio-group> </mat-card> - + <mat-card style="background: none;"> <mat-slide-toggle [(ngModel)]="considerVotes"> {{'topic-cloud-dialog.consider-votes' | translate}} @@ -35,13 +35,18 @@ </mat-card> <div *ngIf="isCreatorOrMod"> <mat-card style="background: none;"> - <mat-slide-toggle (change)="showMessage('words-will-be-overwritten', $event.checked)" [(ngModel)]="profanityFilter"> + <mat-slide-toggle (change)="showMessage('words-will-be-overwritten', $event.checked)" + [(ngModel)]="profanityFilter"> {{'topic-cloud-dialog.profanity' | translate}} </mat-slide-toggle> - <mat-slide-toggle *ngIf="profanityFilter" (change)="showMessage('only-specific-language-will-be-filtered', $event.checked)" [(ngModel)]="censorLanguageSpecificCheck"> + <mat-slide-toggle *ngIf="profanityFilter" + (change)="showMessage('only-specific-language-will-be-filtered', $event.checked)" + [(ngModel)]="censorLanguageSpecificCheck"> {{'topic-cloud-dialog.language-specific-filter' | translate}} </mat-slide-toggle> - <mat-slide-toggle *ngIf="profanityFilter" (change)="showMessage('partial-words-will-be-filtered', $event.checked)" [(ngModel)]="censorPartialWordsCheck"> + <mat-slide-toggle *ngIf="profanityFilter" + (change)="showMessage('partial-words-will-be-filtered', $event.checked)" + [(ngModel)]="censorPartialWordsCheck"> {{'topic-cloud-dialog.partial-words-filter' | translate}} </mat-slide-toggle> @@ -49,46 +54,75 @@ <mat-expansion-panel class="color-background" (opened)="focusInput('test-profanity-input')"> <mat-expansion-panel-header class="color-background"> <mat-panel-title> - {{"topic-cloud-dialog.test-profanity" | translate}} + {{'topic-cloud-dialog.test-profanity' | translate}} </mat-panel-title> </mat-expansion-panel-header> - <mat-form-field> - <mat-label>{{"topic-cloud-dialog.word" | translate}}</mat-label> - <input id="test-profanity-input" matInput [ngModel]="testProfanityWord" (ngModelChange)="testProfanity($event)"> - </mat-form-field> - <p class="red testProfanity" *ngIf="wordIsProfanity">{{"topic-cloud-dialog.word-is-profanity" | translate}}</p> - <p class="green testProfanity" *ngIf="!wordIsProfanity">{{"topic-cloud-dialog.word-is-not-profanity" | translate}}</p> + <p> + <mat-form-field *ngIf="censorLanguageSpecificCheck"> + <mat-label>{{'topic-cloud-dialog.language' | translate}}</mat-label> + <mat-select [(value)]="testProfanityLanguage"> + <mat-option value="en">English</mat-option> + <mat-option value="de">German</mat-option> + <mat-option value="fr">French</mat-option> + <mat-option value="ar">Arabic</mat-option> + <mat-option value="ru">Russian</mat-option> + <mat-option value="es">Spanish</mat-option> + <mat-option value="it">Italian</mat-option> + <mat-option value="nl">Netherlandish</mat-option> + <mat-option value="tr">Turkish</mat-option> + <mat-option value="pt">Portuguese</mat-option> + </mat-select> + </mat-form-field> + </p> + <p> + <mat-form-field> + <mat-label>{{'topic-cloud-dialog.word' | translate}}</mat-label> + <input id="test-profanity-input" matInput [(ngModel)]="testProfanityWord"> + </mat-form-field> + </p> + <p>{{'topic-cloud-dialog.preview' | translate}}:</p> + <p>{{getFilteredProfanity()}}</p> <mat-accordion> <mat-expansion-panel class="color-background"> <mat-expansion-panel-header class="color-background"> <mat-panel-title> - {{"topic-cloud-dialog.words-in-profanity" | translate}} + {{"topic-cloud-dialog.words-in-profanity" | translate}} </mat-panel-title> </mat-expansion-panel-header> - <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/en" target="_blank">English</a> + <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/en" + target="_blank">English</a> <br> - <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/de" target="_blank">German</a> + <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/de" + target="_blank">German</a> <br> - <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/fr" target="_blank">French</a> + <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/fr" + target="_blank">French</a> <br> - <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/ar" target="_blank">Arabic</a> + <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/ar" + target="_blank">Arabic</a> <br> - <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/ru" target="_blank">Russian</a> + <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/ru" + target="_blank">Russian</a> <br> - <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/es" target="_blank">Spanish</a> + <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/es" + target="_blank">Spanish</a> <br> - <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/it" target="_blank">Italian</a> + <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/it" + target="_blank">Italian</a> <br> - <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/nl" target="_blank">Netherlandish</a> + <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/nl" + target="_blank">Netherlandish</a> <br> - <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/tr" target="_blank">Turkish</a> + <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/tr" + target="_blank">Turkish</a> <br> - <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/pt" target="_blank">Portuguese</a> + <a href="https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/pt" + target="_blank">Portuguese</a> </mat-expansion-panel> </mat-accordion> - + </mat-expansion-panel> </mat-accordion> @@ -99,26 +133,26 @@ </mat-slide-toggle> </mat-card> </div> - + <mat-accordion class="new-profanity-word" multi> <div *ngIf="isCreatorOrMod"> - <mat-expansion-panel class="color-background" (opened)="enterProfanityWord=true; focusInput('bad-word-input')" - (closed)="enterProfanityWord = false"> + <mat-expansion-panel class="color-background" + (opened)="enterProfanityWord=true; focusInput('bad-word-input')" (closed)="enterProfanityWord = false"> <mat-expansion-panel-header class="color-background"> <mat-panel-title> {{'topic-cloud-dialog.edit-profanity-list' | translate}} </mat-panel-title> </mat-expansion-panel-header> - + <mat-form-field> <mat-label>{{'topic-cloud-dialog.enter-word' | translate}}</mat-label> <input matInput id="bad-word-input" [(ngModel)]="newProfanityWord"> </mat-form-field> - + <button mat-stroked-button class="margin-left color-on-background" (click)="addProfanityWord()"> {{'topic-cloud-dialog.add-word' | translate}} </button> - + <mat-list role="list" *ngIf="showProfanityList" class="margin-bottom"> <mat-list-item class="color-on-surface" *ngFor="let word of profanitywordlist" role="listitem">{{word}} <button style="margin-left: auto" mat-icon-button class="red" @@ -127,7 +161,7 @@ </button> </mat-list-item> </mat-list> - + <div> <button mat-raised-button *ngIf="profanitywordlist.length > 0" class="primaryBackground" (click)="showProfanityList=!showProfanityList"> @@ -136,7 +170,7 @@ </button> </div> </mat-expansion-panel> - + <mat-expansion-panel class="color-background margin-bottom" (opened)="enterBlacklistWord = true; focusInput('blacklist-word-input')" (closed)="enterBlacklistWord = false"> @@ -145,12 +179,12 @@ {{'topic-cloud-dialog.edit-blacklist-list' | translate}} </mat-panel-title> </mat-expansion-panel-header> - + <mat-form-field> <mat-label>{{'topic-cloud-dialog.enter-word' | translate}}</mat-label> <input matInput id="blacklist-word-input" [(ngModel)]="newBlacklistWord"> </mat-form-field> - + <button mat-stroked-button class="margin-left color-on-background" (click)="addBlacklistWord()"> {{'topic-cloud-dialog.add-word' | translate}} </button> @@ -161,7 +195,7 @@ </button> </mat-list-item> </mat-list> - + <div> <button mat-raised-button class="primaryBackground" *ngIf="blacklist.length > 0" (click)="showBlacklistWordList=!showBlacklistWordList"> @@ -177,19 +211,20 @@ Spacy labels </mat-panel-title> </mat-expansion-panel-header> - + <mat-tab-group animationDuration="0ms" mat-stretch-tabs mat-align-tabs="center"> <mat-tab label="{{'topic-cloud-dialog.german' | translate}}"> <mat-selection-list *ngIf="wantedLabels" [(ngModel)]="wantedLabels.de"> - + <mat-option class="color-on-surface" (click)="selectAllDE()"> <mat-label class="color-on-surface"> <mat-icon>playlist_add_check</mat-icon> {{'topic-cloud-dialog.select-all' | translate}} </mat-label> - <mat-checkbox style="vertical-align: middle;float: right;" [checked]="this.wantedLabels.de.length===this.spacyLabels.de.length"></mat-checkbox> + <mat-checkbox style="vertical-align: middle;float: right;" + [checked]="this.wantedLabels.de.length===this.spacyLabels.de.length"></mat-checkbox> </mat-option> - + <mat-list-option [value]="label.tag" class="color-on-surface" *ngFor="let label of spacyLabels.de"> {{label.label + " (" + label.tag + ")"}} </mat-list-option> @@ -197,15 +232,16 @@ </mat-tab> <mat-tab label="{{'topic-cloud-dialog.english' | translate}}"> <mat-selection-list *ngIf="wantedLabels" [(ngModel)]="wantedLabels.en"> - + <mat-option class="color-on-surface" (click)="selectAllEN()"> <mat-label class="color-on-surface"> <mat-icon>playlist_add_check</mat-icon> {{'topic-cloud-dialog.select-all' | translate}} </mat-label> - <mat-checkbox style="vertical-align: middle;float: right;" [checked]="this.wantedLabels.en.length===this.spacyLabels.en.length"></mat-checkbox> + <mat-checkbox style="vertical-align: middle;float: right;" + [checked]="this.wantedLabels.en.length===this.spacyLabels.en.length"></mat-checkbox> </mat-option> - + <mat-list-option [value]="label.tag" class="color-on-surface" *ngFor="let label of spacyLabels.en"> {{label.label + " (" + label.tag + ")"}} </mat-list-option> @@ -216,26 +252,27 @@ </mat-accordion> </mat-expansion-panel> </mat-accordion> - + <div fxLayout="row"> <mat-label fxLayoutAlign="center center"> <mat-icon>search</mat-icon> </mat-label> <div style="margin-left: 10px; margin-top: 6px;"> <mat-form-field [ngClass]="{'search': searchMode, 'smallerInput': deviceType === 'mobile'}"> - <input #searchBox class="searchBox" (input)="searchKeyword()" [(ngModel)]="searchedKeyword" matInput type="text" - placeholder="{{'topic-cloud-dialog.keyword-search' | translate}}"> + <input #searchBox class="searchBox" (input)="searchKeyword()" [(ngModel)]="searchedKeyword" matInput + type="text" placeholder="{{'topic-cloud-dialog.keyword-search' | translate}}"> <button *ngIf="searchedKeyword" (click)="searchedKeyword = ''; searchMode = false;" mat-button matSuffix mat-icon-button aria-label="topic-cloud-dialog.keyword-search"> <mat-icon>close</mat-icon> </button> </mat-form-field> </div> - + <div fxLayoutAlign="center center" style="margin-left: auto; font-weight: bold;"> <mat-icon [ngClass]="{'animation-blink': searchMode}" svgIcon="hashtag" class="oldtypo-h2 comment_tag-icon" matTooltip="{{'topic-cloud-dialog.keyword-counter' | translate}}"></mat-icon> - <p [ngClass]="{'animation-blink': searchMode}" matTooltip="{{'topic-cloud-dialog.keyword-counter' | translate}}"> + <p [ngClass]="{'animation-blink': searchMode}" + matTooltip="{{'topic-cloud-dialog.keyword-counter' | translate}}"> {{searchMode ? filteredKeywords.length : keywords.length}}</p> </div> @@ -245,7 +282,7 @@ </button> </div> </div> - + <mat-menu #sortMenu> <button [ngClass]="{'animation-blink': sortMode==='alphabetic'}" mat-menu-item (click)="sortQuestions('alphabetic')"> @@ -257,20 +294,23 @@ <mat-icon>swap_vert</mat-icon> {{'topic-cloud-dialog.sort-count' | translate}} </button> - <button [ngClass]="{'animation-blink': sortMode==='voteCount'}" mat-menu-item (click)="sortQuestions('voteCount')"> + <button [ngClass]="{'animation-blink': sortMode==='voteCount'}" mat-menu-item + (click)="sortQuestions('voteCount')"> <mat-icon>swap_vert</mat-icon> {{'topic-cloud-dialog.sort-vote' | translate}} </button> </mat-menu> - - <mat-card class="color-surface" *ngIf="(keywords.length === 0 || (searchMode && filteredKeywords.length === 0))&&!isLoading"> + + <mat-card class="color-surface" + *ngIf="(keywords.length === 0 || (searchMode && filteredKeywords.length === 0))&&!isLoading"> <p class="color-on-surface" fxLayoutAlign="center"> {{'topic-cloud-dialog.no-keywords-note' | translate}} </p> </mat-card> - + <mat-accordion> - <mat-expansion-panel class="color-surface" (opened)="panelOpenState = true" (closed)="panelOpenState = edit = false" + <mat-expansion-panel class="color-surface" (opened)="panelOpenState = true" + (closed)="panelOpenState = edit = false" *ngFor="let keyword of (searchMode ? filteredKeywords : keywords); let i = index" [attr.data-index]="i" matTooltip="{{'topic-cloud-dialog.'+(keyword.keywordType === 0?'keyword-from-spacy':'keyword-from-questioner') | translate}}"> <mat-expansion-panel-header class="color-surface"> @@ -285,10 +325,10 @@ <div *ngFor="let question of keyword.comments"> <mat-divider></mat-divider> <app-topic-dialog-comment [question]="question.body" [keyword]="keyword.keyword" [maxShowedCharachters]="140" - [profanityFilter]="profanityFilter" [languageSpecific]="censorLanguageSpecificCheck" - [partialWords]="censorPartialWordsCheck" [language]="question.language"></app-topic-dialog-comment> + [profanityFilter]="profanityFilter" [languageSpecific]="censorLanguageSpecificCheck" + [partialWords]="censorPartialWordsCheck" [language]="question.language"></app-topic-dialog-comment> </div> - + <div *ngIf="isCreatorOrMod"> <!-- Only visible when not editing --> <div *ngIf="!edit" align="end"> @@ -301,7 +341,7 @@ <mat-icon class="red" matTooltip="{{'topic-cloud-dialog.delete' | translate}}">delete</mat-icon> </button> </div> - + <!-- Only visible when editing --> <div *ngIf="edit"> <mat-divider></mat-divider> @@ -322,4 +362,4 @@ </mat-expansion-panel> </mat-accordion> </div> -</mat-dialog-content> +</mat-dialog-content> \ No newline at end of file diff --git a/src/app/components/shared/_dialogs/topic-cloud-administration/topic-cloud-administration.component.ts b/src/app/components/shared/_dialogs/topic-cloud-administration/topic-cloud-administration.component.ts index 139a53fb79c446f154a6eaaccd94d5318cdd02dc..2cb85515a616ff350d26c6c81b2a328fdba1539e 100644 --- a/src/app/components/shared/_dialogs/topic-cloud-administration/topic-cloud-administration.component.ts +++ b/src/app/components/shared/_dialogs/topic-cloud-administration/topic-cloud-administration.component.ts @@ -60,7 +60,7 @@ export class TopicCloudAdministrationComponent implements OnInit, OnDestroy { private censorPartialWordsCheck: boolean; private censorLanguageSpecificCheck: boolean; private testProfanityWord: string = undefined; - private wordIsProfanity: boolean = undefined; + private testProfanityLanguage = 'de'; constructor( @Inject(MAT_DIALOG_DATA) public data: Data, @@ -470,8 +470,12 @@ export class TopicCloudAdministrationComponent implements OnInit, OnDestroy { } } - testProfanity(word) { - this.wordIsProfanity = this.profanityFilterService.getProfanityList.includes(word.toLowerCase()); + getFilteredProfanity(): string { + if (this.testProfanityWord) { + return this.profanityFilterService.filterProfanityWords(this.testProfanityWord, this.censorPartialWordsCheck, this.censorLanguageSpecificCheck, this.testProfanityLanguage); + } else { + return ''; + } } } diff --git a/src/app/services/util/profanity-filter.service.ts b/src/app/services/util/profanity-filter.service.ts index 9d96d23fcc8828e52ca9371a746181603d6c63f0..45fb8da627c69da48937abd5638e8c067a54cd3c 100644 --- a/src/app/services/util/profanity-filter.service.ts +++ b/src/app/services/util/profanity-filter.service.ts @@ -29,6 +29,21 @@ export class ProfanityFilterService { return this.getProfanityListFromStorage().concat(this.profanityWords); } + // checkProfanity(word: string, consorPartialWordsCheck: boolean, lang?: string) { + // let profanityWords = []; + // if (lang) { + // profanityWords = BadWords[lang]; + // } else { + // profanityWords = this.profanityWords; + // } + + // if (consorPartialWordsCheck) { + + // } + + // return profanityWords.includes(word.toLowerCase()); + // } + getProfanityListFromStorage() { const list = localStorage.getItem(this.profanityKey); return list ? JSON.parse(list) : [];