From b7c81e5de19a28c8d71a8061cfd1a8d9cab35e2e Mon Sep 17 00:00:00 2001
From: Jenny Way <jwayway@hotmail.com>
Date: Thu, 18 Jan 2018 21:04:23 +0000
Subject: [PATCH] Bug-15595: Google cover staff search and detail

Test plan:
1. Apply patch
2. In system preferences enable GoogleJacketsIntra
3. Cover images from Google should show in results page and detail page
4. If the record doesn't have a cover, it should display "No cover image
available"
4. Disabling the GoogleJacketIntra will cause the cover images not to
show
5. Without patch there is no GoogleJacketsIntra syspref
---
 .../bug_15595_GoogleJacketsIntra_syspref.sql       |   1 +
 installer/data/mysql/sysprefs.sql                  |   1 +
 .../admin/preferences/enhanced_content.pref        |   9 +++
 .../prog/en/modules/catalogue/.detail.tt.swo       | Bin 0 -> 16384 bytes
 .../prog/en/modules/catalogue/.results.tt.swp      | Bin 0 -> 16384 bytes
 .../prog/en/modules/catalogue/detail.tt            |  13 +++-
 .../prog/en/modules/catalogue/results.tt           |  13 +++-
 koha-tmpl/intranet-tmpl/prog/js/google-jackets.js  |  76 +++++++++++++++++++++
 .../bootstrap/en/modules/.opac-detail.tt.swp       | Bin 0 -> 16384 bytes
 9 files changed, 110 insertions(+), 3 deletions(-)
 create mode 100644 installer/data/mysql/atomicupdate/bug_15595_GoogleJacketsIntra_syspref.sql
 create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/.detail.tt.swo
 create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/.results.tt.swp
 create mode 100644 koha-tmpl/intranet-tmpl/prog/js/google-jackets.js
 create mode 100644 koha-tmpl/opac-tmpl/bootstrap/en/modules/.opac-detail.tt.swp

diff --git a/installer/data/mysql/atomicupdate/bug_15595_GoogleJacketsIntra_syspref.sql b/installer/data/mysql/atomicupdate/bug_15595_GoogleJacketsIntra_syspref.sql
new file mode 100644
index 0000000..f65bd9c
--- /dev/null
+++ b/installer/data/mysql/atomicupdate/bug_15595_GoogleJacketsIntra_syspref.sql
@@ -0,0 +1 @@
+INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`,`type`) VALUES ('GoogleJacketsIntra', '0', NULL, 'Add cover images from Google Books to search results and item detail pages in the staff client.','YesNo');
diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql
index 23cefb8..f407474 100644
--- a/installer/data/mysql/sysprefs.sql
+++ b/installer/data/mysql/sysprefs.sql
@@ -175,6 +175,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `
 ('gist','0','','Default Goods and Services tax rate NOT in %, but in numeric form (0.12 for 12%), set to 0 to disable GST','Integer'),
 ('GoogleIndicTransliteration','0','','GoogleIndicTransliteration on the OPAC.','YesNo'),
 ('GoogleJackets','0',NULL,'if ON, displays jacket covers from Google Books API','YesNo'),
+('GoogleJacketsIntra', '0', NULL, 'Add cover images from Google Books to search results and item detail pages in the staff client.','YesNo'),
 ('GoogleOpenIDConnect', '0', NULL, 'if ON, allows the use of Google OpenID Connect for login', 'YesNo'),
 ('GoogleOAuth2ClientID', '', NULL, 'Client ID for the web app registered with Google', 'Free'),
 ('GoogleOAuth2ClientSecret', '', NULL, 'Client Secret for the web app registered with Google', 'Free'),
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/enhanced_content.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/enhanced_content.pref
index f62882d..a57272d 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/enhanced_content.pref
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/enhanced_content.pref
@@ -123,6 +123,15 @@ Enhanced Content:
                   yes: Add
                   no: "Don't add"
             - cover images from Google Books to search results and item detail pages on the OPAC.
+  
+    Google:
+        -
+            - pref: GoogleJacketsIntra
+              choices:
+                  yes: Add
+                  no: "Don't add"
+            - cover images from Google Books to search results and item detail pages on the staff client.
+
     Open Library:
         -
             - pref: OpenLibraryCovers
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/.detail.tt.swo b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/.detail.tt.swo
new file mode 100644
index 0000000000000000000000000000000000000000..57462c8e786c73f7e85ee344fa643e774b356e2d
GIT binary patch
literal 16384
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

literal 0
HcmV?d00001

diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/.results.tt.swp b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/.results.tt.swp
new file mode 100644
index 0000000000000000000000000000000000000000..767950c1ea3560c501ce88bb3b70e05c6bb0701a
GIT binary patch
literal 16384
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
D{bK5F

literal 0
HcmV?d00001

diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt
index be5932b..09a9370 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt
@@ -64,7 +64,7 @@
         <span class="Z3988" title="[% ocoins %]"></span>
     [% END %]
 
-    [% IF ( AmazonCoverImages  || LocalCoverImages ) %]
+    [% IF ( AmazonCoverImages  || LocalCoverImages ||  Koha.Preference('GoogleJacketsIntra')  ) %]
         [% IF ( XSLTDetailsDisplay ) %]
             <div class="yui-gc">
             <div id="catalogue_detail_biblio" class="yui-u first">
@@ -125,8 +125,15 @@
             </span>
         [% END %]
 
-        [% IF ( AmazonCoverImages  || LocalCoverImages ) %]
+        [% IF ( AmazonCoverImages  || LocalCoverImages || Koha.Preference('GoogleJacketsIntra') ) %]
         </div><div class="yui-u" id="bookcoverimg">
+        [% IF ( Koha.Preference('GoogleJacketsIntra') ) %]
+            [% IF ( normalized_isbn ) %]
+                <div style="display:block;" title="Click to view in Google Books" class="[% normalized_isbn %]" id="gbs-thumbnail[% loop.count %]"></div>
+            [% ELSE %]
+                <a href="http://books.google.com/books?q=[% SEARCH_RESULT.title |url %]"><span class="no-image">No cover image available</span></a>
+            [% END %]
+        [% END %]
         [% IF ( LocalCoverImages ) %]
             <div title="[% biblionumber |url %]" class="[% biblionumber %]" id="local-thumbnail-preview"></div>
         [% END %]
@@ -849,6 +856,7 @@
 [% MACRO jsinclude BLOCK %]
     [% INCLUDE 'catalog-strings.inc' %]
     <script type="text/javascript" src="[% interface %]/[% theme %]/js/catalog.js"></script>
+    <script type="text/javascript" src="[% interface %]/[% theme %]/js/google-jackets.js"></script>
     [% INCLUDE 'greybox.inc' %]
     <script type="text/javascript">
         // http://www.oreillynet.com/pub/a/javascript/2003/10/21/amazonhacks.html
@@ -1034,6 +1042,7 @@
         [% IF ( AmazonCoverImages || LocalCoverImages ) %]$(window).load(function() {
             verify_images();
         });[% END %]
+        [% IF ( Koha.Preference('GoogleJacketsIntra') ) %]KOHA.Google.GetCoverFromIsbn();[% END %]
     </script>
     [% IF ( Koha.Preference('NovelistSelectStaffEnabled') && Koha.Preference('NovelistSelectProfile') && ( normalized_isbn || normalized_upc ) ) %]
         <script type="text/javascript" src="https://imageserver.ebscohost.com/novelistselect/ns2init.js"></script>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/results.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/results.tt
index 87ed564..0ea1e4b 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/results.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/results.tt
@@ -356,7 +356,7 @@
                         [% SET MaxSearchResultsItemsPerRecordStatusCheck = Koha.Preference('MaxSearchResultsItemsPerRecordStatusCheck') %]
                         [% FOREACH SEARCH_RESULT IN SEARCH_RESULTS %]
                             <tr>
-                            [% IF ( AmazonCoverImages || LocalCoverImages ) %]
+                            [% IF AmazonCoverImages || LocalCoverImages || Koha.Preference('GoogleJacketsIntra') %]
                                 <td>
                                     [% IF ( LocalCoverImages) %]
                                         <a class="p1" href="/cgi-bin/koha/catalogue/[% DetailPage %]?biblionumber=[% SEARCH_RESULT.biblionumber |url %]">
@@ -373,6 +373,14 @@
                                         [% END %]
                                         </a>
                                     [% END %]
+                                    [% IF ( Koha.Preference('GoogleJacketsIntra') ) %]
+                                        [% IF ( SEARCH_RESULT.normalized_isbn ) %]
+                                            <div style="display:block;" title="Click to view in Google Books" class="[% SEARCH_RESULT.normalized_isbn %]" id="gbs-thumbnail[% loop.count %]"></div>
+                                        [% ELSE %]
+                                            <a href="http://books.google.com/books?q=[% SEARCH_RESULT.title |url %]"><span class="no-image">No cover image available</span></a>
+                                        [% END %]
+                                    [% END %]
+
                                 </td>
                             [% END %]
                             <td>
@@ -624,6 +632,7 @@
     <![endif]-->
     <script type="text/javascript" src="[% interface %]/js/browser.js"></script>
     <script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery.fixFloat.js"></script>
+    <script type="text/javascript" src="[% interface %]/[% theme %]/js/google-jackets.js"></script>
     <script type="text/javascript">
         var MSG_NO_ITEM_SELECTED = _("Nothing is selected.");
         var MSG_NON_RESERVES_SELECTED = _("One or more selected items cannot be placed on hold.");
@@ -746,6 +755,8 @@
                 KOHA.LocalCover.LoadResultsCovers();
             [% END %]
 
+            [% IF ( Koha.Preference('GoogleJacketsIntra') ) %]KOHA.Google.GetCoverFromIsbn();[% END %]
+
             $("#select_all").on("click",function(e){
                 e.preventDefault();
                 selectAll();
diff --git a/koha-tmpl/intranet-tmpl/prog/js/google-jackets.js b/koha-tmpl/intranet-tmpl/prog/js/google-jackets.js
new file mode 100644
index 0000000..3ba42ee
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/js/google-jackets.js
@@ -0,0 +1,76 @@
+if (typeof KOHA == "undefined" || !KOHA) {
+    var KOHA = {};
+}
+
+/**
+ * A namespace for Google related functions.
+ */
+KOHA.Google = {
+
+
+    /**
+     * Search all:
+     *    <div title="biblionumber" id="isbn" class="gbs-thumbnail"></div>
+     * or
+     *    <div title="biblionumber" id="isbn" class="gbs-thumbnail-preview"></div>
+     * and run a search with all collected isbns to Google Book Search.
+     * The result is asynchronously returned by Google and catched by
+     * gbsCallBack().
+     */
+    GetCoverFromIsbn: function(newWindow) {
+        var bibkeys = [];
+        $("[id^=gbs-thumbnail]").each(function(i) {
+            bibkeys.push($(this).attr("class")); // id=isbn
+        });
+        bibkeys = bibkeys.join(',');
+        var scriptElement = document.createElement("script");
+        this.openInNewWindow=newWindow;
+        scriptElement.setAttribute("id", "jsonScript");
+        scriptElement.setAttribute("src",
+            "https://books.google.com/books?bibkeys=" + escape(bibkeys) +
+            "&jscmd=viewapi&callback=KOHA.Google.gbsCallBack");
+        scriptElement.setAttribute("type", "text/javascript");
+        document.documentElement.firstChild.appendChild(scriptElement);
+
+    },
+
+    /**
+     * Add cover pages <div
+     * and link to preview if div id is gbs-thumbnail-preview
+     */
+    gbsCallBack: function(booksInfo) {
+         var target = '';
+         if (this.openInNewWindow) {
+            target = 'target="_blank" rel="noreferrer" ';
+         }
+         for (id in booksInfo) {
+             var book = booksInfo[id];
+             $("[id^=gbs-thumbnail]."+book.bib_key).each(function() {
+                 var a = document.createElement("a");
+                 a.href = book.info_url;
+                 if (typeof(book.thumbnail_url) != "undefined") {
+                     var img = document.createElement("img");
+                     img.src = book.thumbnail_url;
+                     $(this).empty().append(img);
+                     var re = /^gbs-thumbnail-preview/;
+                     if ( re.exec($(this).attr("id")) ) {
+                         $(this).append(
+                             '<div class="google-books-preview">' +
+                             '<a '+target+'href="' +
+                             book.info_url +
+                             '"><img src="' +
+                             'https://books.google.com/intl/en/googlebooks/images/gbs_preview_sticker1.gif' +
+                             '"></a></div>'
+                             );
+                     }
+                 } else {
+                     var message = document.createElement("span");
+                     $(message).attr("class","no-image");
+                     $(message).html("No cover image available");
+                     $(this).empty().append(message);
+                 }
+             });
+         }
+
+     }
+};
diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/.opac-detail.tt.swp b/koha-tmpl/opac-tmpl/bootstrap/en/modules/.opac-detail.tt.swp
new file mode 100644
index 0000000000000000000000000000000000000000..d63d3bdf131e3dfaa4e1cb35b48f9a2e087a9cbb
GIT binary patch
literal 16384
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
SO(1>Vm0>KUFj%K@{l5W=75Wqa

literal 0
HcmV?d00001

-- 
2.1.4