From b627e4fbdc04b02e0aad7ed70c1b8d5c3089aff0 Mon Sep 17 00:00:00 2001 From: julio Date: Sat, 11 Feb 2017 17:24:45 -0200 Subject: [PATCH 1/2] Mascara CPF Android 4.2 #228 --- src/node_modules/mask-factory.js | 80 +++++++++++++++++++++++++------- 1 file changed, 64 insertions(+), 16 deletions(-) diff --git a/src/node_modules/mask-factory.js b/src/node_modules/mask-factory.js index 15e318d6..4c17e501 100644 --- a/src/node_modules/mask-factory.js +++ b/src/node_modules/mask-factory.js @@ -1,7 +1,37 @@ 'use strict'; module.exports = function maskFactory(maskDefinition) { - return function MaskDirective() { + + MaskDirective.$injector = ['$timeout']; + + 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 +46,40 @@ 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 actualModelType = typeof ctrl.$modelValue; - return maskDefinition.getModelValue(formattedValue, actualModelType); + var caretFormatDiffer = (lengthAfter - lengthBefore) < 0 ? + 0 : + lengthAfter - lengthBefore; + + 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 +90,6 @@ module.exports = function maskFactory(maskDefinition) { } }; }; -}; + + return MaskDirective +}; \ No newline at end of file From 7371182fa83b6bbedbdbe1a4b236a4ec36f9e4b0 Mon Sep 17 00:00:00 2001 From: julio Date: Sat, 11 Feb 2017 20:04:49 -0200 Subject: [PATCH 2/2] caret position correction --- src/node_modules/mask-factory.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/node_modules/mask-factory.js b/src/node_modules/mask-factory.js index 4c17e501..7e75ca4f 100644 --- a/src/node_modules/mask-factory.js +++ b/src/node_modules/mask-factory.js @@ -2,8 +2,6 @@ module.exports = function maskFactory(maskDefinition) { - MaskDirective.$injector = ['$timeout']; - function MaskDirective($timeout) { var caret = { set : function caretSet(element, pos){ @@ -25,7 +23,7 @@ module.exports = function maskFactory(maskDefinition) { var oSel = document.selection.createRange(); oSel.moveStart('character', -element.value.length); iCaretPos = oSel.text.length; - } else if (element.selectionStart || element.selectionStart == '0') { + } else if (element.selectionStart || element.selectionStart === '0') { iCaretPos = element.selectionStart; } return iCaretPos; @@ -67,9 +65,7 @@ module.exports = function maskFactory(maskDefinition) { lengthAfter = ctrl.$viewValue.length; } - var caretFormatDiffer = (lengthAfter - lengthBefore) < 0 ? - 0 : - lengthAfter - lengthBefore; + var caretFormatDiffer = (lengthAfter - lengthBefore) < 0 ? 0 : lengthAfter - lengthBefore; caret.set(element[0], currentCaretPosition + caretFormatDiffer); @@ -91,5 +87,7 @@ module.exports = function maskFactory(maskDefinition) { }; }; + MaskDirective.$injector = ['$timeout']; + return MaskDirective }; \ No newline at end of file