Skip to content

Commit

Permalink
Merge pull request #19280 from calixteman/issue19274
Browse files Browse the repository at this point in the history
Let be more tolerant with predefined phone number format
  • Loading branch information
calixteman authored Jan 6, 2025
2 parents 3001264 + 3dd8752 commit af5beeb
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 11 deletions.
48 changes: 37 additions & 11 deletions src/scripting_api/aform.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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";
Expand All @@ -572,20 +573,45 @@ 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";
break;
default:
throw new Error("Invalid psf in AFSpecial_Keystroke");
}
const formats = secondFormatStr
? [formatStr, secondFormatStr]
: [formatStr];
for (const format of formats) {
this.#AFSpecial_KeystrokeEx_helper(format, value, false);
if (event.rc) {
return;
}
event.rc = true;
}

const re = /([-()]|\s)+/g;
value = value.replaceAll(re, "");
for (const format of formats) {
this.#AFSpecial_KeystrokeEx_helper(
format.replaceAll(re, ""),
value,
false
);
if (event.rc) {
return;
}
event.rc = true;
}

this.AFSpecial_KeystrokeEx(formatStr);
this.AFSpecial_KeystrokeEx(
((secondFormatStr && value.match(/\d/g)) || []).length > 7
? secondFormatStr
: formatStr
);
}

AFTime_FormatEx(cFormat) {
Expand Down
61 changes: 61 additions & 0 deletions test/unit/scripting_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down

0 comments on commit af5beeb

Please sign in to comment.