spree_frontend 4.1.0.rc2 → 4.1.0.rc3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/app/assets/javascripts/spree/frontend/cart.js +12 -0
 - data/app/assets/javascripts/spree/frontend/checkout/address.js +2 -3
 - data/app/assets/javascripts/spree/frontend/checkout/shipment.js +16 -4
 - data/app/assets/javascripts/spree/frontend/views/spree/layouts/spree_application.js +30 -0
 - data/app/assets/javascripts/spree/frontend/views/spree/products/modal_carousel.js +31 -12
 - data/app/assets/javascripts/spree/frontend/views/spree/shared/carousel/thumbnails.js +77 -37
 - data/app/assets/javascripts/spree/frontend/views/spree/shared/nav_bar.js +16 -7
 - data/app/assets/javascripts/spree/frontend/views/spree/shared/product_added_modal.js +1 -1
 - data/app/assets/stylesheets/spree/frontend/application.scss +1 -0
 - data/app/assets/stylesheets/spree/frontend/components-bootstrap/modal.scss +4 -0
 - data/app/assets/stylesheets/spree/frontend/components-custom/inputs.scss +14 -13
 - data/app/assets/stylesheets/spree/frontend/views/spree/checkout/confirm.scss +5 -0
 - data/app/assets/stylesheets/spree/frontend/views/spree/checkout/edit.scss +7 -0
 - data/app/assets/stylesheets/spree/frontend/views/spree/checkout/registration.scss +0 -1
 - data/app/assets/stylesheets/spree/frontend/views/spree/orders/edit.scss +9 -0
 - data/app/assets/stylesheets/spree/frontend/views/spree/products/cart_form.scss +17 -15
 - data/app/assets/stylesheets/spree/frontend/views/spree/products/show.scss +7 -0
 - data/app/assets/stylesheets/spree/frontend/views/spree/shared/carousel/thumbnails.scss +3 -12
 - data/app/assets/stylesheets/spree/frontend/views/spree/shared/delete_address_popup.scss +3 -26
 - data/app/assets/stylesheets/spree/frontend/views/spree/shared/dropdown.scss +3 -0
 - data/app/assets/stylesheets/spree/frontend/views/spree/shared/main_nav_bar.scss +2 -1
 - data/app/assets/stylesheets/spree/frontend/views/spree/shared/quantity_select.scss +3 -1
 - data/app/controllers/spree/products_controller.rb +13 -0
 - data/app/controllers/spree/taxons_controller.rb +32 -7
 - data/app/helpers/spree/addresses_helper.rb +3 -1
 - data/app/helpers/spree/frontend_helper.rb +15 -6
 - data/app/views/spree/checkout/_delivery.html.erb +2 -1
 - data/app/views/spree/checkout/_summary.html.erb +29 -2
 - data/app/views/spree/checkout/edit.html.erb +7 -5
 - data/app/views/spree/checkout/registration.html.erb +1 -1
 - data/app/views/spree/products/_cart_form.html.erb +2 -2
 - data/app/views/spree/products/_filters_desktop.html.erb +3 -3
 - data/app/views/spree/products/_filters_mobile.html.erb +7 -7
 - data/app/views/spree/products/_gallery_modal.html.erb +2 -2
 - data/app/views/spree/products/_sort_desktop.html.erb +2 -2
 - data/app/views/spree/products/_sort_mobile.html.erb +2 -2
 - data/app/views/spree/shared/_cart.html.erb +0 -2
 - data/app/views/spree/shared/_checkout_header.html.erb +1 -1
 - data/app/views/spree/shared/_copyright.html.erb +1 -1
 - data/app/views/spree/shared/_header.html.erb +1 -1
 - data/app/views/spree/shared/_link_to_cart.html.erb +5 -2
 - data/app/views/spree/shared/_main_nav_bar.html.erb +3 -3
 - data/app/views/spree/shared/_nav_bar.html.erb +1 -1
 - data/app/views/spree/shared/_option_values.html.erb +1 -1
 - data/app/views/spree/shared/_registration.html.erb +1 -1
 - data/app/views/spree/shared/carousel/_thumbnails.html.erb +1 -1
 - data/app/views/spree/taxons/_subcategories.html.erb +2 -3
 - metadata +7 -6
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 6300d485b7d4f5e1ceab8dc942affa9be2a7fcb0cca1e233837428e230d45742
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: b5c81d760faa402320a3f2298f9c4e22eef9ec08c63e938bae635b35c989e529
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: dbdb68dfcc5c7a71b48e2e3777428e40bbbc7f86307d3fcf55fb8d5e15070414445ea372f647b3b60819f68adc0dc37bdf6de3fc3db4c45c5e424b5f6b6edb27
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 748be2c488b297951807df6038a97f99f48efbe2b188d19117276eeee8f260ece52dfcf2bfd38dc9bc0b6e14ecbb755c63fa3e4a721563f1fe5230070ded6585
         
     | 
