Call script include from catalog builder

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎10-26-2022 05:51 AM
We are considering offering catalog builder to our service owners for them to maintain their own items. Pretty simple.
However, we want to limit the catalog items they can edit based on the catalog template>Available For.
I've written a script that works great (ran in background script), it returns the catalog item sys_ids that the user logged in can see.
However, when I try to apply it to the filter of the catalog builder, I'm not able to hit the script include.
My filter looks like this:
Sys ID IS ONE OF javascript: scriptInclude().function()
I threw in some log statements in the script but the result I get is:
Sys ID in undefinded
Is this doable? Maybe I'm overthinking this

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎10-26-2022 05:54 AM
Hello @matthew_magee1
Is the script include client callable? the script include should be client callable in order to be used in condition.
Thanks,
Ali
Thank you,
Ali

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎10-26-2022 06:23 AM
Yes sir, client callable is checked

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎10-26-2022 06:33 AM
One more check, may be just a type, new keyword is missing.
Sys ID IS ONE OF javascript: new scriptInclude().function().
Also did you check using the script include in normal list view of catalog item table. If the script include is not working in list view as well then some issue with script include only. If it is working there and not in catalog builder then some configuration/limitation there.
Thank you,
Ali
Thank you,
Ali

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎10-28-2022 09:27 AM
I ended up creating an on-before query business rule that checks the associated template/Available for/Groups and if the user is part of that group, add the catalog item in an array and then put that cat item in the query to filter the results. Works like a champ. For anyone who may want to do something similar, here is my business rule code:
Table: sc_cat_item
Advanced: true
When: Before/Query
Script:
(function executeRule....) {
if(gs.getSession().isInteractive() && !gs.hasRole('admin')){
var user =gs.getUserID();
var cat_items = [];
getCatItems;
var q=current.addQuery('sys_id','IN',cat_items);
}
fucntion getCatItems() {
var gr = new GlideRecord('sc_cat_item');
gr.addEncodedQuery('sc_template!=NULL^sys_class_name=sc_cat_item');
gr.query();
while(gr.next()){
var template = gr.sc_template;
var item = gr.sys_id.toString();
getAvailableFor(template,item);
}
function getAvailableFor(template,item) {
var gr = new GlideRecord('sc_template');
gr.addQuery('sys_id',template);
gr.query();
while(gr.next())
var availableFor = gr.available_for;
parseUserCriteria(availableFor, item);
}
}
function parseUserCriteria(availableFor, item){
if(availableFor.includes(',')){
availableFor = availableFor.split(',');
for (var a in availableFor) {
var uc = availableFor[a];
getUserCriteriaInfo(availableFor[a], item);
}
} else {
getUserCriteria(availableFor, item);
}
function getUserCriteriaInfo(uc_sys_id,item) {
var gr = new GlideRecord('user_criteria');
gr.get(uc_sys_id);
var user = gr.getValue('user');
var groups = gr.getValue('group');
var roles = gr.getValue('role');
var company = gr.getValue('company');
var location = gr.getValue('location');
var department = gr.getValue('department');
if(users) {
checkUsers(users,item);
}
if(groups){
checkGroups(groups,item);
}
if(company){
checkCompany(company,item);
}
if(location) {
checkLocation(location, item);
}
if(department) {
checkDepartment(departement, item);
}
}
function checkUsers(users,item) {
if(users.includes(user)) {
doSomething();
}
}
function checkGroups(groups,item) {
var gr = new GlideRecord('sys_user_grmember');
gr.addQuery('group.sys_id','IN',groups);
gr.addQuery('user',user);
gr.query();
if(gr.hasNext()){
cat_items.push(item);
}
}
function checkRoles(roles,item) { }
function checkCompany(company,item) { }
function checkLocation(location,item) { }
function checkDepartment(department,item) { }
}
FYI: There may be some typos in the above code.
I tried to use getMyGroups() function and get the groups from the user criteria by dot-walking but it didn't work too well. Oh well.