mirror of
https://github.com/moodle/moodle.git
synced 2025-04-15 05:25:08 +02:00
Merge branch 'MDL-63714-master' of git://github.com/andrewnicols/moodle
This commit is contained in:
commit
19dbce00a1
1
lib/amd/build/pending.min.js
vendored
Normal file
1
lib/amd/build/pending.min.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
define(["jquery"],function(a){var b=function(b){var c=a.Deferred();return b=b||{},M.util.js_pending(b),c.then(function(){return M.util.js_complete(b)})["catch"](),c};return b.prototype.constructor=b,b});
|
2
lib/amd/build/templates.min.js
vendored
2
lib/amd/build/templates.min.js
vendored
File diff suppressed because one or more lines are too long
52
lib/amd/src/pending.js
Normal file
52
lib/amd/src/pending.js
Normal file
@ -0,0 +1,52 @@
|
||||
// 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;
|
||||
});
|
@ -23,22 +23,25 @@
|
||||
* @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. */
|
||||
@ -509,6 +512,7 @@ define(['core/mustache',
|
||||
this.currentThemeName = themeName;
|
||||
var iconTemplate = iconSystem.getTemplateName();
|
||||
|
||||
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));
|
||||
@ -553,7 +557,11 @@ define(['core/mustache',
|
||||
}
|
||||
|
||||
return $.Deferred().resolve(html, js).promise();
|
||||
}.bind(this));
|
||||
}.bind(this))
|
||||
.then(function(html, js) {
|
||||
pendingPromise.resolve();
|
||||
return $.Deferred().resolve(html, js).promise();
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -653,16 +653,22 @@ M.util.complete_js = [];
|
||||
|
||||
/**
|
||||
* Register any long running javascript code with a unique identifier.
|
||||
* Should be followed with a call to js_complete with a matching
|
||||
* idenfitier when the code is complete. May also be called with no arguments
|
||||
* to test if there is any js calls pending. This is relied on by behat so that
|
||||
* it can wait for all pending updates before interacting with a page.
|
||||
* @param String uniqid - optional, if provided,
|
||||
* registers this identifier until js_complete is called.
|
||||
* @return boolean - True if there is any pending js.
|
||||
* This is used to ensure that Behat steps do not continue with interactions until the page finishes loading.
|
||||
*
|
||||
* All calls to M.util.js_pending _must_ be followed by a subsequent call to M.util.js_complete with the same exact
|
||||
* uniqid.
|
||||
*
|
||||
* This function may also be called with no arguments to test if there is any js calls pending.
|
||||
*
|
||||
* The uniqid specified may be any Object, including Number, String, or actual Object; however please note that the
|
||||
* paired js_complete function performs a strict search for the key specified. As such, if using an Object, the exact
|
||||
* Object must be passed into both functions.
|
||||
*
|
||||
* @param {Mixed} uniqid Register long-running code against the supplied identifier
|
||||
* @return {Number} Number of pending items
|
||||
*/
|
||||
M.util.js_pending = function(uniqid) {
|
||||
if (uniqid !== false) {
|
||||
if (typeof uniqid !== 'undefined') {
|
||||
M.util.pending_js.push(uniqid);
|
||||
}
|
||||
|
||||
@ -690,11 +696,12 @@ YUI.add('moodle-core-io', function(Y) {
|
||||
});
|
||||
|
||||
/**
|
||||
* Unregister any long running javascript code by unique identifier.
|
||||
* This function should form a matching pair with js_pending
|
||||
* Unregister some long running javascript code using the unique identifier specified in M.util.js_pending.
|
||||
*
|
||||
* @param String uniqid - required, unregisters this identifier
|
||||
* @return boolean - True if there is any pending js.
|
||||
* This function must be matched with an identical call to M.util.js_pending.
|
||||
*
|
||||
* @param {Mixed} uniqid Register long-running code against the supplied identifier
|
||||
* @return {Number} Number of pending items remaining after removing this item
|
||||
*/
|
||||
M.util.js_complete = function(uniqid) {
|
||||
// Use the Y.Array.indexOf instead of the native because some older browsers do not support
|
||||
@ -702,6 +709,8 @@ M.util.js_complete = function(uniqid) {
|
||||
var index = Y.Array.indexOf(M.util.pending_js, uniqid);
|
||||
if (index >= 0) {
|
||||
M.util.complete_js.push(M.util.pending_js.splice(index, 1));
|
||||
} else {
|
||||
window.console.log("Unable to locate key for js_complete call", uniqid);
|
||||
}
|
||||
|
||||
return M.util.pending_js.length;
|
||||
|
2
theme/boost/amd/build/aria.min.js
vendored
2
theme/boost/amd/build/aria.min.js
vendored
@ -1 +1 @@
|
||||
define(["jquery"],function(a){return{init:function(){var b=!1,c=function(){b=!0},d=function(){var a=b;return b=!1,a};a('[data-toggle="dropdown"]').keydown(function(b){var d,e=b.which||b.keyCode;38==e&&c(),27==e&&(d=a(b.target).attr("aria-expanded"),b.preventDefault(),"false"==d&&a(b.target).click()),32!=e&&13!=e||(b.preventDefault(),a(b.target).click())});var e=function(b){var c=function(){a(this).focus()}.bind(b);setTimeout(c,50)};a(".dropdown").on("shown.bs.dropdown",function(b){var c=a(b.target).find('[role="menu"]'),f=!1,g=!1;c&&(f=a(c).find('[role="menuitem"]')),f&&f.length>0&&(g=d()?f[f.length-1]:f[0]),g&&e(g)}),a('.dropdown [role="menu"] [role="menuitem"]').keypress(function(b){var c,d,f=String.fromCharCode(b.which||b.keyCode),g=a(b.target).closest('[role="menu"]'),h=0,i=!1;if(g&&(i=a(g).find('[role="menuitem"]')))for(f=f.toLowerCase(),h=0;h<i.length;h++)if(c=a(i[h]),d=c.text().trim().toLowerCase(),0==d.indexOf(f)){e(c);break}}),a('.dropdown [role="menu"] [role="menuitem"]').keydown(function(b){var c=b.which||b.keyCode,d=!1,f=a(b.target).closest('[role="menu"]'),g=0,h=!1;if(f&&(h=a(f).find('[role="menuitem"]'))){if(40==c){for(g=0;g<h.length-1;g++)if(h[g]==b.target){d=h[g+1];break}d||(d=h[0])}else if(38==c){for(g=1;g<h.length;g++)if(h[g]==b.target){d=h[g-1];break}d||(d=h[h.length-1])}else 36==c?d=h[0]:35==c&&(d=h[h.length-1]);d&&(b.preventDefault(),e(d))}}),a(".dropdown").on("hidden.bs.dropdown",function(b){var c=a(b.target).find('[data-toggle="dropdown"]');c&&e(c)}),a(function(){window.setTimeout(function(){var b=a('[role="alert"][data-aria-autofocus="true"]');b.length>0&&(a(b[0]).attr("tabindex","0"),a(b[0]).focus())},300)})}}});
|
||||
define(["jquery","core/pending"],function(a,b){return{init:function(){var c=!1,d=function(){c=!0},e=function(){var a=c;return c=!1,a};a('[data-toggle="dropdown"]').keydown(function(b){var c,e=b.which||b.keyCode;38==e&&d(),27==e&&(c=a(b.target).attr("aria-expanded"),b.preventDefault(),"false"==c&&a(b.target).click()),32!=e&&13!=e||(b.preventDefault(),a(b.target).click())});var f=function(c){var d=function(b){a(this).focus(),b.resolve()}.bind(c);setTimeout(d,50,new b("core/aria:delayed-focus"))};a(".dropdown").on("shown.bs.dropdown",function(b){var c=a(b.target).find('[role="menu"]'),d=!1,g=!1;c&&(d=a(c).find('[role="menuitem"]')),d&&d.length>0&&(g=e()?d[d.length-1]:d[0]),g&&f(g)}),a('.dropdown [role="menu"] [role="menuitem"]').keypress(function(b){var c,d,e=String.fromCharCode(b.which||b.keyCode),g=a(b.target).closest('[role="menu"]'),h=0,i=!1;if(g&&(i=a(g).find('[role="menuitem"]')))for(e=e.toLowerCase(),h=0;h<i.length;h++)if(c=a(i[h]),d=c.text().trim().toLowerCase(),0==d.indexOf(e)){f(c);break}}),a('.dropdown [role="menu"] [role="menuitem"]').keydown(function(b){var c=b.which||b.keyCode,d=!1,e=a(b.target).closest('[role="menu"]'),g=0,h=!1;if(e&&(h=a(e).find('[role="menuitem"]'))){if(40==c){for(g=0;g<h.length-1;g++)if(h[g]==b.target){d=h[g+1];break}d||(d=h[0])}else if(38==c){for(g=1;g<h.length;g++)if(h[g]==b.target){d=h[g-1];break}d||(d=h[h.length-1])}else 36==c?d=h[0]:35==c&&(d=h[h.length-1]);d&&(b.preventDefault(),f(d))}}),a(".dropdown").on("hidden.bs.dropdown",function(b){var c=a(b.target).find('[data-toggle="dropdown"]');c&&f(c)}),a(function(){window.setTimeout(function(b){var c=a('[role="alert"][data-aria-autofocus="true"]');c.length>0&&(a(c[0]).attr("tabindex","0"),a(c[0]).focus()),b.resolve()},300,new b("core/aria:delayed-focus"))})}}});
|
@ -20,7 +20,7 @@
|
||||
* @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.
|
||||
@ -65,10 +65,11 @@ define(['jquery'], function($) {
|
||||
|
||||
// Special handling for navigation keys when menu is open.
|
||||
var shiftFocus = function(element) {
|
||||
var delayedFocus = function() {
|
||||
var delayedFocus = function(pendingPromise) {
|
||||
$(this).focus();
|
||||
pendingPromise.resolve();
|
||||
}.bind(element);
|
||||
setTimeout(delayedFocus, 50);
|
||||
setTimeout(delayedFocus, 50, new Pending('core/aria:delayed-focus'));
|
||||
};
|
||||
|
||||
$('.dropdown').on('shown.bs.dropdown', function(e) {
|
||||
@ -186,13 +187,14 @@ define(['jquery'], function($) {
|
||||
|
||||
// After page load, focus on any element with special autofocus attribute.
|
||||
$(function() {
|
||||
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();
|
||||
}
|
||||
}, 300);
|
||||
pendingPromise.resolve();
|
||||
}, 300, new Pending('core/aria:delayed-focus'));
|
||||
});
|
||||
}
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user