2017-03-16 15:29:07 +00:00
/ * *
* @ file
2018-11-23 12:29:20 +00:00
* JavaScript behaviors for details element .
2017-03-16 15:29:07 +00:00
* /
( function ( $ , Drupal ) {
'use strict' ;
2018-11-23 12:29:20 +00:00
Drupal . webform = Drupal . webform || { } ;
Drupal . webform . detailsToggle = Drupal . webform . detailsToggle || { } ;
Drupal . webform . detailsToggle . options = Drupal . webform . detailsToggle . options || { } ;
2017-03-16 15:29:07 +00:00
/ * *
* Attach handler to toggle details open / close state .
*
* @ type { Drupal ~ behavior }
* /
Drupal . behaviors . webformDetailsToggle = {
attach : function ( context ) {
$ ( '.js-webform-details-toggle' , context ) . once ( 'webform-details-toggle' ) . each ( function ( ) {
var $form = $ ( this ) ;
2018-11-23 12:29:20 +00:00
var $tabs = $form . find ( '.webform-tabs' ) ;
// Get only the main details elements and ignore all nested details.
var selector = ( $tabs . length ) ? '.webform-tab' : '.js-webform-details-toggle' ;
var $details = $form . find ( 'details' ) . filter ( function ( ) {
// @todo Figure out how to optimize the below code.
var $parents = $ ( this ) . parentsUntil ( selector ) ;
return ( $parents . find ( 'details' ) . length === 0 ) ;
} ) ;
2017-03-16 15:29:07 +00:00
// Toggle is only useful when there are two or more details elements.
if ( $details . length < 2 ) {
return ;
}
2018-11-23 12:29:20 +00:00
var options = $ . extend ( {
button : '<button type="button" class="webform-details-toggle-state"></button>'
} , Drupal . webform . detailsToggle . options ) ;
// Create toggle buttons.
var $toggle = $ ( options . button )
2017-03-16 15:29:07 +00:00
. attr ( 'title' , Drupal . t ( 'Toggle details widget state.' ) )
. on ( 'click' , function ( e ) {
var open ;
if ( isFormDetailsOpen ( $form ) ) {
$form . find ( 'details' ) . removeAttr ( 'open' ) ;
open = 0 ;
}
else {
$form . find ( 'details' ) . attr ( 'open' , 'open' ) ;
open = 1 ;
}
setDetailsToggleLabel ( $form ) ;
// Set the saved states for all the details elements.
// @see webform.element.details.save.js
2019-01-24 08:00:03 +00:00
if ( Drupal . webformDetailsSaveGetName ) {
2017-03-16 15:29:07 +00:00
$form . find ( 'details' ) . each ( function ( ) {
var name = Drupal . webformDetailsSaveGetName ( $ ( this ) ) ;
if ( name ) {
localStorage . setItem ( name , open ) ;
}
} ) ;
}
} )
. wrap ( '<div class="webform-details-toggle-state-wrapper"></div>' )
2018-11-23 12:29:20 +00:00
. parent ( ) ;
if ( $tabs . length ) {
// Add toggle state before the tabs.
2019-01-24 08:00:03 +00:00
$tabs . find ( '.item-list:first-child' ) . eq ( 0 ) . before ( $toggle ) ;
2018-11-23 12:29:20 +00:00
}
else {
// Add toggle state link to first details element.
$details . eq ( 0 ) . before ( $toggle ) ;
}
2017-03-16 15:29:07 +00:00
setDetailsToggleLabel ( $form ) ;
} ) ;
}
} ;
/ * *
* Determine if a webform ' s details are all opened .
*
2018-11-23 12:29:20 +00:00
* @ param { jQuery } $form
2017-03-16 15:29:07 +00:00
* A webform .
*
2018-11-23 12:29:20 +00:00
* @ return { boolean }
2017-03-16 15:29:07 +00:00
* TRUE if a webform ' s details are all opened .
* /
function isFormDetailsOpen ( $form ) {
2018-11-23 12:29:20 +00:00
return ( $form . find ( 'details[open]' ) . length === $form . find ( 'details' ) . length ) ;
2017-03-16 15:29:07 +00:00
}
/ * *
* Set a webform ' s details toggle state widget label .
*
2018-11-23 12:29:20 +00:00
* @ param { jQuery } $form
2017-03-16 15:29:07 +00:00
* A webform .
* /
function setDetailsToggleLabel ( $form ) {
2018-11-23 12:29:20 +00:00
var isOpen = isFormDetailsOpen ( $form ) ;
var label = ( isOpen ) ? Drupal . t ( 'Collapse all' ) : Drupal . t ( 'Expand all' ) ;
2017-03-16 15:29:07 +00:00
$form . find ( '.webform-details-toggle-state' ) . html ( label ) ;
2018-11-23 12:29:20 +00:00
var text = ( isOpen ) ? Drupal . t ( 'All details have been expanded.' ) : Drupal . t ( 'All details have been collapsed.' ) ;
Drupal . announce ( text ) ;
2017-03-16 15:29:07 +00:00
}
} ) ( jQuery , Drupal ) ;