1/** 2 * @file 3 * JavaScript behaviors for details element. 4 */ 5 6(function ($, Drupal) { 7 8 'use strict'; 9 10 Drupal.webform = Drupal.webform || {}; 11 Drupal.webform.detailsToggle = Drupal.webform.detailsToggle || {}; 12 Drupal.webform.detailsToggle.options = Drupal.webform.detailsToggle.options || {}; 13 14 /** 15 * Attach handler to toggle details open/close state. 16 * 17 * @type {Drupal~behavior} 18 */ 19 Drupal.behaviors.webformDetailsToggle = { 20 attach: function (context) { 21 $('.js-webform-details-toggle', context).once('webform-details-toggle').each(function () { 22 var $form = $(this); 23 var $tabs = $form.find('.webform-tabs'); 24 25 // Get only the main details elements and ignore all nested details. 26 var selector = ($tabs.length) ? '.webform-tab' : '.js-webform-details-toggle, .webform-elements'; 27 var $details = $form.find('details').filter(function () { 28 var $parents = $(this).parentsUntil(selector); 29 return ($parents.find('details').length === 0); 30 }); 31 32 // Toggle is only useful when there are two or more details elements. 33 if ($details.length < 2) { 34 return; 35 } 36 37 var options = $.extend({ 38 button: '<button type="button" class="webform-details-toggle-state"></button>' 39 }, Drupal.webform.detailsToggle.options); 40 41 // Create toggle buttons. 42 var $toggle = $(options.button) 43 .attr('title', Drupal.t('Toggle details widget state.')) 44 .on('click', function (e) { 45 // Get details that are not vertical tabs pane. 46 var $details = $form.find('details:not(.vertical-tabs__pane)'); 47 var open; 48 if (Drupal.webform.detailsToggle.isFormDetailsOpen($form)) { 49 $details.removeAttr('open'); 50 open = 0; 51 } 52 else { 53 $details.attr('open', 'open'); 54 open = 1; 55 } 56 Drupal.webform.detailsToggle.setDetailsToggleLabel($form); 57 58 // Set the saved states for all the details elements. 59 // @see webform.element.details.save.js 60 if (Drupal.webformDetailsSaveGetName) { 61 $details.each(function () { 62 // Note: Drupal.webformDetailsSaveGetName checks if localStorage 63 // exists and is enabled. 64 // @see webform.element.details.save.js 65 var name = Drupal.webformDetailsSaveGetName($(this)); 66 if (name) { 67 localStorage.setItem(name, open); 68 } 69 }); 70 } 71 }) 72 .wrap('<div class="webform-details-toggle-state-wrapper"></div>') 73 .parent(); 74 75 if ($tabs.length) { 76 // Add toggle state before the tabs. 77 $tabs.find('.item-list:first-child').eq(0).before($toggle); 78 } 79 else { 80 // Add toggle state link to first details element. 81 $details.eq(0).before($toggle); 82 } 83 84 Drupal.webform.detailsToggle.setDetailsToggleLabel($form); 85 }); 86 } 87 }; 88 89 /** 90 * Determine if a webform's details are all opened. 91 * 92 * @param {jQuery} $form 93 * A webform. 94 * 95 * @return {boolean} 96 * TRUE if a webform's details are all opened. 97 */ 98 Drupal.webform.detailsToggle.isFormDetailsOpen = function ($form) { 99 return ($form.find('details[open]').length === $form.find('details').length); 100 }; 101 102 /** 103 * Set a webform's details toggle state widget label. 104 * 105 * @param {jQuery} $form 106 * A webform. 107 */ 108 Drupal.webform.detailsToggle.setDetailsToggleLabel = function ($form) { 109 var isOpen = Drupal.webform.detailsToggle.isFormDetailsOpen($form); 110 111 var label = (isOpen) ? Drupal.t('Collapse all') : Drupal.t('Expand all'); 112 $form.find('.webform-details-toggle-state').html(label); 113 114 var text = (isOpen) ? Drupal.t('All details have been expanded.') : Drupal.t('All details have been collapsed.'); 115 Drupal.announce(text); 116 }; 117 118})(jQuery, Drupal);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.