This repository has been archived on 2025-01-19. You can view files and clone it, but cannot push or open issues or pull requests.
drupalcampbristol/web/modules/contrib/webform/js/webform.element.details.toggle.js
2017-03-16 15:29:07 +00:00

86 lines
2.4 KiB
JavaScript

/**
* @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($('<button type="button" class="link webform-details-toggle-state"></button>')
.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('<div class="webform-details-toggle-state-wrapper"></div>')
.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);