159 lines
4.1 KiB
JavaScript
159 lines
4.1 KiB
JavaScript
/**
|
|
* 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); |