/** * @file * Javascript behaviors for details element. */ (function ($, Drupal) { 'use strict'; /** * 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); var $details = $form.find('details'); // Toggle is only useful when there are two or more details elements. if ($details.length < 2) { return; } // Add toggle state link to first details element. $details.first().before($('') .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 if (Drupal.webformDetailsSaveGetName) { $form.find('details').each(function () { var name = Drupal.webformDetailsSaveGetName($(this)); if (name) { localStorage.setItem(name, open); } }); } }) .wrap('
') .parent() ); setDetailsToggleLabel($form); }); } }; /** * Determine if a webform's details are all opened. * * @param $form * A webform. * * @returns {boolean} * TRUE if a webform's details are all opened. */ function isFormDetailsOpen($form) { return ($form.find('details[open]').length == $form.find('details').length) } /** * Set a webform's details toggle state widget label. * * @param $form * A webform. */ function setDetailsToggleLabel($form) { var label = (isFormDetailsOpen($form)) ? Drupal.t('Collapse all') : Drupal.t('Expand all'); $form.find('.webform-details-toggle-state').html(label); } })(jQuery, Drupal);