How to prevent submission of Catalog form for particular users?

KS86
Tera Contributor

Hi all,

 

I have 'Requested For' field on catalog form. If Requested for user is belongs to 'HR' department, I need to prevent submission of catalog form. I am using the below script. But it is not submitting form for Non HR users on portal side, but it is working in native side. Let me know what I need to fix in this script to work in both native and portal side? 

 

Client Script - 

 

var validationComplete = false;

function onSubmit() {

    if (validationComplete) {
        return true;
    }

    var gaUser = new GlideAjax('getDepartment');
    gaUser.addParam('sysparm_name', 'getUserDepartment');
    gaUser.addParam('sysparm_user', g_form.getValue('requested_for'));

    gaUser.getXMLAnswer(function(response) {

        if (response == 'false') { // User is NOT HR
            validationComplete = true;
            g_form.orderNow();
        } else { // User is HR
            g_form.addErrorMessage('Catalog submission is not allowed for HR users.');
        }

    });

    return false;
}
 
Script include -
var getDepartment = Class.create();
getDepartment.prototype = Object.extendsObject(AbstractAjaxProcessor, {

    getUserDepartment: function() {
        var user = this.getParameter('sysparm_user');
        var grUser = new GlideRecord('sys_user');
        grUser.addQuery('sys_id', user);
        grUser.query();

        if (grUser.next()) {
            if (grUser.department.name == "HR") {
                return true;
            } else return false;
        }
    },

    type: 'getDepartment'
});
 

 

 

7 REPLIES 7

yashkamde
Mega Sage

Hello @KS86 ,

 

I assume that there should be script errors which are making conflict in native and portal side. Although the script seems right.

Also try this script :
client script :

var validationComplete = false;

function onSubmit() {
    if (validationComplete) {
        return true;
    }

    var gaUser = new GlideAjax('getDepartment');
    gaUser.addParam('sysparm_name', 'getUserDepartment');
    gaUser.addParam('sysparm_user', g_form.getValue('requested_for'));
    gaUser.getXMLAnswer(function(response) {
        if (response == 'false') { 
            validationComplete = true;

            if (typeof g_form.orderNow === 'function') {
                g_form.orderNow(); // Native UI
            } else {
                var submitBtn = document.querySelector(
                    'button[ng-click*="submitNow"], ' +
                    'button[ng-click*="submit"], ' +
                    '#order_now, ' +
                    '.sp-order-now-btn'
                );
                if (submitBtn) {
                    submitBtn.click();
                }
            }
        } else {
            validationComplete = false;
            g_form.addErrorMessage(
                'Catalog submission is not allowed for HR department users.'
            );
        }
    });

    return false;
}

 

small fix in script include :

if (grUser.next()) {
            if (grUser.getValue('department') != null) {
                var deptName = grUser.department.getDisplayValue();
                return (deptName == 'HR') ? 'true' : 'false';
            }
        }
        return 'false';

 

If my response helped mark as helpful and accept the solution.

KS86
Tera Contributor

Hi Yash, this script is not working on the portal side. Getting Javascript Console Error. How can we know why we are getting this error?

This is bcz of some methods are not supported in mobile or service portals but work fine in native UI.

 

plz check the browser console for the specific error.

pr8172510
Kilo Sage

Hi @KS86,

The issue is that g_form.orderNow() works differently in Service Portal than in the Native UI, and using an asynchronous GlideAjax call inside onSubmit() can cause inconsistent behavior.

Instead of calling orderNow(), use the standard Service Portal pattern:

var validationComplete = false;

function onSubmit() {

    if (validationComplete)
        return true;

    var ga = new GlideAjax('getDepartment');
    ga.addParam('sysparm_name', 'getUserDepartment');
    ga.addParam('sysparm_user', g_form.getValue('requested_for'));

    ga.getXMLAnswer(function(answer) {

        if (answer == 'true') {
            g_form.addErrorMessage('Catalog submission is not allowed for HR users.');
            return;
        }

        validationComplete = true;
        g_form.submit();
    });

    return false;
}


Also update the Script Include to return strings rather than JavaScript booleans

getUserDepartment: function() {

    var user = this.getParameter('sysparm_user');

    var grUser = new GlideRecord('sys_user');
    if (grUser.get(user)) {

        if (grUser.department.getDisplayValue() == 'HR')
            return 'true';
    }

    return 'false';
}