2015-08-17 17:00:26 -07:00
/ * *
* @ file
* A Backbone Model for the state of a contextual link ' s trigger , list & region .
* /
( function ( Drupal , Backbone ) {
2015-10-21 21:44:50 -07:00
'use strict' ;
2015-08-17 17:00:26 -07:00
/ * *
* Models the state of a contextual link ' s trigger , list & region .
*
* @ constructor
*
* @ augments Backbone . Model
* /
Drupal . contextual . StateModel = Backbone . Model . extend ( /** @lends Drupal.contextual.StateModel# */ {
/ * *
* @ type { object }
*
* @ prop { string } title
* @ prop { bool } regionIsHovered
* @ prop { bool } hasFocus
* @ prop { bool } isOpen
* @ prop { bool } isLocked
* /
defaults : /** @lends Drupal.contextual.StateModel# */ {
/ * *
* The title of the entity to which these contextual links apply .
*
* @ type { string }
* /
title : '' ,
/ * *
* Represents if the contextual region is being hovered .
*
* @ type { bool }
* /
regionIsHovered : false ,
/ * *
* Represents if the contextual trigger or options have focus .
*
* @ type { bool }
* /
hasFocus : false ,
/ * *
* Represents if the contextual options for an entity are available to
* be selected ( i . e . whether the list of options is visible ) .
*
* @ type { bool }
* /
isOpen : false ,
/ * *
* When the model is locked , the trigger remains active .
*
* @ type { bool }
* /
isLocked : false
} ,
/ * *
* Opens or closes the contextual link .
*
* If it is opened , then also give focus .
*
* @ return { Drupal . contextual . StateModel }
2015-09-04 13:20:09 -07:00
* The current contextual state model .
2015-08-17 17:00:26 -07:00
* /
toggleOpen : function ( ) {
var newIsOpen = ! this . get ( 'isOpen' ) ;
this . set ( 'isOpen' , newIsOpen ) ;
if ( newIsOpen ) {
this . focus ( ) ;
}
return this ;
} ,
/ * *
* Closes this contextual link .
*
* Does not call blur ( ) because we want to allow a contextual link to have
* focus , yet be closed for example when hovering .
*
* @ return { Drupal . contextual . StateModel }
2015-09-04 13:20:09 -07:00
* The current contextual state model .
2015-08-17 17:00:26 -07:00
* /
close : function ( ) {
this . set ( 'isOpen' , false ) ;
return this ;
} ,
/ * *
* Gives focus to this contextual link .
*
* Also closes + removes focus from every other contextual link .
*
* @ return { Drupal . contextual . StateModel }
2015-09-04 13:20:09 -07:00
* The current contextual state model .
2015-08-17 17:00:26 -07:00
* /
focus : function ( ) {
this . set ( 'hasFocus' , true ) ;
var cid = this . cid ;
this . collection . each ( function ( model ) {
if ( model . cid !== cid ) {
model . close ( ) . blur ( ) ;
}
} ) ;
return this ;
} ,
/ * *
* Removes focus from this contextual link , unless it is open .
*
* @ return { Drupal . contextual . StateModel }
2015-09-04 13:20:09 -07:00
* The current contextual state model .
2015-08-17 17:00:26 -07:00
* /
blur : function ( ) {
if ( ! this . get ( 'isOpen' ) ) {
this . set ( 'hasFocus' , false ) ;
}
return this ;
}
} ) ;
} ) ( Drupal , Backbone ) ;