69 lines
2.6 KiB
JavaScript
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);
|