Catalog Client Script – Make Variable Editable Only if User Is Member of Assignment Group

saint
Tera Expert

Hi everyone,


I’m working on a Service Catalog item where I need to control the editability of a variable based on group membership.

 

If the logged‑in user is a member of the selected Assignment Group, the variable should be editable,
For all other users, the variable should remain read‑only


I implemented a client‑callable Script Include and used GlideAjax from an onLoad Catalog Client Script to check whether the user belongs to the Assignment Group.


However, the GlideAjax call returns after onLoad completes, so when I try to use the result, I’m getting undefined.

 

Let me know what i'm doing wrong.

 

    getManager: function() {
        var userId = this.getParameter('sysparm_user_id');
        var userGR = new GlideRecord('sys_user');
        if (userGR.get(userId) && userGR.manager) {
            return userGR.manager.toString(); // Return manager sys_id
        } else {
            return '';
        }
    },

    getMemberOf: function() {
        this.BUDGET_GROUP = "64805b4f83757a50d0f26320ceaad3be";
        return this._isCurrentUserInGroup(this.BUDGET_GROUP);
    },


    _isCurrentUserInGroup: function(groupSysId) {
        var userId = gs.getUserID();

        var grMember = new GlideRecord("sys_user_grmember");
        grMember.addQuery("user", userId);
        grMember.addQuery("group", groupSysId);
        grMember.setLimit(1);
        grMember.query();

        return grMember.hasNext();
    },

 

 

   var isMember;


    var ga = new GlideAjax('GetUserDetailsForCatalogItems');
    ga.addParam('sysparm_name', 'getMemberOf');
    ga.addParam('sysparm_group_id', assignmentGroup);

    ga.getXMLAnswerWait(function(answer) {
        if (answer == 'true') {
            isMember = true;

        } else {
            isMember = false;
        }
    });


    alert(isMember);
2 REPLIES 2

Mohammed8
Giga Sage

Hi @saint ,

Although you are using GlideAjax in an onLoad client script, the script does not execute line by line. GlideAjax runs asynchronously, so when the variable is declared, it is initially undefined because the server response has not returned yet.  I believe The alert() is executed immediately, before the GlideAjax callback completes and hence it returns undefined

You can use alert() inside the block like:


function onLoad() {

var isMember;

var ga = new GlideAjax('GetUserDetailsForCatalogItems');
ga.addParam('sysparm_name', 'getMemberOf');
ga.addParam('sysparm_group_id', assignmentGroup);

ga.getXMLAnswer(function(answer) {

if (answer === 'true') {
isMember = true;
} else {
isMember = false;
}

// Replace alert with info message for best practice
alert('Is member: ' + isMember);
// g_form.addInfoMessage('Is member: ' + isMember);

});
}

 

If you find this helpful, please mark as solution accepted/helpful

 

Thanks and Regards,

Mohammed Zakir

Hi Mohammed, thanks for your response. Yes, because of its nature i was thinking of using a wait xml, but it will make my form loads slower, Plus my conditions are after i get the answer of isMember which is out side of the }

 

    if (((needNewDept == 'Yes' || needNewDept == 'Unsure') && movePeople == 'No') && assignmentGroup == grpSysId && isMember  && (stateOfTask == 1 || stateOfTask == 2)) {
show and hide variables
}
 
this is after i get to know all my conditions.
 
Is there a better way to get user membership on client side than this?