From 0390e6ca464200b211f5c8f8628022f96216be13 Mon Sep 17 00:00:00 2001 From: "CORP\\mabrahamson" Date: Thu, 29 Apr 2021 18:17:08 -0500 Subject: [PATCH 1/2] Initial work on writing template JS files Currently non-functional, DO NOT MERGE --- Koha/Plugin/EDS.pm | 51 +- Koha/Plugin/EDS/admin/release_notes.xml | 4 +- Koha/Plugin/EDS/js/EDSScript.js | 2 +- Koha/Plugin/EDS/js/EDSScript.tt | 1224 +++++++++++++++++++++++ build.py | 8 +- eds_plugin_20.05002.kpz | Bin 295677 -> 308143 bytes 6 files changed, 1275 insertions(+), 14 deletions(-) create mode 100644 Koha/Plugin/EDS/js/EDSScript.tt diff --git a/Koha/Plugin/EDS.pm b/Koha/Plugin/EDS.pm index dd1031f..72abd64 100644 --- a/Koha/Plugin/EDS.pm +++ b/Koha/Plugin/EDS.pm @@ -28,7 +28,7 @@ our $MAJOR_VERSION = "20.05"; our $SUB_VERSION = "002"; our $VERSION = $MAJOR_VERSION . "" . $SUB_VERSION; our $SHA_ADD = "https://widgets.ebscohost.com/prod/api/koha/sha/1711.json"; -our $DATE_UPDATE = '2021-03-24'; +our $DATE_UPDATE = '2021-04-29'; ###################################################### ## Here is our metadata, some keys are required, some are optional @@ -132,7 +132,7 @@ sub configure { autocomplete => ($cgi->param('autocomplete')?$cgi->param('autocomplete'):"-"), } ); - + update_EDSScript_js($self, $cgi, $cgi->param('defaultsearch')?$cgi->param('defaultsearch'):"-"); if($cgi->param('edsinfo') eq 'Update Required'){ $self->store_data( @@ -149,6 +149,28 @@ sub configure { $self->go_home(); } +sub update_EDSScript_js { + my ($self, $cgi, $defaultSearch) = @_; + my $vars = { + defaultSearch => $defaultSearch + }; + my $pluginsdir = C4::Context->config('pluginsdir'); + my @pluginsdir = ref($pluginsdir) eq 'ARRAY' ? @$pluginsdir : $pluginsdir; + my @plugindirs; + foreach my $plugindir ( @pluginsdir ){ + $plugindir .= "Koha/Plugin/EDS/js"; + push @plugindirs, $plugindir + } + my $template = Template->new({ + INCLUDE_PATH => \@plugindirs + }); + + my $edsscript_js; + $template->process('EDSScript.tt',$vars, $edsscript_js); + $template->process('EDSScript.tt',$vars, 'EDSScript.js'); + $self->store_data({ edsscript_js => $edsscript_js }); + +} sub install() { my ( $self, $args ) = @_; @@ -188,16 +210,27 @@ sub uninstall() { #my $enableEDSUpdate = C4::Context->dbh->do("UPDATE `systempreferences` SET `value`='0' WHERE `variable`='EDSEnabled'"); } +#Update the JS file to include the correct variables without needing to call SQL +sub update_search { + my ( $self, $default_search) = @_; + +} + sub opac_js { my ( $self ) = @_; my $default_search = $self->retrieve_data('defaultsearch'); - return q| - - - |; + my $edsscript_js = $self->retrieve_data('edsscript_js'); + return qq{ + + + }; + #return q| + # + # + #|; } diff --git a/Koha/Plugin/EDS/admin/release_notes.xml b/Koha/Plugin/EDS/admin/release_notes.xml index 97fbcd1..f118758 100644 --- a/Koha/Plugin/EDS/admin/release_notes.xml +++ b/Koha/Plugin/EDS/admin/release_notes.xml @@ -3,9 +3,9 @@ 20.05.002 https://github.com/ebsco/edsapi-koha-plugin - 2021/03/24 + 2021/04/29 - + Addresses multiple PRs into 20.05 compatible build. See PR #90 for Full Details. diff --git a/Koha/Plugin/EDS/js/EDSScript.js b/Koha/Plugin/EDS/js/EDSScript.js index 31d0d3f..c55043f 100644 --- a/Koha/Plugin/EDS/js/EDSScript.js +++ b/Koha/Plugin/EDS/js/EDSScript.js @@ -8,7 +8,7 @@ var edsSelectedKnownItem = ""; var browseNextPage = ""; var catalogueId = ""; var nocorrect = ""; - +var defaultsearch = ""; //-configurable in plugin config var edsSwitchText = ''; var kohaSwitchText = ''; diff --git a/Koha/Plugin/EDS/js/EDSScript.tt b/Koha/Plugin/EDS/js/EDSScript.tt new file mode 100644 index 0000000..f8ef48e --- /dev/null +++ b/Koha/Plugin/EDS/js/EDSScript.tt @@ -0,0 +1,1224 @@ +[% USE Koha %] +var template = "This is a template"; +var knownItem = ''; +var activeState = 0; +var edsOptions = ""; +var kohaOptions = ""; +var firstTimeSearchOptions = ""; +var edsSelectedKnownItem = ""; +//var defaultSearch=""; set by configure +var browseNextPage = ""; +var catalogueId = ""; +var nocorrect = ""; +var defaultsearch = "[% defaultSearch %]"; +//-configurable in plugin config +var edsSwitchText = ''; +var kohaSwitchText = ''; +var edsSelectText = ''; +var edsSelectInfo = ''; +var kohaSelectInfo = ''; + +var defaultParams = ''; +var multiFacet = {}; +var activeFacets = 0; +//-basket stuff +var edsConfig = ""; +var EDSItems = 0; +var verbose = QueryString('verbose'); +var bibListLocal = 0; + +// Adv search settings +var searchBlockCount = 3; + +// DO NOT TOUCH - controlled by build.py +var versionEDSKoha = "20.05002"; +/////////////////////////////////////// + +if (document.title == "") { + document.title = "Koha - EDS Plugin"; +} + +// jStorage replacement +var eds_sessionStorage = { + set: function (key, val) { + if (typeof val == "object") { + val = JSON.stringify(val); + } + sessionStorage.setItem("edsPlugin_" + key, val); + }, + get: function (key) { + var retData = sessionStorage.getItem("edsPlugin_" + key); + try { + retData = JSON.parse(retData); + } catch (error) { } + return retData; + }, + remove: function (key) { + sessionStorage.removeItem(key); + }, + flush: function () { + for (var key in sessionStorage) { + if (key.indexOf("edsPlugin_") != -1) eds_sessionStorage.remove(key); + } + }, + debug: function () { + for (var key in sessionStorage) { + if (key.indexOf("edsPlugin_") != -1) console.log(key + ": " + eds_sessionStorage.get(key)); + } + } +} + +jQuery.ajax({ url: "/plugin/Koha/Plugin/EDS/js/custom/custom.js", dataType: "script", cache: true }); + +if ((document.location.pathname.indexOf("eds-detail.pl")) > -1 && ($.cookie("guest") == 'n')) { + $("#ulactioncontainer ul:contains(cart)").append('\ +
  • \ + \ + Download Citation\ + \ +
  • \ + '); + function ris_download() { + + var details = {}; + $(document.location.search.split(/[&\?|]/)).each(function () { + if (this != "") { + var a = this.split("="); + details[a[0]] = a[1]; + } + }); + + $.get("/plugin/Koha/Plugin/EDS/opac/eds-cite.pl?an=" + details.an + "&dbid=" + details.dbid).done(function (data) { + + var text = JSON.parse(data).Data; + var element = document.createElement('a'); + var filename = $(".title")[0].innerText + ".ris"; + element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); + element.setAttribute('download', filename); + element.style.display = 'none'; + document.body.appendChild(element); + element.click(); + document.body.removeChild(element); + }); + } + + window.ris_download = ris_download; +} + +delCookie = function (name) { + var exp = new Date(); + exp.setTime(exp.getTime() - 1); + if (parent.opener) { + parent.opener.document.cookie = name + "=null; path=/; expires=" + exp.toGMTString(); + } else { + document.cookie = name + "=null; path=/; expires=" + exp.toGMTString(); + } +} + +if (QueryString('debug') != "1") { $(window).error(function (e) { e.preventDefault(); }); } +else { console.log('JS debug enabled') }// keep executing if there is an error.} + +///// Language data setup ///// +function getLanguage(code, callback) { + // Use cache + var sessionLang = eds_sessionStorage.get('lang_' + code); + if (sessionLang) { + callback(sessionLang); + return; + // If custom language, and there's no language file for it + } else if (code != 'default' && eds_sessionStorage.get('nolang_' + code)) { + getLanguage('default', callback); + return; + } + + // Fetch the language file + jQuery.ajax({ url: "/plugin/Koha/Plugin/EDS/bootstrap/includes/lang/" + code + ".inc", dataType: "script", cache: true }) + .done(function (data) { + + // Parse language file + var langData = {}; + var lineData = data.split("var EDSLANG =")[1].split("\n"); + for (line in lineData) { + if (lineData[line].indexOf(":") != -1) { + var parts = lineData[line].split(":"); + var key = parts[0].replace(/\s/g, ""); + var val = parts[1].replace(/',|",|'|"/g, "").trim(); + langData[key] = val; + } + } + + eds_sessionStorage.set('lang_' + code, langData); + callback(langData); + + // No language file, try default + }).fail(function () { + if (code == 'default') { + callback(null); + } else { + console.error("No " + code + " language file, trying default"); + eds_sessionStorage.set('nolang_' + code, true); + getLanguage('default', callback); + } + }); +} + +var plugin_lang = document.querySelector('html').lang; +getLanguage(plugin_lang, StartEDS); + +///////////////////////////// + +function eds_img_resize(e) { + if (e.height > e.width) { + $(e).addClass("sc_height"); + } else { + $(e).addClass("sc_width"); + } +} + +$('body').on('click', '.search-in-pub-button', function () { + currentPubButton = this; + searchTerm = jQuery(currentPubButton).parent().find('.search-in-pub-field').val(); + pubAction = jQuery(currentPubButton).parent().find('.search-in-pub-field').data('action'); + SearchPublication(searchTerm, pubAction); +}); + +$('body').on('click', '.diag-img', function (e) { + e.preventDefault(); + $("body").addClass("eds_noscroll"); + $("body").append('\ +
    \ + ×\ + \ +
    '); +}); + +$.each($.cookie('bib_list').split("/"), function () { + if (this != "") { + var code = this.split("__")[0]; + $(".cart" + code).html(MSG_ITEM_IN_CART).addClass("incart"); + $(".cartR" + code).show(); + } +}); + +function StartEDS(edsLang) { + //console.log("Running startEDS..."); + if (!edsLang) { + console.error("No language files found, the plugin is broken"); + return; + } + + window.edsLang = edsLang; + + //-configurable in plugin config + edsSwitchText = edsLang.eds_switch_text; + kohaSwitchText = edsLang.koha_switch_text; + edsSelectText = edsLang.eds_select_text; + kohaSelectText = edsLang.koha_select_text; + edsSelectInfo = edsLang.eds_select_info; + kohaSelectInfo = edsLang.koha_select_info; + + + jQuery(window).resize(function () { try { ApplyPlaceAdjustments(); } catch (err) { ApplyPlaceAdjustments(); } }); + ApplyPlaceAdjustments(); + + + PublisherDateSlider(); + + + if ($.cookie("guest") == 'y') { + jQuery('.results_summary.actions.links a, #opac-detail a.pdflink').each(function () { + jQuery(this).attr('href', 'javascript:LoginRequired()'); + jQuery(this).attr('target', '_self'); + }); + + } + + //Commenting out caching in favor of immediate updating of settings + //var sessionConfig = eds_sessionStorage.get("edsConfig"); + //if (sessionConfig) { + // ConfigData(sessionConfig); + //} else { + // ConfigDefaultData(); + $.getJSON('/plugin/Koha/Plugin/EDS/opac/eds-raw.pl' + '?' + 'q=config', function (data) { ConfigData(data); }); + //} + + //$("#masthead_search").attr("disabled","disabled"); + if (typeof $('.back_results a').attr('href') != 'undefined') { EDSSetDetailPageNavigator(); } + + InitCartWithEDS(); // cart management + + jQuery('#eds-autosuggest').click(function () { + nocorrect = "&nocorrect=1"; + var autoSuggestText = jQuery(this).text(); + jQuery('#translControl1').val(autoSuggestText); + jQuery('#searchsubmit').trigger('click'); + }); + + jQuery('#eds-edsautocorrect').click(function () { + var autoSuggestText = jQuery(this).text(); + jQuery('#translControl1').val(autoSuggestText); + jQuery('#searchsubmit').trigger('click'); + }); + + if (edsConfig.autocomplete == "yes") { + EDSAutoComp(); + } + +} + +function PFIAtoZBar() { + var barHolder = '
    • ' + edsLang.pfi_atoz_bar + '
    • '; + var firstChar = "A", lastChar = "Z"; + for (var i = firstChar.charCodeAt(0); i <= lastChar.charCodeAt(0); i++) { + var alphaChar = eval("String.fromCharCode(" + i + ")"); + alphaChar = '
    • ' + alphaChar + '
    • '; + barHolder += alphaChar; + } + barHolder += '
    '; + jQuery('#pfi-selections-toolbar').html(barHolder); + jQuery('.pfialpha').click(function () { + var currentAlpha = this; + window.location.href = "pfi-search.pl?q=Search?query-1=AND,:{JN+" + jQuery(currentAlpha).text() + "*}|sort=title"; + }); +} + +function SearchPublication(searchinTerm, pubAction) { + window.location.href = '/plugin/Koha/Plugin/EDS/opac/eds-search.pl?q=Search?query-1=AND,:{' + searchinTerm + '}|action=addfacetfilter(' + encodeURIComponent(pubAction) + ')&default=1'; +} + + +// function ConfigDefaultData() { +// GoDiscovery(true); +// //console.log('configured'); +// } + +function ConfigData(data) { + + window.edsConfig = data; + + eds_sessionStorage.set('edsConfig', data); + + catalogueId = (data.cataloguedbid == "-") ? "" : data.cataloguedbid; + defaultParams = (data.defaultparams == "-") ? "" : data.defaultparams; + + + if (data.defaultsearch != "off") { + var currentDefaultSearchValue = eds_sessionStorage.get('defaultSearch'); + if (!currentDefaultSearchValue) { + eds_sessionStorage.set('defaultSearch', data.defaultsearch) + } + GoDiscovery(); + } +} + +function GoDiscovery() { + + try { edsSelectedKnownItem = edsKnownItem } catch (e) { edsSelectedKnownItem = ''; } + + var optionSelect = 1; + kohaOptions = ''; + $('#masthead_search option').each(function () { + var optionText = $(this).text().replace('--- ', ''); + var optionSelected = ""; + if ($(this).val() != "") { optionText = "--- " + optionText; } + if ($(this).val() == "") { optionText = kohaSelectText; } + if (optionSelect == 1 && optionText == kohaSelectText) { optionSelected = ' selected '; optionSelect = 0 } + kohaOptions += ''; + firstTimeSearchOptions = kohaOptions; + $(this).remove(); + }); + + if (firstTimeSearchOptions != "") { + kohaOptions = firstTimeSearchOptions; + } + + $('#masthead_search option').remove(); + kohaOptions = "" + kohaOptions; + $('#masthead_search').append(kohaOptions); + //$('#masthead_search option[value="eds"]').remove(); + //$('#masthead_search').prepend(""); + $('#masthead_search option[value=""]').attr("selected", "selected"); + $("#masthead_search").change(function () { + knownItem = $(this).val(); + if (($(this).val() == 'eds') && (eds_sessionStorage.get('defaultSearch') != 'eds')) { SetEDS(1); }// Search EDS + else if (($(this).val() == '') && (eds_sessionStorage.get('defaultSearch') != 'koha')) { SetKoha(1); }// Search Koha + }); + + if (eds_sessionStorage.get('edsKnownItems')) { + SetEDSOptions(eds_sessionStorage.get('edsKnownItems')); + } else { + SetEDSOptions(JSON.parse('[{"FieldCode":"AU","Label":"Author"},{"FieldCode":"TI","Label":"Title"}]'));// Hardcoded to improve initial loading time. Uses cached values from the server the seconds time. + $.getJSON('/plugin/Koha/Plugin/EDS/opac/eds-raw.pl?q=knownitems', function (data) { StoreEDSOptions(data); }); + } + + if (eds_sessionStorage.get('defaultSearch') == 'eds') { + SetEDS(0); + } + +} + +function StoreEDSOptions(data) { + if (!eds_sessionStorage.get('edsKnownItems')) { + eds_sessionStorage.set('edsKnownItems', data) + SetEDSOptions(data); + } +} + +function SetEDSOptions(data) { + edsOptions = ''; + edsOptions += ''; + for (var i = 0; i < data.length; i++) { + var selectedItem = ""; + if (edsSelectedKnownItem == data[i].FieldCode) { selectedItem = 'selected="selected"' } + edsOptions += ''; + } + + if (eds_sessionStorage.get('defaultSearch') == "eds") { + SetEDS(0); + } else if (eds_sessionStorage.get('defaultSearch') == "koha") { SetKoha(0); } + + var date = new Date(); + var minutes = 30; + date.setTime(date.getTime() + (minutes * 60 * 1000)); + //$.cookie("isEDSData","1", { expires: date }); +} + +function SetEDS(showInfo) { + $('#searchform').submit(function () { return false; }); + $('#searchsubmit').click(SearchEDS); + $('#masthead_search option').each(function () { $(this).remove(); }); + if (showInfo) { ShowInfo(edsSelectInfo); } + $('#masthead_search').append(edsOptions); + eds_sessionStorage.set('defaultSearch', 'eds'); + $('#transl1').val($.cookie('QueryTerm')); + $('.transl1').val($.cookie('QueryTerm')); //for 314 + $('#searchBread').text(edsLang.search_breadcrumb + " " + $.cookie('QueryTerm')); + $('#transl1').removeClass('placeholder'); + //advSearch + if (document.URL.indexOf("/plugin/Koha/Plugin/EDS/opac/eds-search.pl") != -1 && QueryString('q') == "") { + $('a[href="/cgi-bin/koha/opac-search.pl"]').attr('title', kohaSwitchText); + } else if (document.URL.indexOf("/cgi-bin/koha/opac-search.pl") != -1 && QueryString('q') == "") { + $('a[href="/cgi-bin/koha/opac-search.pl"]').attr('title', edsSwitchText); + $('a[href="/cgi-bin/koha/opac-search.pl"]').attr('href', '/plugin/Koha/Plugin/EDS/opac/eds-search.pl'); + } else { + $('a[href="/cgi-bin/koha/opac-search.pl"]').attr('href', '/plugin/Koha/Plugin/EDS/opac/eds-search.pl'); + } + + if (document.URL.indexOf("/plugin/Koha/Plugin/EDS/opac/pfi-search.pl") != -1) { + $('#masthead_search option[value="JN"]').prop('selected', true); + knownItem = "JN"; + } + + EDSAutoComp(); +} + +function SetKoha(showInfo) { + $('#searchform').unbind('submit'); + $('#searchsubmit').unbind('click'); + $('#masthead_search option').each(function () { $(this).remove(); }); + if (showInfo) { ShowInfo(kohaSelectInfo); } + $('#masthead_search').append(kohaOptions); + $('#masthead_search option[value="eds"]').remove(); + $('#masthead_search').prepend(""); + eds_sessionStorage.set('defaultSearch', 'koha') + //advSearch + if (document.URL.indexOf("/plugin/Koha/Plugin/EDS/opac/eds-search.pl") != -1 && QueryString('q') == "") { + $('a[href="/cgi-bin/koha/opac-search.pl"]').attr('title', kohaSwitchText); + } else if (document.URL.indexOf("/cgi-bin/koha/opac-search.pl") != -1 && QueryString('q') == "") { + $('a[href="/cgi-bin/koha/opac-search.pl"]').attr('title', edsSwitchText); + $('a[href="/cgi-bin/koha/opac-search.pl"]').attr('href', '/plugin/Koha/Plugin/EDS/opac/eds-search.pl'); + } else { + $('a[href="/plugin/Koha/Plugin/EDS/opac/eds-search.pl"]').attr('href', '/cgi-bin/koha/opac-search.pl'); + } + $('#translControl1').autocomplete("destroy"); +} + +function ShowInfo(msg) { + var topPos = $('#masthead_search').offset().top; + var leftPos = $('#masthead_search').offset().left; + var cartMsg = $("#cartDetails").html(); + if (activeState == 0) { + activeState = 1; + } + $("#cartDetails").html(msg); + showCart(); + $("#cartDetails").css('left', leftPos + 'px'); + $("#cartDetails").css('top', (topPos + 40) + 'px'); + setTimeout(function () { + hideCart(); + $("#cartDetails").html(cartMsg); + }, 2000); +} + +function SearchEDS() { + var searchTerm; + + try { searchTerm = $('#transl1').val().replace(/\&/g, "%2526"); } catch (err) { + if (searchTerm == undefined) searchTerm = $('.transl1').val().replace(/\&/g, "%2526"); + } // for bootstrap + + if (knownItem == 'eds') { knownItem = ''; } + if (defaultParams === undefined) { defaultParams = ''; } + var apiSearchType = "eds"; + if (knownItem == 'JN') { apiSearchType = "pfi"; } + window.location = '/plugin/Koha/Plugin/EDS/opac/' + apiSearchType + '-search.pl?q=Search?query-1=AND,' + knownItem + ':{' + searchTerm + '}' + defaultParams + '&default=1' + nocorrect; +} + +function EDSGetRecord(recordURL, callingObjParent) { + recordURL = recordURL.replace(/\%26/g, "%2526"); + $.getJSON('/plugin/Koha/Plugin/EDS/opac/eds-raw.pl' + '?' + 'q=Search?' + recordURL, function (data) { EDSGoToRecord(data); }); + $('.' + callingObjParent).html('
    '); +} + +function EDSGoToRecord(data) { + var gotoURL = '/plugin/Koha/Plugin/EDS/opac/eds-detail.pl?q=Retrieve?an=' + data.SearchResult.Data.Records[0].Header.An + '|dbid=' + data.SearchResult.Data.Records[0].Header.DbId + '&resultid=' + data.SearchResult.Data.Records[0].ResultId; + if (data.SearchResult.Data.Records[0].Header.DbId.indexOf(catalogueId) > -1) { + gotoURL = '/cgi-bin/koha/opac-detail.pl?resultid=' + data.SearchResult.Data.Records[0].ResultId + '&biblionumber=' + data.SearchResult.Data.Records[0].Header.An.replace(edsConfig.catalogueanprefix, ''); + } + window.location = gotoURL; +} + + +function EDSBrowseResults(fetchURL) { + + var currentBrowsePage = fetchURL; + regex = /pagenumber\=\d/; + currentBrowsePage = currentBrowsePage.match(regex)[0]; + currentBrowsePage = currentBrowsePage.replace('pagenumber=', ''); + browseNextPage = eval(currentBrowsePage) + 1; + browseNextPage = fetchURL.replace(/pagenumber\=\d/, 'pagenumber=' + browseNextPage); + $("li[title='More Results']").html('
    '); + + $.getJSON('/plugin/Koha/Plugin/EDS/opac/eds-raw.pl' + '?' + 'q=Search?' + fetchURL, function (data) { EDSAppendToBrowse(data); }); +} + +function EDSAppendToBrowse(data) { + var totalHits = data.SearchResult.Statistics.TotalHits; + var maxResultId = ""; + var searchResults = ''; + for (var i = 0; i < data.SearchResult.Data.Records.length; i++) { + try { + searchResults += '
  • ' + data.SearchResult.Data.Records[i].ResultId + '. ' + $('
    ').html(data.SearchResult.Data.Records[i].Items[0].Data).text() + '
  • '; + maxResultId = data.SearchResult.Data.Records[i].ResultId; + } catch (e) { + searchResults += '
  • ' + data.SearchResult.Data.Records[i].ResultId + '. ' + edsLang.login_to_access + '
  • '; + $('.FullTextLoader').css('display', 'none'); + } + } + if (maxResultId < totalHits) { + searchResults += '
  • ' + edsLang.view_more_results + '
  • '; + } + $("li[title='More Results']").remove('li'); + $(".pagination_list").css('max-height', $(window).height() - ($('.nav_results').offset().top + 100)); + $(".pagination_list").css('overflow', 'auto'); + $("#browseLoader").css('display', 'none'); + $("#ul_pagination_list").append(searchResults); + $("#ul_pagination_list").css('padding-top', '0px'); +} + +function EDSSetDetailPageNavigator() { + $('#titleBread').text($('#titleBread').text() + $('.title').text()); + if ($('.back_results a').attr('href').indexOf('q=Search?') > -1) { + $("#a_listResults").unbind('click'); + $("#ul_pagination_list").append('
    '); + $("#a_listResults").click(function (e) { + var navigation = $(".results-pagination"); + if (navigation.css("display") == 'none') { + navigation.show(); + } else { + navigation.hide(); + } + }); + $("#close_pagination").click(function (e) { + var navigation = $(".results-pagination"); + navigation.hide(); + }); + EDSBrowseResults($.cookie('ReturnToResults')); + if ($('.back_results a').attr('href').indexOf('opac-search.pl?q=Search?') > -1) { + $('.back_results a').attr('href', $('.back_results a').attr('href').replace('opac-search.pl?q=Search?', '/plugin/Koha/Plugin/EDS/opac/eds-search.pl?q=Search?')); + } + var resultId = QueryString('resultid'); + var previousResult = parseInt(resultId) - 1; + var nextResult = parseInt(resultId) + 1; + var simpleQuery = $.cookie('EDSSimpleQuery'); + if (previousResult > 0) { + $('.left_results').html('« ' + edsLang.previous + ''); + } + if (nextResult < 250 && nextResult < $.cookie('ResultTotal')) { + $('.right_results').html('' + edsLang.next + ' »'); + } + } + $('.breadcrumb a:contains("Details for:")').text('Details for: ' + $('.title').text()); + + if (QueryString('fulltext') == 'html') { + $('.html-customlink').each(function () { + if ($(this).text().trim() == "HTML Full Text") { + $('.FullTextLoader').css('display', 'block'); + window.location.href = $(this).attr('href'); + return false; + } + }); + } else if (QueryString('fulltext') != '') { + $('.' + QueryString('fulltext')).each(function () { + //if($(this).text().trim()=="PDF Full Text"){ + $('.FullTextLoader').css('display', 'block'); + window.location.href = $(this).attr('href'); + return false; + //} + }); + } +} + +function MinFullTextLoader() { + + if ($('.FullTextLoader').css('height') == "40px") + $('.FullTextLoader').css('height', '100%'); + else + $('.FullTextLoader').css('height', '40px'); +} + +function LoginRequired() { + alert(edsLang.login_to_access); + $('.FullTextLoader').css('display', 'none'); +} + +function QueryString(key) { + var re = new RegExp('(?:\\?|&)' + key + '=(.*?)(?=&|$)', 'gi'); + var r = [], m; + while ((m = re.exec(document.location.search)) != null) r.push(m[1]); + return r; +} + +//BASKET START--------- +function InitCartWithEDS() { + jQuery('#addto').change(function () { CheckEDSRecordsforAddToList(); }); + jQuery('.addto input:submit').click(function () { CheckEDSRecordsforAddToList(); }); + + if (document.URL.indexOf('opac-basket.pl') != -1) {// basket stuff. + document.cookie = 'bib_list=' + QueryString('bib_list') + ";path=/"; + PrepareItems(); + } + + if ((document.URL.indexOf('opac-downloadcart.pl') != -1) || (document.URL.indexOf('opac-sendbasket.pl') != -1)) { + SetEDSCartField(); + } +} + +async function PrepareItems() { + + //Get Bib numbers from the url + var recordList = document.URL; + recordList = QueryString("bib_list").toString(); + + //Split bib list into array on / + var recordId = recordList.split("/"); + + //Iterate through all the record IDs + for (var edsItemCount = 0; edsItemCount < recordId.length - 1; edsItemCount++) { + //Check that it doesn't have the catalogue dbid + if (recordId[edsItemCount].indexOf(edsConfig.cataloguedbid) == -1) + //Look for bib numbers that include a | as these will be EDS records + if (recordId[edsItemCount].indexOf("__") != -1) + //If we find a EDS record, up the count + EDSItems++; + } + + //If we have any EDS items, we need to add the loader + if (EDSItems > 0) { + $('#download_cart').prop('action', '/plugin/Koha/Plugin/EDS/opac/2005/opac-downloadcart.pl'); + $('.print-large, .print').attr('onclick', ''); // .print for prog + $('.print-large, .print').attr('href', 'javascript:window.print();location.reload();'); // .print for prog + $('#itemst').append('  ' + edsLang.basket_loading + '   '); + $(".dataTables_empty").css('display', 'none'); + await IterateEDSItems(recordId); + SetEDSCartField(); + } + + if ((EDSItems == 0)) { + $('#EDSBasketLoader').remove() + } + + + +} +async function IterateEDSItems(recordId) { + //iterate through all the EDS items + for (i = 0; i < recordId.length - 1; i++) { + //ignore catalogue records + if (recordId[i].indexOf(edsConfig.cataloguedbid) == -1) { + //get the current record ID from cache + var recordDataCache = eds_sessionStorage.get(recordId[i]); + //If recordDataCache is null or is an EDS record due to __ + if (recordDataCache == null && recordId[i].indexOf('__') != -1) { + //set recordId to be a retrieve call? + recordId[i] = "Retrieve?an=" + recordId[i].replace(/\_dot\_/g, ".").replace("__", "|dbid="); + //get the data from eds through the "raw" api call + getRecord = new Promise(resolve => { + $.getJSON('/plugin/Koha/Plugin/EDS/opac/eds-raw.pl' + '?' + 'q=' + recordId[i], function (data) { + //use the data to GetEDSItems + AN = data.Record.Header.An.replace(/\./g, "_dot_"); + let selector = AN + "__" + data.Record.Header.DbId; + if (verbose == 1) { BuildMoreDetails(data) } else { GetEDSItems(data); } + $(`[id="${selector}"]`).bind('change', function () { selRecord(this.value, this.checked) }); + resolve(true); + }); + }); + await getRecord; + + } else if (recordDataCache) { + //If we had recordDataCache, use that + if (verbose == 1) { + BuildMoreDetails(recordDataCache); + } else { + GetEDSItems(recordDataCache); + } + } + + } + } +} + +function GetEDSItems(data) { + AN = data.Record.Header.An.replace(/\./g, "_dot_"); + try { + $('#itemst').append('' + $("
    ").html(data.Record.Items[0].Data).text() + '' + $("
    ").html(data.Record.Items[1].Data).text() + '' + data.Record.RecordInfo.BibRecord.BibRelationships.IsPartOfRelationships[0].BibEntity.Dates[0].Y + '' + edsLang.basket_item_location + ''); + EDSItems--; + if (EDSItems == 0) { $('#EDSBasketLoader').remove() } + + eds_sessionStorage.set(AN + '__' + data.Record.Header.DbId, data); + + } catch (e) { + console.log(e); + EDSItems--; + if (EDSItems == 0) { $('#EDSBasketLoader').remove() } + } + + jQuery('.cb').click(function () { + enableCheckboxActions(); + var selectedValues = document.myform.records.value; + var containsEDSItems = (selectedValues.replace('__' + edsConfig.cataloguedbid, edsConfig.cataloguedbid).indexOf('__') > -1) ? true : false; + + + if (containsEDSItems) { + jQuery('.hold, .newshelf').addClass('disabled'); + } + + jQuery('.hold').removeAttr('onclick'); + jQuery('.hold').unbind('click'); + jQuery('.hold').click(function () { + if (containsEDSItems) { + alert(edsLang.basket_deselect_hold); + } else { + holdSel(); return false; + } + }); + + jQuery('.newshelf').removeAttr('onclick'); + jQuery('.newshelf').unbind('click'); + jQuery('.newshelf').click(function () { + if (containsEDSItems) { + alert(edsLang.basket_deselect_list); + } else { + addSelToShelf(); return false; + } + }); + }); +} + +function CheckEDSRecordsforAddToList() { + var containsEDS = false; + jQuery('tr input[type="checkbox"]:checked').each(function () { + var currentCheckBox = this; + checkBoxVal = jQuery(currentCheckBox).val(); + var containsEDSItems = (checkBoxVal.replace('__' + edsConfig.cataloguedbid, edsConfig.cataloguedbid).indexOf('__') > -1) ? true : false; + + if (containsEDSItems) { + containsEDS = true; + return false; + } + + }); + + if (containsEDS == true) { + //jQuery(newin).on('load', function () { + //alert(newin.location.pathname); + if (newin.location.pathname !== undefined) { + alert(edsLang.basket_deselect_list); + newin.close(); + } + //}); + } +} + + +function SetEDSCartField() { + //Use the EDS version of sendbasket + + if ($('#sendbasketform')) { + $('#sendbasketform').prop('action', '/plugin/Koha/Plugin/EDS/opac/2005/opac-sendbasket.pl'); + } + //GET record list from URL and split into array on / + var recordList = document.URL; + recordList = QueryString("bib_list").toString(); + //recordList = recordList.replace(/\_dot\_/g, "."); + var recordId = recordList.split("/"); + + var fieldDataObj = { Records: [] }; + + //For each recordID + for (i = 0; i < recordId.length - 1; i++) { + // ignore catalogue records + if (recordId[i].indexOf(edsConfig.cataloguedbid) == -1) { + //Create a field Record Object + var fieldRecordObj = {}; + fieldRecordObj[recordId[i]] = eds_sessionStorage.get(recordId[i]); + //Push to the FieldDataObject Records Array + fieldDataObj.Records.push(fieldRecordObj); + } + } + //Add a hidden object with fieldDataObject + //if on SendCart, put in different place than if on the general cart screen + if ($('#sendbasketform')) { + $('.action').prepend(''); + } + if ($('#download_cart')) { + $('#download_cart').append(''); + } + +} + + + +function sendBasket() { // override function in basket.js + var nameCookie = "bib_list"; + var valCookie = readCookie(nameCookie); + var strCookie = nameCookie + "=" + valCookie; + + var loc = "/plugin/Koha/Plugin/EDS/opac/2005/opac-sendbasket.pl?" + strCookie; + + var optWin = "scrollbars=yes,resizable=yes,height=600,width=900,top=50,left=100"; + var win_form = open(loc, "win_form", optWin); +} + +function downloadBasket() { // override function in basket.js + var nameCookie = "bib_list"; + var valCookie = readCookie(nameCookie); + var strCookie = nameCookie + "=" + valCookie; + + var loc = "/plugin/Koha/Plugin/EDS/opac/2005/opac-downloadcart.pl?" + strCookie; + + open(loc, "win_form", 'scrollbars=no,resizable=no,height=300,width=450,top=50,left=100'); +} + +//BASKET END---- + +function BuildMoreDetails(detailedRecord) { + try { + var recordDbId = detailedRecord.Record.Header.DbId; + var recordAN = detailedRecord.Record.Header.An; + + var moreDetailsData = '\ +

    \ + \ + '+ detailedRecord.Record.RecordInfo.BibRecord.BibEntity.Titles[0].TitleFull + '\ +

    \ + \ + '; + + for (itemCount = 0; itemCount < detailedRecord.Record.Items.length; itemCount++) { + if (detailedRecord.Record.Items[itemCount].Label != "Title") { + moreDetailsData = moreDetailsData + '\ + \ + \ + \ + \ + '; + } + } + + + moreDetailsData = moreDetailsData + '\ + \ +
    \ + '+ detailedRecord.Record.Items[itemCount].Label + '\ + \ +

    '+ $('

    ').html(detailedRecord.Record.Items[itemCount].Data).text() + '

    \ +
    \ + '; + + $('#bookbag_form').append(moreDetailsData); + + } catch (err) { } +} + + +//ADVANCED SEARCH START +function AddSearchBlock(blockNo) { + var newBlock = $('#searchFields_' + blockNo).html(); + newBlock = newBlock.replace("(" + blockNo + ")", "(" + (blockNo + 1) + ")"); + newBlock = newBlock.replace("(" + blockNo + ")", "(" + (blockNo + 1) + ")"); + newBlock = newBlock.replace('style="display:none;"', ""); + $('#searchFields_' + blockNo + ' .addRemoveLinks').css('display', 'none'); + $("#searchBlock").append('
  • ' + newBlock + '
  • '); + searchBlockCount++; +} +function RemoveSearchBlock(blockNo) { + $('#searchFields_' + blockNo).remove(); + searchBlockCount--; + $('#searchFields_' + searchBlockCount + ' .addRemoveLinks').css('display', 'inline'); +} + +function AdvSearchEDS() { + var advQuery = ""; + for (sbCount = 1; sbCount <= searchBlockCount; sbCount++) { + var advBool = $("#searchFields_" + sbCount + " .advBool").val(); if (advBool == undefined) { advBool = "AND"; } + var advKi = $("#searchFields_" + sbCount + " .advFieldCode").val(); + var advTerm = $("#searchFields_" + sbCount + " .advInput").val(); + if (advTerm == undefined) { advTerm = ""; } else { advTerm = advTerm.replace(/\&/g, "%2526"); } + + if (advTerm.length > 1) + advQuery += "query-" + sbCount + "=" + advBool + "," + advKi + ":{" + advTerm + "}|"; + } + + $("input.advSBOps").each(function (index, value) { + + if (jQuery(this).attr("type") == "checkbox" || jQuery(this).attr("type") == "radio") { + if (jQuery(this).is(":checked")) { + jQuery(this).val(jQuery(this).val().replace(":value", ":y")); + advQuery += "action=" + jQuery(this).val() + "|"; + } + } else if (jQuery(this).attr("type") == "text") { + if (jQuery(this).val().length > 1) { + jQuery(this).attr("data-action", jQuery(this).attr("data-action").replace(":value", ":" + jQuery(this).val())); + advQuery += "action=" + jQuery(this).attr("data-action") + "|"; + } + } + }); + + $("select.advSBOps option:selected").each(function (index, value) { + advQuery += "action=" + $(this).val() + "|"; + }); + + //dateRange + var fromMonth = ($("#common_DT1").val() == "") ? "01" : $("#common_DT1").val(); + var toMonth = ($("#common_DT1_ToMonth").val() == "") ? "12" : $("#common_DT1_ToMonth").val(); + var fromYear = $("#common_DT1_FromYear").val(); + var toYear = $("#common_DT1_ToYear").val(); + if (fromYear != "YYYY" && toYear != "YYYY") { + if (isNaN(fromYear) || isNaN(toYear)) { + alert(edsLang.date_valid_format); + $("#common_DT1_FromYear").focus(); + return; + } else { + advQuery += "action=" + jQuery("#common_DT1_FromYear").attr("data-action").replace(":value", ":" + fromYear + "-" + fromMonth + "/" + toYear + "-" + toMonth); + } + } + + //alert(advQuery); + window.location.href = "eds-search.pl?q=Search?" + advQuery; + +} +//ADVANCED SEARCH END + +// Multiple Facets START + +function SetFacet(checkBoxItem) { + + var facetAction = jQuery(checkBoxItem).next().attr('href'); + + // If no multiFacet store, create it + if (Object.keys(multiFacet).length == 0) { + var action = []; + facetAction.split("__").slice(1).forEach(function (item, index, arr) { + var e = item.split("="); + + if (multiFacet[e[0]]) { + if (typeof multiFacet[e[0]] == "object") { + multiFacet[e[0]].push(e[1]); + } else { + var arr = [multiFacet[e[0]]]; + arr.push(e[1]); + multiFacet[e[0]] = arr; + } + } else { + multiFacet[e[0]] = e[1]; + } + + }); + multiFacet.action = action; + } + + var newAction = facetAction.substring(facetAction.indexOf('|action')).replace("|", "").split("="); + + if (jQuery(checkBoxItem).is(':checked')) { + multiFacet.action.push(newAction[1]); + activeFacets++; + UpdateFacetButton(1); + } else { + multiFacet.action = removeMatchArray(newAction[1], multiFacet.action); + activeFacets--; + UpdateFacetButton(0); + } + +} + +function removeMatchArray(match, array) { + for (var i = 0; i < array.length; i++) { + if (array[i] == match) { + array.splice(i, 1); + return array; + } + } + return array; +} + +function UpdateFacetButton(state) { + if (activeFacets == 0) { + jQuery('#updatefacets').remove(); + } else if (activeFacets == 1 && state == 1) { + jQuery('body').append(''); + jQuery('#updatefacets').css('top', '102px'); + jQuery('#updatefacets').animate({ "top": "-=100px" }, "fast"); + } else { + jQuery('#updatefacets').animate({ "top": "+=10px" }, "fast"); + jQuery('#updatefacets').animate({ "top": "-=10px" }, "fast"); + } +} + +function UpdateFacet() { + var newEDSURL = document.URL.replace("&default=1", ""); + var str = []; + for (var e in multiFacet) { + if (typeof multiFacet[e] == "object") { + for (var i = 0; i < multiFacet[e].length; i++) { + str.push(e + "=" + multiFacet[e][i]); + } + } else { + str.push(e + "=" + multiFacet[e]); + } + } + window.location.href = document.URL.split("|")[0].replace("&default=1", "") + "|" + str.join("|"); +} + + +function SearchAgain() { + var resultsSelector = (jQuery('#noresultsfound').length) ? '#noresultsfound' : '#top-pages'; // top-pages for bootstrap + var searchQueryString = document.URL; + jQuery(resultsSelector + ' input[type="checkbox"]').each(function () { + var checkItem = this; + if (!jQuery(checkItem).is(':checked')) { + searchQueryString = searchQueryString.replace('|' + jQuery(checkItem).val(), ''); + } + }); + window.location.href = searchQueryString; +} + +// Multile Facets END + +// +function PlacardTabs(placardTab) { + jQuery('#placard-tabs').append(''); + if (jQuery('#placard-tabs a').length == 1) { + jQuery('#' + placardTab + '-tab').addClass('placard-tab-item-active'); + jQuery('#' + placardTab).parent().parent().css('display', ''); + } + + if (jQuery('#placard-tabs a').length > 1) { + jQuery('#placard-tabs').parent().css('display', ''); + } + + jQuery('#' + placardTab + '-tab').click(function () { + jQuery('.placardtab').css('display', 'none'); + jQuery('#placard-tabs a').removeClass('placard-tab-item-active'); + jQuery('#' + placardTab).parent().parent().css('display', ''); + jQuery('#' + placardTab + '-tab').addClass('placard-tab-item-active'); + }); + +} + +function ApplyPlaceAdjustments() { + if (jQuery('.eds-refine').length != 0) { + if (jQuery(window).width() > 1300) { + jQuery('.eds-refine').removeClass('span4').removeClass('span3').addClass('span2'); + jQuery('.maincontent').removeClass('span8').removeClass('span9').addClass('span10'); + } else if (jQuery(window).width() < 1299 && jQuery(window).width() > 900) { + jQuery('.eds-refine').removeClass('span4').removeClass('span2').addClass('span3'); + jQuery('.maincontent').removeClass('span8').removeClass('span10').addClass('span9'); + } else { + jQuery('.eds-refine').removeClass('span2').removeClass('span3').addClass('span4'); + jQuery('.maincontent').removeClass('span10').removeClass('span9').addClass('span8'); + } + } + + jQuery('#published-date').width(jQuery('#eds-dateholder').width() - 70); +} + + +var rangeSlider = ''; +function PublisherDateSlider() { + //Load ionRangeSlider + jQuery.ajax({ url: 'https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.1.3/js/ion.rangeSlider.min.js', dataType: 'script', cache: true }).done(function (data) { + + var pubMaxDate = jQuery("#range-published-date").data("maxdate"); + var pubMinDate = jQuery("#range-published-date").data("mindate"); + var pubDateLimiter = jQuery("#published-date").val(); + pubDateLimiter = (pubDateLimiter == "YYYY-MM/YYYY-MM") ? '' : pubDateLimiter; + var pubFromDate = ''; + var pubToDate = ''; + + + if (pubDateLimiter != '') { + var dateValue = pubDateLimiter; + dateValue = dateValue.split('/'); + pubFromDate = dateValue[0].substring(0, 4); + pubToDate = dateValue[1].substring(0, 4); + pubMinDate = pubMinDate.split('-')[0]; + pubMaxDate = pubMaxDate.split('-')[0]; + //pubMinDate = jQuery.edsDB.get('pubMinDate'); + //pubMaxDate = jQuery.edsDB.get('pubMaxDate'); + } else { + pubFromDate = pubMinDate = pubMinDate.split('-')[0]; + pubMaxDate = pubMaxDate.split('-')[0]; + + var maxRealDate = parseInt(EDSGetDateForLastUpdate().substring(0, 4)) + 1; + pubMaxDate = (parseInt(pubMaxDate) > maxRealDate) ? maxRealDate : pubMaxDate; + pubToDate = pubMaxDate; + //jQuery.edsDB.set('pubMinDate', pubMinDate.toString(), { TTL: edsSessionTimeout }); + //jQuery.edsDB.set('pubMaxDate', pubMaxDate.toString(), { TTL: edsSessionTimeout }); + } + + + + + jQuery("#range-published-date").ionRangeSlider({ + type: "double", + min: pubMinDate, + max: pubMaxDate, + from: pubFromDate, + to: pubToDate, + drag_interval: true, + prettify_enabled: false + }); + + rangeSlider = jQuery("#range-published-date").data("ionRangeSlider"); + + jQuery("#range-published-date").on('change', function () { + //console.log(jQuery(this).val()); + var currentValue = jQuery(this).val(); + currentValue = currentValue.split(';'); + jQuery("#published-date").val(currentValue[0] + '-01' + '/' + currentValue[1] + '-12'); + }); + + }); + + jQuery('#eds-clear-date').click(function () { + var e = jQuery.Event("keypress"); e.which = 13; e.keyCode = 13; + jQuery('#published-date').val(''); + jQuery('#published-date').trigger(e); + }); + + jQuery('#eds-apply-date').click(function () { + var e = jQuery.Event("keypress"); e.which = 13; e.keyCode = 13; + jQuery('#published-date').trigger(e); + }); + +} + +function EDSGetDateForLastUpdate() { + var dateObj = new Date(); + var month = dateObj.getUTCMonth() + 1; + var day = dateObj.getUTCDate(); + var year = dateObj.getUTCFullYear(); + + return (year.toString() + month.toString() + day.toString()); +} + +function DateHandleKeyPress(e, searchBox) { + var key = e.keyCode || e.which; + if (key == 13) { + // dateAction is in the template + if (searchBox.value == "") { + dateAction = dateAction.replace('action=addlimiter(DT1:value)', 'action=removelimiter(DT1)'); + window.location.href = dateAction; + } else { + var regex = /^\d{4}-(0[1-9]|1[012])\/\d{4}-(0[1-9]|1[012])$/; + // '/\d{4}-\d[1-12]\/\d{4}-\d[1-12]/; - old' + if (regex.test(searchBox.value)) { + dateAction = dateAction.replace('DT1:value', 'DT1:' + searchBox.value); + window.location.href = dateAction; + } else { alert(edsLang.date_invalid); } + } + } +} + +function EDSAutoComp() { + + // Check for expired credentials + var credsExpiry = eds_sessionStorage.get("autoComp_expiry"); + if (credsExpiry && credsExpiry < Math.round(Date.now() / 1000)) { + eds_sessionStorage.remove('autoComp'); + eds_sessionStorage.remove('autoComp_expiry'); + } + + var creds = eds_sessionStorage.get("autoComp"); + + var idx = "rawqueries"; + if (edsConfig.autocomplete_mode != "normal") { + idx = "holdings"; + } + + if (eds_sessionStorage.get('defaultSearch') != "eds") { + return; + } + + if (!creds) { + $.getJSON('/plugin/Koha/Plugin/EDS/opac/eds-ac.pl?type=auth', function (data) { + eds_sessionStorage.set('autoComp', data); + eds_sessionStorage.set('autoComp_expiry', Math.round(Date.now() / 1000) + parseInt(data.AuthTimeout) - 30); + EDSAutoComp(); + }); + } else { + $('#translControl1').autocomplete({ + source: function (request, response) { + var promise = $.ajax(creds.Autocomplete.Url, { + data: { + token: creds.Autocomplete.Token, + term: request.term, + idx: idx, + filters: JSON.stringify([{ + name: 'custid', + values: [creds.Autocomplete.CustId] + }]) + } + }); + + promise.done(function (data) { + if (data.error) { + eds_sessionStorage.remove('autoComp'); + eds_sessionStorage.remove('autoComp_expiry'); + + EDSAutoComp(); + } else { + var terms = data.terms.map(function (wrapper) { + return wrapper.term; + }); + response(terms); + } + }); + }, + select: EDSautoSearch + }); + } +} + +function EDSautoSearch(event, ui) { + $.when($('#translControl1').val(ui.item.value)).done(function () { + $("#searchsubmit").click(); + }); +} +$('body').on('click', '#translControl1', function () { + if (eds_sessionStorage.get('defaultSearch') == "eds") { + $("#translControl1").autocomplete("search"); + } +}); + diff --git a/build.py b/build.py index 5c9eac1..47fb575 100755 --- a/build.py +++ b/build.py @@ -55,9 +55,11 @@ ##### Update EDSScript.js ##### -with open('Koha/Plugin/EDS/js/EDSScript.js', 'r') as file : +with open('Koha/Plugin/EDS/js/EDSScript.tt', 'r') as file : filedata = file.readlines() + + # find and repalce version for line in range(len(filedata)): templine = filedata[line].rstrip() @@ -67,10 +69,12 @@ filedata[line] = 'var versionEDSKoha = "' + majorVersion + minorVersion + '";\n' # write updated array to file -wfile = open('Koha/Plugin/EDS/js/EDSScript.js', 'w') +wfile = open('Koha/Plugin/EDS/js/EDSScript.tt', 'w') for item in filedata: wfile.write(item) + + ######################### diff --git a/eds_plugin_20.05002.kpz b/eds_plugin_20.05002.kpz index 7f251500cdb88bec7b3f4f833cf43f5ae88fbe54..7791028ab6951684a22167eb65738588fba514c4 100644 GIT binary patch delta 25514 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 iY|#M-IsWPA|A81OaLJQ19n??)RIy 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

    mPtU^&6jRr5A#A^j!{bHU(?q-to6^)49AhC zww9L*rgB2KGFoK3LOlI<=>S_2L3WOh`=A(Vx`7nBz?2-QFzbgkGSemH z8<`y2Y_DxY?JKkZLI3!-dC~oI=!jDzYnyClR8w~WOv2yiXr_Ff1}G(^?OKW9LGYBORKSc-uzd<6c`yBQ)9AyE2wlf=1BvTW;?> zMba5x7S?=Zui~4QV@jAAUojx88^L*7^rg4i`ny zkhX{);O^zO`4ofa*M%jkMDcH=v55N<*M9O0UyD?S-m=gK=VAFo4$kab#gEq=GW0_X8VO5C_NrdkGiN*%uz1!A|DK4_%w!;@LyL}x)8?Jfxyn8_FSra$af|jML4GN@bFY(d37sizZ}n*=O_TW*b>_Zm zM;_(4zuh1Ify^Su3I!J`-x;lehC+TFZ=3vCu1MXq$x|@Y{nOis%%fZ6)kb}fbFD8| zoPvE3H9Rs~a&-ya?@ro7v#_k`*yVQa7_t)MRzod=de;6xrJ;EB~ z!WD8n_5K_=R`C(kKpWOsQFfQc-WOO@wP4A*U$c4y_9lLgg|$45w=WX}o^t0E7CnOZ zkyR;3qx{3QJJB?p)^_41*1X6D7ls!TU1MpC!FQFu0gnQL$v#L}HJroOYe)OtFptU(o7Fe92iU%{gIBdUC&S72l#a ztq>Cg!#lra$#8^KXlf*ff_=AocF8&iV>nJf)DxQnWt( z4lU(yvbv_0am*5tNj=0$fGC;sjBT zfs3F@Y6wYijOmBMM{J{WiwZI`PS@`9sbqUeu+?xR31TL{2*&U_L8TyR%Gw38>tHSx zm6vhhSJ_YP9(ec)?b`$W2h&}!J4iMdKQ$LuWovry=-%A)d_}^Xa?8l9?}~M=>|yiI zVM!QyJ%wiMI4?wGiRVS%`Np)OR9*ga*6&y+%M~(BBhBpok%C&X`FI|RVki!ef)$0a zJaD;QIqPm92)A2h7P+tg8j-JD=}Fx~FxiL}QT&kR865aJIMAXrqf?L6S5@g7zG;gq}c`_Tdr>tSTe+YC~2I_4FA*Kyb z)Unijepb|#ls5jh#K8l_yr>~W;i^tU3q|9$4{_5 zahH!c%GP!u)ek^0qElset$s-zk|r;_~g`h1I4Nx522tQd^>U1NeKcoZuf#%$ezu9csQ<9d-e@N*RyOk>P`lsdnoS#(+-b)7q>|_=Omd@Xjj&B z_T*y24w+4;ZT1E)5rgs{7p2*a_tTUg!qjO)U75PLi9Vx=XGq~`UxP;w5;36)^r?}<_tI;xedN;`UK z;56=DdXRHfAU0?8v09oVu#!RfIy22oGJ9P_cps=clepqQx;C%ph);#Mae`?$E3<=Y z8I-e{OLHWL6E-rVBhU0a-$G)G;^sA$zKR#7HKLN|4d24}6P307Xo9m6 zblY9k+7Y7-!|2%hqz>Kaes~6btF%bmjW0s+G{Rc6Wk^s`8i(Y#%Be4R5q|@7_-(3t zXgK6zKO;i&vjAcUSr#Dp?>DV+7Qpt0tAKDcybRKBRK8q3X93cG@DT`XHt-te1t5Wl zWdp?j)J?MivHwRM?hii#!N>!MARE~L70e4o@>l&2DgvSY0I0&eKqUVsN&f(-|F7hq zN#qVHfU|G`EeZaFUjyl^9bw?P(j0LwqT2t+g&kb!vtM*b_DiroL(`!{;HKUm10 za718Uc#wa7Utkc3OWsQ)FEq$M$qNYr+0J{3?T0p`oUc@h?#b0sDZ3Vy#{3`{0HNgA7rT7CrU_uhA0V>E7_RC{osR1a- z|6lq63W^L0|8EoHr9}W$9E=BoIM)EQe^?C2MJ_;0{-?L`cl|#X-2bRUL193hidnKj z5^Di`1T9V2ziiFFlwE28Qs}0?OS1pMTB`*Jp*Of7Z|eXG$fg+p3-{mpZ|Yw3TLu5D zD*Ww&RM!DS(8&^iZ9}5n0IWaie?t0mjQ&-Wxcj4F5Wa)qAyXpZcXiKF( zn+YJK4FKEUl>e_m0tJQn|D;@K0C8*p2pImfO#XlE5>*9QxIcLdzPx8&%7kkNynOoq E09gcYM*si- From 766f9134fb946a11ee90c78430705102c01a7944 Mon Sep 17 00:00:00 2001 From: "CORP\\mabrahamson" Date: Tue, 11 May 2021 13:09:37 -0500 Subject: [PATCH 2/2] Update to complete fix for dropdown load delay --- Koha/Plugin/EDS.pm | 78 +- Koha/Plugin/EDS/admin/release_notes.xml | 8 +- Koha/Plugin/EDS/js/EDSScript.tt | 25 +- Koha/Plugin/EDS/opac/templates/eds-methods.tt | 716 ++++++++++++++++++ README.md | 2 + ...in_20.05002.kpz => eds_plugin_20.05003.kpz | Bin 308143 -> 315166 bytes version.json | 4 +- 7 files changed, 788 insertions(+), 45 deletions(-) create mode 100755 Koha/Plugin/EDS/opac/templates/eds-methods.tt rename eds_plugin_20.05002.kpz => eds_plugin_20.05003.kpz (89%) diff --git a/Koha/Plugin/EDS.pm b/Koha/Plugin/EDS.pm index 72abd64..032d0d5 100644 --- a/Koha/Plugin/EDS.pm +++ b/Koha/Plugin/EDS.pm @@ -3,6 +3,7 @@ package Koha::Plugin::EDS; use Modern::Perl; use base qw(Koha::Plugins::Base); use C4::Context; +use Encode qw(encode); use C4::Members; use C4::Auth; use Cwd qw( abs_path ); @@ -12,6 +13,10 @@ use Try::Tiny; use IO::Socket::SSL qw(); use WWW::Mechanize qw(); use MIME::Base64 qw( encode_base64 decode_base64 ); +use Template; +use Template::Constants qw( :debug ); +use Template::Filters; +Template::Filters->use_html_entities; my $mech = WWW::Mechanize->new(ssl_opts => { SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE, verify_hostname => 0, @@ -25,10 +30,10 @@ $PluginDir = $PluginDir.'/Koha/Plugin/EDS'; ################# DO NOT TOUCH - CONTROLLED BY build.py our $MAJOR_VERSION = "20.05"; -our $SUB_VERSION = "002"; +our $SUB_VERSION = "003"; our $VERSION = $MAJOR_VERSION . "" . $SUB_VERSION; our $SHA_ADD = "https://widgets.ebscohost.com/prod/api/koha/sha/1711.json"; -our $DATE_UPDATE = '2021-04-29'; +our $DATE_UPDATE = '2021-05-11'; ###################################################### ## Here is our metadata, some keys are required, some are optional @@ -132,7 +137,10 @@ sub configure { autocomplete => ($cgi->param('autocomplete')?$cgi->param('autocomplete'):"-"), } ); - update_EDSScript_js($self, $cgi, $cgi->param('defaultsearch')?$cgi->param('defaultsearch'):"-"); + + #Run script to update files from templates + $self->update_EDSScript_js($cgi); + if($cgi->param('edsinfo') eq 'Update Required'){ $self->store_data( @@ -150,26 +158,38 @@ sub configure { } sub update_EDSScript_js { - my ($self, $cgi, $defaultSearch) = @_; + my ($self, $cgi) = @_; my $vars = { - defaultSearch => $defaultSearch + edsusername => quotemeta(($cgi->param('edsusername')?$cgi->param('edsusername'):"-")), + edspassword => quotemeta(($cgi->param('edspassword')?$cgi->param('edspassword'):"-")), + edsprofileid => ($cgi->param('edsprofileid')?$cgi->param('edsprofileid'):"-"), + edscustomerid => ($cgi->param('edscustomerid')?$cgi->param('edscustomerid'):"-"), + cataloguedbid => ($cgi->param('cataloguedbid')?$cgi->param('cataloguedbid'):"-"), + catalogueanprefix => ($cgi->param('catalogueanprefix')?$cgi->param('catalogueanprefix'):"-"), + defaultsearch => ($cgi->param('defaultsearch')?$cgi->param('defaultsearch'):"-"), + logerrors => ($cgi->param('logerrors')?$cgi->param('logerrors'):"-"), + iprange => ($cgi->param('iprange')?$cgi->param('iprange'):"-"), + cookieexpiry => ($cgi->param('cookieexpiry')?$cgi->param('cookieexpiry'):"-"), + defaultparams => ($cgi->param('defaultparams')?$cgi->param('defaultparams'):"-"), + autocomplete_mode => ($cgi->param('autocomplete_mode')?$cgi->param('autocomplete_mode'):"-"), + autocomplete => ($cgi->param('autocomplete')?$cgi->param('autocomplete'):"-"), + authtoken => $cgi->param('authtoken'), + lastedsinfoupdate => $cgi->param('lastedsinfoupdate'), + edsinfo => quotemeta($self->retrieve_data('edsinfo')) }; - my $pluginsdir = C4::Context->config('pluginsdir'); - my @pluginsdir = ref($pluginsdir) eq 'ARRAY' ? @$pluginsdir : $pluginsdir; - my @plugindirs; - foreach my $plugindir ( @pluginsdir ){ - $plugindir .= "Koha/Plugin/EDS/js"; - push @plugindirs, $plugindir - } + #my $pluginsdir = C4::Context->config('pluginsdir'); + #my @pluginsdir = ref($pluginsdir) eq 'ARRAY' ? @$pluginsdir : $pluginsdir; + #my @plugindirs; + #foreach my $plugindir ( @pluginsdir ){ + # $plugindir .= "/Koha/Plugin/EDS/js"; + # push @plugindirs, $plugindir + #} my $template = Template->new({ - INCLUDE_PATH => \@plugindirs + INCLUDE_PATH => $PluginDir, + OUTPUT_PATH => $PluginDir }); - - my $edsscript_js; - $template->process('EDSScript.tt',$vars, $edsscript_js); - $template->process('EDSScript.tt',$vars, 'EDSScript.js'); - $self->store_data({ edsscript_js => $edsscript_js }); - + $template->process('js/EDSScript.tt',$vars, 'js/EDSScript.js'); + $template->process('opac/templates/eds-methods.tt',$vars, 'opac/eds-methods.pl'); } sub install() { @@ -219,18 +239,14 @@ sub update_search { sub opac_js { my ( $self ) = @_; my $default_search = $self->retrieve_data('defaultsearch'); - my $edsscript_js = $self->retrieve_data('edsscript_js'); - return qq{ - - - }; - #return q| - # - # - #|; + + return q| + + + |; } diff --git a/Koha/Plugin/EDS/admin/release_notes.xml b/Koha/Plugin/EDS/admin/release_notes.xml index f118758..ea94cd7 100644 --- a/Koha/Plugin/EDS/admin/release_notes.xml +++ b/Koha/Plugin/EDS/admin/release_notes.xml @@ -1,12 +1,12 @@ - 20.05.002 + 20.05.003 https://github.com/ebsco/edsapi-koha-plugin - 2021/04/29 + 2021/05/11 - - Addresses multiple PRs into 20.05 compatible build. See PR #90 for Full Details. + + Addresses issues with dropdown being delayed in opening. \ No newline at end of file diff --git a/Koha/Plugin/EDS/js/EDSScript.tt b/Koha/Plugin/EDS/js/EDSScript.tt index f8ef48e..e3b763d 100644 --- a/Koha/Plugin/EDS/js/EDSScript.tt +++ b/Koha/Plugin/EDS/js/EDSScript.tt @@ -1,5 +1,3 @@ -[% USE Koha %] -var template = "This is a template"; var knownItem = ''; var activeState = 0; var edsOptions = ""; @@ -10,7 +8,7 @@ var edsSelectedKnownItem = ""; var browseNextPage = ""; var catalogueId = ""; var nocorrect = ""; -var defaultsearch = "[% defaultSearch %]"; +var defaultsearch = "[% defaultsearch %]"; //-configurable in plugin config var edsSwitchText = ''; var kohaSwitchText = ''; @@ -22,16 +20,27 @@ var defaultParams = ''; var multiFacet = {}; var activeFacets = 0; //-basket stuff -var edsConfig = ""; +var edsConfig = {}; var EDSItems = 0; var verbose = QueryString('verbose'); var bibListLocal = 0; +//Config written from template +edsConfig.logerrors = "[% logerrors %]"; +edsConfig.iprange = "[% iprange %]"; +edsConfig.cookieexpiry = "[% cookieexpiry %]"; +edsConfig.cataloguedbid = "[% cataloguedbid %]"; +edsConfig.catalogueanprefix = "[% catalogueanprefix %]"; +edsConfig.defaultparams = "[% defaultparams %]"; +edsConfig.autocomplete = "[% autocomplete %]"; +edsConfig.autocomplete_mode = "[% autocomplete_mode %]"; +edsConfig.edsprofileid = "[% edsprofileid %]"; + // Adv search settings var searchBlockCount = 3; // DO NOT TOUCH - controlled by build.py -var versionEDSKoha = "20.05002"; +var versionEDSKoha = "20.05003"; /////////////////////////////////////// if (document.title == "") { @@ -239,8 +248,9 @@ function StartEDS(edsLang) { // ConfigData(sessionConfig); //} else { // ConfigDefaultData(); - $.getJSON('/plugin/Koha/Plugin/EDS/opac/eds-raw.pl' + '?' + 'q=config', function (data) { ConfigData(data); }); + //$.getJSON('/plugin/Koha/Plugin/EDS/opac/eds-raw.pl' + '?' + 'q=config', function (data) { ConfigData(data); }); //} + ConfigData(edsConfig); //$("#masthead_search").attr("disabled","disabled"); if (typeof $('.back_results a').attr('href') != 'undefined') { EDSSetDetailPageNavigator(); } @@ -294,8 +304,7 @@ function SearchPublication(searchinTerm, pubAction) { function ConfigData(data) { - window.edsConfig = data; - + //window.edsConfig = data; eds_sessionStorage.set('edsConfig', data); catalogueId = (data.cataloguedbid == "-") ? "" : data.cataloguedbid; diff --git a/Koha/Plugin/EDS/opac/templates/eds-methods.tt b/Koha/Plugin/EDS/opac/templates/eds-methods.tt new file mode 100755 index 0000000..9b0fe48 --- /dev/null +++ b/Koha/Plugin/EDS/opac/templates/eds-methods.tt @@ -0,0 +1,716 @@ +#!/usr/bin/perl -w + +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +use strict; +use warnings; +use CGI qw ( -utf8 ); +use Encode qw(encode); +use C4::Auth; # get_template_and_user +use C4::Output; +use LWP; +use IO::File; +use JSON qw (from_json encode_json decode_json); +use URI::Escape; +use HTML::Entities; +use feature qw(switch); +use Try::Tiny; +use Net::IP; +#use MIME::Base64; + +our $apiType = 'rest'; +my $input = new CGI; +my $dbh = C4::Context->dbh; + + +our ( $edsusername, $edsprofileid, $edspassword, $edscustomerid, $defaultsearch, $cookieexpiry, $cataloguedbid, $catalogueanprefix, $authtoken, $logerrors, $iprange, $edsinfo, $lastedsinfoupdate, $defaultparams, $defaultEDSQuery, $SessionToken, $GuestTracker, $autocomplete, $autocomplete_mode)=""; + +our $PluginClass='Koha::Plugin::EDS'; +our $table='plugin_data'; + +#Replacing with fixed variables + #my $sql = "SELECT plugin_key, plugin_value FROM plugin_data WHERE plugin_class = ? "; + #my $sth = $dbh->prepare($sql); + #$sth->execute( $PluginClass ); +#$sth->execute(); +#while ( my $r = $sth->fetchrow_hashref() ) { +# if(my $plugin_key = $r->{plugin_key}){ + #if ($plugin_key eq 'edsusername') {$edsusername=$r->{plugin_value};} + #if ($plugin_key eq 'edsprofileid') {$edsprofileid=$r->{plugin_value};} + #if ($plugin_key eq 'edspassword') {$edspassword=$r->{plugin_value};} + #if ($plugin_key eq 'edscustomerid') {$edscustomerid=$r->{plugin_value};} + #if ($plugin_key eq 'defaultsearch') {$defaultsearch=$r->{plugin_value};} + #if ($plugin_key eq 'cookieexpiry') {$cookieexpiry=$r->{plugin_value};} + #if ($plugin_key eq 'cataloguedbid') {$cataloguedbid=$r->{plugin_value};} + #if ($plugin_key eq 'catalogueanprefix') {$catalogueanprefix=$r->{plugin_value};} + #if ($plugin_key eq 'logerrors') {$logerrors=$r->{plugin_value};} + #if ($plugin_key eq 'iprange') {$iprange=$r->{plugin_value};} + #if ($plugin_key eq 'authtoken') {$authtoken=$r->{plugin_value};} + #if ($plugin_key eq 'autocomplete') {$autocomplete=$r->{plugin_value};} + #if ($plugin_key eq 'autocomplete_mode') {$autocomplete_mode=$r->{plugin_value};} + #if ($plugin_key eq 'defaultparams') {$defaultparams=$r->{plugin_value};} + #if ($plugin_key eq 'edsinfo') { + # $edsinfo=$r->{plugin_value}; + # $edsinfo = Encode::encode('UTF-8', $edsinfo); + # } +# if ($plugin_key eq 'lastedsinfoupdate') { +# $lastedsinfoupdate=$r->{plugin_value}; +# my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); +# my @months = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ); +# my $dateString = $mday.'/'.$months[$mon].'/'.(1900+$year); +# if($dateString ne $lastedsinfoupdate){ +# # update info daily +# my $getInfo = EDSSearch('info'); +# } +# } +# } +#} +#END Code being replaced +$edsusername = qq([% edsusername %]); +$edsprofileid = "[% edsprofileid %]"; +$edspassword = qq([% edspassword %]); +$edscustomerid = "[% edscustomerid %]"; +$defaultsearch = "[% defaultsearch %]"; +$cookieexpiry = "[% cokieexpiry %]"; +$cataloguedbid = "[% cataloguedbid %]"; +$catalogueanprefix = "[% catalogueanprefix %]"; +$authtoken = "[% authtoken %]"; +$logerrors = "[% logerrors %]"; +$iprange = "[% iprange %]"; +$edsinfo = Encode::encode('UTF-8',qq([% edsinfo %])); +#$edsinfo =~ s/\\\\//g; +print STDERR "IN METHOD, EDSINFO IS ".$edsinfo; +$lastedsinfoupdate = "[% lastedsinfoupdate %]"; +#my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); +#my @months = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ); +#my $dateString = $mday.'/'.$months[$mon].'/'.(1900+$year); +#if($dateString ne $lastedsinfoupdate){ + # update info daily +# my $getInfo = EDSSearch('info'); +#} +$defaultparams = "[% defaultparams %]"; +$defaultEDSQuery = "[% defaultedsquery %]"; +$autocomplete = "[% autocomplete %]"; +$autocomplete_mode = "[% autocompletemode %]"; + + +die "The EDS plugin appears to be unconfigured.\n" unless $edsprofileid; + +{no warnings;local $^W = 0; + +my $CookieExpiry = '+'.$cookieexpiry.'m'; +if($cookieexpiry eq ' '){ # dont set expiry + $CookieExpiry=''; +} + +my ( $template, $user, $cookie ) = get_template_and_user( + { + template_name => "eds-raw.tt", + type => "opac", + query => $input, + is_plugin =>1, + authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ), + } +); +#manage guest status. +$SessionToken = $input->cookie('sessionToken'); +# $GuestTracker = $input->cookie('guest'); +if($SessionToken eq ""){ + $SessionToken=CreateSession(); +} +$GuestTracker=CheckIPAuthentication(); +1; + + +#EBSCO API START +sub CallREST +{ + my ($method, $uri, $body, $auth, $sess) = @_; + my $req = HTTP::Request->new( $method, $uri ); + $req->header( 'Content-Type' => 'application/json' ); + $req->header( 'Accept-Encoding' => 'gzip, deflate' ); + $req->header( 'x-authenticationToken' => $auth ); + $req->header( 'x-sessionToken' => $sess ); + #if($body != ''){$req->content( $body );} + $req->content( $body ); + my $lwp = LWP::UserAgent->new; + my $response = $lwp->request( $req ); + return $response->decoded_content(charset => 'none'); +} + +sub CreateAuth +{ + #ask for AuthToken from EDSAPI + my $uri = 'https://eds-api.ebscohost.com/authservice/rest/uidauth'; + my %jsondata =( + 'UserId' => $edsusername, + 'Password' => $edspassword, + 'InterfaceId' => 'KohaEDS' + ); + my $json = encode_json \%jsondata; + #my $json = encode_json '{"UserId":"'.$edsusername.'","Password":"'.$edspassword.'","InterfaceId":"KohaEDS"}'; + + if($edsusername eq "-"){ + $uri = 'https://eds-api.ebscohost.com/authservice/rest/ipauth'; + $json = '{"InterfaceId":"KohaEDS"}'; + } + + + my $response = CallREST('POST',$uri,$json, '', ''); + #use Data::Dumper; die Dumper 'gtracker='.$GuestTracker.' cookie='.$input->cookie('guest'); + + $authtoken = decode_json( $response ); + $authtoken = $authtoken->{AuthToken}; + $dbh->do("UPDATE $table SET plugin_value = ? WHERE plugin_class= ? AND plugin_key= ? ", undef, $authtoken, $PluginClass, 'authtoken'); + return $authtoken; +} + +sub GetAuth +{ + return $authtoken; +} + +sub CreateSession +{ + #end session + my $uri = 'http://eds-api.ebscohost.com/edsapi/rest/endsession'; + my $json = '{"sessiontoken":"'.$input->cookie('sessionToken').'"}'; + if($authtoken eq ''){ + $authtoken = CreateAuth(); + } + my $response = CallREST('POST',$uri,$json, $authtoken, ''); + + #$GuestTracker = CheckIPAuthentication(); + + #ask for SessionToken from EDSAPI + $uri = 'http://eds-api.ebscohost.com/edsapi/rest/createsession'; + $json = '{"Profile":"'.$edsprofileid.'","Guest":"'.$GuestTracker.'","Org":"'.$edscustomerid.'"}'; + + $response = CallREST('POST',$uri,$json, $authtoken, ''); + + try{ + $SessionToken = decode_json( $response ); + }catch{ + $authtoken = CreateAuth(); + $response = CallREST('POST',$uri,$json, $authtoken, ''); + $SessionToken = decode_json( $response ); + }; + + if($SessionToken->{ErrorNumber}==104){ + $authtoken = CreateAuth(); + $response = CallREST('POST',$uri,$json, $authtoken, ''); + $SessionToken = decode_json( $response ) + } + $SessionToken = $SessionToken->{SessionToken}; + #if($GuestTracker eq 'n'){ + #$GuestTracker='set';} + + return $SessionToken; +} + +sub GetSession +{ + #use Data::Dumper; die Dumper 'gtracker='.$GuestTracker.' cookie='.$input->cookie('guest'); + if($input->cookie('guest') eq ''){ + return $SessionToken; + }elsif($GuestTracker ne $input->cookie('guest')){ + # if(CheckIPAuthentication() ne 'n'){ + # return CreateSession(); + # }else{ + # return $SessionToken; + # } + return CreateSession(); + }else{ + return $SessionToken; + } + + + + +# if($GuestTracker eq 'n'){ +# return CreateSession(); +# }else{ +# if($GuestTracker eq 'y' and ($input->cookie('guest') eq 'set') ){ +# return CreateSession(); +# }else{ +# return $SessionToken; +# } +# } + +} + +sub EDSGetConfiguration +{ + my %ConfigArray = ( + 'defaultsearch' => $defaultsearch, + 'logerrors' => $logerrors, + 'iprange' => $iprange, + 'cookieexpiry' => $cookieexpiry, + 'cataloguedbid' => $cataloguedbid, + 'catalogueanprefix' => $catalogueanprefix, + 'defaultparams' => $defaultparams, + 'autocomplete' => $autocomplete, + 'autocomplete_mode' => $autocomplete_mode, + 'edsusername' => $edsusername, + 'edsprofileid' => $edsprofileid, + 'edspassword' => $edspassword + ); + my $JSONConfig = encode_json \%ConfigArray; + #my $JSONConfig = encode_json '{"defaultsearch":"'.$defaultsearch.'","logerrors":"'.$logerrors.'","iprange":"'.$iprange.'","cookieexpiry":"'.$cookieexpiry.'","cataloguedbid":"'.$cataloguedbid.'","catalogueanprefix":"'.$catalogueanprefix.'","defaultparams":"'.$defaultparams.'","autocomplete": "'.$autocomplete.'", "autocomplete_mode": "'.$autocomplete_mode.'", "edsusername":"'.$edsusername.'", "edsprofileid":"'.$edsprofileid.'", "edspassword":"'.$edspassword.'"}'; + #my $JSONConfig = "Test String"; + # when('edsusername') {$edsusername=$r->{plugin_value};} + # when('edsprofileid') {$edsprofileid=$r->{plugin_value};} + # when('edspassword') {$edspassword=$r->{plugin_value};} + return $JSONConfig; +} + + +sub PFISearch +{ + my ($EDSQuery, $GuestStatus) = @_; + if($input->param("default") eq 1){ + $EDSQuery=$EDSQuery; + } + + if(CheckIPAuthentication() ne 'n'){ # Apply guest status from caller if not IP authenticated. + $GuestTracker = $GuestStatus; + } + + if($EDSQuery =~m/\{.*?\}/){ + my $encodedTerm=$&; + + $encodedTerm=~s/{//g; + $encodedTerm=~s/}//g; + $encodedTerm=~s/\,/\\,/g; + $encodedTerm=~s/:/\\\:/g; + $encodedTerm=~s/\(/\\\(/g; + $encodedTerm=~s/\)/\\\)/g; + + $EDSQuery =~s/\{.*?\}/$encodedTerm/; + } + $EDSQuery =~s/ /\+/g; + print STDERR "---==---" . $EDSQuery; + my $uri = 'http://eds-api.ebscohost.com/edsapi/'.$apiType.'/'.$EDSQuery; + $uri=~s/\|/\&/g; + # use Data::Dumper; die Dumper $uri; + print STDERR "---==---" . $uri; + + my $response; + if($EDSQuery eq "info"){ + $response = CallREST('GET',$uri,'', CreateAuth(), CreateSession()); + }else{ + $response = CallREST('GET',$uri,'', GetAuth(), GetSession()); + } + + if(index($response,'ErrorNumber')!=-1){ # TODO: check for 104 or 109 error and request accordingly + #use Data::Dumper; die Dumper $response; + $response = CallREST('GET',$uri,'', CreateAuth(), CreateSession()); + } + + if($EDSQuery eq "info"){ + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); + my @months = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ); + my $dateString = $mday.'/'.$months[$mon].'/'.(1900+$year); + $response=~s/\"Label\"\:\"ISBN\"\}/\"Label\"\:\"ISBN\"\}\,\{\"FieldCode\"\:\"JN\"\,\"Label\"\:\"Journal Title\"\}/; #" Hack to add Journal Title search + $dbh->do("UPDATE $table SET plugin_value = ? WHERE plugin_class= ? AND plugin_key= ? ", undef, $response, $PluginClass, 'edsinfo'); + $dbh->do("UPDATE $table SET plugin_value = ? WHERE plugin_class= ? AND plugin_key= ? ", undef, $dateString, $PluginClass, 'lastedsinfoupdate'); + return 'info stored'; + }else{ + return $response; + } +} + +sub EDSSearch +{ + my ($EDSQuery, $GuestStatus) = @_; + if($input->param("default") eq 1){ + $EDSQuery=$EDSQuery.EDSDefaultQueryBuilder(); + } + + if(CheckIPAuthentication() ne 'n'){ # Apply guest status from caller if not IP authenticated. + $GuestTracker = $GuestStatus; + } + + if($EDSQuery =~m/\{.*?\}/){ + my $encodedTerm=$&; + + $encodedTerm=~s/{//g; + $encodedTerm=~s/}//g; + $encodedTerm=~s/\,/\\,/g; + $encodedTerm=~s/:/\\\:/g; + $encodedTerm=~s/\(/\\\(/g; + $encodedTerm=~s/\)/\\\)/g; + + $EDSQuery =~s/\{.*?\}/$encodedTerm/; + } + $EDSQuery =~s/ /\+/g; + my $uri = 'http://eds-api.ebscohost.com/edsapi/'.$apiType.'/'.$EDSQuery; + $uri=~s/\|/\&/g; + # use Data::Dumper; die Dumper $uri; + + my $response; + if($EDSQuery eq "info"){ + $response = CallREST('GET',$uri,'', CreateAuth(), CreateSession()); + }else{ + $response = CallREST('GET',$uri,'', GetAuth(), GetSession()); + } + + if(index($response,'ErrorNumber')!=-1){ # TODO: check for 104 or 109 error and request accordingly + #use Data::Dumper; die Dumper $response; + $response = CallREST('GET',$uri,'', CreateAuth(), CreateSession()); + } + + if($EDSQuery eq "info"){ + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); + my @months = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ); + my $dateString = $mday.'/'.$months[$mon].'/'.(1900+$year); + $response=~s/\"Label\"\:\"ISBN\"\}/\"Label\"\:\"ISBN\"\}\,\{\"FieldCode\"\:\"JN\"\,\"Label\"\:\"Journal Title\"\}/; #" Hack to add Journal Title search + $dbh->do("UPDATE $table SET plugin_value = ? WHERE plugin_class= ? AND plugin_key= ? ", undef, $response, $PluginClass, 'edsinfo'); + $dbh->do("UPDATE $table SET plugin_value = ? WHERE plugin_class= ? AND plugin_key= ? ", undef, $dateString, $PluginClass, 'lastedsinfoupdate'); + return 'info stored'; + }else{ + return $response; + } +} + +sub EDSProcessItem +{ + my ($Item,$MakeLinks) = @_; + #$Item->{Data}= decode_entities($Item->{Data}); # decoding manually. Using this displays the ? diamond. + $Item->{Data} =~s/</{Data} =~s/>/>/g; + $Item->{Data} =~s/"/"/g; #" + $Item->{Data} =~s/{Data} =~s/
    /, /g; + $Item->{Data} =~s/<\/highlight/<\/span/g; + if($Item->{Group} eq 'URL'){ + $Item->{Data} =~s/{Data} =~s/linkWindow/target/g; + $Item->{Data} =~s/linkTerm/href/g; + $Item->{Data} =~s/<\/link/<\/a/g; + } + if(($Item->{Data}=~m/searchLink/) && $MakeLinks ){ + $Item->{Data}=~s/searchLink fieldCode/a href/g; + $Item->{Data}=~s/\" term\=\"/\:/g; #" + $Item->{Data}=~s/searchLink\>/a\>/g; + $Item->{Data}=~s/href\=\"/href=\"eds-search.pl\?q=Search\?query\-1\=AND\,/g; #" + $Item->{Data}=~s/""/"/; #"; + $Item->{Data}=~s/\:/\:\{/g; + $Item->{Data}=~s/\"\>/\}\"\>/g;#" + } + return $Item; +} + +sub EDSGetInfo +{ + my ($getInfoAgain) = @_; + if($getInfoAgain == 1){ + my $sql = "SELECT plugin_key, plugin_value FROM plugin_data WHERE plugin_key='edsinfo' AND plugin_class = ? "; + my $sth = $dbh->prepare($sql); + $sth->execute( $PluginClass ); + $sth->execute(); + while ( my $r = $sth->fetchrow_hashref() ) { + if (my $plugin_key = $r->{plugin_key}){ + if ($plugin_key eq 'edsinfo') {$edsinfo=$r->{plugin_value};$edsinfo = Encode::encode('UTF-8', $edsinfo);} + } + } + } + return $edsinfo; +} + +sub EDSGetSessionToken +{ + my $JSONSession = '{"sessiontoken":"'.$SessionToken.'","guest":"'.$GuestTracker.'"}'; + return $JSONSession; +} + +sub EDSDefaultQueryBuilder +{ + my $defaultEDSQuery = ""; + my $EDSInfoData = decode_json($edsinfo); + + if (exists $EDSInfoData->{AvailableSearchCriteria}->{AvailableDidYouMeanOptions}) { + my @AutoSuggests = @{$EDSInfoData->{AvailableSearchCriteria}->{AvailableDidYouMeanOptions}}; + foreach my $AutoSuggest (@AutoSuggests){ + # $input->param("default") + if ($AutoSuggest->{Id} eq "AutoCorrect" && $input->param("nocorrect") eq 1){ + $defaultEDSQuery = lc $defaultEDSQuery.'|autocorrect=n'; + $input->delete("nocorrect"); + } else { + $defaultEDSQuery = lc $defaultEDSQuery.'|'.$AutoSuggest->{Id}.'='.$AutoSuggest->{DefaultOn}; + } + } + } + + if (exists $EDSInfoData->{AvailableSearchCriteria}->{AvailableExpanders}) { + my @ExpanderDefaults = @{$EDSInfoData->{AvailableSearchCriteria}->{AvailableExpanders}}; + foreach my $ExpanderDefault (@ExpanderDefaults){ + if($ExpanderDefault->{DefaultOn} eq 'y'){ + $defaultEDSQuery = $defaultEDSQuery.'|expander='.$ExpanderDefault->{Id}; + } + } + } + + if($apiType eq "rest" && exists $EDSInfoData->{AvailableSearchCriteria}->{AvailableSearchModes}){ + my @AvailableSearchModes = @{$EDSInfoData->{AvailableSearchCriteria}->{AvailableSearchModes}}; + foreach my $AvailableSearchMode (@AvailableSearchModes){ + if($AvailableSearchMode->{DefaultOn} eq 'y'){ + $defaultEDSQuery = $defaultEDSQuery.'|searchmode='.$AvailableSearchMode->{Mode}; + } + } + } + if($apiType eq "rest" && exists $EDSInfoData->{AvailableSearchCriteria}->{AvailableLimiters}){ + my @AvailableLimiters = @{$EDSInfoData->{AvailableSearchCriteria}->{AvailableLimiters}}; + foreach my $AvailableLimiter (@AvailableLimiters){ + if($AvailableLimiter->{DefaultOn} eq 'y'){ + if($AvailableLimiter->{Type} eq 'select'){ + $defaultEDSQuery = $defaultEDSQuery.'|limiter='.$AvailableLimiter->{Id}.':'.'y'; + } + } + } + } + if($apiType eq "rest" && $EDSInfoData->{AvailableSearchCriteria}->{AvailableRelatedContent}){ + if(defined $EDSInfoData->{AvailableSearchCriteria}->{AvailableRelatedContent}){ + my @AvailableRelatedContents = @{$EDSInfoData->{AvailableSearchCriteria}->{AvailableRelatedContent}}; + foreach my $AvailableRelatedContent (@AvailableRelatedContents){ + if($AvailableRelatedContent->{DefaultOn} eq 'y'){ + if($AvailableRelatedContent->{Type} eq 'emp'){ + $defaultEDSQuery = $defaultEDSQuery.'|action='.$AvailableRelatedContent->{AddAction}; + } + if($AvailableRelatedContent->{Type} eq 'rs'){ + $defaultEDSQuery = $defaultEDSQuery.'|action='.$AvailableRelatedContent->{AddAction}; + } + } + } + } + } + + $defaultEDSQuery = $defaultEDSQuery.'|resultsperpage='.$EDSInfoData->{ViewResultSettings}->{ResultsPerPage}; + $defaultEDSQuery = $defaultEDSQuery.'|view='.$EDSInfoData->{ViewResultSettings}->{ResultListView}; + $defaultEDSQuery = $defaultEDSQuery.'|includeimagequickview='.$EDSInfoData->{ViewResultSettings}->{IncludeImageQuickView}->{DefaultOn}; + + return $defaultEDSQuery; + +} + +sub CheckIPAuthentication +{ + my $GuestForIP = 'y'; + if($edsusername eq "-"){#Guest= no automatically if IP// Keep to support IP restricted sites. + $GuestTracker='n'; + $GuestForIP = 'n'; + } + + if ($user){ + $GuestTracker='n'; + } + + if($GuestTracker ne "n"){ # User has not logged in or authtoken is not IP. Do a local IP check. + if(length($iprange) > 4){ # Check local IP range if specified. + my @allowedIPs = split /,/, $iprange; + my $localIP = Net::IP->new($ENV{'HTTP_X_FORWARDED_FOR'} || $ENV{'REMOTE_ADDR'}); + foreach my $allowedIP (@allowedIPs){ + my $currentRange = Net::IP->new($allowedIP); + if ($currentRange){ + my $ipMatch = $currentRange->overlaps($localIP) ? 1 : 0; + #use Data::Dumper; die Dumper 'IPMatch='.$ipMatch.'/rangeip='.$allowedIP.'/localip='.$localIP; + if($ipMatch==1){ + $GuestTracker='n'; + $GuestForIP = 'n'; + last; # exit foreach + } + } + } + } + } + #use Data::Dumper; die Dumper 'GuestForIP='.$GuestForIP; + if ($GuestTracker eq 'n' || $GuestForIP eq 'n'){ + return 'n'; + } else { + return 'y'; + } +} + +sub GetLocalIP +{ + return $ENV{'HTTP_X_FORWARDED_FOR'} || $ENV{'REMOTE_ADDR'}; +} + +sub CartSendLinks +{ + my ($template_res,@bibs) = @_; + my $EDSConfig = decode_json(EDSGetConfiguration()); + foreach my $biblionumber (@bibs) { # SM: EDS + if($biblionumber =~m/\_\_/){ + if(!($biblionumber =~m/$EDSConfig->{cataloguedbid}/)){ + $biblionumber =~s/\_\_/\&dbid\=/g; + $template_res =~s/\_\_/\&dbid\=/g; + $template_res =~s/\/cgi\-bin\/koha\/opac-detail\.pl\?biblionumber\=$biblionumber/\/plugin\/Koha\/Plugin\/EDS\/opac\/eds-detail.pl\?q\=Retrieve\?an\=$biblionumber/; + } + }else{ + $template_res =~s/\|$EDSConfig->{cataloguedbid}//; + } + } + $template_res =~s/\&dbid/\|dbid/g; + return $template_res; +} + +sub ProcessEDSCartItems +{ + my ($biblionumber, $eds_data, $record, $dat) = @_; + + my $EDSConfig = decode_json(EDSGetConfiguration()); + #convert . to _dot_ in AN's to properly match selector + $biblionumber =~s/\./\_dot\_/g; + if(!($biblionumber =~m/$EDSConfig->{cataloguedbid}/)){ + $eds_data = decode_json(uri_unescape($eds_data)); + + my @eds_dataItems =@{$eds_data->{Records}}; + foreach my $edsDataItem (@eds_dataItems){ + if(exists $edsDataItem->{$biblionumber}){ + $record = $edsDataItem->{$biblionumber}; + last; + } + } + + my $recordJSON = "{"; + my $recordXML = ' + + 000000000000000000000000 + '; + + #Title + try{ + my $EDSRecordTitle = $record->{Record}->{RecordInfo}->{BibRecord}->{BibEntity}->{Titles}[0]->{TitleFull}; + $recordXML .= ' + '.$EDSRecordTitle.' + + '; + $recordJSON .= '"title":"'.$EDSRecordTitle.'",'; + }catch{}; + + #Subject + try{ + my $EDSRecordSubjects = $record->{Record}->{RecordInfo}->{BibRecord}->{BibEntity}->{Subjects}; + foreach my $EDSRecordSubject (@{$EDSRecordSubjects}){ + $recordXML .= ' + '.$EDSRecordSubject->{SubjectFull}.' + + '; + } + }catch{}; + + #Author + try{ + my $EDSRecordAuthors = $record->{Record}->{RecordInfo}->{BibRecord}->{BibRelationships}->{HasContributorRelationships}; + foreach my $EDSRecordAuthor (@{$EDSRecordAuthors}){ + $recordXML .= ' + '.$EDSRecordAuthor->{PersonEntity}->{Name}->{NameFull}.' + + '; + $recordJSON .= '"author":"'.$EDSRecordAuthor->{PersonEntity}->{Name}->{NameFull}.'",'; + } + }catch{}; + + + #URL + try{ + my $EDSRecordURL = $record->{Record}->{PLink}; + $recordXML .= ' + '.$EDSRecordURL.' + '.$EDSRecordURL.' + '.$EDSRecordURL.' + + '; + }catch{}; + + #Document Type - TODO needs work. + try{ + my $EDSRecordType = $record->{Record}->{Header}->{PubType}; + $recordXML .= ' + '.$EDSRecordType.' + + '; + $recordXML .= ' + '.$EDSRecordType.' + + '; + $recordXML .= ' + '.$EDSRecordType.' + + '; + }catch{}; + + #Identifiers: ISSN/ISBN + try{ + my $EDSRecordIdentifiers = $record->{Record}->{RecordInfo}->{BibRecord}->{BibRelationships}->{IsPartOfRelationships}[0]->{BibEntity}->{Identifiers}; + + foreach my $EDSRecordIdentifier (@{$EDSRecordIdentifiers}){ + if($EDSRecordIdentifier->{Type} =~m/issn/){ + $recordJSON .= '"issn":"'.$EDSRecordIdentifier->{Value}.'",'; + $recordXML .= ' + '.$EDSRecordIdentifier->{Value}.' + + '; + }elsif($EDSRecordIdentifier->{Type} =~m/isbn/){ + $recordJSON .= '"isbn":"'.$EDSRecordIdentifier->{Value}.'",'; + $recordXML .= ' + '.$EDSRecordIdentifier->{Value}.' + + '; + } + } + }catch{}; + + #Dates + try{ + my $EDSRecordDate = $record->{Record}->{RecordInfo}->{BibRecord}->{BibRelationships}->{IsPartOfRelationships}[0]->{BibEntity}->{Dates}[0]; + $recordJSON .= '"copyrightdate":"'.$EDSRecordDate->{Y}.'",'; + $recordXML .= ' + '.$EDSRecordDate->{Y}.' + + '; + }catch{}; + + + + #Accession Number + try{ + my $EDSRecordAN = $record->{Record}->{Header}->{DbId}.'.'.$record->{Record}->{Header}->{An}; + $recordJSON .= '"biblioitemnumber":"'.$EDSRecordAN.'"'; + $recordXML .= ' + '.$EDSRecordAN.' + '.$EDSRecordAN.' + + '; + }catch{}; + + + $recordJSON .= "}"; + $recordXML .= ''; + $recordXML=~s/\&/and/g; # avoid error when converting to marc + $dat = from_json($recordJSON); # used instead of decode_json and encode('utf-8',$recordJSON) first. + + $record = eval { MARC::Record::new_from_xml( $recordXML, "utf8", C4::Context->preference('marcflavour') ) }; + return ($record,$dat); + }else{return ($record,$dat);} +} + + +}#end no warnings diff --git a/README.md b/README.md index b29ada4..0991706 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,8 @@ Contact support@ebsco.com for field values. Click Load settings from EBSCOAdmin. Wait for the page to refresh. You might have to click Update Info twice if it initiating connection takes time the first time. +UPGRADE NOTE: When upgrading any version after 20.05002, be sure to go into configure and save the configuration even if values are already present so that templates will generate properly. + Video Presentations ======================== diff --git a/eds_plugin_20.05002.kpz b/eds_plugin_20.05003.kpz similarity index 89% rename from eds_plugin_20.05002.kpz rename to eds_plugin_20.05003.kpz index 7791028ab6951684a22167eb65738588fba514c4..ae6d82830ad2b7e7e5f6be8f15bbe8c6d5796a7d 100644 GIT binary patch delta 24455 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 diff --git a/version.json b/version.json index 298fea6..cc373d9 100644 --- a/version.json +++ b/version.json @@ -1,10 +1,10 @@ { "MajorVersion": "20.05", - "MinorVersion": "002", + "MinorVersion": "003", "ReleaseNotes": [ { "author": "mabrahamson@ebsco.com", - "note": "Addresses multiple PRs into 20.05 compatible build. See PR #90 for Full Details." + "note": "Addresses issues with dropdown being delayed in opening." } ], "ShaAdd": "https://widgets.ebscohost.com/prod/api/koha/sha/1711.json"