From e37672c6fefdb0650b5125f7c8fdb262b872c8ee Mon Sep 17 00:00:00 2001
From: Chris Hallberg <crhallberg@gmail.com>
Date: Tue, 27 Sep 2016 11:17:08 -0400
Subject: [PATCH] Fix cart problems with messages, display, uniqueness.

---
 themes/bootstrap3/js/cart.js             | 35 +++++++++++++-----------
 themes/bootstrap3/templates/header.phtml |  5 +++-
 2 files changed, 23 insertions(+), 17 deletions(-)

diff --git a/themes/bootstrap3/js/cart.js b/themes/bootstrap3/js/cart.js
index dd768ea40c1..3c67a67bbd8 100644
--- a/themes/bootstrap3/js/cart.js
+++ b/themes/bootstrap3/js/cart.js
@@ -49,14 +49,21 @@ VuFind.register('cart', function Cart() {
   }
 
   function updateCount() {
-    var items = _getItems();
+    var items = VuFind.cart.getFullItems();
     $('#cartItems strong').html(items.length);
-  }
+    if (items.length === parseInt(VuFind.translate('bookbagMax'))) {
+      $('#cartItems .full').removeClass('hidden');
+    } else {
+      $('#cartItems .full').addClass('hidden');
+    }
 
   function addItem(id, _source) {
     var source = _source || VuFind.defaultSearchBackend;
     var cartItems = _getItems();
     var cartSources = _getSources();
+    if (cartItems.length >= parseInt(VuFind.translate('bookbagMax'))) {
+      return false;
+    }
     var sIndex = cartSources.indexOf(source);
     if (sIndex < 0) {
       // Add source to source cookie
@@ -66,7 +73,7 @@ VuFind.register('cart', function Cart() {
     } else {
       cartItems[cartItems.length] = String.fromCharCode(65 + sIndex) + id;
     }
-    Cookies.setItem(_COOKIE, $.unique(cartItems).join(_COOKIE_DELIM), false, '/', _COOKIE_DOMAIN);
+    Cookies.setItem(_COOKIE, _uniqueArray(cartItems).join(_COOKIE_DELIM), false, '/', _COOKIE_DOMAIN);
     updateCount();
     return true;
   }
@@ -116,7 +123,7 @@ VuFind.register('cart', function Cart() {
   var _cartNotificationTimeout = false;
   function _registerUpdate($form) {
     if ($form) {
-      $("#updateCart, #bottom_updateCart").unbind('click').click(function cartUpdate(){
+      $("#updateCart, #bottom_updateCart").unbind('click').click(function cartUpdate() {
         var elId = this.id;
         var selectedBoxes = $("input[name='ids[]']:checked", $form);
         var selected = [];
@@ -124,28 +131,22 @@ VuFind.register('cart', function Cart() {
           selected[i] = this.value;
         });
         if (selected.length > 0) {
-          var inCart = 0;
           var msg = "";
           var orig = getFullItems();
           $(selected).each(function cartCheckedItemsAdd() {
-            for (var x in orig) {
-              if (this === orig[x]) {
-                inCart++;
-                return;
-              }
-            }
             var data = this.split('|');
             addItem(data[1], data[0]);
           });
           var updated = getFullItems();
           var added = updated.length - orig.length;
+          var inCart = selected.length - added;
           msg += added + " " + VuFind.translate('itemsAddBag');
+          if (updated.length >= parseInt(VuFind.translate('bookbagMax'))) {
+            msg += "<br/>" + VuFind.translate('bookbagFull');
+          }
           if (inCart > 0 && orig.length > 0) {
             msg += "<br/>" + inCart + " " + VuFind.translate('itemsInBag');
           }
-          if (updated.length >= VuFind.translate('bookbagMax')) {
-            msg += "<br/>" + VuFind.translate('bookbagFull');
-          }
           $('#' + elId).data('bs.popover').options.content = msg;
           $('#cartItems strong').html(updated.length);
         } else {
@@ -174,8 +175,9 @@ VuFind.register('cart', function Cart() {
         var $parent = $(this).parent();
         $parent.find('.cart-add.correct,.cart-remove.correct').removeClass('correct hidden');
         $parent.find('.cart-add').click(function cartAddClick() {
-          addItem(currentId, currentSource);
-          $parent.find('.cart-add,.cart-remove').toggleClass('hidden');
+          if (addItem(currentId, currentSource)) {
+            $parent.find('.cart-add,.cart-remove').toggleClass('hidden');
+          }
         });
         $parent.find('.cart-remove').click(function cartRemoveClick() {
           removeItem(currentId, currentSource);
@@ -188,6 +190,7 @@ VuFind.register('cart', function Cart() {
       _registerUpdate($form);
     }
     $("#updateCart, #bottom_updateCart").popover({content: '', html: true, trigger: 'manual'});
+    updateCount();
   }
 
   // Reveal
diff --git a/themes/bootstrap3/templates/header.phtml b/themes/bootstrap3/templates/header.phtml
index 2a02a82758a..bdf98502dab 100644
--- a/themes/bootstrap3/templates/header.phtml
+++ b/themes/bootstrap3/templates/header.phtml
@@ -22,7 +22,10 @@
         <? endif; ?>
         <? $cart = $this->cart(); if ($cart->isActive()): ?>
           <li id="cartSummary">
-            <a id="cartItems" data-lightbox title="<?=$this->transEsc('View Book Bag')?>" href="<?=$this->url('cart-home')?>"><i class="fa fa-suitcase" aria-hidden="true"></i> <strong><?=count($cart->getItems())?></strong> <?=$this->transEsc('items')?><?=$cart->isFull() ? ' (' .  $this->transEsc('bookbag_full') . ')' : ''?></a>
+            <a id="cartItems" data-lightbox title="<?=$this->transEsc('View Book Bag')?>" href="<?=$this->url('cart-home')?>">
+              <i class="fa fa-suitcase" aria-hidden="true"></i> <strong><?=count($cart->getItems())?></strong> <?=$this->transEsc('items')?>
+              <span class="full<?=!$cart->isFull() ? ' hidden' : '' ?>">(<?=$this->transEsc('bookbag_full') ?>)</span>
+            </a>
           </li>
         <? endif; ?>
         <? if (is_object($account) && $account->loginEnabled()): // hide login/logout if unavailable ?>
-- 
GitLab