Chris@0: /** Chris@0: * @file Chris@0: * A Backbone View that provides keyboard interaction for a contextual link. Chris@0: */ Chris@0: Chris@17: (function(Drupal, Backbone) { Chris@17: Drupal.contextual.KeyboardView = Backbone.View.extend( Chris@17: /** @lends Drupal.contextual.KeyboardView# */ { Chris@17: /** Chris@17: * @type {object} Chris@17: */ Chris@17: events: { Chris@17: 'focus .trigger': 'focus', Chris@17: 'focus .contextual-links a': 'focus', Chris@17: 'blur .trigger': function() { Chris@17: this.model.blur(); Chris@17: }, Chris@17: 'blur .contextual-links a': function() { Chris@17: // Set up a timeout to allow a user to tab between the trigger and the Chris@17: // contextual links without the menu dismissing. Chris@17: const that = this; Chris@17: this.timer = window.setTimeout(() => { Chris@17: that.model.close().blur(); Chris@17: }, 150); Chris@17: }, Chris@17: }, Chris@0: Chris@17: /** Chris@17: * Provides keyboard interaction for a contextual link. Chris@17: * Chris@17: * @constructs Chris@17: * Chris@17: * @augments Backbone.View Chris@17: */ Chris@17: initialize() { Chris@17: /** Chris@17: * The timer is used to create a delay before dismissing the contextual Chris@17: * links on blur. This is only necessary when keyboard users tab into Chris@17: * contextual links without edit mode (i.e. without TabbingManager). Chris@17: * That means that if we decide to disable tabbing of contextual links Chris@17: * without edit mode, all this timer logic can go away. Chris@17: * Chris@17: * @type {NaN|number} Chris@17: */ Chris@17: this.timer = NaN; Chris@0: }, Chris@17: Chris@17: /** Chris@17: * Sets focus on the model; Clears the timer that dismisses the links. Chris@17: */ Chris@17: focus() { Chris@17: // Clear the timeout that might have been set by blurring a link. Chris@17: window.clearTimeout(this.timer); Chris@17: this.model.focus(); Chris@0: }, Chris@0: }, Chris@17: ); Chris@17: })(Drupal, Backbone);