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.