Dynamic Service Portal Buttons to Change State not Refreshing

ryanwoodburn
Kilo Expert

Hi

I have created a custom widget containing 3 buttons that are used to set the state of an Incident.


Their display is dynamic, and certain states will not show certain buttons.   This is done in the html using ng-if="data.state!=130 && data.state!=3", for example.

When I click these buttons, they change the state, add a relevant comment, and a splash header is displayed.   This is all working, and you can see the update on the form without refreshing.

However, the old button will still display and the new one not appear, until I manually refresh the browser window.

E.g. If I select Pass Back to change from awaiting client to Work in Progress, the Pass Back button will not disappear and the Resolve button will not appear until I refresh the browser.

I have attached my code below.

Any help appreciated

Thanks

HTML

<div ng-if="data.state!=3 && data.closeCode!=60">

  <div>

  <div class="panel-heading bg-primary"> <b>Available Actions</b></div>

</div>

<div class="panel panel-default" >

<div class="panel-body">

<button ng-if="data.state!=130 && data.state!=3" type="button" class="btn btn-primary3" display= inline-block ng-click="c.uiAction('Resolve')">Resolve</button>

<button ng-if="data.state==110" type="button" class="btn btn-primary2"   ng-click="c.uiAction('Pass back')">Pass Back</button>

<button ng-if="data.state==130 && data.closeCode!=60" type="button" class="btn btn-primary2"   ng-click="c.uiAction('Accept Solution')">Accept Solution</button>

</div>

</div>

  </div>

Client Script

function() {

  var c = this;

c.uiAction = function(action) {

if(!confirm(action + " - are you sure?")) return;

c.data.action = action;

c.server.update().then(function() {

c.data.action = undefined;

})

}

}

Server Script

(function() {

// Get table & sys_id

data.table = input.table || $sp.getParameter("table");

data.sys_id = input.sys_id || $sp.getParameter("sys_id");

// Valid GlideRecord

gr = new GlideRecord(data.table);

if (!gr.isValid())

return;

gr.get(data.sys_id);

if (!gr.canRead())

return;

data.number = gr.getDisplayValue('number');

data.state = gr.getValue('state');

data.closeCode = gr.getValue('close_code')

// Valid sys_id

if (!gr.get(data.sys_id))

return;

if (input && input.action) {

var action = input.action;

// If Incident table

if (data.table == 'incident') {

if (action == 'Pass back') {

// Resolve Incident

gr.setValue('state', 2);

gr.update();

//action.setRedirectURL(current);

gs.addInfoMessage(data.number + ' returned to action. Thank you');

}

if (action == 'Resolve') {

gr.setValue('state', 130);

gr.setValue('close_notes', 'Resolved by ' + gs.getUserDisplayName());

gr.setValue('close_code', 60);

//gr.setvalue('active', false);

gr.setDisplayValue('comments', 'This has been set to Resolved by ' + gs.getUserDisplayName() + '. \nIf the issue still persists, please add an update and we will reopen to investigate.\nIf no update is added this incident will close in 10 days.\n\nThank you for your help in resolving this.' );

gr.update();

//action.setRedirectURL(current);

gs.addInfoMessage(data.number + ' has been resolved.   Thank you for your help');

}

if (action == 'Accept Solution') {

// Closes Issue Incident

gr.setValue('state', 3);

gr.setValue('u_cust_agree', 'closure');

gr.comments = 'This solution has been accepted by ' + gs.getUserDisplayName() + ' .\n\nThe Incident has now been closed.\n\nThank you';

//gr.setDisplayValue('comments', 'This solution has been accepted by ' + gs.getUserDisplayName() + ' .\n\nThe Incident has now been closed.\n\nThank you')

gr.update();

//action.setRedirectURL(current);

gs.addInfoMessage('Thank you for accepting our solution for ' + data.number);

/*

//if(confirm("Are you sure you want to Close this Incident?")){

//Close incident

gr.setValue('state', 3);

gr.setValue('u_cust_agree', 'closure');

gr.setValue('close_notes', 'Closed by ' + gs.getUserDisplayName());

gr.setValue('close_code', 60);

gr.setvalue('active', false)

gr.update();

action.setRedirectURL(current);

gs.addInfoMessage(data.number + ' has been closed');

*/

}

}

}

//}

})();

1 ACCEPTED SOLUTION

Can you put this line at the end of the server script as well, after all the action scripts and try again.



data.state = gr.getValue('state');



Please mark this response as correct or helpful if it assisted you with your question.

View solution in original post

6 REPLIES 6

SanjivMeher
Kilo Patron
Kilo Patron

Remove the line as shown below and try


Also printing the data.state to check if correct state value is coming or not


<div ng-if="data.state!=3 && data.closeCode!=60">


  <div>{{data.state}}


  <div class="panel-heading bg-primary"> <b>Available Actions</b></div>


</div>


<div class="panel panel-default" >


<div class="panel-body">


<button ng-if="data.state!=130 && data.state!=3" type="button" class="btn btn-primary3" display= inline-block ng-click="c.uiAction('Resolve')">Resolve</button>


<button ng-if="data.state==110" type="button" class="btn btn-primary2"   ng-click="c.uiAction('Pass back')">Pass Back</button>


<button ng-if="data.state==130 && data.closeCode!=60" type="button" class="btn btn-primary2"   ng-click="c.uiAction('Accept Solution')">Accept Solution</button>


</div>


</div>


</div>



Please mark this response as correct or helpful if it assisted you with your question.

Thanks Sanjiv



Nice bit of debug.



I have the state displaying in the ticket field widget and it updates, but when I display the state in this widget it does not change until I refresh the browser..



Any ideas as to the cause?



Thanks


Can you put this line at the end of the server script as well, after all the action scripts and try again.



data.state = gr.getValue('state');



Please mark this response as correct or helpful if it assisted you with your question.

Thanks - that worked a treat!



On a second point - if you see the comments I am adding to the record in the server script.   When a user clicks the button, obviously these comments get posted as the user.   Is there a way I can force the comment to be posted from a different user - Admin for example?



I would like the comment to be added looking like it was posted by us, the service provider.



Thanks