How to hide 'Close task' UI action on SC tasks when state is changed to closed rejected

sath
Tera Expert

Hi,

When an user sets the state to closed rejected on first catalog task, an alert will be triggered asking them to click on save button instead of close task button(it sets the state to closed complete). Still some users are clicking on close task button after setting the state to closed rejected and the state is getting closed complete instead of closed rejected.

So, we have decided to hide 'close task' UI action on first catalog task. I have created a UI policy with the below condition and selected isolate script to false.

function onCondition() {
$$('#close_sc_task')[0].hide();
}

It's working as per the requirement, but previewing the reference records from SC task form (like request item, requested for, item) is not working.

I have tried inserting the condition within UI action condition field, but it works only during onLoad. I need this functionality to work during onChange. Please assist.

1 ACCEPTED SOLUTION

Hi @sath ,

 

I am not sure what logic you are applying to check whether that's a first task or not. I applied my own logic to determine it, if it is the first one to be closed and all the remaining SC Tasks of that Requested Item are in the open state then I am considering it as an open Task.

 

In order to achieve this I am using a Display Business Rule and declared a scratchpad variable. Please find the code below.

 

Display BR Code:-

 

(function executeRule(current, previous /*null when async*/) {
// Add your code here
var notFirst;
var scTaskRec = new GlideRecord('sc_task');
scTaskRec.addQuery('request_item',current.request_item);
scTaskRec.query();
while(scTaskRec.next())
{
if(scTaskRec.state == '3' || scTaskRec.state == '4' || scTaskRec.state == '7') // if any sc task is closed
{
notFirst = 'yes';
}
}
if(notFirst == 'yes')
{
g_scratchpad.FirstTask = 'no';
}
else
{
g_scratchpad.FirstTask = 'yes';
}
})(current, previous);
MallidiSuma_0-1684256994693.png

 

 
Close Task UI action Code:-
function closeTask() {
    var state_val = g_form.getValue('state');
 
    if (state_val == '4' && g_scratchpad.FirstTask == 'yes') { // 4 is the backend value of Closed Incomplete
        alert("check the state");
    }
 
else {
        g_form.setValue('state', 3);
        //Call the UI Action and skip the 'onclick' function
        gsftSubmit(null, g_form.getFormElement(), 'close_sc_task');
    }
}
//Code that runs without 'onclick'
//Ensure call to server-side function with no browser errors
if (typeof window == 'undefined')
    updateTask();
 
function updateTask() {
    current.state = 3;
    current.update();
}
 
In short, you can achieve this by using Display Business Rule.
 
Please mark my answer as helpful,  if it helps!!
 
Thanks & Regards,
Suma.
 

 

 

View solution in original post

14 REPLIES 14

I have the similar code and looking to avoid DOM manipulation as its not allowing to preview reference records on SC task once its set to closed rejected (used DOM in UI policy)

You can avoid to use DOM manipulation (if the scTask is already on state 'closed rejected') you can add that to script include.

something like this if((gr.sys_id == scTask && gr.state != closed rejected)

so the DOM manipulation will not run if the state is already closed rejected
and with that the ui action close task will not show up because the task is already closed

State will not be set to closed rejected on load. User will change it to closed rejected and then close task UI action should be hidden.

You can try this :

 

Script include :

var checkiffirst = Class.create();
checkiffirst.prototype = Object.extendsObject(AbstractAjaxProcessor, {
process: function() {
var scReqItem = this.getParameter("sysparm_scReqItem");
var scTask = this.getParameter("sysparm_scTask");
var gr = new GlideRecord("sc_task");
gr.addQuery("requested_item", scReqItem);
gr.orderByDesc('sys_created_on');
gr.query();
if (gr.next()) {
if (gr.sys_id == scTask)
return JSON.stringify( {
'isTheFirst': 'true',
'state': gr.getValue('state')
});
else
return JSON.stringify({
'isTheFirst': 'false',
'state': gr.getValue('state')
});
}


},
type: 'checkiffirst'
});

 

UI POLICY :

condition : state is closed rejected

Execute if true

 

function onCondition() {
var ga = new GlideAjax('checkiffirst');

ga.addParam('sysparm_scReqItem', g_form.getValue('request_item'));

ga.addParam('sysparm_scTask', g_form.getUniqueValue());

ga.getXML(resp);

function resp(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
answer = JSON.parse(answer);
if(answer.isTheFirst == 'true' && answer.state != 'closed rejected')
$$('#close_sc_task')[0].hide();

}
}

 

 

I have used $$('#close_sc_task')[0].hide(); in UI policy and its working.

But not able to preview reference records after state is set to closed rejected.

If I disable the UI policy, then I can preview reference records after state is set to closed rejected.