Mercurial > hg > cmmr2012-drupal-site
diff core/misc/tabbingmanager.js @ 0:c75dbcec494b
Initial commit from drush-created site
| author | Chris Cannam |
|---|---|
| date | Thu, 05 Jul 2018 14:24:15 +0000 |
| parents | |
| children | a9cd425dd02b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/misc/tabbingmanager.js Thu Jul 05 14:24:15 2018 +0000 @@ -0,0 +1,159 @@ +/** +* 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 = []; + } + + $.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); + } + } + } + }); + + function TabbingContext(options) { + $.extend(this, { + level: null, + + $tabbableElements: $(), + + $disabledElements: $(), + + released: false, + + active: false + }, options); + } + + $.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); \ No newline at end of file
