Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

GlideAjax Script Include and Client Script code to restrict access of fields not working.

prabhmeet
Giga Expert

I have a catalog item where I have a reference field to sys_user table (Requested for).

In Some fields on the form only the following users can enter values - requested for's manager, requested for manager's manager, User access administration group. To other users the fields should be visible but they cannot enter values.

 

I have written a Script Include and Client Script for this but it is not working. I am new to ServiceNow and not too good with coding. Can someone please point out my mistakes? 

Please someone help me correct the code?

Script Include -

var RestrictAccessToUpdateFields = Class.create();
RestrictAccessToUpdateFields.prototype = Object.extendsObject(AbstractAjaxProcessor, {
getAccess: function() {

var obj ={};
obj.retvalue ='';
obj.mm = '';
obj.grp = '';
var a = this.getParameter('sysparm_user_id');
var manager = new GlideRecord('sys_user');
manager.addQuery('sys_id', a);
manager.query();
if(manager.next()){
obj.retvalue = manager.manager.sys_id;
obj.mm = manager.manager.manager.sys_id;
obj.grp =gs.getUser().isMemberOf('User Access Administration');

}
return JSON.stringify(obj);
},

type: 'RestrictAccessToUpdateFields'
});

 

Onchange CLient Script

var id = g_form.getValue('requested_for');//newValue

var ga = new GlideAjax('RestrictAccessToUpdateFields');
var a = g_user.getUser();

ga.addParam('sysparm_name','getAccess');
ga.addParam('sysparm_user_id',id);
ga.getXML(CallBack);

function CallBack(response)
{
var answer = response.responseXML.documentElement.getAttribute("answer");
var returneddata = JSON.parse(answer);
if(returneddata.retvalue == g_user.userID || returneddata.mm == g_user.userID || returneddata.grp == true ){
g_form.setReadOnly('updated_first_name', false);
g_form.setReadOnly('updated_last_name', false);
}
else{
g_form.setReadOnly('updated_first_name', true);
g_form.setReadOnly('updated_last_name', true);
}
}
}

1 ACCEPTED SOLUTION

dvp
Mega Sage

 getUser method is not available in  g_user and also in script inlcude your code returns the objects instead of sys id of managers

Try the below script

Script Include -

var RestrictAccessToUpdateFields = Class.create();
RestrictAccessToUpdateFields.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getAccess: function() {
        
        var obj ={};
            obj.retvalue ='';
            obj.mm = '';
            obj.grp = '';
            var a = this.getParameter('sysparm_user_id');
            var manager = new GlideRecord('sys_user');
            manager.addQuery('sys_id', a);
            manager.query();
            if(manager.next()){
                obj.retvalue = manager.manager.sys_id.toString();
                obj.mm = manager.manager.manager.sys_id.toString();
                obj.grp =gs.getUser().isMemberOf('User Access Administration');
                
            }
            return JSON.stringify(obj);
        },
        
        type: 'RestrictAccessToUpdateFields'
    });

 

Onchange CLient Script

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
    
    var id = g_form.getValue('requested_for');//newValue
    
    var ga = new GlideAjax('RestrictAccessToUpdateFields');    
    ga.addParam('sysparm_name','getAccess');
    ga.addParam('sysparm_user_id',id);
    ga.getXML(CallBack);
    
    function CallBack(response)
    {
        var answer = response.responseXML.documentElement.getAttribute("answer");
        var returneddata = JSON.parse(answer);
        
        if(returneddata.retvalue == g_user.userID || returneddata.mm == g_user.userID || returneddata.grp == true ){
            g_form.setReadOnly('updated_first_name', false);
            g_form.setReadOnly('updated_last_name', false);
        }
        else{
            
            g_form.setReadOnly('updated_first_name', true);
            g_form.setReadOnly('updated_last_name', true);
        }
    }
    
}

 

 

View solution in original post

14 REPLIES 14

Yea, after reading a bit more, I missed the part about this being a catalog item. ACL's then really wouldn't help here.


Please consider marking my reply as Helpful and/or Accept Solution, if applicable. Thanks!

oh ok, then I guess I have to work with GlideAjax only

Service_RNow
Mega Sage

HI,

Check this website. Maybe you will find some interesting information.

https://community.servicenow.com/community?id=community_question&sys_id=c97a07e9db5cdbc01dcaf3231f96...

Please mark reply as Helpful/Correct, if applicable. Thanks!

Hi Ram, if I use g_scratchpad for my requirement, how can I write the code for getting requested for's manager and requested for manager's manager in the display business rule?

Hi Ram,

I tried the below code( just for the group restriction) but it is not working -

Display BR-

(function executeRule(current, previous /*null when async*/) {
function userIsMember() {
g_scratchpad.isMember = gs.getUser().isMemberOf('User Access Administration');
}

})(current, previous);

Client Script - 

function onLoad() {
var myVariablesAreReadOnly = false;
if (!g_scratchpad.isMember) { 
myVariablesAreReadOnly = true;

}
g_form.setReadOnly("variables.updated_first_name",myVariablesAreReadOnly);
g_form.setReadOnly("variables.updated_last_name",myVariablesAreReadOnly);
}