Browse Source

Paste value when all select in inputfield not working good #2603

Robin Herbots 2 years ago
parent
commit
7c99ce5a7b
11 changed files with 2916 additions and 2220 deletions
  1. 1 0
      Changelog.md
  2. 1 1
      bower.json
  3. 1 1
      composer.json
  4. 1556 1221
      dist/inputmask.js
  5. 2 2
      dist/inputmask.min.js
  6. 1281 946
      dist/jquery.inputmask.js
  7. 2 2
      dist/jquery.inputmask.min.js
  8. 1 0
      inputmask-pages/src/assets/Changelog.md
  9. 42 46
      lib/eventhandlers.js
  10. 1 1
      package.json
  11. 28 0
      qunit/tests_paste.js

+ 1 - 0
Changelog.md

@@ -4,6 +4,7 @@
 
 ### Fixed
 
+- Paste value when all select in inputfield not working good #2603
 - Optional parts not working as expected #2710
 - State of alternator not reset with clearIncomplete = true #2712
 - Change Event fired on Blur even if value has not changed #2691

+ 1 - 1
bower.json

@@ -1,6 +1,6 @@
 {
   "name": "inputmask",
-  "version": "5.0.9-beta.16",
+  "version": "5.0.9-beta.17",
   "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.9-beta.16",
+  "version": "5.0.9-beta.17",
   "type": "library",
   "keywords": ["jquery", "plugins", "input", "form", "inputmask", "mask"],
   "homepage": "http://robinherbots.github.io/Inputmask",

File diff suppressed because it is too large
+ 1556 - 1221
dist/inputmask.js


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


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


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


+ 1 - 0
inputmask-pages/src/assets/Changelog.md

@@ -4,6 +4,7 @@
 
 ### Fixed
 
+- Paste value when all select in inputfield not working good #2603
 - Optional parts not working as expected #2710
 - State of alternator not reset with clearIncomplete = true #2712
 - Change Event fired on Blur even if value has not changed #2691

+ 42 - 46
lib/eventhandlers.js

@@ -156,53 +156,49 @@ var EventHandlers = {
             }
         }
     },
