Browse Source

fix endless loop in jitoffsets

Robin Herbots 7 years ago
parent
commit
7832efa964

+ 1 - 1
CHANGELOG.md

@@ -2,7 +2,7 @@
 
 ## [5.0.0 - UNRELEASED]
 ### Addition
-- add indian numbering support in numeric alias
+- add indian numbering support in numeric alias (indianns alias)
 
 ### Updates
 - refactor numeric alias (ongoing)

+ 0 - 8
README_numeric.md

@@ -22,14 +22,6 @@ Default: true
 ### enforceDigitsOnBlur 
 Enforces the decimal part when leaving the input field.
 
-### groupSize
-Define the grouping of the integer part.
-Default: 3
-
-### autoGroup
-Enable grouping of the integer part.
-Default: false
-
 ### allowMinus
 Allow to enter -.
 Default: true

+ 1 - 1
bower.json

@@ -1,6 +1,6 @@
 {
   "name": "inputmask",
-  "version": "5.0.0-beta.89",
+  "version": "5.0.0-beta.90",
   "main": [
 	  "./index.js",
     "./css/inputmask.css"

+ 1 - 1
composer.json

@@ -1,7 +1,7 @@
 {
   "name": "robinherbots/inputmask",
   "description": "Inputmask is a javascript library which creates an input mask.  Inputmask can run against vanilla javascript, jQuery and jqlite.",
-  "version": "5.0.0-beta.89",
+  "version": "5.0.0-beta.90",
   "type": "library",
   "keywords": ["jquery", "plugins", "input", "form", "inputmask", "mask"],
   "homepage": "http://robinherbots.github.io/Inputmask",

+ 33 - 19
dist/inputmask.js

@@ -3,7 +3,7 @@
  * https://github.com/RobinHerbots/Inputmask
  * Copyright (c) 2010 - 2018 Robin Herbots
  * Licensed under the MIT license
- * Version: 5.0.0-beta.89
+ * Version: 5.0.0-beta.90
  */
 !function webpackUniversalModuleDefinition(root, factory) {
     if ("object" == typeof exports && "object" == typeof module) module.exports = factory(); else if ("function" == typeof define && define.amd) define([], factory); else {
@@ -588,8 +588,8 @@
                     (!strict || !0 === fromSetValid) && !1 === result && !0 !== validateOnly)) {
                         var currentPosValid = getMaskSet().validPositions[maskPos];
                         if (!currentPosValid || null !== currentPosValid.match.fn || currentPosValid.match.def !== c && c !== opts.skipOptionalPartCharacter) {
-                            if ((opts.insertMode || void 0 === getMaskSet().validPositions[seekNext(maskPos)]) && (!isMask(maskPos, !0) || getMaskSet().jitOffset[maskPos])) if (getMaskSet().jitOffset[maskPos] && void 0 === getMaskSet().validPositions[seekNext(maskPos)]) result = isValid(maskPos + getMaskSet().jitOffset[maskPos], c, strict), 
-                            !1 !== result && (result.caret = maskPos); else for (var nPos = maskPos + 1, snPos = seekNext(maskPos); nPos <= snPos; nPos++) if (result = _isValid(nPos, c, strict), 
+                            if ((opts.insertMode || void 0 === getMaskSet().validPositions[seekNext(maskPos)]) && (getMaskSet().jitOffset[maskPos] && void 0 === getMaskSet().validPositions[seekNext(maskPos)] && (result = isValid(maskPos + getMaskSet().jitOffset[maskPos], c, !0), 
+                            !1 !== result && (result.caret = maskPos)), !isMask(maskPos, !0))) for (var nPos = maskPos + 1, snPos = seekNext(maskPos); nPos <= snPos; nPos++) if (result = _isValid(nPos, c, strict), 
                             !1 !== result) {
                                 result = trackbackPositions(maskPos, void 0 !== result.pos ? result.pos : nPos) || result, 
                                 maskPos = nPos;
@@ -2166,20 +2166,17 @@
             numeric: {
                 mask: function mask(opts) {
                     opts.repeat = 0, opts.groupSeparator === opts.radixPoint && opts.digits && "0" !== opts.digits && ("." === opts.radixPoint ? opts.groupSeparator = "," : "," === opts.radixPoint ? opts.groupSeparator = "." : opts.groupSeparator = ""), 
-                    " " === opts.groupSeparator && (opts.skipOptionalPartCharacter = void 0), opts.autoGroup = opts.autoGroup && "" !== opts.groupSeparator, 
-                    opts.autoGroup ? "string" == typeof opts.groupSize && isFinite(opts.groupSize) && (opts.groupSize = parseInt(opts.groupSize)) : opts.groupSeparator = "", 
-                    1 < opts.placeholder.length && (opts.placeholder = opts.placeholder.charAt(0)), 
+                    " " === opts.groupSeparator && (opts.skipOptionalPartCharacter = void 0), 1 < opts.placeholder.length && (opts.placeholder = opts.placeholder.charAt(0)), 
                     "radixFocus" === opts.positionCaretOnClick && "" === opts.placeholder && (opts.positionCaretOnClick = "lvp"), 
                     !0 === opts.numericInput ? (opts.positionCaretOnClick = "radixFocus" === opts.positionCaretOnClick ? "lvp" : opts.positionCaretOnClick, 
                     opts.digitsOptional = !1, isNaN(opts.digits) && (opts.digits = 2), opts._radixDance = !1) : opts.numericInput = !0;
-                    var mask = "";
+                    var mask = "[+]";
                     if (mask += autoEscape(opts.prefix, opts), "" !== opts.groupSeparator ? mask += "(" + opts.groupSeparator + "999){+|1}" : mask += "9{+}", 
                     void 0 !== opts.digits) {
                         var dq = opts.digits.toString().split(",");
                         isFinite(dq[0]) && dq[1] && isFinite(dq[1]) ? mask += opts.radixPoint + "0{" + opts.digits + "}" : (isNaN(opts.digits) || 0 < parseInt(opts.digits)) && (opts.digitsOptional ? mask += "[" + opts.radixPoint + "0{1," + opts.digits + "}]" : mask += opts.radixPoint + "0{" + opts.digits + "}");
                     }
-                    return mask += autoEscape(opts.suffix, opts), mask += "", opts.greedy = !1, console.log(mask), 
-                    mask;
+                    return mask += autoEscape(opts.suffix, opts), mask += "[-]", opts.greedy = !1, mask;
                 },
                 placeholder: "0",
                 greedy: !1,
@@ -2189,9 +2186,7 @@
                 radixPoint: ".",
                 positionCaretOnClick: "radixFocus",
                 _radixDance: !0,
-                groupSize: 3,
                 groupSeparator: "",
-                autoGroup: !1,
                 allowMinus: !0,
                 negationSymbol: {
                     front: "-",
@@ -2210,6 +2205,16 @@
                 definitions: {
                     0: {
                         validator: "[0-9\uff11-\uff19]"
+                    },
+                    "+": {
+                        validator: function validator(chrs, maskset, pos, strict, opts) {
+                            return console.log("+"), opts.allowMinus && ("-" === chrs || chrs === opts.negationSymbol.front);
+                        }
+                    },
+                    "-": {
+                        validator: function validator(chrs, maskset, pos, strict, opts) {
+                            return console.log("-"), opts.allowMinus && chrs === opts.negationSymbol.back;
+                        }
                     }
                 },
                 preValidation: function preValidation(buffer, pos, c, isSelection, opts, maskset) {
@@ -2298,7 +2303,6 @@
                 groupSeparator: ",",
                 alias: "numeric",
                 placeholder: "0",
-                autoGroup: !0,
                 digits: 2,
                 digitsOptional: !1,
                 clearMaskOnLostFocus: !1
@@ -2317,7 +2321,7 @@
                 digitsOptional: !0,
                 radixPoint: ".",
                 placeholder: "0",
-                autoGroup: !1,
+                groupSeparator: "",
                 min: 0,
                 max: 100,
                 suffix: " %",
@@ -2325,12 +2329,22 @@
             },
             indianns: {
                 alias: "numeric",
-                mask: "(,99){*|1}(,999){1|1}.00",
-                positionCaretOnClick: "radixFocus",
-                _radixDance: !0,
-                radixPoint: ".",
-                numericInput: !0,
-                placeholder: "0"
+                mask: function mask(opts) {
+                    opts.repeat = 0, opts.groupSeparator = ",", opts.radixPoint = ".", "radixFocus" === opts.positionCaretOnClick && "" === opts.placeholder && (opts.positionCaretOnClick = "lvp"), 
+                    !0 === opts.numericInput ? (opts.positionCaretOnClick = "radixFocus" === opts.positionCaretOnClick ? "lvp" : opts.positionCaretOnClick, 
+                    opts.digitsOptional = !1, isNaN(opts.digits) && (opts.digits = 2), opts._radixDance = !1) : opts.numericInput = !0;
+                    var mask = "[+]";
+                    if (mask += autoEscape(opts.prefix, opts), mask += "(" + opts.groupSeparator + "99){*|1}(" + opts.groupSeparator + "999){1|1}", 
+                    void 0 !== opts.digits) {
+                        var dq = opts.digits.toString().split(",");
+                        isFinite(dq[0]) && dq[1] && isFinite(dq[1]) ? mask += opts.radixPoint + "0{" + opts.digits + "}" : (isNaN(opts.digits) || 0 < parseInt(opts.digits)) && (opts.digitsOptional ? mask += "[" + opts.radixPoint + "0{1," + opts.digits + "}]" : mask += opts.radixPoint + "0{" + opts.digits + "}");
+                    }
+                    return mask += autoEscape(opts.suffix, opts), mask += "[-]", opts.greedy = !1, console.log(mask), 
+                    mask;
+                },
+                placeholder: "0",
+                digits: 2,
+                digitsOptional: !1
             }
         }), module.exports = Inputmask;
     } ]);

File diff suppressed because it is too large
+ 2 - 2
dist/inputmask.min.js


+ 33 - 19
dist/jquery.inputmask.js

@@ -3,7 +3,7 @@
  * https://github.com/RobinHerbots/Inputmask
  * Copyright (c) 2010 - 2018 Robin Herbots
  * Licensed under the MIT license
- * Version: 5.0.0-beta.89
+ * Version: 5.0.0-beta.90
  */
 !function webpackUniversalModuleDefinition(root, factory) {
     if ("object" == typeof exports && "object" == typeof module) module.exports = factory(require("jquery")); else if ("function" == typeof define && define.amd) define([ "jquery" ], factory); else {
@@ -592,8 +592,8 @@
                     (!strict || !0 === fromSetValid) && !1 === result && !0 !== validateOnly)) {
                         var currentPosValid = getMaskSet().validPositions[maskPos];
                         if (!currentPosValid || null !== currentPosValid.match.fn || currentPosValid.match.def !== c && c !== opts.skipOptionalPartCharacter) {
-                            if ((opts.insertMode || void 0 === getMaskSet().validPositions[seekNext(maskPos)]) && (!isMask(maskPos, !0) || getMaskSet().jitOffset[maskPos])) if (getMaskSet().jitOffset[maskPos] && void 0 === getMaskSet().validPositions[seekNext(maskPos)]) result = isValid(maskPos + getMaskSet().jitOffset[maskPos], c, strict), 
-                            !1 !== result && (result.caret = maskPos); else for (var nPos = maskPos + 1, snPos = seekNext(maskPos); nPos <= snPos; nPos++) if (result = _isValid(nPos, c, strict), 
+                            if ((opts.insertMode || void 0 === getMaskSet().validPositions[seekNext(maskPos)]) && (getMaskSet().jitOffset[maskPos] && void 0 === getMaskSet().validPositions[seekNext(maskPos)] && (result = isValid(maskPos + getMaskSet().jitOffset[maskPos], c, !0), 
+                            !1 !== result && (result.caret = maskPos)), !isMask(maskPos, !0))) for (var nPos = maskPos + 1, snPos = seekNext(maskPos); nPos <= snPos; nPos++) if (result = _isValid(nPos, c, strict), 
                             !1 !== result) {
                                 result = trackbackPositions(maskPos, void 0 !== result.pos ? result.pos : nPos) || result, 
                                 maskPos = nPos;
@@ -2053,20 +2053,17 @@
             numeric: {
                 mask: function mask(opts) {
                     opts.repeat = 0, opts.groupSeparator === opts.radixPoint && opts.digits && "0" !== opts.digits && ("." === opts.radixPoint ? opts.groupSeparator = "," : "," === opts.radixPoint ? opts.groupSeparator = "." : opts.groupSeparator = ""), 
-                    " " === opts.groupSeparator && (opts.skipOptionalPartCharacter = void 0), opts.autoGroup = opts.autoGroup && "" !== opts.groupSeparator, 
-                    opts.autoGroup ? "string" == typeof opts.groupSize && isFinite(opts.groupSize) && (opts.groupSize = parseInt(opts.groupSize)) : opts.groupSeparator = "", 
-                    1 < opts.placeholder.length && (opts.placeholder = opts.placeholder.charAt(0)), 
+                    " " === opts.groupSeparator && (opts.skipOptionalPartCharacter = void 0), 1 < opts.placeholder.length && (opts.placeholder = opts.placeholder.charAt(0)), 
                     "radixFocus" === opts.positionCaretOnClick && "" === opts.placeholder && (opts.positionCaretOnClick = "lvp"), 
                     !0 === opts.numericInput ? (opts.positionCaretOnClick = "radixFocus" === opts.positionCaretOnClick ? "lvp" : opts.positionCaretOnClick, 
                     opts.digitsOptional = !1, isNaN(opts.digits) && (opts.digits = 2), opts._radixDance = !1) : opts.numericInput = !0;
-                    var mask = "";
+                    var mask = "[+]";
                     if (mask += autoEscape(opts.prefix, opts), "" !== opts.groupSeparator ? mask += "(" + opts.groupSeparator + "999){+|1}" : mask += "9{+}", 
                     void 0 !== opts.digits) {
                         var dq = opts.digits.toString().split(",");
                         isFinite(dq[0]) && dq[1] && isFinite(dq[1]) ? mask += opts.radixPoint + "0{" + opts.digits + "}" : (isNaN(opts.digits) || 0 < parseInt(opts.digits)) && (opts.digitsOptional ? mask += "[" + opts.radixPoint + "0{1," + opts.digits + "}]" : mask += opts.radixPoint + "0{" + opts.digits + "}");
                     }
-                    return mask += autoEscape(opts.suffix, opts), mask += "", opts.greedy = !1, console.log(mask), 
-                    mask;
+                    return mask += autoEscape(opts.suffix, opts), mask += "[-]", opts.greedy = !1, mask;
                 },
                 placeholder: "0",
                 greedy: !1,
@@ -2076,9 +2073,7 @@
                 radixPoint: ".",
                 positionCaretOnClick: "radixFocus",
                 _radixDance: !0,
-                groupSize: 3,
                 groupSeparator: "",
-                autoGroup: !1,
                 allowMinus: !0,
                 negationSymbol: {
                     front: "-",
@@ -2097,6 +2092,16 @@
                 definitions: {
                     0: {
                         validator: "[0-9\uff11-\uff19]"
+                    },
+                    "+": {
+                        validator: function validator(chrs, maskset, pos, strict, opts) {
+                            return console.log("+"), opts.allowMinus && ("-" === chrs || chrs === opts.negationSymbol.front);
+                        }
+                    },
+                    "-": {
+                        validator: function validator(chrs, maskset, pos, strict, opts) {
+                            return console.log("-"), opts.allowMinus && chrs === opts.negationSymbol.back;
+                        }
                     }
                 },
                 preValidation: function preValidation(buffer, pos, c, isSelection, opts, maskset) {
@@ -2185,7 +2190,6 @@
                 groupSeparator: ",",
                 alias: "numeric",
                 placeholder: "0",
-                autoGroup: !0,
                 digits: 2,
                 digitsOptional: !1,
                 clearMaskOnLostFocus: !1
@@ -2204,7 +2208,7 @@
                 digitsOptional: !0,
                 radixPoint: ".",
                 placeholder: "0",
-                autoGroup: !1,
+                groupSeparator: "",
                 min: 0,
                 max: 100,
                 suffix: " %",
@@ -2212,12 +2216,22 @@
             },
             indianns: {
                 alias: "numeric",
-                mask: "(,99){*|1}(,999){1|1}.00",
-                positionCaretOnClick: "radixFocus",
-                _radixDance: !0,
-                radixPoint: ".",
-                numericInput: !0,
-                placeholder: "0"
+                mask: function mask(opts) {
+                    opts.repeat = 0, opts.groupSeparator = ",", opts.radixPoint = ".", "radixFocus" === opts.positionCaretOnClick && "" === opts.placeholder && (opts.positionCaretOnClick = "lvp"), 
+                    !0 === opts.numericInput ? (opts.positionCaretOnClick = "radixFocus" === opts.positionCaretOnClick ? "lvp" : opts.positionCaretOnClick, 
+                    opts.digitsOptional = !1, isNaN(opts.digits) && (opts.digits = 2), opts._radixDance = !1) : opts.numericInput = !0;
+                    var mask = "[+]";
+                    if (mask += autoEscape(opts.prefix, opts), mask += "(" + opts.groupSeparator + "99){*|1}(" + opts.groupSeparator + "999){1|1}", 
+                    void 0 !== opts.digits) {
+                        var dq = opts.digits.toString().split(",");
+                        isFinite(dq[0]) && dq[1] && isFinite(dq[1]) ? mask += opts.radixPoint + "0{" + opts.digits + "}" : (isNaN(opts.digits) || 0 < parseInt(opts.digits)) && (opts.digitsOptional ? mask += "[" + opts.radixPoint + "0{1," + opts.digits + "}]" : mask += opts.radixPoint + "0{" + opts.digits + "}");
+                    }
+                    return mask += autoEscape(opts.suffix, opts), mask += "[-]", opts.greedy = !1, console.log(mask), 
+                    mask;
+                },
+                placeholder: "0",
+                digits: 2,
+                digitsOptional: !1
             }
         }), module.exports = Inputmask;
     }, function(module, exports, __webpack_require__) {

File diff suppressed because it is too large
+ 2 - 2
dist/jquery.inputmask.min.js


+ 59 - 17
lib/extensions/inputmask.numeric.extensions.js

@@ -55,10 +55,6 @@ Inputmask.extendAliases({
             if (opts.groupSeparator === " ") {
                 opts.skipOptionalPartCharacter = undefined;
             }
-            opts.autoGroup = opts.autoGroup && opts.groupSeparator !== "";
-            if (opts.autoGroup) {
-                if (typeof opts.groupSize == "string" && isFinite(opts.groupSize)) opts.groupSize = parseInt(opts.groupSize);
-            } else opts.groupSeparator = "";
 
             //enforce placeholder to single
             if (opts.placeholder.length > 1) {
@@ -76,7 +72,7 @@ Inputmask.extendAliases({
                 opts._radixDance = false;
             } else opts.numericInput = true;
 
-            var mask = "";
+            var mask = "[+]";
             mask += autoEscape(opts.prefix, opts);
             if (opts.groupSeparator !== "")
                 mask += "(" + opts.groupSeparator + "999){+|1}";
@@ -92,12 +88,12 @@ Inputmask.extendAliases({
                 }
             }
             mask += autoEscape(opts.suffix, opts);
-            mask += "";
+            mask += "[-]";
 
             opts.greedy = false; //enforce greedy false
 
 
-            console.log(mask);
+            // console.log(mask);
             return mask;
         },
         placeholder: "0",
@@ -108,9 +104,7 @@ Inputmask.extendAliases({
         radixPoint: ".",
         positionCaretOnClick: "radixFocus",
         _radixDance: true,
-        groupSize: 3,
         groupSeparator: "",
-        autoGroup: false,
         allowMinus: true,
         negationSymbol: {
             front: "-", //"("
@@ -129,6 +123,19 @@ Inputmask.extendAliases({
         definitions: {
             "0": {
                 validator: "[0-9\uFF11-\uFF19]"
+            },
+            "+": {
+                validator: function (chrs, maskset, pos, strict, opts) {
+                    console.log("+");
+                    return (opts.allowMinus && (chrs === "-" || chrs === opts.negationSymbol.front));
+
+                }
+            },
+            "-": {
+                validator: function (chrs, maskset, pos, strict, opts) {
+                    console.log("-");
+                    return (opts.allowMinus && chrs === opts.negationSymbol.back);
+                }
             }
         },
         preValidation: function (buffer, pos, c, isSelection, opts, maskset) {
@@ -281,7 +288,6 @@ Inputmask.extendAliases({
         groupSeparator: ",",
         alias: "numeric",
         placeholder: "0",
-        autoGroup: true,
         digits: 2,
         digitsOptional: false,
         clearMaskOnLostFocus: false
@@ -300,7 +306,7 @@ Inputmask.extendAliases({
         digitsOptional: true,
         radixPoint: ".",
         placeholder: "0",
-        autoGroup: false,
+        groupSeparator: "",
         min: 0,
         max: 100,
         suffix: " %",
@@ -308,12 +314,48 @@ Inputmask.extendAliases({
     },
     "indianns": { //indian numbering system
         alias: "numeric",
-        mask: "(,99){*|1}(,999){1|1}.00", //TODO FIXME generate mask
-        positionCaretOnClick: "radixFocus",
-        _radixDance: true,
-        radixPoint: ".",
-        numericInput: true,
-        placeholder: "0"
+        mask: function (opts) {
+            opts.repeat = 0;
+            opts.groupSeparator = ",";
+            opts.radixPoint = ".";
+            //only allow radixfocus when placeholder = 0
+            if (opts.positionCaretOnClick === "radixFocus" && opts.placeholder === "") {
+                opts.positionCaretOnClick = "lvp";
+            }
+
+            if (opts.numericInput === true) { //finance people input style
+                opts.positionCaretOnClick = opts.positionCaretOnClick === "radixFocus" ? "lvp" : opts.positionCaretOnClick;
+                opts.digitsOptional = false;
+                if (isNaN(opts.digits)) opts.digits = 2;
+                opts._radixDance = false;
+            } else opts.numericInput = true;
+
+            var mask = "[+]";
+            mask += autoEscape(opts.prefix, opts);
+            mask += "(" + opts.groupSeparator + "99){*|1}(" + opts.groupSeparator + "999){1|1}";
+
+            if (opts.digits !== undefined) {
+                var dq = opts.digits.toString().split(",");
+                if (isFinite(dq[0]) && dq[1] && isFinite(dq[1])) {
+                    mask += opts.radixPoint + "0{" + opts.digits + "}";
+                } else if (isNaN(opts.digits) || parseInt(opts.digits) > 0) {
+                    if (opts.digitsOptional) {
+                        mask += "[" + opts.radixPoint + "0{1," + opts.digits + "}]";
+                    } else mask += opts.radixPoint + "0{" + opts.digits + "}";
+                }
+            }
+            mask += autoEscape(opts.suffix, opts);
+            mask += "[-]";
+
+            opts.greedy = false; //enforce greedy false
+
+
+            console.log(mask);
+            return mask;
+        },
+        placeholder: "0",
+        digits: 2,
+        digitsOptional: false
     }
 });
 module.exports = Inputmask;

+ 5 - 3
lib/inputmask.js

@@ -1597,12 +1597,13 @@ function maskScope(actionObj, maskset, opts) {
                             "caret": seekNext(maskPos)
                         };
                     } else {
-                        if ((opts.insertMode || getMaskSet().validPositions[seekNext(maskPos)] === undefined) && (!isMask(maskPos, true) || getMaskSet().jitOffset[maskPos])) { //does the input match on a further position?
+                        if (opts.insertMode || getMaskSet().validPositions[seekNext(maskPos)] === undefined) { //does the input match on a further position?
                             if (getMaskSet().jitOffset[maskPos] && getMaskSet().validPositions[seekNext(maskPos)] === undefined) {
-                                result = isValid(maskPos + getMaskSet().jitOffset[maskPos], c, strict);
+                                result = isValid(maskPos + getMaskSet().jitOffset[maskPos], c, true);
                                 if (result !== false)
                                     result.caret = maskPos;
-                            } else
+                            }
+                            if (!isMask(maskPos, true)) {
                                 for (var nPos = maskPos + 1, snPos = seekNext(maskPos); nPos <= snPos; nPos++) {
                                     // if (!isMask(nPos, true)) {
                                     // 	continue;
@@ -1614,6 +1615,7 @@ function maskScope(actionObj, maskset, opts) {
                                         break;
                                     }
                                 }
+                            }
                         }
                     }
                 }

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "inputmask",
-  "version": "5.0.0-beta.89",
+  "version": "5.0.0-beta.90",
   "description": "Inputmask is a javascript library which creates an input mask.  Inputmask can run against vanilla javascript, jQuery and jqlite.",
   "main": "index.js",
   "files": [