ng-valid-phone
Version:
Angularjs directive which use google's libphonenumber library for international phone number validations.
103 lines (95 loc) • 4.55 kB
JavaScript
(function(root, factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
define(['angular'], factory);
} else if (typeof module !== 'undefined' && typeof module.exports === 'object') {
module.exports = factory(require('angular'));
} else {
return factory(root.angular);
}
}(this, function(angular) {
'use strict';
var moduleName = 'ngValidPhone';
var mod = angular.module(moduleName, []);
mod.directive('ngValidPhone', function($window) {
return {
restrict: 'A',
require: 'ngModel',
scope: {
countryCode: '=',
placeHolder: '='
},
link: function(scope, element, attrs, modelCtrl) {
var phoneUtil = libphonenumber.PhoneNumberUtil.getInstance();
var AsYouTypeFormatter = libphonenumber.AsYouTypeFormatter;
var onlynumeric = function(inputValue) {
if (inputValue == undefined) inputValue = '';
inputValue = inputValue.replace(/\D/g, '');
if (scope.countryCode && scope.countryCode.length == 2 && inputValue.length > 1) {
var formatter = new AsYouTypeFormatter(scope.countryCode),
filtered;
for (var i = 0, len = inputValue.length; i + 1 < len; i++) {
formatter.inputDigit(inputValue[i]);
}
filtered = formatter.inputDigit(inputValue[inputValue.length - 1]);
modelCtrl.$setViewValue(filtered);
modelCtrl.$render();
} else {
modelCtrl.$setViewValue(inputValue);
modelCtrl.$render();
}
return inputValue;
}
modelCtrl.$parsers.push(onlynumeric);
scope.$watch('countryCode', function(value) {
modelCtrl.$validate();
if (typeof scope.placeHolder != 'undefined') {
try {
var exnumber = phoneUtil.getExampleNumberForType(scope.countryCode, scope.placeHolder);
attrs.$set('placeholder', phoneUtil.format(exnumber, 4).replace('+', ''));
} catch (err) {
attrs.$set('placeholder', '');
}
}
});
var IsPhoneValid = function(inputValue) {
if (inputValue) {
try {
if (scope.countryCode && scope.countryCode.length == 2) {
var parsedNumber = phoneUtil.parse(inputValue, scope.countryCode);
var isvalidnum = phoneUtil.isValidNumber(parsedNumber);
if (isvalidnum) {
onlynumeric(phoneUtil.format(parsedNumber, 4));
return true;
} else {
return false;
}
} else {
var parsedNumber = phoneUtil.parse('+' + inputValue);
var isvalidnum = phoneUtil.isValidNumber(parsedNumber);
if (isvalidnum) {
if (typeof scope.countryCode != 'undefined') {
scope.countryCode = phoneUtil.getRegionCodeForNumber(parsedNumber);
onlynumeric(phoneUtil.format(parsedNumber, 4));
}
return true;
} else {
return false;
}
}
} catch (err) {
return false;
}
} else return false;
};
modelCtrl.$validators.invalidPhone = function(modelValue, viewValue) {
if (modelCtrl.$isEmpty(modelValue)) {
return true;
}
return IsPhoneValid(modelValue);
};
}
}
});
return moduleName;
}));