Require attachment for catalog item in Service Portal
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎10-31-2016 10:04 AM
We are preparing to make Service Portal live and going through our service catalog items to make sure everything works ok. One challenge we have is being able to require an attachment before submission. We want to do this always for some forms and conditionally on others. We were using one solution that relied on the DOM but we know that functionality is restricted in the Service Portal. I have seen some solutions but I wanted something simpler that required fewer modifications of OOB code or widgets and would be flexible and easy to reuse. What I came up with is not a perfect solution but it works for now.
We have a global UI Script with reusable functions for catalog items. It prevents having to maintain functions in multiple places and makes them available for all catalog items. Lets name this global UI Script GlobalCatalogItemFunctions. This script needs to be included in your Service Portal via the Theme. Go to Service Portal > Portals and select your portal. Then click the reference icon next to the Theme field to go to its record. There is a related list called JS Includes. Create a new one (Source: UI Script) and set the UI Script to GlobalCatalogItemFunctions. You can set the display name to that as well. Save. The functions in the UI Script will now be available for use in Catalog client scripts. This is the function I am using for getting the attachment count:
UI Script: GlobalCatalogItemFunctions
function getSCAttachmentCount() {
var length;
try {
length = angular.element("#sc_cat_item").scope().attachments.length;
} catch(e) {
length = -1;
}
return length;
}
This is an onSubmit script I am using for a catalog item:
function onSubmit() {
try { //Works in non-portal ui
var attachments = document.getElementById('header_attachment_list_label');
if (attachments.style.visibility == 'hidden' || attachments.style.display == 'none' ) {
alert('You must attach the completed form before submitting this request.');
return false;
}
} catch(e) { //For Service Portal
var count = getSCAttachmentCount();
if(count <= 0) {
alert('You must attach the completed form before submitting this request.');
return false;
}
}
}
Notice in the onSubmit script I used a try/catch block and the first part works in the full UI but not in the Service Portal. In the portal, the document.getElementById... part will not work, but our catch statement performs the method that will work in the portal by calling the getSCAttachmentCount() function which is in our included ui script. That function accesses the angular scope of the catalog item which has an array of the attachments. We just want the count so we use the length attribute. There's no guarantee this will work in the future but for now it will get the job done. It would be nice if there were a function to get attachment information out-of-the-box.
For reference:
Is it possible to require a user to add an attachment before submitting a catalog item?
Catalog service making Mandatory Attachment both application and SP
Service Portal UI Script or Reusable functions in Client Scripts
- Labels:
-
Service Catalog
- 49,079 Views

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎12-17-2018 10:36 AM
I'm not on London at all (Kingston, Patch 7, I think, too lazy to go look, but either 7 or 9). So it's definitely more widespread. Please ensure that you also didn't order just one item, you need to order 2 or more items when using order guide.
Please consider marking my reply as Helpful and/or Accept Solution, if applicable. Thanks!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎12-17-2018 12:10 PM
Yeah, definitely occurs on 2 or more items using the newest version (I don't know when it changed - Kingston or London) of the OOTB Order Guide widget.
I tried this solution as well and no difference:
https://snprotips.com/blog/2017/11/5/a-better-way-to-check-for-attachments-including-service-portal

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎12-17-2018 01:37 PM
What we've done is just placed disclaimers on the form, like if they select the scenario where the attachment is mandatory (for us it's when it's an external or federal user) a macro variable shows a widget which is just a link to the form and a blurb telling them it's mandatory and if they don't submit it their request will be delayed and then I have an onSubmit on the order guide to then trigger an alert while it switches over to the included items and their tabs/pages that reminds them again to attach the file...
The best we can do at this point...
Please consider marking my reply as Helpful and/or Accept Solution, if applicable. Thanks!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎12-14-2018 11:50 AM
Any luck in here? I'm on the same boat too.
Mandatory attachment check is not working on order guides on service portal, keep asking for the attachments over and over and not letting to proceed further.Any help on here is greatly appreciated.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎10-08-2019 10:57 AM
I was able to get this working by making the following adjustments in the scripts:
Add another function in the GlobalCatalogItemFunctions UI Script:
function getSCItemAttachmentCount(item_id) { //Will work for Order Guides, need to pass in the catalog item sysid
var length;
try {
length = angular.element("#item_details_" + item_id).scope().item.attachments.length;
} catch(e) {
length = -1;
}
return length;
}
In your Catalog Client Script, modify the script from the original one to use the new function and pass in the sysid of the catalog item that you want this to work on.
} catch(e) { //For Service Portal
var count = getSCItemAttachmentCount(dd618729db98dbc01dcaf3231f961977); //replace with your catalog item sysid
if(count <= 0) {
alert('You must attach the completed form before submitting this request.');
return false;
}