gumga-mask-ng
Version:
Gumga Mask (Angular 1.x)
1 lines • 10.3 kB
JavaScript
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){"use strict";(function(){"use strict";Mask.$inject=["$parse"];function Mask($parse){function isFocused(elem){return elem===document.activeElement&&(!document.hasFocus||document.hasFocus())&&!!(elem.type||elem.href||~elem.tabIndex)}return{priority:100,require:"ngModel",restrict:"A",scope:false,compile:function gumgaMaskCompilingFunction(){var options={maskDefinitions:{9:/\d/,A:/[a-zA-Z]/,"*":/[a-zA-Z0-9]/},clearOnBlur:true,eventsToHandle:["input","keyup","click","focus"]};return function gumgaMaskLinkingFunction(scope,elm,attrs,ctrl){var maskProcessed=false,eventsBound=false,maskCaretMap,maskPatterns,maskPlaceholder,maskComponents,minRequiredLength,value,valueMasked,isValid,originalPlaceholder=attrs.placeholder,originalMaxlength=attrs.maxlength,oldValue,oldValueUnmasked,oldCaretPosition,oldSelectionLength;function initialize(maskAttr){if(!angular.isDefined(maskAttr)){return uninitialize()}processRawMask(maskAttr);if(!maskProcessed){return uninitialize()}initializeElement();bindEventListeners();return true}function initPlaceholder(placeholderAttr){if(!placeholderAttr){return}maskPlaceholder=placeholderAttr;if(maskProcessed){elm.val(maskValue(unmaskValue(elm.val())))}}function formatter(fromModelValue){if(!maskProcessed){return fromModelValue}value=unmaskValue(fromModelValue||"");isValid=validateValue(value);ctrl.$setValidity("mask",isValid);return isValid&&value.length?maskValue(value):undefined}function parser(fromViewValue){if(!maskProcessed){return fromViewValue}value=unmaskValue(fromViewValue||"");isValid=validateValue(value);ctrl.$viewValue=value.length?maskValue(value):"";ctrl.$setValidity("mask",isValid);if(value===""&&attrs.required){ctrl.$setValidity("required",!ctrl.$error.required)}return isValid?value:undefined}var linkOptions=options;if(attrs.gumgaMaskOptions){linkOptions=scope.$eval(attrs.gumgaMaskOptions);if(angular.isObject(linkOptions)){linkOptions=function(original,current){for(var i in original){if(Object.prototype.hasOwnProperty.call(original,i)){if(current[i]===undefined){current[i]=angular.copy(original[i])}else{angular.extend(current[i],original[i])}}}return current}(options,linkOptions)}}else{linkOptions=options}attrs.$observe("gumgaMask",initialize);if(angular.isDefined(attrs.gumgaMaskPlaceholder)){attrs.$observe("gumgaMaskPlaceholder",initPlaceholder)}else{attrs.$observe("placeholder",initPlaceholder)}var modelViewValue=false;attrs.$observe("modelViewValue",function(val){if(val==="true"){modelViewValue=true}});scope.$watch(attrs.ngModel,function(val){if(modelViewValue&&val){var model=$parse(attrs.ngModel);model.assign(scope,ctrl.$viewValue)}});ctrl.$formatters.push(formatter);ctrl.$parsers.push(parser);function uninitialize(){maskProcessed=false;unbindEventListeners();if(angular.isDefined(originalPlaceholder)){elm.attr("placeholder",originalPlaceholder)}else{elm.removeAttr("placeholder")}if(angular.isDefined(originalMaxlength)){elm.attr("maxlength",originalMaxlength)}else{elm.removeAttr("maxlength")}elm.val(ctrl.$modelValue);ctrl.$viewValue=ctrl.$modelValue;return false}function initializeElement(){value=oldValueUnmasked=unmaskValue(ctrl.$modelValue||"");valueMasked=oldValue=maskValue(value);isValid=validateValue(value);var viewValue=isValid&&value.length?valueMasked:"";if(attrs.maxlength){elm.attr("maxlength",maskCaretMap[maskCaretMap.length-1]*2)}if(!originalPlaceholder){elm.attr("placeholder",maskPlaceholder)}elm.val(viewValue);ctrl.$viewValue=viewValue;ctrl.$setValidity("mask",isValid)}function bindEventListeners(){if(eventsBound){return}elm.bind("blur",blurHandler);elm.bind("mousedown mouseup",mouseDownUpHandler);elm.bind(linkOptions.eventsToHandle.join(" "),eventHandler);elm.bind("paste",onPasteHandler);eventsBound=true}function unbindEventListeners(){if(!eventsBound){return}elm.unbind("blur",blurHandler);elm.unbind("mousedown",mouseDownUpHandler);elm.unbind("mouseup",mouseDownUpHandler);elm.unbind("input",eventHandler);elm.unbind("keyup",eventHandler);elm.unbind("click",eventHandler);elm.unbind("focus",eventHandler);elm.unbind("paste",onPasteHandler);eventsBound=false}function validateValue(value){return value.length?value.length>=minRequiredLength:true}function unmaskValue(value){var valueUnmasked="",maskPatternsCopy=maskPatterns.slice();value=value.toString();angular.forEach(maskComponents,function(component){value=value.replace(component,"")});angular.forEach(value.split(""),function(chr){if(maskPatternsCopy.length&&maskPatternsCopy[0].test(chr)){valueUnmasked+=chr;maskPatternsCopy.shift()}});return valueUnmasked}function maskValue(unmaskedValue){var valueMasked="",maskCaretMapCopy=maskCaretMap.slice();angular.forEach(maskPlaceholder.split(""),function(chr,i){if(unmaskedValue.length&&i===maskCaretMapCopy[0]){valueMasked+=unmaskedValue.charAt(0)||"_";unmaskedValue=unmaskedValue.substr(1);maskCaretMapCopy.shift()}else{valueMasked+=chr}});return valueMasked}function getPlaceholderChar(i){var placeholder=angular.isDefined(attrs.gumgaMaskPlaceholder)?attrs.gumgaMaskPlaceholder:attrs.placeholder;if(typeof placeholder!=="undefined"&&placeholder[i]){return placeholder[i]}else{return"_"}}function getMaskComponents(){return maskPlaceholder.replace(/[_]+/g,"_").replace(/([^_]+)([a-zA-Z0-9])([^_])/g,"$1$2_$3").split("_")}function processRawMask(mask){var characterCount=0;maskCaretMap=[];maskPatterns=[];maskPlaceholder="";if(typeof mask==="string"){minRequiredLength=0;var isOptional=false,numberOfOptionalCharacters=0,splitMask=mask.split("");angular.forEach(splitMask,function(chr,i){if(linkOptions.maskDefinitions[chr]){maskCaretMap.push(characterCount);maskPlaceholder+=getPlaceholderChar(i-numberOfOptionalCharacters);maskPatterns.push(linkOptions.maskDefinitions[chr]);characterCount++;if(!isOptional){minRequiredLength++}}else if(chr==="?"){isOptional=true;numberOfOptionalCharacters++}else{maskPlaceholder+=chr;characterCount++}})}maskCaretMap.push(maskCaretMap.slice().pop()+1);maskComponents=getMaskComponents();maskProcessed=maskCaretMap.length>1?true:false}function blurHandler(){if(linkOptions.clearOnBlur){oldCaretPosition=0;oldSelectionLength=0;if(!isValid||value.length===0){valueMasked="";elm.val("");scope.$apply(function(){ctrl.$setViewValue("")})}}}function mouseDownUpHandler(e){if(e.type==="mousedown"){elm.bind("mouseout",mouseoutHandler)}else{elm.unbind("mouseout",mouseoutHandler)}}elm.bind("mousedown mouseup",mouseDownUpHandler);function mouseoutHandler(){oldSelectionLength=getSelectionLength(this);elm.unbind("mouseout",mouseoutHandler)}function onPasteHandler(){setCaretPosition(this,elm.val().length)}function eventHandler(e){e=e||{};var eventWhich=e.which,eventType=e.type;if(eventWhich===16||eventWhich===91){return}var val=elm.val(),valOld=oldValue,valMasked,valUnmasked=unmaskValue(val),valUnmaskedOld=oldValueUnmasked,caretPos=getCaretPosition(this)||0,caretPosOld=oldCaretPosition||0,caretPosDelta=caretPos-caretPosOld,caretPosMin=maskCaretMap[0],caretPosMax=maskCaretMap[valUnmasked.length]||maskCaretMap.slice().shift(),selectionLenOld=oldSelectionLength||0,isSelected=getSelectionLength(this)>0,wasSelected=selectionLenOld>0,isAddition=val.length>valOld.length||selectionLenOld&&val.length>valOld.length-selectionLenOld,isDeletion=val.length<valOld.length||selectionLenOld&&val.length===valOld.length-selectionLenOld,isSelection=eventWhich>=37&&eventWhich<=40&&e.shiftKey,isKeyLeftArrow=eventWhich===37,isKeyBackspace=eventWhich===8||eventType!=="keyup"&&isDeletion&&caretPosDelta===-1,isKeyDelete=eventWhich===46||eventType!=="keyup"&&isDeletion&&caretPosDelta===0&&!wasSelected,caretBumpBack=(isKeyLeftArrow||isKeyBackspace||eventType==="click")&&caretPos>caretPosMin;oldSelectionLength=getSelectionLength(this);if(isSelection||isSelected&&(eventType==="click"||eventType==="keyup")){return}if(eventType==="input"&&isDeletion&&!wasSelected&&valUnmasked===valUnmaskedOld){while(isKeyBackspace&&caretPos>caretPosMin&&!isValidCaretPosition(caretPos)){caretPos--}while(isKeyDelete&&caretPos<caretPosMax&&maskCaretMap.indexOf(caretPos)===-1){caretPos++}var charIndex=maskCaretMap.indexOf(caretPos);valUnmasked=valUnmasked.substring(0,charIndex)+valUnmasked.substring(charIndex+1)}valMasked=maskValue(valUnmasked);oldValue=valMasked;oldValueUnmasked=valUnmasked;elm.val(valMasked);ctrl.$setViewValue(valUnmasked);if(isAddition&&caretPos<=caretPosMin){caretPos=caretPosMin+1}if(caretBumpBack){caretPos--}caretPos=caretPos>caretPosMax?caretPosMax:caretPos<caretPosMin?caretPosMin:caretPos;while(!isValidCaretPosition(caretPos)&&caretPos>caretPosMin&&caretPos<caretPosMax){caretPos+=caretBumpBack?-1:1}if(caretBumpBack&&caretPos<caretPosMax||isAddition&&!isValidCaretPosition(caretPosOld)){caretPos++}oldCaretPosition=caretPos;setCaretPosition(this,caretPos)}function isValidCaretPosition(pos){return maskCaretMap.indexOf(pos)>-1}function getCaretPosition(input){if(!input)return 0;if(input.selectionStart!==undefined){return input.selectionStart}else if(document.selection){if(isFocused(elm[0])){input.focus();var selection=document.selection.createRange();selection.moveStart("character",input.value?-input.value.length:0);return selection.text.length}}return 0}function setCaretPosition(input,pos){if(!input)return 0;if(input.offsetWidth===0||input.offsetHeight===0){return}if(input.setSelectionRange){if(isFocused(elm[0])){input.focus();input.setSelectionRange(pos,pos)}}else if(input.createTextRange){var range=input.createTextRange();range.collapse(true);range.moveEnd("character",pos);range.moveStart("character",pos);range.select()}}function getSelectionLength(input){if(!input)return 0;if(input.selectionStart!==undefined){return input.selectionEnd-input.selectionStart}if(document.selection){return document.selection.createRange().text.length}return 0}}}}}angular.module("gumga.mask",[]).directive("gumgaMask",Mask)})()},{}]},{},[1]);