/** * @file * JavaScript behaviors for details element. */ (function ($, Drupal) { 'use strict'; // Determine if local storage exists and is enabled. // This approach is copied from Modernizr. // @see https://github.com/Modernizr/Modernizr/blob/c56fb8b09515f629806ca44742932902ac145302/modernizr.js#L696-731 var hasLocalStorage = (function () { try { localStorage.setItem('webform', 'webform'); localStorage.removeItem('webform'); return true; } catch (e) { return false; } }()); /** * Attach handler to save details open/close state. * * @type {Drupal~behavior} */ Drupal.behaviors.webformDetailsSave = { attach: function (context) { if (!hasLocalStorage) { return; } // Summary click event handler. $('details > summary', context).once('webform-details-summary-save').on('click', function () { var $details = $(this).parent(); // @see https://css-tricks.com/snippets/jquery/make-an-jquery-hasattr/ if ($details[0].hasAttribute('data-webform-details-nosave')) { return; } var name = Drupal.webformDetailsSaveGetName($details); if (!name) { return; } var open = ($details.attr('open') !== 'open') ? '1' : '0'; localStorage.setItem(name, open); }); // Initialize details open state via local storage. $('details', context).once('webform-details-save').each(function () { var $details = $(this); var name = Drupal.webformDetailsSaveGetName($details); if (!name) { return; } var open = localStorage.getItem(name); if (open === null) { return; } if (open === '1') { $details.attr('open', 'open'); } else { $details.removeAttr('open'); } }); } }; /** * Get the name used to store the state of details element. * * @param {jQuery} $details * A details element. * * @return {string} * The name used to store the state of details element. */ Drupal.webformDetailsSaveGetName = function ($details) { if (!hasLocalStorage) { return ''; } // Ignore details that are vertical tabs pane. if ($details.hasClass('vertical-tabs__pane')) { return ''; } // Any details element not included a webform must have define its own id. var webformId = $details.attr('data-webform-element-id'); if (webformId) { return 'Drupal.webform.' + webformId.replace('--', '.'); } var detailsId = $details.attr('id'); if (!detailsId) { return ''; } var $form = $details.parents('form'); if (!$form.length || !$form.attr('id')) { return ''; } var formId = $form.attr('id'); if (!formId) { return ''; } // ISSUE: When Drupal renders a webform in a modal dialog it appends a unique // identifier to webform ids and details ids. (i.e. my-form--FeSFISegTUI) // WORKAROUND: Remove the unique id that delimited using double dashes. formId = formId.replace(/--.+?$/, '').replace(/-/g, '_'); detailsId = detailsId.replace(/--.+?$/, '').replace(/-/g, '_'); return 'Drupal.webform.' + formId + '.' + detailsId; }; })(jQuery, Drupal);