how to restrict cancel button on service portal for a particular catalog items
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-14-2023 01:51 AM - edited 04-14-2023 05:38 AM
Can you please help me @Ahmmed Ali @Vasantharajan N
As I had created Cancel Request Button Widget on Service Portal based on RITM (sc_req_item table) with below mentioned Server Script.
Now I need to restrict the Cancel Button for a particular catalog items.
Cancel Request Button:
Server Script:
(function() {
if (!input) {
data.show = false;
data.sys_id = $sp.getParameter('sys_id');
data.type = $sp.getParameter('table');
data.cancelled_msg = '';
var gr = $sp.getRecord();
if (gr.u_cancelled == 1 || gr.u_cancelled == 2) {
data.cancelled_msg = gs.getMessage('A request to cancel this ticket has been submitted.');
if (gr.state == 4) {
data.cancelled_msg = gs.getMessage('This ticket has been closed according to your cancellation request.');
}
}
if (data.type == 'sc_req_item') {
data.btn_text = gs.getMessage('Cancel Request');
data.show = canCancelReq(data.sys_id);
}
} else if (input.action == 'cancel') {
if (input.type == 'sc_req_item') {
cancelReq(input.sys_id);
}
}
function cancelReq(id) {
var req = new GlideRecord('sc_req_item');
if (req.get(id)) {
var sc_task = new GlideRecord('sc_task');
sc_task.addQuery('request_item', id);
sc_task.addActiveQuery();
sc_task.addNotNullQuery('assigned_to');
sc_task.query();
if (!sc_task.hasNext()) {
req.state = 4;
req.u_cancelled = 2;
req.approval = 'cancelled';
req.stage = "Request Cancelled";
req.comments = input.reason;
req.update();
var gr_approve = new GlideRecord('sysapproval_approver');
gr_approve.addQuery('sysapproval', id);
gr_approve.query();
while (gr_approve.next()) {
gr_approve.state = 'not_required';
gr_approve.comments = "Request has been cancelled by Requester";
gr_approve.update();
}
data.msg = gs.getMessage("This ticket has been successfully cancelled.");
} else {
if (gs.getProperty("mars.idm.cancel.exceptions", "").indexOf(req.cat_item) >= 0 && req.approval != "approved") {
req.state = 4;
req.u_cancelled = 2;
req.stage = "Request Cancelled";
req.comments = input.reason;
req.update();
data.msg = gs.getMessage("This ticket has been successfully cancelled.");
}
}
}
}
function canCancelReq(id) {
var invalid_states = ['7', '3', '4'];
var valid_stages = ['waiting_for_approval', 'waiting_for_manager_approve', 'waiting_for_service_manager_approve', 'waiting_for_team_lead_approve', 'waiting_for_it_security_approve', ' approval', 'CIO Approval', 'Dept. Head Approval'];
var userId = gs.getUserID();
var req = $sp.getRecord();
//if we have a record
if (req) {
var state = req.getValue('state');
var cancelled = req.getValue('u_cancelled');
var stage = req.getValue('stage');
//and it belongs to the user
if (req.request.requested_for == userId || req.opened_by == userId) {
//and it isn't already cancelled or being worked
//if (cancelled != 1 && cancelled != 2 && invalid_states.indexOf(state) == -1)
if (cancelled != 1 && cancelled != 2 && valid_stages.indexOf(stage) != -1){
return true;
}
}
//check delegates
if (gs.getUserID() != req.request.requested_for && gs.getUserID() != req.opened_by) {
var delUtil = new global.MarsDelegateUtil();
var check = delUtil.checkIfActiveDelegate(req.request.requested_for, gs.getUserID());
if (!check && req.request.requested_for != req.opened_by) {
check = delUtil.checkIfActiveDelegate(req.opened_by, gs.getUserID());
}
if (check) {
//isn't already cancelled or being worked
if (cancelled != 1 && cancelled != 2 && invalid_states.indexOf(state) == -1) {
return true;
}
}
}
}
return false;
}
})();
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-14-2023 08:31 AM
Hello @Arjun Reddy Yer
If you want to restrict based on category of the catalog item, you need to dot-walk from cat_item field of the RITM table. use below statement for same:
data.show_cancel_button = data.cancellable_items.indexOf((gr.cat_item.category.toString()) == -1);
Since you are hiding the button for these categories, I updated condition in above script and in html you can add like
ng-show = "c.data.show_cancel_button"
Thank you,
Ali
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-14-2023 08:48 AM - edited 04-17-2023 06:12 AM
As the highlights are the changes done but it's not working for the particular Category of multiple (10) Catalog items. @Vasantharajan N
If I remove the ng-show = "c.data.show_cancel_button" in HTML and replace with ng-if="c.data.show == true && data.cancelled_msg == '' " Cancel Request Button is visible but for all the Catalog items even for the Catalog item which are under the mentioned Category sys_id.
HTML Code:
<div >
<button class="btn btn-danger full-width" ng-click="c.doCancel()" ng-show="c.data.show_cancel_button == true && data.cancelled_msg == '' ">
{{c.data.btn_text}}
</button>
<div ng-if="data.cancelled_msg != '' " class="panel b">
<div class="panel-heading bg-danger mars-danger-heading">
<i class="fa fa-exclamation cancel-icon"></i><span >{{c.data.cancelled_msg}}</span>
</div>
</div>
<div class="cancelled-msg">
</div>
</div>
<script type="text/ng-template" id="popupTemplate" data-backdrop="static" data-keyboard="false">
<div class="panel panel-default" >
<div class="panel-body text-center">
${Are you sure you would like this Ticket Cancelled?}
</div>
<div class="panel-footer text-center">
<button class="btn btn-primary" ng-click="c.closeModal(true)">${Yes}</button>
<button class="btn btn-default" ng-click="c.closeModal(false)">${No}</button>
</div>
</div>
</script>
Server Script:
(function() {
if (!input) {
data.show = false;
data.sys_id = $sp.getParameter('sys_id');
data.type = $sp.getParameter('table');
data.cancelled_msg = '';
var gr = $sp.getRecord();
data.cancellable_item = ["0674da48dbc41110f1795843f396195d", "82e5e14edbe5a090f1795843f39619d9"]; //sys_ids of category for which not to show cancel button
data.show_cancel_button = data.cancellable_items.indexOf((gr.cat_item.category.toString()) == -1);
if (gr.u_cancelled == 1 || gr.u_cancelled == 2) {
data.cancelled_msg = gs.getMessage('A request to cancel this ticket has been submitted.');
if (gr.state == 4) {
data.cancelled_msg = gs.getMessage('This ticket has been closed according to your cancellation request.');
}
}
if (data.type == 'sc_req_item') {
data.btn_text = gs.getMessage('Cancel Request');
data.show = canCancelReq(data.sys_id);
}
} else if (input.action == 'cancel') {
if (input.type == 'sc_req_item') {
cancelReq(input.sys_id);
}
}
function cancelReq(id) {
var req = new GlideRecord('sc_req_item');
if (req.get(id)) {
var sc_task = new GlideRecord('sc_task');
sc_task.addQuery('request_item', id);
sc_task.addActiveQuery();
sc_task.addNotNullQuery('assigned_to');
sc_task.query();
if (!sc_task.hasNext()) {
req.state = 4;
req.u_cancelled = 2;
req.approval = 'cancelled';
req.stage = "Request Cancelled";
req.comments = input.reason;
req.update();
var gr_approve = new GlideRecord('sysapproval_approver');
gr_approve.addQuery('sysapproval', id);
gr_approve.query();
while (gr_approve.next()) {
gr_approve.state = 'not_required';
gr_approve.comments = "Request has been cancelled by Requester";
gr_approve.update();
}
data.msg = gs.getMessage("This ticket has been successfully cancelled.");
} else {
if (gs.getProperty("mars.idm.cancel.exceptions", "").indexOf(req.cat_item) >= 0 && req.approval != "approved") {
req.state = 4;
req.u_cancelled = 2;
req.stage = "Request Cancelled";
req.comments = input.reason;
req.update();
data.msg = gs.getMessage("This ticket has been successfully cancelled.");
}
}
}
}
function canCancelReq(id) {
var invalid_states = ['7', '3', '4'];
var valid_stages = ['waiting_for_approval', 'waiting_for_manager_approve', 'waiting_for_service_manager_approve', 'waiting_for_team_lead_approve', 'waiting_for_it_security_approve', ' approval', 'CIO Approval', 'Dept. Head Approval'];
var userId = gs.getUserID();
var req = $sp.getRecord();
//if we have a record
if (req) {
var state = req.getValue('state');
var cancelled = req.getValue('u_cancelled');
var stage = req.getValue('stage');
//and it belongs to the user
if (req.request.requested_for == userId || req.opened_by == userId) {
//and it isn't already cancelled or being worked
if (cancelled != 1 && cancelled != 2 && valid_stages.indexOf(stage) != -1){
return true;
}
}
//check delegates
if (gs.getUserID() != req.request.requested_for && gs.getUserID() != req.opened_by) {
var delUtil = new global.MarsDelegateUtil();
var check = delUtil.checkIfActiveDelegate(req.request.requested_for, gs.getUserID());
if (!check && req.request.requested_for != req.opened_by) {
check = delUtil.checkIfActiveDelegate(req.opened_by, gs.getUserID());
}
if (check) {
//isn't already cancelled or being worked
if (cancelled != 1 && cancelled != 2 && invalid_states.indexOf(state) == -1) {
return true;
}
}
}
}
return false;
}
})();
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-14-2023 09:21 AM
Hi @Arjun Reddy Yer ,
The idea for this solution is to make it maintenance free. Below is the way I would do it.
1) Create a true/false field on the Catalog Item form [sc_cat_item] called 'Can Cancel'
2) Check Can Cancel for those catalog items which should show cancel button.
3) In the Server Script get the catalog item sys_id from the URL Parameter and create the catalog item object.
var sys_id = $sp.getParameter("sys_id") // get sys_id from URL
var catItem = $sp.getCatalogItem(sys_id); //create a object of catalog item.
data.canCancel = catItem.u_can_cancel; // Store the Can Cancel value of the catalog item.
3) In HTML code for Cancel Request button element , add directive ng-show = "data.canCancel"
This will hide the Cancel Request button for the catalog item on which Can Cancel checkbox is checked, for rest all the catalog items it will be hidden.
Please hit the thumbs up button below and mark it as correct if it helps you!!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-16-2023 06:33 PM
If I want to retrict for a particular Category which contains Catalog items
For example under Hardware Category there are mutliple (15) Catalog items for those Catalog items Cancel Button should be visible.
For Software Category which contains multiple (20) Catalog items Cancel Button should be hide.
For IT Support Category which contains multiple (30) Cancel Button must be visible.
1) Create a true/false field on the Catalog Item form [sc_cat_item] called 'Can Cancel' (if I have more than 20 Catalog Items it's complicated to create field on every catalog item)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-18-2023 02:19 AM
If I want to retrict for a particular Category which contains Catalog items
For example under Hardware Category there are mutliple (15) Catalog items for those Catalog items Cancel Button should be visible.
For Software Category which contains multiple (20) Catalog items Cancel Button should be hide.
For IT Support Category which contains multiple (30) Cancel Button must be visible.
1) Create a true/false field on the Catalog Item form [sc_cat_item] called 'Can Cancel' (if I have more than 20 Catalog Items it's complicated to create field on every catalog item)
