diff --git a/src/scripting_api/aform.js b/src/scripting_api/aform.js index 78a9a312df26c..545cfbe25ef20 100644 --- a/src/scripting_api/aform.js +++ b/src/scripting_api/aform.js @@ -465,22 +465,22 @@ class AForm { // specific to the format because the user could enter 1234567 when the // format is 999-9999. const simplifiedFormatStr = cMask.replaceAll(/[^9AOX]/g, ""); - this.#AFSpecial_KeystrokeEx_helper(simplifiedFormatStr, false); + this.#AFSpecial_KeystrokeEx_helper(simplifiedFormatStr, null, false); if (event.rc) { return; } event.rc = true; - this.#AFSpecial_KeystrokeEx_helper(cMask, true); + this.#AFSpecial_KeystrokeEx_helper(cMask, null, true); } - #AFSpecial_KeystrokeEx_helper(cMask, warn) { + #AFSpecial_KeystrokeEx_helper(cMask, value, warn) { if (!cMask) { return; } const event = globalThis.event; - const value = this.AFMergeChange(event); + value ||= this.AFMergeChange(event); if (!value) { return; } @@ -563,7 +563,8 @@ class AForm { const event = globalThis.event; psf = this.AFMakeNumber(psf); - let formatStr; + let value = this.AFMergeChange(event); + let formatStr, secondFormatStr; switch (psf) { case 0: formatStr = "99999"; @@ -572,11 +573,8 @@ class AForm { formatStr = "99999-9999"; break; case 2: - const value = this.AFMergeChange(event); - formatStr = - value.startsWith("(") || (value.length > 7 && /^\p{N}+$/.test(value)) - ? "(999) 999-9999" - : "999-9999"; + formatStr = "999-9999"; + secondFormatStr = "(999) 999-9999"; break; case 3: formatStr = "999-99-9999"; @@ -584,8 +582,45 @@ class AForm { default: throw new Error("Invalid psf in AFSpecial_Keystroke"); } + this.#AFSpecial_KeystrokeEx_helper(formatStr, value, false); + if (event.rc) { + return; + } + event.rc = true; + if (secondFormatStr) { + this.#AFSpecial_KeystrokeEx_helper(secondFormatStr, value, false); + if (event.rc) { + return; + } + event.rc = true; + } + + const re = /([-()]|\s)+/g; + value = value.replaceAll(re, ""); + this.#AFSpecial_KeystrokeEx_helper( + formatStr.replaceAll(re, ""), + value, + false + ); + if (event.rc) { + return; + } + + event.rc = true; + if (secondFormatStr) { + this.#AFSpecial_KeystrokeEx_helper( + secondFormatStr.replaceAll(re, ""), + value, + false + ); + if (event.rc) { + return; + } + event.rc = true; + } - this.AFSpecial_KeystrokeEx(formatStr); + const nums = (value.match(/\d/g) || []).length; + this.AFSpecial_KeystrokeEx(nums <= 7 ? formatStr : secondFormatStr); } AFTime_FormatEx(cFormat) { diff --git a/test/unit/scripting_spec.js b/test/unit/scripting_spec.js index 6246120df4169..d570908662a90 100644 --- a/test/unit/scripting_spec.js +++ b/test/unit/scripting_spec.js @@ -1685,6 +1685,67 @@ describe("Scripting", function () { send_queue.delete(refId); }); + it("should validate a US phone number with digits and dashes (long) on a keystroke event", async () => { + const refId = getId(); + const data = { + objects: { + field: [ + { + id: refId, + value: "", + actions: { + Keystroke: [`AFSpecial_Keystroke(2);`], + }, + type: "text", + }, + ], + }, + appInfo: { language: "en-US", platform: "Linux x86_64" }, + calculationOrder: [], + dispatchEventName: "_dispatchMe", + }; + sandbox.createSandbox(data); + + let value = ""; + const changes = "123-456-7890"; + let i = 0; + + for (; i < changes.length; i++) { + const change = changes.charAt(i); + await sandbox.dispatchEventInSandbox({ + id: refId, + value, + change, + name: "Keystroke", + willCommit: false, + selStart: i, + selEnd: i, + }); + expect(send_queue.has(refId)).toEqual(true); + send_queue.delete(refId); + value += change; + } + + await sandbox.dispatchEventInSandbox({ + id: refId, + value, + change: "A", + name: "Keystroke", + willCommit: false, + selStart: i, + selEnd: i, + }); + expect(send_queue.has(refId)).toEqual(true); + expect(send_queue.get(refId)).toEqual({ + id: refId, + siblings: null, + value, + selRange: [i, i], + }); + + send_queue.delete(refId); + }); + it("should validate a US phone number (short) on a keystroke event", async () => { const refId = getId(); const data = {