Skip to content

Commit

Permalink
Let be more tolerant with predefined phone number format
Browse files Browse the repository at this point in the history
The long US phone number format should be '(999) 999-9999' but the parenthesis
can be omitted or the space replaced with a dash, ...
  • Loading branch information
calixteman committed Jan 3, 2025
1 parent 5905eb1 commit 474ce50
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 11 deletions.
57 changes: 46 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,54 @@ 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");
}
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) {
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 474ce50

Please sign in to comment.