PageSourceSearch

https://livrecommelair.fr/vendors/decalog/opac/js/form.js

js livrecommelair.fr collected 2026-10-07 16:39:21 UTC 4,544 bytes, 128 lines download raw bytes

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.