CINXE.COM

Holds - Ex Libris Knowledge Center

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Holds - Ex Libris Knowledge Center</title> <link media="screen" type="text/css" rel="stylesheet" href="https://a.mtstatic.com/@cache/layout/legacy.css?_=1c6e5335262a3ffc24330cae7682e888_a25vd2xlZGdlLmV4bGlicmlzZ3JvdXAuY29t:site_11811" id="mt-screen-css" /> <link media="print" type="text/css" rel="stylesheet" href="https://a.mtstatic.com/@cache/layout/print.css?_=74da50b083ed4c34ded1735ad5633eb0:site_11811" id="mt-print-css" /> <script type="text/javascript" nonce="73033655d2c50314b586e68a7c4a0df04d19bf19915ff0216051362b3f694491" src="https://a.mtstatic.com/deki/javascript/out/grape.min.js?_=fc2e0109a2f74c33d578191198f4d7fda8b018c1:site_11811"></script><script type="application/json" id="mt-global-settings" nonce="73033655d2c50314b586e68a7c4a0df04d19bf19915ff0216051362b3f694491">{"apiToken":"xhr_2_1741678670_9f0c0cea77fd2c96b492844570b30c847fe7406aa95e2d9cd4ce7f3db640bb03","pageId":79826,"pageViewId":"e6981589-8881-4211-bf5a-c5881ebbd5e7"}</script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick.min.css" integrity="sha256-jySGIHdxeqZZvJ9SHgPNjbsBP8roij7/WjgkoGTJICk=" crossorigin="anonymous"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick-theme.min.css" integrity="sha256-WmhCJ8Hu9ZnPRdh14PkGpz4PskespJwN5wwaFOfvgY8=" crossorigin="anonymous"> <script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick.min.js" integrity="sha256-4Cr335oZDYg4Di3OwgUOyqSTri0jUm2+7Gf2kH3zp1I=" crossorigin="anonymous"></script> <script type="text/javascript">/*<![CDATA[*/ var stIsIE = /*@cc_on!@*/false; sorttable = { init: function() { // quit if this function has already been called if (arguments.callee.done) return; // flag this function so we don't do the same thing twice arguments.callee.done = true; // kill the timer if (_timer) clearInterval(_timer); if (!document.createElement || !document.getElementsByTagName) return; sorttable.DATE_RE = /^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/; forEach(document.getElementsByTagName('table'), function(table) { if (table.className.search(/\bsortable\b/) != -1) { sorttable.makeSortable(table); } }); }, makeSortable: function(table) { if (table.getElementsByTagName('thead').length == 0) { // table doesn't have a tHead. Since it should have, create one and // put the first table row in it. the = document.createElement('thead'); the.appendChild(table.rows[0]); table.insertBefore(the,table.firstChild); } // Safari doesn't support table.tHead, sigh if (table.tHead == null) table.tHead = table.getElementsByTagName('thead')[0]; if (table.tHead.rows.length != 1) return; // can't cope with two header rows // Sorttable v1 put rows with a class of "sortbottom" at the bottom (as // "total" rows, for example). This is B&R, since what you're supposed // to do is put them in a tfoot. So, if there are sortbottom rows, // for backwards compatibility, move them to tfoot (creating it if needed). sortbottomrows = []; for (var i=0; i<table.rows.length; i++) { if (table.rows[i].className.search(/\bsortbottom\b/) != -1) { sortbottomrows[sortbottomrows.length] = table.rows[i]; } } if (sortbottomrows) { if (table.tFoot == null) { // table doesn't have a tfoot. Create one. tfo = document.createElement('tfoot'); table.appendChild(tfo); } for (var i=0; i<sortbottomrows.length; i++) { tfo.appendChild(sortbottomrows[i]); } delete sortbottomrows; } // work through each column and calculate its type headrow = table.tHead.rows[0].cells; for (var i=0; i<headrow.length; i++) { // manually override the type with a sorttable_type attribute if (!headrow[i].className.match(/\bsorttable_nosort\b/)) { // skip this col mtch = headrow[i].className.match(/\bsorttable_([a-z0-9]+)\b/); if (mtch) { override = mtch[1]; } if (mtch && typeof sorttable["sort_"+override] == 'function') { headrow[i].sorttable_sortfunction = sorttable["sort_"+override]; } else { headrow[i].sorttable_sortfunction = sorttable.guessType(table,i); } // make it clickable to sort headrow[i].sorttable_columnindex = i; headrow[i].sorttable_tbody = table.tBodies[0]; dean_addEvent(headrow[i],"click", sorttable.innerSortFunction = function(e) { if (this.className.search(/\bsorttable_sorted\b/) != -1) { // if we're already sorted by this column, just // reverse the table, which is quicker sorttable.reverse(this.sorttable_tbody); this.className = this.className.replace('sorttable_sorted', 'sorttable_sorted_reverse'); this.removeChild(document.getElementById('sorttable_sortfwdind')); sortrevind = document.createElement('span'); sortrevind.id = "sorttable_sortrevind"; sortrevind.innerHTML = stIsIE ? '&nbsp<font face="webdings">5' : '&nbsp;&#x25B4;'; this.appendChild(sortrevind); return; } if (this.className.search(/\bsorttable_sorted_reverse\b/) != -1) { // if we're already sorted by this column in reverse, just // re-reverse the table, which is quicker sorttable.reverse(this.sorttable_tbody); this.className = this.className.replace('sorttable_sorted_reverse', 'sorttable_sorted'); this.removeChild(document.getElementById('sorttable_sortrevind')); sortfwdind = document.createElement('span'); sortfwdind.id = "sorttable_sortfwdind"; sortfwdind.innerHTML = stIsIE ? '&nbsp<font face="webdings">6' : '&nbsp;&#x25BE;'; this.appendChild(sortfwdind); return; } // remove sorttable_sorted classes theadrow = this.parentNode; forEach(theadrow.childNodes, function(cell) { if (cell.nodeType == 1) { // an element cell.className = cell.className.replace('sorttable_sorted_reverse',''); cell.className = cell.className.replace('sorttable_sorted',''); } }); sortfwdind = document.getElementById('sorttable_sortfwdind'); if (sortfwdind) { sortfwdind.parentNode.removeChild(sortfwdind); } sortrevind = document.getElementById('sorttable_sortrevind'); if (sortrevind) { sortrevind.parentNode.removeChild(sortrevind); } this.className += ' sorttable_sorted'; sortfwdind = document.createElement('span'); sortfwdind.id = "sorttable_sortfwdind"; sortfwdind.innerHTML = stIsIE ? '&nbsp<font face="webdings">6' : '&nbsp;&#x25BE;'; this.appendChild(sortfwdind); // build an array to sort. This is a Schwartzian transform thing, // i.e., we "decorate" each row with the actual sort key, // sort based on the sort keys, and then put the rows back in order // which is a lot faster because you only do getInnerText once per row row_array = []; col = this.sorttable_columnindex; rows = this.sorttable_tbody.rows; for (var j=0; j<rows.length; j++) { row_array[row_array.length] = [sorttable.getInnerText(rows[j].cells[col]), rows[j]]; } /* If you want a stable sort, uncomment the following line */ //sorttable.shaker_sort(row_array, this.sorttable_sortfunction); /* and comment out this one */ row_array.sort(this.sorttable_sortfunction); tb = this.sorttable_tbody; for (var j=0; j<row_array.length; j++) { tb.appendChild(row_array[j][1]); } delete row_array; }); } } }, guessType: function(table, column) { // guess the type of a column based on its first non-blank row sortfn = sorttable.sort_alpha; for (var i=0; i<table.tBodies[0].rows.length; i++) { text = sorttable.getInnerText(table.tBodies[0].rows[i].cells[column]); if (text != '') { if (text.match(/^-?[&Acirc;&pound;$&Acirc;&curren;]?[\d,.]+%?$/)) { return sorttable.sort_numeric; } // check for a date: dd/mm/yyyy or dd/mm/yy // can have / or . or - as separator // can be mm/dd as well possdate = text.match(sorttable.DATE_RE) if (possdate) { // looks like a date first = parseInt(possdate[1]); second = parseInt(possdate[2]); if (first > 12) { // definitely dd/mm return sorttable.sort_ddmm; } else if (second > 12) { return sorttable.sort_mmdd; } else { // looks like a date, but we can't tell which, so assume // that it's dd/mm (English imperialism!) and keep looking sortfn = sorttable.sort_ddmm; } } } } return sortfn; }, getInnerText: function(node) { // gets the text we want to use for sorting for a cell. // strips leading and trailing whitespace. // this is *not* a generic getInnerText function; it's special to sorttable. // for example, you can override the cell text with a customkey attribute. // it also gets .value for <input> fields. if (!node) return ""; hasInputs = (typeof node.getElementsByTagName == 'function') && node.getElementsByTagName('input').length; if (node.getAttribute("sorttable_customkey") != null) { return node.getAttribute("sorttable_customkey"); } else if (typeof node.textContent != 'undefined' && !hasInputs) { return node.textContent.replace(/^\s+|\s+$/g, ''); } else if (typeof node.innerText != 'undefined' && !hasInputs) { return node.innerText.replace(/^\s+|\s+$/g, ''); } else if (typeof node.text != 'undefined' && !hasInputs) { return node.text.replace(/^\s+|\s+$/g, ''); } else { switch (node.nodeType) { case 3: if (node.nodeName.toLowerCase() == 'input') { return node.value.replace(/^\s+|\s+$/g, ''); } case 4: return node.nodeValue.replace(/^\s+|\s+$/g, ''); break; case 1: case 11: var innerText = ''; for (var i = 0; i < node.childNodes.length; i++) { innerText += sorttable.getInnerText(node.childNodes[i]); } return innerText.replace(/^\s+|\s+$/g, ''); break; default: return ''; } } }, reverse: function(tbody) { // reverse the rows in a tbody newrows = []; for (var i=0; i<tbody.rows.length; i++) { newrows[newrows.length] = tbody.rows[i]; } for (var i=newrows.length-1; i>=0; i--) { tbody.appendChild(newrows[i]); } delete newrows; }, /* sort functions each sort function takes two parameters, a and b you are comparing a[0] and b[0] */ sort_numeric: function(a,b) { aa = parseFloat(a[0].replace(/[^0-9.-]/g,'')); if (isNaN(aa)) aa = 0; bb = parseFloat(b[0].replace(/[^0-9.-]/g,'')); if (isNaN(bb)) bb = 0; return aa-bb; }, sort_alpha: function(a,b) { if (a[0]==b[0]) return 0; if (a[0]<b[0]) return -1; return 1; }, sort_ddmm: function(a,b) { mtch = a[0].match(sorttable.DATE_RE); y = mtch[3]; m = mtch[2]; d = mtch[1]; if (m.length == 1) m = '0'+m; if (d.length == 1) d = '0'+d; dt1 = y+m+d; mtch = b[0].match(sorttable.DATE_RE); y = mtch[3]; m = mtch[2]; d = mtch[1]; if (m.length == 1) m = '0'+m; if (d.length == 1) d = '0'+d; dt2 = y+m+d; if (dt1==dt2) return 0; if (dt1<dt2) return -1; return 1; }, sort_mmdd: function(a,b) { mtch = a[0].match(sorttable.DATE_RE); y = mtch[3]; d = mtch[2]; m = mtch[1]; if (m.length == 1) m = '0'+m; if (d.length == 1) d = '0'+d; dt1 = y+m+d; mtch = b[0].match(sorttable.DATE_RE); y = mtch[3]; d = mtch[2]; m = mtch[1]; if (m.length == 1) m = '0'+m; if (d.length == 1) d = '0'+d; dt2 = y+m+d; if (dt1==dt2) return 0; if (dt1<dt2) return -1; return 1; }, shaker_sort: function(list, comp_func) { // A stable sort function to allow multi-level sorting of data // see: http://en.wikipedia.org/wiki/Cocktail_sort // thanks to Joseph Nahmias var b = 0; var t = list.length - 1; var swap = true; while(swap) { swap = false; for(var i = b; i < t; ++i) { if ( comp_func(list[i], list[i+1]) > 0 ) { var q = list[i]; list[i] = list[i+1]; list[i+1] = q; swap = true; } } // for t--; if (!swap) break; for(var i = t; i > b; --i) { if ( comp_func(list[i], list[i-1]) < 0 ) { var q = list[i]; list[i] = list[i-1]; list[i-1] = q; swap = true; } } // for b++; } // while(swap) } } /* ****************************************************************** Supporting functions: bundled here to avoid depending on a library ****************************************************************** */ // Dean Edwards/Matthias Miller/John Resig /* for Mozilla/Opera9 */ if (document.addEventListener) { document.addEventListener("DOMContentLoaded", sorttable.init, false); } /* for Internet Explorer */ /*@cc_on @*/ /*@if (@_win32) document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>"); var script = document.getElementById("__ie_onload"); script.onreadystatechange = function() { if (this.readyState == "complete") { sorttable.init(); // call the onload handler } }; /*@end @*/ /* for Safari */ if (/WebKit/i.test(navigator.userAgent)) { // sniff var _timer = setInterval(function() { if (/loaded|complete/.test(document.readyState)) { sorttable.init(); // call the onload handler } }, 10); } /* for other browsers */ window.onload = sorttable.init; // written by Dean Edwards, 2005 // with input from Tino Zijdel, Matthias Miller, Diego Perini // http://dean.edwards.name/weblog/2005/10/add-event/ function dean_addEvent(element, type, handler) { if (element.addEventListener) { element.addEventListener(type, handler, false); } else { // assign each event handler a unique ID if (!handler.$$guid) handler.$$guid = dean_addEvent.guid++; // create a hash table of event types for the element if (!element.events) element.events = {}; // create a hash table of event handlers for each element/event pair var handlers = element.events[type]; if (!handlers) { handlers = element.events[type] = {}; // store the existing event handler (if there is one) if (element["on" + type]) { handlers[0] = element["on" + type]; } } // store the event handler in the hash table handlers[handler.$$guid] = handler; // assign a global event handler to do all the work element["on" + type] = handleEvent; } }; // a counter used to create unique IDs dean_addEvent.guid = 1; function removeEvent(element, type, handler) { if (element.removeEventListener) { element.removeEventListener(type, handler, false); } else { // delete the event handler from the hash table if (element.events && element.events[type]) { delete element.events[type][handler.$$guid]; } } }; function handleEvent(event) { var returnValue = true; // grab the event object (IE uses a global event object) event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event); // get a reference to the hash table of event handlers var handlers = this.events[event.type]; // execute each event handler for (var i in handlers) { this.$$handleEvent = handlers[i]; if (this.$$handleEvent(event) === false) { returnValue = false; } } return returnValue; }; function fixEvent(event) { // add W3C standard event methods event.preventDefault = fixEvent.preventDefault; event.stopPropagation = fixEvent.stopPropagation; return event; }; fixEvent.preventDefault = function() { this.returnValue = false; }; fixEvent.stopPropagation = function() { this.cancelBubble = true; } // Dean's forEach: http://dean.edwards.name/base/forEach.js /* forEach, version 1.0 Copyright 2006, Dean Edwards License: http://www.opensource.org/licenses/mit-license.php */ // array-like enumeration if (!Array.forEach) { // mozilla already supports this Array.forEach = function(array, block, context) { for (var i = 0; i < array.length; i++) { block.call(context, array[i], i, array); } }; } // generic enumeration Function.prototype.forEach = function(object, block, context) { for (var key in object) { if (typeof this.prototype[key] == "undefined") { block.call(context, object[key], key, object); } } }; // character enumeration String.forEach = function(string, block, context) { Array.forEach(string.split(""), function(chr, index) { block.call(context, chr, index, string); }); }; // globally resolve forEach enumeration var forEach = function(object, block, context) { if (object) { var resolve = Object; // default if (object instanceof Function) { // functions have a "length" property resolve = Function; } else if (object.forEach instanceof Function) { // the object implements a custom forEach method so use that object.forEach(block, context); return; } else if (typeof object == "string") { // the object is a string resolve = String; } else if (typeof object.length == "number") { // the object is array-like resolve = Array; } resolve.forEach(object, block, context); } }; sorttable.sort_alpha = function(a,b) { return a[0].localeCompare(b[0]); } /*]]>*/</script> <!-- Google Tag Manager --> <script>/*<![CDATA[*/(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-KXCRM3P');/*]]>*/</script> <!-- End Google Tag Manager --> <!-- OneTrust Cookies Consent Notice start for knowledge.exlibrisgroup.com --> <script src="https://cdn.cookielaw.org/scripttemplates/otSDKStub.js" type="text/javascript" charset="UTF-8" data-domain-script="7286c7d4-44c2-4d10-b708-69445acbcc6a"></script> <script type="text/javascript">/*<![CDATA[*/ function OptanonWrapper() { } /*]]>*/</script> <!-- OneTrust Cookies Consent Notice end for knowledge.exlibrisgroup.com --> <!--temp baidu indexing token--> <script type="text/javascript" nonce="73033655d2c50314b586e68a7c4a0df04d19bf19915ff0216051362b3f694491">(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');ga('create','UA-71378210-1','knowledge.exlibrisgroup.com',{allowLinker:true});ga('send','pageview');ga('create','UA-65721316-17','knowledge.exlibrisgroup.com',{name:'mtTracker',allowLinker:true});ga('mtTracker.require','linker');ga('mtTracker.set', 'anonymizeIp', true);ga('mtTracker.send','pageview');document.addEventListener('mindtouch-web-widget:f1:loaded',function(e){var t=e.data||{},d=t.widget;d&&''!==t.embedId&&document.addEventListener('mindtouch-web-widget:f1:clicked',function(e){var t=(e.data||{}).href;if(t){var n=document.createElement('a');n.setAttribute('href',t),'expert-help.nice.com'===n.hostname&&(e.preventDefault(),ga('linker:decorate',n),d.open(n.href))}})});</script> </head> <body class="columbia-page-main columbia-article-topic columbia-breadcrumb-home-campusm-productdocumentation-managingproductintegrations-holds columbia-live no-touch columbia-lang-en-us columbia-skin-grape"> <div class="grape-messaging"> </div> <div class="grape-header-custom"><div class="elm-nav-container"><div class="elm-header-logo-container"><a title="ExLibris" href="https://knowledge.exlibrisgroup.com/" rel="internal"><img alt="ExLibris" class="internal" loading="lazy" src="https://knowledge.exlibrisgroup.com/@api/deki/files/124993/ckclogonew.png?revision=1" /></a><div class="header-navigation-buttons"><div class="more-sites-container ex-dropdown"><select class="more-sites"><option value="">More Sites</option><option value="/Redirect_Corp">Exlibris Site</option><option value="http://support.proquest.com/">Support Center</option><option value="https://trust.exlibrisgroup.com/">ExLibris Trust Center</option><option value="/pageForRedirect?source=DeveloperNetwork2">Developer Network</option><option value="http://ideas.exlibrisgroup.com/">Idea Exchange</option></select></div><a href="https://status.exlibrisgroup.com/system_status" target="_blank" rel="external noopener nofollow" class="link-https"><button class="system-status-container btn-margin">System-Status</button></a><button class="submit-case">Submit a Case</button></div></div></div> <script type="text/javascript">/*<![CDATA[*/ $(function() { // MORE SITES DROPDOWN $("select.more-sites").on("click", function() { var val = $(this).val(); if (val != "") { $(this).prop("selectedIndex", 0); window.open(val, "_blank"); } }); // SYSTEM STATUS DROPDOWN $("select.system-status").on("click", function() { var val = $(this).val(); ga('send', 'event', { eventCategory: 'systemStatus', eventAction: 'systemStatusClick', eventLabel: 'systemStatus' }); if (val != "") { $(this).prop("selectedIndex", 0); window.open(val, "_blank"); } }); // SUBMIT A CASE BUTTON $(".submit-case").on("click", function() { window.open("https://support.proquest.com/s/submit-a-case", "_blank"); }); });/*]]>*/</script> <script type="text/javascript">/*<![CDATA[*/ $(function() { var toc_container = $("#mt-toc-container"); if (toc_container.is(":visible")) { // make the contents of the TOC container visible by default $("button.mt-toggle", toc_container) .removeClass("mt-toggle-expand") .addClass("mt-toggle-collapse"); $(".mt-toc-content").show(); } }); /*]]>*/</script> <script type="text/javascript">/*<![CDATA[*/ $(function() { var pagenavigation = $(".elm-meta-article-navigation"); if (pagenavigation.length) { var content_container = $("section.mt-content-container"); pagenavigation.clone().insertBefore(content_container).addClass("article-top-navigation"); } }); /*]]>*/</script> <script type="text/javascript">/*<![CDATA[*/ $(function() { var email_subject = "Interesting article from the Exlibris Knowledge Center"; var body_text = "You may be interested in this resource from the Ex Libris Knowledge Center:"; var current_page = window.location.href; var meta_icons = $("ol.elm-meta-top"); if (meta_icons.length) { var new_link_container = $("<li></li>", { "class": "elm-page-share" }); var new_link = $("<a></a>", { "href": "mailto:?subject=" + email_subject + "&body=" + body_text + " " + current_page, "title": "Share page by email", "class": "elm-page-share-link" }); var new_icon = $("<span></span>", { "text": "Share page by email", "class": "mt-icon-mail5" }); new_link.append(new_icon); new_link_container.append(new_link); meta_icons.prepend(new_link_container); $("a.elm-page-share-link").on("click", function() { ga('send', 'event', { eventCategory: 'Share', eventAction: 'SharePageByEmail', eventLabel: current_page }); }); } }); /*]]>*/</script> <script type="text/javascript">/*<![CDATA[*/ $(function() { if (!$("body").hasClass("columbia-article-topic")) { var Content = $("section.mt-content-container"); var PDFLink = $("a.SectionPDF", Content); var SocialLink = $(".elm-social-share"); if (PDFLink.length) { var new_link_container = $("<li></li>", { "class": "elm-pdf-download" }); var new_link = $("<a></a>", { "href": PDFLink.attr("href"), "title": "Download PDF" }); var new_icon = $("<span></span>", { "text": "Download PDF", "class": "mt-icon-file-pdf" }); new_link.append(new_icon); new_link_container.append(new_link); new_link_container.insertBefore(SocialLink); PDFLink.closest("div").hide(); } } });/*]]>*/</script> <div id="back-to-top"><a href="#"><span class="mt-icon-arrow-up7"></span></a></div> <script type="text/javascript">/*<![CDATA[*/ $(document).scroll(function() { var pageTop = $(this).scrollTop(); var backToTop = $('#back-to-top'); if (pageTop > 800) { backToTop.fadeIn(); } else { backToTop.fadeOut(); } }); /*]]>*/</script> <script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script> <script type="text/javascript">/*<![CDATA[*/ let firstOpen = true; const chatWindowStateKey = "chatWindowState"; const uniqueIdKey = 'conversationInfoToken'; const uniqueIdKeyExpDate = 'conversationInfoTokenExpDate'; document.addEventListener("DOMContentLoaded", function() { const chatButton = document.getElementById("chat-button"); const chatWindow = document.getElementById("chatBody"); const chatBodyHeadingClose = document.getElementById("chatBodyHeadingClose"); const chatWindowState = localStorage.getItem(chatWindowStateKey); // This is a walkaround to the problem that the HTML editor changes the html after each edit... chatButton.innerHTML = atob("PGRpdiBjbGFzcz0iY2hhdC1idXR0b24tdGV4dCI+S05PV0xFREdFIEFTU0lTVEFOVDwvZGl2Pg0KCQk8c3BhbiBjbGFzcz0iY2hhdC1ib2R5LWhlYWRpbmctdGl0bGUtYmV0YSIgc3R5bGU9IiI+QkVUQTwvc3Bhbj4NCgkJPGRpdiBjbGFzcz0iY2hhdC1idXR0b24taWNvbiI+DQoJCQk8c3ZnIGNsYXNzPSJjaGF0LWJ1dHRvbi1pY29uLXN2ZyIgZmlsbD0iI2ZmZmZmZiIgdmlld2JveD0iMCAwIDE2IDE2Ij4gDQoJCQkJPHBhdGggY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNTYyNyA5LjU5ODIzQzcuNjQxMTMgOS41OTgyMyA1LjI4MTM3IDcuMjI5MTEgNS4yODEzNyA0LjMxNjg2QzUuMjgxMzcgNy4yMjkxMSAyLjkxMjI1IDkuNTk4MjMgMCA5LjU5ODIzQzIuOTEyMjUgOS41OTgyMyA1LjI4MTM3IDExLjk1OCA1LjI4MTM3IDE0Ljg3MDJDNS4yODEzNyAxMS45NTggNy42NDExMyA5LjU5ODIzIDEwLjU2MjcgOS41OTgyM1oiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PC9wYXRoPiANCgkJCQk8cGF0aCBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNS45ODQ4IDEyLjMyMzRDMTQuMzgzNSAxMi4zMjM0IDEzLjA5MTMgMTEuMDIxOCAxMy4wOTEzIDkuNDI5OUMxMy4wOTEzIDExLjAyMTggMTEuNzg5NyAxMi4zMjM0IDEwLjE5NzggMTIuMzIzNEMxMS43ODk3IDEyLjMyMzQgMTMuMDkxMyAxMy42MTU3IDEzLjA5MTMgMTUuMjE2OUMxMy4wOTEzIDEzLjYxNTcgMTQuMzgzNSAxMi4zMjM0IDE1Ljk4NDggMTIuMzIzNFoiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PC9wYXRoPiANCgkJCQk8cGF0aCBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNC4zMTc3IDMuNTIwOTFDMTIuMzcgMy41MjA5MSAxMC43OTY4IDEuOTQ3NzQgMTAuNzk2OCAwQzEwLjc5NjggMS45NDc3NCA5LjIyMzYyIDMuNTIwOTEgNy4yNzU4OCAzLjUyMDkxQzkuMjIzNjIgMy41MjA5MSAxMC43OTY4IDUuMDk0MDkgMTAuNzk2OCA3LjA0MTgzQzEwLjc5NjggNS4wOTQwOSAxMi4zNyAzLjUyMDkxIDE0LjMxNzcgMy41MjA5MVoiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PC9wYXRoPiANCgkJCTwvc3ZnPg0KCQk8L2Rpdj4="); if (chatWindowState === "open") { openFirstChat(); firstOpen = false; chatWindow.style.display = "block"; } // Toggle chat window visibility chatBodyHeadingClose.addEventListener("click", function() { localStorage.setItem(chatWindowStateKey, "closed"); }); // Toggle chat window visibility chatButton.addEventListener("click", function() { if(firstOpen){ openFirstChat(); firstOpen = false; } localStorage.setItem(chatWindowStateKey, "open"); }); }); const store = window.WebChat.createStore({}, ({ dispatch }) => next => action => { if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') { dispatch({ type: 'WEB_CHAT/SEND_EVENT', payload: { name: 'startConversation', value: { language: window.navigator.language } } }); } return next(action); }); const styleOptions = { // Add styleOptions to customize Web Chat canvas hideUploadButton: true, accent: '#00809d', botAvatarBackgroundColor: 'rgba(168,122,224,1)', botAvatarImage: 'https://knowledge.exlibrisgroup.com/@api/deki/files/174178/AI_Icon.png', botAvatarInitials: 'BT', userAvatarBackgroundColor: 'rgb(132 119 230)', userAvatarImage: 'https://knowledge.exlibrisgroup.com/@api/deki/files/174179/User_icon.png', userAvatarInitials: 'U', rootWidth: '360px', backgroundColor: 'transparent', sendBoxBorderTop: undefined, sendBoxBackground: 'transparent', sendBoxPlaceholderColor: '#424242', bubbleFromUserBackground: '#dae0ff', bubbleFromUserBorderRadius: '12px', bubbleFromUserBorderWidth: '0px', bubbleBorderRadius: '12px', }; // Add your BOT token endpoint below var theURL = "https://default127fa96e00b4429e95f972c2828437.a4.environment.api.powerplatform.com/powervirtualagents/botsbyschema/cr29b_knowledgeAssistantAcademic/directline/token?api-version=2022-03-01-preview"; var environmentEndPoint = theURL.slice(0, theURL.indexOf('/powervirtualagents')); var apiVersion = theURL.slice(theURL.indexOf('api-version')).split('=')[1]; var regionalChannelSettingsURL = `${environmentEndPoint}/powervirtualagents/regionalchannelsettings?api-version=${apiVersion}`; var directline; let conversationInfoStorage = sessionStorage.getItem(uniqueIdKey); let conversationInfoStorageExpDate = sessionStorage.getItem(uniqueIdKeyExpDate); function fetchConverstion() { if (!conversationInfoStorage || !conversationInfoStorageExpDate || (conversationInfoStorageExpDate < (new Date()).getTime())) { fetch(theURL) .then(response => response.json()) .then(conversationInfo => { sessionStorage.setItem(uniqueIdKey, conversationInfo.token); sessionStorage.setItem(uniqueIdKeyExpDate, (new Date()).getTime() + conversationInfo.expires_in * 1000); window.WebChat.renderWebChat({ directLine: window.WebChat.createDirectLine({ domain: `${directline}v3/directline`, token: conversationInfo.token, }), store, styleOptions }, document.getElementById('webchat') ); }) .catch(err => console.error("An error occurred: " + err)); } else { window.WebChat.renderWebChat({ directLine: window.WebChat.createDirectLine({ domain: `${directline}v3/directline`, token: conversationInfoStorage, }), styleOptions }, document.getElementById('webchat') ); } } function openFirstChat(){ fetch(regionalChannelSettingsURL) .then((response) => { return response.json(); }) .then((data) => { directline = data.channelUrlsById.directline; fetchConverstion(); }) .catch(err => console.error("An error occurred: " + err)); }/*]]>*/</script> <p><button id="chat-button" onclick="document.getElementById('chatBody').style.display = 'block'"></button></p> <div class="chat-body" id="chatBody" style="display:none"> <div class="chat-body-heading" id="heading"> <div class="chat-body-heading-title"><svg class="chat-body-heading-title-icon" fill="none" height="25" viewbox="0 0 26 25" width="26"> <path clip-rule="evenodd" d="M17.1645 15.5971C12.4168 15.5971 8.58223 11.7473 8.58223 7.01489C8.58223 11.7473 4.7324 15.5971 0 15.5971C4.7324 15.5971 8.58223 19.4317 8.58223 24.1641C8.58223 19.4317 12.4168 15.5971 17.1645 15.5971Z" fill="url(#paint0_radial_249_166)" fill-rule="evenodd"></path> <path clip-rule="evenodd" d="M25.9747 20.0256C23.3727 20.0256 21.2728 17.9105 21.2728 15.3236C21.2728 17.9105 19.1576 20.0256 16.5708 20.0256C19.1576 20.0256 21.2728 22.1255 21.2728 24.7275C21.2728 22.1255 23.3727 20.0256 25.9747 20.0256Z" fill="url(#paint1_radial_249_166)" fill-rule="evenodd"></path> <path clip-rule="evenodd" d="M23.2662 5.72148C20.1011 5.72148 17.5447 3.16508 17.5447 0C17.5447 3.16508 14.9883 5.72148 11.8232 5.72148C14.9883 5.72148 17.5447 8.27789 17.5447 11.443C17.5447 8.27789 20.1011 5.72148 23.2662 5.72148Z" fill="url(#paint2_radial_249_166)" fill-rule="evenodd"></path> <defs> <radialgradient cx="0" cy="0" gradienttransform="translate(10.8437 23.7164) rotate(-90) scale(15.9625 19.6815)" gradientunits="userSpaceOnUse" id="paint0_radial_249_166" r="1"> <stop stop-color="#B175E1"></stop> <stop offset="1" stop-color="#3595F0"></stop> </radialgradient> <radialgradient cx="0" cy="0" gradienttransform="translate(22.5118 24.482) rotate(-90) scale(8.75318 10.7829)" gradientunits="userSpaceOnUse" id="paint1_radial_249_166" r="1"> <stop stop-color="#B175E1"></stop> <stop offset="1" stop-color="#3595F0"></stop> </radialgradient> <radialgradient cx="0" cy="0" gradienttransform="translate(19.0524 11.1442) rotate(-90) scale(10.6511 13.121)" gradientunits="userSpaceOnUse" id="paint2_radial_249_166" r="1"> <stop stop-color="#B175E1"></stop> <stop offset="1" stop-color="#3595F0"></stop> </radialgradient> </defs> </svg> <div mt-section-origin="Template:Copilot_Knowledge_Assistant" class="mt-section"><h1 class="chat-body-heading-title-text editable">Knowledge Assistant</h1> <span class="chat-body-heading-title-beta" style="">BETA</span></div></div> <button aria-label="Close" class="chat-body-heading-close" id="chatBodyHeadingClose" onclick="document.getElementById('chatBody').style.display = 'none'" title="Hide Chat"><svg fill="none" height="25" viewbox="0 0 24 25" width="24"> <mask height="25" id="mask0_358_81" maskunits="userSpaceOnUse" style="mask-type:alpha" width="24" x="0" y="0"> <rect fill="#D9D9D9" height="24" width="24" y="0.360596"></rect> </mask> <g mask="url(#mask0_358_81)"> <path d="M6.4 19.3606L5 17.9606L10.6 12.3606L5 6.7606L6.4 5.3606L12 10.9606L17.6 5.3606L19 6.7606L13.4 12.3606L19 17.9606L17.6 19.3606L12 13.7606L6.4 19.3606Z" fill="#666666"></path> </g> </svg></button></div> <div id="webchat" role="main"> <div role="progressbar" aria-label="Loading..." aria-live="assertive" data-automation-id="PageSpinner" data-testid="PageSpinner" class="fui-Spinner r82apo5"><span class="fui-Spinner__spinner rvgcg50 ___1xxu43e f1d2rq10 f1szoe96 fb52u90"><span class="fui-Spinner__spinnerTail rxov3xa"></span></span></div> </div> </div> <script type="text/javascript">/*<![CDATA[*/ $(function() { var document_path = window.location.pathname.split("/"); var path_depth = document_path.length-1; // the following pages all have one additional level above the 'product page' level var second_level_product_pages = ["Intota", "360_Services"]; // the following pages are the community corner sections which should have icons var second_level_additional_icons = ["Content_Corner"]; if ((path_depth == 1 && document_path[1].length) || (second_level_product_pages.indexOf(document_path[1]) != -1 && path_depth == 2) || (second_level_additional_icons.indexOf(document_path[2]) !== -1 && path_depth ==2)) { $("body").addClass("product-page"); } });/*]]>*/</script> <script type="text/javascript">/*<![CDATA[*/ $(function () { // Only display the product link area when a link exists for the current page var FeaturedTopicsContainer = $(".featured-topics"); // limit appearance to top-level product pages if ( $("body").hasClass("product-page") && $("ul", FeaturedTopicsContainer).length >= 1 ) { var DestinationElement = $(".mt-category-container", "#elm-main-content"); FeaturedTopicsContainer.insertBefore(DestinationElement); } });/*]]>*/</script> <div class="product-link featured-topics"> </div> <script type="text/javascript">/*<![CDATA[*/ $(function () { // Only display the product link area when a link exists for the current page var ProductLinkContainer = $(".product-link"); // limit appearance to top-level product pages if ( $("body").hasClass("product-page") && $("p", ProductLinkContainer).length >= 1 ) { var DestinationElement = $("#elm-main-content"); ProductLinkContainer.appendTo(DestinationElement); } });/*]]>*/</script> <script type="text/javascript">/*<![CDATA[*/ // This function adds a "language-options" class to the ul.sortable-listings container // which enables a class on the first-child li and makes it full width IF the page is // called "Product Documentation" (searched for in the body class) AND there is a title // containing the text "(English)" $(function() { if ( $('body').is('[class*="productdocumentation"]') ) { if ($('a[title*="(English)"]').length) { $('ul.mt-sortable-listings-container').addClass('language-options'); } } }); /*]]>*/</script> <li class="elm-page-rss-feed"><a href="#" title="Subscribe by RSS" class="generate-rss" target="_blank"><span class="mt-icon-rss">Subscribe by RSS</span></a></li> <script type="text/javascript">/*<![CDATA[*/ $(function() { // RSS link icon displayed on the current page var rss_link = $("a.generate-rss"); // address of the MindTouch page that calls the FetchRSS API var generator_address = "/createRSSFeed"; // address of the current page var current_url = window.location.href; // address to redirect user to var rss_address = generator_address + "?pageurl=" + current_url; // if the RSS link icon exists set up the onclick action and relocate the // icon to its desired display position if (rss_link.length) { rss_link.on("click", function(e) { e.preventDefault(); window.open(rss_address, "_blank"); }); $(".elm-page-rss-feed").prependTo(".elm-meta-data.elm-meta-top"); } });/*]]>*/</script> <script type="text/javascript">/*<![CDATA[*/ $(function() { // RSS link icon displayed on the current page var rss_link = $("a.generate-rss"); // address of the MindTouch page that calls the FetchRSS API var generator_address = "/createRSSFeed"; // address of the current page var current_url = window.location.href; // address to redirect user to var rss_address = generator_address + "?pageurl=" + current_url; // if the RSS link icon exists set up the onclick action and relocate the // icon to its desired display position if (rss_link.length) { rss_link.on("click", function(e) { e.preventDefault(); window.open(rss_address, "_blank"); }); $(".elm-page-rss-feed").prependTo(".elm-meta-data.elm-meta-top"); } });/*]]>*/</script> <script type="text/javascript">/*<![CDATA[*/ $(window).load(function() { var DetailedListingAreas = $("body.columbia-article-topic-category").find("dl.mt-listing-detailed"); DetailedListingAreas.each(function() { var Content = $("dd.mt-listing-detailed-subpages", $(this)); // Only make the changes if there are sub-pages to be displayed if ($("li", Content).length) { var Parent = $(this).parent(); /* parent li item */ var Trigger = Parent; var Title = $(".mt-listing-detailed-title", $(this)); var LinkAddress = Title.find("a").attr("href"); // shorten titles of sub-articles if necessary $("li a", Content).each(function() { var children = $(this).children(); var text = $(this).text(); if (text.length > 35) { $(this).text(text.substr(0,32) + "..."); $(this).prepend(children); } }); // create a button linking to the immediate sub-page var AllTopicLink = $("<button />", { class: "ex-listing-all", text: "Show all topics", }).on("click", function() { window.location=LinkAddress; }); var AllTopicLinkContainer = $("<li></li>"); AllTopicLinkContainer.append(AllTopicLink); $("ul", Content).append(AllTopicLinkContainer); // add the mouse actions Trigger.on("mouseenter", function() { Content.fadeIn("fast"); }); Trigger.on("mouseleave", function() { Content.hide(); }); } }); });/*]]>*/</script> <script type="text/javascript">/*<![CDATA[*/ $(window).load(function() { if ($("body").hasClass("columbia-article-topic-guide")) { // remove the next/previous article links from the top of the page // can't be done in CSS although I can't ascertain for what reason $(".elm-meta-article-navigation").hide(); } // only apply this to Guide pages when viewed by non-administrator users if ($("body").hasClass("columbia-article-topic-guide") && !$("body").hasClass("elm-user-pro-edit")) { // hide the regular MT tabs $(".mt-guide-tabs-selectors").hide(); // hide the add tab button (not strictly necessary as it doesn't appear to non-admins, but nice for testing $(".mt-guide-add-button-container").hide(); // count the number of tabs on this page var numberOfTabs = $("li.mt-guide-tab").length; if (numberOfTabs > 1) { var guideTabContainer = $(".mt-guide-tabs-container"); // extract the link from each tab and insert it before the guide container $(".mt-guide-tab-link").each(function(index) { // get the ID of this link so that we can trigger a click event from the new element var link_id = $(this).attr("id"); // now have to remove the ID from the cloned element or we get stuck in a click-trigger loop var newLink = $(this) .clone() .removeAttr("id") .addClass("ex-tab-link"); // add an "active" class to the first of the new tab buttons if (index == 0) { newLink.addClass("active"); } // add the click trigger action to fire on the original when the new button is clicked // can't simply use a link as MT uses jQuery to load tab content newLink.on("click", function(e) { e.preventDefault(); $("a.ex-tab-link.active").not($(this)).removeClass("active"); $(this).addClass("active"); $("#" + link_id).trigger("click"); }); // finally: add the new link newLink.insertBefore(guideTabContainer); }); } } });/*]]>*/</script> <script type="text/javascript">/*<![CDATA[*/ $(function() { var SearchTipsLink = '/Cross-Product/Knowledge_Articles/Tips_for_Advanced_Document_Searching_in_the_Customer_Knowledge_Center'; var NoResultsText = 'Search Tips:<br><br>Try using an exact phrase search ("my search") or the AND operator (my AND search).<br><br>Other useful search tips can be found <a href="' + SearchTipsLink + '">here</a>.'; function overrideSearchText() { var TextContainer = $("li.type-empty p"); if (TextContainer.length) { // override the no results found text $("li.type-empty p").html(NoResultsText).show(); // stop the task that searches for text clearInterval(TextSearch); } } if ($("body").hasClass("columbia-special-search")) { // Keep running the function in case search text appears var TextSearch = setInterval(overrideSearchText, 500); } }); /*]]>*/</script> <script type="text/javascript">/*<![CDATA[*/ $(function() { var PageRequested = window.location.href; var ReplacementHTML = "<strong>Sorry, the page </strong>" + PageRequested + "<strong> does not exist, or is no longer valid.</strong><br><br>"; ReplacementHTML = ReplacementHTML + "You may try searching the Knowledge Center for relevant information, or checking the following suggested pages:"; var Error404Container = $("#special-404"); if (Error404Container.length) { var NoticeParagraph = $("<p></p>").html(ReplacementHTML); Error404Container.prepend(NoticeParagraph); } }); /*]]>*/</script> <div class="elm-nav product-search-container"><div class="elm-nav-container product-search"><a class="back-button mt-icon-arrow-left8 internal" href="https://knowledge.exlibrisgroup.com/campusM/Product_Documentation/Managing_Product_Integrations" rel="internal">Back</a><form action="/Special:Search" class="product-search-form"><div class="product-search-form-inner"><input type="text" name="search" class="product-search-text" placeholder="Search under current path"></input><button type="submit"><span class="mt-icon-search"></span></button><input type="hidden" name="path" class="page-path" value="campusM/Product_Documentation/Managing_Product_Integrations/Holds"></input><input type="hidden" name="product" class="page-path-product" value="campusM"></input></div></form><div class="mt-page-thumbnail"><img alt="campusM" class="internal" loading="lazy" src="https://knowledge.exlibrisgroup.com/@api/deki/files/57003/mindtouch.page%2523thumbnail?revision=1" /></div></div></div> <script type="text/javascript">/*<![CDATA[*/ $(function() { // Some items that we'll refer to throughout the code below var SearchContainer = $(".product-search-container"); // the container that wraps the search input and select menu var SearchInput = $(".product-search-text"); // the input field for search text var PageProduct = $(".page-path-product"); // the hidden form element containing the current product name var PagePath = $(".page-path"); // the hidden form element containing the current path // if the current path matches the product name (i.e. we are on the product home page) // hide the page title if (PageProduct.val() == PagePath.val()) { $("h1#title").hide(); } // we are on a product page and need to retrieve the parent page from the hidden form field var CurrentProduct = PageProduct.val(); // only continue if there's a product path available if (CurrentProduct.length) { // set the colour style SearchContainer.attr("title", CurrentProduct); } // Now move the search from the custom header block into its final location // this will automatically "reveal" the search as it picks up global styles var DestinationElement = $(".elm-header-global-nav"); SearchContainer.insertBefore(DestinationElement); // Prevent the form from being submitted without a search term $(".product-search-form").on("submit", function(event) { // cancel if no text for searching if (!SearchInput.val().length) { event.preventDefault(); return false; } }); });/*]]>*/</script> <script type="text/javascript">/*<![CDATA[*/ document.documentElement.setAttribute('lang', 'en');/*]]>*/</script> <p>&nbsp;</p> <script type="text/javascript">/*<![CDATA[*/ // Add Roboto font Deki.Fonts.addGoogleFontFamily('Roboto:r,b,i');/*]]>*/</script> <script type="text/javascript">/*<![CDATA[*/ /* Parse parameters */ var documentParams; function getDocumentParams() { if (!documentParams) { documentParams = {}; if (document.location.search) { var decodedSearch = decodeURIComponent(document.location.search.substring(1).replace('+', ' ')); var searchParams = decodedSearch.split(/&/); for (var i = 0; i < searchParams.length; i++) { var param = searchParams[i]; var match = param.match(/^([^=]+)=(.*)$/); if (match) { documentParams[match[1]] = match[2]; } } } } return documentParams; } function toggle(it,min,max) { if (!min) {min = 50}; if (!max) {max = 500}; if (it.width == min) {it.width = max;} else {it.width = min;} } /* * Optional sections processing * */ function initOptional() { /* Pivot */ var uxpParam = getDocumentParams().uxp; var uxpTrueElements = document.querySelectorAll(".CallOut"); if (uxpParam != "true") { for (var i = 0; i < uxpTrueElements.length; i++) { uxpTrueElements[i].style['display'] = 'none'; } } else if (uxpParam == "true") { var hrefs = document.getElementsByTagName('a'); for (var i = 0; i < hrefs.length; i++) { if (hrefs[i]['href'].indexOf('/Pivot/Product_Documentation') != -1 && hrefs[i]['href'].indexOf('uxp') == -1) { if (hrefs[i]['href'].indexOf('?') == -1) { if (hrefs[i]['href'].indexOf('#') == -1) { hrefs[i]['href'] += '?uxp=true'; } else { hrefs[i]['href'] = hrefs[i]['href'].replace('#','?uxp=true#'); } } else { hrefs[i]['href'] = hrefs[i]['href'].replace('?','?uxp=true&'); } } } } /* Release Notes: Process MON, CAT, and SER parameters */ var monParam = getDocumentParams().mon; var catParam = getDocumentParams().cat; var serParam = getDocumentParams().ser; if (monParam && document.getElementById('rnMonthList')) { document.getElementById('rnMonthList').value=monParam; if (catParam && document.getElementById('rnCatList')) { document.getElementById('rnCatList').value=catParam; } if (serParam && document.getElementById('rnSearchList')) { document.getElementById('rnSearchList').value=serParam; } filterRN(); } else if (document.getElementById('rnMonthList')) { if (catParam && document.getElementById('rnCatList')) { document.getElementById("rnMonthList").value="All"; document.getElementById('rnCatList').value=catParam; } if (serParam && document.getElementById('rnSearchList')) { document.getElementById("rnMonthList").value="All"; document.getElementById('rnSearchList').value=serParam; } filterRN(); } }/*]]>*/</script> <script type="text/javascript">/*<![CDATA[*/ //google analytics feedback buttons $(function() { $( 'button.mt-rating-button-no' ).click(function() { ga('send', 'event', { eventCategory: 'badFeedback', eventAction: 'badFeedbackClick', eventLabel: 'badFeedback' }); }); $( 'button.mt-rating-button-yes' ).click(function() { ga('send', 'event', { eventCategory: 'goodFeedback', eventAction: 'goodFeedbackClick', eventLabel: 'goodFeedback' }); }); // See pageForRedirect and LogoAndNavigation templates for additional action captures // as these needed changing from previous onclick handlers due to alteration of elements // from javascript pop-ups to standard "select" elements });/*]]>*/</script> </div> <div class="grape-header grape-wrapper"> <div class="grape-header-container grape-wrapper-container"> <div class="grape-site-logo"> <a class="logo-anonymous" href="/" title="Ex Libris Knowledge Center"> <img class="mt-cdn" src="https://a.mtstatic.com/@public/production/site_11811/1638394879-logo.png" alt="Ex Libris Knowledge Center" title="Ex Libris Knowledge Center"> </a> </div> <div class="grape-site-navigation"> <ul class="mt-site-nav"> <li class="mt-login-sign-in"> <a class="mt-icon-quick-sign-in" href="https://knowledge.exlibrisgroup.com/Special:UserLogin?returntotitle=campusM%2FProduct_Documentation%2FManaging_Product_Integrations%2FHolds" title="Sign in"> Sign in </a> </li> <li class="mt-login-forgot-password"> <a class="mt-icon-login-forgot-password" href="https://knowledge.exlibrisgroup.com/Special:UserPassword" title="Retrieve lost password"> Forgot password </a> </li> </ul> </div> <div class="grape-site-search"> <div class="mt-quick-search-container"> <form action="/Special:Search"> <input name="path" id="mt-search-path" type="hidden" value="/campusM/Product_Documentation/Managing_Product_Integrations/Holds" /> <label class="mt-label" for="mt-site-search-input"> Search </label> <input class="mt-text mt-search search-field" name="q" id="mt-site-search-input" placeholder="How can we help you?" type="search" /> <button class="mt-button ui-button-icon mt-icon-site-search-button search-button" type="submit"> Search </button> </form> </div> </div> </div> <div class="grape-site-nav grape-wrapper-container"> <ul class="mt-breadcrumbs"> <li> <a href="https://knowledge.exlibrisgroup.com/"> <span class="mt-icon-article-guide mt-icon-article-home"></span> Home </a> </li> <li> <a href="https://knowledge.exlibrisgroup.com/campusM"> <span class="mt-icon-article-category"></span> campusM </a> </li> <li> <a href="https://knowledge.exlibrisgroup.com/campusM/Product_Documentation"> <span class="mt-icon-article-category"></span> Product Documentation </a> </li> <li> <a href="https://knowledge.exlibrisgroup.com/campusM/Product_Documentation/Managing_Product_Integrations"> <span class="mt-icon-article-guide"></span> Managing Product Integrations </a> </li> </ul> </div> </div> <div class="grape-content grape-wrapper"> <div class="grape-content-container grape-wrapper-container"> <div id="flash-messages"><div class="dekiFlash"></div></div> <h1 id="title" class="no-edit" style="visibility: visible;"> Holds </h1> <div class="mt-last-updated"> <strong>Last updated:</strong> <span class="modified mt-last-updated-timestamp" data-timestamp="2024-07-30T10:29:41Z"></span> </div> <div class="mt-content-header"></div> <div class="mt-content-side"></div> <div id="mt-toc-container" data-title="Table of contents" data-collapsed="true"> <button class="mt-toggle mt-summary-toggle ui-button-icon mt-toggle-expand">Table of contents</button> <div class="mt-toc-content mt-collapsible-section mt-toc-hide"> <ol><li><a href="#Overview" rel="internal">Overview</a></li><li><a href="#Vendors" rel="internal">Vendors</a></li><li><a href="#User_Experience" rel="internal">User Experience</a><ol><li><a href="#User_Activities" rel="internal">User Activities</a></li><li><a href="#Authentication" rel="internal">Authentication</a></li><li><a href="#Offline_Support" rel="internal">Offline Support</a></li><li><a href="#Holds_End-User_Interface" rel="internal">Holds End-User Interface</a></li></ol></li><li><a href="#Technical_Overview" rel="internal">Technical Overview</a><ol><li><a href="#Prerequisites" rel="internal">Prerequisites</a></li><li><a href="#Required_Format" rel="internal">Required Format</a><ol><li><a href="#Ellucian_Banner_9_(XE)_Vendor" rel="internal">Ellucian Banner 9 (XE) Vendor</a></li><li><a href="#Ellucian_Colleague_(Custom)_Vendor" rel="internal">Ellucian Colleague&nbsp;(Custom) Vendor</a></li><li><a href="#Ellucian_Colleague_(Web_API)_Vendor" rel="internal">Ellucian Colleague (Web API) Vendor</a></li><li><a href="#Oracle_PeopleSoft" rel="internal">Oracle PeopleSoft</a></li><li><a href="#RESTful_API" rel="internal">RESTful API</a></li></ol></li></ol></li><li><a href="#Configuration" rel="internal">Configuration</a></li></ol> </div> </div> <div id="page-top"> <div id="topic"> <div id="pageText"><div class="mt-contentreuse-widget" data-page="Media_Repository/campusM_Content_Reuse/campusM___campusM_Library_Logo_for_OLH_Pages" data-section="" data-show=""> <div class="mt-include" id="s113371"><p><img alt="campusM + cmLibrary Logo wh bkg sm1.png" class="internal default" loading="lazy" src="https://knowledge.exlibrisgroup.com/@api/deki/files/164788/campusM_%252B_cmLibrary_Logo_wh_bkg_sm1.png?revision=1" /></p> </div> </div> <div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_1"><span id="Overview"></span><h2 class="editable">Overview</h2> <div class="BodyText">The Holds product integration allows students to view information related to their university holds.</div> </div><div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_2"><span id="Vendors"></span><h2 class="editable">Vendors</h2> <p>The Holds product integration currently supports&nbsp;the following&nbsp;vendors:</p> <ul> <li><a href="https://www.ellucian.com/emea-ap/solutions/ellucian-banner" target="_blank" rel="external noopener nofollow" class="link-https">Ellucian Banner (XE)</a></li> <li><a href="https://www.ellucian.com/solutions/ellucian-colleague" target="_blank" rel="external noopener nofollow" class="link-https">Ellucian Colleague (Custom) ERP Systems</a></li> <li>Ellucian Colleague (Web API)</li> <li>Oracle PeopleSoft</li> <li>RESTful API</li> </ul> </div><div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_3"><span id="User_Experience"></span><h2 class="editable">User Experience</h2> <div class="BodyText">The following section describes information relating to the user experience for the Holds product integration.</div> <div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_4"><span id="User_Activities"></span><h3 class="editable">User Activities</h3> <ul> <li>Students select the <span class="ScreenElement">Holds </span>tile and their holds information is displayed.</li> <li>The total&nbsp;number of holds is displayed for students on the <span class="ScreenElement">Holds</span> live tile.</li> </ul> </div><div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_5"><span id="Authentication"></span><h3 class="editable">Authentication</h3> <p>The Holds product integration requires the user's identifier from the vendor's system. This is obtained with token-based authentication attributes.</p> <p>The connection to the vendor is handled as part of the generic API Configuration component (in App Manager, in the product instance). This is found under the Vendor section on the configuration page.</p> </div><div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_6"><span id="Offline_Support"></span><h3 class="editable">Offline Support</h3> <div class="BodyText">No offline support is provided, since the data would not be current, and it&nbsp;is preferable to have no data rather than potentially inaccurate data.</div> </div><div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_7"><span id="Holds_End-User_Interface"></span><h3 class="editable">Holds End-User Interface</h3> <p>The following are the two components of the Holds user interface, as seen by the student. The <span class="ScreenElement">Holds </span>tile shows that the student has three holds. When the student selects the tile, the Holds page opens and displays details about their holds.&nbsp;</p> <div class="ImageBorder style-wrap"> <p><img alt="holds_live_tile.png" class="internal default" loading="lazy" src="https://knowledge.exlibrisgroup.com/@api/deki/files/89619/holds_live_tile.png?revision=1" /></p> <div class="FigureCaption"><span class="ScreenElement">Holds </span>Live Tile</div> <p><img alt="Holds-1.jpg" height="449px" class="internal default" loading="lazy" src="https://knowledge.exlibrisgroup.com/@api/deki/files/94561/Holds-1.jpg?revision=1&amp;size=bestfit&amp;height=449" /></p> <div class="FigureCaption"><span class="ScreenElement">Holds </span>Page</div> </div> </div></div><div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_8"><span id="Technical_Overview"></span><h2 class="editable">Technical Overview</h2> <div class="BodyText">This&nbsp;section describes technical information for the Holds product integration.</div> <div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_9"><span id="Prerequisites"></span><h3 class="editable">Prerequisites</h3> <p>The following prerequisites are required to configure the Holds product integration:</p> <ul> <li>User identifier mapping <ul> <li>If you have CMAuth configured, map the relevant vendor ID in the integration profile (Additional Mapping), for example: <span class="EnteredText">bannerId=employeeID</span>, where <span class="EnteredText">employeeID&nbsp;</span>is the relevant user attribute on the vendor&rsquo;s backend system.</li> <li>If you have LDAP configured, verify that the relevant attribute is returned as an attribute from the LDAP response.</li> </ul> </li> <li>Map the relevant&nbsp;user ID in the integration profile for the app profile.</li> </ul> </div><div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_10"><span id="Required_Format"></span><h3 class="editable">Required Format</h3> <div class="BodyText">Select one of the following links to learn about the required format for that vendor: <ul> <li><a title="Holds" href="#Ellucian_Banner_9_Vendor" rel="internal">Ellucian Banner 9&nbsp;Vendor</a>&nbsp;(Also referred to as &quot;Banner XE&quot;)</li> <li><a title="Holds" href="#Ellucian_Colleague_(Custom)_Vendor" rel="internal">Ellucian Colleague&nbsp;(Custom) Vendor</a></li> <li><a title="Holds" href="#Ellucian_Colleague_(Web_API)_Vendor" rel="internal">Ellucian Colleague (Web API) Vendor</a></li> <li><a title="Holds" href="#Oracle_PeopleSoft" rel="internal">Oracle PeopleSoft</a></li> <li><a title="Holds" href="#RESTful_API" rel="internal">RESTful API</a></li> </ul> </div> <div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_11"><span id="Ellucian_Banner_9_(XE)_Vendor"></span><h4 class="editable"><span class="mt-color-000000">Ellucian Banner 9 (XE) Vendor</span></h4> <div class="BodyText"> <ul> <li>campusM uses the following API call to fetch the Holds data: <p><span class="EnteredText">https://{host}/StudentApi/api/students/{userId}/holds</span></p> </li> <li>The following is an example of a&nbsp;JSON response for the Holds API: <div class="CodeBlock"> <p>[</p> <p>{</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;fromDate&quot;: <i>&quot;2019-06-01&quot;</i>,</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;holdTypeCode&quot;: <i>&quot;AT1&quot;</i>,</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;holdTypeDescription&quot;: <i>&quot;Athletic Hold1&quot;</i>,</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;processAffectedDescription&quot;: [</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <i>&quot;Registration&quot;</i></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ],</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;reason&quot;: <i>&quot;contact ext.2540&quot;</i>,</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;toDate&quot;: <i>&quot;2020-12-31&quot;</i></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;fromDate&quot;: <i>&quot;2019-06-01&quot;</i>,</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;holdTypeCode&quot;: <i>&quot;AT2&quot;</i>,</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;holdTypeDescription&quot;: <i>&quot;Athletic Hold2&quot;</i>,</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;processAffectedDescription&quot;: [</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <i>&quot;Registration&quot;</i></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ],</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;reason&quot;: <i>&quot;contact ext.2540&quot;</i>,</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;toDate&quot;: <i>&quot;2020-12-31&quot;</i></p> <p>}</p> <p>]</p> </div> </li> </ul> </div> </div><div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_12"><span id="Ellucian_Colleague_(Custom)_Vendor"></span><h4 class="editable"><span class="mt-color-000000">Ellucian Colleague&nbsp;(Custom) Vendor</span></h4> <div class="BodyText"> <ul> <li>campusM uses the following API call to fetch the Holds data: <p><span class="EnteredText">https://{host}/ColleagueApi/students/0938734/holds</span></p> </li> <li>The following is an example of a JSON response for the Holds API: <div class="CodeBlock"> <p>[</p> <p>&nbsp;&nbsp;&nbsp; {</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Type&quot;: <i>&quot;SA&quot;</i>,</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Description&quot;: <i>&quot;Student Accounts Hold&quot;</i></p> <p>&nbsp;&nbsp;&nbsp; }</p> <p>]</p> </div> </li> <li>A direct connection to the Ellucian Colleague (custom) API is required. Any middleware or client-specific implementation causes the API response to deviate from what the cloud platform is expecting.</li> </ul> </div> </div><div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_13"><span id="Ellucian_Colleague_(Web_API)_Vendor"></span><h4 class="editable">Ellucian Colleague (Web API) Vendor</h4> <ul> <li>campusM uses two API calls to fetch the grades data:</li> <li>The first call is because the Colleague Web API authenticates via a session token: <p><span class="EnteredText">https://{HOST}/colleagueApi/session/proxy-login</span></p> </li> <li>The second call is to retrieve all holds for the student: <p><span class="EnteredText">https://{HOST}/colleagueApi/students/{username}/restrictions</span></p> </li> </ul> </div><div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_14"><span id="Oracle_PeopleSoft"></span><h4 class="editable"><a name="HoldsPICKCDocumentation-OraclePeopleSoft"></a>Oracle PeopleSoft</h4> <ul> <li>Create a PeopleSoft query that meets the following requirements:</li> <li>The API call must be in the following format:</li> </ul> <p class="mt-indent-1"><span class="EnteredText">GET https://{host}/PSIGW/RESTListeningConnector/ExecuteQuery.v1/PUBLIC/{query name}/JSON/NONFILE</span></p> <p class="mt-indent-1">E.g.&nbsp;<span class="EnteredText">https://satest.academyart.edu/PSIGW/RESTListeningConnector/ExecuteQuery.v1/PUBLIC/AAC_CM_STUDENT_TERMS/JSON/NONFILE</span></p> <ul> <li>These are the query parameters that need configuring:</li> </ul> <p class="mt-indent-1"><span class="EnteredText">isconnectedquery:&nbsp;N</span></p> <p class="mt-indent-1"><span class="EnteredText">maxrows:&nbsp;0&nbsp;</span></p> <p class="mt-indent-1"><span class="EnteredText">prompt_uniquepromptname:&nbsp;USER_ID</span></p> <p class="mt-indent-1"><span class="EnteredText">prompt_fieldvalue:&nbsp;{USER_ID value as a Token Property}</span></p> <p class="mt-indent-1"><span class="EnteredText">json_resp:&nbsp;true</span></p> </div><div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_15"><span id="RESTful_API"></span><h4 class="editable">RESTful API</h4> <ul> <li>campusM uses the following API call to fetch the Holds data: <p><span class="EnteredText">https://&lt;BASE_URL&gt;/&lt;PATH&gt;?userId=&lt;USER_ID&gt;</span></p> </li> <li>The following is an example of a JSON response for the Holds API: <div class="CodeBlock"> <p>[</p> <p>&nbsp; {</p> <p>&nbsp; &nbsp; &quot;fromDate&quot;: &quot;2019-01-01&quot;,</p> <p>&nbsp; &nbsp; &quot;reason&quot;: &quot;this is a reason&quot;,</p> <p>&nbsp; &nbsp; &quot;processAffectedDescription&quot;: [&quot;desc1&quot;, &quot;desc2&quot;],</p> <p>&nbsp; &nbsp; &quot;toDate&quot;: &quot;2020-01-01&quot;,</p> <p>&nbsp; &nbsp; &quot;holdTypeCode&quot;: &quot;code&quot;,</p> <p>&nbsp; &nbsp; &quot;holdTypeDescription&quot;: &quot;description&quot;</p> <p>&nbsp; }</p> <p>]</p> </div> </li> </ul> </div></div></div><div mt-section-origin="campusM/Product_Documentation/Managing_Product_Integrations/Holds" class="mt-section" id="section_16"><span id="Configuration"></span><h2 class="editable">Configuration</h2> <div class="BodyText">The following table&nbsp;describes the configuration options available for the Holds product integration.</div> <div class="BodyText">Note that while the majority of these fields are not mandatory, they are displayed with their default values unless otherwise stated.</div> <div class="BodyText"> <table style="font-size: 14px;"> <thead> <tr> <th>Configuration Option</th> <th>Description</th> <th>Mandatory</th> <th>Data Type</th> <th>Default</th> <th>Example</th> </tr> </thead> <tbody> <tr> <td colspan="6"><span class="ScreenElement">Manage Integration</span></td> </tr> <tr> <td>Enable Product Integration</td> <td>Select to enable the product integration on the user's campusM app.</td> <td>No</td> <td>Checkbox</td> <td>Unchecked</td> <td>&nbsp;</td> </tr> <tr> <td>Product Integration Description</td> <td>A description of the product integration for internal use</td> <td>Yes</td> <td>String</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>Screen Title</td> <td>Appears in the top header (of the integration, in the app).</td> <td>No</td> <td>String</td> <td>Holds</td> <td>&nbsp;</td> </tr> <tr> <td colspan="6"><span class="ScreenElement">Vendor</span></td> </tr> <tr> <td>Vendor Name</td> <td>Defines to which vendor the integration connects</td> <td>Yes</td> <td>Drop-down list</td> <td>&nbsp;</td> <td>Colleague</td> </tr> <tr> <td colspan="6"><span class="ScreenElement">API Configuration</span><strong>&nbsp;- for Banner XE and Colleague (Custom)</strong><br /> This section contains the API details&nbsp; to define the API structure. You can test the API configuration.&nbsp;See&nbsp;<a title="Adding a Product Integration" href="https://knowledge.exlibrisgroup.com/campusM/Product_Documentation/Managing_Product_Integrations/01_Overview/02_Adding_a_Product_Integration#Testing_Product_Integration_APIs" rel="internal">Adding a Product Integration</a>.</td> </tr> <tr> <td>Base URL to retrieve the information</td> <td>The URL for the API server</td> <td>Yes</td> <td>URL</td> <td>&nbsp;</td> <td><br /> <span class="EnteredText">https://{HOST}</span></td> </tr> <tr> <td>Parameter Input Option</td> <td>The parameter input option for Banner ID or Ellucian Colleague (custom). Possible values: Username, Token Property, and Constant. It is sent as the path parameter.</td> <td>Yes</td> <td>Drop-Down list</td> <td>&nbsp;</td> <td>Token Property</td> </tr> <tr> <td>Authentication Type</td> <td>Select one of the following options: <ul style="list-style-type: disc;"> <li>No Auth</li> <li>Basic - username and password for Base64 basic authentication.</li> </ul> </td> <td>Yes</td> <td>Drop-down list</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td colspan="6"><strong>API Configuration - fo</strong><strong>r Colleague (Web API) and Oracle PeopleSoft</strong></td> </tr> <tr> <td>URL to retrieve the information</td> <td>The URL for the API server.</td> <td>Yes</td> <td>URL</td> <td>&nbsp;</td> <td>https://{HOST}</td> </tr> <tr> <td>URL Query Parameters</td> <td>Any query parameters required.</td> <td>No</td> <td>Parameter</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>URL Path Parameters</td> <td>Any path parameters required.</td> <td>No</td> <td>Parameter</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>General Headers</td> <td> <p>Any additional headers required.</p> <p><strong>Note</strong>&nbsp;- when using the Colleague Web API , we require one to be configured:</p> <p>Header Key: X-CustomCredentials</p> <p>Header Value: colleaguewebapitoken</p> <p>The Header Key can be changed if your Colleague server accepts a different key name, but the Header Value cannot be changed.</p> </td> <td>Yes</td> <td>Header</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>Authentication Type</td> <td>Select one of the following options, according to your Colleague server setup: <ul> <li> <ul> <li>No Auth</li> <li>Basic Auth</li> </ul> </li> </ul> </td> <td>No</td> <td>Drop-down list</td> <td>&nbsp;</td> <td>No Auth</td> </tr> <tr> <td>Parameter Input Option</td> <td> <p>The parameter type for Colleague ID required for the Colleague Web API.</p> <p>Possible values: Username, Token Property, and Constant. Typically this is the user's &quot;username&quot; attribute.</p> </td> <td>Yes</td> <td>Drop-down list</td> <td>&nbsp;</td> <td>Username</td> </tr> <tr> <td>Token Property Name</td> <td> <p>If &quot;Token Property&quot; is selected for Parameter Input Option, enter the property name to be retrieved from the token ({ USERNAME, MAIL, GIVEN_NAME, SURNAME, FULL_NAME } or as named in the integration profile).</p> </td> <td>Yes (if Token Property)</td> <td>String</td> <td>&nbsp;</td> <td>username</td> </tr> <tr> <td colspan="6"><strong>Web API - for Colleague (Web API) only</strong></td> </tr> <tr> <td>Proxy ID</td> <td>Required to fetch the session token.</td> <td>Yes</td> <td>String</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>Proxy Password</td> <td>Required to fetch the session token.</td> <td>Yes</td> <td>String</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>Token Expiry</td> <td>The time in hours to store a web API session token for, up to a maximum of 24 hours.</td> <td>No</td> <td>Integer</td> <td>1</td> <td>&nbsp;</td> </tr> <tr> <td colspan="6"><span class="ScreenElement">Holds Page</span></td> </tr> <tr> <td>More Details Button Link</td> <td>This will redirect the user out of the campusM app to the target URL</td> <td>No</td> <td>Checkbox</td> <td>Selected</td> <td>&nbsp;</td> </tr> <tr> <td>More Details Page URL</td> <td>Specify the external URL of the vendor website</td> <td>Mandatory if More Details Button Link was selected</td> <td>String</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>Open More Details Link Externally</td> <td>Determines whether the link opens in-app or in the user's external browser &nbsp;</td> <td>No</td> <td>Checkbox</td> <td>Unselected</td> <td>&nbsp;</td> </tr> <tr> <td>Input Date Format</td> <td>The format of the dates coming back from the API</td> <td>No</td> <td>Date format</td> <td>YYYY-MM-DD</td> <td>&nbsp;</td> </tr> <tr> <td>Display Date Format</td> <td>The format in which to display time throughout the integration</td> <td>No</td> <td>Time format</td> <td> <p>hh:mm&nbsp;<br /> hh:mm a</p> </td> <td>&nbsp;</td> </tr> <tr> <td colspan="6"><span class="ScreenElement">Additional Fields</span></td> </tr> <tr> <td>Code</td> <td>The code as returned in JSON</td> <td>Yes</td> <td>String</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>Label</td> <td>The label for this field</td> <td>Yes</td> <td>String</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>Display if empty</td> <td>Select to display the field&nbsp;even when it has no data</td> <td>No</td> <td>Boolean</td> <td>False</td> <td>&nbsp;</td> </tr> <tr> <td>Live Tile</td> <td>Live Tile</td> <td>Live Tile</td> <td>Live Tile</td> <td>Live Tile</td> <td>Live Tile</td> </tr> <tr> <td>Enable Live Tile</td> <td> <p>Select to enable holds Live Tile</p> </td> <td>No</td> <td>Boolean</td> <td>False</td> <td>&nbsp;</td> </tr> <tr> <td>Badge Color</td> <td>&nbsp;</td> <td>No</td> <td>Color Picker</td> <td>&nbsp;</td> <td>#4d194c</td> </tr> <tr> <td colspan="6"><span class="ScreenElement">Look and Feel</span></td> </tr> <tr> <td>Primary Theme Color</td> <td>Used for the Screen Title header and other header elements.</td> <td>No</td> <td>Color Picker</td> <td>#444444</td> <td>&nbsp;</td> </tr> <tr> <td>Secondary Theme Color</td> <td>Used for the Grade block headers.</td> <td>No</td> <td>Color Picker</td> <td>#6f8ea4</td> <td>&nbsp;</td> </tr> <tr> <td><span class="ScreenElement">Text / Labels</span></td> <td>Enter replacement text for the default titles and labels</td> <td>No</td> <td>String</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td><b>Holds Page Title</b></td> <td>The page title</td> <td>No</td> <td>String</td> <td>Holds</td> <td>&nbsp;</td> </tr> <tr> <td>Affected Text</td> <td>Used for the Affected block header</td> <td>No</td> <td>String</td> <td>Affected</td> <td>&nbsp;</td> </tr> <tr> <td>Date Label</td> <td>Used for the Date block header</td> <td>No</td> <td>String</td> <td>Date</td> <td>&nbsp;</td> </tr> <tr> <td>More Details Button Link</td> <td>If the more details button link is enabled, this controls the text user sees</td> <td>No</td> <td>String</td> <td>Go to website</td> <td>&nbsp;</td> </tr> <tr> <td>No Data Message</td> <td>This message will appear when there is no holds data for the user</td> <td>No</td> <td>String</td> <td>No holds found</td> <td>&nbsp;</td> </tr> <tr> <td>Service Failure Message</td> <td>This message will appear when the integration is unable to reach or process the service call correctly.</td> <td>No</td> <td>String</td> <td>The page is having trouble fetching your holds &ndash; please try again shortly</td> <td>&nbsp;</td> </tr> <tr> <td colspan="6"><span class="ScreenElement">Import/ Export Configuration</span><br /> You can configure product integration and then export it to another campusM environment, for example,&nbsp;from sandbox to production or from preview to production. &nbsp;</td> </tr> <tr> <td>Export</td> <td>Create a JSON file with all product integration configuration.</td> <td>No</td> <td>&nbsp;</td> <td>&nbsp;</td> <td style="width:293px;">&nbsp;</td> </tr> <tr> <td>Import</td> <td>Use this option in order to load configuration from JSON of an exported product integration.</td> <td>No</td> <td>&nbsp;</td> <td>&nbsp;</td> <td style="width:293px;">&nbsp;</td> </tr> </tbody> </table> </div> </div></div> </div> </div> <div class="mt-content-footer"> <div style="display: none"><a href="https://knowledge.exlibrisgroup.com/campusM/Product_Documentation/Managing_Product_Integrations/Holds?v=10" rel="internal" class="rss-page-link internal">View article in the Exlibris Knowledge Center</a></div> </div> <ol class="grape-meta-data grape-meta-article-navigation"> <li class="grape-back-to-top"><a class="mt-icon-back-to-top" href="#title" id="mt-back-to-top" title="Jump back to top of this article">Back to top</a></li> <li class="grape-article-pagination"><ul class="mt-article-pagination"> <li class="mt-pagination-previous"> <a class="mt-icon-previous-article" href="https://knowledge.exlibrisgroup.com/campusM/Product_Documentation/Managing_Product_Integrations/Greeting" title="Greeting"><span>Greeting</span></a> </li> <li class="mt-pagination-next"> <a class="mt-icon-next-article" href="https://knowledge.exlibrisgroup.com/campusM/Product_Documentation/Managing_Product_Integrations/ID_Card" title="ID Card"><span>ID Card</span></a> </li> </ul> </li> </ol> </div> </div> <div class="grape-footer grape-wrapper"> <div class="grape-wrapper-container"> <ol> <li class="grape-footer-copyright">&copy; Copyright 2025 Ex Libris Knowledge Center</li> <li class="grape-footer-powered-by"><a href="https://mindtouch.com/demo" class="mt-poweredby product " title="MindTouch" target="_blank"> Powered by CXone Expert <span class="mt-registered">&reg;</span> </a></li> </ol> </div> </div> <div class="grape-footer-custom"><footer><div class="elm-nav-container"><div class="exlibris-footer"><ul id="useful_links"><li><a target="_self" href="https://knowledge.exlibrisgroup.com/TERMS_OF_USE" rel="internal">Term of Use</a></li><li><a target="_blank" href="https://www.exlibrisgroup.com/privacy-policy/" rel="external noopener nofollow" class="link-https">Privacy Policy</a></li><li id="teconsent"></li><li><a href="https://knowledge.exlibrisgroup.com/Cross-Product/Knowledge_Articles/How_to_contact_Ex_Libris_for_assistance_or_to_discuss_technical_matters" rel="internal">Contact Us</a></li></ul><span class="reserved">2025 Ex Libris. All rights reserved</span></div></div></footer> </div> <script>/*<![CDATA[*/ initOptional(); (function(){ var x = document.getElementsByClassName('lastModified'); for (var i = 0; i < x.length; i++) { var d = new Date(x[i].innerText); x[i].setAttribute('sorttable_customkey', d.toISOString().substring(0, 10)); } })(); /*]]>*/</script> <!--Feedback--> <script type="text/javascript">/*<![CDATA[*/ window.doorbellOptions = { "id": "2602", "appKey": "Qo1eqHoGxyAyBumYthdr9YjCAxeowyUw8hdj2EJ2bgPomMf5IeNGpABlK1QGmq42" }; (function(w, d, t) { var hasLoaded = false; function l() { if (hasLoaded) { return; } hasLoaded = true; window.doorbellOptions.windowLoaded = true; var g = d.createElement(t);g.id = 'doorbellScript';g.type = 'text/javascript';g.async = true;g.src = 'https://embed.doorbell.io/button/'+window.doorbellOptions['id']+'?t='+(new Date().getTime());(d.getElementsByTagName('head')[0]||d.getElementsByTagName('body')[0]).appendChild(g); } if (w.attachEvent) { w.attachEvent('onload', l); } else if (w.addEventListener) { w.addEventListener('load', l, false); } else { l(); } if (d.readyState == 'complete') { l(); } }(window, document, 'script')); /*]]>*/</script> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-KXCRM3P" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10