From d4343e265f6b08c224098b24d56eb027b05421be Mon Sep 17 00:00:00 2001 From: Nigel Banks Date: Wed, 17 Dec 2014 15:32:54 -0500 Subject: [PATCH] This changes the spinner element such that the another widget can prevent the submission of the form if need be. --- js/spinner.js | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/js/spinner.js b/js/spinner.js index 0b4a3c74..0c83f393 100755 --- a/js/spinner.js +++ b/js/spinner.js @@ -1,9 +1,11 @@ +/*jshint browser: true, devel:true*/ +/*global jQuery, Drupal, Spinner*/ /** * @file * Triggers the display of a spinning icon when the form is submitted. */ (function ($) { - + 'use strict'; Drupal.behaviors.spinner = { attach: function(context, settings) { // Store what triggered the submit. @@ -15,35 +17,41 @@ // On enter the first submit button is assumed as is most often the // case and this is part of the HTML 5 specification, although some // Browsers may choose the button with the lowest tab-index. - if (event.which == 13) { + if (event.which === 13) { $(this).data('clicked', $(':submit', this).first()); } }); }); - for (var base in settings.spinner) { - var id = '#' + base; - // Don't add spinner to the hidden next/ingest button. - if (id != '#edit-hidden-next') { + $.each(settings.spinner, function (base, value) { + var id = '#' + base, + message = $('
').text(settings.spinner[base].message); + if (id !== '#edit-hidden-next') { $(id, context).once('spinner', function () { var spinner = new Spinner(settings.spinner[base].opts); - $(id).parents('form').one('submit', function (event) { - if ($(this).data('clicked').is(id)) { + $(id).parents('form').submit(function (event) { + // If some other widget is preventing form submission we should + // not attempt to submit at this time. + if (event.isDefaultPrevented()) { + return; + } + if ($(this).data('clicked').is(id) && $(this).data('submitted') === undefined) { event.preventDefault(); + // Prevent this from being entered a second time. + $(this).data('submitted', true); // Add Message. - var message = $('
').text(settings.spinner[base].message); $(id).after(message); // Make UI changes. spinner.spin(this); $('#edit-next').hide(); $('#edit-prev').hide(); // Submit the form after a set timeout, this handles problems with - // safari, in that safari submit's immediately.. - if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1) { + // safari, in that safari submits immediately.. + if (navigator.userAgent.indexOf('Safari') !== -1 && navigator.userAgent.indexOf('Chrome') === -1) { $(':submit').attr('disabled', 'disabled'); } setTimeout(function () { // Allow for the button to be clicked, then click it then - // prevent the default behavoir. + // prevent the default behaviour. $(id).removeAttr('disabled') .click() .click(function (event) { @@ -55,7 +63,7 @@ }); }); } - } + }); } }; })(jQuery);