|
@@ -25,6 +25,7 @@
|
|
|
|
|
|
//Affiche un message 'message' de type 'type' pendant 'timeout' secondes
|
|
|
$.message = function (type,message,timeout){
|
|
|
+ message = message.replace(/<\/?[script|iframe|object][^>]*>/gim,'');
|
|
|
$.toast({ type: type, content: message, timeout: timeout });
|
|
|
}
|
|
|
|
|
@@ -37,7 +38,7 @@
|
|
|
timeout: 3000
|
|
|
};
|
|
|
var o = $.extend(defaults, options);
|
|
|
- var css = "word-wrap:break-word;color:#ffffff;display:none;border-radius:1px;margin-bottom:10px;text-align:center;width:100%;box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.3);position:relative;";
|
|
|
+ var css = "word-wrap:break-word;color:#ffffff;border-radius:1px;margin-bottom:10px;text-align:center;width:100%;box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.3);position:relative;";
|
|
|
var types = {
|
|
|
error: { css: "background:#dc2626;", icon: 'fas fa-exclamation-triangle' },
|
|
|
warning: { css: "background:#ffc107;color:#212529;", icon: 'fas fa-exclamation-circle' },
|
|
@@ -52,7 +53,7 @@
|
|
|
|
|
|
var popupContainer = $('.toastContainer');
|
|
|
|
|
|
- var popup = $('<div style="' + css + '" class="noPrint toast-'+o.type+'"><i class="toastRemove fas fa-times" style="position:absolute;top:5px;right:5px;display:none;cursor:pointer;" onclick="$(this).parent().remove();"; style="position:absolute;top:5px;right:5px;cursor:pointer;"></i><h1 class="toastTitle" style="margin:0;padding:10px;"></h1><i class="toastIcon" style="display:inline-block;vertical-align:top;width:30px;font-size:20px;margin:15px 0;"></i><p style="display: inline-block;margin-top: 10px;padding:0 10px 0 10px;width:300px;" class="toastContent"></p><div style="clear:both;"></div></div>');
|
|
|
+ var popup = $('<div style="' + css + '" class="noPrint toast-'+o.type+'"><i class="toastRemove fas fa-times hidden" style="position:absolute;top:5px;right:5px;cursor:pointer;" onclick="$(this).parent().remove();"; style="position:absolute;top:5px;right:5px;cursor:pointer;"></i><h1 class="toastTitle" style="margin:0;padding:10px;"></h1><i class="toastIcon" style="display:inline-block;vertical-align:top;width:30px;font-size:20px;margin:15px 0;"></i><p style="display: inline-block;margin-top: 10px;padding:0 10px 0 10px;width:300px;" class="toastContent"></p><div style="clear:both;"></div></div>');
|
|
|
$(popupContainer).append(popup);
|
|
|
if (o.title) $('.toastTitle', popup).html(o.title);
|
|
|
$('.toastIcon', popup).attr('class', o.icon);
|
|
@@ -60,12 +61,12 @@
|
|
|
if (!o.title) $('.toastTitle', popup).remove();
|
|
|
|
|
|
$('.toastContent', popup).html(o.content);
|
|
|
- popup.fadeIn();
|
|
|
+ popup.removeClass('hidden');
|
|
|
|
|
|
if (o.timeout != 0) {
|
|
|
- setTimeout(function () { popup.fadeOut(); }, o.timeout);
|
|
|
+ setTimeout(function () { popup.addClass('hidden'); }, o.timeout);
|
|
|
} else {
|
|
|
- popup.find('.toastRemove').show();
|
|
|
+ popup.find('.toastRemove').removeClass('hidden');
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -118,7 +119,7 @@
|
|
|
|
|
|
$.action = function(data,success,error,progress) {
|
|
|
var formData = new FormData();
|
|
|
- var defaultSuccess = data.defaultSuccess !== undefined ? data.defaultSuccess : true;
|
|
|
+ var defaultSuccess = data.defaultSuccess != undefined ? data.defaultSuccess : true;
|
|
|
// if(data.defaultSuccess !== undefined) delete data.defaultSuccess;
|
|
|
|
|
|
//hasFile determine si un fichier uploadé se trouve dans le tableau des data
|
|
@@ -135,6 +136,7 @@
|
|
|
if(response && !response.error){
|
|
|
if(success!=null)success(response);
|
|
|
} else {
|
|
|
+ if(response.errorCode && response.errorCode=='401') window.location = 'action.php?action=logout';
|
|
|
var errorMessage = 'ERREUR : '+"\n"+response.error;
|
|
|
if(response.trace) errorMessage += "\n<div style='font-size:10px;max-height:200px;overflow:auto;text-align:left;'>"+response.trace+"</div>";
|
|
|
if(defaultSuccess) $.message('error',errorMessage,0);
|
|
@@ -143,13 +145,15 @@
|
|
|
},
|
|
|
error : function(response){
|
|
|
if(response.status == 200 && $.localhost() ){
|
|
|
- $('body').append('<div class="debugFrame" style="box-shadow: 0px 0px 10px rgba(0,0,0,0.5);z-index: 10001;padding: 5px;position: fixed;left: 0;top: 0;width: 40%;min-height: 100%;border-right: 2px solid #ff3b00;background: rgba(210, 222, 255, 0.9);overflow-y: auto;height: 100%;"><h3>Action debug</h3> <i style="position:absolute; right:10px; top:10px;font-size:1.5em;" onclick="$(this).parent().remove()" class="fas fa-times pointer"></i>'+response.responseText+'</div>');
|
|
|
+ $('body').append('<div class="debugFrame" style="box-shadow: 0px 0px 10px rgba(0,0,0,0.5);z-index: 10001;padding: 5px;position: fixed;left: 0;top: 0;width: 40%;min-height: 100%;border-right: 2px solid #ff3b00;background: rgba(210, 222, 255, 0.9);overflow-y: auto;height: 100%; word-break: break-word;"><h3>Action debug</h3> <i style="position:absolute; right:10px; top:10px;font-size:1.5em;" onclick="$(this).parent().remove()" class="fas fa-times pointer"></i>'+response.responseText+'</div>');
|
|
|
} else {
|
|
|
if(response.readyState == 0 && error==null) return;
|
|
|
- if(error!=null)
|
|
|
+ if(error!=null){
|
|
|
+ if(response.errorCode && response.errorCode=='401') window.location = 'action.php?action=logout';
|
|
|
error(response);
|
|
|
- else
|
|
|
+ }else{
|
|
|
$.message('error','Erreur indefinie, merci de contacter un administrateur',0);
|
|
|
+ }
|
|
|
}
|
|
|
},
|
|
|
xhr: function() {
|
|
@@ -436,7 +440,8 @@ $.fn.extend({
|
|
|
clear: function (){
|
|
|
return this.each(function() {
|
|
|
var obj = $(this);
|
|
|
- obj.find('input,select,textarea').val('');
|
|
|
+ obj.find('input,select,textarea').val('').prop('checked',false).prop('selected',false);
|
|
|
+
|
|
|
});
|
|
|
},
|
|
|
|
|
@@ -473,7 +478,7 @@ $.fn.extend({
|
|
|
for(var key in rows){
|
|
|
var line = $(Mustache.render(tpl,rows[key]));
|
|
|
container.append(line);
|
|
|
- line.show();
|
|
|
+ line.removeClass('hidden');
|
|
|
}
|
|
|
|
|
|
|
|
@@ -487,36 +492,42 @@ $.fn.extend({
|
|
|
var obj = $(this);
|
|
|
var model = null;
|
|
|
var container = null;
|
|
|
-
|
|
|
- option = $.extend({showItems:true},option);
|
|
|
+ option = $.extend({
|
|
|
+ showing : function(item){
|
|
|
+ //permet la personnalisation de l'apparition des lignes ( removeClass('hidden') par defaut)
|
|
|
+ item.removeClass('hidden');
|
|
|
+ }
|
|
|
+ },option);
|
|
|
var preloader = null;
|
|
|
+
|
|
|
+
|
|
|
if(option.preloader){
|
|
|
var preloader = $(option.preloader);
|
|
|
preloader.css('position','absolute');
|
|
|
preloader.css('left',(obj.offset().left+obj.width()/2)+'px');
|
|
|
preloader.css('top',(obj.offset().top+30)+'px');
|
|
|
$('body').append(preloader);
|
|
|
-
|
|
|
}
|
|
|
|
|
|
+
|
|
|
if(obj.prop("tagName") == 'UL'){
|
|
|
container = obj;
|
|
|
model = container.find('li:first-child');
|
|
|
- container.children('li:not(.hidden)').remove();
|
|
|
+ if(!option.export) container.children('li:visible').remove();
|
|
|
} else if(obj.prop("tagName") == 'TABLE'){
|
|
|
container = obj.find('tbody');
|
|
|
model = container.find('tr:first-child');
|
|
|
- container.children('tr:visible').remove();
|
|
|
+ if(!option.export) container.children('tr:visible').remove();
|
|
|
} else if(obj.prop("tagName") == "SELECT"){
|
|
|
container = obj;
|
|
|
model = container.find('option[value*="{{"]');
|
|
|
if(model.length==0) model = $('<option class="hidden" value="{{value}}">{{label}}</option>');
|
|
|
- container.find('option:not([value*="{{"])').remove();
|
|
|
+ if(!option.export) container.find('option:not([value*="{{"])').remove();
|
|
|
} else{
|
|
|
container = obj;
|
|
|
childName = container.children().get(0).nodeName;
|
|
|
model = container.find(childName+':first-child');
|
|
|
- container.find(childName+':visible:not(.nofill)').remove();
|
|
|
+ if(!option.export) container.find(childName+':visible:not(.nofill)').remove();
|
|
|
}
|
|
|
var tpl = model.get(0).outerHTML;
|
|
|
|
|
@@ -531,32 +542,97 @@ $.fn.extend({
|
|
|
|
|
|
tpl = tpl.replace(/(data-style)/g, 'style');
|
|
|
|
|
|
- $.action(option,function(r){
|
|
|
+ if(option.export)
|
|
|
+ option.downloadResponse = true;
|
|
|
+
|
|
|
+ //on clone l'objet option pour ne transmettre que des datas utiles
|
|
|
+ data = $.extend({},option);
|
|
|
+ delete data.showing;
|
|
|
+
|
|
|
+ $.action(data,function(r){
|
|
|
+ //On ne gere la pagination et l'affichage tableau que si on est pas en mode export
|
|
|
+ if(!option.export){
|
|
|
+ for(var key in r.rows){
|
|
|
+ var line = $(Mustache.render(tpl,r.rows[key]));
|
|
|
+ container.append(line);
|
|
|
+ option.showing(line,key);
|
|
|
+ }
|
|
|
|
|
|
- for(var key in r.rows){
|
|
|
- var line = $(Mustache.render(tpl,r.rows[key]));
|
|
|
- container.append(line);
|
|
|
+ if(r.pagination){
|
|
|
+ $('.page-item-previous,.page-item-next').remove();
|
|
|
+ r.pagination.pages = Math.ceil(r.pagination.pages);
|
|
|
+ var previewNumber = pagination.attr('data-range') != '' && pagination.attr('data-range') != null ? parseInt(pagination.attr('data-range')) : 5;
|
|
|
+ previewNumber = previewNumber < 2 ? 2 : previewNumber;
|
|
|
+
|
|
|
+ var template = pagination.find('li:not(:visible)');
|
|
|
+ if(template.length>0 ){
|
|
|
+
|
|
|
+ template = template.get(0).outerHTML;
|
|
|
+ $('li:not(:eq(0))',pagination).remove();
|
|
|
+ var current = parseInt(r.pagination.current);
|
|
|
+ var previousPages = current-previewNumber;
|
|
|
+ var nextPages = current+previewNumber;
|
|
|
+
|
|
|
+ var dropDownTpl = '<div data-toggle="dropdown"><i class="fas fa-ellipsis-h pointer"></i></div><div class="dropdown-menu pagination-select">{{#choices}}<span class="dropdown-item">{{.}}</span>{{/choices}}</div>';
|
|
|
+
|
|
|
+ for(i=0;i<r.pagination.pages;i++){
|
|
|
+ var li = $(Mustache.render(template,{value:i,label:i+1}));
|
|
|
+
|
|
|
+ if(
|
|
|
+ (previousPages < i && i < nextPages)
|
|
|
+ || i==0 || i==r.pagination.pages-1
|
|
|
+ ){
|
|
|
+ li.removeClass('hidden');
|
|
|
+ if(i==current) li.addClass('active');
|
|
|
+ }else{
|
|
|
+ if(i==1 || i==r.pagination.pages-2){
|
|
|
+ var dotli = li.clone()
|
|
|
+ var start = i==1 ? 2: current+previewNumber+1;
|
|
|
+ var end = i==1 ? (current+1)-previewNumber : r.pagination.pages-1;
|
|
|
+
|
|
|
+ var choices = [];
|
|
|
+ for(u=start; u<end+1;u++)
|
|
|
+ choices.push(u);
|
|
|
+ rightDropDown = $(Mustache.render(dropDownTpl,{choices:choices}));
|
|
|
+
|
|
|
+ dotli.removeClass('hidden')
|
|
|
+ .attr('title','Voir les pages '+(start)+' à '+(end))
|
|
|
+ .removeAttr('onclick')
|
|
|
+ .css('position','relative')
|
|
|
+ .addClass('page-link').html(rightDropDown);
|
|
|
+ pagination.append(dotli);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ pagination.append(li);
|
|
|
+ }
|
|
|
|
|
|
- if(option.showItems){
|
|
|
- line.removeClass('hidden').removeClass('hide').removeClass('noDisplay');
|
|
|
- }
|
|
|
-
|
|
|
+ if(current!=0){
|
|
|
+ var prev = $('<li class="page-item page-item-previous"><span class="page-link" ><span><i class="fas fa-angle-left"></i></span></span></li>');
|
|
|
+ pagination.prepend(prev);
|
|
|
+ prev.click(function(){
|
|
|
+ pagination.find('li[data-value="'+(current-1)+'"]').trigger('click');
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if(current<r.pagination.pages-1){
|
|
|
+ var next = $('<li class="page-item page-item-next"><span class="page-link" ><span><i class="fas fa-angle-right"></i></span></span></li>');
|
|
|
+ pagination.append(next);
|
|
|
+ next.click(function(){
|
|
|
+ pagination.find('li[data-value="'+(current+1)+'"]').trigger('click');
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ if(r.pagination.pages>1){
|
|
|
+ pagination.find('.page-item:not(.hidden):first .page-link').css('border-radius','0.25rem 0 0 0.25rem');
|
|
|
+ }else{
|
|
|
+ pagination.find('.page-item:not(.hidden):first .page-link').css('border-radius','0.25rem 0.25rem 0.25rem 0.25rem');
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
- if(r.pagination){
|
|
|
-
|
|
|
- var template = pagination.find('li:not(:visible)').get(0).outerHTML;
|
|
|
- $('li:not(.hidden)',pagination).remove();
|
|
|
- for(i=0;i<r.pagination.pages;i++){
|
|
|
- var li = $(Mustache.render(template,{value:i,label:i+1}));
|
|
|
- li.removeClass('hidden');
|
|
|
- pagination.append(li);
|
|
|
+ $('.pagination-select span',pagination).click(function(){
|
|
|
+ var selectedPage = (parseInt($(this).text())-1);
|
|
|
+ pagination.find('li[data-value="'+selectedPage+'"]').trigger('click');
|
|
|
+ });
|
|
|
+ }
|
|
|
}
|
|
|
- pagination.find('li:not(.hidden)').eq(r.pagination.current).addClass('active');
|
|
|
- if(r.pagination.pages>1)
|
|
|
- pagination.find('.page-item:not(.hidden):first .page-link').css('border-radius','0.25rem 0 0 0.25rem');
|
|
|
- else
|
|
|
- pagination.find('.page-item:not(.hidden):first .page-link').css('border-radius','0.25rem 0.25rem 0.25rem 0.25rem');
|
|
|
}
|
|
|
if(preloader) preloader.remove();
|
|
|
if(callback!=null)callback(r);
|
|
@@ -566,10 +642,21 @@ $.fn.extend({
|
|
|
});
|
|
|
},
|
|
|
|
|
|
- filters: function (option){
|
|
|
-
|
|
|
+ filters: function (values){
|
|
|
var obj = $(this);
|
|
|
var box = obj.next('.filter-box');
|
|
|
+
|
|
|
+ if(values){
|
|
|
+
|
|
|
+ if(values.keyword && values.keyword!='')
|
|
|
+ $('.filter-keyword',box).val(values.keyword);
|
|
|
+ for(var key in values.advanced){
|
|
|
+ var filter = values.advanced[key];
|
|
|
+ filter_add($('.filter-add-button',box),filter);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
var formData = {
|
|
|
keyword : $('.filter-keyword',box).val()
|
|
|
};
|
|
@@ -665,13 +752,14 @@ $.fn.extend({
|
|
|
autocomplete: function(o){
|
|
|
return this.each(function() {
|
|
|
var obj = $(this);
|
|
|
+ if(o == 'off') return obj.typeahead('destroy');
|
|
|
obj.attr('autocomplete','off');
|
|
|
var option = obj.data();
|
|
|
option = $.extend(option,o);
|
|
|
|
|
|
obj.typeahead({
|
|
|
- items: 5,
|
|
|
- minLength: 2,
|
|
|
+ items: (o.items) ? o.items : 5,
|
|
|
+ minLength: o.suggest ? 0 : (o.minLength ? o.minLength : 2) ,
|
|
|
fitToElement: false,
|
|
|
autoSelect : false,
|
|
|
selectOnBlur : false,
|
|
@@ -679,6 +767,8 @@ $.fn.extend({
|
|
|
return (o.skin) ? o.skin(item) : item.name || item;
|
|
|
},
|
|
|
source: function(keyword, response){
|
|
|
+ if(o.onKeypress) o.onKeypress(obj);
|
|
|
+ if(o.dynamicData) o.data = $.extend(o.data,o.dynamicData());
|
|
|
$.action({
|
|
|
action: option.action,
|
|
|
keyword: obj.val(),
|
|
@@ -714,6 +804,15 @@ $.fn.extend({
|
|
|
if(o.onBlur) o.onBlur(obj);
|
|
|
});
|
|
|
|
|
|
+ if(o.suggest){
|
|
|
+ obj.on("click", function () {
|
|
|
+ ev = $.Event("keydown");
|
|
|
+ ev.keyCode = ev.which = 40;
|
|
|
+ $(this).trigger(ev);
|
|
|
+ return true
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
obj.data('typeahead').next = function (event) {
|
|
|
var active = this.$menu.find('.active').removeClass('active');
|
|
|
var next = active.next();
|
|
@@ -779,58 +878,73 @@ $.fn.extend({
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
- date: function (){
|
|
|
+ date: function (options){
|
|
|
return this.each(function() {
|
|
|
|
|
|
var obj = $(this);
|
|
|
obj.on('paste', function(e){
|
|
|
is_valid_date(e.originalEvent.clipboardData.getData('Text')) ? obj.val("") : e.preventDefault();
|
|
|
});
|
|
|
+
|
|
|
obj.datepicker({
|
|
|
- dateFormat: "dd/mm/yy",
|
|
|
+ dateFormat: options.dateFormat,
|
|
|
dayNames: ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"],
|
|
|
dayNamesMin: ["Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"],
|
|
|
dayNamesShort: ["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"],
|
|
|
monthNames: ["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Aout","Septembre","Octobre","Novembre","Décembre"],
|
|
|
monthNamesShort: ["Jan","Fév","Mars","Avr","Mai","Juin","Juil","Aout","Sept","Oct","Nov","Déc"],
|
|
|
firstDay: 1,
|
|
|
+ minDate: options.beginDate,
|
|
|
+ maxDate: options.endDate,
|
|
|
changeMonth: true,
|
|
|
- yearRange: "-100:+0",
|
|
|
+ yearRange: "-30:+30",
|
|
|
changeYear: true,
|
|
|
onSelect: function(dateText, inst) {
|
|
|
- $(this).trigger("blur");
|
|
|
+ obj.trigger("blur");
|
|
|
}
|
|
|
}).keypress(function(event){
|
|
|
- var length = $(this).val().length;
|
|
|
- if(length == 2 || length == 5) $(this).val($(this).val()+'/');
|
|
|
+ var length = obj.val().length;
|
|
|
+ if(length == 2 || length == 5) obj.val(obj.val()+'/');
|
|
|
}).blur(function(event){
|
|
|
- $(this).removeClass('border border-danger')
|
|
|
- if($(this).val()=='') return;
|
|
|
- var segments = $(this).val().split('/');
|
|
|
+ obj.removeClass('border border-danger');
|
|
|
+ if(obj.val()=='') return;
|
|
|
+ var segments = obj.val().split('/');
|
|
|
if(segments.length!=3) return;
|
|
|
- if(segments[0] > 31 || segments[1] > 12) $(this).addClass('border border-danger');
|
|
|
+ if(segments[0] > 31 || segments[1] > 12) obj.addClass('border border-danger');
|
|
|
}).attr('maxlength','10');
|
|
|
|
|
|
- obj.attr("placeholder","jj/mm/aaaa");
|
|
|
- obj.attr('pattern',"[0-9/]{10}");
|
|
|
- obj.attr("title","Format jj/mm/aaaa");
|
|
|
+ obj.attr('placeholder',options.placeholder);
|
|
|
+ obj.attr('pattern',"^(\\d{2}(?:\\d{2})?)\/(\d{2})\/(\\d{2}(?:\\d{2})?)$");
|
|
|
+ obj.attr('title','Format '+options.dateFormat);
|
|
|
});
|
|
|
},
|
|
|
- hour: function (){
|
|
|
+ hour: function (options){
|
|
|
return this.each(function() {
|
|
|
var obj = $(this);
|
|
|
- var step = obj.attr('data-step');
|
|
|
obj.on('paste', function(e){
|
|
|
is_valid_hour(e.originalEvent.clipboardData.getData('Text')) ? obj.val("") : e.preventDefault();
|
|
|
});
|
|
|
+
|
|
|
obj.timepicker({
|
|
|
- disableAlphaInput: true,
|
|
|
- timeFormat: 'H:i',
|
|
|
scrollDefault: 'now',
|
|
|
- 'step': is_numeric(step) && step>0 ? obj.attr('data-step') : 1
|
|
|
- });
|
|
|
- obj.attr("placeholder","hh:mm");
|
|
|
- obj.attr('pattern',"[0-9:]{5}");
|
|
|
+ timeFormat: options.timeFormat,
|
|
|
+ step: options.step,
|
|
|
+ onSelect: function(timeText, inst) {
|
|
|
+ obj.trigger("blur");
|
|
|
+ }
|
|
|
+ }).keypress(function(e) {
|
|
|
+ if(!e.key.match(/[0-9:]/)) e.preventDefault();
|
|
|
+ if(obj.val().length == 2) obj.val(obj.val()+':');
|
|
|
+ }).blur(function(event){
|
|
|
+ obj.removeClass('border border-danger')
|
|
|
+ if(obj.val()=='') return;
|
|
|
+ var segments = obj.val().split(':');
|
|
|
+ if(segments.length!=2) return;
|
|
|
+ if(segments[0] > 23 || segments[1] > 59) obj.addClass('border border-danger');
|
|
|
+ }).attr('maxlength','5');
|
|
|
+
|
|
|
+ obj.attr("placeholder",options.placeholder);
|
|
|
+ obj.attr('pattern',"(\\d{2})\\:(\\d{2})");
|
|
|
obj.attr('title',"Format hh:mm");
|
|
|
});
|
|
|
},
|
|
@@ -851,4 +965,4 @@ $.fn.extend({
|
|
|
},interval);
|
|
|
});
|
|
|
}
|
|
|
-});
|
|
|
+});
|