pengz
pengz

Reputation: 2471

ServiceNow Script onSubmit not working properly

I am using ServiceNow platform. I am writing a Catalog Client Script to validate form fields on a Catalog Item record producer.

I am stopping the submission of the form by using return false if validation does not pass inspection.

I have tested this by entering invalid data (group name with special characters or a group name that exists already) and it catches the issue and shows the error message. I can enter invalid data and submit multiple times and it works.

However, the issue:

The script seems to "stop" running after I first enter invalid data and submit, and then I correct the data press the submit button again. It just sits there and does nothing. I have to reload the form again which is not desirable.

What is going on with the control flow? How can I cleanly stop the form if the data is invalid, but then allow the user to correct the mistake and press the submit button again to proceed?

I can tell that the script doesn't run again because I have an alert box popping up that says "script run" every time the script runs. It just stops running at some point after submitting invalid data first and then entering some valid data and pressing submit.

function onSubmit() {
    g_form.hideAllFieldMsgs('error');
    alert("script run");

    //Group Name contain letters numbers and dashes only
    var group_name = g_form.getValue('u_group_name');
    // Group name regular expression
    var regGrpName = /^([A-Za-z0-9\-]+)$/;
    // Check name against regular expression
    if (regGrpName.test(group_name) == false) {
        g_form.showFieldMsg('u_group_name', "Group Name must contain only letters, numbers or dashes. ", 'error');
        //Do not submit
        //g_form.submitted = false;
        return false;
    }

    //Check if google group already exists
    var rec = new GlideRecord('u_google_user_accounts');
    rec.addQuery('u_account_email', new_group_email);
    rec.query();

    while (rec.next()) {
        g_form.showFieldMsg('u_group_name',rec.u_account_email + " already exists as an account.",'error');
        return false;
    }

    //Group Members Email List separated by commas
    // Hide error message
    //g_form.hideErrorBox('u_group_members');
    var group_members = g_form.getValue('u_group_members');
    // Comma separate list
    var member_split = group_members.split(',');
    // Loop over list of email addresses
    for (var n = 0; n < member_split.length; n++) {
        // Trim whitespace
        var member_info = trim ? member_split[n].trim() : member_split[n];
        // Email validation regular expression
        var regEmail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
        // Check each item against regular expression
        if (member_info.search(regEmail) == false) {
            g_form.showFieldMsg('u_group_members', "Group Members contains an invalid email address. " + member_info, 'error');
            //Do not submit
            //g_form.submitted = false;
            return false; 
        } else if (member_info.search(validRegExp) == true) {
            g_form.setValue('u_group_members', group_members);  
        }
    }
    return true;
}

Upvotes: 2

Views: 7916

Answers (2)

Tim Woodruff
Tim Woodruff

Reputation: 601

I'm glad you found a solution above, but I wanted to leave a comment as well, to ask if you've tried a try{} catch{} block to handle invalid data?

Upvotes: 1

pengz
pengz

Reputation: 2471

I think I have solved the issue. I made a completely separate function that checks the validation. The onSubmit calls the validation function and checks the return value. If the return value is false then it stops the form. Otherwise it is submitted even after multiple attempts with invalid data. I think this will do the trick. Let me know if anyone can see any issues. Thanks for the help.

function onSubmit() {
    var isValid = checkGoogleGroup();
    if (isValid == false) {
        g_form.submitted = false;
        return false;
    }
}
function checkGoogleGroup() {
    g_form.hideAllFieldMsgs('error');
    //Group Name contain letters numbers and dashes only
    var group_name = g_form.getValue('u_group_name');
    // Group name regular expression
    var regGrpName = /^([A-Za-z0-9\-]+)$/;
    // Check name against regular expression
    validGroupName = regGrpName.test(group_name);
    if (validGroupName == false) {
        g_form.showFieldMsg('u_group_name', "Group Name must contain only letters, numbers or dashes. ", 'error');
        //Do not submit
        return false;
        }
//Check if google group already exists
    var rec = new GlideRecord('u_broad_user_accounts');
    rec.addQuery('u_account_email', new_group_email);
    rec.query();
    while (rec.next()) {
        g_form.showFieldMsg('u_group_name',rec.u_account_email + " already exists as an account.",'error');
        return false;
    }
//Group Members Email List separated by commas
    var group_members = g_form.getValue('u_group_members');
    // comma separate list
    var member_split = group_members.split(',');
    // loop over list of email addresses
    for (var n = 0; n < member_split.length; n++) {
        // trim whitespace
        var member_info = trim ? member_split[n].trim() : member_split[n];
        // validation regular expression
        var validRegExp = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
        // check each item against regular expression
        if (member_info.search(validRegExp) == -1) {
            g_form.showFieldMsg('u_group_members', "Group Members contains an invalid email address. " + member_info, 'error');
            return false;
        }
    }
}

Upvotes: 0

Related Questions