/** * @file * Extends methods from core/misc/ajax.js. */ (function ($, window, Drupal, drupalSettings) { /** * Attempts to find the closest glyphicon progress indicator. * * @param {jQuery|Element} element * A DOM element. * * @returns {jQuery} * A jQuery object. */ Drupal.Ajax.prototype.findGlyphicon = function (element) { return $(element).closest('.form-item').find('.ajax-progress.glyphicon') }; /** * Starts the spinning of the glyphicon progress indicator. * * @param {jQuery|Element} element * A DOM element. * @param {string} [message] * An optional message to display (tooltip) for the progress. * * @returns {jQuery} * A jQuery object. */ Drupal.Ajax.prototype.glyphiconStart = function (element, message) { var $glyphicon = this.findGlyphicon(element); if ($glyphicon[0]) { $glyphicon.addClass('glyphicon-spin'); // Add any message as a tooltip to the glyphicon. if ($.fn.tooltip && drupalSettings.bootstrap.tooltip_enabled) { $glyphicon .removeAttr('data-toggle') .removeAttr('data-original-title') .removeAttr('title') .tooltip('destroy') ; if (message) { $glyphicon.attr('data-toggle', 'tooltip').attr('title', message).tooltip(); } } // Append a message for screen readers. if (message) { $glyphicon.parent().append('
' + message + '
'); } } return $glyphicon; }; /** * Stop the spinning of a glyphicon progress indicator. * * @param {jQuery|Element} element * A DOM element. */ Drupal.Ajax.prototype.glyphiconStop = function (element) { var $glyphicon = this.findGlyphicon(element); if ($glyphicon[0]) { $glyphicon.removeClass('glyphicon-spin'); if ($.fn.tooltip && drupalSettings.bootstrap.tooltip_enabled) { $glyphicon .removeAttr('data-toggle') .removeAttr('data-original-title') .removeAttr('title') .tooltip('destroy') ; } } }; /** * Sets the throbber progress indicator. */ Drupal.Ajax.prototype.setProgressIndicatorThrobber = function () { var $element = $(this.element); // Find an existing glyphicon progress indicator. var $glyphicon = this.glyphiconStart($element, this.progress.message); if ($glyphicon[0]) { this.progress.element = $glyphicon.parent(); this.progress.glyphicon = true; return; } // Otherwise, add a glyphicon throbber after the element. if (!this.progress.element) { this.progress.element = $(Drupal.theme('ajaxThrobber')); } if (this.progress.message) { this.progress.element.after('
' + this.progress.message + '
'); } // If element is an input DOM element type (not :input), append after. if ($element.is('input')) { $element.after(this.progress.element); } // Otherwise append the throbber inside the element. else { $element.append(this.progress.element); } }; /** * Handler for the form redirection completion. * * @param {Array.} response * @param {number} status */ var success = Drupal.Ajax.prototype.success; Drupal.Ajax.prototype.success = function (response, status) { if (this.progress.element) { // Stop a glyphicon throbber. if (this.progress.glyphicon) { this.glyphiconStop(this.progress.element); } // Remove the progress element. else { this.progress.element.remove(); } // Remove any message set. this.progress.element.parent().find('.message').remove(); } // Invoke the original success handler. return success.apply(this, [response, status]); }; })(jQuery, this, Drupal, drupalSettings);