Browse Source

Update core

Valentin CARRUESCO 4 years ago
parent
commit
2ba34bf5fd
6 changed files with 604 additions and 238 deletions
  1. 3 2
      .gitignore
  2. 2 2
      js/bootstrap.min.js
  3. 0 0
      js/bootstrap.min.js.map
  4. 417 168
      js/main.js
  5. 180 66
      js/plugins.js
  6. 2 0
      robots.txt

+ 3 - 2
.gitignore

@@ -1,9 +1,10 @@
 /constant.php
 /plugin/enabled.json
+/plugin/demo/*
 /file/*/
+/db/*.db
 /sql.debug.sql
 *.maintenance
 *.sublime-project
 *.sublime-workspace
-/plugin/document/logs/*.*
-/db/*.db
+/plugin/document/logs/*.*

File diff suppressed because it is too large
+ 2 - 2
js/bootstrap.min.js


File diff suppressed because it is too large
+ 0 - 0
js/bootstrap.min.js.map


File diff suppressed because it is too large
+ 417 - 168
js/main.js


+ 180 - 66
js/plugins.js

@@ -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);
 		});
 	}
-});
+});

+ 2 - 0
robots.txt

@@ -0,0 +1,2 @@
+User-agent: *
+Disallow: /

Some files were not shown because too many files changed in this diff