닉네임 중복체크
This commit is contained in:
		
							parent
							
								
									71876494d5
								
							
						
					
					
						commit
						152994e63b
					
				@ -36,6 +36,8 @@ import { Router } from '@angular/router';
 | 
			
		||||
import { RegistComposeComponent } from '../compose/regist-compose.component';
 | 
			
		||||
 | 
			
		||||
import { MatDialog } from '@angular/material/dialog';
 | 
			
		||||
import { SiteService } from 'app/modules/polyglot/domain/services/site.service';
 | 
			
		||||
import { Site } from 'app/modules/protobuf/models/domain/site_pb';
 | 
			
		||||
@Component({
 | 
			
		||||
  selector: 'partner-list',
 | 
			
		||||
  templateUrl: './list.component.html',
 | 
			
		||||
@ -77,6 +79,7 @@ export class ListComponent implements OnInit, AfterViewInit, OnDestroy {
 | 
			
		||||
  searchInputControl = new FormControl();
 | 
			
		||||
  selectedPartner?: Partner;
 | 
			
		||||
  pagination?: PartnerPagination;
 | 
			
		||||
  sites!: Site[];
 | 
			
		||||
 | 
			
		||||
  private _unsubscribeAll: Subject<any> = new Subject<any>();
 | 
			
		||||
 | 
			
		||||
@ -88,6 +91,7 @@ export class ListComponent implements OnInit, AfterViewInit, OnDestroy {
 | 
			
		||||
    private _fuseConfirmationService: FuseConfirmationService,
 | 
			
		||||
    private _formBuilder: FormBuilder,
 | 
			
		||||
    private _partnerService: PartnerService,
 | 
			
		||||
    private _siteService: SiteService,
 | 
			
		||||
    private router: Router,
 | 
			
		||||
    private _matDialog: MatDialog
 | 
			
		||||
  ) {}
 | 
			
		||||
@ -113,6 +117,13 @@ export class ListComponent implements OnInit, AfterViewInit, OnDestroy {
 | 
			
		||||
 | 
			
		||||
    // Get the products
 | 
			
		||||
    this.partners$ = this._partnerService.partners$;
 | 
			
		||||
 | 
			
		||||
    this._siteService
 | 
			
		||||
      .listSites()
 | 
			
		||||
      .then((result) => {
 | 
			
		||||
        this.sites = result.getSitesList();
 | 
			
		||||
      })
 | 
			
		||||
      .catch((reson) => console.log(reson));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
@ -203,7 +214,7 @@ export class ListComponent implements OnInit, AfterViewInit, OnDestroy {
 | 
			
		||||
 | 
			
		||||
  __onClickRegist(event: MouseEvent): void {
 | 
			
		||||
    const dialogRef = this._matDialog.open(RegistComposeComponent, {
 | 
			
		||||
      data: { title: '대본', parentId: 'kgon2' },
 | 
			
		||||
      data: { title: '대본', parentId: 'kgon2', sites: this.sites },
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    dialogRef.afterClosed().subscribe((result) => {
 | 
			
		||||
 | 
			
		||||
@ -23,6 +23,7 @@
 | 
			
		||||
      <input matInput [formControlName]="'partnerId'" />
 | 
			
		||||
    </mat-form-field>
 | 
			
		||||
 | 
			
		||||
    <!-- <div *ngFor="let f of sites">{{ f.getUrl() }}</div> -->
 | 
			
		||||
    <!-- Cc -->
 | 
			
		||||
    <mat-form-field>
 | 
			
		||||
      <mat-label>사이트명</mat-label>
 | 
			
		||||
@ -32,6 +33,18 @@
 | 
			
		||||
      </mat-error>
 | 
			
		||||
    </mat-form-field>
 | 
			
		||||
 | 
			
		||||
    <!-- <mat-form-field>
 | 
			
		||||
      <mat-label>사이트명</mat-label>
 | 
			
		||||
      <mat-select [formControlName]="'siteName'" placeholder="사이트 선택">
 | 
			
		||||
        <mat-option *ngFor="let site of sites" [value]="site.getId()">
 | 
			
		||||
          {{ site.getUrl() }}
 | 
			
		||||
        </mat-option>
 | 
			
		||||
      </mat-select>
 | 
			
		||||
      <mat-error *ngIf="composeForm.get('siteName')?.hasError('required')">
 | 
			
		||||
        사이트명은 필수 입력입니다.
 | 
			
		||||
      </mat-error>
 | 
			
		||||
    </mat-form-field> -->
 | 
			
		||||
 | 
			
		||||
    <!-- Bcc -->
 | 
			
		||||
    <mat-form-field>
 | 
			
		||||
      <mat-label>회원 아이디</mat-label>
 | 
			
		||||
@ -69,10 +82,19 @@
 | 
			
		||||
 | 
			
		||||
    <mat-form-field>
 | 
			
		||||
      <mat-label>닉네임</mat-label>
 | 
			
		||||
      <input matInput [formControlName]="'nickname'" />
 | 
			
		||||
      <input
 | 
			
		||||
        matInput
 | 
			
		||||
        [formControlName]="'nickname'"
 | 
			
		||||
        (focusout)="__checkNickname($event)"
 | 
			
		||||
      />
 | 
			
		||||
      <mat-error *ngIf="composeForm.get('nickname')?.hasError('required')">
 | 
			
		||||
        닉네임은 필수 입력입니다.
 | 
			
		||||
      </mat-error>
 | 
			
		||||
      <mat-error
 | 
			
		||||
        *ngIf="composeForm.get('nickname')?.hasError('nicknameDuplicate')"
 | 
			
		||||
      >
 | 
			
		||||
        닉네임이 중복됩니다.
 | 
			
		||||
      </mat-error>
 | 
			
		||||
    </mat-form-field>
 | 
			
		||||
 | 
			
		||||
    <mat-form-field>
 | 
			
		||||
@ -127,13 +149,9 @@
 | 
			
		||||
      class="flex flex-col sm:flex-row sm:items-center justify-between mt-4 sm:mt-6"
 | 
			
		||||
    >
 | 
			
		||||
      <div class="flex items-center mt-4 sm:mt-0">
 | 
			
		||||
        <!-- Discard -->
 | 
			
		||||
        <button class="ml-auto sm:ml-0" mat-stroked-button (click)="discard()">
 | 
			
		||||
          Discard
 | 
			
		||||
        </button>
 | 
			
		||||
        <!-- Save as draft -->
 | 
			
		||||
        <button class="sm:mx-3" mat-stroked-button (click)="saveAsDraft()">
 | 
			
		||||
          <span>Save as draft</span>
 | 
			
		||||
          <span>취소</span>
 | 
			
		||||
        </button>
 | 
			
		||||
        <!-- Send -->
 | 
			
		||||
        <button
 | 
			
		||||
@ -142,7 +160,7 @@
 | 
			
		||||
          [color]="'primary'"
 | 
			
		||||
          (click)="send()"
 | 
			
		||||
        >
 | 
			
		||||
          Send
 | 
			
		||||
          등록
 | 
			
		||||
        </button>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
@ -7,11 +7,14 @@ import {
 | 
			
		||||
} from '@angular/core';
 | 
			
		||||
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
 | 
			
		||||
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
 | 
			
		||||
import { SiteService } from 'app/modules/polyglot/domain/services/site.service';
 | 
			
		||||
import { IdentityService } from 'app/modules/polyglot/member/services/identity.service';
 | 
			
		||||
import { Site } from 'app/modules/protobuf/models/domain/site_pb';
 | 
			
		||||
 | 
			
		||||
export interface RegistComposeData {
 | 
			
		||||
  title: string;
 | 
			
		||||
  parentId: string;
 | 
			
		||||
  sites: Site[];
 | 
			
		||||
}
 | 
			
		||||
export interface RegistComposeResult {
 | 
			
		||||
  parentId: string;
 | 
			
		||||
@ -34,10 +37,7 @@ export interface RegistComposeResult {
 | 
			
		||||
})
 | 
			
		||||
export class RegistComposeComponent implements OnInit {
 | 
			
		||||
  composeForm!: FormGroup;
 | 
			
		||||
  copyFields: { cc: boolean; bcc: boolean } = {
 | 
			
		||||
    cc: false,
 | 
			
		||||
    bcc: false,
 | 
			
		||||
  };
 | 
			
		||||
  sites: any[] = [];
 | 
			
		||||
  // quillModules: any = {
 | 
			
		||||
  //   toolbar: [
 | 
			
		||||
  //     ['bold', 'italic', 'underline'],
 | 
			
		||||
@ -55,7 +55,12 @@ export class RegistComposeComponent implements OnInit {
 | 
			
		||||
    private _formBuilder: FormBuilder,
 | 
			
		||||
    private _identityService: IdentityService,
 | 
			
		||||
    private _changeDetectorRef: ChangeDetectorRef
 | 
			
		||||
  ) {}
 | 
			
		||||
  ) {
 | 
			
		||||
    this.data.sites.map((v) => {
 | 
			
		||||
      const a = v.toObject();
 | 
			
		||||
      this.sites.push(a);
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // -----------------------------------------------------------------------------------------------------
 | 
			
		||||
  // @ Lifecycle hooks
 | 
			
		||||
@ -85,21 +90,6 @@ export class RegistComposeComponent implements OnInit {
 | 
			
		||||
  // @ Public methods
 | 
			
		||||
  // -----------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Show the copy field with the given field name
 | 
			
		||||
   *
 | 
			
		||||
   * @param name
 | 
			
		||||
   */
 | 
			
		||||
  showCopyField(name: string): void {
 | 
			
		||||
    // Return if the name is not one of the available names
 | 
			
		||||
    if (name !== 'cc' && name !== 'bcc') {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Show the field
 | 
			
		||||
    this.copyFields[name] = true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Save and close
 | 
			
		||||
   */
 | 
			
		||||
@ -141,6 +131,21 @@ export class RegistComposeComponent implements OnInit {
 | 
			
		||||
      });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  __checkNickname(event: FocusEvent): void {
 | 
			
		||||
    const nickname = this.composeForm.get('nickname')?.value;
 | 
			
		||||
 | 
			
		||||
    this._identityService
 | 
			
		||||
      .checkNicknameForDuplication(nickname)
 | 
			
		||||
      .then((isUse: boolean) => {
 | 
			
		||||
        if (!!isUse) {
 | 
			
		||||
          this.composeForm
 | 
			
		||||
            .get('nickname')
 | 
			
		||||
            ?.setErrors({ nicknameDuplicate: true });
 | 
			
		||||
        }
 | 
			
		||||
        this._changeDetectorRef.markForCheck();
 | 
			
		||||
      });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // checkSameName(): ValidatorFn {
 | 
			
		||||
  //   return (control: AbstractControl): { [key: string]: any } | null => {
 | 
			
		||||
  //     if (
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,7 @@
 | 
			
		||||
import { NgModule } from '@angular/core';
 | 
			
		||||
import { RouterModule } from '@angular/router';
 | 
			
		||||
import { CommonModule } from '@angular/common';
 | 
			
		||||
import { ReactiveFormsModule, FormsModule } from '@angular/forms';
 | 
			
		||||
 | 
			
		||||
import { MatButtonModule } from '@angular/material/button';
 | 
			
		||||
import { MatFormFieldModule } from '@angular/material/form-field';
 | 
			
		||||
@ -29,6 +31,9 @@ import { partnerRoutes } from './partner.routing';
 | 
			
		||||
    TranslocoModule,
 | 
			
		||||
    SharedModule,
 | 
			
		||||
    RouterModule.forChild(partnerRoutes),
 | 
			
		||||
    CommonModule,
 | 
			
		||||
    ReactiveFormsModule,
 | 
			
		||||
    FormsModule,
 | 
			
		||||
 | 
			
		||||
    MatButtonModule,
 | 
			
		||||
    MatFormFieldModule,
 | 
			
		||||
 | 
			
		||||
@ -7,11 +7,14 @@ import { Error } from 'app/modules/protobuf/protobuf/rpc/error_pb';
 | 
			
		||||
import {
 | 
			
		||||
  CheckUsernameForDuplicationRequest,
 | 
			
		||||
  CheckUsernameForDuplicationResponse,
 | 
			
		||||
  CheckNicknameForDuplicationRequest,
 | 
			
		||||
  CheckNicknameForDuplicationResponse,
 | 
			
		||||
  CaptchaRequest,
 | 
			
		||||
  CaptchaResponse,
 | 
			
		||||
} from 'app/modules/protobuf/c2se/common/identity_pb';
 | 
			
		||||
import {
 | 
			
		||||
  SUBJECT_CHECK_USERNAME_FOR_DUPLICATION,
 | 
			
		||||
  SUBJECT_CHECK_NICKNAME_FOR_DUPLICATION,
 | 
			
		||||
  SUBJECT_CAPTCHA,
 | 
			
		||||
  SUBJECT_SIGNIN,
 | 
			
		||||
  SigninRequest,
 | 
			
		||||
@ -57,6 +60,28 @@ export class IdentityService {
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  checkNicknameForDuplication(nickname: string): Promise<boolean> {
 | 
			
		||||
    return new Promise<boolean>((resolve, reject) => {
 | 
			
		||||
      let req = new CheckNicknameForDuplicationRequest();
 | 
			
		||||
      req.setNickname(nickname);
 | 
			
		||||
 | 
			
		||||
      this.__natsService
 | 
			
		||||
        .request<CheckNicknameForDuplicationResponse.Result>(
 | 
			
		||||
          SUBJECT_CHECK_NICKNAME_FOR_DUPLICATION,
 | 
			
		||||
          req.serializeBinary(),
 | 
			
		||||
          CheckNicknameForDuplicationResponse.deserializeBinary
 | 
			
		||||
        )
 | 
			
		||||
        .then((result) => {
 | 
			
		||||
          console.log('success', result, result.getDuplicated());
 | 
			
		||||
          resolve(result.getDuplicated());
 | 
			
		||||
        })
 | 
			
		||||
        .catch((e: Error) => {
 | 
			
		||||
          console.log('failed', e);
 | 
			
		||||
          reject(e);
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  captcha(): Promise<CaptchaResponse.Result> {
 | 
			
		||||
    return new Promise<CaptchaResponse.Result>((resolve, reject) => {
 | 
			
		||||
      let req = new CaptchaRequest();
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user