PageSourceSearch

https://www.quebec.ca/_assets/8b5470729627060287ec80151aeaf598/JavaScript/Src/parsley-config.js?1790696784

js quebec.ca collected 2026-10-01 07:14:47 UTC 9,814 bytes, 248 lines download raw bytes

1
2$(document).ready(function() {
3
4  /* Détecter s'il y a un formulaire powermail et obtenir son ID */
5  var targetNode = "";
6  if($("form.powermail_form").length){
7    var idForm = $("form.powermail_form").first().attr("id");
8    targetNode = document.getElementById(idForm);
9  }
10
11  /* Détecter un ajout HTML dans le formulaire de bas de page et ajouter l'alerte sur la première erreur */
12  if(targetNode!=""){
13    var config = { attributes: true, childList: true, subtree: true, characterData: true };
14    var callback = function(mutationsList, observer) {
15      mutationsList.forEach(function(mutation) {
16        //for(var mutation of mutationsList) {
17        // Éléments enfants du formulaire de bas de page
18        if (mutation.type == 'childList') {
19          // Faire le tour des éléments ajoutés simultanément.
20          // Vérifier si c'est un ajout sur un input différent du submit et de ne pas l'ajouter une seconde fois sur le même champ ou dans le formulaire.
21          for (var i = 0; i < mutation.addedNodes.length; i++) {
22            if(mutation.target.id != "" && mutation.target.id != undefined){
23              if($('#'+mutation.target.id+' input[type="submit"]').length == 0){
24                if($('#'+mutation.target.id+'li:not([role])') && $('.powermail_form ul li[role="alert"]').length == 0 ){
25                  $("#"+mutation.target.id+" li").attr("role", "alert");
26                }
27                $("#"+mutation.target.id+" li").first().attr("id", mutation.target.id+"_li");
28              }
29            }
30          }
31          // Faire le tour des éléments supprimés simultanément.
32          // Si l'erreur a été corrigée, enlever l'alerte et la transposer sur une autre erreur
33          for (var i = 0; i < mutation.removedNodes.length; i++) {
34            if(mutation.target.id != "" && mutation.target.id != undefined){
35              if($('#'+mutation.target.id+' input[type="submit"]').length == 0){
36                $("#"+mutation.target.id).removeAttr("role");
37                // Une fois supprimée, l'alerte est ajoutée à une autre erreur, s'il en reste.
38                if($('.powermail_form ul[class^="parsley-errors"]').length >0){
39                  if($('.powermail_form ul[class^="parsley-errors"]:first li').attr("id")==mutation.target.id){
40                    $('.powermail_form ul[class^="parsley-errors"]:nth-child(2) li').attr("role", "alert");
41                  }else{
42                    $('.powermail_form ul[class^="parsley-errors"]:first li').attr("role", "alert");
43                  }
44                }
45              }
46            }
47          }
48        }
49      });
50    };
51
52    // Créer l'objeet MutationObserver pour écouter les changements (ajouts/suppressions) dans le DOM.
53    var observer = new MutationObserver(callback);
54    observer.observe(targetNode, config);
55  }
56});
57
58
59/* Parsley : librairie JS pour valider les champs d'un formulaire
60   Événement sur le succès d'un seul champ (à l'envoi ou lorsqu'on corrige)
61   Effacer les aria-describedby au moment qu'il y a un "success"
62*/
63window.Parsley && window.Parsley.on('field:success', function() {
64  var idField = this.$element[0].id;
65  var errorId;
66  var radioBtnCheckBox=0;
67  var valeurAttribut;
68  var arrayAriaDescribedby;
69
70  if($("#"+idField).attr("id").length > 0){
71    $("#"+idField).removeAttr("aria-invalid");
72
73    errorId = getErrorId(idField);
74    radioBtnCheckBox = getBtnRadioCheckBox(idField);
75
76    // Supprimer les waiarias pour chaque choix d'un groupe de boutons radio [checkbox???]
77    if(radioBtnCheckBox >0){
78      radioExistant = true;
79      nomIdBase = idField.substring(0,idField.length-1);
80      for(i=1; radioExistant==true; i++){
81        if($('#'+nomIdBase+i).length){
82          boolAttrExiste = attributeExiste(nomIdBase+i, "aria-describedby");
83          if(boolAttrExiste==true){
84            $("#"+ nomIdBase+i).removeAttr("aria-describedby");
85          };
86        }else{
87          radioExistant=false;
88        };
89      };
90    }else{
91      // Supprimer les waiarias du input. S'il y a plus d'une valeur dans le aria-describedby, on conserve ceux qui ne sont pas liés à l'erreur.
92      boolAttrExiste = attributeExiste(idField, "aria-describedby");
93      if(boolAttrExiste==true){
94        valeurAttribut = $("#"+idField).attr('aria-describedby');
95        if(valeurAttribut != undefined && valeurAttribut != errorId){
96          arrayAriaDescribedby = valeurAttribut.split(" ");
97          nouvelleValeur="";
98          $.each(arrayAriaDescribedby, function(index, value){
99            if(value != errorId+"_li"){
100              nouvelleValeur = nouvelleValeur!="" ? nouvelleValeur+" "+value : value;
101            }
102          });
103          $("#"+idField).attr("aria-describedby",nouvelleValeur);
104        }else{
105          $("#"+idField).removeAttr("aria-describedby");
106        }
107      };
108    };
109  };
110  // Enlever le ul vide lorsqu'il n'y a plus d'erreur
111  if(errorId != undefined){
112    $( "#"+errorId ).remove();
113  }
114});
115
116
117/* Parsley : librairie JS pour valider les champs d'un formulaire
118   Événement sur le l'échec d'un seul champ (à l'envoi ou lorsqu'on modifie suite à un premier envoi)
119   Ajouter en texte caché le mot erreur à tous les messages d'erreurs et ajouter du aria-describedby aux champs en erreur
120*/
121
122window.Parsley && window.Parsley.on('field:error', function() {
123  var idField = this.$element[0].id;
124  var errorContainer = $("#"+idField).attr("data-parsley-errors-container");
125  var idParsley = $("#"+idField).attr("data-parsley-id");
126  var textLang = "Erreur";
127  var errorId;
128  var radioBtnCheckBox=0;
129  var radioExistant=true;
130
131  if($("#loader")){
132    $("#loader").addClass("d-none");
133  }
134
135  errorId = getErrorId(idField);
136  radioBtnCheckBox = getBtnRadioCheckBox(idField);
137  errorIdLi = errorId+"_li"
138
139  if (this.$element[0].validationResult !== true) {
140    // Ajouter les waiarias pour chaque choix d'un groupe de boutons radio/checkbox
141    if(radioBtnCheckBox >0){
142      radioExistant = true;
143      premierRadio = $("#"+idField).attr('id');
144      nomIdBase = premierRadio.substring(0,premierRadio.length-1);
145      for(i=1; radioExistant==true; i++){
146        if($('#'+nomIdBase+i).length){
147          $('#'+nomIdBase+i).attr('aria-describedby',errorIdLi);
148        }else{
149          radioExistant=false;
150        };
151      };
152      // Supprimer les waiarias pour le input. S'il y a plus d'une valeur dans le aria-describedby, on conserve ceux qui ne sont pas liés à l'erreur.
153    }else{
154      if($("#"+idField).attr('aria-describedby') != undefined && $("#"+idField).attr('aria-describedby') != errorIdLi){
155        ancienneValeur = $("#"+idField).attr('aria-describedby')+" "+errorIdLi;
156        if($("#"+idField).attr('aria-describedby').indexOf(errorIdLi) == -1){
157          $("#"+idField).attr('aria-describedby', ancienneValeur);
158        }
159      }else{
160        $("#"+idField).attr('aria-describedby',errorIdLi);
161      }
162    };
163  };
164  $("#"+idField).attr("aria-invalid","true");
165
166  // Ajouter le texte caché Erreur/Error pour l'accessibilité
167  if(document.documentElement.lang=="en"){
168    textLang = "Error";
169  }
170  if(errorContainer != undefined){
171    $(errorContainer+" ul li").prepend("<span class='visuallyHidden'>"+textLang+"</span> ");
172  }else{
173    $("#parsley-id-"+idParsley+" li").prepend("<span class='visuallyHidden'>"+textLang+"</span> ");
174  }
175});
176
177
178// validation JS du poids de tous les fichiers pour un attribut multiple
179if($("input[multiple='multiple'][type='file']").length){
180
181  $("input[multiple='multiple'][type='file']").each(function( index ) {
182    valeurFileMax =  $( this ).attr("data-powermail-powermailfilesize");
183    $( this ).attr("data-parsley-multiplefilesize",valeurFileMax);
184
185    /* Si la variable a été ajouté à la page par un tt_content TS */
186    if (typeof multiFichierMessage !== 'undefined') {
187      valeurFileMaxErreur = multiFichierMessage;
188    }else{
189      valeurFileMaxErreur =  $( this ).attr("data-powermail-powermailfilesize-message");
190    }
191    $( this ).attr("data-parsley-multiplefilesize-message",valeurFileMaxErreur);
192  });
193
194  var getMaxFileSizeMultiple = function($field, maxUploadSize) {
195    var field = $field.get(0);
196    var totalSize =0;
197    for (var i = 0; i < field.files.length; i++) {
198      var file = field.files[i];
199      if(file.size > maxUploadSize){
200        // Si un seul fichier est plus lourd que le maximum, c'est l'autre listener qui affichera le même message d'erreur
201        return 0;
202      }else{
203        totalSize = totalSize + file.size;
204      }
205
206    }
207    return parseInt(totalSize);
208  }
209  window.Parsley && window.Parsley
210    .addValidator('multiplefilesize', function(value, requirement) {
211      if (requirement.indexOf(',') !== -1) {
212        var requirements = requirement.split(',');
213        var maxUploadSize = parseInt(requirements[0]);
214        var $this = $('*[name="tx_powermail_pi1[field][' + requirements[1] + '][]"]');
215        if ($this.length) {
216          if (getMaxFileSizeMultiple($this,maxUploadSize) > maxUploadSize) {
217            return false;
218          }
219        }
220      }
221
222      // pass test if problems
223      return true;
224    }, 32)
225    .addMessage('en', 'multiplefilesize', 'Error');
226}
227
228/**
229 * Corriger un bug IOS :
230 * à l'envoi d'un formulaire powermail, pas de focus sur les champs en erreur et pas de scroll vers le champ
231 **/
232window.Parsley && window.Parsley.on('form:validate', function (form) {
233  if (!form.isValid()) {
234    for (var n = 0; n < form.fields.length; n++) {
235      if (form.fields[n].validationResult !== true) {
236        if (window.navigator.userAgent.match(/iphone|ipad|Mac|iPod/i)) {
237          window.setTimeout(function () {
238            $("html,body").animate({
239              scrollTop: $(form.fields[n].$element[0]).offset().top - 300
240            });
241          }, 0);
242        }
243        break;
244      }
245    }
246  }
247});
248

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.