Hide UI Macro icon using onLoad Client script.

ar1
Kilo Sage

Hi All,

We created one UI Macro to display the approver's delegates and it's working fine.
But now we want to hide the UI Macro if the approver don't have the delegates.

We gone through the old threads and tried few possibilities to hide the macro, But no luck.

Can anyone please help us hide the Marco using onLoad client script.

 

Ui Macro Script:
Name: delegates_approver

 

<?xml version="1.0" encoding="utf-8" ?>
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">

<g:evaluate var="jvar_guid" expression="gs.generateGUID(this);" />
<j:set var="jvar_n" value="show_incidents_${jvar_guid}:${ref}"/>

<g:reference_decoration id="${jvar_n}" field="${ref}"
onclick="showRelatedList('${ref}'); "
title="${gs.getMessage('Show delegates')}" class="btn btn-ref btn-default hide_hosted_asset_flag" image="images/icons/tasks.gifx" icon="icon-tree-right"/>


<script>
function showRelatedList(reference) {
var w = new GlideDialogWindow('show_list');
w.setTitle('Delegate Users');
w.setPreference('table', 'sys_user_delegate_list');
w.setPreference('sysparm_view', 'default');
//Set the query for the list
var approver = g_form.getValue('approver');

var usr = 'user=' + approver + '^approvals=true' + '^delegate.active=true';

w.setPreference('sysparm_query', usr);
w.render();
}
</script>
</j:jelly>

 

Hi @RaghavSh 

Could you please help us here.

Advance thanks.

1 ACCEPTED SOLUTION

@ar1 the code worked perfectly fine for me pasting it again:

client:

function onLoad() {
//Type appropriate comment here, and begin script below

alert('one');

//var usr = g_form.getReference('approver');


var gr = new GlideAjax('approverDelegationsCheck');
gr.addParam('sysparm_name','getDelegates');
gr.addParam('sysparm_usr',g_form.getValue('approver'));
gr.getXML(callbackfunction);
} // this bracket is the onload function bracket, it should close here , check your code.
function callbackfunction(response)
{
var answer = response.responseXML.documentElement.getAttribute("answer");
alert(answer);
if(answer==0){
alert('inside loop');

gel("test").style.display="none"; //make sure isolate script of your client script is false

}

}

 

SI:

var approverDelegationsCheck = Class.create();
approverDelegationsCheck.prototype = Object.extendsObject(AbstractAjaxProcessor, {

getDelegates: function()
{
gs.log("raghav111");
var usr = this.getParameter('sysparm_usr');
var app = new GlideRecord('sys_user_delegate');
app.addQuery('user',usr);
app.addQuery('approvals',true);
app.query();
return app.getRowCount();
// while(app.next())
// {
// var delUsr = app.getValue('delegate');
// //var delUsr = app.getRowCount();
// return delUsr;
// }
},


type: 'approverDelegationsCheck'
});

 

I think you should paste the screenshots of codes. Also I have put logs, check if you are getting this log or any error when you load the approval page.


Raghav
MVP 2023

View solution in original post

34 REPLIES 34

RaghavSh
Kilo Patron

which table are you showing the macro on?

what is the query to check if there is delegate? If you can get that query in client script (returning true/false with respect to delegates), I can provide you the script to hide the macro.


Raghav
MVP 2023

Hi Raghav,
Many thanks for the response.
The UI macro icon current showing under "sysapproval_approver" table level.
Beside the Approver field.
We configured the approver field and added the macro name in the attributes.

ANd now we want to check the Approver have the delegates or not.

Query level we're checking approver's delegates and delegate's are active or not and their approval field true or not.

If the approver have the delegates then we can show the macro icon else we need to hide the icon if approver have no delegates.


Advance thanks.

If the approver have the delegates then we can show the macro icon else we need to hide the icon if approver have no delegates.  : For this you will need a  GlideAjax (in on load client script) , once you return true or false in answer from script include, you can use the below script to hide the macro:

 

UI macro (add div to macro code):

<div id="test">

 <g:evaluate var="jvar_guid" expression="gs.generateGUID(this);" />
<j:set var="jvar_n" value="show_incidents_${jvar_guid}:${ref}"/>

<g:reference_decoration id="${jvar_n}" field="${ref}"
onclick="showRelatedList('${ref}'); "
title="${gs.getMessage('Show delegates')}" class="btn btn-ref btn-default hide_hosted_asset_flag" image="images/icons/tasks.gifx" icon="icon-tree-right"/>

</div>

client script:

 

if(answer==false){

gel("test").style.display="none";  //make sure isolate script of your client script is false

}


Please mark the answer correct/helpful accordingly.

 


Raghav
MVP 2023

Hi Raghava,
Many thanks for the code.
Could you please check the below script include and client script.
some reasons the code is not wokring.

NOte: We set the isolate script as FASLE.


Script include:

var ApproverDelegationsCheck = Class.create();
ApproverDelegationsCheck.prototype = Object.extendsObject(AbstractAjaxProcessor, {

getDelegates: function()
{
var usr = this.getParameter('sysparm_usr');
var app = new GlideRecord('sys_user_delegate');
app.addQuery('sys_id',usr);
app.addQuery('approvals',true);
app.query();
while(app.next())
{
//var delUsr = app.getValue('delegate');
var delUsr = app.getRowCount();
return delUsr;
}
},


type: 'ApproverDelegationsCheck'
});


Client Script:

function onLoad() {
//Type appropriate comment here, and begin script below
//var usr = g_form.getReference('approver');

var gr = new GlideAjax('ApproverDelegationsCheck');
gr.addParam('sysparm_name','getDelegates');
gr.addParam('sysparm_usr',g_form.getReference('approver'));
gr.getXML(callbackfunction);
function callbackFunction(response)
{
var answer = response.getXML.documentElement.getAttribute("answer");

if(answer==0){

gel("test").style.display="none"; //make sure isolate script of your client script is false

}

}
}

ANd updated the UI Macro, as you suggested:


<?xml version="1.0" encoding="utf-8" ?>
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">

<div id = "test">

<g:evaluate var="jvar_guid" expression="gs.generateGUID(this);" />
<j:set var="jvar_n" value="show_incidents_${jvar_guid}:${ref}"/>

<g:reference_decoration id="${jvar_n}" field="${ref}"
onclick="showRelatedList('${ref}'); "
title="${gs.getMessage('Show delegates')}" class="btn btn-ref btn-default hide_hosted_asset_flag" image="images/icons/tasks.gifx" icon="icon-tree-right"/>

</div>


<script>
function showRelatedList(reference) {
var w = new GlideDialogWindow('show_list');
w.setTitle('Delegate List');
w.setPreference('table', 'sys_user_delegate_list');
w.setPreference('sysparm_view', 'default');
//Set the query for the list
var approver = g_form.getValue('approver');
//var act = g_form.getValue('approvals');
<!-- //var query = 'user=' + approver + '^approvals=true' + '^delegate.active=true' + '^starts<=javascript&colon;gs.daysAgoEnd(0)^ends>javascript&colon;gs.daysAgoStart(0)';
-->
var query = 'user=' + approver + '^approvals=true' + '^delegate.active=true';

w.setPreference('sysparm_query', query);
//Open the popup
w.render();
}
</script>
</j:jelly>

 

 

Advance thanks.