In AEM forms designer, I have a two subforms. Each subform has text fields, a signature field and an email submit button. Some text fields are mandatory in each subform.
Clicking on the email submit button of one subform should check whether mandatory fields in that specific subform have been filled. I have a validation script in a Script Object called 'validationUtils'. The path to this Script object is: form1.#variables[0].validationUtils.
The validation method in this Script Object is this:
// method to validate if mandatory fields in the form element or section are filled. It returns true or false with colouring
function validateMandatoryFields(fieldPaths, subformContext) {
var allFilled = true;
for (var i = 0; i < fieldPaths.length; i++) {
var field = xfa.resolveNode(fieldPaths[i]);
if (field === null || field.rawValue === null || field.rawValue === "") {
allFilled = false; // Mandatory field is not filled
field.border.edge.color.value = "255,0,0"; // Set red border color
field.border.edge.thickness = "0.5pt"; // Set border thickness
} else {
field.border.edge.color.value = "0,0,0"; // Reset border color to black
field.border.edge.thickness = "0.5pt"; // Set border thickness
}
} return allFilled; // All mandatory fields are filled
}
I call this function in the preSubmit event of the email submit button in each subforms
Subform1 path: form1.Page2.Sign_and_submit.EmailSubmitButton::preSubmit:form - (JavaScript, client)
// Define mandatory field paths for subform 1
var mandatoryFieldPathsSubform1 = [
"xfa.form.form1.Page1.Credentials.member_name",
"xfa.form.form1.Page1.Credentials.member_email",
"xfa.form.form1.Page1.Credentials.member_id",
"xfa.form.form1.Page1.Goals.Goal_table.Row1.DropDownList1",
"xfa.form.form1.Page1.Goals.Goal_table.Row1.Description1",
"xfa.form.form1.Page1.Goals.Goal_table.Row1.Measure1",
"xfa.form.form1.Page1.Goals.Goal_table.Row1.Start_date",
"xfa.form.form1.Page1.Goals.Goal_table.Row1.Due_date"
];
var validatedSubform1 = validationUtils.validateMandatoryFields(mandatoryFieldPathsSubform1, "subform1");
var signatureFieldSubform1 = xfa.resolveNode("form1.Page2.Sign_and_submit.SignatureField1");
if (!validatedSubform1) {
xfa.host.messageBox("At least one of the fields was empty. Please fill in the required fields (highlighted) before continuing.", "Validation Error", 3);
signatureFieldSubform1.access = "readOnly";
xfa.event.cancelAction = true;
} else {
signatureFieldSubform1.access = "open";
var oStateSubform1 = event.target.getField("form1.Page2.Sign_and_submit.SignatureField1").signatureValidate();
if (oStateSubform1 != 4) {
xfa.host.messageBox("Please sign the form before submitting.", "Validation Error", 3);
xfa.event.cancelAction = true;
} else {
xfa.event.cancelAction = false;
}
}
and for subform2: form1.Page2.Agree_and_resolve.PartTwo.EmailSubmitButton::preSubmit:form - (JavaScript, client)
//check if all mandatory fields in the start cycle section of the form are filled
var mandatoryFieldPathsSubform2 = [
"xfa.form.form1.Page2.Agree_and_resolve.PartTwo.destination_zip",
"xfa.form.form1.Page2.Agree_and_resolve.PartTwo.destination_id",
"xfa.form.form1.Page2.Agree_and_resolve.PartTwo.destination_timezone"
];
var validatedSubform2 = validationUtils.validateMandatoryFields(mandatoryFieldPathsSubform2, "subform2");
var signatureFieldSubform2 = xfa.resolveNode("form1.Page2.Agree_and_resolve.PartTwo.SignatureField2");
if (!validatedSubform2) {
xfa.host.messageBox("At least one of the fields was empty. Please fill in the required fields (highlighted) before continuing.", "Validation Error", 3);
signatureFieldSubform2.access = "readOnly";
xfa.event.cancelAction = true;
} else {
signatureFieldSubform2.access = "open";
var oStateSubform2 = event.target.getField("form1.Page2.Agree_and_resolve.PartTwo.SignatureField2").signatureValidate();
if (oStateSubform2 != 4) {
xfa.host.messageBox("Please sign the form before submitting.", "Validation Error", 3);
xfa.event.cancelAction = true;
} else {
xfa.event.cancelAction = false;
}
}
The relevant fields are checked, but right now clicking on one email submit button in one subform checks all fields in both subforms. What did I miss?