10.1. Listing Page Edit page - quan1997ap/angular-app-note GitHub Wiki

Listing Page

  1. Thanh search fixed header
  2. Search strim() đầu cuối với Input
  3. Search với kí tự đặc biệt
  4. Submit ( Button hoặc Enter ) => strimg strim() đầu cuối với Input
  5. Màn hình hiển thị khi không có item nào
  6. Màn hình hiển thị khi loading
  7. Test loadmore. Xem kết quả load more với param null/ không có params có giống nhau không
  8. Test Resize Table + Resize form search

Add / Edit page

  1. Test Title
  2. Test Popup size + Disable close khi click ra ngoài popup
  3. Không nhập kí tự đặc biệt với Input text
  4. Input number: không cho nhập + - , e
  5. Trim input text
  6. Chỉ hiện validation message sau khi submit
  7. KHi mới vào form, button submit không được disable
  8. Check trùng tên với 1 số bảng đặc biệt

1 số code hay dùng

  1. Đánh dấu các control trong form đã từng nhập
    /* 
        Chỉ cho người dùng nhập số Input Number
        -: 69
        e: 189
        +: 43
         var charCode = keyEvent.which ? keyEvent.which : keyEvent.keyCode;
        var isNotNumber = charCode < 48 || charCode > 57;
        var isNotArrow = charCode < 37 || charCode > 40;
        var isNotBackspace = charCode !== 8;
        https://stackoverflow.com/questions/5535449/javascript-keycode-allow-number-and-plus-symbol-only
    */
    markAsDirtyContractForm(form: FormGroup) {
        const recursiveFunc = (formGroup: FormGroup) => {
            Object.keys(formGroup.controls).forEach(field => {
            const control = formGroup.get(field);
            form.controls[field].markAsTouched();
            form.controls[field].markAsDirty();
            form.controls[field].updateValueAndValidity({ emitEvent: false });
            if (control instanceof FormGroup) {
                recursiveFunc(control);
            }
            });
        };
        recursiveFunc(form);
    }
  1. Tạo Input number chỉ nhập số dương
   /*
   html input number + validate
   */
    <mat-form-field class="vcs-form-field vcs-number-input md my-2" appearance="standard">
        <input matInput type="number" min="0" autocomplete="off" formControlName="value_cmt" (blur)="checkValueCmt($event)" 
        (keydown)="validateService.isKeyCorrect($event)" />
        
        <mat-error class="vcs-mat-error" *ngIf="validateService.isControlHasError(slaItemForm, 'value_cmt','required')">
            <mat-icon svgIcon="vcs-alert-diamond-filled-24" class="vcs-icon-16"></mat-icon>
            <span>Bạn phải nhập giá trị cam kết</span>
        </mat-error>
        <mat-error class="vcs-mat-error" *ngIf="validateService.isControlHasError(slaItemForm, 'value_cmt','max')">
            <mat-icon svgIcon="vcs-alert-diamond-filled-24" class="vcs-icon-16"></mat-icon>
            <span>Nhập giá trị nhỏ hơn {{validateService.VALUE_CMT_MAX | number }} </span>
        </mat-error>
        <mat-error class="vcs-mat-error" *ngIf="validateService.isControlHasError(slaItemForm, 'value_cmt','pattern')">
            <mat-icon svgIcon="vcs-alert-diamond-filled-24" class="vcs-icon-16"></mat-icon>
            <span>Bạn phải nhập đúng định dạng số</span>
        </mat-error>
    </mat-form-field>

   /*
     checkValueCmt: khi Input number lost focus => check giá trị number, nếu vượt quá giá trị thì lấy giá trị max
   */

  checkValueCmt($event) {
    this.slaItemForm.patchValue({
      value_cmt: this.validateService.replaceNumber(this.slaItemForm.getRawValue()['value_cmt'], this.validateService.VALUE_CMT_MAX)
    });
  }

    replaceNumber(valueCmtReplace, max){
        if(valueCmtReplace !== null && valueCmtReplace !== undefined){
          if( ['.', ','].includes(valueCmtReplace[valueCmtReplace.length-1]) ){
            valueCmtReplace = valueCmtReplace.slice(0, valueCmtReplace.length-1);
          }
          valueCmtReplace = valueCmtReplace.toString();
          valueCmtReplace = valueCmtReplace.replace( '+', '');
          valueCmtReplace = valueCmtReplace.replace( '-', '');
          if(max !== null && max !== undefined && Number(valueCmtReplace) > max){
            valueCmtReplace = max;
          }
        } else {
            return null;
        }
        return Number(valueCmtReplace);
    }


    /* 
        Chỉ cho người dùng nhập số vào Input Number
        -: 69
        e: 189
        +: 43
         var charCode = keyEvent.which ? keyEvent.which : keyEvent.keyCode;
        var isNotNumber = charCode < 48 || charCode > 57;
        var isNotArrow = charCode < 37 || charCode > 40;
        var isNotBackspace = charCode !== 8;
        https://stackoverflow.com/questions/5535449/javascript-keycode-allow-number-and-plus-symbol-only
    */

    isKeyCorrect(keyEvent) {
        let charCode = keyEvent?.which ? keyEvent?.which : keyEvent?.keyCode;
        let isNumber = (charCode >= 48 && charCode <= 57) || (charCode >= 96 && charCode <= 105);
        let isNotE = charCode !== 189;
        let isArrow = charCode >= 37 && charCode <= 40;
        let isBackspace = charCode == 8;
        let isDot = [190, 110].includes(charCode);
        return ( isNumber || isArrow || isBackspace || isDot ) && isNotE ;
    }


   /*
     Debounce time => check trùng tên
   */

  this.slaPackageForm = this.fb.group({
        name: [
        null,
        Validators.compose([
            Validators.pattern(this.validateService.vietnameseUnicodeCharactersRegex)
        ]),
        this.validatePackageNameFromAPIDebounce.bind(this),
        ]
  });

  validatePackageNameFromAPIDebounce(control: AbstractControl): Observable<ValidationErrors | null> {
    this.appProcessing.updateProcessingState(true);
    return timer(500).pipe(
      switchMap(() => {
        return this.slaPackageService.SLAsPostSearch({ name: control.value }).pipe(
          map((res: any) => {
            this.appProcessing.updateProcessingState(false);
            /**
             * filter by name
            */
            let itemDuplicateName = res.data.filter(slaPackage => slaPackage.name == control.value);
            if (this.data && this.data['slaPackage']) {
              /**
              * filter by _id of currrent SLA
              */
              itemDuplicateName = itemDuplicateName.filter(item => item._id !== this.data.slaPackage['_id'])
            }

            if (itemDuplicateName && itemDuplicateName.length > 0) {
              return { nameDuplicated: true }
            } else {
              return null;
            }

          })
        )
      }
      )
    );
  }
⚠️ **GitHub.com Fallback** ⚠️