1document.addEventListener("DOMContentLoaded", function () { 2 var managedFields = []; 3 4 document.querySelectorAll("label.required").forEach(function (label) { 5 var inputId = label.getAttribute("for"); 6 var input = document.getElementById(inputId); 7 if (!input) { 8 return; 9 } 10 11 managedFields.push({ label: label, input: input }); 12 13 input.addEventListener("focus", function () { 14 removeError(input); 15 }); 16 17 input.addEventListener("blur", function () { 18 if (!input.value.trim()) { 19 var formGroup = input.closest(".form-group"); 20 if (formGroup && formGroup.querySelector(".form-js-error, .alert, .js-event-date-error")) { 21 return; 22 } 23 showError(input, buildMessage(label)); 24 } 25 }); 26 27 input.addEventListener("input", function () { 28 if (input.value.trim()) { 29 removeError(input); 30 } 31 }); 32 }); 33 34 // Bind submit-time validation once per form so that clicking Save never reaches 35 // the server with a required field empty (avoids the ZF1 alert-danger banner). 36 var boundForms = []; 37 managedFields.forEach(function (field) { 38 var form = field.input.closest("form"); 39 if (!form || boundForms.indexOf(form) !== -1) { 40 return; 41 } 42 boundForms.push(form); 43 bindSubmitValidation(form); 44 }); 45 46 function bindSubmitValidation(form) { 47 var pendingSubmitterName = null; 48 49 form.querySelectorAll('[type="submit"]').forEach(function (btn) { 50 btn.addEventListener("click", function () { 51 pendingSubmitterName = btn.getAttribute("name") || null; 52 }); 53 }); 54 55 form.addEventListener("submit", function (e) { 56 var submitterName = (e.submitter ? e.submitter.getAttribute("name") : pendingSubmitterName); 57 pendingSubmitterName = null; 58 59 if (submitterName !== "save") { 60 return; 61 } 62 63 var hasErrors = false; 64 65 managedFields.forEach(function (field) { 66 if (field.input.closest("form") !== form) { 67 return; 68 } 69 // Skip fields managed by another validator (e.g. eventDateValidation.js) 70 var formGroup = field.input.closest(".form-group"); 71 if (formGroup && formGroup.querySelector(".js-event-date-error")) { 72 return; 73 } 74 if (!field.input.value.trim()) { 75 if (!formGroup || formGroup.querySelector(".form-js-error")) { 76 hasErrors = true; 77 return; 78 } 79 showError(field.input, buildMessage(field.label)); 80 hasErrors = true; 81 } 82 }); 83 84 if (hasErrors) { 85 e.preventDefault(); 86 var firstError = form.querySelector(".form-js-has-error"); 87 if (firstError) { 88 var top = firstError.getBoundingClientRect().top + window.pageYOffset - 120; 89 window.scrollTo({ top: top, behavior: "smooth" }); 90 } 91 } 92 }); 93 } 94 95 function buildMessage(label) { 96 var text = label.textContent.replace(/[*]/g, "").trim(); 97 if (text.toLowerCase().indexOf("mail") !== -1) { 98 return "Veuillez entrer une adresse e-mail valide. Exemple : pré[email protected]"; 99 } 100 return text + " est obligatoire."; 101 } 102 103 function showError(input, message) { 104 var formGroup = input.closest(".form-group"); 105 if (!formGroup || formGroup.querySelector(".form-js-error")) { 106 return; 107 } 108 var span = document.createElement("span"); 109 span.className = "help-block text-danger form-js-error"; 110 span.textContent = message; 111 formGroup.classList.add("has-error", "form-js-has-error"); 112 formGroup.appendChild(span); 113 } 114 115 function removeError(input) { 116 var formGroup = input.closest(".form-group"); 117 if (!formGroup) { 118 return; 119 } 120 var error = formGroup.querySelector(".form-js-error"); 121 if (error) { 122 formGroup.removeChild(error); 123 } 124 if (formGroup.classList.contains("form-js-has-error")) { 125 formGroup.classList.remove("has-error", "form-js-has-error"); 126 } 127 } 128});
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.