diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.html index 0249e670..a48311fc 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.html +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.html @@ -26,8 +26,17 @@ maxlength="20" placeholder="{{ 'group.name' | translate }}" formControlName="groupName" + (keyup)="onKeyupGroupName()" /> {{ input.value?.length || 0 }}/20 + + {{ + 'group.errors.bannedWords' + | translate: { bannedWords: bannedWords.join(',') } + }} + diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.ts index 05a3d4c9..49d5e376 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.ts @@ -20,7 +20,7 @@ import { } from '@angular/material'; import { NGXLogger } from 'ngx-logger'; import { Observable, combineLatest, Subscription, of } from 'rxjs'; -import { map, tap, catchError } from 'rxjs/operators'; +import { map, tap, catchError, take } from 'rxjs/operators'; import { Store, select } from '@ngrx/store'; import * as AppStore from '@app/store'; @@ -62,7 +62,7 @@ import { AlertDialogResult, AlertDialogData } from '@ucap-webmessenger/ui'; -import { TranslateService } from '@ngx-translate/core'; +import { TranslateService, TranslateParser } from '@ngx-translate/core'; import { environment } from '../../../../../environments/environment'; export interface CreateChatDialogData { @@ -115,11 +115,38 @@ export class CreateChatDialogComponent implements OnInit, OnDestroy { private logger: NGXLogger, private dialogService: DialogService, private translateService: TranslateService, + private translateParser: TranslateParser, private changeDetectorRef: ChangeDetectorRef ) { this.sessionVerinfo = this.sessionStorageService.get( KEY_VER_INFO ); + + const banKeys: string[] = [ + 'group.nameFavorite', + 'group.nameMyDept', + 'group.nameDefault' + ]; + + const currentLang = this.translateService.currentLang; + const langs = ['ko', 'en']; + + langs.forEach(lang => { + this.translateService + .getTranslation(lang) + .pipe(take(1)) + .subscribe( + translation => { + banKeys.forEach(banKey => { + this.bannedWords.push( + this.translateParser.getValue(translation, banKey) + ); + }); + }, + error => {}, + () => {} + ); + }); } currentTabIndex: number; @@ -162,6 +189,8 @@ export class CreateChatDialogComponent implements OnInit, OnDestroy { inputForm: FormGroup; + bannedWords: string[] = []; + ngOnInit() { const loginInfo = this.sessionStorageService.get(KEY_LOGIN_INFO); this.companyCode = loginInfo.companyCode; @@ -283,7 +312,14 @@ export class CreateChatDialogComponent implements OnInit, OnDestroy { .subscribe(); this.inputForm = this.formBuilder.group({ - groupName: ['', [Validators.required, this.checkSpecialCharacter()]] + groupName: [ + '', + [ + Validators.required, + this.checkSpecialCharacter(), + this.checkBanWords() + ] + ] }); if (this.data.type === UserSelectDialogType.EditChatMember) { @@ -302,6 +338,17 @@ export class CreateChatDialogComponent implements OnInit, OnDestroy { }; } + checkBanWords(): ValidatorFn { + return (control: AbstractControl): { [key: string]: any } | null => { + if (!control || !control.value) { + return null; + } + const ban = + -1 < this.bannedWords.indexOf((control.value as string).trim()); + return ban ? { groupNameBanned: { value: control.value } } : null; + }; + } + ngOnDestroy(): void { if (!!this.roomSubscription) { this.roomSubscription.unsubscribe(); @@ -754,4 +801,8 @@ export class CreateChatDialogComponent implements OnInit, OnDestroy { : undefined }); } + + onKeyupGroupName() { + this.inputForm.get('groupName').markAsTouched(); + } } diff --git a/projects/ucap-webmessenger-app/src/assets/i18n/en.json b/projects/ucap-webmessenger-app/src/assets/i18n/en.json index fd89a055..183b2763 100644 --- a/projects/ucap-webmessenger-app/src/assets/i18n/en.json +++ b/projects/ucap-webmessenger-app/src/assets/i18n/en.json @@ -177,7 +177,8 @@ "confirmRemoveGroup": "Are you sure you want to delete the group {{nameOfGroup}}?
Group members will only be deleted from that group.", "errors": { "label": "Group errors", - "requireName": "Group name is required." + "requireName": "Group name is required.", + "bannedWords": "Prohibited word. [{{bannedWords}}]" } }, "chat": { diff --git a/projects/ucap-webmessenger-app/src/assets/i18n/ko.json b/projects/ucap-webmessenger-app/src/assets/i18n/ko.json index 7a39ac99..d5f4d8e8 100644 --- a/projects/ucap-webmessenger-app/src/assets/i18n/ko.json +++ b/projects/ucap-webmessenger-app/src/assets/i18n/ko.json @@ -177,7 +177,8 @@ "confirmRemoveGroup": "그룹({{nameOfGroup}})을 삭제하시겠습니까?
그룹 멤버는 해당 그룹에서만 삭제됩니다.", "errors": { "label": "그룹 에러", - "requireName": "그룹명은 필수입력입니다." + "requireName": "그룹명은 필수입력입니다.", + "bannedWords": "금지단어 [{{bannedWords}}]" } }, "chat": {