spree_frontend 3.6.6 → 3.7.0.rc1
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.js +8 -0
 - data/app/assets/javascripts/spree/frontend/api_tokens.js +17 -0
 - data/app/assets/javascripts/spree/frontend/cart.js +59 -0
 - data/app/assets/javascripts/spree/frontend/checkout.js +19 -0
 - data/app/assets/javascripts/spree/frontend/checkout/address.js +102 -0
 - data/app/assets/javascripts/spree/frontend/checkout/payment.js +57 -0
 - data/app/assets/javascripts/spree/frontend/checkout/shipment.js +47 -0
 - data/app/assets/javascripts/spree/frontend/coupon_manager.js +45 -0
 - data/app/assets/javascripts/spree/frontend/product.js +104 -51
 - data/app/controllers/spree/checkout_controller.rb +7 -13
 - data/app/controllers/spree/locale_controller.rb +1 -3
 - data/app/controllers/spree/orders_controller.rb +25 -10
 - data/app/controllers/spree/store_controller.rb +12 -0
 - data/app/helpers/spree/frontend_helper.rb +8 -12
 - data/app/views/spree/checkout/_payment.html.erb +3 -3
 - data/app/views/spree/checkout/edit.html.erb +1 -1
 - data/app/views/spree/orders/edit.html.erb +1 -2
 - data/app/views/spree/products/_cart_form.html.erb +10 -4
 - data/app/views/spree/products/_properties.html.erb +1 -1
 - data/app/views/spree/products/_thumbnails.html.erb +4 -2
 - data/config/routes.rb +3 -0
 - data/lib/generators/spree/frontend/copy_views/copy_views_generator.rb +1 -1
 - data/spree_frontend.gemspec +2 -2
 - metadata +18 -23
 - data/app/assets/javascripts/spree/frontend/cart.js.coffee +0 -28
 - data/app/assets/javascripts/spree/frontend/checkout.js.coffee +0 -16
 - data/app/assets/javascripts/spree/frontend/checkout/address.js.coffee +0 -81
 - data/app/assets/javascripts/spree/frontend/checkout/payment.js.coffee +0 -57
 - data/app/assets/javascripts/spree/frontend/checkout/shipment.js.coffee +0 -41
 - data/app/assets/javascripts/spree/frontend/coupon_manager.js.coffee +0 -37
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: a0e2c124c039c8effa704a756c493bb5ef7f033c75e62a7d212ce6a09b8b037c
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: d5fa482f5b8560847b2d3453ae8e7d312c8ffd2496b9e775d628f4c8bc7cef39
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 31e2ddb024d889816abdd39115a47ff816cac233d541307490392f327c46b18329dda1c0c16eec0b36f6c38c04ebd675c20a15fa7346f53533867f656f4d9657
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 87c016d53c0bf16c7e298bca4a4009020a37bb05fa23fe240827d00beb56f2b0b707214d23169ad3c6d467f6f884e83ac20548a885f249ddccb5e84599799ba4
         
     | 
| 
         @@ -1,8 +1,16 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            //= require bootstrap-sprockets
         
     | 
| 
       2 
2 
     | 
    
         
             
            //= require jquery.payment
         
     | 
| 
       3 
3 
     | 
    
         
             
            //= require spree
         
     | 
| 
      
 4 
     | 
    
         
            +
            //= require polyfill.min
         
     | 
| 
      
 5 
     | 
    
         
            +
            //= require fetch.umd
         
     | 
| 
      
 6 
     | 
    
         
            +
            //= require spree/api/main
         
     | 
| 
      
 7 
     | 
    
         
            +
            //= require spree/frontend/api_tokens
         
     | 
| 
       4 
8 
     | 
    
         
             
            //= require spree/frontend/cart
         
     | 
| 
       5 
9 
     | 
    
         
             
            //= require spree/frontend/checkout
         
     | 
| 
       6 
10 
     | 
    
         
             
            //= require spree/frontend/checkout/address
         
     | 
| 
       7 
11 
     | 
    
         
             
            //= require spree/frontend/checkout/payment
         
     | 
| 
       8 
12 
     | 
    
         
             
            //= require spree/frontend/product
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            Spree.routes.api_tokens = Spree.pathFor('api_tokens')
         
     | 
| 
      
 15 
     | 
    
         
            +
            Spree.routes.ensure_cart = Spree.pathFor('ensure_cart')
         
     | 
| 
      
 16 
     | 
    
         
            +
            Spree.routes.api_v2_storefront_cart_apply_coupon_code = Spree.pathFor('api/v2/storefront/cart/apply_coupon_code')
         
     | 
| 
         @@ -0,0 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            Spree.fetchApiTokens = function () {
         
     | 
| 
      
 2 
     | 
    
         
            +
              fetch(Spree.routes.api_tokens, {
         
     | 
| 
      
 3 
     | 
    
         
            +
                method: 'GET',
         
     | 
| 
      
 4 
     | 
    
         
            +
                credentials: 'same-origin'
         
     | 
| 
      
 5 
     | 
    
         
            +
              }).then(function (response) {
         
     | 
| 
      
 6 
     | 
    
         
            +
                switch (response.status) {
         
     | 
| 
      
 7 
     | 
    
         
            +
                  case 200:
         
     | 
| 
      
 8 
     | 
    
         
            +
                    response.json().then(function (json) {
         
     | 
| 
      
 9 
     | 
    
         
            +
                      SpreeAPI.orderToken = json.order_token
         
     | 
| 
      
 10 
     | 
    
         
            +
                      SpreeAPI.oauthToken = json.oauth_token
         
     | 
| 
      
 11 
     | 
    
         
            +
                    })
         
     | 
| 
      
 12 
     | 
    
         
            +
                    break
         
     | 
| 
      
 13 
     | 
    
         
            +
                }
         
     | 
| 
      
 14 
     | 
    
         
            +
              })
         
     | 
| 
      
 15 
     | 
    
         
            +
            }
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            Spree.ready(function () { Spree.fetchApiTokens() })
         
     | 
