File

projects/common/lib/components/phone-number/phone-number.component.ts

Description

PhoneNumberComponent is a used to show the Phone number.

Extends

AbstractFormControl

Implements

OnInit

Example

<common-phone-number name='phoneNumber'
         [(ngModel)]='dataService.facAdminPhoneNumber'
         required></common-phone-number>

Metadata

selector common-phone-number
styleUrls ./phone-number.component.scss
templateUrl ./phone-number.component.html

Index

Properties
Methods
Inputs
Outputs
Accessors

Constructor

constructor(controlDir: NgControl)
Parameters :
Name Type Optional
controlDir NgControl No

Inputs

allowInternational
Type : boolean
Default value : true
displayMask
Type : boolean
Default value : true
enablePlaceHolder
Type : boolean
Default value : true
label
Type : string
Default value : 'Mobile'
required
Type : boolean
Default value : false
value
Type : string
disabled
Type : boolean
Default value : false
Inherited from AbstractFormControl
errorMessage
Type : ErrorMessage
Inherited from AbstractFormControl
label
Type : string
Inherited from AbstractFormControl

Outputs

valueChange
Type : EventEmitter<string>

Methods

ngOnInit
ngOnInit()
Returns : void
onBlur
onBlur($event)
Parameters :
Name Optional
$event No
Returns : void
setPhoneNumber
setPhoneNumber(value)
Parameters :
Name Optional
value No
Returns : void
Private validateSelf
validateSelf()
Returns : { incompleteValue: boolean; }
writeValue
writeValue(value: any)
Parameters :
Name Type Optional
value any No
Returns : void
ngOnInit
ngOnInit()
Inherited from AbstractFormControl
Returns : void
registerOnChange
registerOnChange(fn: any)
Inherited from AbstractFormControl
Parameters :
Name Type Optional
fn any No
Returns : void
registerOnTouched
registerOnTouched(fn: any)
Inherited from AbstractFormControl
Parameters :
Name Type Optional
fn any No
Returns : void
Protected registerValidation
registerValidation(ngControl: NgControl, fn: ValidationErrors)
Inherited from AbstractFormControl

Register self validating method

Parameters :
Name Type Optional Description
ngControl NgControl No
fn ValidationErrors No

function for validating self

Returns : any
setDisabledState
setDisabledState(isDisabled: boolean)
Inherited from AbstractFormControl
Parameters :
Name Type Optional
isDisabled boolean No
Returns : void
Protected setErrorMsg
setErrorMsg()
Inherited from AbstractFormControl
Returns : void
Private validateLabel
validateLabel()
Inherited from AbstractFormControl
Returns : void
Abstract writeValue
writeValue(value: any)
Inherited from AbstractFormControl
Parameters :
Name Type Optional
value any No
Returns : void

Properties

_defaultErrMsg
Type : ErrorMessage
Default value : { required: `${LabelReplacementTag} is required.`, incompleteValue: `${LabelReplacementTag} does not appear to be valid.` }
Public controlDir
Type : NgControl
Decorators :
@Optional()
@Self()
Public mask
Type : any
Public phoneNumber
Type : string
Default value : ''
Static PhoneNumberRegEx
Type : string
Default value : '^[2-9]{1}\\d{2}[\\-]?\\d{3}[\\-]?\\d{4}$'
Public placeholder
Type : string
Abstract _defaultErrMsg
Type : ErrorMessage
Default value : {}
Inherited from AbstractFormControl
_onChange
Default value : () => {...}
Inherited from AbstractFormControl
_onTouched
Default value : () => {...}
Inherited from AbstractFormControl
Public objectId
Type : string
Default value : UUID.UUID()
Inherited from Base
Defined in Base:11

An identifier for parents to keep track of components

Accessors

value
getvalue()
setvalue(val: string)
Parameters :
Name Type Optional
val string No
Returns : void
import {
  Component,
  Input,
  Output,
  EventEmitter,
  Optional,
  Self,
  OnInit
} from '@angular/core';
import { NgControl } from '@angular/forms';
import { NUMBER, SPACE } from '../../models/mask.constants';
import { ErrorMessage, LabelReplacementTag } from '../../models/error-message.interface';
import { AbstractFormControl } from '../../models/abstract-form-control';

/**
 * PhoneNumberComponent is a used to show the Phone number.
 *
 *
 * @example
 *         <common-phone-number name='phoneNumber'
 *                              [(ngModel)]='dataService.facAdminPhoneNumber'
 *                              required></common-phone-number>
 * @export
 */


@Component({
  selector: 'common-phone-number',
  templateUrl: './phone-number.component.html',
  styleUrls: ['./phone-number.component.scss'],
})

