Catalog Client Script – Make Variable Editable Only if User Is Member of Assignment Group
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
2 hours ago
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);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
an hour ago - last edited an hour ago
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
55m ago
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 }
