PageSourceSearch

https://www.digital-campus.fr/sites/all/themes/digital_campus/js/validation_leadsform.js?1790362488

js digital-campus.fr collected 2026-09-26 00:30:05 UTC 5,605 bytes, 156 lines download raw bytes

1/**
2 * @file
3 * A JavaScript file for the theme.
4 *
5 * In order for this JavaScript to be loaded on pages, see the instructions in
6 * the README.txt next to this file.
7 */
8
9// JavaScript should be made compatible with libraries other than jQuery by
10// wrapping it with an "anonymous closure". See:
11// - https://drupal.org/node/1446420
12// - http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth
13(function ($, Drupal, window, document, undefined) {
14
15  $(document).ready(function () {
16
17    const rulesMessage = validationMessages;
18
19    $.validator.addMethod("regex", function (value, element, regexp) {
20      const re = new RegExp(regexp);
21      return this.optional(element) || re.test(value);
22    });
23
24    $.validator.addMethod('validatePhone', function (value, element) {
25      return this.optional(element) || $(element).intlTelInput("isValidNumber");
26    }, "Numéro non valide");
27
28    // Ciblage de tous les formulaires webform
29    $(".webform-client-form").each(function () {
30      const form = $(this);
31
32      // Si un champ d'upload est trouvé, on ignore la validation JS
33      if (form.find('input[type="file"]').length > 0) {
34        return; // Passe au formulaire suivant
35      }
36
37      const input = $(".form-tel", form);
38      const copiedField = $('[name="submitted[international_phone]"]', form);
39
40      input.intlTelInput({
41        allowExtensions: true,
42        autoPlaceholder: "off",
43        preferredCountries: ['fr'],
44        utilsScript: "/sites/all/themes/digital_campus/js/intlTelinput-utils.js"
45      });
46
47      // Mise à jour du champ masqué à chaque modification du champ téléphone
48      input.on("keyup blur click", function () {
49        const intlNumber = input.intlTelInput("getNumber");
50        copiedField.val(intlNumber);
51      });
52
53      // Initialisation du validateur
54      const validator = form.validate({
55        rules: {
56          'submitted[commercial_list][0]': { required: true },
57          'submitted[commercial_list][1]': { required: true },
58          'submitted[commercial_list][2]': { required: true },
59          'submitted[commercial_list][3]': {required: true},
60          'submitted[condition]': { required: true },
61          'submitted[first_name]': { required: true, minlength: 2 },
62          'submitted[last_name]': { required: true, minlength: 2 },
63          'submitted[telephone]': { required: true, validatePhone: true },
64          'submitted[email]': {
65            required: true,
66            regex: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
67            minlength: 6
68          }
69        },
70        messages: {
71          'submitted[commercial_list][0]': {
72            required: rulesMessage.programRequired
73          },
74          'submitted[commercial_list][1]': {
75            required: rulesMessage.programRequired
76          },
77          'submitted[commercial_list][2]': {
78            required: rulesMessage.programRequired
79          },
80          'submitted[commercial_list][3]': {
81            required: rulesMessage.programRequired
82          },
83          'submitted[commercial_unit_meeting_uuid]': {
84            required: rulesMessage.eventRequired
85          },
86          'submitted[condition][1]': {
87            required: rulesMessage.termsRequired
88          },
89          'submitted[email]': {
90            required: rulesMessage.emailRequired,
91            regex: rulesMessage.emailRegex,
92            email: rulesMessage.emailEmail
93          },
94          'submitted[last_name]': {
95            required: rulesMessage.lastNameRequired,
96            minlength: rulesMessage.lastNameMinLength
97          },
98          'submitted[first_name]': {
99            required: rulesMessage.firsNameRequired,
100            minlength: rulesMessage.firsNameMinLength
101          },
102          'submitted[telephone]': {
103            required: rulesMessage.phoneRequired,
104            validatePhone: rulesMessage.phonevalidatePhone
105          }
106        },
107        errorPlacement: function (error, element) {
108          error.appendTo(element.parent(".form-item"));
109          error.appendTo(element.parent(".intl-tel-input"));
110        },
111        errorElement: "span",
112        wrapper: "",
113      });
114
115      // Fonction pour mettre à jour l'état visuel du bouton (ex : le rendre transparent)
116      function updateSubmitButtonState(form) {
117        const submitButton = $("input[type=submit], button[type=submit]", form);
118        if (validator.checkForm()) {
119          submitButton.removeClass('opacity-50');
120        } else {
121          submitButton.addClass('opacity-50');
122        }
123      }
124
125      // Vérifie la validité des champs à chaque modification
126      form.find(':input').on('keyup blur change', function () {
127        validator.element(this); // Valide le champ individuellement
128        updateSubmitButtonState(form); // Met à jour le bouton visuellement
129      });
130
131      // Gestion propre de la soumission
132      form.on('submit', function (e) {
133        if (!validator.form()) {
134          e.preventDefault();
135          return false;
136        }
137
138        // Anti double-soumission
139        if (form.data('submitted')) {
140          e.preventDefault();
141          return false;
142        }
143        form.data('submitted', true);
144
145        // Désactiver le bouton
146        const submitButton = form.find("input[type=submit]");
147        submitButton.prop('disabled', true).addClass('opacity-50');
148
149        // Modifier le texte du bouton
150        submitButton.val('Envoi en cours...');
151      });
152
153    });
154  });
155
156})(jQuery, Drupal, this, this.document);

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.