arch-8.x-1.x-dev/modules/checkout/modules/onepage/assets/js/onepage-checkout.js
modules/checkout/modules/onepage/assets/js/onepage-checkout.js
/**
* @file
* Checkout Onepage JS Behavior.
*/
(function (Drupal, drupalSettings, $) {
'use strict';
var $form = $('form.arch-onepage-checkout');
var $fieldsets = $form.find('> .panel, > fieldset');
var $fieldsetTitles = $fieldsets.find('.panel-title, .fieldset-legend');
var panelPadding = $fieldsets.find('.panel-body, .fieldset-wrapper').css('padding');
var $billingInputs = $fieldsets.filter('.billing-info').find(':input');
// var $shippingInputs = $fieldsets.filter('.shipping-info').find(':input');
var $sameas = null;
var phases = 3;
var phase = 1;
var dataFields = [
'firstname',
'lastname',
'company',
'address',
'address2',
'city',
'country',
'postcode'
];
var focusable = [
'a[href]',
'area[href]',
'button',
'details',
'input',
'iframe',
'select',
'textarea',
'[contentEditable=""]',
'[contentEditable="true"]',
'[contentEditable="TRUE"]',
'[tabindex]:not([tabindex^="-"])',
':not([disabled])'
];
function jumpToPhase(phase_number) {
phase_number--;
$fieldsets.find('.panel-body, .fieldset-wrapper').css({
height: 0,
padding: 0,
overflow: 'hidden'
});
$fieldsetTitles
.find('a')
.hide()
.each(function (index) {
if (index >= phase) {
return;
}
$(this).css('display', 'inline-block');
});
$fieldsets.eq(phase_number).find('.panel-title a, .fieldset-legend a').hide();
$fieldsets.eq(phase_number).find('.panel-body, .fieldset-wrapper').css({
height: 'auto',
padding: panelPadding,
overflow: 'visible'
});
$fieldsets
.addClass('section-hidden')
.each(function (idx) {
if (idx <= phase_number) {
$(this).removeClass('section-hidden');
}
})
;
if (phase !== phases) {
$form.find('.form-actions .form-submit').attr('disabled', 'disabled');
}
else {
$form.find('.form-actions .form-submit').removeAttr('disabled');
}
}
function updatePreview() {
var $previewShippingAddress2 = $('#preview-shipping-address2');
var $previewShippingCity = $('#preview-shipping-city');
var $previewShippingSameas = $('#preview-shipping-sameas');
// Billing Info preview data.
$('#preview-billing-email').text($('[data-field="email"]').val());
$.each(dataFields, function (key, item) {
$('#preview-billing-' + item).text($('[data-field="' + item + '"]').val());
});
$previewShippingAddress2.toggle(!($('[data-field="address2"]').val() === ''));
if ($previewShippingAddress2.text() !== '') {
$previewShippingAddress2.text(', ' + $previewShippingAddress2.text());
}
if ($previewShippingCity.text() !== '') {
$previewShippingCity.text(', ' + $previewShippingCity.text());
}
// Shipping Info preview data.
$previewShippingSameas.addClass('hidden');
$.each(dataFields, function (key, item) {
$('#preview-shipping-' + item).hide();
});
$('#preview-shipping-method').text($('input[data-field="shipping-method"]:checked').closest('.form-item').find('label').text());
var $shipping_address_selector = $('input[name="shipping_address_selector"]');
switch ($shipping_address_selector.filter(':checked').val()) {
case 'new_shipping':
$.each(dataFields, function (key, item) {
$('#preview-shipping-' + item).text($('[data-field="shipping-' + item + '"]').val());
});
$previewShippingAddress2.toggle(!($('[data-field="shipping-address2"]').val() === ''));
if ($previewShippingAddress2.text() !== '') {
$previewShippingAddress2.text(', ' + $previewShippingAddress2.text());
}
if ($previewShippingCity.text() !== '') {
$previewShippingCity.text(', ' + $previewShippingCity.text());
}
if ($('[data-field="shipping-sameas"]').is(':checked')) {
$previewShippingSameas.removeClass('hidden');
$.each(dataFields, function (key, item) {
$('#preview-shipping-' + item).hide();
});
}
else {
$previewShippingSameas.addClass('hidden');
$.each(dataFields, function (key, item) {
$('#preview-shipping-' + item).show();
});
}
break;
case 'sameas':
$previewShippingSameas.removeClass('hidden');
$.each(dataFields, function (key, item) {
$('#preview-shipping-' + item).hide();
});
break;
case 'choose_address':
var $select = $('select[name="choose_address"]');
$('#preview-shipping-company').text($select.find('option:selected').text()).show();
break;
}
}
function appendEditSectionButtons() {
// Append Edit button to each fieldset.
$('<a class="edit-section">' + Drupal.t('Edit') + '</a>')
.appendTo($fieldsetTitles.filter(':not(:has(.edit-section))'))
.on('click', function (e) {
$fieldsetTitles.find('a').each(function (index, el) {
if (el === e.target) {
$(e.target).closest('.panel-default, .checkout-fieldset').nextAll('.section-preview').addClass('hidden');
phase = index + 1;
jumpToPhase(phase);
}
});
})
;
}
function legacyInputValidation(field) {
var valid = true;
var val = field.value;
var type = field.getAttribute('type');
var chkbox = (type === 'checkbox' || type === 'radio');
var required = field.getAttribute('required');
var minlength = field.getAttribute('minlength');
var maxlength = field.getAttribute('maxlength');
var pattern = field.getAttribute('pattern');
// disabled fields should not be validated
if (field.disabled) {
return valid;
}
// value required?
valid = valid
&& (
!required
|| (chkbox && field.checked)
|| (!chkbox && val !== '')
);
// minlength or maxlength set?
valid = valid && (chkbox || (
(!minlength || val.length >= minlength) &&
(!maxlength || val.length <= maxlength)
));
// test pattern
if (valid && pattern) {
pattern = new RegExp(pattern);
valid = pattern.test(val);
}
return valid;
}
function validateSection(section) {
var $section = $(section);
if (!$section) {
return false;
}
var valid = true;
var $field = null;
$section.find(':input:visible').each(function () {
if (!valid) {
return;
}
if (typeof $(this)[0].willValidate !== 'undefined') {
valid = $(this)[0].checkValidity();
}
else {
valid = legacyInputValidation($(this)[0]);
}
if (!valid) {
$field = $(this);
}
});
if ($field) {
setTimeout(function () {
$('html, body')
.stop()
.animate({
scrollTop: ($field.offset().top - 130)
}, 500, 'swing', function () {
// Check that field is focusable and browser supports HTML5 validation.
if (
$field.is(focusable.join(', '))
&& !$field.is('input[type="checkbox"]')
&& !$field.is('input[type="radio"]')
) {
$field.focus();
if (typeof $field[0].reportValidity !== 'undefined') {
$field[0].reportValidity();
}
}
$field.closest('.form-item').addClass('has-error');
$field.addClass('error');
setTimeout(function () {
$field.closest('.form-item').removeClass('has-error');
$field.removeClass('error');
}, 5000);
});
}, 1);
}
return valid;
}
Drupal.behaviors.arch_checkout_onepage = {
attach: function () {
var $body = $('body');
if ($body.hasClass('js-onepage-checkout-processed')) {
return;
}
$body
.addClass('js-onepage-checkout-processed')
.on('checkout.onepage.phaseRecheck', function () {
$form = $('form.arch-onepage-checkout');
$fieldsets = $form.find('> .panel, > fieldset');
$fieldsetTitles = $fieldsets.find('.panel-title, .fieldset-legend');
panelPadding = $fieldsets.find('.panel-body, .fieldset-wrapper').css('padding');
$billingInputs = $fieldsets.filter('.billing-info').find(':input');
// $shippingInputs = $fieldsets.filter('.shipping-info').find(':input');
appendEditSectionButtons();
jumpToPhase(3);
updatePreview();
$('.section-preview').removeClass('hidden');
})
;
appendEditSectionButtons();
// Jump to next phase from Billing to Shipping.
$('#btn-next-to-shipping')
.on('click', function (e) {
// It must prevent to trigger validation functionality on just hidden form section.
e.preventDefault();
var sectionClass = '.checkout-billing-info';
if (!validateSection(sectionClass)) {
return false;
}
updatePreview();
$('#preview-billing-infos').removeClass('hidden');
$(sectionClass).removeClass('section-hidden');
phase = 2;
jumpToPhase(phase);
$billingInputs.trigger('blur');
$('html, body')
.stop()
.animate({
scrollTop: ($('.checkout-shipping-info').offset().top - 50)
}, 250, 'swing');
})
;
// Jump to next phase from Shipping to Payment.
$('#btn-next-to-payment')
.on('click', function (e) {
// It must prevent to trigger validation functionality on just hidden form section.
e.preventDefault();
var sectionClass = '.checkout-shipping-info';
if (!validateSection(sectionClass)) {
return false;
}
updatePreview();
$('#preview-shipping-infos').removeClass('hidden');
$(sectionClass).removeClass('section-hidden');
phase = 3;
jumpToPhase(phase);
$('html, body')
.stop()
.animate({
scrollTop: ($('.checkout-payment-method').offset().top - 50)
}, 250, 'swing');
})
;
// Handling shipping address if it is the same as billing.
$billingInputs
.on('keyup paste blur', function () {
if ($sameas === null) {
$('.form-item-shipping-address-selector')
.first()
.find('label')
.append('<div class="shipping-sameas-clone"></div>');
$sameas = $('.shipping-sameas-clone');
}
$sameas.html($('.preview-billing-data').html());
})
;
$form.find('.form-actions .form-submit')
.on('click', function (e) {
if (!validateSection('.checkout-payment-method')) {
e.preventDefault();
return false;
}
if (!validateSection('.form-item-accept')) {
e.preventDefault();
return false;
}
});
// Init.
jumpToPhase(1);
$('input[name="shipping_address_selector"]')
.on('change', function (e) {
$('.form-item-shipping-address-selector > label').removeClass('selected');
$(e.target).closest('.form-item').find('label').addClass('selected');
})
.filter('[checked]')
.trigger('change')
;
$('input[name="shipping_methods"]')
.on('change', function (e) {
if ($(e.target).val() !== 'standard') {
var $items = $('input[name="shipping_address_selector"]');
$items.closest('.form-item').find('label').removeClass('selected');
$items.filter('[value="sameas"]')
.prop('checked', true)
.closest('label')
.addClass('selected')
;
$('.shipping-new-address :input').removeAttr('required').removeAttr('aria-required');
}
})
;
}
};
})(Drupal, drupalSettings, jQuery);
