website/modules/contrib/webform/js/webform.form.submit_oncedfb4.js
2023-09-30 09:40:37 +02:00

69 lines
2.6 KiB
JavaScript

/**
* @file
* JavaScript behaviors for preventing duplicate webform submissions.
*/
(function ($, Drupal) {
'use strict';
/**
* Submit once.
*
* @type {Drupal~behavior}
*
* @prop {Drupal~behaviorAttach} attach
* Attaches the behavior for preventing duplicate webform submissions.
*/
Drupal.behaviors.webformSubmitOnce = {
clear: function () {
var $form = $('.js-webform-submit-once');
$form.removeData('webform-submitted');
$form.find('.js-webform-wizard-pages-links :submit, .form-actions :submit').removeClass('is-disabled');
$form.find('.form-actions .ajax-progress.ajax-progress-throbber').remove();
},
attach: function (context) {
$('.js-webform-submit-once', context).once('webform-submit-once').each(function () {
var $form = $(this);
// Remove data-webform-submitted.
$form.removeData('webform-submitted');
// Remove .js-webform-submit-clicked.
$form.find('.js-webform-wizard-pages-links :submit, .form-actions :submit').removeClass('js-webform-submit-clicked');
// Track which submit button was clicked.
// @see http://stackoverflow.com/questions/5721724/jquery-how-to-get-which-button-was-clicked-upon-form-submission
$form.find('.js-webform-wizard-pages-links :submit, .form-actions :submit').on('click', function () {
$form.find('.js-webform-wizard-pages-links :submit, .form-actions :submit')
.removeClass('js-webform-submit-clicked');
$(this)
.addClass('js-webform-submit-clicked');
});
$(this).on('submit', function () {
// Find clicked button
var $clickedButton = $form.find('.js-webform-wizard-pages-links :submit.js-webform-submit-clicked, .form-actions :submit.js-webform-submit-clicked');
// Don't submit if client-side validation has failed.
if (!$clickedButton.attr('formnovalidate') && $.isFunction(jQuery.fn.valid) && !($form.valid())) {
return false;
}
// Track webform submitted.
if ($form.data('webform-submitted')) {
return false;
}
$form.data('webform-submitted', 'true');
// Visually disable all submit buttons.
// Submit buttons can't disabled because their op(eration) must to be posted back to the server.
$form.find('.js-webform-wizard-pages-links :submit, .form-actions :submit').addClass('is-disabled');
// Set the throbber progress indicator.
$clickedButton.after(Drupal.theme.ajaxProgressThrobber());
});
});
}
};
})(jQuery, Drupal);