-    pasteEvent: function (e) {
-        const inputmask = this.inputmask, opts = inputmask.opts;
-
-        var input = this,
-            inputValue = inputmask._valueGet(true),
-            caretPos = caret.call(inputmask, input),
-            tempValue;
-
-        if (inputmask.isRTL) {
-            tempValue = caretPos.end;
-            caretPos.end = translatePosition.call(inputmask, caretPos.begin);
-            caretPos.begin = translatePosition.call(inputmask, tempValue);
-        }
+    pasteEvent: async function (e) {
+        function handlePaste(inputmask, input, inputValue, pastedValue, onBeforePaste) {
+            var caretPos = caret.call(inputmask, input, undefined, undefined, true);
+
+            var valueBeforeCaret = inputValue.substr(0, caretPos.begin),
+                valueAfterCaret = inputValue.substr(caretPos.end, inputValue.length);
+
+            if (valueBeforeCaret == (inputmask.isRTL ? getBufferTemplate.call(inputmask).slice().reverse() : getBufferTemplate.call(inputmask)).slice(0, caretPos.begin).join("")) valueBeforeCaret = "";
+            if (valueAfterCaret == (inputmask.isRTL ? getBufferTemplate.call(inputmask).slice().reverse() : getBufferTemplate.call(inputmask)).slice(caretPos.end).join("")) valueAfterCaret = "";
+
+            pastedValue = valueBeforeCaret + pastedValue + valueAfterCaret;
+            if (inputmask.isRTL && opts.numericInput !== true) {
+                pastedValue = pastedValue.split("");
+                for (let c of getBufferTemplate.call(inputmask)) {
+                    if (pastedValue[0] === c)
+                        pastedValue.shift();
+                }
+                pastedValue = pastedValue.reverse().join("");
+            }
 
-        var valueBeforeCaret = inputValue.substr(0, caretPos.begin),
-            valueAfterCaret = inputValue.substr(caretPos.end, inputValue.length);
-
-        if (valueBeforeCaret == (inputmask.isRTL ? getBufferTemplate.call(inputmask).slice().reverse() : getBufferTemplate.call(inputmask)).slice(0, caretPos.begin).join("")) valueBeforeCaret = "";
-        if (valueAfterCaret == (inputmask.isRTL ? getBufferTemplate.call(inputmask).slice().reverse() : getBufferTemplate.call(inputmask)).slice(caretPos.end).join("")) valueAfterCaret = "";
-
-        if (window.clipboardData && window.clipboardData.getData) { // IE
-            inputValue = valueBeforeCaret + window.clipboardData.getData("Text") + valueAfterCaret;
-        } else if (e.clipboardData && e.clipboardData.getData) {
-            inputValue = valueBeforeCaret + e.clipboardData.getData("text/plain") + valueAfterCaret;
-        } else {
-            return true;
-        } //allow native paste event as fallback ~ masking will continue by inputfallback
-
-        var pasteValue = inputValue;
-        if (inputmask.isRTL) {
-            pasteValue = pasteValue.split("");
-            for (let c of getBufferTemplate.call(inputmask)) {
-                if (pasteValue[0] === c)
-                    pasteValue.shift();
+            var pasteValue = pastedValue;
+            if (typeof onBeforePaste === "function") {
+                pasteValue = onBeforePaste.call(inputmask, pasteValue, opts);
+                if (pasteValue === false) {
+                    return false;
+                }
+                if (!pasteValue) {
+                    pasteValue = inputValue;
+                }
             }
-            pasteValue = pasteValue.join("");
+            checkVal(input, true, false, pasteValue.toString().split(""), e);
         }
-        if (typeof opts.onBeforePaste === "function") {
-            pasteValue = opts.onBeforePaste.call(inputmask, pasteValue, opts);
-            if (pasteValue === false) {
-                return false;
-            }
-            if (!pasteValue) {
-                pasteValue = inputValue;
-            }
+
+        const input = this, inputmask = this.inputmask, opts = inputmask.opts;
+        var inputValue = inputmask._valueGet(true), pastedValue;
+
+        inputmask.skipInputEvent = true;
+        if (e.clipboardData && e.clipboardData.getData) {
+            pastedValue = e.clipboardData.getData("text/plain");
+        } else if (window.clipboardData && window.clipboardData.getData) { // IE
+            pastedValue = window.clipboardData.getData("Text");
         }
-        checkVal(input, true, false, pasteValue.toString().split(""), e);
+        handlePaste(inputmask, input, inputValue, pastedValue, opts.onBeforePaste);
         e.preventDefault();
     },
     inputFallBackEvent: function (e) { //fallback when keypress is not triggered
@@ -409,7 +405,8 @@ var EventHandlers = {
         //correct clipboardData
         var clipData = inputmask.isRTL ? getBuffer.call(inputmask).slice(pos.end, pos.begin) : getBuffer.call(inputmask).slice(pos.begin, pos.end),
             clipDataText = inputmask.isRTL ? clipData.reverse().join("") : clipData.join("");
-        if (window.navigator && window.navigator.clipboard) window.navigator.clipboard.writeText(clipDataText);
+        if (window.navigator && window.navigator.clipboard)
+            window.navigator.clipboard.writeText(clipDataText);
         else if (window.clipboardData && window.clipboardData.getData) { // IE
             window.clipboardData.setData("Text", clipDataText);
         }
@@ -455,8 +452,7 @@ var EventHandlers = {
 
             nptValue = inputmask._valueGet(true);
             if (inputmask.undoValue !== nptValue) {
-                if (nptValue != "" || (inputmask.undoValue != getBufferTemplate.call(inputmask).join("") || (inputmask.undoValue == getBufferTemplate.call(inputmask).join("") && inputmask.maskset.validPositions.length > 0)))
-                {
+                if (nptValue != "" || (inputmask.undoValue != getBufferTemplate.call(inputmask).join("") || (inputmask.undoValue == getBufferTemplate.call(inputmask).join("") && inputmask.maskset.validPositions.length > 0))) {
                     inputmask.undoValue = nptValue;
                     $input.trigger("change");
                 }

+ 1 - 1
package.json

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

+ 28 - 0
qunit/tests_paste.js

@@ -271,4 +271,32 @@ export default function (qunit, Inputmask) {
 			done();
 		}, 0);
 	});
+
+	qunit.test("decimal select all paste - #2603", function (assert) {
+		var done = assert.async(), $fixture = $("#qunit-fixture");
+		$fixture.append("<input type=\"text\" id=\"testmask\" />");
+		var testmask = document.getElementById("testmask");
+		Inputmask({
+			alias: "decimal",
+			allowMinus: true,
+			autoGroup: true,
+			clearMaskOnLostFocus: false,
+			digits: 2,
+			digitsOptional: false,
+			greedy: false,
+			groupSeparator: "",
+			groupSize: 3,
+			max: "99999.99",
+			min: -99999.99,}).mask(testmask);
+		testmask.focus();
+		$("#testmask").Type("987.23");
+		$.caret(testmask, 0, testmask.value.length);
+		$("#testmask").paste("1234.56");
+
+		setTimeout(function () {
+			$(testmask).trigger("blur");
+			assert.equal(testmask.value, "1234.56", "Result " + testmask.value);
+			done();
+		}, 0);
+	});
 };