| 
         @@ -0,0 +1,59 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            //= require spree/frontend/coupon_manager
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Spree.ready(function ($) {
         
     | 
| 
      
 4 
     | 
    
         
            +
              var formUpdateCart = $('form#update-cart')
         
     | 
| 
      
 5 
     | 
    
         
            +
              if (formUpdateCart.length) {
         
     | 
| 
      
 6 
     | 
    
         
            +
                $('form#update-cart a.delete').show().one('click', function () {
         
     | 
| 
      
 7 
     | 
    
         
            +
                  $(this).parents('.line-item').first().find('input.line_item_quantity').val(0)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  $(this).parents('form').first().submit()
         
     | 
| 
      
 9 
     | 
    
         
            +
                  return false
         
     | 
| 
      
 10 
     | 
    
         
            +
                })
         
     | 
| 
      
 11 
     | 
    
         
            +
              }
         
     | 
| 
      
 12 
     | 
    
         
            +
              formUpdateCart.submit(function (event) {
         
     | 
| 
      
 13 
     | 
    
         
            +
                var input = {
         
     | 
| 
      
 14 
     | 
    
         
            +
                  couponCodeField: $('#order_coupon_code'),
         
     | 
| 
      
 15 
     | 
    
         
            +
                  couponStatus: $('#coupon_status')
         
     | 
| 
      
 16 
     | 
    
         
            +
                }
         
     | 
| 
      
 17 
     | 
    
         
            +
                var updateButton = $('form#update-cart #update-button')
         
     | 
| 
      
 18 
     | 
    
         
            +
                updateButton.attr('disabled', true)
         
     | 
| 
      
 19 
     | 
    
         
            +
                if ($.trim(input.couponCodeField.val()).length > 0) {
         
     | 
| 
      
 20 
     | 
    
         
            +
                  // eslint-disable-next-line no-undef
         
     | 
| 
      
 21 
     | 
    
         
            +
                  if (new CouponManager(input).applyCoupon()) {
         
     | 
| 
      
 22 
     | 
    
         
            +
                    this.submit()
         
     | 
| 
      
 23 
     | 
    
         
            +
                    return true
         
     | 
| 
      
 24 
     | 
    
         
            +
                  } else {
         
     | 
| 
      
 25 
     | 
    
         
            +
                    updateButton.attr('disabled', false)
         
     | 
| 
      
 26 
     | 
    
         
            +
                    event.preventDefault()
         
     | 
| 
      
 27 
     | 
    
         
            +
                    return false
         
     | 
| 
      
 28 
     | 
    
         
            +
                  }
         
     | 
| 
      
 29 
     | 
    
         
            +
                }
         
     | 
| 
      
 30 
     | 
    
         
            +
              })
         
     | 
| 
      
 31 
     | 
    
         
            +
            })
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            Spree.fetch_cart = function () {
         
     | 
| 
      
 34 
     | 
    
         
            +
              return $.ajax({
         
     | 
| 
      
 35 
     | 
    
         
            +
                url: Spree.pathFor('cart_link')
         
     | 
| 
      
 36 
     | 
    
         
            +
              }).done(function (data) {
         
     | 
| 
      
 37 
     | 
    
         
            +
                return $('#link-to-cart').html(data)
         
     | 
| 
      
 38 
     | 
    
         
            +
              })
         
     | 
| 
      
 39 
     | 
    
         
            +
            }
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            Spree.ensureCart = function (successCallback) {
         
     | 
| 
      
 42 
     | 
    
         
            +
              if (SpreeAPI.orderToken) {
         
     | 
| 
      
 43 
     | 
    
         
            +
                successCallback()
         
     | 
| 
      
 44 
     | 
    
         
            +
              } else {
         
     | 
| 
      
 45 
     | 
    
         
            +
                fetch(Spree.routes.ensure_cart, {
         
     | 
| 
      
 46 
     | 
    
         
            +
                  method: 'POST',
         
     | 
| 
      
 47 
     | 
    
         
            +
                  credentials: 'same-origin'
         
     | 
| 
      
 48 
     | 
    
         
            +
                }).then(function (response) {
         
     | 
| 
      
 49 
     | 
    
         
            +
                  switch (response.status) {
         
     | 
| 
      
 50 
     | 
    
         
            +
                    case 200:
         
     | 
| 
      
 51 
     | 
    
         
            +
                      response.json().then(function (json) {
         
     | 
| 
      
 52 
     | 
    
         
            +
                        SpreeAPI.orderToken = json.token
         
     | 
| 
      
 53 
     | 
    
         
            +
                        successCallback()
         
     | 
| 
      
 54 
     | 
    
         
            +
                      })
         
     | 
| 
      
 55 
     | 
    
         
            +
                      break
         
     | 
| 
      
 56 
     | 
    
         
            +
                  }
         
     | 
| 
      
 57 
     | 
    
         
            +
                })
         
     | 
| 
      
 58 
     | 
    
         
            +
              }
         
     | 
| 
      
 59 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -0,0 +1,19 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            Spree.disableSaveOnClick = function () {
         
     | 
| 
      
 2 
     | 
    
         
            +
              $('form.edit_order').on('submit', function (event) {
         
     | 
| 
      
 3 
     | 
    
         
            +
                if ($(this).data('submitted') === true) {
         
     | 
| 
      
 4 
     | 
    
         
            +
                  event.preventDefault()
         
     | 
| 
      
 5 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 6 
     | 
    
         
            +
                  $(this).data('submitted', true)
         
     | 
| 
      
 7 
     | 
    
         
            +
                  $(this).find(':submit, :image').removeClass('primary').addClass('disabled')
         
     | 
| 
      
 8 
     | 
    
         
            +
                }
         
     | 
| 
      
 9 
     | 
    
         
            +
              })
         
     | 
| 
      
 10 
     | 
    
         
            +
            }
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            Spree.enableSave = function () {
         
     | 
| 
      
 13 
     | 
    
         
            +
              $('form.edit_order').data('submitted', false).find(':submit, :image').attr('disabled', false).addClass('primary').removeClass('disabled')
         
     | 
| 
      
 14 
     | 
    
         
            +
            }
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            Spree.ready(function () {
         
     | 
| 
      
 17 
     | 
    
         
            +
              Spree.Checkout = {}
         
     | 
| 
      
 18 
     | 
    
         
            +
              return Spree.Checkout
         
     | 
| 
      
 19 
     | 
    
         
            +
            })
         
     | 
| 
         @@ -0,0 +1,102 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            Spree.ready(function ($) {
         
     | 
| 
      
 2 
     | 
    
         
            +
              Spree.onAddress = function () {
         
     | 
| 
      
 3 
     | 
    
         
            +
                if ($('#checkout_form_address').length) {
         
     | 
| 
      
 4 
     | 
    
         
            +
                  Spree.updateState = function (region) {
         
     | 
| 
      
 5 
     | 
    
         
            +
                    var countryId = getCountryId(region)
         
     | 
| 
      
 6 
     | 
    
         
            +
                    if (countryId != null) {
         
     | 
| 
      
 7 
     | 
    
         
            +
                      if (Spree.Checkout[countryId] == null) {
         
     | 
| 
      
 8 
     | 
    
         
            +
                        $.get(Spree.routes.states_search, {
         
     | 
| 
      
 9 
     | 
    
         
            +
                          country_id: countryId
         
     | 
| 
      
 10 
     | 
    
         
            +
                        }).done(function (data) {
         
     | 
| 
      
 11 
     | 
    
         
            +
                          Spree.Checkout[countryId] = {
         
     | 
| 
      
 12 
     | 
    
         
            +
                            states: data.states,
         
     | 
| 
      
 13 
     | 
    
         
            +
                            states_required: data.states_required
         
     | 
| 
      
 14 
     | 
    
         
            +
                          }
         
     | 
| 
      
 15 
     | 
    
         
            +
                          Spree.fillStates(Spree.Checkout[countryId], region)
         
     | 
| 
      
 16 
     | 
    
         
            +
                        })
         
     | 
| 
      
 17 
     | 
    
         
            +
                      } else {
         
     | 
| 
      
 18 
     | 
    
         
            +
                        Spree.fillStates(Spree.Checkout[countryId], region)
         
     | 
| 
      
 19 
     | 
    
         
            +
                      }
         
     | 
| 
      
 20 
     | 
    
         
            +
                    }
         
     | 
| 
      
 21 
     | 
    
         
            +
                  }
         
     | 
| 
      
 22 
     | 
    
         
            +
                  Spree.fillStates = function (data, region) {
         
     | 
| 
      
 23 
     | 
    
         
            +
                    var selected, statesWithBlank
         
     | 
| 
      
 24 
     | 
    
         
            +
                    var statesRequired = data.states_required
         
     | 
| 
      
 25 
     | 
    
         
            +
                    var states = data.states
         
     | 
| 
      
 26 
     | 
    
         
            +
                    var statePara = $('#' + region + 'state')
         
     | 
| 
      
 27 
     | 
    
         
            +
                    var stateSelect = statePara.find('select')
         
     | 
| 
      
 28 
     | 
    
         
            +
                    var stateInput = statePara.find('input')
         
     | 
| 
      
 29 
     | 
    
         
            +
                    var stateSpanRequired = statePara.find('[id$="state-required"]')
         
     | 
| 
      
 30 
     | 
    
         
            +
                    if (states.length > 0) {
         
     | 
| 
      
 31 
     | 
    
         
            +
                      selected = parseInt(stateSelect.val())
         
     | 
| 
      
 32 
     | 
    
         
            +
                      stateSelect.html('')
         
     | 
| 
      
 33 
     | 
    
         
            +
                      statesWithBlank = [
         
     | 
| 
      
 34 
     | 
    
         
            +
                        {
         
     | 
| 
      
 35 
     | 
    
         
            +
                          name: '',
         
     | 
| 
      
 36 
     | 
    
         
            +
                          id: ''
         
     | 
| 
      
 37 
     | 
    
         
            +
                        }
         
     | 
| 
      
 38 
     | 
    
         
            +
                      ].concat(states)
         
     | 
| 
      
 39 
     | 
    
         
            +
                      $.each(statesWithBlank, function (idx, state) {
         
     | 
| 
      
 40 
     | 
    
         
            +
                        var opt = $(document.createElement('option')).attr('value', state.id).html(state.name)
         
     | 
| 
      
 41 
     | 
    
         
            +
                        if (selected === state.id) {
         
     | 
| 
      
 42 
     | 
    
         
            +
                          opt.prop('selected', true)
         
     | 
| 
      
 43 
     | 
    
         
            +
                        }
         
     | 
| 
      
 44 
     | 
    
         
            +
                        stateSelect.append(opt)
         
     | 
| 
      
 45 
     | 
    
         
            +
                      })
         
     | 
| 
      
 46 
     | 
    
         
            +
                      stateSelect.prop('disabled', false).show()
         
     | 
| 
      
 47 
     | 
    
         
            +
                      stateInput.hide().prop('disabled', true)
         
     | 
| 
      
 48 
     | 
    
         
            +
                      statePara.show()
         
     | 
| 
      
 49 
     | 
    
         
            +
                      stateSpanRequired.show()
         
     | 
| 
      
 50 
     | 
    
         
            +
                      if (statesRequired) {
         
     | 
| 
      
 51 
     | 
    
         
            +
                        stateSelect.addClass('required')
         
     | 
| 
      
 52 
     | 
    
         
            +
                      }
         
     | 
| 
      
 53 
     | 
    
         
            +
                      stateSelect.removeClass('hidden')
         
     | 
| 
      
 54 
     | 
    
         
            +
                      stateInput.removeClass('required')
         
     | 
| 
      
 55 
     | 
    
         
            +
                    } else {
         
     | 
| 
      
 56 
     | 
    
         
            +
                      stateSelect.hide().prop('disabled', true)
         
     | 
| 
      
 57 
     | 
    
         
            +
                      stateInput.show()
         
     | 
| 
      
 58 
     | 
    
         
            +
                      if (statesRequired) {
         
     | 
| 
      
 59 
     | 
    
         
            +
                        stateSpanRequired.show()
         
     | 
| 
      
 60 
     | 
    
         
            +
                        stateInput.addClass('required')
         
     | 
| 
      
 61 
     | 
    
         
            +
                      } else {
         
     | 
| 
      
 62 
     | 
    
         
            +
                        stateInput.val('')
         
     | 
| 
      
 63 
     | 
    
         
            +
                        stateSpanRequired.hide()
         
     | 
| 
      
 64 
     | 
    
         
            +
                        stateInput.removeClass('required')
         
     | 
| 
      
 65 
     | 
    
         
            +
                      }
         
     | 
| 
      
 66 
     | 
    
         
            +
                      statePara.toggle(!!statesRequired)
         
     | 
| 
      
 67 
     | 
    
         
            +
                      stateInput.prop('disabled', !statesRequired)
         
     | 
| 
      
 68 
     | 
    
         
            +
                      stateInput.removeClass('hidden')
         
     | 
| 
      
 69 
     | 
    
         
            +
                      stateSelect.removeClass('required')
         
     | 
| 
      
 70 
     | 
    
         
            +
                    }
         
     | 
| 
      
 71 
     | 
    
         
            +
                  }
         
     | 
| 
      
 72 
     | 
    
         
            +
                  $('#bcountry select').change(function () {
         
     | 
| 
      
 73 
     | 
    
         
            +
                    Spree.updateState('b')
         
     | 
| 
      
 74 
     | 
    
         
            +
                  })
         
     | 
| 
      
 75 
     | 
    
         
            +
                  $('#scountry select').change(function () {
         
     | 
| 
      
 76 
     | 
    
         
            +
                    Spree.updateState('s')
         
     | 
| 
      
 77 
     | 
    
         
            +
                  })
         
     | 
| 
      
 78 
     | 
    
         
            +
                  Spree.updateState('b')
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
                  var orderUseBilling = $('input#order_use_billing')
         
     | 
| 
      
 81 
     | 
    
         
            +
                  orderUseBilling.change(function () {
         
     | 
| 
      
 82 
     | 
    
         
            +
                    updateShippingFormState(orderUseBilling)
         
     | 
| 
      
 83 
     | 
    
         
            +
                  })
         
     | 
| 
      
 84 
     | 
    
         
            +
                  updateShippingFormState(orderUseBilling)
         
     | 
| 
      
 85 
     | 
    
         
            +
                }
         
     | 
| 
      
 86 
     | 
    
         
            +
                function updateShippingFormState (orderUseBilling) {
         
     | 
| 
      
 87 
     | 
    
         
            +
                  if (orderUseBilling.is(':checked')) {
         
     | 
| 
      
 88 
     | 
    
         
            +
                    $('#shipping .inner').hide()
         
     | 
| 
      
 89 
     | 
    
         
            +
                    $('#shipping .inner input, #shipping .inner select').prop('disabled', true)
         
     | 
| 
      
 90 
     | 
    
         
            +
                  } else {
         
     | 
| 
      
 91 
     | 
    
         
            +
                    $('#shipping .inner').show()
         
     | 
| 
      
 92 
     | 
    
         
            +
                    $('#shipping .inner input, #shipping .inner select').prop('disabled', false)
         
     | 
| 
      
 93 
     | 
    
         
            +
                    Spree.updateState('s')
         
     | 
| 
      
 94 
     | 
    
         
            +
                  }
         
     | 
| 
      
 95 
     | 
    
         
            +
                }
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
                function getCountryId (region) {
         
     | 
| 
      
 98 
     | 
    
         
            +
                  return $('#' + region + 'country select').val()
         
     | 
| 
      
 99 
     | 
    
         
            +
                }
         
     | 
| 
      
 100 
     | 
    
         
            +
              }
         
     | 
| 
      
 101 
     | 
    
         
            +
              Spree.onAddress()
         
     | 
| 
      
 102 
     | 
    
         
            +
            })
         
     | 
| 
         @@ -0,0 +1,57 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            //= require spree/frontend/coupon_manager
         
     | 
| 
      
 2 
     | 
    
         
            +
            Spree.ready(function ($) {
         
     | 
| 
      
 3 
     | 
    
         
            +
              Spree.onPayment = function () {
         
     | 
| 
      
 4 
     | 
    
         
            +
                if ($('#checkout_form_payment').length) {
         
     | 
| 
      
 5 
     | 
    
         
            +
                  if ($('#existing_cards').length) {
         
     | 
| 
      
 6 
     | 
    
         
            +
                    $('#payment-method-fields').hide()
         
     | 
| 
      
 7 
     | 
    
         
            +
                    $('#payment-methods').hide()
         
     | 
| 
      
 8 
     | 
    
         
            +
                    $('#use_existing_card_yes').click(function () {
         
     | 
| 
      
 9 
     | 
    
         
            +
                      $('#payment-method-fields').hide()
         
     | 
| 
      
 10 
     | 
    
         
            +
                      $('#payment-methods').hide()
         
     | 
| 
      
 11 
     | 
    
         
            +
                      $('.existing-cc-radio').prop('disabled', false)
         
     | 
| 
      
 12 
     | 
    
         
            +
                    })
         
     | 
| 
      
 13 
     | 
    
         
            +
                    $('#use_existing_card_no').click(function () {
         
     | 
| 
      
 14 
     | 
    
         
            +
                      $('#payment-method-fields').show()
         
     | 
| 
      
 15 
     | 
    
         
            +
                      $('#payment-methods').show()
         
     | 
| 
      
 16 
     | 
    
         
            +
                      $('.existing-cc-radio').prop('disabled', true)
         
     | 
| 
      
 17 
     | 
    
         
            +
                    })
         
     | 
| 
      
 18 
     | 
    
         
            +
                  }
         
     | 
| 
      
 19 
     | 
    
         
            +
                  $('.cardNumber').payment('formatCardNumber')
         
     | 
| 
      
 20 
     | 
    
         
            +
                  $('.cardExpiry').payment('formatCardExpiry')
         
     | 
| 
      
 21 
     | 
    
         
            +
                  $('.cardCode').payment('formatCardCVC')
         
     | 
| 
      
 22 
     | 
    
         
            +
                  $('.cardNumber').change(function () {
         
     | 
| 
      
 23 
     | 
    
         
            +
                    $(this).parent().siblings('.ccType').val($.payment.cardType(this.value))
         
     | 
| 
      
 24 
     | 
    
         
            +
                  })
         
     | 
| 
      
 25 
     | 
    
         
            +
                  $('input[type="radio"][name="order[payments_attributes][][payment_method_id]"]').click(function () {
         
     | 
| 
      
 26 
     | 
    
         
            +
                    $('#payment-methods li').hide()
         
     | 
| 
      
 27 
     | 
    
         
            +
                    if (this.checked) {
         
     | 
| 
      
 28 
     | 
    
         
            +
                      $('#payment_method_' + this.value).show()
         
     | 
| 
      
 29 
     | 
    
         
            +
                    }
         
     | 
| 
      
 30 
     | 
    
         
            +
                  })
         
     | 
| 
      
 31 
     | 
    
         
            +
                  $(document).on('click', '#cvv_link', function (event) {
         
     | 
| 
      
 32 
     | 
    
         
            +
                    var windowName = 'cvv_info'
         
     | 
| 
      
 33 
     | 
    
         
            +
                    var windowOptions = 'left=20,top=20,width=500,height=500,toolbar=0,resizable=0,scrollbars=1'
         
     | 
| 
      
 34 
     | 
    
         
            +
                    window.open($(this).attr('href'), windowName, windowOptions)
         
     | 
| 
      
 35 
     | 
    
         
            +
                    event.preventDefault()
         
     | 
| 
      
 36 
     | 
    
         
            +
                  })
         
     | 
| 
      
 37 
     | 
    
         
            +
                  $('input[type="radio"]:checked').click()
         
     | 
| 
      
 38 
     | 
    
         
            +
                  $('#checkout_form_payment').submit(function (event) {
         
     | 
| 
      
 39 
     | 
    
         
            +
                    var input = {
         
     | 
| 
      
 40 
     | 
    
         
            +
                      couponCodeField: $('#order_coupon_code'),
         
     | 
| 
      
 41 
     | 
    
         
            +
                      couponStatus: $('#coupon_status')
         
     | 
| 
      
 42 
     | 
    
         
            +
                    }
         
     | 
| 
      
 43 
     | 
    
         
            +
                    if ($.trim(input.couponCodeField.val()).length > 0) {
         
     | 
| 
      
 44 
     | 
    
         
            +
                      // eslint-disable-next-line no-undef
         
     | 
| 
      
 45 
     | 
    
         
            +
                      if (new CouponManager(input).applyCoupon()) {
         
     | 
| 
      
 46 
     | 
    
         
            +
                        return true
         
     | 
| 
      
 47 
     | 
    
         
            +
                      } else {
         
     | 
| 
      
 48 
     | 
    
         
            +
                        Spree.enableSave()
         
     | 
| 
      
 49 
     | 
    
         
            +
                        event.preventDefault()
         
     | 
| 
      
 50 
     | 
    
         
            +
                        return false
         
     | 
| 
      
 51 
     | 
    
         
            +
                      }
         
     | 
| 
      
 52 
     | 
    
         
            +
                    }
         
     | 
| 
      
 53 
     | 
    
         
            +
                  })
         
     | 
| 
      
 54 
     | 
    
         
            +
                }
         
     | 
| 
      
 55 
     | 
    
         
            +
              }
         
     | 
| 
      
 56 
     | 
    
         
            +
              Spree.onPayment()
         
     | 
| 
      
 57 
     | 
    
         
            +
            })
         
     | 
| 
         @@ -0,0 +1,47 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            /* global accounting */
         
     | 
| 
      
 2 
     | 
    
         
            +
            function ShippingTotalManager (input1) {
         
     | 
| 
      
 3 
     | 
    
         
            +
              this.input = input1
         
     | 
| 
      
 4 
     | 
    
         
            +
              this.shippingMethods = this.input.shippingMethods
         
     | 
| 
      
 5 
     | 
    
         
            +
              this.shipmentTotal = this.input.shipmentTotal
         
     | 
| 
      
 6 
     | 
    
         
            +
              this.orderTotal = this.input.orderTotal
         
     | 
| 
      
 7 
     | 
    
         
            +
              this.formatOptions = {
         
     | 
| 
      
 8 
     | 
    
         
            +
                symbol: this.shipmentTotal.data('currency'),
         
     | 
| 
      
 9 
     | 
    
         
            +
                decimal: this.shipmentTotal.attr('decimal-mark'),
         
     | 
| 
      
 10 
     | 
    
         
            +
                thousand: this.shipmentTotal.attr('thousands-separator'),
         
     | 
| 
      
 11 
     | 
    
         
            +
                precision: 2
         
     | 
| 
      
 12 
     | 
    
         
            +
              }
         
     | 
| 
      
 13 
     | 
    
         
            +
            }
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            ShippingTotalManager.prototype.calculateShipmentTotal = function () {
         
     | 
| 
      
 16 
     | 
    
         
            +
              var checked = $(this.shippingMethods).filter(':checked')
         
     | 
| 
      
 17 
     | 
    
         
            +
              this.sum = 0
         
     | 
| 
      
 18 
     | 
    
         
            +
              $.each(checked, function (idx, shippingMethod) {
         
     | 
| 
      
 19 
     | 
    
         
            +
                this.sum += this.parseCurrencyToFloat($(shippingMethod).data('cost'))
         
     | 
| 
      
 20 
     | 
    
         
            +
              }.bind(this))
         
     | 
| 
      
 21 
     | 
    
         
            +
              return this.readjustSummarySection(this.parseCurrencyToFloat(this.orderTotal.html()), this.sum, this.parseCurrencyToFloat(this.shipmentTotal.html()))
         
     | 
| 
      
 22 
     | 
    
         
            +
            }
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            ShippingTotalManager.prototype.parseCurrencyToFloat = function (input) {
         
     | 
| 
      
 25 
     | 
    
         
            +
              return accounting.unformat(input, this.formatOptions.decimal)
         
     | 
| 
      
 26 
     | 
    
         
            +
            }
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            ShippingTotalManager.prototype.readjustSummarySection = function (orderTotal, newShipmentTotal, oldShipmentTotal) {
         
     | 
| 
      
 29 
     | 
    
         
            +
              var newOrderTotal = orderTotal + (newShipmentTotal - oldShipmentTotal)
         
     | 
| 
      
 30 
     | 
    
         
            +
              this.shipmentTotal.html(accounting.formatMoney(newShipmentTotal, this.formatOptions))
         
     | 
| 
      
 31 
     | 
    
         
            +
              return this.orderTotal.html(accounting.formatMoney(newOrderTotal, this.formatOptions))
         
     | 
| 
      
 32 
     | 
    
         
            +
            }
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
            ShippingTotalManager.prototype.bindEvent = function () {
         
     | 
| 
      
 35 
     | 
    
         
            +
              this.shippingMethods.change(function () {
         
     | 
| 
      
 36 
     | 
    
         
            +
                return this.calculateShipmentTotal()
         
     | 
| 
      
 37 
     | 
    
         
            +
              }.bind(this))
         
     | 
| 
      
 38 
     | 
    
         
            +
            }
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
            Spree.ready(function ($) {
         
     | 
| 
      
 41 
     | 
    
         
            +
              var input = {
         
     | 
| 
      
 42 
     | 
    
         
            +
                orderTotal: $('#summary-order-total'),
         
     | 
| 
      
 43 
     | 
    
         
            +
                shipmentTotal: $('[data-hook="shipping-total"]'),
         
     | 
| 
      
 44 
     | 
    
         
            +
                shippingMethods: $('input[data-behavior="shipping-method-selector"]')
         
     | 
| 
      
 45 
     | 
    
         
            +
              }
         
     | 
| 
      
 46 
     | 
    
         
            +
              return new ShippingTotalManager(input).bindEvent()
         
     | 
| 
      
 47 
     | 
    
         
            +
            })
         
     | 
| 
         @@ -0,0 +1,45 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            function CouponManager (input) {
         
     | 
| 
      
 2 
     | 
    
         
            +
              this.input = input
         
     | 
| 
      
 3 
     | 
    
         
            +
              this.couponCodeField = this.input.couponCodeField
         
     | 
| 
      
 4 
     | 
    
         
            +
              this.couponApplied = false
         
     | 
| 
      
 5 
     | 
    
         
            +
              this.couponStatus = this.input.couponStatus
         
     | 
| 
      
 6 
     | 
    
         
            +
            }
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            CouponManager.prototype.applyCoupon = function () {
         
     | 
| 
      
 9 
     | 
    
         
            +
              this.couponCode = $.trim($(this.couponCodeField).val())
         
     | 
| 
      
 10 
     | 
    
         
            +
              if (this.couponCode !== '') {
         
     | 
| 
      
 11 
     | 
    
         
            +
                if (this.couponStatus.length === 0) {
         
     | 
| 
      
 12 
     | 
    
         
            +
                  this.couponStatus = $('<div/>', {
         
     | 
| 
      
 13 
     | 
    
         
            +
                    id: 'coupon_status'
         
     | 
| 
      
 14 
     | 
    
         
            +
                  })
         
     | 
| 
      
 15 
     | 
    
         
            +
                  this.couponCodeField.parent().append(this.couponStatus)
         
     | 
| 
      
 16 
     | 
    
         
            +
                }
         
     | 
| 
      
 17 
     | 
    
         
            +
                this.couponStatus.removeClass()
         
     | 
| 
      
 18 
     | 
    
         
            +
                this.sendRequest()
         
     | 
| 
      
 19 
     | 
    
         
            +
                return this.couponApplied
         
     | 
| 
      
 20 
     | 
    
         
            +
              } else {
         
     | 
| 
      
 21 
     | 
    
         
            +
                return true
         
     | 
| 
      
 22 
     | 
    
         
            +
              }
         
     | 
| 
      
 23 
     | 
    
         
            +
            }
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            CouponManager.prototype.sendRequest = function () {
         
     | 
| 
      
 26 
     | 
    
         
            +
              return $.ajax({
         
     | 
| 
      
 27 
     | 
    
         
            +
                async: false,
         
     | 
| 
      
 28 
     | 
    
         
            +
                method: 'PATCH',
         
     | 
| 
      
 29 
     | 
    
         
            +
                url: Spree.routes.api_v2_storefront_cart_apply_coupon_code,
         
     | 
| 
      
 30 
     | 
    
         
            +
                dataType: 'json',
         
     | 
| 
      
 31 
     | 
    
         
            +
                headers: {
         
     | 
| 
      
 32 
     | 
    
         
            +
                  'X-Spree-Order-Token': Spree.current_order_token
         
     | 
| 
      
 33 
     | 
    
         
            +
                },
         
     | 
| 
      
 34 
     | 
    
         
            +
                data: {
         
     | 
| 
      
 35 
     | 
    
         
            +
                  coupon_code: this.couponCode
         
     | 
| 
      
 36 
     | 
    
         
            +
                }
         
     | 
| 
      
 37 
     | 
    
         
            +
              }).done(function () {
         
     | 
| 
      
 38 
     | 
    
         
            +
                this.couponCodeField.val('')
         
     | 
| 
      
 39 
     | 
    
         
            +
                this.couponStatus.addClass('alert-success').html(Spree.translations.coupon_code_applied)
         
     | 
| 
      
 40 
     | 
    
         
            +
                this.couponApplied = true
         
     | 
| 
      
 41 
     | 
    
         
            +
              }.bind(this)).fail(function (xhr) {
         
     | 
| 
      
 42 
     | 
    
         
            +
                var handler = xhr.responseJSON
         
     | 
| 
      
 43 
     | 
    
         
            +
                this.couponStatus.addClass('alert-error').html(handler['error'])
         
     | 
| 
      
 44 
     | 
    
         
            +
              }.bind(this))
         
     | 
| 
      
 45 
     | 
    
         
            +
            }
         
     | 
| 
         @@ -1,75 +1,128 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
      
 1 
     | 
    
         
            +
            //= require spree/api/storefront/cart
         
     | 
| 
      
 2 
     | 
    
         
            +
            //= require spree/frontend/cart
         
     | 
| 
       2 
3 
     | 
    
         | 
| 
      
 4 
     | 
    
         
            +
            Spree.ready(function ($) {
         
     | 
| 
       3 
5 
     | 
    
         
             
              Spree.addImageHandlers = function () {
         
     | 
| 
       4 
     | 
    
         
            -
                var thumbnails = $( 
     | 
| 
       5 
     | 
    
         
            -
                ($( 
     | 
| 
       6 
     | 
    
         
            -
                 
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
                  ($( 
     | 
| 
       11 
     | 
    
         
            -
                   
     | 
| 
       12 
     | 
    
         
            -
                  ($(event.currentTarget)). 
     | 
| 
       13 
     | 
    
         
            -
                   
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
                 
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
                 
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
      
 6 
     | 
    
         
            +
                var thumbnails = $('#product-images ul.thumbnails');
         
     | 
| 
      
 7 
     | 
    
         
            +
                ($('#main-image')).data('selectedThumb', ($('#main-image img')).attr('src'));
         
     | 
| 
      
 8 
     | 
    
         
            +
                ($('#main-image')).data('selectedThumbAlt', ($('#main-image img')).attr('alt'))
         
     | 
| 
      
 9 
     | 
    
         
            +
                thumbnails.find('li').eq(0).addClass('selected')
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                thumbnails.find('a').on('click', function (event) {
         
     | 
| 
      
 12 
     | 
    
         
            +
                  ($('#main-image')).data('selectedThumb', ($(event.currentTarget)).attr('href'));
         
     | 
| 
      
 13 
     | 
    
         
            +
                  ($('#main-image')).data('selectedThumbId', ($(event.currentTarget)).parent().attr('id'));
         
     | 
| 
      
 14 
     | 
    
         
            +
                  ($('#main-image')).data('selectedThumbAlt', ($(event.currentTarget)).find('img').attr('alt'))
         
     | 
| 
      
 15 
     | 
    
         
            +
                  thumbnails.find('li').removeClass('selected');
         
     | 
| 
      
 16 
     | 
    
         
            +
                  ($(event.currentTarget)).parent('li').addClass('selected')
         
     | 
| 
      
 17 
     | 
    
         
            +
                  return false
         
     | 
| 
      
 18 
     | 
    
         
            +
                })
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                thumbnails.find('li').on('mouseenter', function (event) {
         
     | 
| 
      
 21 
     | 
    
         
            +
                  return ($('#main-image img'))
         
     | 
| 
      
 22 
     | 
    
         
            +
                    .attr({ 'src': ($(event.currentTarget)).find('a').attr('href'), 'alt': ($(event.currentTarget)).find('img').attr('alt') })
         
     | 
| 
      
 23 
     | 
    
         
            +
                })
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                return thumbnails.find('li').on('mouseleave', function (event) {
         
     | 
| 
      
 26 
     | 
    
         
            +
                  return ($('#main-image img'))
         
     | 
| 
      
 27 
     | 
    
         
            +
                    .attr({ 'src': ($('#main-image')).data('selectedThumb'), 'alt': ($('#main-image')).data('selectedThumbAlt') })
         
     | 
| 
      
 28 
     | 
    
         
            +
                })
         
     | 
| 
      
 29 
     | 
    
         
            +
              }
         
     | 
| 
       24 
30 
     | 
    
         | 
| 
       25 
31 
     | 
    
         
             
              Spree.showVariantImages = function (variantId) {
         
     | 
| 
       26 
     | 
    
         
            -
                ($( 
     | 
| 
       27 
     | 
    
         
            -
                ($( 
     | 
| 
       28 
     | 
    
         
            -
                var currentThumb = $( 
     | 
| 
      
 32 
     | 
    
         
            +
                ($('li.vtmb')).hide();
         
     | 
| 
      
 33 
     | 
    
         
            +
                ($('li.tmb-' + variantId)).show()
         
     | 
| 
      
 34 
     | 
    
         
            +
                var currentThumb = $('#' + ($('#main-image')).data('selectedThumbId'))
         
     | 
| 
       29 
35 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
                if (!currentThumb.hasClass( 
     | 
| 
       31 
     | 
    
         
            -
                  var thumb = $(($( 
     | 
| 
      
 36 
     | 
    
         
            +
                if (!currentThumb.hasClass('vtmb + variantId')) {
         
     | 
| 
      
 37 
     | 
    
         
            +
                  var thumb = $(($('#product-images ul.thumbnails li:visible.vtmb')).eq(0))
         
     | 
| 
       32 
38 
     | 
    
         | 
| 
       33 
39 
     | 
    
         
             
                  if (!(thumb.length > 0)) {
         
     | 
| 
       34 
     | 
    
         
            -
                    thumb = $(($( 
     | 
| 
      
 40 
     | 
    
         
            +
                    thumb = $(($('#product-images ul.thumbnails li:visible')).eq(0))
         
     | 
| 
       35 
41 
     | 
    
         
             
                  }
         
     | 
| 
       36 
42 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
                  var newImg = thumb.find( 
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                  thumb. 
     | 
| 
       40 
     | 
    
         
            -
                  ($( 
     | 
| 
       41 
     | 
    
         
            -
                   
     | 
| 
       42 
     | 
    
         
            -
                   
     | 
| 
      
 43 
     | 
    
         
            +
                  var newImg = thumb.find('a').attr('href')
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                  var newAlt = thumb.find('img').attr('alt');
         
     | 
| 
      
 46 
     | 
    
         
            +
                  ($('#product-images ul.thumbnails li')).removeClass('selected')
         
     | 
| 
      
 47 
     | 
    
         
            +
                  thumb.addClass('selected');
         
     | 
| 
      
 48 
     | 
    
         
            +
                  ($('#main-image img')).attr({ 'src': newImg, 'alt': newAlt });
         
     | 
| 
      
 49 
     | 
    
         
            +
                  ($('#main-image')).data({ 'selectedThumb': newImg, 'selectedThumbAlt': newAlt })
         
     | 
| 
      
 50 
     | 
    
         
            +
                  return ($('#main-image')).data('selectedThumbId', thumb.attr('id'))
         
     | 
| 
       43 
51 
     | 
    
         
             
                }
         
     | 
| 
       44 
     | 
    
         
            -
              } 
     | 
| 
      
 52 
     | 
    
         
            +
              }
         
     | 
| 
       45 
53 
     | 
    
         | 
| 
       46 
54 
     | 
    
         
             
              Spree.updateVariantPrice = function (variant) {
         
     | 
| 
       47 
     | 
    
         
            -
                var variantPrice = variant.data( 
     | 
| 
      
 55 
     | 
    
         
            +
                var variantPrice = variant.data('price')
         
     | 
| 
       48 
56 
     | 
    
         | 
| 
       49 
57 
     | 
    
         
             
                if (variantPrice) {
         
     | 
| 
       50 
     | 
    
         
            -
                  return ($( 
     | 
| 
      
 58 
     | 
    
         
            +
                  return ($('.price.selling')).text(variantPrice)
         
     | 
| 
       51 
59 
     | 
    
         
             
                }
         
     | 
| 
       52 
     | 
    
         
            -
              } 
     | 
| 
      
 60 
     | 
    
         
            +
              }
         
     | 
| 
       53 
61 
     | 
    
         | 
| 
       54 
62 
     | 
    
         
             
              Spree.disableCartForm = function (variant) {
         
     | 
| 
       55 
     | 
    
         
            -
                var inStock = variant.data( 
     | 
| 
       56 
     | 
    
         
            -
                return $( 
     | 
| 
       57 
     | 
    
         
            -
              } 
     | 
| 
      
 63 
     | 
    
         
            +
                var inStock = variant.data('in-stock')
         
     | 
| 
      
 64 
     | 
    
         
            +
                return $('#add-to-cart-button').attr('disabled', !inStock)
         
     | 
| 
      
 65 
     | 
    
         
            +
              }
         
     | 
| 
       58 
66 
     | 
    
         | 
| 
       59 
     | 
    
         
            -
              var radios = $("#product-variants input[type='radio']") 
     | 
| 
      
 67 
     | 
    
         
            +
              var radios = $("#product-variants input[type='radio']")
         
     | 
| 
       60 
68 
     | 
    
         | 
| 
       61 
69 
     | 
    
         
             
              if (radios.length > 0) {
         
     | 
| 
       62 
     | 
    
         
            -
                var selectedRadio = $("#product-variants input[type='radio'][checked='checked']") 
     | 
| 
       63 
     | 
    
         
            -
                Spree.showVariantImages(selectedRadio.attr( 
     | 
| 
       64 
     | 
    
         
            -
                Spree.updateVariantPrice(selectedRadio) 
     | 
| 
       65 
     | 
    
         
            -
                Spree.disableCartForm(selectedRadio) 
     | 
| 
      
 70 
     | 
    
         
            +
                var selectedRadio = $("#product-variants input[type='radio'][checked='checked']")
         
     | 
| 
      
 71 
     | 
    
         
            +
                Spree.showVariantImages(selectedRadio.attr('value'))
         
     | 
| 
      
 72 
     | 
    
         
            +
                Spree.updateVariantPrice(selectedRadio)
         
     | 
| 
      
 73 
     | 
    
         
            +
                Spree.disableCartForm(selectedRadio)
         
     | 
| 
       66 
74 
     | 
    
         | 
| 
       67 
75 
     | 
    
         
             
                radios.click(function (event) {
         
     | 
| 
       68 
     | 
    
         
            -
                  Spree.showVariantImages(this.value) 
     | 
| 
       69 
     | 
    
         
            -
                  Spree.updateVariantPrice($(this)) 
     | 
| 
       70 
     | 
    
         
            -
                  return Spree.disableCartForm($(this)) 
     | 
| 
       71 
     | 
    
         
            -
                }) 
     | 
| 
      
 76 
     | 
    
         
            +
                  Spree.showVariantImages(this.value)
         
     | 
| 
      
 77 
     | 
    
         
            +
                  Spree.updateVariantPrice($(this))
         
     | 
| 
      
 78 
     | 
    
         
            +
                  return Spree.disableCartForm($(this))
         
     | 
| 
      
 79 
     | 
    
         
            +
                })
         
     | 
| 
       72 
80 
     | 
    
         
             
              }
         
     | 
| 
       73 
81 
     | 
    
         | 
| 
       74 
     | 
    
         
            -
              return Spree.addImageHandlers() 
     | 
| 
       75 
     | 
    
         
            -
            }) 
     | 
| 
      
 82 
     | 
    
         
            +
              return Spree.addImageHandlers()
         
     | 
| 
      
 83 
     | 
    
         
            +
            })
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
            Spree.ready(function () {
         
     | 
| 
      
 86 
     | 
    
         
            +
              var addToCartForm = document.getElementById('add-to-cart-form')
         
     | 
| 
      
 87 
     | 
    
         
            +
              var addToCartButton = document.getElementById('add-to-cart-button')
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
              if (addToCartForm) {
         
     | 
| 
      
 90 
     | 
    
         
            +
                // enable add to cart button
         
     | 
| 
      
 91 
     | 
    
         
            +
                if (addToCartButton) {
         
     | 
| 
      
 92 
     | 
    
         
            +
                  addToCartButton.removeAttribute('disabled')
         
     | 
| 
      
 93 
     | 
    
         
            +
                }
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
      
 95 
     | 
    
         
            +
                addToCartForm.addEventListener('submit', function (event) {
         
     | 
| 
      
 96 
     | 
    
         
            +
                  event.preventDefault()
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
                  // prevent multiple clicks
         
     | 
| 
      
 99 
     | 
    
         
            +
                  if (addToCartButton) {
         
     | 
| 
      
 100 
     | 
    
         
            +
                    addToCartButton.setAttribute('disabled', 'disabled')
         
     | 
| 
      
 101 
     | 
    
         
            +
                  }
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
                  var variantId = addToCartForm.elements.namedItem('variant_id').value
         
     | 
| 
      
 104 
     | 
    
         
            +
                  var quantity = parseInt(addToCartForm.elements.namedItem('quantity').value, 10)
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
      
 106 
     | 
    
         
            +
                  // we need to ensure that we have an existing cart we want to add the item to
         
     | 
| 
      
 107 
     | 
    
         
            +
                  // if we have already a cart assigned to this guest / user this won't create
         
     | 
| 
      
 108 
     | 
    
         
            +
                  // another one
         
     | 
| 
      
 109 
     | 
    
         
            +
                  Spree.ensureCart(
         
     | 
| 
      
 110 
     | 
    
         
            +
                    function () {
         
     | 
| 
      
 111 
     | 
    
         
            +
                      SpreeAPI.Storefront.addToCart(
         
     | 
| 
      
 112 
     | 
    
         
            +
                        variantId,
         
     | 
| 
      
 113 
     | 
    
         
            +
                        quantity,
         
     | 
| 
      
 114 
     | 
    
         
            +
                        {}, // options hash - you can pass additional parameters here, your backend
         
     | 
| 
      
 115 
     | 
    
         
            +
                        // needs to be aware of those, see API docs:
         
     | 
| 
      
 116 
     | 
    
         
            +
                        // https://github.com/spree/spree/blob/master/api/docs/v2/storefront/index.yaml#L42
         
     | 
| 
      
 117 
     | 
    
         
            +
                        function () {
         
     | 
| 
      
 118 
     | 
    
         
            +
                          // redirect with `variant_id` is crucial for analytics tracking
         
     | 
| 
      
 119 
     | 
    
         
            +
                          // provided by `spree_analytics_trackers` extension
         
     | 
| 
      
 120 
     | 
    
         
            +
                          window.location = Spree.routes.cart + '?variant_id=' + variantId.toString()
         
     | 
| 
      
 121 
     | 
    
         
            +
                        },
         
     | 
| 
      
 122 
     | 
    
         
            +
                        function (error) { alert(error) } // failure callback for 422 and 50x errors
         
     | 
| 
      
 123 
     | 
    
         
            +
                      )
         
     | 
| 
      
 124 
     | 
    
         
            +
                    }
         
     | 
| 
      
 125 
     | 
    
         
            +
                  )
         
     | 
| 
      
 126 
     | 
    
         
            +
                })
         
     | 
| 
      
 127 
     | 
    
         
            +
              }
         
     | 
| 
      
 128 
     | 
    
         
            +
            })
         
     |