/** * @file * Non-error Drupal status messages (status/warning) auto-dismiss after a * couple seconds; error messages always require an explicit click on * Gin's own dismiss button (.js-message-button-hide) -- something that * needs attention shouldn't vanish on its own. * * Drupal.Message.add() (used both for messages already in the initial * page render and for MessageCommand-driven AJAX messages) just appends a * DOM node directly -- it never re-fires Drupal.attachBehaviors(), so a * behaviors/once()-based approach would miss anything added after the * initial page load. A MutationObserver sees every insertion path. */ (function (Drupal) { 'use strict'; var AUTO_DISMISS_MS = 2000; function dismiss(el) { var btn = el.querySelector('.js-message-button-hide'); if (btn) { btn.click(); } else { el.style.opacity = 0; el.classList.add('visually-hidden'); } } function handleMessage(el) { if (el.dataset.figliAutoDismissSeen) return; el.dataset.figliAutoDismissSeen = '1'; if (el.classList.contains('messages--error')) return; setTimeout(function () { dismiss(el); }, AUTO_DISMISS_MS); } function scan(root) { root.querySelectorAll('.messages-list__item').forEach(handleMessage); } function init() { scan(document); new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { mutation.addedNodes.forEach(function (node) { if (node.nodeType !== 1) return; if (node.classList && node.classList.contains('messages-list__item')) { handleMessage(node); } if (node.querySelectorAll) { scan(node); } }); }); }).observe(document.body, { childList: true, subtree: true }); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })(Drupal);