commerce_shipping-8.x-2.0-rc2/js/shipping_checkout.js
js/shipping_checkout.js
/** * @file * Handles the shipping rates recalculation in checkout. */ ((Drupal, drupalSettings, once) => { Drupal.shippingRecalculate = { recalculateButtonSelector: '', submitButtonSelector: '[id^=edit-actions-next]', wrapper: '', onChange(element) { const waitForAjaxComplete = (elm) => { setTimeout( () => { // Ensure no ajax request is in progress for the element // being updated before triggering the recalculation. if (elm.disabled) { waitForAjaxComplete(elm); return; } if (Drupal.shippingRecalculate.canRecalculateRates()) { Drupal.shippingRecalculate.recalculateRates(); } }, 100, elm, ); }; waitForAjaxComplete(element); }, init(context) { // When a required field value is updated, attempt to trigger the // shipping rates recalculation if possible. const requiredInputs = document .getElementById(this.wrapper) .querySelectorAll( 'input[required], select[required], input[type=checkbox]', ); if (requiredInputs.length) { once('shipping-recalculate', requiredInputs, context).forEach( (element) => { if (!element.getAttribute('name').includes('[shipping_method]')) { element.addEventListener('change', (el) => { this.onChange(el.target); }); } }, ); } }, // Determines whether the shipping rates can be recalculated. canRecalculateRates() { let canRecalculate = true; const requiredInputs = document .getElementById(this.wrapper) .querySelectorAll('input[required], select[required]'); Array.prototype.forEach.call(requiredInputs, (el) => { if (!el.value) { canRecalculate = false; return false; } }); return canRecalculate; }, recalculateRates() { const buttons = document.querySelectorAll(this.submitButtonSelector); // Disable the 'Continue to Review' button while recalculating. if (buttons.length) { buttons[0].disabled = true; } document .getElementById(this.wrapper) .querySelector(this.recalculateButtonSelector) .dispatchEvent(new Event('mousedown')); }, }; /** * Handles the shipping rates recalculation in checkout. * * @type {Drupal~behavior} * * @prop {Drupal~behaviorAttach} attach */ Drupal.behaviors.shippingRatesRecalculate = { attach(context) { Drupal.shippingRecalculate.wrapper = drupalSettings.commerceShipping.wrapper; Drupal.shippingRecalculate.recalculateButtonSelector = drupalSettings.commerceShipping.recalculateButtonSelector; Drupal.shippingRecalculate.init(context); }, }; })(Drupal, drupalSettings, once);