1(function ($, Drupal, drupalSettings) { 2 'use strict'; 3 var $alertCta = $('#create-alert'); 4 var modal = $('#new-alert-modal'); 5 6 function moveFiltersToModal() { 7 var $modalTagsContainer = $('#new-alert-modal .modal-tags-container'); 8 if (!$modalTagsContainer.length) return false; 9 10 $modalTagsContainer.empty(); 11 12 var appliedFilters = $('.applied-filters'); 13 // Get original tags 14 var $tags = appliedFilters.find('.filter-tag'); 15 16 if ($tags.length === 0 && !drupalSettings.is_sp_boxlab) { 17 $modalTagsContainer.hide(); 18 return false; 19 } else { 20 $modalTagsContainer.show(); 21 } 22 23 if (drupalSettings.is_sp_boxlab) { 24 addTagsToBoxlabAlertModal($modalTagsContainer); 25 } 26 27 $tags.each(function (index) { 28 var $clonedTag = $(this).clone(); 29 $clonedTag.find('button').remove(); // Remove delete button 30 $clonedTag.removeClass('hidden-tags hide'); 31 $clonedTag.addClass('vo-filter-tags alert-vo-filter-tags'); 32 $modalTagsContainer.append($clonedTag); 33 }); 34 35 return true; 36 } 37 38 /** 39 * Add tags to the Boxlab alert modal. 40 */ 41 function addTagsToBoxlabAlertModal(modalTagsContainer) { 42 var pdv_name = drupalSettings.pdv_name; 43 if (pdv_name) { 44 var boxlab_param = new URLSearchParams(window.location.search).get('boxlab'); 45 var pdv_name_span = $('<span>').addClass('filter-tag vo-filter-tags alert-vo-filter-tags').text(pdv_name); 46 pdv_name_span.attr('data-name', 'pointofsale'); 47 pdv_name_span.attr('data-value', boxlab_param); 48 modalTagsContainer.append(pdv_name_span); 49 } 50 } 51 52 function generateCaptchaCode() { 53 var code = ""; 54 var alphaNumeric = "abcdefghijkmnopqrstuvwxyz0123456789"; 55 for (var i = 0; i < 6; i++) { 56 code += alphaNumeric.charAt(Math.floor(Math.random() * alphaNumeric.length)); 57 } 58 return code; 59 } 60 61 function refreshCaptcha() { 62 var canvas = document.getElementById("popin-alert-captcha-image"); 63 if (canvas) { 64 var captchaCode = generateCaptchaCode(); 65 canvas.captchaCodeText = captchaCode; 66 var ctx = canvas.getContext("2d"); 67 ctx.font = "25px Arial"; 68 ctx.clearRect(0, 0, canvas.width, canvas.height); 69 ctx.setTransform(1, 0.05, 0.1, 1, 1, 1); 70 ctx.fillText(captchaCode, 5, 25); 71 } 72 } 73 74 function openModal() { 75 if (!modal) return; 76 77 // Check if filters are selected before opening 78 var appliedFilters = $('.applied-filters'); 79 var $tags = appliedFilters.find('.filter-tag'); 80 81 if ($tags.length === 0 && !drupalSettings.is_sp_boxlab) { 82 $.addNotification(Drupal.t('psa.search.create_alert.create_alert_modal.no_tags_notice'), 'error'); 83 return; 84 } 85 86 // Clear inputs and messages 87 $("input[name='popin-alert-email']").val(''); 88 $("input[name='popin-alert-captcha']").val(''); 89 $('.alert-success-message').addClass('hide'); 90 $('.alert-error-message').addClass('hide'); 91 $('.popin-alert-error-email').addClass('hide'); 92 $('.popin-alert-error-captcha').addClass('hide'); 93 94 if (!moveFiltersToModal()) return; 95 96 refreshCaptcha(); 97 98 Drupal.ModalUtils.openModal(modal[0]); 99 100 // Attach close event to the cancel button inside the modal 101 var closeBtn = modal[0].querySelector('.close-modal-btn'); 102 if (closeBtn) { 103 closeBtn.addEventListener('click', function (e) { 104 e.preventDefault(); 105 Drupal.ModalUtils.closeModal(modal[0]); 106 }); 107 } 108 109 // Attach close event to the X button in header 110 var xBtn = modal[0].querySelector('.close'); 111 if (xBtn) { 112 xBtn.addEventListener('click', function (e) { 113 e.preventDefault(); 114 Drupal.ModalUtils.closeModal(modal[0]); 115 }); 116 } 117 } 118 119 function validatePopinAlertData() { 120 var RegexEmail = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/; 121 var email = $("input[name='popin-alert-email']").val(); 122 var canvas = document.getElementById("popin-alert-captcha-image"); 123 var captchaCode = canvas ? canvas.captchaCodeText : ''; 124 var captchaByUser = $("input[name='popin-alert-captcha']").val(); 125 var isValid = true; 126 127 if (!RegexEmail.test(email)) { 128 $('.popin-alert-error-email').html(Drupal.t('psa.search.create_alert.create_alert_error_modal.message_error.mail_format_ko')); 129 $('.popin-alert-error-email').removeClass('hide'); 130 isValid = false; 131 } else { 132 $('.popin-alert-error-email').addClass('hide'); 133 } 134 135 if (captchaCode !== captchaByUser) { 136 $('.popin-alert-error-captcha').removeClass('hide'); 137 isValid = false; 138 } else { 139 $('.popin-alert-error-captcha').addClass('hide'); 140 } 141 return isValid; 142 } 143 144 $(document).ready(function () { 145 $alertCta.on('click', function (e) { 146 e.preventDefault(); 147 openModal(); 148 });
149 150 $('body').on('searchAlertRefreshCaptcha', function () { 151 refreshCaptcha(); 152 }); 153 154 $(document).on('click', '#submit-alert-ui', function (event) { 155 event.preventDefault(); 156 157 var $btn = $(this); 158 var $spinner = $btn.find('.lds-ring'); 159 160 // Validate 161 var isValid = validatePopinAlertData(); 162 if (!isValid) { 163 event.stopImmediatePropagation(); 164 $spinner.addClass('hide'); 165 $btn.removeClass('disabled is-loading'); 166 return false; 167 } 168 169 var data = {}; 170 // Select tags from the modal 171 var tags = $('#new-alert-modal .modal-tags-container').children(); 172 173 tags.each(function (index, value) { 174 var tag = $(value); 175 var dataName = tag.attr('data-name'); 176 var dataValue = tag.attr('data-value'); 177 178 if (!dataName) return; 179 180 switch (dataName) { 181 case 'min_price': 182 case 'max_price': 183 case 'min_km': 184 case 'max_km': 185 case 'min_year': 186 case 'max_year': 187 case 'min_power': 188 case 'max_power': 189 dataValue = parseFloat(dataValue); 190 break; 191 case 'location': 192 var parts = dataValue.split('_'); 193 dataValue = { 194 lat: parseFloat(parts[0]), 195 lon: parseFloat(parts[1]), 196 place: (typeof parts[2] === "string") ? parts[2] : '', 197 radius: (typeof parseFloat(parts[3]) === "number") ? parseFloat(parts[3]) : '', 198 }; 199 break; 200 default: 201 break; 202 } 203 204 if (data.hasOwnProperty(dataName)) { 205 data[dataName].push(dataValue); 206 } else { 207 data[dataName] = [dataValue]; 208 } 209 }); 210 211 var dataToSend = { criteria: JSON.stringify(data) }; 212 dataToSend.email = $("input[name='popin-alert-email']").val(); 213 214 if (drupalSettings.consumer_parameter) { 215 dataToSend.consumer_value = drupalSettings.consumer_parameter; 216 } 217 218 dataToSend.is_premium = !!drupalSettings.is_premium; 219 $('input[name="alert_data"]').val(JSON.stringify(dataToSend)); 220 221 $spinner.removeClass('hide'); 222 $btn.addClass('disabled is-loading'); 223 224 // Drupal #ajax is bound to this custom event. 225 $('#submit-alert').trigger('click'); 226 return false; 227 228 }); 229 }); 230 231})(jQuery, Drupal, drupalSettings);
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.