Last active
September 17, 2018 17:45
-
-
Save mciastek/28a2d59dd937ccdad797 to your computer and use it in GitHub Desktop.
Angular phone number filter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* [Filter] phone number filter | |
* Usage: {{ phoneNumber | {prefix} {range} {range} {range} }} | |
* {prefix} - e.g. {+48} | |
* {range} - e.g. {3} or {2-3} | |
* -> where first number in {2-3} defines slicing when string.length equals 7, | |
* second defines slicing for length equal 9 | |
*/ | |
angular.module('app').filter('phoneNumber', function() { | |
return function(item, pattern) { | |
// if no item return empty string | |
if (!item) { | |
return ''; | |
} | |
// if not pattern provided set default pattern | |
if (!pattern) { | |
pattern = '{+48} {3} {2-3} {2-3}'; | |
} | |
try { | |
if (pattern) { | |
pattern.match(/\{(\S{1,3})\}/g); | |
} | |
} catch (err) { | |
throw new Error('Please enter proper filter pattern. For example: {+48} {3} {2-3} {2-3}'); | |
} | |
// get patterns | |
var patternArray = pattern.match(/\{(\S{1,3})\}/g); | |
// get prefix and gap | |
var prefix = patternArray[0].match(/\+\d{2}/); | |
var gap = pattern.match(/}(\S|\s){/)[1]; | |
var formattedNumber = ''; | |
var phone = ''; | |
// slices length container | |
var slices = []; | |
var sliceRange = 0; | |
var i; | |
// clear filtered item from whitespaces | |
item = item.toString().replace(new RegExp('^\\' + prefix + '|\\s+|', 'g'), ''); | |
// push slices to array from patternArray | |
for (i = (prefix) ? 1 : 0; i < patternArray.length; i++) { | |
if (patternArray[i].match(/[a-z]+/g)) { | |
throw new Error('Please provide number range into filter'); | |
} | |
if (patternArray[i].match(/\d/g).length === 1) { | |
slices.push(patternArray[i].match(/\d/g)[0]); | |
} else { | |
slices.push(patternArray[i].match(/\d/g)); | |
} | |
} | |
// set slice range according to item.length | |
switch (item.length) { | |
case 9: | |
sliceRange = 1; | |
break; | |
case 7: | |
sliceRange = 0; | |
break; | |
default: | |
return item; | |
} | |
// build phone number | |
for (i = 0; i < slices.length; i++) { | |
// if slice is not range type, | |
// for example: {3} | |
if (typeof slices[i] !== 'object') { | |
if (i === 0) { | |
phone += item.slice(0, parseInt(slices[i], 10)) + gap; | |
} else { | |
if (i !== (slices.length - 1)) { | |
phone += item.slice( ((phone.length) - (gap.length * i)), ((phone.length) - (gap.length * i)) + parseInt(slices[i], 10)) + gap; | |
} else { | |
phone += item.slice( ((phone.length) - (gap.length * i)), ((phone.length) - (gap.length * i)) + parseInt(slices[i], 10)); | |
} | |
} | |
// if slices is range type, | |
// for example {2-3} | |
} else { | |
if (i === 0) { | |
phone += item.slice(0, parseInt(slices[i][sliceRange], 10)) + gap; | |
} else { | |
if (i !== (slices.length - 1)) { | |
phone += item.slice( ((phone.length) - (gap.length * i)), ((phone.length) - (gap.length * i)) + parseInt(slices[i][sliceRange], 10)) + gap; | |
} else { | |
phone += item.slice( ((phone.length) - (gap.length * i)), ((phone.length) - (gap.length * i)) + parseInt(slices[i][sliceRange], 10)) | |
} | |
} | |
} | |
} | |
// if prefix is defined add prefix to number | |
if (prefix) { | |
formattedNumber = prefix + gap + phone; | |
} else { | |
formattedNumber = phone; | |
} | |
return formattedNumber; | |
}; | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment