PageSourceSearch

https://www.spoticar.fr/modules/custom/psa_refonte/dist/js/new_spoticar/psa_search/search-alert.js?tmnw4f

js spoticar.fr collected 2026-10-10 01:29:59 UTC 7,384 bytes, 231 lines download raw bytes

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.