1(function ($) { 2 "use strict"; 3 4 if ($(".cua-wp-detail-titre").length > 0) { 5 let titre = $(".cua-wp-detail-titre h1").text(); 6 $(".breadcrumb.colibri-breadcrumb li:last").remove(); 7 $(".breadcrumb.colibri-breadcrumb").append("<li class='breadcrumb-item'>" + titre + "</li>"); 8 let track = $(".splide__track"); 9 let trackWidth = track.width(); 10 $(".cua-wp-slide-li").css("width", "calc(" + trackWidth / 3 + " - 1em)"); 11 } 12 13 let spinnerEle = $("<div>").addClass("loader-box").css("display", "none").append($("<div>").addClass("lds-facebook").append("<div></div><div></div><div></div>")); 14 let spinnerElePage = $("<div>").addClass("loader").css("display", "none").append($("<div>").addClass("lds-facebook").append("<div></div><div></div><div></div>")); 15 /* 16 * Ajax 17 */ 18 let ajax = { 19 20 /** 21 * Default ajax function. 22 * 23 * @param url 24 * @param postData 25 * @param callback 26 * @param spinnerBlock 27 * @param async 28 */ 29 send: function (url, postData, callback, spinnerBlock, async = true) { 30 if (helpers.empty(spinnerBlock) || spinnerBlock === "main") { 31 spinnerBlock = $("main"); 32 } 33 $.post({ 34 url: url, 35 data: postData, 36 dataType: "json", 37 async: async, 38 beforeSend: function () { 39 // run the spinner 40 ajax.runSpinner(spinnerBlock); 41 }, 42 statusCode: { 43 44 200: function (data) { 45 46 if (!helpers.empty(spinnerBlock)) { 47 setTimeout(function () { 48 callback(data); 49 ajax.stopSpinner(spinnerBlock); 50 }, 200); 51 } else { 52 callback(data); 53 ajax.stopSpinner(spinnerBlock); 54 } 55 56 }, 57 0: function (data) { 58 callback({"error": "Connexion interrompue."}); 59 ajax.stopSpinner(spinnerBlock); 60 61 }, 62 401: function (data) { 63 callback({"error": "Vous êtes déconnecté de Comm'une Actu. Veuillez vous connecter pour effectuer cette action."}); 64 ajax.stopSpinner(spinnerBlock); 65 66 }, 67 404: function (data) { 68 callback({"error": "Page introuvable."}); 69 ajax.stopSpinner(spinnerBlock); 70 71 }, 72 400: function (data) { 73 callback({"error": "Demande invalide."}); 74 ajax.stopSpinner(spinnerBlock); 75 76 }, 77 403: function (data) { 78 callback({"error": "Opération non autorisée."}); 79 ajax.stopSpinner(spinnerBlock); 80 81 }, 82 500: function (data) { 83 callback({"error": "Erreur interne, opération impossible."}); 84 ajax.stopSpinner(spinnerBlock); 85 86 } 87 88 } 89 }); 90 }, 91 /** 92 * Ajax call - ONLY for files. 93 * 94 * 95 * @param url 96 * @param spinnerBlock 97 * @param fileData 98 * @param callback 99 */ 100 upload: function (url, fileData, callback, spinnerBlock) { 101 if (helpers.empty(spinnerBlock) || spinnerBlock === "main") { 102 spinnerBlock = $("main"); 103 } 104 105 $.ajax({ 106 url: url, 107 type: "POST", 108 data: helpers.appendCsrfToken(fileData), 109 contentType: false, 110 processData: false, 111 async: true, 112 beforeSend: function () { 113 // run the spinner 114 if (!helpers.empty(spinnerBlock)) { 115 ajax.runSpinner(spinnerBlock); 116 } 117 }, 118 statusCode: { 119 120 200: function (data) { 121 if (!helpers.empty(spinnerBlock)) { 122 setTimeout(function () { 123 callback(data); 124 ajax.stopSpinner(spinnerBlock); 125 126 }, 200); 127 } else { 128 callback(data); 129 ajax.stopSpinner(spinnerBlock); 130 } 131 }, 132 0: function (data) { 133 console.log("0", data.responseText); 134 callback({"error": "Connexion interrompue."}); 135 ajax.stopSpinner(spinnerBlock); 136 }, 137 401: function (data) { 138 console.log("401", data.responseText); 139 callback({"error": "Vous êtes déconnecté de Comm'une Actu. Veuillez vous connecter pour effectuer cette action."}); 140 ajax.stopSpinner(spinnerBlock); 141 }, 142 404: function (data) { 143 console.log("404", data.responseText); 144 callback({"error": "Page introuvable."}); 145 ajax.stopSpinner(spinnerBlock); 146 }, 147 400: function (data) { 148 console.log("400", data.responseText); 149 150 callback({"error": "Demande invalide."}); 151 ajax.stopSpinner(spinnerBlock); 152 }, 153 403: function (data) { 154 console.log("403", data.responseText); 155 callback({"error": "Opération non autorisée."}); 156 ajax.stopSpinner(spinnerBlock); 157 }, 158 500: function (data) { 159 console.log("500", data.responseText); 160 callback({"error": "Erreur interne, opération impossible."}); 161 ajax.stopSpinner(spinnerBlock); 162 } 163 164 } 165 }); 166 }, 167 runSpinner: function (spinnerBlock) { 168 let newSpinner = spinnerElePage.clone(); 169 if (helpers.empty(spinnerBlock) || spinnerBlock === "main") { 170 spinnerBlock = $("main"); 171 newSpinner = spinnerElePage.clone(); 172 } else { 173 newSpinner = spinnerEle.clone(); 174 } 175 if (spinnerBlock instanceof jQuery) { 176 spinnerBlock.each(function () { 177 $(this).css("position", "relative").append(newSpinner); 178 }); 179 } else { 180 $(spinnerBlock).each(function () { 181 $(this).css("position", "relative").append(newSpinner); 182 }); 183 } 184 185 $(newSpinner).show(); 186 187 }, 188 stopSpinner: function (spinnerBlock) { 189 190 setTimeout(function () { 191 192 if (helpers.empty(spinnerBlock) || spinnerBlock === "main") { 193 spinnerBlock = $("main"); 194 if (spinnerBlock instanceof jQuery) { 195 spinnerBlock.find(".loader").remove(); 196 } else { 197 $(spinnerBlock).find(".loader").remove(); 198 } 199 } else { 200 if (spinnerBlock instanceof jQuery) { 201 spinnerBlock.find(".loader-box").remove(); 202 } else { 203 $(spinnerBlock).find(".loader-box").remove(); 204 } 205 } 206 }, 200); 207 208 }, 209 }; 210 211 /* 212 * Helpers 213 * 214 */ 215 216 let helpers = { 217 218 tooltip: function () { 219 if (typeof $.fn.tooltip === 'function') { 220 $('[data-bs-toggle="tooltip"]').each(function (e) { 221 if ($(this).data("tooltip-container") !== undefined) { 222 $(this).tooltip({container: $(this).data("tooltip-container")}); 223 } else { 224 $(this).tooltip(); 225 } 226 }); 227 } 228 }, 229 scrollTo: function (target) { 230 231 let offset = $(".navbar.fixed-top").height() + 100; 232 $([document.documentElement, document.body]).animate({ 233 scrollTop: $(target).offset().top - offset 234 }, 500); 235 236 }, 237 modal: function (title, body, id, size, _class, autofooter) { 238 239 $(".modal, .modal-backdrop").each(function (e) { 240 $(this).remove(); 241 }); 242
243 if (helpers.empty(_class)) _class = "modal-primary"; 244 if (helpers.empty(size)) size = "modal-lg"; 245 let close = "Fermer"; 246 let footer = ""; 247 if (autofooter === 'false') { 248 footer = ""; 249 } else if (!helpers.empty(autofooter)) { 250 footer = '<div class="modal-footer">' + autofooter + '</div>'; 251 } else { 252 footer = '<div class="modal-footer text-center">' + 253 '<button class="btn btn-outline-default btn-sm" data-bs-dismiss="modal">' + 254 '<i class="fas fa-fw fa-times"></i> Fermer' + 255 '</button>' + 256 '</div>'; 257 } 258 259 260 let html = '' + 261 '<div id="' + id + '" class="modal ' + _class + ' fade" role="dialog">' + 262 ' <div class="modal-dialog ' + size + '">' + 263 ' <div class="modal-content">' + 264 ' <div class="modal-header">' + 265 ' <h4 class="modal-title">' + title + '</h4>' + 266 ' <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>' + 267 ' </div>' + 268 ' <div class="modal-body">' + body + '</div>' + 269 footer + 270 ' </div>' + 271 ' </div>' + 272 '</div>'; 273 274 $("body").append(html); 275 276 let myModal = document.getElementById(id); 277 let modal = new bootstrap.Modal(myModal); 278 myModal.addEventListener("shown.bs.modal", function (e) { 279 $("body").addClass("modal-open"); 280 helpers.tooltip(); 281 if ($(".datetimepicker").length > 0) helpers.dateTimePicker(); 282 }); 283 modal.show(); 284 285 }, 286 287 /** 288 * Checks if an element is empty(set to null or undefined) 289 * 290 * @return boolean 291 * 292 * @param foo 293 */ 294 empty: function (foo) { 295 return (foo === null || foo === '' || typeof (foo) === "undefined"); 296 }, 297 298 /** 299 * extends $().html() in jQuery 300 * 301 * @param target 302 * @param str 303 */ 304 html: function (target, str) { 305 $(target).html(str); 306 }, 307 308 /** 309 * extends $().after() in jQuery 310 * 311 * @param target 312 * @param str 313 */ 314 after: function (target, str) { 315 $(target).after(str); 316 }, 317 318 /** 319 * clears all error and success messages 320 * 321 * @param target 322 */ 323 clearMessages: function (target) { 324 325 if (helpers.empty(target)) { 326 $("div.error, .alert-error").remove(); 327 $("div.success, .alert-success").remove(); 328 } else { 329 $(target).find(".error").remove(); 330 $(target).find(".success").remove(); 331 $(target).find(".alert-error").remove(); 332 $(target).find(".alert-success").remove(); 333 $(target).nextAll(".error:eq(0)").remove(); 334 $(target).nextAll(".success:eq(0)").remove(); 335 } 336 }, 337 338 339 /** 340 * This function is used to redirect. 341 * 342 * @param location 343 */ 344 redirectTo: function (location) { 345 window.location.href = location; 346 }, 347 348 349 /** 350 * display error message 351 * 352 * 353 * @param targetBlock 354 * @param message 355 */ 356 displayError: function (targetBlock, message) { 357 358 helpers.clearMessages(targetBlock); 359 360 message = helpers.empty(message) ? "Une erreur inconnue s'est produite" : message; 361 362 if (null == targetBlock) { 363 364 if (message.includes("alert-danger")) { 365 return message; 366 } 367 // 2. display 368 let alert = $("<div>").addClass("alert alert-danger alert-dismissible fade show"); 369 let notation = $("<i>").addClass("fa fa-exclamation-circle"); 370 alert.append(notation); 371 alert.append(" " + message); 372 alert.append("<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>"); 373 return $("<div>").addClass("error").html(alert); 374 375 } else { 376 377 if (message.includes("alert-danger")) { 378 return $(targetBlock).prepend(message); 379 } 380 381 // 2. display 382 let alert = $("<div>").addClass("alert alert-danger alert-dismissible fade show"); 383 let notation = $("<i>").addClass("fa fa-exclamation-circle"); 384 alert.append(notation); 385 alert.append(" " + message); 386 alert.append("<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>"); 387 let error = $("<div>").addClass("error").html(alert); 388 $(targetBlock).prepend(error); 389 390 391 helpers.scrollTo(targetBlock); 392 } 393 394 }, 395 displaySuccess: function (targetBlock, message) { 396 397 // 1. clear 398 helpers.clearMessages(targetBlock); 399 400 message = helpers.empty(message) ? "Une erreur inconnue s'est produite" : message; 401 402 if (message.includes("alert-success")) { 403 return $(targetBlock).prepend(message); 404 } 405 406 // 2. display 407 let alert = $("<div>").addClass("alert alert-success"); 408 let notation = $("<i>").addClass("fa fa-exclamation-circle"); 409 alert.append(notation); 410 alert.append(" " + message); 411 alert.append("<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>"); 412 413 return $(targetBlock).prepend(alert); 414 415 }, 416 417 /** 418 * Validate the data coming from server side(PHP) 419 * 420 * The data coming from PHP should be something like this: 421 * data = [error = "some html code", success = "some html code", data = "some html code", redirect = "link"]; 422 * 423 * @return boolean 424 * @param result 425 * @param targetBlock 426 * @param errorFunc 427 * @param errorType 428 * @param returnVal 429 */ 430 validateData: function (result, targetBlock, errorFunc, errorType, returnVal) { 431 432 // 1. clear all existing error or success messages 433 helpers.clearMessages(targetBlock); 434 435 // 2. Define and extend jQuery functions required to display the error. 436 if (errorFunc === "html") errorFunc = helpers.html; 437 else if (errorFunc === "after") errorFunc = helpers.after; 438 else errorFunc = helpers.html; 439 440 // 3. check if result is empty 441 if (helpers.empty(result)) { 442 helpers.displayError(targetBlock); 443 return false;
444 } 445 446 // If there was a redirection 447 else if (!helpers.empty(result.redirect)) { 448 helpers.redirectTo(result.redirect); 449 return false; 450 } 451 452 // If there was errors encountered and sent from the server, then display it 453 else if (!helpers.empty(result.error)) { 454 455 if (errorType === "default" || helpers.empty(errorType)) { 456 errorFunc(targetBlock, result.error); 457 } else if (errorType === "row") { 458 let td = $("<td>").attr("colspan", "5"); 459 errorFunc(targetBlock, $(td).html(result.error)); 460 } 461 462 return false; 463 } else { 464 465 if (returnVal === "success" && helpers.empty(result.success)) { 466 helpers.displayError(targetBlock); 467 return false; 468 } else if (returnVal === "data" && helpers.empty(result.data)) { 469 helpers.displayError(targetBlock); 470 return false; 471 } else if (returnVal !== "data" && returnVal !== "success") { 472 helpers.displayError(targetBlock); 473 return false; 474 } 475 } 476 477 return true; 478 }, 479 480 validateURL: function (url) { 481 return /^((http|https):\/\/)(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(url); 482 }, 483 484 toggle: function () { 485 if (typeof $.fn.bootstrapToggle === 'function') { 486 487 $("input[data-toggle=toggle]").each(function (e) { 488 let target = $(this); 489 if (!target.parent().hasClass("toggle")) { 490 target.bootstrapToggle(); 491 } 492 }); 493 } 494 }, 495 496 497 }; 498 499 500 $("body").on("submit", ".agenda-filter", function (e) { 501 e.preventDefault(); 502 let form = $(this); 503 let btnForm = form.find("[type=submit]"); 504 $(".cua-list-events").attr("aria-busy", true); 505 ajax.send( 506 cuaAgendaOption.ajax_url, 507 { 508 action: "filterAgenda", 509 date_debut: $(this).find('input[name=date_debut]').val(), 510 date_fin: $(this).find('input[name=date_fin]').val(), 511 }, 512 function (result) { 513 form.closest(".cua-wp-agenda").find(".cua-list-events").html(result.data.list).removeAttr("aria-busy"); 514 $(".agenda-filter .controls button").removeAttr("aria-pressed").find("i").attr("class", "fa fa-square"); 515 btnForm.attr("aria-pressed", true) 516 $(".cua-list-events .cua-wp-agenda-event:first-of-type").attr("tabindex", -1).focus(); 517 }, 518 form.closest(".cua-wp-agenda").find(".cua-list-events"), 519 ); 520 521 }) 522 .on("click", ".agenda-filter .controls button", function (e) { 523 e.preventDefault(); 524 let btn = $(this); 525 let form = btn.closest("form"); 526 let btnForm = form.find("[type=submit]"); 527 528 $(".cua-list-events").attr("aria-busy", true); 529 ajax.send( 530 cuaAgendaOption.ajax_url, 531 {action: "filterAgenda", filter: $(this).data("filter")}, 532 function (result) { 533 form.closest(".cua-wp-agenda").find(".cua-list-events").html(result.data.list).removeAttr("aria-busy"); 534 $(".agenda-filter .controls button").removeAttr("aria-pressed").find("i").attr("class", "fa fa-square"); 535 btn.attr("aria-pressed", true).find("i").toggleClass(["fa-square-check","fa-square"]); 536 btnForm.removeAttr("aria-pressed"); 537 $(".cua-list-events .cua-wp-agenda-event:first-of-type").attr("tabindex", -1).focus(); 538 539 }, 540 form.closest(".cua-wp-agenda").find(".cua-list-events"), 541 ); 542 }) 543 544}(jQuery))
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.