website/modules/contrib/webform/js/webform.element.messagedfb4.js
2023-09-30 09:40:37 +02:00

128 lines
3.3 KiB
JavaScript

/**
* @file
* JavaScript behaviors for message element integration.
*/
(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;
}
}());
// Determine if session storage exists and is enabled.
// This approach is copied from Modernizr.
// @see https://github.com/Modernizr/Modernizr/blob/c56fb8b09515f629806ca44742932902ac145302/modernizr.js#L696-731
var hasSessionStorage = (function () {
try {
sessionStorage.setItem('webform', 'webform');
sessionStorage.removeItem('webform');
return true;
}
catch (e) {
return false;
}
}());
/**
* Behavior for handler message close.
*
* @type {Drupal~behavior}
*/
Drupal.behaviors.webformMessageClose = {
attach: function (context) {
$(context).find('.js-webform-message--close').once('webform-message--close').each(function () {
var $element = $(this);
var id = $element.attr('data-message-id');
var storage = $element.attr('data-message-storage');
var effect = $element.attr('data-message-close-effect') || 'hide';
switch (effect) {
case 'slide': effect = 'slideUp'; break;
case 'fade': effect = 'fadeOut'; break;
}
// Check storage status.
if (isClosed($element, storage, id)) {
return;
}
// Only show element if it's style is not set to 'display: none'
// and it is not hidden via .js-webform-states-hidden.
if ($element.attr('style') !== 'display: none;' && !$element.hasClass('js-webform-states-hidden')) {
$element.show();
}
$element.find('.js-webform-message__link').on('click', function (event) {
$element[effect]();
setClosed($element, storage, id);
$element.trigger('close');
event.preventDefault();
});
});
}
};
function isClosed($element, storage, id) {
if (!id || !storage) {
return false;
}
switch (storage) {
case 'local':
if (hasLocalStorage) {
return localStorage.getItem('Drupal.webform.message.' + id) || false;
}
return false;
case 'session':
if (hasSessionStorage) {
return sessionStorage.getItem('Drupal.webform.message.' + id) || false;
}
return false;
default:
return false;
}
}
function setClosed($element, storage, id) {
if (!id || !storage) {
return;
}
switch (storage) {
case 'local':
if (hasLocalStorage) {
localStorage.setItem('Drupal.webform.message.' + id, true);
}
break;
case 'session':
if (hasSessionStorage) {
sessionStorage.setItem('Drupal.webform.message.' + id, true);
}
break;
case 'user':
case 'state':
case 'custom':
$.get($element.find('.js-webform-message__link').attr('href'));
return true;
}
}
})(jQuery, Drupal);