From 114d357bc39825a73625579af3c77d93c1adf582 Mon Sep 17 00:00:00 2001
From: Ere Maijala <ere.maijala@helsinki.fi>
Date: Wed, 16 Oct 2019 15:02:21 +0300
Subject: [PATCH] Make it possible to init item status observer for multiple
 containers.

Also makes sure that status is not fetched multiple times for an item if same container was used twice.
---
 themes/bootstrap3/js/check_item_statuses.js | 26 ++++++++++-----------
 themes/bootstrap3/js/combined-search.js     |  2 +-
 2 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/themes/bootstrap3/js/check_item_statuses.js b/themes/bootstrap3/js/check_item_statuses.js
index 5d2b541017c..4b7c763f447 100644
--- a/themes/bootstrap3/js/check_item_statuses.js
+++ b/themes/bootstrap3/js/check_item_statuses.js
@@ -12,7 +12,7 @@ VuFind.register('itemStatuses', function ItemStatuses() {
     return callnumber;
   }
   function displayItemStatus(result, $item) {
-    $item.removeClass('js-item-pending');
+    $item.addClass('js-item-done').removeClass('js-item-pending');
     $item.find('.status').empty().append(result.availability_message);
     $item.find('.ajax-availability').removeClass('ajax-availability hidden');
     if (typeof(result.error) != 'undefined'
@@ -71,7 +71,6 @@ VuFind.register('itemStatuses', function ItemStatuses() {
     }
   }
 
-  var itemStatusObserver = null;
   var ItemStatusHandler = {
     name: "default",
     //array to hold IDs and elements
@@ -99,7 +98,7 @@ VuFind.register('itemStatuses', function ItemStatuses() {
       $('.js-item-pending .callnumAndLocation').addClass('text-danger').empty().removeClass('hidden')
         .append(typeof response.responseJSON.data === 'string' ? response.responseJSON.data : VuFind.translate('error_occurred'));
     },
-    itemQueueAjax: function itemQueueAjax(id, el){
+    itemQueueAjax: function itemQueueAjax(id, el) {
       clearTimeout(this.itemStatusTimer);
       this.itemStatusIds.push(id);
       this.itemStatusEls[id] = el;
@@ -110,7 +109,7 @@ VuFind.register('itemStatuses', function ItemStatuses() {
       el.find('.status').removeClass('hidden');
     },
 
-    runItemAjaxForQueue: function runItemAjaxForQueue(){
+    runItemAjaxForQueue: function runItemAjaxForQueue() {
       if (this.itemStatusRunning) {
         this.itemStatusTimer = setTimeout(this.runItemAjaxForQueue.bind(this), this.itemStatusDelay);
         return;
@@ -124,7 +123,7 @@ VuFind.register('itemStatuses', function ItemStatuses() {
       })
         .done(this.checkItemStatusDone)
         .fail( this.itemStatusFail)
-        .always(function queueAjaxAlways(){
+        .always(function queueAjaxAlways() {
           this.itemStatusRunning = false;
         });
     }//end runItemAjax
@@ -146,7 +145,7 @@ VuFind.register('itemStatuses', function ItemStatuses() {
 
   function checkItemStatus(el) {
     var $item = $(el);
-    if ($item.hasClass('js-item-pending')) {
+    if ($item.hasClass('js-item-pending') || $item.hasClass('js-item-done')) {
       return;
     }
     if ($item.find('.hiddenId').length === 0) {
@@ -179,17 +178,16 @@ VuFind.register('itemStatuses', function ItemStatuses() {
       }
       checkItemHandlers[handlerName].itemQueueAjax(id, $(ajaxItems[i]));
     }
-    // Stop looking for a scroll loader
-    if (itemStatusObserver) {
-      itemStatusObserver.disconnect();
-    }
   }
-  function init() {
+  function init(_container) {
     if (typeof Hunt === 'undefined') {
-      checkItemStatuses();
+      checkItemStatuses(_container);
     } else {
-      itemStatusObserver = new Hunt(
-        $('.ajaxItem').toArray(),
+      var container = typeof _container === 'undefined'
+        ? document.body
+        : _container;
+      new Hunt(
+        $(container).find('.ajaxItem').toArray(),
         { enter: checkItemStatus }
       );
     }
diff --git a/themes/bootstrap3/js/combined-search.js b/themes/bootstrap3/js/combined-search.js
index a78dc3ec79d..e7f1ad913db 100644
--- a/themes/bootstrap3/js/combined-search.js
+++ b/themes/bootstrap3/js/combined-search.js
@@ -6,7 +6,7 @@ VuFind.combinedSearch = (function CombinedSearch() {
         container.hide();
       } else {
         VuFind.openurl.init(container);
-        VuFind.itemStatuses.check(container);
+        VuFind.itemStatuses.init(container);
         checkSaveStatuses(container);
       }
     });
-- 
GitLab