projects/common/lib/components/phone-number/phone-number.component.ts
PhoneNumberComponent is a used to show the Phone number.
<common-phone-number name='phoneNumber'
[(ngModel)]='dataService.facAdminPhoneNumber'
required></common-phone-number>
selector | common-phone-number |
styleUrls | ./phone-number.component.scss |
templateUrl | ./phone-number.component.html |
Properties |
|
Methods |
|
Inputs |
Outputs |
Accessors |
constructor(controlDir: NgControl)
|
||||||
Parameters :
|
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
|
|
Defined in
AbstractFormControl:16
|
errorMessage | |
Type : ErrorMessage
|
|
Inherited from
AbstractFormControl
|
|
Defined in
AbstractFormControl:19
|
label | |
Type : string
|
|
Inherited from
AbstractFormControl
|
|
Defined in
AbstractFormControl:14
|
valueChange | |
Type : EventEmitter<string>
|
|
ngOnInit |
ngOnInit()
|
Returns :
void
|
onBlur | ||||
onBlur($event)
|
||||
Parameters :
Returns :
void
|
setPhoneNumber | ||||
setPhoneNumber(value)
|
||||
Parameters :
Returns :
void
|
Private validateSelf |
validateSelf()
|
Returns :
{ incompleteValue: boolean; }
|
writeValue | ||||||
writeValue(value: any)
|
||||||
Parameters :
Returns :
void
|
ngOnInit |
ngOnInit()
|
Inherited from
AbstractFormControl
|
Defined in
AbstractFormControl:27
|
Returns :
void
|
registerOnChange | ||||||
registerOnChange(fn: any)
|
||||||
Inherited from
AbstractFormControl
|
||||||
Defined in
AbstractFormControl:35
|
||||||
Parameters :
Returns :
void
|
registerOnTouched | ||||||
registerOnTouched(fn: any)
|
||||||
Inherited from
AbstractFormControl
|
||||||
Defined in
AbstractFormControl:40
|
||||||
Parameters :
Returns :
void
|
Protected registerValidation | ||||||||||||
registerValidation(ngControl: NgControl, fn: ValidationErrors)
|
||||||||||||
Inherited from
AbstractFormControl
|
||||||||||||
Defined in
AbstractFormControl:68
|
||||||||||||
Register self validating method
Parameters :
Returns :
any
|
setDisabledState | ||||||
setDisabledState(isDisabled: boolean)
|
||||||
Inherited from
AbstractFormControl
|
||||||
Defined in
AbstractFormControl:45
|
||||||
Parameters :
Returns :
void
|
Protected setErrorMsg |
setErrorMsg()
|
Inherited from
AbstractFormControl
|
Defined in
AbstractFormControl:49
|
Returns :
void
|
Private validateLabel |
validateLabel()
|
Inherited from
AbstractFormControl
|
Defined in
AbstractFormControl:88
|
Returns :
void
|
Abstract writeValue | ||||||
writeValue(value: any)
|
||||||
Inherited from
AbstractFormControl
|
||||||
Defined in
AbstractFormControl:32
|
||||||
Parameters :
Returns :
void
|
_defaultErrMsg |
Type : ErrorMessage
|
Default value : {
required: `${LabelReplacementTag} is required.`,
incompleteValue: `${LabelReplacementTag} does not appear to be valid.`
}
|
Public controlDir |
Type : NgControl
|
Decorators :
@Optional()
|
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
|
Defined in
AbstractFormControl:11
|
_onChange |
Default value : () => {...}
|
Inherited from
AbstractFormControl
|
Defined in
AbstractFormControl:23
|
_onTouched |
Default value : () => {...}
|
Inherited from
AbstractFormControl
|
Defined in
AbstractFormControl:24
|
Public objectId |
Type : string
|
Default value : UUID.UUID()
|
Inherited from
Base
|
Defined in
Base:11
|
An identifier for parents to keep track of components |
value | ||||||
getvalue()
|
||||||
setvalue(val: string)
|
||||||
Parameters :
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>