function message(type, texte) { $.notify( "   "+texte, {pos:"top-right", timeout:10000} ); } function showSpinner(message) { $('#spinner').show(); if (message) { $("#spinner .spinner-message").remove(); $("#spinner .spinner").prepend("
" + message + "
"); } } function hideSpinner() { $('#spinner').hide(); $("#spinner .spinner-message").remove(); } function copyText(text, msg) { navigator.clipboard.writeText(text); message('success', msg) } function filter(val, named, isNull) { if (typeof(isNull) === "undefined") isNull = val != ''; deletePage(); reg = new RegExp("/"+named+":[^/]*","g"); url = window.urlPage.replace(reg, ''); url = url+(isNull ? "/"+named+":"+protectChars(val) : ''); refreshPageAjax(url); } function refreshPageAjax(url, params) { showSpinner(); url = typeof(url) == 'undefined' ? window.urlPage : url; params = typeof(params) == 'undefined' ? {} : params; $.ajax({ url: url, type: 'POST', data: params, dataType:"html", evalScripts:true, error:function (data, textStatus) { window.location.href = '/fr/login'; }, success:function (data, textStatus) { $("#PageContainer").html(data); ProjectEventsManager.notify("onContentLoaded"); } }); } function deletePage() { var reg = new RegExp("/page:[0-9]+","g"); window.urlPage = window.urlPage.replace(reg, ''); } function protectChars(val) { val = val.replace(/\//g, "-"); return val; } var ProjectEventsManager = { events: {}, attach: function(eventName, listener) { if (typeof this.events[eventName] == "undefined") this.events[eventName] = []; this.events[eventName].push(listener); }, notify: function(eventName) { if (typeof this.events[eventName] == "undefined") return; for (var i in this.events[eventName]) { this.events[eventName][i](); } } }; function spinnerForPagination() { ProjectEventsManager.attach("onContentLoaded", function(){ $(".pagination li:not(.active) a").click(function(){ showSpinner(); }); hideSpinner(); }); } function bindSearchFields() { ProjectEventsManager.attach("onContentLoaded", function(){ $("#PageContainer input[data-search]").each(function(){ var self = this; $(self).closest("form").submit(function(){ return false; }); var $btn = $("#PageContainer " + $(self).data("onsubmitbtn")); var callback = function(){ filter($(self).val(), $(self).data("search")); }; $btn.click(function(){ callback(); }); $(self).keypress(function(event){ if (event.keyCode == 13) callback(); }); }); }); } function bindDatePickerRange(time, dateLimit = false) { if (!$.fn.daterangepicker) return; $(".daterange-field").each(function(){ var self = this; var maxDate = null; if ($(self).data('maxDate') === 'delay') { maxDate = moment().subtract(2, 'minutes').toDate(); } else if ($(self).data('maxDate') !== 'disable') { maxDate = moment(); } $(self).daterangepicker({ timePicker: time, timePicker24Hour: time, applyClass: 'btn-primary btn-rounded pl-5 pr-5', locale: { format: $(self).data("format"), applyLabel: ProjectTranslate.apply, cancelLabel: ProjectTranslate.cancel, fromLabel: ProjectTranslate.from, toLabel: ProjectTranslate.to, customRangeLabel: ProjectTranslate.customRange, weekLabel: ProjectTranslate.week, daysOfWeek: [ ProjectTranslate.sunday, ProjectTranslate.monday, ProjectTranslate.tuesday, ProjectTranslate.wenesday, ProjectTranslate.thursday, ProjectTranslate.friday, ProjectTranslate.saturday ], monthNames: [ ProjectTranslate.january, ProjectTranslate.february, ProjectTranslate.march, ProjectTranslate.april, ProjectTranslate.may, ProjectTranslate.june, ProjectTranslate.july, ProjectTranslate.august, ProjectTranslate.september, ProjectTranslate.october, ProjectTranslate.november, ProjectTranslate.december ] }, alwaysShowCalendars: true, maxDate: maxDate, dateLimit: dateLimit }).on("apply.daterangepicker", function(event, picker){ var callback = $(self).data("onvalidate"); if (window.hasOwnProperty(callback) && window[callback] != null) window[callback](picker); }); $(self).siblings('.fa-caret-down').click(function () { $(self).data('daterangepicker').show(); }) }); } function filterRangeDates(picker) { deletePage(); var reg = new RegExp("(/startdate:[^/]*|/enddate:[^/]*)","g") var url = urlPage.replace(reg, ''); var reg = new RegExp("(/startdate:)", "g"); url = url.replace(reg, ''); var startdate = picker.startDate.format(picker.locale.format); var enddate = picker.endDate.format(picker.locale.format); refreshPageAjax(url+"/startdate:" + (startdate ? protectChars(startdate) : "") + "/enddate:" + (enddate ? protectChars(enddate) : "")); } function filterDateperiod(period) { filter(period, 'dateperiod'); } function filterDaterange(startdate, enddate) { deletePage(); var reg = new RegExp("(/startdate:[^/]*|/enddate:[^/]*)","g") var url = urlPage.replace(reg, ''); var reg = new RegExp("(/startdate:)", "g"); url = url.replace(reg, ''); refreshPageAjax(url+"/startdate:" + (startdate ? protectChars(startdate) : "") + "/enddate:" + (enddate ? protectChars(enddate) : "")); } /** * Permet dans une popin de fermer celle ci pour en ouvrir une autre à la place * @param callback */ function togglePopupVisibility(callback) { $(".modal").each(function(){ if ($(this).is(":visible")) { $("#" + $(this).attr("id")).modal("hide"); var mainListener = setInterval(function(){ if ($(".modal-backdrop").length == 0) { clearInterval(mainListener); callback(); } }, 100); } }); } /** @function bindSelect2 * @description Initialize select2 dropdown * @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context. * @requires select2.js version 4.0.x */ function bindSelect2(context) { ProjectEventsManager.attach("onContentLoaded", function(){ $.fn.select2 && $('[data-init-plugin="select2"]', context).each(function() { let select2Options = $(this).data('options') ? $(this).data('options') : {}; if (!select2Options.width) {select2Options.width = '100%';} select2Options.minimumResultsForSearch = ($(this).attr('data-disable-search') == 'true' ? -1 : 1); $(this).select2(select2Options).on('select2:open', function() { $.fn.scrollbar && $('.select2-results__options').scrollbar({ ignoreMobile: false }) }); }); }); } function bindDatePicker(language = null) { if (!$.fn.datepicker) { return; } if (language && language.length === 3) { switch (language) { case 'spa': language = 'es'; break; case 'nld': language = 'nl'; break; case 'eng': language = 'en'; break; default: language = 'fr'; } } $('.datepicker-field').each(function () { let self = this; let options = {}; if ($(self).data('pickerType') === 'month') { options = { format: 'MM yyyy', //affiche la sélection par mois startView: 1, //bloque le plus petit affichage à la sélection par mois minViewMode:1, //bloque le plus grand affichage à la sélection par année maxViewMode:1, language: language ?? 'fr', autoclose: true, clearBtn: true } } if ($(self).data('orientation')) { options.orientation = $(self).data('orientation'); } if ($(self).data('minDate')) { options.startDate = new Date($(self).data('minDate')); } if ($(self).data('maxDate')) { options.endDate = new Date($(self).data('maxDate')); } if ($(self).data('formatDisplay')) { options.format = $(self).data('formatDisplay'); } if ($(self).data('startView')) { options.format = $(self).data('startView'); } if ($(self).data('minViewMode')) { options.format = $(self).data('minViewMode'); } if ($(self).data('maxViewMode')) { options.format = $(self).data('maxViewMode'); } if ($(self).data('language')) { options.format = $(self).data('language'); } if ($(self).data('btnClear') !== undefined) { options.clearBtn = $(self).data('btnClear'); } $(self).datepicker( options ) //on le set avant de mettre en place le listener pour éviter une boucle infinie if ($(self).val()) { $(self).datepicker('setDate', new Date($(self).val())); } $(self).on('changeDate', function (event) { let formatReturned = $(self).data('formatReturned') ? $(self).data('formatReturned') : 'yy-mm-dd'; let date = $.datepicker.formatDate(formatReturned, event.date); let callback = $(self).data("onchange"); if (window.hasOwnProperty(callback) && window[callback] != null) { window[callback](date); } }).on('clearDate', function (event) { let callback = $(self).data("oncancel"); if (window.hasOwnProperty(callback) && window[callback] != null) { window[callback](''); } }); $(self).siblings('.fa-caret-down').click(function () { $(self).datepicker('show'); }) }); } $(function(){ spinnerForPagination(); bindSearchFields(); bindSelect2(); ProjectEventsManager.notify("onContentLoaded"); }); function testStrength(password, dob = null, displayMessage = true) { if (password.length != 6) return false; let strength; $.ajax({ url: "/checkpassword", async: false, dataType: "json", type: "post", data: { password: password, dob: dob }, }).done(function(response){ strength = response.success; if (displayMessage) { message(response.success ? "success" : "error", response.message); } }); return strength; } function disableAutocomplete() { if (/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())) $('input[autocomplete="off"]').prop('autocomplete', 'none'); } String.prototype.sansAccent = function(){ var accent = [ /[\300-\306]/g, /[\340-\346]/g, // A, a /[\310-\313]/g, /[\350-\353]/g, // E, e /[\314-\317]/g, /[\354-\357]/g, // I, i /[\322-\330]/g, /[\362-\370]/g, // O, o /[\331-\334]/g, /[\371-\374]/g, // U, u /[\321]/g, /[\361]/g, // N, n /[\307]/g, /[\347]/g, // C, c ]; var noaccent = ['A','a','E','e','I','i','O','o','U','u','N','n','C','c']; var str = this; for(var i = 0; i < accent.length; i++){ str = str.replace(accent[i], noaccent[i]); } return str; } const regexCity = /^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd} '/()-]*$/u; const regexCityInverse = /[^\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd} '/()-]/gu; const regexZip = /^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd} ()\/-]*$/u; const regexZipInverse = /[^\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd} ()\/-]/gu; const regexAddress = /^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd} .,&'\/()-]*$/u; const regexAddressInverse = /[^\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd} .,&'\/()-]/gu; function checkFormPartValidity(parentSelector) { let isValid = true; $(parentSelector + ' ' + '.validate-input').each(function (i, el) { if (!el.checkValidity() || (el.hasAttribute('required') && !el.value.trim())) { $(el).parents('.form-group').addClass('has-error'); isValid = false; } }) return isValid; } function callAjax(url, data, onSuccess, options = {}, onError, onAlways, displaySpinner = true) { let defaults = { type: "post", dataType: "json" }; if (displaySpinner) { showSpinner(); } $.ajax(Object.assign(defaults, options, { url: url, data: data, })).done(function(response){ if (response.hasOwnProperty('message')) { if (response.hasOwnProperty('alreadySent')) { message('error', response.message); } else { message(response.success ? 'success' : 'error', response.message); } } if (onSuccess != null && onSuccess instanceof Function) { onSuccess(response); } }).fail(function(err){ if (err.status === 403) { message('error', ProjectTranslate.expiredSession ?? 'Session expired'); window.location.reload(); } if (onError != null && onError instanceof Function) { onError(err); } else { hideSpinner(); message('error', ProjectTranslate.errorAjax ?? 'An error occured'); } }).always(function (response) { if (onAlways != null && onAlways instanceof Function) { onAlways(response); } }); }