1/* global Drupal */ 2/* global once */ 3(function (Drupal, once) { 4 Drupal.behaviors.ws_popup = { 5 attach: function (context, settings) { 6 7 // Initialisation du script. 8 once('ws-popup-init', document.querySelectorAll('body')).forEach(function (body) { 9 // Récupération des données pour le script. 10 const data = getScriptData(); 11 12 // Vérification des conditions d'affichage. 13 let doInitDisplay = false; 14 // L'affichage doit être activé. 15 if (settings.ws_popup.enabled) { 16 doInitDisplay = true; 17 const now = new Date(); 18 const { raw_date_debut, raw_date_fin } = settings.ws_popup; 19 // Si une date de début est configurée, elle doit être passée. 20 const hasDateDebut = raw_date_debut && raw_date_debut.trim() !== ''; 21 if (hasDateDebut) { 22 const dateDebut = new Date(raw_date_debut); 23 doInitDisplay = doInitDisplay && now >= dateDebut; 24 } 25 // Si une date de fin est configurée, elle doit être future. 26 const hasDateFin = raw_date_fin && raw_date_fin.trim() !== ''; 27 if (hasDateFin) { 28 const dateFin = new Date(raw_date_fin); 29 doInitDisplay = doInitDisplay && now < dateFin; 30 } 31 } 32 33 // Initialisation de l'affichage. 34 if (doInitDisplay) { 35 initPopupDisplay(data); 36 initBannerDisplay(data); 37 } 38 }); 39 40 41 /** 42 * Récupère les données pour le script. 43 * 44 * @returns {Object} Les données. 45 */ 46 function getScriptData() { 47 const config_hash = settings.ws_popup.config_hash; 48 const nowTimestamp = Math.floor(Date.now() / 1000); 49 50 // Récupération des données du localStorage. 51 const data = JSON.parse(localStorage.getItem('Drupal.ws_popup')); 52 53 // Vérification des conditions d'initialisation. 54 let doInitStorage = false; 55 // Les données existent : vérification de la validité. 56 if (data) { 57 // Les données de configuration ont changé : réinitialisation. 58 const hasConfigChanged = data.config_hash !== config_hash; 59 if (hasConfigChanged) { 60 doInitStorage = true; 61 } 62 // Les données ont plus de 24 h : réinitialisation. 63 const hasDataExpired = Math.abs(nowTimestamp - data.last_timestamp) > 86400; 64 if (hasDataExpired) { 65 doInitStorage = true; 66 } 67 } 68 // Les données n'existent pas : initialisation. 69 else { 70 doInitStorage = true; 71 } 72 73 // Initialisation du localStorage si nécessaire. 74 if (doInitStorage) { 75 const newData = { 76 config_hash, 77 last_timestamp: nowTimestamp, 78 hide_popup: false, 79 hide_banner: false, 80 }; 81 setLocalStorageData(newData); 82 return newData; 83 } 84 85 // Renvoi des données existantes sinon. 86 return data; 87 } 88 89 90 /** 91 * Met à jour les données pour le script dans le localStorage. 92 * 93 * @param {Object} newData Les nouvelles données à enregistrer. 94 */ 95 function setLocalStorageData(newData) { 96 localStorage.setItem('Drupal.ws_popup', JSON.stringify(newData)); 97 } 98 99 100 /** 101 * Initialise l'affichage de la pop-up. 102 * 103 * @param {Object} data Les données pour le script. 104 */ 105 function initPopupDisplay(data) { 106 document.querySelectorAll('.popup-area').forEach(function (popup) { 107 // Affichage de la pop-up. 108 if (settings.ws_popup.show_popup_on_page_load && !data.hide_popup) { 109 popup.classList.remove('closed'); 110 } 111 // Au clic sur le bouton Fermer de la pop-up. 112 popup.querySelectorAll('.popup-overlay, .popup-close').forEach(function (element) { 113 element.addEventListener('click', function () { 114 // Fermeture de la pop-up. 115 popup.classList.add('closed'); 116 // Enregistrement de la fermeture dans le localStorage.
117 if (settings.ws_popup.show_popup_on_page_load) { 118 data.hide_popup = true; 119 setLocalStorageData(data); 120 } 121 }); 122 }); 123 124 }); 125 } 126 127 128 /** 129 * Initialise l'affichage de la bannière. 130 * 131 * @param {Object} data Les données pour le script. 132 */ 133 function initBannerDisplay(data) { 134 document.querySelectorAll('.popup-banner').forEach(function (banner) { 135 // Affichage de la bannière. 136 if (!data.hide_banner) { 137 banner.classList.remove('closed'); 138 document.body.classList.add('has-firstvisit-banner'); 139 } 140 // Au clic sur la bannière (sauf bouton Fermer), ouverture de la pop-up. 141 banner.addEventListener('click', function (event) { 142 if (!event.target.classList.contains('banner-close')) { 143 context.querySelectorAll('.popup-area').forEach(function (popup) { 144 popup.classList.remove('closed'); 145 }); 146 } 147 }); 148 // Au clic sur le bouton Fermer de la bannière. 149 if (settings.ws_popup.banner_closable) { 150 banner.querySelectorAll('.banner-close').forEach(function (element) { 151 element.addEventListener('click', function (event) { 152 event.preventDefault(); 153 // Fermeture de la bannière. 154 banner.classList.add('closed'); 155 document.body.classList.remove('has-firstvisit-banner'); 156 // Enregistrement de la fermeture dans le localStorage. 157 data.hide_banner = true; 158 setLocalStorageData(data); 159 }); 160 }); 161 } 162 163 }); 164 } 165 166 } 167 }; 168})(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.