--- /dev/null
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * A helper to manage pendingJS checks.
+ *
+ * @module core/pending
+ * @package core
+ * @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @since 3.6
+ */
+define(['jquery'], function($) {
+
+ /**
+ * Request a new pendingPromise to be resolved.
+ *
+ * When the action you are performing is complete, simply call resolve on the returned Promise.
+ *
+ * @param {Object} pendingKey An optional key value to use
+ * @return {Promise}
+ */
+ var request = function(pendingKey) {
+ var pendingPromise = $.Deferred();
+
+ pendingKey = pendingKey || {};
+ M.util.js_pending(pendingKey);
+
+ pendingPromise.then(function() {
+ return M.util.js_complete(pendingKey);
+ })
+ .catch();
+
+ return pendingPromise;
+ };
+
+ request.prototype.constructor = request;
+
+ return request;
+});
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 2.9
*/
-define(['core/mustache',
- 'jquery',
- 'core/ajax',
- 'core/str',
- 'core/notification',
- 'core/url',
- 'core/config',
- 'core/localstorage',
- 'core/icon_system',
- 'core/event',
- 'core/yui',
- 'core/log',
- 'core/truncate',
- 'core/user_date'
- ],
- function(mustache, $, ajax, str, notification, coreurl, config, storage, IconSystem, event, Y, Log, Truncate, UserDate) {
+define([
+ 'core/mustache',
+ 'jquery',
+ 'core/ajax',
+ 'core/str',
+ 'core/notification',
+ 'core/url',
+ 'core/config',
+ 'core/localstorage',
+ 'core/icon_system',
+ 'core/event',
+ 'core/yui',
+ 'core/log',
+ 'core/truncate',
+ 'core/user_date',
+ 'core/pending',
+ ],
+ function(mustache, $, ajax, str, notification, coreurl, config, storage, IconSystem, event, Y, Log, Truncate, UserDate,
+ Pending) {
// Module variables.
/** @var {Number} uniqInstances Count of times this constructor has been called. */
this.currentThemeName = themeName;
var iconTemplate = iconSystem.getTemplateName();
- M.util.js_pending('core/templates:doRender');
+ var pendingPromise = new Pending('core/templates:doRender');
return this.getTemplate(iconTemplate).then(function() {
this.addHelpers(context, themeName);
var result = mustache.render(templateSource, context, this.partialHelper.bind(this));
return $.Deferred().resolve(html, js).promise();
}.bind(this))
.then(function(html, js) {
- M.util.js_complete('core/templates:doRender');
+ pendingPromise.resolve();
return $.Deferred().resolve(html, js).promise();
});
};
* @copyright 2018 Damyon Wiese <damyon@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-define(['jquery'], function($) {
+define(['jquery', 'core/pending'], function($, Pending) {
return {
init: function() {
// Drop downs from bootstrap don't support keyboard accessibility by default.
// Special handling for navigation keys when menu is open.
var shiftFocus = function(element) {
- M.util.pending_js('core/aria:delayed-focus');
- var delayedFocus = function() {
+ var delayedFocus = function(pendingPromise) {
$(this).focus();
- M.util.complete_js('core/aria:delayed-focus');
+ pendingPromise.resolve();
}.bind(element);
- setTimeout(delayedFocus, 50);
+ setTimeout(delayedFocus, 50, new Pending('core/aria:delayed-focus'));
};
$('.dropdown').on('shown.bs.dropdown', function(e) {
// After page load, focus on any element with special autofocus attribute.
$(function() {
- M.util.pending_js('core/aria:delayed-focus');
- window.setTimeout(function() {
+ window.setTimeout(function(pendingPromise) {
var alerts = $('[role="alert"][data-aria-autofocus="true"]');
if (alerts.length > 0) {
$(alerts[0]).attr('tabindex', '0');
$(alerts[0]).focus();
}
- M.util.complete_js('core/aria:delayed-focus');
- }, 300);
+ pendingPromise.resolve();
+ }, 300, new Pending('core/aria:delayed-focus'));
});
}
};