JS -- Add few missing constants in global scope

- these constants are available in pdfium implementation too
 - fix error code in aform.js
This commit is contained in:
Calixte Denizet 2021-01-11 17:19:24 +01:00
parent 631bada0df
commit 8e6bec6e2e
4 changed files with 138 additions and 20 deletions

View File

@ -13,13 +13,14 @@
* limitations under the License.
*/
/* global color */
import { GlobalConstants } from "./constants.js";
class AForm {
constructor(document, app, util) {
constructor(document, app, util, color) {
this._document = document;
this._app = app;
this._util = util;
this._color = color;
this._dateFormats = [
"m/d",
"m/d/yy",
@ -47,6 +48,10 @@ class AForm {
);
}
_mkTargetName(event) {
return event.target ? `[ ${event.target.name} ]` : "";
}
_parseDate(cFormat, cDate) {
const ddate = Date.parse(cDate);
if (isNaN(ddate)) {
@ -171,7 +176,7 @@ class AForm {
}
if (negStyle === 1 || negStyle === 3) {
event.target.textColor = sign === 1 ? color.black : color.red;
event.target.textColor = sign === 1 ? this._color.black : this._color.red;
}
if ((negStyle !== 0 || bCurrencyPrepend) && sign === -1) {
@ -212,14 +217,17 @@ class AForm {
if (!pattern.test(value)) {
if (event.willCommit) {
if (event.target) {
this._app.alert(`Invalid number in [ ${event.target.name} ]`);
} else {
this._app.alert(`Invalid number`);
}
const err = `${GlobalConstants.IDS_INVALID_VALUE} ${this._mkTargetName(
event
)}`;
this._app.alert(err);
}
event.rc = false;
}
if (event.willCommit && sepStyle > 1) {
event.value = parseFloat(value.replace(",", "."));
}
}
AFPercent_Format(nDec, sepStyle, percentPrepend = false) {
@ -289,13 +297,18 @@ class AForm {
return;
}
const value = event.value;
const value = this.AFMergeChange(event);
if (!value) {
return;
}
if (this._parseDate(cFormat, value) === null) {
this._app.alert("Invalid date");
const invalid = GlobalConstants.IDS_INVALID_DATE;
const invalid2 = GlobalConstants.IDS_INVALID_DATE2;
const err = `${invalid} ${this._mkTargetName(
event
)}${invalid2}${cFormat}`;
this._app.alert(err);
event.rc = false;
}
}
@ -337,14 +350,18 @@ class AForm {
let err = "";
if (bGreaterThan && bLessThan) {
if (value < nGreaterThan || value > nLessThan) {
err = `${event.value} is not between ${nGreaterThan} and ${nLessThan}`;
err = this._util.printf(
GlobalConstants.IDS_GT_AND_LT,
nGreaterThan,
nLessThan
);
}
} else if (bGreaterThan) {
if (value < nGreaterThan) {
err = `${event.value} is not greater or equal than ${nGreaterThan}`;
err = this._util.printf(GlobalConstants.IDS_GREATER_THAN, nGreaterThan);
}
} else if (value > nLessThan) {
err = `${event.value} is not less or equal than ${nLessThan}`;
err = this._util.printf(GlobalConstants.IDS_LESS_THAN, nLessThan);
}
if (err) {
this._app.alert(err);
@ -492,24 +509,27 @@ class AForm {
return;
}
const err = `${GlobalConstants.IDS_INVALID_VALUE} = "${cMask}"`;
if (value.length > cMask.length) {
this._app.alert("Value is too long");
this._app.alert(err);
event.rc = false;
return;
}
if (event.willCommit) {
if (value.length < cMask.length) {
this._app.alert("Value is too short");
this._app.alert(err);
event.rc = false;
return;
}
if (!_checkValidity(value, cMask)) {
this._app.alert("Value doesn't fit the specified format");
this._app.alert(err);
event.rc = false;
return;
}
event.value += cMask.subString(value.length);
return;
}
@ -518,6 +538,7 @@ class AForm {
}
if (!_checkValidity(value, cMask)) {
this._app.alert(err);
event.rc = false;
}
}

View File

@ -122,11 +122,82 @@ const ZoomType = Object.freeze({
refW: "ReflowWidth",
});
const GlobalConstants = Object.freeze({
IDS_GREATER_THAN: "Invalid value: must be greater than or equal to % s.",
IDS_GT_AND_LT:
"Invalid value: must be greater than or equal to % s " +
"and less than or equal to % s.",
IDS_LESS_THAN: "Invalid value: must be less than or equal to % s.",
IDS_INVALID_MONTH: "** Invalid **",
IDS_INVALID_DATE:
"Invalid date / time: please ensure that the date / time exists.Field",
IDS_INVALID_DATE2: " should match format ",
IDS_INVALID_VALUE: "The value entered does not match the format of the field",
IDS_AM: "am",
IDS_PM: "pm",
IDS_MONTH_INFO:
"January[1] February[2] March[3] April[4] May[5] " +
"June[6] July[7] August[8] September[9] October[10] " +
"November[11] December[12] Sept[9] Jan[1] Feb[2] Mar[3] " +
"Apr[4] Jun[6] Jul[7] Aug[8] Sep[9] Oct[10] Nov[11] Dec[12]",
IDS_STARTUP_CONSOLE_MSG: "** ^ _ ^ **",
RE_NUMBER_ENTRY_DOT_SEP: ["[+-]?\\d*\\.?\\d*"],
RE_NUMBER_COMMIT_DOT_SEP: [
// -1.0 or -1
"[+-]?\\d+(\\.\\d+)?",
// -.1
"[+-]?\\.\\d+",
// -1.
"[+-]?\\d+\\.",
],
RE_NUMBER_ENTRY_COMMA_SEP: ["[+-]?\\d*,?\\d*"],
RE_NUMBER_COMMIT_COMMA_SEP: [
// -1,0 or -1
"[+-]?\\d+([.,]\\d+)?",
// -,1
"[+-]?[.,]\\d+",
// -1,
"[+-]?\\d+[.,]",
],
RE_ZIP_ENTRY: ["\\d{0,5}"],
RE_ZIP_COMMIT: ["\\d{5}"],
RE_ZIP4_ENTRY: ["\\d{0,5}(\\.|[- ])?\\d{0,4}"],
RE_ZIP4_COMMIT: ["\\d{5}(\\.|[- ])?\\d{4}"],
RE_PHONE_ENTRY: [
// 555-1234 or 408 555-1234
"\\d{0,3}(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}",
// (408
"\\(\\d{0,3}",
// (408) 555-1234
// (allow the addition of parens as an afterthought)
"\\(\\d{0,3}\\)(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}",
// (408 555-1234
"\\(\\d{0,3}(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}",
// 408) 555-1234
"\\d{0,3}\\)(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}",
// international
"011(\\.|[- \\d])*",
],
RE_PHONE_COMMIT: [
// 555-1234
"\\d{3}(\\.|[- ])?\\d{4}",
// 408 555-1234
"\\d{3}(\\.|[- ])?\\d{3}(\\.|[- ])?\\d{4}",
// (408) 555-1234
"\\(\\d{3}\\)(\\.|[- ])?\\d{3}(\\.|[- ])?\\d{4}",
// international
"011(\\.|[- \\d])*",
],
RE_SSN_ENTRY: ["\\d{0,3}(\\.|[- ])?\\d{0,2}(\\.|[- ])?\\d{0,4}"],
RE_SSN_COMMIT: ["\\d{3}(\\.|[- ])?\\d{2}(\\.|[- ])?\\d{4}"],
});
export {
Border,
Cursor,
Display,
Font,
GlobalConstants,
Highlight,
Position,
ScaleHow,

View File

@ -18,6 +18,7 @@ import {
Cursor,
Display,
Font,
GlobalConstants,
Highlight,
Position,
ScaleHow,
@ -66,7 +67,6 @@ function initSandbox(params) {
});
const util = new Util({ externalCall });
const aform = new AForm(doc, app, util);
if (data.objects) {
for (const [name, objs] of Object.entries(data.objects)) {
@ -94,10 +94,12 @@ function initSandbox(params) {
}
}
const color = new Color();
globalThis.event = null;
globalThis.global = Object.create(null);
globalThis.app = new Proxy(app, proxyHandler);
globalThis.color = new Proxy(new Color(), proxyHandler);
globalThis.color = new Proxy(color, proxyHandler);
globalThis.console = new Proxy(new Console({ send }), proxyHandler);
globalThis.util = new Proxy(util, proxyHandler);
globalThis.border = Border;
@ -112,12 +114,34 @@ function initSandbox(params) {
globalThis.trans = Trans;
globalThis.zoomtype = ZoomType;
// AF... functions
const aform = new AForm(doc, app, util, color);
for (const name of Object.getOwnPropertyNames(AForm.prototype)) {
if (name !== "constructor" && !name.startsWith("_")) {
globalThis[name] = aform[name].bind(aform);
}
}
// Add global constants such as IDS_GREATER_THAN or RE_NUMBER_ENTRY_DOT_SEP
for (const [name, value] of Object.entries(GlobalConstants)) {
Object.defineProperty(globalThis, name, {
value,
writable: false,
});
}
// Color functions
Object.defineProperties(globalThis, {
ColorConvert: {
value: color.convert.bind(color),
writable: true,
},
ColorEqual: {
value: color.equal.bind(color),
writable: true,
},
});
// The doc properties must live in the global scope too
const properties = Object.create(null);
for (const name of Object.getOwnPropertyNames(Doc.prototype)) {

View File

@ -858,7 +858,8 @@ describe("Scripting", function () {
expect(send_queue.has("alert")).toEqual(true);
expect(send_queue.get("alert")).toEqual({
command: "alert",
value: "Invalid number in [ MyField ]",
value:
"The value entered does not match the format of the field [ MyField ]",
});
done();
} catch (ex) {
@ -1052,7 +1053,8 @@ describe("Scripting", function () {
expect(send_queue.has("alert")).toEqual(true);
expect(send_queue.get("alert")).toEqual({
command: "alert",
value: "12 is not between 123 and 456",
value:
"Invalid value: must be greater than or equal to 123 and less than or equal to 456.",
});
done();