Restrict visibility of a field on the basis of certain user_name

rishabh31
Mega Sage

Dear Team,

 

I want to restrict the visibility/display of a field 'u_consultant' (String type field) on user records.

 

when the loggedin user's username startsWith 'id' or 'ID', then show (Display) 'u_consultant'

and when loggedin user's username NOT startswith NOR contains 'id' or 'ID', then HIDE 'u_consultant'

 

Wrote below scripts but during impersonation to users having or not having 'id' or 'ID', the user records keep displaying 'u_consultant' field i.e., Not working

 

Script Include;

 

var UserUtil1 = Class.create();
UserUtil1.prototype = {
    chkUsrID: function() {
        var userid = this.getParameter('sysparm_user');
        var result = this.newItem('check');
        var userGr = new GlideRecord('sys_user');
        userGr.addEncodedQuery('active=true^user_nameSTARTSWITHID^ORuser_nameSTARTSWITHid^sys_id=' + userid);
        userGr.query();
        if (userGr.next()) {
            result.setAttribute('check', 'yes');
        } else {
            result.setAttribute('check', 'no');
        }
    },

    type: 'UserUtil1'
};

 

Client Script (Above Script Include Called);

 

function onLoad() {
   //Type appropriate comment here, and begin script below
   var chkUsrID = new GlideAjax('UserUtil1');
   chkUsrID.addParam('sysparm_name', 'chkUsrID');
   chkUsrID.addParam('sysparm_user', g_user.userID);
   chkUsrID.getXML(getStatus);

   function getStatus(answer) {
	if (answer) {
		var result = answer.responseXML.getElementsByTagname("check");
		var check = result[0].getAttribute("check");
		if (check == 'yes'){
			g_form.setVisible('u_consultant', true);
		} else {
			g_form.setVisible('u_consultant', false);
		}
	}
   }
}

 

Please help to modify the script so that it will work

1 ACCEPTED SOLUTION

Appanna M
Tera Guru

Hello @rishabh31 ,

Please try the below logic it should works, I have tested it in my PDI.

You can write a Display business rule and onLoad client script to achieve this requirement. 

 

 

 

//Display BR
(function executeRule(current, previous /*null when async*/ ) {
    // Add your code here
    g_scratchpad.res = false;
    var curuser = gs.getUserID();
    gs.info("User:" + curuser);
    var getUser = new GlideRecord('sys_user');
    getUser.addQuery('sys_id', curuser);
	getUser.addEncodedQuery('user_nameSTARTSWITHid^ORuser_nameSTARTSWITHID');
	getUser.query();
	if(getUser.next()){
    g_scratchpad.res = true;
	}
})(current, previous);

//OnLoad CS:
function onLoad() {
   //Type appropriate comment here, and begin script below
   var res = g_scratchpad.res;
   alert("test:"+res);
   if(res == false){
   g_form.setVisible('u_consultant',false);
   }
   else {
	g_form.setVisible('u_consultant',true);
   }
}

 

 

 

 

Please Mark My Answer as Helpful and Accept as Solution, if you find this article helpful or resolves your issue.

 

Best Regards,

View solution in original post

21 REPLIES 21

acl creation not allowed to us, pls help with script include and client script

Be aware that users will still have access to read the field from the list view as the client script will work only in the from view. 

@Abdulrahman1 I understand that part but customer wants for restrict on form view even after informed them about its limitations help with the scripts, shall be grateful

 

 

 

 

I tried the below Onload client script and it's working.

 

function onLoad() {
   //Type appropriate comment here, and begin script below
   if(g_user.userName.startsWith("id") || g_user.userName.startsWith("ID") ){
	g_form.setVisible('u_consultant',true);
   }else{
	g_form.setVisible('u_consultant',false);
   }
}

If the given solutions don't work, you will have to do it via ACL (which is the best solution to begin with). "ACL creation not allowed to us" is no reason for not using it. Get someone that is allowed to, to create it for you.


Please mark any helpful or correct solutions as such. That helps others find their solutions.
Mark