| 
         @@ -4,8 +4,17 @@ Spree.ready(function ($) { 
     | 
|
| 
       4 
4 
     | 
    
         
             
              var formUpdateCart = $('form#update-cart')
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
              if (formUpdateCart.length) {
         
     | 
| 
      
 7 
     | 
    
         
            +
                var clearInvalidCouponField = function() {
         
     | 
| 
      
 8 
     | 
    
         
            +
                  var couponCodeField = $('#order_coupon_code');
         
     | 
| 
      
 9 
     | 
    
         
            +
                  var couponStatus = $('#coupon_status');
         
     | 
| 
      
 10 
     | 
    
         
            +
                  if (!!couponCodeField.val() && couponStatus.hasClass('alert-error')) {
         
     | 
| 
      
 11 
     | 
    
         
            +
                    couponCodeField.val('')
         
     | 
| 
      
 12 
     | 
    
         
            +
                  }
         
     | 
| 
      
 13 
     | 
    
         
            +
                }
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
       7 
15 
     | 
    
         
             
                $('form#update-cart a.delete').show().one('click', function () {
         
     | 
| 
       8 
16 
     | 
    
         
             
                  $(this).parents('.shopping-cart-item').first().find('input.shopping-cart-item-quantity-input').val(0)
         
     | 
| 
      
 17 
     | 
    
         
            +
                  clearInvalidCouponField()
         
     | 
| 
       9 
18 
     | 
    
         
             
                  $(this).parents('form').first().submit()
         
     | 
| 
       10 
19 
     | 
    
         
             
                  return false
         
     | 
| 
       11 
20 
     | 
    
         
             
                })
         
     | 
| 
         @@ -17,6 +26,7 @@ Spree.ready(function ($) { 
     | 
|
| 
       17 
26 
     | 
    
         
             
                  $(targetInputs).val(newValue)
         
     | 
| 
       18 
27 
     | 
    
         
             
                })
         
     | 
| 
       19 
28 
     | 
    
         
             
                $('form#update-cart input.shopping-cart-item-quantity-input').on('change', function(e) {
         
     | 
| 
      
 29 
     | 
    
         
            +
                  clearInvalidCouponField()
         
     | 
| 
       20 
30 
     | 
    
         
             
                  formUpdateCart.submit()
         
     | 
| 
       21 
31 
     | 
    
         
             
                })
         
     | 
| 
       22 
32 
     | 
    
         
             
                $('form#update-cart button.shopping-cart-item-quantity-decrease-btn').off('click').on('click', function() {
         
     | 
| 
         @@ -26,6 +36,7 @@ Spree.ready(function ($) { 
     | 
|
| 
       26 
36 
     | 
    
         | 
| 
       27 
37 
     | 
    
         
             
                  if (inputValue > 1) {
         
     | 
| 
       28 
38 
     | 
    
         
             
                    $(input).val(inputValue - 1)
         
     | 
| 
      
 39 
     | 
    
         
            +
                    clearInvalidCouponField()
         
     | 
| 
       29 
40 
     | 
    
         
             
                    formUpdateCart.submit()
         
     | 
| 
       30 
41 
     | 
    
         
             
                  }
         
     | 
| 
       31 
42 
     | 
    
         
             
                })
         
     | 
| 
         @@ -35,6 +46,7 @@ Spree.ready(function ($) { 
     | 
|
| 
       35 
46 
     | 
    
         
             
                  var inputValue = parseInt($(input).val(), 10)
         
     | 
| 
       36 
47 
     | 
    
         | 
| 
       37 
48 
     | 
    
         
             
                  $(input).val(inputValue + 1)
         
     | 
| 
      
 49 
     | 
    
         
            +
                  clearInvalidCouponField()
         
     | 
| 
       38 
50 
     | 
    
         
             
                  formUpdateCart.submit()
         
     | 
| 
       39 
51 
     | 
    
         
             
                })
         
     | 
| 
       40 
52 
     | 
    
         
             
                $('form#update-cart button#shopping-cart-coupon-code-button').off('click').on('click', function(event) {
         
     | 
| 
         @@ -48,7 +48,7 @@ Spree.ready(function ($) { 
     | 
|
| 
       48 
48 
     | 
    
         
             
                  }
         
     | 
| 
       49 
49 
     | 
    
         | 
| 
       50 
50 
     | 
    
         
             
                  Spree.fillStates = function (data, region) {
         
     | 
| 
       51 
     | 
    
         
            -
                    var selected 
     | 
| 
      
 51 
     | 
    
         
            +
                    var selected
         
     | 
| 
       52 
52 
     | 
    
         
             
                    var statesRequired = data.states_required
         
     | 
| 
       53 
53 
     | 
    
         
             
                    var states = data.states
         
     | 
| 
       54 
54 
     | 
    
         
             
                    var statePara = $('#' + region + 'state')
         
     | 
| 
         @@ -59,8 +59,7 @@ Spree.ready(function ($) { 
     | 
|
| 
       59 
59 
     | 
    
         
             
                    if (states.length > 0) {
         
     | 
| 
       60 
60 
     | 
    
         
             
                      selected = parseInt(stateSelect.val())
         
     | 
| 
       61 
61 
     | 
    
         
             
                      stateSelect.html('')
         
     | 
| 
       62 
     | 
    
         
            -
                       
     | 
| 
       63 
     | 
    
         
            -
                      $.each(statesWithBlank, function (idx, state) {
         
     | 
| 
      
 62 
     | 
    
         
            +
                      $.each(states, function (idx, state) {
         
     | 
| 
       64 
63 
     | 
    
         
             
                        var opt = $(document.createElement('option')).attr('value', state.id).html(state.name)
         
     | 
| 
       65 
64 
     | 
    
         
             
                        if (selected.toString(10) === state.id.toString(10)) {
         
     | 
| 
       66 
65 
     | 
    
         
             
                          opt.prop('selected', true)
         
     | 
| 
         @@ -3,6 +3,8 @@ function ShippingTotalManager (input1) { 
     | 
|
| 
       3 
3 
     | 
    
         
             
              this.input = input1
         
     | 
| 
       4 
4 
     | 
    
         
             
              this.shippingMethods = this.input.shippingMethods
         
     | 
| 
       5 
5 
     | 
    
         
             
              this.shipmentTotal = this.input.shipmentTotal
         
     | 
| 
      
 6 
     | 
    
         
            +
              this.taxTotal = this.input.taxTotal
         
     | 
| 
      
 7 
     | 
    
         
            +
              this.nonShipmentTax = $(this.taxTotal).data('non-shipment-tax')
         
     | 
| 
       6 
8 
     | 
    
         
             
              this.orderTotal = this.input.orderTotal
         
     | 
| 
       7 
9 
     | 
    
         
             
              this.formatOptions = {
         
     | 
| 
       8 
10 
     | 
    
         
             
                symbol: this.shipmentTotal.data('currency'),
         
     | 
| 
         @@ -15,20 +17,29 @@ function ShippingTotalManager (input1) { 
     | 
|
| 
       15 
17 
     | 
    
         
             
            ShippingTotalManager.prototype.calculateShipmentTotal = function () {
         
     | 
| 
       16 
18 
     | 
    
         
             
              var checked = $(this.shippingMethods).filter(':checked')
         
     | 
| 
       17 
19 
     | 
    
         
             
              this.sum = 0
         
     | 
| 
      
 20 
     | 
    
         
            +
              this.tax = this.parseCurrencyToFloat(this.nonShipmentTax)
         
     | 
| 
       18 
21 
     | 
    
         
             
              $.each(checked, function (idx, shippingMethod) {
         
     | 
| 
       19 
22 
     | 
    
         
             
                this.sum += this.parseCurrencyToFloat($(shippingMethod).data('cost'))
         
     | 
| 
      
 23 
     | 
    
         
            +
                this.tax += this.parseCurrencyToFloat($(shippingMethod).data('tax'))
         
     | 
| 
       20 
24 
     | 
    
         
             
              }.bind(this))
         
     | 
| 
       21 
     | 
    
         
            -
              return this.readjustSummarySection( 
     | 
| 
      
 25 
     | 
    
         
            +
              return this.readjustSummarySection(
         
     | 
| 
      
 26 
     | 
    
         
            +
                this.parseCurrencyToFloat(this.orderTotal.html()),
         
     | 
| 
      
 27 
     | 
    
         
            +
                this.sum,
         
     | 
| 
      
 28 
     | 
    
         
            +
                this.parseCurrencyToFloat(this.shipmentTotal.html()),
         
     | 
| 
      
 29 
     | 
    
         
            +
                this.tax,
         
     | 
| 
      
 30 
     | 
    
         
            +
                this.parseCurrencyToFloat(this.taxTotal.html())
         
     | 
| 
      
 31 
     | 
    
         
            +
              )
         
     | 
| 
       22 
32 
     | 
    
         
             
            }
         
     | 
| 
       23 
33 
     | 
    
         | 
| 
       24 
34 
     | 
    
         
             
            ShippingTotalManager.prototype.parseCurrencyToFloat = function (input) {
         
     | 
| 
       25 
35 
     | 
    
         
             
              return accounting.unformat(input, this.formatOptions.decimal)
         
     | 
| 
       26 
36 
     | 
    
         
             
            }
         
     | 
| 
       27 
37 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
            ShippingTotalManager.prototype.readjustSummarySection = function (orderTotal, newShipmentTotal, oldShipmentTotal) {
         
     | 
| 
       29 
     | 
    
         
            -
              var newOrderTotal = orderTotal + (newShipmentTotal - oldShipmentTotal)
         
     | 
| 
      
 38 
     | 
    
         
            +
            ShippingTotalManager.prototype.readjustSummarySection = function (orderTotal, newShipmentTotal, oldShipmentTotal, newTaxTotal, oldTaxTotal) {
         
     | 
| 
      
 39 
     | 
    
         
            +
              var newOrderTotal = orderTotal + (newShipmentTotal - oldShipmentTotal) + (newTaxTotal - oldTaxTotal)
         
     | 
| 
      
 40 
     | 
    
         
            +
              this.taxTotal.html(accounting.formatMoney(newTaxTotal, this.formatOptions))
         
     | 
| 
       30 
41 
     | 
    
         
             
              this.shipmentTotal.html(accounting.formatMoney(newShipmentTotal, this.formatOptions))
         
     | 
| 
       31 
     | 
    
         
            -
              return this.orderTotal.html(accounting.formatMoney(newOrderTotal, this.formatOptions))
         
     | 
| 
      
 42 
     | 
    
         
            +
              return this.orderTotal.html(accounting.formatMoney(accounting.toFixed(newOrderTotal, 10), this.formatOptions))
         
     | 
| 
       32 
43 
     | 
    
         
             
            }
         
     | 
| 
       33 
44 
     | 
    
         | 
| 
       34 
45 
     | 
    
         
             
            ShippingTotalManager.prototype.bindEvent = function () {
         
     | 
| 
         @@ -40,6 +51,7 @@ ShippingTotalManager.prototype.bindEvent = function () { 
     | 
|
| 
       40 
51 
     | 
    
         
             
            Spree.ready(function ($) {
         
     | 
| 
       41 
52 
     | 
    
         
             
              var input = {
         
     | 
| 
       42 
53 
     | 
    
         
             
                orderTotal: $('#summary-order-total'),
         
     | 
| 
      
 54 
     | 
    
         
            +
                taxTotal: $('[data-hook="tax-total"]'),
         
     | 
| 
       43 
55 
     | 
    
         
             
                shipmentTotal: $('[data-hook="shipping-total"]'),
         
     | 
| 
       44 
56 
     | 
    
         
             
                shippingMethods: $('input[data-behavior="shipping-method-selector"]')
         
     | 
| 
       45 
57 
     | 
    
         
             
              }
         
     | 
| 
         @@ -32,4 +32,34 @@ Spree.ready(function ($) { 
     | 
|
| 
       32 
32 
     | 
    
         
             
                  }
         
     | 
| 
       33 
33 
     | 
    
         
             
                }
         
     | 
| 
       34 
34 
     | 
    
         
             
              };
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
              var searchDropdown = document.getElementById('search-dropdown')
         
     | 
| 
      
 37 
     | 
    
         
            +
              var navBarCategoryLinks = document.getElementsByClassName('main-nav-bar-category-links')
         
     | 
| 
      
 38 
     | 
    
         
            +
              var navBarCategoryButtons = document.getElementsByClassName('main-nav-bar-category-button')
         
     | 
| 
      
 39 
     | 
    
         
            +
              var navBarCategoryImages = document.getElementsByClassName('category-image')
         
     | 
| 
      
 40 
     | 
    
         
            +
              var navBarAccountIcon = [document.getElementById('account-button')]
         
     | 
| 
      
 41 
     | 
    
         
            +
              var navBarCartIcon = [document.getElementById('link-to-cart')]
         
     | 
| 
      
 42 
     | 
    
         
            +
              var spreeLogoImage = document.getElementsByClassName('header-spree-fluid-logo')
         
     | 
| 
      
 43 
     | 
    
         
            +
              var spreeMobileNavs = document.getElementsByClassName('mobile-navigation-list-item')
         
     | 
| 
      
 44 
     | 
    
         
            +
              var navbarLinks = [
         
     | 
| 
      
 45 
     | 
    
         
            +
                navBarCategoryLinks,
         
     | 
| 
      
 46 
     | 
    
         
            +
                navBarCategoryButtons,
         
     | 
| 
      
 47 
     | 
    
         
            +
                navBarCategoryImages,
         
     | 
| 
      
 48 
     | 
    
         
            +
                navBarAccountIcon,
         
     | 
| 
      
 49 
     | 
    
         
            +
                navBarCartIcon,
         
     | 
| 
      
 50 
     | 
    
         
            +
                spreeLogoImage,
         
     | 
| 
      
 51 
     | 
    
         
            +
                spreeMobileNavs
         
     | 
| 
      
 52 
     | 
    
         
            +
              ]
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
              if (searchDropdown !== null) {
         
     | 
| 
      
 55 
     | 
    
         
            +
                $.each(navbarLinks, function(index, navbarElements) {
         
     | 
| 
      
 56 
     | 
    
         
            +
                  $.each(navbarElements, function(index, navBarCategoryLink) {
         
     | 
| 
      
 57 
     | 
    
         
            +
                    navBarCategoryLink.addEventListener('click', function () {
         
     | 
| 
      
 58 
     | 
    
         
            +
                      document.getElementById('overlay').classList.remove('shown');
         
     | 
| 
      
 59 
     | 
    
         
            +
                      searchDropdown.classList.remove('shown');
         
     | 
| 
      
 60 
     | 
    
         
            +
                      document.querySelector('.header-spree').classList.remove('above-overlay')
         
     | 
| 
      
 61 
     | 
    
         
            +
                    });
         
     | 
| 
      
 62 
     | 
    
         
            +
                  });
         
     | 
| 
      
 63 
     | 
    
         
            +
                });
         
     | 
| 
      
 64 
     | 
    
         
            +
              };
         
     | 
| 
       35 
65 
     | 
    
         
             
            });
         
     | 
| 
         @@ -1,26 +1,44 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            Spree.ready(function($) {
         
     | 
| 
       2 
     | 
    
         
            -
              var  
     | 
| 
       3 
     | 
    
         
            -
              if ( 
     | 
| 
       4 
     | 
    
         
            -
                ThumbnailsCarousel($,  
     | 
| 
      
 2 
     | 
    
         
            +
              var modalCarousel = $('#productModalThumbnailsCarousel')
         
     | 
| 
      
 3 
     | 
    
         
            +
              if (modalCarousel.length) {
         
     | 
| 
      
 4 
     | 
    
         
            +
                ThumbnailsCarousel($, modalCarousel)
         
     | 
| 
       5 
5 
     | 
    
         
             
              }
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
              var activeSingleImageIndex = function(sourceWrappingClass) {
         
     | 
| 
       8 
     | 
    
         
            -
                var  
     | 
| 
       9 
     | 
    
         
            -
                return  
     | 
| 
      
 8 
     | 
    
         
            +
                var activeSingleImage = $('.' + sourceWrappingClass + ' .product-details-single [data-variant-id].active')
         
     | 
| 
      
 9 
     | 
    
         
            +
                return activeSingleImage.index()
         
     | 
| 
       10 
10 
     | 
    
         
             
              }
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
              var  
     | 
| 
       13 
     | 
    
         
            -
                var  
     | 
| 
       14 
     | 
    
         
            -
                var  
     | 
| 
       15 
     | 
    
         
            -
                 
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
      
 12 
     | 
    
         
            +
              var selectThumbnail = function(imgIndex, carousel) {
         
     | 
| 
      
 13 
     | 
    
         
            +
                var carouselPerPage = carousel.data('product-carousel-per-page')
         
     | 
| 
      
 14 
     | 
    
         
            +
                var carouselItems = carousel.find('> div > div.carousel-item.product-thumbnails-carousel-item')
         
     | 
| 
      
 15 
     | 
    
         
            +
                var carouselItem = carouselItems[Math.floor(imgIndex / carouselPerPage)]
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                carouselItems.removeClass('active')
         
     | 
| 
      
 18 
     | 
    
         
            +
                $(carouselItems).find('img').removeClass('selected')
         
     | 
| 
      
 19 
     | 
    
         
            +
                $(carouselItem).addClass('active')
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                var thumbnailsChildren = $(carouselItem).find('> div > div')
         
     | 
| 
      
 22 
     | 
    
         
            +
                  .children('.product-thumbnails-carousel-item-single--visible[data-variant-id]')
         
     | 
| 
      
 23 
     | 
    
         
            +
                if (thumbnailsChildren.length > 0) {
         
     | 
| 
      
 24 
     | 
    
         
            +
                  $(thumbnailsChildren.get(imgIndex % carouselPerPage).getElementsByTagName('img')[0]).addClass('selected')
         
     | 
| 
       17 
25 
     | 
    
         
             
                }
         
     | 
| 
       18 
26 
     | 
    
         
             
              }
         
     | 
| 
       19 
27 
     | 
    
         | 
| 
      
 28 
     | 
    
         
            +
              var selectModalThumbnail = function(imgIndex) {
         
     | 
| 
      
 29 
     | 
    
         
            +
                selectThumbnail(imgIndex, modalCarousel)
         
     | 
| 
      
 30 
     | 
    
         
            +
              }
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
              var selectProductCarouselThumbnail = function() {
         
     | 
| 
      
 33 
     | 
    
         
            +
                var imgIndex = activeSingleImageIndex('modal') - 1
         
     | 
| 
      
 34 
     | 
    
         
            +
                var productCarousel = $('#productThumbnailsCarousel')
         
     | 
| 
      
 35 
     | 
    
         
            +
                selectThumbnail(imgIndex, productCarousel)
         
     | 
| 
      
 36 
     | 
    
         
            +
              }
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
       20 
38 
     | 
    
         
             
              var activateModalSingleImg = function(imgIndex, targetWrappingClass) {
         
     | 
| 
       21 
39 
     | 
    
         
             
                $('.' + targetWrappingClass + ' .product-details-single [data-variant-id].active').removeClass('active')
         
     | 
| 
       22 
     | 
    
         
            -
                var  
     | 
| 
       23 
     | 
    
         
            -
                 
     | 
| 
      
 40 
     | 
    
         
            +
                var modalActiveSingleImage = $($('.' + targetWrappingClass + ' .product-details-single [data-variant-id]').parent().children().get(imgIndex))
         
     | 
| 
      
 41 
     | 
    
         
            +
                modalActiveSingleImage.addClass('active')
         
     | 
| 
       24 
42 
     | 
    
         
             
              }
         
     | 
| 
       25 
43 
     | 
    
         | 
| 
       26 
44 
     | 
    
         
             
              $('#picturesModal').on('show.bs.modal', function() {
         
     | 
| 
         @@ -31,5 +49,6 @@ Spree.ready(function($) { 
     | 
|
| 
       31 
49 
     | 
    
         | 
| 
       32 
50 
     | 
    
         
             
              $('#picturesModal').on('hide.bs.modal', function() {
         
     | 
| 
       33 
51 
     | 
    
         
             
                activateModalSingleImg(activeSingleImageIndex('modal'), 'row')
         
     | 
| 
      
 52 
     | 
    
         
            +
                selectProductCarouselThumbnail()
         
     | 
| 
       34 
53 
     | 
    
         
             
              })
         
     | 
| 
       35 
54 
     | 
    
         
             
            })
         
     | 
| 
         @@ -1,43 +1,83 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            function ThumbnailsCarousel($,  
     | 
| 
      
 1 
     | 
    
         
            +
            function ThumbnailsCarousel($, carousel) {
         
     | 
| 
       2 
2 
     | 
    
         
             
              var VISIBLE_IMAGE_SELECTOR = '.product-thumbnails-carousel-item-single--visible img'
         
     | 
| 
       3 
3 
     | 
    
         
             
              var SELECTED_IMAGE_CLASS = 'selected'
         
     | 
| 
       4 
4 
     | 
    
         
             
              var self = this
         
     | 
| 
      
 5 
     | 
    
         
            +
              var modalCarouselId = 'productModalThumbnailsCarousel'
         
     | 
| 
      
 6 
     | 
    
         
            +
              var modalCarousel = $('#' + modalCarouselId)
         
     | 
| 
      
 7 
     | 
    
         
            +
              var zoomClickObject = $('.product-carousel-overlay-modal-opener')
         
     | 
| 
       5 
8 
     | 
    
         | 
| 
       6 
9 
     | 
    
         
             
              this.constructor = function() {
         
     | 
| 
       7 
10 
     | 
    
         
             
                this.bindEventHandlers()
         
     | 
| 
       8 
11 
     | 
    
         
             
              }
         
     | 
| 
       9 
12 
     | 
    
         | 
| 
       10 
13 
     | 
    
         
             
              this.bindEventHandlers = function() {
         
     | 
| 
       11 
     | 
    
         
            -
                 
     | 
| 
       12 
     | 
    
         
            -
                 
     | 
| 
      
 14 
     | 
    
         
            +
                zoomClickObject.on('click', this.handleZoomClick)
         
     | 
| 
      
 15 
     | 
    
         
            +
                carousel.on('click', 'img', this.handleImageClick)
         
     | 
| 
      
 16 
     | 
    
         
            +
                carousel.on('thumbnails:ready', this.handleThumbnailsReady)
         
     | 
| 
       13 
17 
     | 
    
         | 
| 
       14 
18 
     | 
    
         
             
                $('body').on('single_carousel:slide', this.handleSingleCarouselSlide)
         
     | 
| 
       15 
19 
     | 
    
         
             
              }
         
     | 
| 
       16 
20 
     | 
    
         | 
| 
       17 
21 
     | 
    
         
             
              this.handleImageClick = function(event) {
         
     | 
| 
       18 
     | 
    
         
            -
                self.selectImage($(event.target))
         
     | 
| 
      
 22 
     | 
    
         
            +
                self.selectImage(event, $(event.target))
         
     | 
| 
       19 
23 
     | 
    
         
             
              }
         
     | 
| 
       20 
24 
     | 
    
         | 
| 
       21 
     | 
    
         
            -
              this.handleThumbnailsReady = function( 
     | 
| 
       22 
     | 
    
         
            -
                var  
     | 
| 
      
 25 
     | 
    
         
            +
              this.handleThumbnailsReady = function(event) {
         
     | 
| 
      
 26 
     | 
    
         
            +
                var image = carousel.find(VISIBLE_IMAGE_SELECTOR).eq(0)
         
     | 
| 
       23 
27 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
                self.selectImage( 
     | 
| 
      
 28 
     | 
    
         
            +
                self.selectImage(event, image)
         
     | 
| 
       25 
29 
     | 
    
         
             
              }
         
     | 
| 
       26 
30 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
              this.handleSingleCarouselSlide = function( 
     | 
| 
       28 
     | 
    
         
            -
                var  
     | 
| 
      
 31 
     | 
    
         
            +
              this.handleSingleCarouselSlide = function(event, imageIndex) {
         
     | 
| 
      
 32 
     | 
    
         
            +
                var image;
         
     | 
| 
      
 33 
     | 
    
         
            +
                if (event.target.id === 'productModalCarousel') {
         
     | 
| 
      
 34 
     | 
    
         
            +
                  image = modalCarousel.find('[data-product-carousel-to-slide=' + imageIndex + '] img')
         
     | 
| 
      
 35 
     | 
    
         
            +
                  self.unselectModalImages()
         
     | 
| 
      
 36 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 37 
     | 
    
         
            +
                  image = carousel.find('[data-product-carousel-to-slide=' + imageIndex + '] img')
         
     | 
| 
      
 38 
     | 
    
         
            +
                  self.unselectThumbanilsImages()
         
     | 
| 
      
 39 
     | 
    
         
            +
                }
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                image.addClass(SELECTED_IMAGE_CLASS)
         
     | 
| 
      
 42 
     | 
    
         
            +
              }
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
              this.selectImage = function(event, image) {
         
     | 
| 
      
 45 
     | 
    
         
            +
                var clickedElement = event.target
         
     | 
| 
      
 46 
     | 
    
         
            +
                var productModalThumbnailClicked = $(clickedElement).closest('.product-thumbnails-carousel').is('#' + modalCarouselId)
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                if (clickedElement.id === modalCarouselId || productModalThumbnailClicked) {
         
     | 
| 
      
 49 
     | 
    
         
            +
                  this.unselectModalImages()
         
     | 
| 
      
 50 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 51 
     | 
    
         
            +
                  this.unselectThumbanilsImages()
         
     | 
| 
      
 52 
     | 
    
         
            +
                }
         
     | 
| 
       29 
53 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
                 
     | 
| 
      
 54 
     | 
    
         
            +
                image.addClass(SELECTED_IMAGE_CLASS)
         
     | 
| 
       31 
55 
     | 
    
         
             
              }
         
     | 
| 
       32 
56 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
              this. 
     | 
| 
       34 
     | 
    
         
            -
                 
     | 
| 
      
 57 
     | 
    
         
            +
              this.unselectThumbanilsImages = function() {
         
     | 
| 
      
 58 
     | 
    
         
            +
                carousel.find('img').removeClass(SELECTED_IMAGE_CLASS)
         
     | 
| 
      
 59 
     | 
    
         
            +
              }
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
              this.unselectModalImages = function() {
         
     | 
| 
      
 62 
     | 
    
         
            +
                modalCarousel.find('img').removeClass(SELECTED_IMAGE_CLASS)
         
     | 
| 
      
 63 
     | 
    
         
            +
              }
         
     | 
| 
       35 
64 
     | 
    
         | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
      
 65 
     | 
    
         
            +
              this.handleZoomClick = function(event) {
         
     | 
| 
      
 66 
     | 
    
         
            +
                var selectedImageId = self.getSelectedImageId()
         
     | 
| 
      
 67 
     | 
    
         
            +
                var image = modalCarousel.find(VISIBLE_IMAGE_SELECTOR).eq(selectedImageId)
         
     | 
| 
      
 68 
     | 
    
         
            +
                self.unselectModalImages()
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                image.addClass(SELECTED_IMAGE_CLASS)
         
     | 
| 
       37 
71 
     | 
    
         
             
              }
         
     | 
| 
       38 
72 
     | 
    
         | 
| 
       39 
     | 
    
         
            -
              this. 
     | 
| 
       40 
     | 
    
         
            -
                $ 
     | 
| 
      
 73 
     | 
    
         
            +
              this.getSelectedImageId = function() {
         
     | 
| 
      
 74 
     | 
    
         
            +
                var selectedImages = $('#productThumbnailsCarousel').find('img.d-block.w-100.lazyloaded.selected')
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                if (selectedImages.length > 1) {
         
     | 
| 
      
 77 
     | 
    
         
            +
                  return $(selectedImages[1]).parent()[0].dataset.productCarouselToSlide
         
     | 
| 
      
 78 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 79 
     | 
    
         
            +
                  return '0'
         
     | 
| 
      
 80 
     | 
    
         
            +
                }
         
     | 
| 
       41 
81 
     | 
    
         
             
              }
         
     | 
| 
       42 
82 
     | 
    
         | 
| 
       43 
83 
     | 
    
         
             
              this.constructor()
         
     | 
| 
         @@ -61,7 +101,7 @@ Spree.ready(function($) { 
     | 
|
| 
       61 
101 
     | 
    
         
             
                  )
         
     | 
| 
       62 
102 
     | 
    
         
             
                }
         
     | 
| 
       63 
103 
     | 
    
         | 
| 
       64 
     | 
    
         
            -
                Spree.showThumbnailsCarouselVariantImages = function( 
     | 
| 
      
 104 
     | 
    
         
            +
                Spree.showThumbnailsCarouselVariantImages = function(carousel, variantId) {
         
     | 
| 
       65 
105 
     | 
    
         
             
                  var carouselSlideSelector = '.product-thumbnails-carousel-item'
         
     | 
| 
       66 
106 
     | 
    
         
             
                  var carouselSlideContainerSelector =
         
     | 
| 
       67 
107 
     | 
    
         
             
                    '.product-thumbnails-carousel-item-content'
         
     | 
| 
         @@ -71,52 +111,52 @@ Spree.ready(function($) { 
     | 
|
| 
       71 
111 
     | 
    
         
             
                  var carouselPerPageAttributeName = 'data-product-carousel-per-page'
         
     | 
| 
       72 
112 
     | 
    
         
             
                  var carouselEmptyClass = 'product-thumbnails-carousel--empty'
         
     | 
| 
       73 
113 
     | 
    
         | 
| 
       74 
     | 
    
         
            -
                   
     | 
| 
      
 114 
     | 
    
         
            +
                  carousel.carouselBootstrap4('dispose')
         
     | 
| 
       75 
115 
     | 
    
         
             
                  var qualifiedSlides = 0
         
     | 
| 
       76 
     | 
    
         
            -
                  var perPage = parseInt( 
     | 
| 
       77 
     | 
    
         
            -
                  var  
     | 
| 
      
 116 
     | 
    
         
            +
                  var perPage = parseInt(carousel.attr(carouselPerPageAttributeName)) || 1
         
     | 
| 
      
 117 
     | 
    
         
            +
                  var slides = carousel.find(carouselSlideSelector)
         
     | 
| 
       78 
118 
     | 
    
         | 
| 
       79 
     | 
    
         
            -
                   
     | 
| 
      
 119 
     | 
    
         
            +
                  carousel
         
     | 
| 
       80 
120 
     | 
    
         
             
                    .find(carouselItemSelector)
         
     | 
| 
       81 
121 
     | 
    
         
             
                    .each(function(_itemIndex, slideElement) {
         
     | 
| 
       82 
122 
     | 
    
         
             
                      // Switch item visibility in the carousel based on picked variant.
         
     | 
| 
       83 
123 
     | 
    
         | 
| 
       84 
124 
     | 
    
         
             
                      var targetSlideIndex
         
     | 
| 
       85 
     | 
    
         
            -
                      var  
     | 
| 
      
 125 
     | 
    
         
            +
                      var slide = $(slideElement)
         
     | 
| 
       86 
126 
     | 
    
         
             
                      var qualifies =
         
     | 
| 
       87 
     | 
    
         
            -
                         
     | 
| 
       88 
     | 
    
         
            -
                         
     | 
| 
      
 127 
     | 
    
         
            +
                        slide.attr(variantIdAttributeName) === variantId ||
         
     | 
| 
      
 128 
     | 
    
         
            +
                        slide.attr(isMasterVariantAttributeName) === 'true'
         
     | 
| 
       89 
129 
     | 
    
         | 
| 
       90 
130 
     | 
    
         
             
                      if (qualifies) {
         
     | 
| 
       91 
131 
     | 
    
         
             
                        qualifiedSlides += 1
         
     | 
| 
       92 
     | 
    
         
            -
                         
     | 
| 
      
 132 
     | 
    
         
            +
                        slide.attr(carouselToSlideAttributeName, qualifiedSlides - 1)
         
     | 
| 
       93 
133 
     | 
    
         
             
                      }
         
     | 
| 
       94 
134 
     | 
    
         | 
| 
       95 
135 
     | 
    
         
             
                      targetSlideIndex = Math.max(0, Math.ceil(qualifiedSlides / perPage) - 1)
         
     | 
| 
       96 
     | 
    
         
            -
                       
     | 
| 
       97 
     | 
    
         
            -
                       
     | 
| 
      
 136 
     | 
    
         
            +
                      slide.detach()
         
     | 
| 
      
 137 
     | 
    
         
            +
                      slides
         
     | 
| 
       98 
138 
     | 
    
         
             
                        .eq(targetSlideIndex)
         
     | 
| 
       99 
139 
     | 
    
         
             
                        .find(carouselSlideContainerSelector)
         
     | 
| 
       100 
     | 
    
         
            -
                        .append( 
     | 
| 
       101 
     | 
    
         
            -
                       
     | 
| 
      
 140 
     | 
    
         
            +
                        .append(slide)
         
     | 
| 
      
 141 
     | 
    
         
            +
                      slide.toggleClass(enabledCarouselSingleClass, qualifies)
         
     | 
| 
       102 
142 
     | 
    
         
             
                    })
         
     | 
| 
       103 
143 
     | 
    
         
             
                  var enabledSlidesCount = Math.ceil(qualifiedSlides / perPage)
         
     | 
| 
       104 
     | 
    
         
            -
                   
     | 
| 
      
 144 
     | 
    
         
            +
                  carousel
         
     | 
| 
       105 
145 
     | 
    
         
             
                    .find(carouselSlideSelector)
         
     | 
| 
       106 
146 
     | 
    
         
             
                    .each(function(slideIndex, slideElement) {
         
     | 
| 
       107 
     | 
    
         
            -
                      var  
     | 
| 
       108 
     | 
    
         
            -
                       
     | 
| 
      
 147 
     | 
    
         
            +
                      var slide = $(slideElement)
         
     | 
| 
      
 148 
     | 
    
         
            +
                      slide.toggleClass(
         
     | 
| 
       109 
149 
     | 
    
         
             
                        enabledCarouselItemClass,
         
     | 
| 
       110 
150 
     | 
    
         
             
                        slideIndex < enabledSlidesCount
         
     | 
| 
       111 
151 
     | 
    
         
             
                      )
         
     | 
| 
       112 
     | 
    
         
            -
                       
     | 
| 
      
 152 
     | 
    
         
            +
                      slide.toggleClass(activeCarouselItemClass, slideIndex === 0)
         
     | 
| 
       113 
153 
     | 
    
         
             
                    })
         
     | 
| 
       114 
154 
     | 
    
         | 
| 
       115 
155 
     | 
    
         
             
                  // If there are no images to show after picking a variant, disable the carousel.
         
     | 
| 
       116 
     | 
    
         
            -
                   
     | 
| 
      
 156 
     | 
    
         
            +
                  carousel.toggleClass(carouselEmptyClass, enabledSlidesCount === 0)
         
     | 
| 
       117 
157 
     | 
    
         | 
| 
       118 
     | 
    
         
            -
                   
     | 
| 
       119 
     | 
    
         
            -
                   
     | 
| 
      
 158 
     | 
    
         
            +
                  carousel.carouselBootstrap4()
         
     | 
| 
      
 159 
     | 
    
         
            +
                  carousel.trigger('thumbnails:ready')
         
     | 
| 
       120 
160 
     | 
    
         
             
                }
         
     | 
| 
       121 
161 
     | 
    
         | 
| 
       122 
162 
     | 
    
         
             
                $('#product-details').on('variant_id_change', function(options) {
         
     | 
| 
         @@ -130,8 +170,8 @@ Spree.ready(function($) { 
     | 
|
| 
       130 
170 
     | 
    
         
             
                  })
         
     | 
| 
       131 
171 
     | 
    
         
             
                })
         
     | 
| 
       132 
172 
     | 
    
         | 
| 
       133 
     | 
    
         
            -
                var  
     | 
| 
      
 173 
     | 
    
         
            +
                var carousel = $('#productThumbnailsCarousel')
         
     | 
| 
       134 
174 
     | 
    
         | 
| 
       135 
     | 
    
         
            -
                ThumbnailsCarousel($,  
     | 
| 
      
 175 
     | 
    
         
            +
                ThumbnailsCarousel($, carousel)
         
     | 
| 
       136 
176 
     | 
    
         
             
              }
         
     | 
| 
       137 
177 
     | 
    
         
             
            })
         
     | 
| 
         @@ -1,16 +1,25 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
      
 1 
     | 
    
         
            +
            $(document).ready(function() {
         
     | 
| 
       2 
2 
     | 
    
         
             
              var searchIcons = document.querySelectorAll('#nav-bar .search-icons')[0]
         
     | 
| 
      
 3 
     | 
    
         
            +
              var searchDropdown = document.getElementById('search-dropdown')
         
     | 
| 
       3 
4 
     | 
    
         | 
| 
       4 
5 
     | 
    
         
             
              if (searchIcons !== undefined) {
         
     | 
| 
       5 
6 
     | 
    
         
             
                searchIcons.addEventListener(
         
     | 
| 
       6 
7 
     | 
    
         
             
                  'click',
         
     | 
| 
       7 
     | 
    
         
            -
                   
     | 
| 
       8 
     | 
    
         
            -
                    document.querySelector('.header-spree').classList.add('above-overlay')
         
     | 
| 
       9 
     | 
    
         
            -
                    document.getElementById('overlay').classList.add('shown')
         
     | 
| 
       10 
     | 
    
         
            -
                    document.getElementById('search-dropdown').classList.add('shown')
         
     | 
| 
       11 
     | 
    
         
            -
                    document.querySelector('#search-dropdown input').focus()
         
     | 
| 
       12 
     | 
    
         
            -
                  },
         
     | 
| 
      
 8 
     | 
    
         
            +
                  toggleSearchBar,
         
     | 
| 
       13 
9 
     | 
    
         
             
                  false
         
     | 
| 
       14 
10 
     | 
    
         
             
                )
         
     | 
| 
       15 
11 
     | 
    
         
             
              }
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              function toggleSearchBar() {
         
     | 
| 
      
 14 
     | 
    
         
            +
                if (searchDropdown.classList.contains('shown')) {
         
     | 
| 
      
 15 
     | 
    
         
            +
                  document.querySelector('.header-spree').classList.remove('above-overlay')
         
     | 
| 
      
 16 
     | 
    
         
            +
                  document.getElementById('overlay').classList.remove('shown')
         
     | 
| 
      
 17 
     | 
    
         
            +
                  searchDropdown.classList.remove('shown')
         
     | 
| 
      
 18 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 19 
     | 
    
         
            +
                  document.querySelector('.header-spree').classList.add('above-overlay')
         
     | 
| 
      
 20 
     | 
    
         
            +
                  document.getElementById('overlay').classList.add('shown')
         
     | 
| 
      
 21 
     | 
    
         
            +
                  searchDropdown.classList.add('shown')
         
     | 
| 
      
 22 
     | 
    
         
            +
                  document.querySelector('#search-dropdown input').focus()
         
     | 
| 
      
 23 
     | 
    
         
            +
                }
         
     | 
| 
      
 24 
     | 
    
         
            +
              }
         
     | 
| 
       16 
25 
     | 
    
         
             
            })
         
     | 
| 
         @@ -12,7 +12,7 @@ Spree.showProductAddedModal = function(product, variant) { 
     | 
|
| 
       12 
12 
     | 
    
         
             
              var $modal = $(modalSelector)
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
              $modal.find(nameSelector).text(name)
         
     | 
| 
       15 
     | 
    
         
            -
              $modal.find(priceSelector). 
     | 
| 
      
 15 
     | 
    
         
            +
              $modal.find(priceSelector).html(price)
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
17 
     | 
    
         
             
              if (leadImage !== null) {
         
     | 
| 
       18 
18 
     | 
    
         
             
                $modal
         
     |