diff --git a/src/node_modules/mask-factory.js b/src/node_modules/mask-factory.js index 15e318d6..7e75ca4f 100644 --- a/src/node_modules/mask-factory.js +++ b/src/node_modules/mask-factory.js @@ -1,7 +1,35 @@ 'use strict'; module.exports = function maskFactory(maskDefinition) { - return function MaskDirective() { + + function MaskDirective($timeout) { + var caret = { + set : function caretSet(element, pos){ + if(element.setSelectionRange) { + element.focus(); + element.setSelectionRange(pos,pos); + } else if (element.createTextRange) { + var range = element.createTextRange(); + range.collapse(true); + range.moveEnd('character', pos); + range.moveStart('character', pos); + range.select(); + } + }, + get : function caretGet(element) { + var iCaretPos = 0; + if (document.selection) { + element.focus(); + var oSel = document.selection.createRange(); + oSel.moveStart('character', -element.value.length); + iCaretPos = oSel.text.length; + } else if (element.selectionStart || element.selectionStart === '0') { + iCaretPos = element.selectionStart; + } + return iCaretPos; + } + }; + return { restrict: 'A', require: 'ngModel', @@ -16,24 +44,38 @@ module.exports = function maskFactory(maskDefinition) { }); ctrl.$parsers.push(function parser(value) { - if (ctrl.$isEmpty(value)) { - return value; - } - var cleanValue = maskDefinition.clearValue(value); - var formattedValue = maskDefinition.format(cleanValue); + $timeout(function(){ - if (ctrl.$viewValue !== formattedValue) { - ctrl.$setViewValue(formattedValue); - ctrl.$render(); - } + if (ctrl.$isEmpty(value)) { + return value; + } - if (angular.isUndefined(maskDefinition.getModelValue)) { - return cleanValue; - } + var cleanValue = maskDefinition.clearValue(value); + var formattedValue = maskDefinition.format(cleanValue); + + var currentCaretPosition = caret.get(element[0]), + lengthBefore = ctrl.$viewValue.length, + lengthAfter = 0; + + if (ctrl.$viewValue !== formattedValue) { + ctrl.$setViewValue(formattedValue); + ctrl.$render(); + + lengthAfter = ctrl.$viewValue.length; + } + + var caretFormatDiffer = (lengthAfter - lengthBefore) < 0 ? 0 : lengthAfter - lengthBefore; - var actualModelType = typeof ctrl.$modelValue; - return maskDefinition.getModelValue(formattedValue, actualModelType); + caret.set(element[0], currentCaretPosition + caretFormatDiffer); + + if (angular.isUndefined(maskDefinition.getModelValue)) { + return cleanValue; + } + + var actualModelType = typeof ctrl.$modelValue; + return maskDefinition.getModelValue(formattedValue, actualModelType); + },0); }); angular.forEach(maskDefinition.validations, function(validatorFn, validationErrorKey) { @@ -44,4 +86,8 @@ module.exports = function maskFactory(maskDefinition) { } }; }; -}; + + MaskDirective.$injector = ['$timeout']; + + return MaskDirective +}; \ No newline at end of file