From 8389f09563a01e974e8fa50a6877ed17ee7a181b Mon Sep 17 00:00:00 2001 From: Owen Leonard Date: Tue, 2 Apr 2024 12:41:42 +0000 Subject: [PATCH] Bug 36490: Correct tab-switching keyboard shortcut for header search forms This patch updates staff-global.js so that we correctly define the keyboard shortcuts for search header tabs following the switch to using the WRAPPER for tabs in Bug 35850. To test, apply the patch clear your browser cache if necessary. - Go to the staff interface. - Test each keyboard shortcut to confirm that the header search tabs activate correctly: - Check in: Alt-r - Renew: Alt-w - Search: Alt-q - Check out: Alt-u - Test that the keyboard shortcut takes you to the correct page if the header search form doesn't exist on the page, e.g. the Authorities home page. --- .../intranet-tmpl/prog/js/staff-global.js | 703 ++++++++++-------- 1 file changed, 399 insertions(+), 304 deletions(-) diff --git a/koha-tmpl/intranet-tmpl/prog/js/staff-global.js b/koha-tmpl/intranet-tmpl/prog/js/staff-global.js index 7e4567bc59..4a54230ece 100644 --- a/koha-tmpl/intranet-tmpl/prog/js/staff-global.js +++ b/koha-tmpl/intranet-tmpl/prog/js/staff-global.js @@ -1,108 +1,127 @@ /* global shortcut delBasket Sticky AUDIO_ALERT_PATH Cookies */ /* exported addBibToContext delBibToContext escape_str escape_price openWindow _ removeFocus toUC confirmDelete confirmClone playSound */ -if ( KOHA === undefined ) var KOHA = {}; +if (KOHA === undefined) var KOHA = {}; -function _(s) { return s; } // dummy function for gettext +function _(s) { + return s; +} // dummy function for gettext // http://stackoverflow.com/questions/1038746/equivalent-of-string-format-in-jquery/5341855#5341855 -String.prototype.format = function() { return formatstr(this, arguments); }; +String.prototype.format = function () { + return formatstr(this, arguments); +}; function formatstr(str, col) { - col = typeof col === 'object' ? col : Array.prototype.slice.call(arguments, 1); + col = + typeof col === "object" + ? col + : Array.prototype.slice.call(arguments, 1); var idx = 0; return str.replace(/%%|%s|%(\d+)\$s/g, function (m, n) { - if (m == "%%") { return "%"; } - if (m == "%s") { return col[idx++]; } + if (m == "%%") { + return "%"; + } + if (m == "%s") { + return col[idx++]; + } return col[n]; }); } var HtmlCharsToEscape = { - '&': '&', - '<': '<', - '>': '>' + "&": "&", + "<": "<", + ">": ">", }; -String.prototype.escapeHtml = function() { - return this.replace(/[&<>]/g, function(c) { +String.prototype.escapeHtml = function () { + return this.replace(/[&<>]/g, function (c) { return HtmlCharsToEscape[c] || c; }); }; -function escape_str(s){ +function escape_str(s) { return s != null ? s.escapeHtml() : ""; } /* * Void method for numbers, for consistency */ -Number.prototype.escapeHtml = function() { +Number.prototype.escapeHtml = function () { return this; }; -function escape_price(p){ +function escape_price(p) { return p != null ? p.escapeHtml().format_price() : ""; } // http://stackoverflow.com/questions/14859281/select-tab-by-name-in-jquery-ui-1-10-0/16550804#16550804 $.fn.tabIndex = function () { - return $(this).parent().children('div').index(this); + return $(this).parent().children("div").index(this); }; $.fn.selectTabByID = function (tabID) { - $("a[href='" + tabID + "']", $(this) ).tab("show"); + $("a[href='" + tabID + "']", $(this)).tab("show"); }; -$(document).ready(function() { - +$(document).ready(function () { //check for a hash before setting focus let hash = window.location.hash; - if ( ! hash ) { + if (!hash) { $(".tab-pane.active input:text:first").focus(); } $("#header_search a[data-toggle='tab']").on("shown.bs.tab", function (e) { - $( e.target.hash ).find("input:text:first").focus(); + $(e.target.hash).find("input:text:first").focus(); }); - $(".close, .close_window").on("click", function(e){ + $(".close, .close_window").on("click", function (e) { e.preventDefault(); window.close(); }); - $("#checkin_search form").preventDoubleFormSubmit(); + $("#checkin_search_panel form").preventDoubleFormSubmit(); - if($("#header_search #checkin_search").length > 0){ - shortcut.add('Alt+r',function (){ - $("#header_search").selectTabByID("#checkin_search"); + if ($("#header_search #checkin_search_panel").length > 0) { + shortcut.add("Alt+r", function () { + $("#header_search").selectTabByID("#checkin_search_panel"); $("#ret_barcode").focus(); }); } else { - shortcut.add('Alt+r',function (){ - location.href="/cgi-bin/koha/circ/returns.pl"; }); + shortcut.add("Alt+r", function () { + location.href = "/cgi-bin/koha/circ/returns.pl"; + }); } - if($("#header_search #circ_search").length > 0){ - shortcut.add('Alt+u',function (){ - $("#header_search").selectTabByID("#circ_search"); + if ($("#header_search #circ_search_panel").length > 0) { + shortcut.add("Alt+u", function () { + $("#header_search").selectTabByID("#circ_search_panel"); $("#findborrower").focus(); }); } else { - shortcut.add('Alt+u',function(){ location.href="/cgi-bin/koha/circ/circulation.pl"; }); + shortcut.add("Alt+u", function () { + location.href = "/cgi-bin/koha/circ/circulation.pl"; + }); } - if($("#header_search #catalog_search").length > 0){ - shortcut.add('Alt+q',function (){ - $("#header_search").selectTabByID("#catalog_search"); + if ($("#header_search #catalog_search_panel").length > 0) { + shortcut.add("Alt+q", function () { + $("#header_search").selectTabByID("#catalog_search_panel"); $("#search-form").focus(); }); } else { - shortcut.add('Alt+q',function(){ location.href="/cgi-bin/koha/catalogue/search.pl"; }); + shortcut.add("Alt+q", function () { + location.href = "/cgi-bin/koha/catalogue/search.pl"; + }); } - if($("#header_search #renew_search").length > 0){ - shortcut.add('Alt+w',function (){ - $("#header_search").selectTabByID("#renew_search"); + if ($("#header_search #renew_search_panel").length > 0) { + shortcut.add("Alt+w", function () { + $("#header_search").selectTabByID("#renew_search_panel"); $("#ren_barcode").focus(); }); } else { - shortcut.add('Alt+w',function(){ location.href="/cgi-bin/koha/circ/renew.pl"; }); + shortcut.add("Alt+w", function () { + location.href = "/cgi-bin/koha/circ/renew.pl"; + }); } - $('#header_search .form-extra-content-toggle').on('click', function () { - const extraContent = $(this).closest('form').find('.form-extra-content'); - if (extraContent.is(':visible')) { + $("#header_search .form-extra-content-toggle").on("click", function () { + const extraContent = $(this) + .closest("form") + .find(".form-extra-content"); + if (extraContent.is(":visible")) { extraContent.hide(); $(this).removeClass("extra-content-open"); } else { @@ -112,90 +131,106 @@ $(document).ready(function() { }); $(".focus").focus(); - $(".validated").each(function() { + $(".validated").each(function () { $(this).validate(); }); jQuery.validator.addClassRules("decimal", { - number: true + number: true, }); - $("#logout").on("click",function(){ + $("#logout").on("click", function () { logOut(); }); - $("#helper").on("click",function(){ + $("#helper").on("click", function () { openHelp(); return false; }); - $("body").on("keypress", ".noEnterSubmit", function(e){ + $("body").on("keypress", ".noEnterSubmit", function (e) { return checkEnter(e); }); - $("#header_search .nav-tabs a").on("click",function(){ + $("#header_search .nav-tabs a").on("click", function () { var field_index = $(this).parent().index(); - keep_text( field_index ); + keep_text(field_index); }); - $(".toggle_element").on("click",function(e){ + $(".toggle_element").on("click", function (e) { e.preventDefault(); - $( $(this).data("element") ).toggle(); + $($(this).data("element")).toggle(); if (typeof Sticky !== "undefined" && typeof hcSticky === "function") { - Sticky.hcSticky('update'); + Sticky.hcSticky("update"); } }); var navmenulist = $("#navmenulist"); - if( navmenulist.length > 0 ){ + if (navmenulist.length > 0) { var path = location.pathname.substring(1); var url = window.location.toString(); - var params = ''; - if ( url.match(/\?(.+)$/) ) { + var params = ""; + if (url.match(/\?(.+)$/)) { params = "?" + RegExp.$1; } - if ($("a[href$=\"/" + path + params + "\"]", navmenulist).length == 0){ - $("a[href$=\"/" + path + "\"]", navmenulist).addClass("current"); + if ($('a[href$="/' + path + params + '"]', navmenulist).length == 0) { + $('a[href$="/' + path + '"]', navmenulist).addClass("current"); } else { - $("a[href$=\"/" + path + params + "\"]", navmenulist).addClass("current"); + $('a[href$="/' + path + params + '"]', navmenulist).addClass( + "current" + ); } } - $("#catalog-search-link a").on("mouseenter mouseleave", function(){ - $("#catalog-search-dropdown a").toggleClass("catalog-search-dropdown-hover"); + $("#catalog-search-link a").on("mouseenter mouseleave", function () { + $("#catalog-search-dropdown a").toggleClass( + "catalog-search-dropdown-hover" + ); }); - if ( localStorage.getItem("previousPatrons") || $("#hiddenborrowernumber").val() ){ + if ( + localStorage.getItem("previousPatrons") || + $("#hiddenborrowernumber").val() + ) { var previous_patrons = []; - if ( localStorage.getItem("previousPatrons") ) { - previous_patrons = JSON.parse(localStorage.getItem("previousPatrons")); + if (localStorage.getItem("previousPatrons")) { + previous_patrons = JSON.parse( + localStorage.getItem("previousPatrons") + ); } - if ( $("#hiddenborrowernumber").val() ) { + if ($("#hiddenborrowernumber").val()) { // Remove this patron from the list if they are already there previous_patrons = previous_patrons.filter(function (p) { return p["borrowernumber"] != $("#hiddenborrowernumber").val(); }); const previous_patron = { - "borrowernumber": $("#hiddenborrowernumber").val(), - "name": $("#hiddenborrowername").val(), - "card": $("#hiddenborrowercard").val() + borrowernumber: $("#hiddenborrowernumber").val(), + name: $("#hiddenborrowername").val(), + card: $("#hiddenborrowercard").val(), }; - previous_patrons.unshift( previous_patron ); + previous_patrons.unshift(previous_patron); // Limit to number of patrons specified in showLastPatronCount - if ( previous_patrons.length > showLastPatronCount ) previous_patrons.pop(); - localStorage.setItem("previousPatrons", JSON.stringify(previous_patrons)); + if (previous_patrons.length > showLastPatronCount) + previous_patrons.pop(); + localStorage.setItem( + "previousPatrons", + JSON.stringify(previous_patrons) + ); } - if ( previous_patrons.length ) { + if (previous_patrons.length) { let p = previous_patrons[0]; $("#lastborrowerlink").show(); $("#lastborrowerlink").prop("title", `${p["name"]} (${p["card"]})`); - $("#lastborrowerlink").prop("href", `/cgi-bin/koha/circ/circulation.pl?borrowernumber=${p["borrowernumber"]}`); + $("#lastborrowerlink").prop( + "href", + `/cgi-bin/koha/circ/circulation.pl?borrowernumber=${p["borrowernumber"]}` + ); $("#lastborrower-window").css("display", "inline-flex"); previous_patrons.reverse(); - for ( i in previous_patrons ) { + for (i in previous_patrons) { p = previous_patrons[i]; const el = `
  • ${p["name"]} (${p["card"]})
  • `; $("#lastBorrowerList").prepend(el); @@ -203,32 +238,35 @@ $(document).ready(function() { } } - if( $("#hiddenborrowernumber").val() ){ - localStorage.setItem("currentborrowernumber", $("#hiddenborrowernumber").val() ); + if ($("#hiddenborrowernumber").val()) { + localStorage.setItem( + "currentborrowernumber", + $("#hiddenborrowernumber").val() + ); } - $("#lastborrower-remove").click(function() { + $("#lastborrower-remove").click(function () { removeLastBorrower(); $("#lastborrower-window").hide(); }); /* Search results browsing */ /* forms with action leading to search */ - $("form[action*='search.pl']").submit(function(){ - $('[name^="limit"]').each(function(){ - if( $(this).val() == '' ){ - $(this).prop("disabled","disabled"); + $("form[action*='search.pl']").submit(function () { + $('[name^="limit"]').each(function () { + if ($(this).val() == "") { + $(this).prop("disabled", "disabled"); } }); var disabledPrior = false; - $(".search-term-row").each(function(){ - if( disabledPrior ){ - $(this).find('select[name="op"]').prop("disabled","disabled"); + $(".search-term-row").each(function () { + if (disabledPrior) { + $(this).find('select[name="op"]').prop("disabled", "disabled"); disabledPrior = false; } - if( $(this).find('input[name="q"]').val() == "" ){ - $(this).find('input').prop("disabled","disabled"); - $(this).find('select').prop("disabled","disabled"); + if ($(this).find('input[name="q"]').val() == "") { + $(this).find("input").prop("disabled", "disabled"); + $(this).find("select").prop("disabled", "disabled"); disabledPrior = true; } }); @@ -236,45 +274,50 @@ $(document).ready(function() { saveOrClearSimpleSearchParams(); }); /* any link to launch a search except navigation links */ - $("[href*='search.pl?']").not(".nav").not('.searchwithcontext').click(function(){ - resetSearchContext(); - }); + $("[href*='search.pl?']") + .not(".nav") + .not(".searchwithcontext") + .click(function () { + resetSearchContext(); + }); /* any link to a detail page from the results page. */ - $("#bookbag_form a[href*='detail.pl?']").click(function(){ + $("#bookbag_form a[href*='detail.pl?']").click(function () { resetSearchContext(); }); - }); -function removeLastBorrower(){ +function removeLastBorrower() { localStorage.removeItem("previousPatrons"); } // http://jennifermadden.com/javascript/stringEnterKeyDetector.html -function checkEnter(e){ //e is event object passed from function invocation +function checkEnter(e) { + //e is event object passed from function invocation var characterCode; // literal character code will be stored in this variable - if(e && e.which){ //if which property of event object is supported (NN4) + if (e && e.which) { + //if which property of event object is supported (NN4) characterCode = e.which; //character code is contained in NN4's which property } else { characterCode = e.keyCode; //character code is contained in IE's keyCode property } - if( characterCode == 13 //if generated character code is equal to ascii 13 (if enter key) - && e.target.nodeName == "INPUT" - && e.target.type != "submit" // Allow enter to submit using the submit button - ){ + if ( + characterCode == 13 && //if generated character code is equal to ascii 13 (if enter key) + e.target.nodeName == "INPUT" && + e.target.type != "submit" // Allow enter to submit using the submit button + ) { return false; } else { return true; } } -function clearHoldFor(){ - Cookies.remove("holdfor", { path: '/', SameSite: 'Lax' }); +function clearHoldFor() { + Cookies.remove("holdfor", { path: "/", SameSite: "Lax" }); } -function logOut(){ - if( typeof delBasket == 'function' ){ - delBasket('main', true); +function logOut() { + if (typeof delBasket == "function") { + delBasket("main", true); } clearHoldFor(); removeLastBorrower(); @@ -285,29 +328,45 @@ function logOut(){ localStorage.removeItem("item_search_selections"); } -function openHelp(){ - window.open( "/cgi-bin/koha/help.pl", "_blank"); +function openHelp() { + window.open("/cgi-bin/koha/help.pl", "_blank"); } -jQuery.fn.preventDoubleFormSubmit = function() { - jQuery(this).submit(function() { - $("body, form input[type='submit'], form button[type='submit'], form a").addClass('waiting'); - if (this.beenSubmitted) - return false; - else - this.beenSubmitted = true; +jQuery.fn.preventDoubleFormSubmit = function () { + jQuery(this).submit(function () { + $( + "body, form input[type='submit'], form button[type='submit'], form a" + ).addClass("waiting"); + if (this.beenSubmitted) return false; + else this.beenSubmitted = true; }); }; -function openWindow(link,name,width,height) { - name = (typeof name == "undefined")?'popup':name; - width = (typeof width == "undefined")?'600':width; - height = (typeof height == "undefined")?'400':height; +function openWindow(link, name, width, height) { + name = typeof name == "undefined" ? "popup" : name; + width = typeof width == "undefined" ? "600" : width; + height = typeof height == "undefined" ? "400" : height; //IE <= 9 can't handle a "name" with whitespace try { - window.open(link,name,'width='+width+',height='+height+',resizable=yes,toolbar=false,scrollbars=yes,top'); - } catch(e) { - window.open(link,null,'width='+width+',height='+height+',resizable=yes,toolbar=false,scrollbars=yes,top'); + window.open( + link, + name, + "width=" + + width + + ",height=" + + height + + ",resizable=yes,toolbar=false,scrollbars=yes,top" + ); + } catch (e) { + window.open( + link, + null, + "width=" + + width + + ",height=" + + height + + ",resizable=yes,toolbar=false,scrollbars=yes,top" + ); } } @@ -315,28 +374,31 @@ function openWindow(link,name,width,height) { // repeated scanning actions on errors so the librarian doesn't // continue scanning and miss the error. function removeFocus() { - $(':focus').blur(); + $(":focus").blur(); } function toUC(f) { - var x=f.value.toUpperCase(); - f.value=x; + var x = f.value.toUpperCase(); + f.value = x; return true; } function confirmDelete(message) { - return (confirm(message) ? true : false); + return confirm(message) ? true : false; } function confirmClone(message) { - return (confirm(message) ? true : false); + return confirm(message) ? true : false; } -function playSound( sound ) { - if ( ! ( sound.indexOf('http://') === 0 || sound.indexOf('https://') === 0 ) ) { +function playSound(sound) { + if (!(sound.indexOf("http://") === 0 || sound.indexOf("https://") === 0)) { sound = AUDIO_ALERT_PATH + sound; } - document.getElementById("audio-alert").innerHTML = ''; + document.getElementById("audio-alert").innerHTML = + ''; } // For keeping the text when navigating the search tabs @@ -345,8 +407,8 @@ function keep_text(clicked_index) { var persist = searchboxes[0].value; for (var i = 0; i < searchboxes.length - 1; i++) { - if (searchboxes[i].value != searchboxes[i+1].value) { - if (i === searchboxes.length-2) { + if (searchboxes[i].value != searchboxes[i + 1].value) { + if (i === searchboxes.length - 2) { if (searchboxes[i].value != searchboxes[0].value) { persist = searchboxes[i].value; } else if (searchboxes.length === 2) { @@ -354,10 +416,10 @@ function keep_text(clicked_index) { persist = searchboxes[1].value; } } else { - persist = searchboxes[i+1].value; + persist = searchboxes[i + 1].value; } - } else if (searchboxes[i+1].value != searchboxes[i+2].value) { - persist = searchboxes[i+1].value; + } else if (searchboxes[i + 1].value != searchboxes[i + 2].value) { + persist = searchboxes[i + 1].value; } } } @@ -368,42 +430,44 @@ function keep_text(clicked_index) { } // Extends jQuery API -jQuery.extend({uniqueArray:function(array){ - return $.grep(array, function(el, index) { - return index === $.inArray(el, array); - }); -}}); +jQuery.extend({ + uniqueArray: function (array) { + return $.grep(array, function (el, index) { + return index === $.inArray(el, array); + }); + }, +}); function removeByValue(arr, val) { - for(var i=0; i' : "") + + (item.surname ? item.surname.escapeHtml() : "") + + ", " + + (item.firstname ? item.firstname.escapeHtml() : "") + + " " + + (item.middle_name ? item.middle_name.escapeHtml() : "") + + cardnumber.escapeHtml() + + " " + + (item.date_of_birth + ? $date(item.date_of_birth) + + ' (' + + $get_age(item.date_of_birth) + + " " + + __("years") + + ")," + : "") + + " " + + $format_address(item, { + no_line_break: true, + include_li: false, + }) + + " " + + (!singleBranchMode + ? '' + + item.library.name.escapeHtml() + + "" + : "") + + "" + + "" + ) + .appendTo(ul); + }); } function expandPatronSearchFields(search_fields) { - switch(search_fields) { - case 'standard': + switch (search_fields) { + case "standard": return defaultPatronSearchFields; break; - case 'full_address': - return 'streetnumber|streettype|address|address2|city|state|zipcode|country'; + case "full_address": + return "streetnumber|streettype|address|address2|city|state|zipcode|country"; break; - case 'all_emails': - return 'email|emailpro|B_email'; + case "all_emails": + return "email|emailpro|B_email"; break; - case 'all_phones': - return 'phone|phonepro|B_phone|altcontactphone|mobile'; + case "all_phones": + return "phone|phonepro|B_phone|altcontactphone|mobile"; break; default: return search_fields; @@ -573,12 +651,13 @@ function expandPatronSearchFields(search_fields) { * - table_prefix: (String) table name to prefix the fields with, defaults to 'me' */ function buildPatronSearchQuery(term, options) { - let q = []; let table_prefix; let leading_wildcard; let search_fields = []; - let patterns = term.split(/[\s,]+/).filter(function (s) { return s.length }); + let patterns = term.split(/[\s,]+/).filter(function (s) { + return s.length; + }); // Bail if no patterns if (patterns.length == 0) { @@ -586,78 +665,94 @@ function buildPatronSearchQuery(term, options) { } // Table prefix: If table_prefix options exists, use that - if (typeof options !== 'undefined' && options.table_prefix) { + if (typeof options !== "undefined" && options.table_prefix) { table_prefix = options.table_prefix; - // If not, default to 'me' + // If not, default to 'me' } else { - table_prefix = 'me'; + table_prefix = "me"; } // Leading wildcard: If search_type option exists, use that - if (typeof options !== 'undefined' && options.search_type) { - leading_wildcard = options.search_type === "contains" ? '%' : ''; - // If not, use DefaultPatronSearchMethod system preference instead + if (typeof options !== "undefined" && options.search_type) { + leading_wildcard = options.search_type === "contains" ? "%" : ""; + // If not, use DefaultPatronSearchMethod system preference instead } else { - leading_wildcard = defaultPatronSearchMethod === 'contains' ? '%' : ''; + leading_wildcard = defaultPatronSearchMethod === "contains" ? "%" : ""; } let searched_attribute_fields = []; // Search fields: If search_fields option exists, we use that - if (typeof options !== 'undefined' && options.search_fields) { + if (typeof options !== "undefined" && options.search_fields) { expand_fields = expandPatronSearchFields(options.search_fields); - expand_fields.split('\|').forEach(function (field, i) { - if( field.startsWith('_ATTR_') ){ - let attr_field = field.replace("_ATTR_",""); - searched_attribute_fields.push( attr_field ); + expand_fields.split("|").forEach(function (field, i) { + if (field.startsWith("_ATTR_")) { + let attr_field = field.replace("_ATTR_", ""); + searched_attribute_fields.push(attr_field); } else { - search_fields.push( field ); + search_fields.push(field); } }); - // If not, we use DefaultPatronSearchFields system preference instead + // If not, we use DefaultPatronSearchFields system preference instead } else { - search_fields = defaultPatronSearchFields.split('\|'); + search_fields = defaultPatronSearchFields.split("|"); } // Add each pattern for each search field let pattern_subquery_and = []; patterns.forEach(function (pattern, i) { - let pattern_subquery_or = []; - search_fields.forEach(function (field, i) { - pattern_subquery_or.push( - { [table_prefix + "." + field]: { 'like': leading_wildcard + pattern + '%' } } - ); - if (field == 'dateofbirth') { - try { - let d = $date_to_rfc3339(pattern); - pattern_subquery_or.push({ [table_prefix + "." + field]: d }); - } catch { - // Hide the warning if the date is not correct - } - } + let pattern_subquery_or = []; + search_fields.forEach(function (field, i) { + pattern_subquery_or.push({ + [table_prefix + "." + field]: { + like: leading_wildcard + pattern + "%", + }, }); - pattern_subquery_and.push(pattern_subquery_or); + if (field == "dateofbirth") { + try { + let d = $date_to_rfc3339(pattern); + pattern_subquery_or.push({ + [table_prefix + "." + field]: d, + }); + } catch { + // Hide the warning if the date is not correct + } + } }); + pattern_subquery_and.push(pattern_subquery_or); + }); q.push({ "-and": pattern_subquery_and }); - // Add full search term for each search field let term_subquery_or = []; search_fields.forEach(function (field, i) { - term_subquery_or.push( - { [table_prefix + "." + field]: { 'like': leading_wildcard + term + '%' } } - ); + term_subquery_or.push({ + [table_prefix + "." + field]: { + like: leading_wildcard + term + "%", + }, + }); }); q.push({ "-or": term_subquery_or }); // Add each pattern for each extended patron attributes - if ( typeof options !== 'undefined' && ( (options.search_fields == 'standard' && options.extended_attribute_types) || ( searched_attribute_fields.length > 0 ) ) && extendedPatronAttributes) { - extended_attribute_codes_to_search = (searched_attribute_fields.length > 0) ? searched_attribute_fields : options.extended_attribute_types; + if ( + typeof options !== "undefined" && + ((options.search_fields == "standard" && + options.extended_attribute_types) || + searched_attribute_fields.length > 0) && + extendedPatronAttributes + ) { + extended_attribute_codes_to_search = + searched_attribute_fields.length > 0 + ? searched_attribute_fields + : options.extended_attribute_types; extended_attribute_subquery_and = []; patterns.forEach(function (pattern, i) { let extended_attribute_sub_or = []; extended_attribute_sub_or.push({ - "extended_attributes.value": { "like": leading_wildcard + pattern + '%' }, - "extended_attributes.code": extended_attribute_codes_to_search + "extended_attributes.value": { + like: leading_wildcard + pattern + "%", + }, + "extended_attributes.code": extended_attribute_codes_to_search, }); extended_attribute_subquery_and.push(extended_attribute_sub_or); }); @@ -666,13 +761,13 @@ function buildPatronSearchQuery(term, options) { return q; } -function selectBsTabByHash( tabs_container_id ){ +function selectBsTabByHash(tabs_container_id) { /* Check for location.hash in the page URL */ /* If present the location hash will be used to activate the correct tab */ var hash = document.location.hash; - if( hash !== "" ){ - $('#' + tabs_container_id + ' a[href="' + hash + '"]').tab('show'); + if (hash !== "") { + $("#" + tabs_container_id + ' a[href="' + hash + '"]').tab("show"); } else { - $('#' + tabs_container_id + ' a:first').tab('show'); + $("#" + tabs_container_id + " a:first").tab("show"); } } -- 2.30.2