PageSourceSearch

https://stereolux.org/modules/contrib/webform/js/webform.element.details.toggle.js?tl3ix3

js stereolux.org collected 2026-09-24 10:01:36 UTC 4,163 bytes, 118 lines download raw bytes

1/**
2 * @file
3 * JavaScript behaviors for details element.
4 */
5
6(function ($, Drupal, once) {
7  Drupal.webform = Drupal.webform || {};
8  Drupal.webform.detailsToggle = Drupal.webform.detailsToggle || {};
9  Drupal.webform.detailsToggle.options = Drupal.webform.detailsToggle.options || {};
10
11  /**
12   * Attach handler to toggle details open/close state.
13   *
14   * @type {Drupal~behavior}
15   */
16  Drupal.behaviors.webformDetailsToggle = {
17    attach(context) {
18      $(once('webform-details-toggle', '.js-webform-details-toggle', context)).each(function () {
19        var $form = $(this);
20        var $tabs = $form.find('.webform-tabs');
21
22        // Get only the main details elements and ignore all nested details.
23        var selector = ($tabs.length) ? '.webform-tab' : '.js-webform-details-toggle, .webform-elements';
24        var $details = $form.find('details').filter(function () {
25          var $parents = $(this).parentsUntil(selector);
26          return ($parents.find('details').length === 0);
27        });
28
29        // Toggle is only useful when there are two or more details elements.
30        if ($details.length < 2) {
31          return;
32        }
33
34        var options = $.extend({
35          button: '<button type="button" class="webform-details-toggle-state"></button>'
36        }, Drupal.webform.detailsToggle.options);
37
38        // Create toggle buttons.
39        var $toggle = $(options.button)
40          .attr('title', Drupal.t('Toggle details widget state.'))
41          .on('click', function (e) {
42            // Get details that are not vertical tabs pane.
43            var $details = $form.find('details:not(.vertical-tabs__pane)');
44            var $summary = $details.find('summary');
45            var open;
46            if (Drupal.webform.detailsToggle.isFormDetailsOpen($form)) {
47              $details.removeAttr('open');
48              $summary.attr('aria-expanded', 'false');
49              open = 0;
50            }
51            else {
52              $details.attr('open', 'open');
53              $summary.attr('aria-expanded', 'true');
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, once);

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.