132 lines
3.6 KiB
JavaScript
132 lines
3.6 KiB
JavaScript
/**
|
|
* @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('<div class="sr-only message">' + message + '</div>');
|
|
}
|
|
}
|
|
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('<div class="message">' + this.progress.message + '</div>');
|
|
}
|
|
|
|
// If element is an input DOM element type (not :input), append after.
|
|
if ($element.is('input') || $element.is('select')) {
|
|
$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.<Drupal.AjaxCommands~commandDefinition>} response
|
|
* @param {number} status
|
|
*/
|
|
var success = Drupal.Ajax.prototype.success;
|
|
Drupal.Ajax.prototype.success = function (response, status) {
|
|
if (this.progress.element) {
|
|
|
|
// 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);
|