123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- /**
- * DO NOT EDIT THIS FILE.
- * See the following change record for more information,
- * https://www.drupal.org/node/2815083
- * @preserve
- **/
- (function ($, Drupal) {
- function TabbingManager() {
- this.stack = [];
- }
- function TabbingContext(options) {
- $.extend(this, {
- level: null,
- $tabbableElements: $(),
- $disabledElements: $(),
- released: false,
- active: false
- }, options);
- }
- $.extend(TabbingManager.prototype, {
- constrain: function constrain(elements) {
- var il = this.stack.length;
- for (var i = 0; i < il; i++) {
- this.stack[i].deactivate();
- }
- var $elements = $(elements).find(':tabbable').addBack(':tabbable');
- var tabbingContext = new TabbingContext({
- level: this.stack.length,
- $tabbableElements: $elements
- });
- this.stack.push(tabbingContext);
- tabbingContext.activate();
- $(document).trigger('drupalTabbingConstrained', tabbingContext);
- return tabbingContext;
- },
- release: function release() {
- var toActivate = this.stack.length - 1;
- while (toActivate >= 0 && this.stack[toActivate].released) {
- toActivate--;
- }
- this.stack.splice(toActivate + 1);
- if (toActivate >= 0) {
- this.stack[toActivate].activate();
- }
- },
- activate: function activate(tabbingContext) {
- var $set = tabbingContext.$tabbableElements;
- var level = tabbingContext.level;
- var $disabledSet = $(':tabbable').not($set);
- tabbingContext.$disabledElements = $disabledSet;
- var il = $disabledSet.length;
- for (var i = 0; i < il; i++) {
- this.recordTabindex($disabledSet.eq(i), level);
- }
- $disabledSet.prop('tabindex', -1).prop('autofocus', false);
- var $hasFocus = $set.filter('[autofocus]').eq(-1);
- if ($hasFocus.length === 0) {
- $hasFocus = $set.eq(0);
- }
- $hasFocus.trigger('focus');
- },
- deactivate: function deactivate(tabbingContext) {
- var $set = tabbingContext.$disabledElements;
- var level = tabbingContext.level;
- var il = $set.length;
- for (var i = 0; i < il; i++) {
- this.restoreTabindex($set.eq(i), level);
- }
- },
- recordTabindex: function recordTabindex($el, level) {
- var tabInfo = $el.data('drupalOriginalTabIndices') || {};
- tabInfo[level] = {
- tabindex: $el[0].getAttribute('tabindex'),
- autofocus: $el[0].hasAttribute('autofocus')
- };
- $el.data('drupalOriginalTabIndices', tabInfo);
- },
- restoreTabindex: function restoreTabindex($el, level) {
- var tabInfo = $el.data('drupalOriginalTabIndices');
- if (tabInfo && tabInfo[level]) {
- var data = tabInfo[level];
- if (data.tabindex) {
- $el[0].setAttribute('tabindex', data.tabindex);
- } else {
- $el[0].removeAttribute('tabindex');
- }
- if (data.autofocus) {
- $el[0].setAttribute('autofocus', 'autofocus');
- }
- if (level === 0) {
- $el.removeData('drupalOriginalTabIndices');
- } else {
- var levelToDelete = level;
- while (tabInfo.hasOwnProperty(levelToDelete)) {
- delete tabInfo[levelToDelete];
- levelToDelete++;
- }
- $el.data('drupalOriginalTabIndices', tabInfo);
- }
- }
- }
- });
- $.extend(TabbingContext.prototype, {
- release: function release() {
- if (!this.released) {
- this.deactivate();
- this.released = true;
- Drupal.tabbingManager.release(this);
- $(document).trigger('drupalTabbingContextReleased', this);
- }
- },
- activate: function activate() {
- if (!this.active && !this.released) {
- this.active = true;
- Drupal.tabbingManager.activate(this);
- $(document).trigger('drupalTabbingContextActivated', this);
- }
- },
- deactivate: function deactivate() {
- if (this.active) {
- this.active = false;
- Drupal.tabbingManager.deactivate(this);
- $(document).trigger('drupalTabbingContextDeactivated', this);
- }
- }
- });
- if (Drupal.tabbingManager) {
- return;
- }
- Drupal.tabbingManager = new TabbingManager();
- })(jQuery, Drupal);
|