- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks 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);
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago - last edited 3 weeks ago
Hi @saint
Declaring isMemberr outside the GlideAjax callback may or may not work because GlideAjax is asynchronous. The variable can be undefined when accessed outside the getXMLAnswer() block. I think is not recommended to use it outside.
Why not use it inside XMLAnswer BLock, something similar to like this:
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;
}
// 🔴 ALL dependent logic MUST be here
if (
((needNewDept == 'Yes' || needNewDept == 'Unsure') &&
movePeople == 'No') &&
assignmentGroup == grpSysId &&
isMember &&
(stateOfTask == 1 || stateOfTask == 2)
) {
// show / hide variables
g_form.setReadOnly('target_variable', false);
}
});
}
you can refer similar community answer solution:
Other than this, I'm not sure of how to access isMember outside the block
Regards,
Mohammed Zakir
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago - last edited 3 weeks 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
3 weeks 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 }
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago - last edited 3 weeks ago
Hi @saint
Declaring isMemberr outside the GlideAjax callback may or may not work because GlideAjax is asynchronous. The variable can be undefined when accessed outside the getXMLAnswer() block. I think is not recommended to use it outside.
Why not use it inside XMLAnswer BLock, something similar to like this:
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;
}
// 🔴 ALL dependent logic MUST be here
if (
((needNewDept == 'Yes' || needNewDept == 'Unsure') &&
movePeople == 'No') &&
assignmentGroup == grpSysId &&
isMember &&
(stateOfTask == 1 || stateOfTask == 2)
) {
// show / hide variables
g_form.setReadOnly('target_variable', false);
}
});
}
you can refer similar community answer solution:
Other than this, I'm not sure of how to access isMember outside the block
Regards,
Mohammed Zakir
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago
Thanks Mohammed! I'm also trying to figure out if there's a different way to solve this problem.
