spree_frontend 3.6.6 → 3.7.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
})
|