Redirect to Service Catalog Item?

Edwin Fuller
Tera Guru

I have a custom table that I'm trying to get linked so that users can create a Service Catalog Item and have it linked to the item within my custom table. I've created a ui action that opens a dialog window and displays all of the catalog items. When the users click okay after selecting the catalog item it should direct them to that catalog item to continue filling out the form. Can someone help me debug the issue of it not redirecting to the catalog item after it is selected?

I've created a UI Action called "Create Request"

function connectusCreateRequest(){

//Initialize and open the dialog

var dialog = new GlideDialogWindow("cu_get_connectus_catalog_item"); //Instantiate the dialog containing the UI Page 'cu_get_connectus_catalog_item_dialog'

dialog.setTitle("Choose a Catalog Item"); //Set the dialog title

dialog.render(); //Open the dialog

}

_________________________________________________________________________________________

I've created a UI Page called "cu_get_connectus_catalog_item"

Client Script within UI Page:

function validateCatItem() {

    //This script is called when the user clicks "OK" in the dialog window

    //Make sure there are comments to submit

    var cat_item_id = gel("cat_item_id").value;

    cat_item_id = trim(cat_item_id);

    if (cat_item_id == "") {

          //If comments are empty, alert the user and stop submission

          alert("Please select a Catalog Item before submitting.");

          return false;

    }

    //If there are comments, close the dialog window and submit them

    GlideDialogWindow.get().destroy(); //Close the dialog window

    g_form.setValue("catalog_item", cat_item_id); //Set the "Catalog Item" field with Catalog Item in the dialog

    g_form.setValue('category', 'operational');

    g_form.setValue('type', 'Service Request');

var page = g_form.getUniqueValue();

g_form.save();

// current.update();

   

      var url = "catalog_home.do?sysparm_view=catalog_default&sysparm_processing_hint=setfield:request.parent=";

      url += page;

   

          action.setRedirectURL(url);

return true;

}

HTML within UI Page:

<?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:ui_form>

  <!-- Set up form fields and labels -->

  <table width="100%">

<tr id="description_row" valign="top">

<td colspan="2">

  <!-- Short description value used as a label -->

  Select a Catalog Item

</td>

</tr>

<tr>

  <td>

<!-- Comments text field (Contains comments from originating record as a default) -->

<!-- <g:ui_multiline_input_field name="dialog_comments" id="dialog_comments" label="Additional comments"

value="${jvar_comments_text}" mandatory="true" /> -->

  <g:ui_reference name="cat_item_id" id="cat_item_id" table="sc_cat_item" query="sc_catalogsLIKE71f876376fd242002ae02762be3ee477^sys_class_name!=sc_cat_item_content^ORsys_class_name=NULL^active=true"/>

  <!-- completer="AJAXTableCompleter" columns="" -->

  </td>

</tr>

<tr>

  <td colspan="2">

  </td>

</tr>

<tr id="dialog_buttons">

<td colspan="2" align="right">

  <!-- Add OK/Cancel buttons. Clicking OK calls the validateComments script -->

  <g:dialog_buttons_ok_cancel ok="return validateCatItem()" ok_type="button" cancel_type="button" />

</td>

</tr>

</table>

</g:ui_form>

</j:jelly>

___________________________________________________________

I've created a Business Rule that runs after insert and update

function onAfter(current, previous) {

//This function will be automatically called when this rule is processed.

var number = current.number;

var reqFor = current.requested_for;

var location = current.requested_for.location;

var reqBy = current.requested_by;

var reqItem = current.catalog_item;

var shortDescription = current.shortdescription;

var businessCase = shortDescription + '\n' + current.business_case+ '\n\n' + 'Created from Demand: '+number;

var comments = "DEMAND_REF:"+current.sys_id+" "+businessCase;

var deadline = current.requested_delivery_date;

var desc = shortDescription + '\n' + current.description;

getCart();

var url = 'com.glideapp.servicecatalog_cat_item_view.do?sysparm_id=' + reqItem + '&sysparm_user=' + reqFor + '&sysparm_requested_by=' + reqBy + '&sysparm_stnd_req_add_info=' + GlideStringUtil.urlEncode(desc) + '&sysparm_comments=' + comments;

action.setRedirectURL(url);

//Close out demand

var grCU = new GlideRecord('x_hemas_connectus2_x_hemas_connectus_connectus');

grCU.get(current.sys_id);

grCU.current_status = 'Complete';

grCU.update();

function getCart() {

var cart = new GlideRecord('sc_cart');

var userid = gs.getUserID();

cart.addQuery('user', userid);

cart.query();

if (cart.next()) {

// We already have a cart so override the requested for value and empty it

cart.requested_for = reqFor;

cart.special_instructions = comments;

cart.delivery_address = getDeliveryAddress();

cart.update();

var cartItems = new GlideRecord('sc_cart_item');

cartItems.addQuery('cart', cart.sys_id);

cartItems.deleteMultiple();

} else {

cart.initialize();

cart.user = userid;

cart.requested_for = reqFor;

cart.special_instructions = comments;

cart.delivery_address = getDeliveryAddress();

cart.insert();

}

return cart;

}

function getDeliveryAddress() {

var gr = new GlideRecord('cmn_location');

if (!gr.get(location))

return '';

var text = '';

if (!gr.street.nil())

text = gr.street + '\n';

if (!gr.city.nil() && !gr.state.nil() && !gr.zip.nil())

text += gr.city + ", " + gr.state + ", " + gr.zip;

return text;

}

}

1 ACCEPTED SOLUTION

Hi Edwin,



So it means the url you are forming is incorrect. here is the url you can try and test.



If I am correct you want to redirect user to the form which comes after you do Try it and user can populate values in the catalog variables.



Considering the page variable has the sys_id of the catalog item here is the URL



var url = '/com.glideapp.servicecatalog_cat_item_view.do?v=1&sysparm_id=' + page;


window.open(url,'_blank');



Mark Correct if this solves your issue and also hit Like and Helpful if you find my response worthy based on the impact.


Thanks


Ankur


Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

View solution in original post

11 REPLIES 11

That did not work as it redirected me to the Service Catalog to select a catalog item. It should direct me to the catalog item form for the item that was selected.


Hi Edwin,



So it means the url you are forming is incorrect. here is the url you can try and test.



If I am correct you want to redirect user to the form which comes after you do Try it and user can populate values in the catalog variables.



Considering the page variable has the sys_id of the catalog item here is the URL



var url = '/com.glideapp.servicecatalog_cat_item_view.do?v=1&sysparm_id=' + page;


window.open(url,'_blank');



Mark Correct if this solves your issue and also hit Like and Helpful if you find my response worthy based on the impact.


Thanks


Ankur


Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

Hi Edwin,



Any update on this? Whether it is redirecting correctly to the catalog item where users can populate the variables.



Regards


Ankur


Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

Thanks, it is redirecting me but I'm now receiving an "Not authorized" message. So I'm trying to see why


Hi Edwin,



Can you check the user criteria for that catalog item or there could be some ACL which must be blocking that user from viewing the catalog item.



Regards


Ankur


Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader