2015-08-17 17:00:26 -07:00
/ * *
2018-11-23 12:29:20 +00:00
* DO NOT EDIT THIS FILE .
* See the following change record for more information ,
* https : //www.drupal.org/node/2815083
* @ preserve
* * /
2015-08-17 17:00:26 -07:00
( function ( $ , Drupal , drupalSettings , _ , Backbone , JSON , storage ) {
2018-11-23 12:29:20 +00:00
var options = $ . extend ( drupalSettings . contextual , {
strings : {
open : Drupal . t ( 'Open' ) ,
close : Drupal . t ( 'Close' )
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
} ) ;
2015-08-17 17:00:26 -07:00
var cachedPermissionsHash = storage . getItem ( 'Drupal.contextual.permissionsHash' ) ;
var permissionsHash = drupalSettings . user . permissionsHash ;
if ( cachedPermissionsHash !== permissionsHash ) {
if ( typeof permissionsHash === 'string' ) {
_ . chain ( storage ) . keys ( ) . each ( function ( key ) {
if ( key . substring ( 0 , 18 ) === 'Drupal.contextual.' ) {
storage . removeItem ( key ) ;
}
} ) ;
}
storage . setItem ( 'Drupal.contextual.permissionsHash' , permissionsHash ) ;
}
2018-11-23 12:29:20 +00:00
function adjustIfNestedAndOverlapping ( $contextual ) {
var $contextuals = $contextual . parents ( '.contextual-region' ) . eq ( - 1 ) . find ( '.contextual' ) ;
if ( $contextuals . length <= 1 ) {
return ;
}
var firstTop = $contextuals . eq ( 0 ) . offset ( ) . top ;
var secondTop = $contextuals . eq ( 1 ) . offset ( ) . top ;
if ( firstTop === secondTop ) {
var $nestedContextual = $contextuals . eq ( 1 ) ;
var height = 0 ;
var $trigger = $nestedContextual . find ( '.trigger' ) ;
$trigger . removeClass ( 'visually-hidden' ) ;
height = $nestedContextual . height ( ) ;
$trigger . addClass ( 'visually-hidden' ) ;
$nestedContextual . css ( { top : $nestedContextual . position ( ) . top + height } ) ;
}
}
2015-08-17 17:00:26 -07:00
function initContextual ( $contextual , html ) {
var $region = $contextual . closest ( '.contextual-region' ) ;
var contextual = Drupal . contextual ;
2018-11-23 12:29:20 +00:00
$contextual . html ( html ) . addClass ( 'contextual' ) . prepend ( Drupal . theme ( 'contextualTrigger' ) ) ;
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
var destination = 'destination=' + Drupal . encodePath ( Drupal . url ( drupalSettings . path . currentPath ) ) ;
2015-08-17 17:00:26 -07:00
$contextual . find ( '.contextual-links a' ) . each ( function ( ) {
var url = this . getAttribute ( 'href' ) ;
2018-11-23 12:29:20 +00:00
var glue = url . indexOf ( '?' ) === - 1 ? '?' : '&' ;
2015-08-17 17:00:26 -07:00
this . setAttribute ( 'href' , url + glue + destination ) ;
} ) ;
var model = new contextual . StateModel ( {
title : $region . find ( 'h2' ) . eq ( 0 ) . text ( ) . trim ( )
} ) ;
2018-11-23 12:29:20 +00:00
var viewOptions = $ . extend ( { el : $contextual , model : model } , options ) ;
2015-08-17 17:00:26 -07:00
contextual . views . push ( {
visual : new contextual . VisualView ( viewOptions ) ,
aural : new contextual . AuralView ( viewOptions ) ,
keyboard : new contextual . KeyboardView ( viewOptions )
} ) ;
2018-11-23 12:29:20 +00:00
contextual . regionViews . push ( new contextual . RegionView ( $ . extend ( { el : $region , model : model } , options ) ) ) ;
2015-08-17 17:00:26 -07:00
contextual . collection . add ( model ) ;
$ ( document ) . trigger ( 'drupalContextualLinkAdded' , {
$el : $contextual ,
$region : $region ,
model : model
} ) ;
adjustIfNestedAndOverlapping ( $contextual ) ;
}
Drupal . behaviors . contextual = {
2018-11-23 12:29:20 +00:00
attach : function attach ( context ) {
2015-08-17 17:00:26 -07:00
var $context = $ ( context ) ;
var $placeholders = $context . find ( '[data-contextual-id]' ) . once ( 'contextual-render' ) ;
if ( $placeholders . length === 0 ) {
return ;
}
var ids = [ ] ;
$placeholders . each ( function ( ) {
2018-11-23 12:29:20 +00:00
ids . push ( {
id : $ ( this ) . attr ( 'data-contextual-id' ) ,
token : $ ( this ) . attr ( 'data-contextual-token' )
} ) ;
2015-08-17 17:00:26 -07:00
} ) ;
2018-11-23 12:29:20 +00:00
var uncachedIDs = [ ] ;
var uncachedTokens = [ ] ;
ids . forEach ( function ( contextualID ) {
var html = storage . getItem ( 'Drupal.contextual.' + contextualID . id ) ;
2017-04-13 15:53:35 +01:00
if ( html && html . length ) {
2015-08-17 17:00:26 -07:00
window . setTimeout ( function ( ) {
2018-11-23 12:29:20 +00:00
initContextual ( $context . find ( '[data-contextual-id="' + contextualID . id + '"]' ) , html ) ;
2015-08-17 17:00:26 -07:00
} ) ;
2018-11-23 12:29:20 +00:00
return ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
uncachedIDs . push ( contextualID . id ) ;
uncachedTokens . push ( contextualID . token ) ;
2015-08-17 17:00:26 -07:00
} ) ;
if ( uncachedIDs . length > 0 ) {
$ . ajax ( {
url : Drupal . url ( 'contextual/render' ) ,
type : 'POST' ,
2018-11-23 12:29:20 +00:00
data : { 'ids[]' : uncachedIDs , 'tokens[]' : uncachedTokens } ,
2015-08-17 17:00:26 -07:00
dataType : 'json' ,
2018-11-23 12:29:20 +00:00
success : function success ( results ) {
2015-08-17 17:00:26 -07:00
_ . each ( results , function ( html , contextualID ) {
storage . setItem ( 'Drupal.contextual.' + contextualID , html ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
if ( html . length > 0 ) {
$placeholders = $context . find ( '[data-contextual-id="' + contextualID + '"]' ) ;
for ( var i = 0 ; i < $placeholders . length ; i ++ ) {
initContextual ( $placeholders . eq ( i ) , html ) ;
}
}
} ) ;
}
} ) ;
}
}
} ;
Drupal . contextual = {
views : [ ] ,
regionViews : [ ]
} ;
2018-11-23 12:29:20 +00:00
Drupal . contextual . collection = new Backbone . Collection ( [ ] , {
model : Drupal . contextual . StateModel
} ) ;
2015-08-17 17:00:26 -07:00
Drupal . theme . contextualTrigger = function ( ) {
return '<button class="trigger visually-hidden focusable" type="button"></button>' ;
} ;
2018-11-23 12:29:20 +00:00
$ ( document ) . on ( 'drupalContextualLinkAdded' , function ( event , data ) {
Drupal . ajax . bindAjaxLinks ( data . $el [ 0 ] ) ;
} ) ;
} ) ( jQuery , Drupal , drupalSettings , _ , Backbone , window . JSON , window . sessionStorage ) ;