export class PhoneNumberComponent extends AbstractFormControl implements OnInit {

  static PhoneNumberRegEx = '^[2-9]{1}\\d{2}[\\-]?\\d{3}[\\-]?\\d{4}$';
  @Input() displayMask: boolean = true;
  @Input() required: boolean = false;
  @Input() label: string = 'Mobile';

  @Input() allowInternational: boolean = true;

  // TODO: Remove once all project using library remove placeholders -- Temporary solution
  @Input() enablePlaceHolder: boolean = true;

  // Setter/getter for when not used in form (ex. data dislayed but not edittable)
  @Input()
  set value( val: string ) {
    if ( val !== undefined ) {
      this.phoneNumber = val;
    }
  }
  get value() {
    return this.phoneNumber;
  }

  @Output() valueChange: EventEmitter<string> = new EventEmitter<string>();

  public phoneNumber: string = '';

  public mask: any;
  public placeholder: string;

  // Abstact variable defined
  _defaultErrMsg: ErrorMessage = {
    required: `${LabelReplacementTag} is required.`,
    incompleteValue: `${LabelReplacementTag} does not appear to be valid.`
  };

  constructor(@Optional() @Self() public controlDir: NgControl) {
    super();
    if (controlDir) {
      controlDir.valueAccessor = this;
    }
  }

  ngOnInit() {
    super.ngOnInit();

    const internationalPrefix = '+1';
    this.placeholder = this.enablePlaceHolder ? '(555) 555-5555' : '';
    this.mask = ['(', /[2-9]/, NUMBER, NUMBER, ')', SPACE, NUMBER, NUMBER, NUMBER, '-', NUMBER, NUMBER, NUMBER, NUMBER];

    if (this.allowInternational) {
      if ( this.placeholder ) {
        this.placeholder = `${internationalPrefix} ${this.placeholder}`;
      }
      const prefixArrayOfChar = internationalPrefix.split(''); // ['+', '1']
      this.mask = [...prefixArrayOfChar, SPACE, ...this.mask];
    }

    // Register self validation
    Promise.resolve().then(() => {

      if (this.controlDir) {

        const allValidators = [this.validateSelf.bind(this)];
        if (this.controlDir.control.validator) {
          allValidators.push(this.controlDir.control.validator);
        }
        this.controlDir.control.setValidators(allValidators);
        this.controlDir.control.updateValueAndValidity();
      }
    });

  }

  setPhoneNumber(value) {
    this.phoneNumber = value;
    this.valueChange.emit(this.phoneNumber);
    this._onChange(value);
  }

  onBlur( $event ) {
    this._onTouched($event);
  }


  writeValue(value: any): void {
    if  (value !== undefined ) {
      // phoneNumber is where the actual data is displayed to user for this
      // component
      this.phoneNumber = value;
    }
  }

  private validateSelf() {
    const value = this.phoneNumber;
    const phoneLength = this.allowInternational ? 11 : 10;

    if (value) {
      const stripped = value
        .replace(/_/g, '') // remove underlines
        .replace(/\s/g, '') // spaces
        .replace(/\+|-/g, '') // + or - symbol
        .replace('(', '')
        .replace(')', '');

      const valid = stripped.length === phoneLength;
      return valid ? null : { incompleteValue: true };

    }
    return null;
  }
}

<label for="phone_{{objectId}}" class="control-label">{{label}}</label>
<div *ngIf="displayMask; else NoMask">
  <input class="form-control"
          type="text"
          name="phone_{{objectId}}"
          id="phone_{{objectId}}"
          [ngModel]="phoneNumber"
          (ngModelChange)="setPhoneNumber($event)"
          (blur)="onBlur($event)"
          [placeholder]="placeholder "
          [textMask]="{mask: mask}"
          [required]="required"
          [disabled]="disabled"/>
</div>

<!-- Error messages for component -->
<common-error-container
    [displayError]="!disabled && (controlDir?.touched || controlDir?.dirty) && controlDir?.errors">
  <div *ngIf="controlDir?.errors?.required">
    {{_defaultErrMsg.required}}
  </div>
  <div *ngIf="controlDir?.errors?.incompleteValue">
    {{_defaultErrMsg.incompleteValue}}
  </div>
</common-error-container>


<ng-template #NoMask>
  <input class="form-control"
          type="text"
          name="phone_{{objectId}}"
          id="phone_{{objectId}}"
          [value]="phoneNumber"
          (input)="setPhoneNumber($event.target.value)"
          (blur)="onBlur($event)"
          [required]="required"
          [disabled]="disabled" />
</ng-template>

Legend
Html element
Component
Html element with directive

result-matching ""

    No results matching ""