2015-08-17 17:00:26 -07:00
/ * *
* @ file
* A Backbone View that provides the visual view of a contextual link .
* /
( function ( Drupal , Backbone , Modernizr ) {
2015-10-21 21:44:50 -07:00
'use strict' ;
2015-08-17 17:00:26 -07:00
Drupal . contextual . VisualView = Backbone . View . extend ( /** @lends Drupal.contextual.VisualView# */ {
/ * *
2015-09-04 13:20:09 -07:00
* Events for the Backbone view .
*
2015-08-17 17:00:26 -07:00
* @ return { object }
2015-09-04 13:20:09 -07:00
* A mapping of events to be used in the view .
2015-08-17 17:00:26 -07:00
* /
events : function ( ) {
// Prevents delay and simulated mouse events.
var touchEndToClick = function ( event ) {
event . preventDefault ( ) ;
event . target . click ( ) ;
} ;
var mapping = {
'click .trigger' : function ( ) { this . model . toggleOpen ( ) ; } ,
'touchend .trigger' : touchEndToClick ,
'click .contextual-links a' : function ( ) { this . model . close ( ) . blur ( ) ; } ,
'touchend .contextual-links a' : touchEndToClick
} ;
// We only want mouse hover events on non-touch.
2015-10-21 21:44:50 -07:00
if ( ! Modernizr . touchevents ) {
2015-08-17 17:00:26 -07:00
mapping . mouseenter = function ( ) { this . model . focus ( ) ; } ;
}
return mapping ;
} ,
/ * *
* Renders the visual view of a contextual link . Listens to mouse & touch .
*
* @ constructs
*
* @ augments Backbone . View
* /
initialize : function ( ) {
this . listenTo ( this . model , 'change' , this . render ) ;
} ,
/ * *
* @ inheritdoc
*
* @ return { Drupal . contextual . VisualView }
2015-09-04 13:20:09 -07:00
* The current contextual visual view .
2015-08-17 17:00:26 -07:00
* /
render : function ( ) {
var isOpen = this . model . get ( 'isOpen' ) ;
// The trigger should be visible when:
// - the mouse hovered over the region,
// - the trigger is locked,
// - and for as long as the contextual menu is open.
var isVisible = this . model . get ( 'isLocked' ) || this . model . get ( 'regionIsHovered' ) || isOpen ;
this . $el
// The open state determines if the links are visible.
. toggleClass ( 'open' , isOpen )
// Update the visibility of the trigger.
. find ( '.trigger' ) . toggleClass ( 'visually-hidden' , ! isVisible ) ;
// Nested contextual region handling: hide any nested contextual triggers.
if ( 'isOpen' in this . model . changed ) {
this . $el . closest ( '.contextual-region' )
. find ( '.contextual .trigger:not(:first)' )
. toggle ( ! isOpen ) ;
}
return this ;
}
} ) ;
} ) ( Drupal , Backbone , Modernizr ) ;