});
}
- this.listeners.forEach(function (listener) {
+ this.listeners.forEach(function(listener) {
listener.node.on.apply(listener.node, listener.args);
});
'core_course/events',
'block_myoverview/selectors',
'core/paged_content_events',
+ 'core/aria',
],
function(
$,
Templates,
CourseEvents,
Selectors,
- PagedContentEvents
+ PagedContentEvents,
+ Aria
) {
var SELECTORS = {
*/
var hideFavouriteIcon = function(root, courseId) {
var iconContainer = getFavouriteIconContainer(root, courseId);
+
var isFavouriteIcon = iconContainer.find(SELECTORS.ICON_IS_FAVOURITE);
isFavouriteIcon.addClass('hidden');
- isFavouriteIcon.attr('aria-hidden', true);
+ Aria.hide(isFavouriteIcon);
+
var notFavourteIcon = iconContainer.find(SELECTORS.ICON_NOT_FAVOURITE);
notFavourteIcon.removeClass('hidden');
- notFavourteIcon.attr('aria-hidden', false);
+ Aria.unhide(notFavourteIcon);
};
/**
*/
var showFavouriteIcon = function(root, courseId) {
var iconContainer = getFavouriteIconContainer(root, courseId);
+
var isFavouriteIcon = iconContainer.find(SELECTORS.ICON_IS_FAVOURITE);
isFavouriteIcon.removeClass('hidden');
- isFavouriteIcon.attr('aria-hidden', false);
+ Aria.unhide(isFavouriteIcon);
+
var notFavourteIcon = iconContainer.find(SELECTORS.ICON_NOT_FAVOURITE);
notFavourteIcon.addClass('hidden');
- notFavourteIcon.attr('aria-hidden', true);
+ Aria.hide(notFavourteIcon);
};
/**
* @copyright 2015 John Okely <john@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-define(['jquery', 'core/templates', 'core/notification', 'core/url'], function($, Templates, Notification, Url) {
+define([
+ 'jquery',
+ 'core/templates',
+ 'core/notification',
+ 'core/url',
+ 'core/aria',
+], function(
+ $,
+ Templates,
+ Notification,
+ Url,
+ Aria
+) {
// Mappings for the different types of nodes coming from the navigation.
// Copied from lib/navigationlib.php navigation_node constants.
function buildDOM(rootElement, nodes) {
var ul = $('<ul></ul>');
ul.attr('role', 'group');
- ul.attr('aria-hidden', true);
+ Aria.hide(ul);
$.each(nodes, function(index, node) {
if (typeof node !== 'object') {
var group = element.find('#' + item.attr('aria-owns'));
item.attr('aria-expanded', true);
- group.attr('aria-hidden', false);
+ Aria.unhide(group);
} else {
if (element.parent().hasClass('contains_branch')) {
element.parent().removeClass('contains_branch');
'core/templates',
'core_course/events',
'core_course/repository',
+ 'core/aria',
],
function(
$,
PagedContentPagingBar,
Templates,
CourseEvents,
- CoursesRepository
+ CoursesRepository,
+ Aria
) {
// Constants.
var pagingBar = root.find(SELECTORS.PAGING_BAR);
pagingBar.css('opacity', 1);
pagingBar.css('visibility', 'visible');
- pagingBar.attr('aria-hidden', 'false');
+ Aria.unhide(pagingBar);
};
/**
var pagingBar = root.find(SELECTORS.PAGING_BAR);
pagingBar.css('opacity', 0);
pagingBar.css('visibility', 'hidden');
- pagingBar.attr('aria-hidden', 'true');
+ Aria.hide(pagingBar);
};
/**
*/
import $ from 'jquery';
import * as PubSub from 'core/pubsub';
+import * as Aria from 'core/aria';
import DrawerEvents from 'core/drawer_events';
/**
*
* @param {Object} root The drawer container.
*/
-const show = (root) => {
+const show = root => {
+ // Ensure that it is a jQuery.
+ root = $(root);
+
+ Aria.unhide(root.get());
root.removeClass('hidden');
root.attr('aria-expanded', true);
- root.removeAttr('aria-hidden');
root.focus();
PubSub.publish(DrawerEvents.DRAWER_SHOWN, root);
*
* @param {Object} root The drawer container.
*/
-const hide = (root) => {
+const hide = root => {
+ // Ensure that it is a jQuery.
+ root = $(root);
+
root.addClass('hidden');
root.attr('aria-expanded', false);
- root.attr('aria-hidden', true);
+ Aria.hide(root.get());
+
PubSub.publish(DrawerEvents.DRAWER_HIDDEN, root);
};
*/
/* globals require: false */
define(
- ['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification', 'core/loadingicon'],
-function($, log, str, templates, notification, LoadingIcon) {
+ ['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification', 'core/loadingicon', 'core/aria'],
+function($, log, str, templates, notification, LoadingIcon, Aria) {
// Private functions and variables.
/** @var {Object} KEYS - List of keycode constants. */
var suggestionsElement = $(document.getElementById(state.suggestionsId));
// Count the visible items.
- var length = suggestionsElement.children('[aria-hidden=false]').length;
+ var length = suggestionsElement.children(':not([aria-hidden])').length;
// Limit the index to the upper/lower bounds of the list (wrap in both directions).
index = index % length;
while (index < 0) {
index += length;
}
// Find the specified element.
- var element = $(suggestionsElement.children('[aria-hidden=false]').get(index));
+ var element = $(suggestionsElement.children(':not([aria-hidden])').get(index));
// Find the index of this item in the full list of suggestions (including hidden).
var globalIndex = $(suggestionsElement.children('[role=option]')).index(element);
// Create an id we can assign to this element.
// Find the active one.
var element = suggestionsElement.children('[aria-selected=true]');
// Find it's index.
- var current = suggestionsElement.children('[aria-hidden=false]').index(element);
+ var current = suggestionsElement.children(':not([aria-hidden])').index(element);
// Activate the next one.
return activateItem(current + 1, state);
};
var element = suggestionsElement.children('[aria-selected=true]');
// Find it's index.
- var current = suggestionsElement.children('[aria-hidden=false]').index(element);
+ var current = suggestionsElement.children(':not([aria-hidden])').index(element);
// Activate the previous one.
return activateItem(current - 1, state);
inputElement.attr('aria-expanded', false).attr('aria-activedescendant', state.selectionId);
// Hide the suggestions list (from screen readers too).
- suggestionsElement.hide().attr('aria-hidden', true);
+ Aria.hide(suggestionsElement.get());
+ suggestionsElement.hide();
return $.Deferred().resolve();
};
// Get the element again.
suggestionsElement = $(document.getElementById(state.suggestionsId));
+
// Show it if it is hidden.
- suggestionsElement.show().attr('aria-hidden', false);
+ Aria.unhide(suggestionsElement.get());
+ suggestionsElement.show();
+
// For each option in the list, hide it if it doesn't match the query.
suggestionsElement.children().each(function(index, node) {
node = $(node);
if ((options.caseSensitive && node.text().indexOf(searchquery) > -1) ||
(!options.caseSensitive && node.text().toLocaleLowerCase().indexOf(searchquery) > -1)) {
- node.show().attr('aria-hidden', false);
+ Aria.unhide(node.get());
+ node.show();
matchingElements = true;
} else {
- node.hide().attr('aria-hidden', true);
+ node.hide();
+ Aria.hide(node.get());
}
});
// If we found any matches, show the list.
var element = $(e.currentTarget).closest('[role=option]');
var suggestionsElement = $(document.getElementById(state.suggestionsId));
// Find the index of the clicked on suggestion.
- var current = suggestionsElement.children('[aria-hidden=false]').index(element);
+ var current = suggestionsElement.children(':not([aria-hidden])').index(element);
// Activate it.
activateItem(current, state)
return false;
}
- originalSelect.css('visibility', 'hidden').attr('aria-hidden', true);
+ Aria.hide(originalSelect.get());
+ originalSelect.css('visibility', 'hidden');
// Hide the original select.
var suggestionsElement = $(document.getElementById(state.suggestionsId));
// Hide the suggestions by default.
- suggestionsElement.hide().attr('aria-hidden', true);
+ suggestionsElement.hide();
+ Aria.hide(suggestionsElement.get());
return;
})
* @method accessibilityShow
*/
Modal.prototype.accessibilityShow = function() {
- Aria.hideSiblings(this.root.get()[0]);
-
// Make us visible to screen readers.
- this.root.removeAttr('aria-hidden');
+ Aria.unhide(this.root.get());
+
+ // Hide siblings.
+ Aria.hideSiblings(this.root.get()[0]);
};
/**
* @method accessibilityHide
*/
Modal.prototype.accessibilityHide = function() {
- this.root.attr('aria-hidden', 'true');
-
+ // Unhide siblings.
Aria.unhideSiblings(this.root.get()[0]);
+
+ // Hide this modal.
+ Aria.hide(this.root.get());
};
/**
-define(['jquery'], function($) {
+define(['jquery', 'core/aria'], function($, Aria) {
/**
* Tooltip class.
var tooltipele = $(document.getElementById(tooltipId));
tooltipele.show();
- tooltipele.attr('aria-hidden', 'false');
+ Aria.unhide(tooltipele);
if (!tooltipele.is('.tooltip')) {
// Change the markup to a bootstrap tooltip.
var tooltipele = document.getElementById(tooltipId);
$(tooltipele).hide();
- $(tooltipele).attr('aria-hidden', 'true');
+ Aria.hide(tooltipele);
}
};
Tree.prototype.finishExpandingGroup = function(item) {
// Expand the group.
var group = this.getGroupFromItem(item);
- group.attr('aria-hidden', 'false');
+ group.removeAttr('aria-hidden');
item.attr('aria-expanded', 'true');
// Update the list of visible items.
'jquery',
'core/pubsub',
'core/str',
- 'core_message/message_drawer_events'
+ 'core_message/message_drawer_events',
+ 'core/aria',
],
function(
$,
PubSub,
Str,
- MessageDrawerEvents
+ MessageDrawerEvents,
+ Aria
) {
/* @var {object} routes Message drawer route elements and callbacks. */
element.attr('data-from-panel', true);
}
element.removeClass('hidden');
- element.attr('aria-hidden', false);
+ Aria.unhide(element.get());
} else {
// For the message index page elements in the left panel should not be hidden.
if (!element.attr('data-in-panel')) {
element.addClass('hidden');
- element.attr('aria-hidden', true);
+ Aria.hide(element.get());
} else if (newRoute == 'view-search' || newRoute == 'view-overview') {
element.addClass('hidden');
- element.attr('aria-hidden', true);
+ Aria.hide(element.get());
}
}
});
'core/str',
'core/templates',
'core/user_date',
- 'core_message/message_drawer_view_conversation_constants'
+ 'core_message/message_drawer_view_conversation_constants',
+ 'core/aria',
],
function(
$,
Str,
Templates,
UserDate,
- Constants
+ Constants,
+ Aria
) {
var SELECTORS = Constants.SELECTORS;
var TEMPLATES = Constants.TEMPLATES;
var showConfirmDialogueContainer = function(root) {
var container = getConfirmDialogueContainer(root);
var siblings = container.siblings(':not(.hidden)');
- siblings.attr('aria-hidden', true);
- siblings.attr('tabindex', -1);
+ Aria.hide(siblings.get());
siblings.attr('data-confirm-dialogue-hidden', true);
container.removeClass('hidden');
var hideConfirmDialogueContainer = function(root) {
var container = getConfirmDialogueContainer(root);
var siblings = container.siblings('[data-confirm-dialogue-hidden="true"]');
- siblings.removeAttr('aria-hidden');
- siblings.removeAttr('tabindex');
+ Aria.unhide(siblings.get());
siblings.removeAttr('data-confirm-dialogue-hidden');
container.addClass('hidden');
var retry = element.find(SELECTORS.RETRY_SEND);
loading.addClass('hidden');
- loading.attr('aria-hidden', 'true');
+ Aria.hide(loading.get());
+
time.addClass('hidden');
- time.attr('aria-hidden', 'true');
+ Aria.hide(time.get());
+
retry.addClass('hidden');
- retry.attr('aria-hidden', 'true');
+ Aria.hide(retry.get());
+
element.removeClass('border border-danger');
switch (after.sendState) {
case 'pending':
loading.removeClass('hidden');
- loading.attr('aria-hidden', 'false');
+ Aria.unhide(loading.get());
break;
case 'error':
retry.removeClass('hidden');
- retry.attr('aria-hidden', 'false');
+ Aria.unhide(retry.get());
element.addClass('border border-danger');
break;
case 'sent':
time.removeClass('hidden');
- time.attr('aria-hidden', 'false');
+ Aria.unhide(time.get());
break;
}
}
if (after.errorMessage) {
messageContainer.removeClass('hidden');
- messageContainer.attr('aria-hidden', 'false');
+ Aria.unhide(messageContainer.get());
message.text(after.errorMessage);
} else {
messageContainer.addClass('hidden');
- messageContainer.attr('aria-hidden', 'true');
+ Aria.unhide(messageContainer.get());
message.text('');
}
}
if (show) {
container.removeClass('hidden');
- container.attr('aria-hidden', false);
+ Aria.unhide(container.get());
container.find(SELECTORS.EMOJI_PICKER_SEARCH_INPUT).focus();
} else {
container.addClass('hidden');
- container.attr('aria-hidden', true);
+ Aria.hide(container.get());
}
};
if (show) {
container.removeClass('hidden');
- container.attr('aria-hidden', false);
+ Aria.unhide(container.get());
} else {
container.addClass('hidden');
- container.attr('aria-hidden', true);
+ Aria.hide(container.get());
}
};
* @copyright 2016 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-define(['jquery', 'core/custom_interaction_events', 'core/log', 'core/pubsub'],
- function($, CustomEvents, Log, PubSub) {
+define(['jquery', 'core/custom_interaction_events', 'core/log', 'core/pubsub', 'core/aria'],
+ function($, CustomEvents, Log, PubSub, Aria) {
var SELECTORS = {
TOGGLE_REGION: '[data-region="drawer-toggle"]',
trigger.attr('aria-expanded', 'false');
body.removeClass('drawer-open-' + side);
- drawer.attr('aria-hidden', 'true');
+ Aria.hide(drawer.get());
drawer.addClass('closed');
if (!small) {
M.util.set_user_preference(preference, 'false');
if (!open) {
// Open.
trigger.attr('aria-expanded', 'true');
- drawer.attr('aria-hidden', 'false');
+ Aria.unhide(drawer.get());
drawer.focus();
body.addClass('drawer-open-' + side);
drawer.removeClass('closed');
body.removeClass('drawer-open-' + side);
trigger.attr('aria-expanded', 'false');
drawer.addClass('closed').delay(500).queue(function() {
- $(this).attr('aria-hidden', 'true').dequeue();
+ Aria.hide(this);
+ $(this).dequeue();
});
if (!small) {
M.util.set_user_preference(preference, 'false');
// to either an open or closed state.
$(SELECTORS.DRAWER).on('webkitTransitionEnd msTransitionEnd transitionend', function(e) {
var drawer = $(e.target).closest(SELECTORS.DRAWER);
- var open = drawer.attr('aria-hidden') == 'false';
+ // Note: aria-hidden is either present, or absent. It should not be set to false.
+ var open = !!drawer.attr('aria-hidden');
PubSub.publish('nav-drawer-toggle-end', open);
});
};