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