/* COMPOSANT */ function init_components(selector){ //Suppression apr defaut des légendes pour les graphiques if(window.Chart) Chart.defaults.global.legend.display = false; var selected = selector ? $('[data-type]',selector) : '[data-type]'; $(selected).each(function(i,input){ var input = $(input); switch($(input).attr('data-type')){ /** * data-format : Supporte les formats dd/mm/yyyy ou yyyy/mm/dd avec séparateur "/" ou "-" * data-begin : date de début de sélection par rapport à aujourd'hui(peut être en nb de jour, en objet Date ou en string de type dateFormat ou en date relative [+1m +7d]==>Début à 1 mois et 7 jours) * data-end : date de début de sélection par rapport à aujourd'hui(peut être en nb de jour, en objet Date ou en string de type dateFormat ou en date relative [+1m +7d]==>Début à 1 mois et 7 jours) * data-workdays : si attribut est présent, seuls les jours ouvrés sont sélectionnables */ case 'date': //Les séparateurs doivent être similaires entre les éléments de la chaîne var dateFormatRegex = /^(dd|yy)([\/|-])(mm)\2(dd|yy)$/; var dateFormat = input.attr('data-format') != undefined && input.attr('data-format').match(dateFormatRegex) ? input.attr('data-format').match(dateFormatRegex)[0] : "dd/mm/yy"; var begin = input.attr('data-begin'); begin = (begin != undefined && (begin.match(/-?\d+/) || begin.match(/^(\d{2}(?:\d{2})?)\/(\d{2})\/(\d{2}(?:\d{2})?)$/))) ? begin : null ; var end = input.attr('data-end'); end = (end != undefined && (end.match(/-?\d+/) || end.match(/^(\d{2}(?:\d{2})?)[-|\/](\d{2})[-|\/](\d{2}(?:\d{2})?)$/))) ? end : null ; input.removeClass('hasDatepicker'); input.date({ placeholder: input.attr('placeholder') != undefined ? input.attr('placeholder') : "jj/mm/aaaa", dateFormat: dateFormat, beginDate: begin, endDate: end, workdays: input.attr('data-workdays') != null }).click(function(event) { $(this).select(); }); break; /** * data-format : Supporte les formats dd/mm/yyyy ou yyyy/mm/dd avec séparateur "/" ou "-" * data-step : L'intervalle entre 2 valeurs en minutes */ case 'hour': var timeFormatRegex = /^(H):(i)$/; var timeFormat = input.attr('data-format') != undefined && input.attr('data-format').match(timeFormatRegex) ? input.attr('data-format').match(timeFormatRegex)[0] : "H:i"; var step = input.attr('data-step'); input.hour({ placeholder: input.attr('placeholder') != undefined ? input.attr('placeholder') : "hh:mm", timeFormat: timeFormat, step: is_numeric(step) && step>0 ? step : 1 }).click(function(event){ $(this).select(); }); break; case 'decimal': input.off('keydown').on('keydown',function(e){ switch(e.key){ case ',': //on interdit la saisie si la chaine contient déja un . ou une , if(input.val().match(/[\.,]/i)) return false; //remplace les , par les . pour chiffre valide en db input.val(input.val()+'.'); return false; break; case '.': //on interdit la saisie si la chaine contient déja un . ou une , if(input.val().match(/[\.,]/i)) return false; break; case 'Backspace': case 'ArrowRight': case 'ArrowLeft': case 'Delete': case 'Insert': case '-': return true break; default: //autorise le coller ctrl+v if(e.key == 'v' && e.ctrlKey ) return true; //dégage les caractères différents de .,0123456789 if(!e.key.match(/[\-0-9,\.]/i)) return false; break; } return true; }); //supprime les caracteres pourris sur un coller input.off('keyup blur').on('keyup blur',function(e){ var value = input.val().replace(/[^0-9\-,.]/ig,''); //on remplace les "," par les "." var value = value.replace(/,/ig,'.'); //on s'assure qu'il n'existe pas plusieurs "." var splits = value.split('.'); if(splits.length > 1){ var newValue = ''; for(var i in splits) newValue+= (i!=splits.length-1 ? '' : '.')+splits[i]; value = newValue; } //On s'assure que le - est en début ou n'existe pas if(value.indexOf('-') !== -1 && value.indexOf('-')!==0 ) value = value.replace('-',''); input.val(value); }); break; case 'color': input.colorInput(); break; case 'history': var data = input.data(); if(isNaN(input.attr('data-uid'))) break; input.off(); if(data.showImportant){ if(!window.componentQueue['history']) window.componentQueue['history'] = {timeout : null,scopes :{} }; clearTimeout(window.componentQueue['history'].timeout); if(!window.componentQueue['history'].scopes[data.scope]) window.componentQueue['history'].scopes[data.scope] = []; window.componentQueue['history'].scopes[data.scope].push(data.uid); window.componentQueue['history'].timeout = setTimeout(function(){ $.action({ action : 'core_history_search', scopes : window.componentQueue['history'].scopes, showImportant : true },function(r){ var tpl = $('#history-notification-tpl').html(); for(var k in r.rows){ var row = r.rows[k]; var html = Mustache.render(tpl, {number: row.number}); inputs = $('[data-scope="'+row.scope+'"][data-uid="'+row.uid+'"][data-type="history"][data-show-important="true"]'); inputs.addClass('position-relative').append(html); if(row.number == 0) inputs.find('.history-notification').addClass('hidden'); init_components(inputs); } }); window.componentQueue['history'] = {timeout : null,scopes :{} }; },50); } input.click(function(event){ var data = input.data(); var panel = $('.history-panel'); var uid; if(panel.hasClass('hidden')) panel.removeClass('hidden'); panel.toggleClass('fold').one('webkitAnimationEnd oanimationend msAnimationEnd animationend', function(e) { var currentPanel = $(this); if(!currentPanel.hasClass('fold')) return; currentPanel.addClass('hidden'); }); if(panel.hasClass('fold')) return; if(input.attr('data-uid')) panel.attr('data-uid',input.attr('data-uid')); if(data.scope) panel.attr('data-scope',data.scope); core_history_search(function(){ //Redimensionnement du panel historique setTimeout(function(){ uid = $('.history-panel').panelResize({direction : 'left'}); }, 100); }); event.stopPropagation(); //Fermeture du panel au click en dehors du composant $(window).click(function(e) { var target = $(e.target); var panel = target.closest('.history-panel'); var handler = target.closest('.panel-resize-handler'); var targetInPanel = panel.length || handler.length; //Si un commentaire était en cours d'édition, on le sauvegarde si on a cliqué en dehors du wysiwyg et uniquement s'il n'est pas vide if(target.hasClass('history-panel') || target.hasClass('comments') || !targetInPanel){ $('li.comment:not(.hidden)').each(function(){ if($(this).find('.history-content .trumbowyg-editor-visible').length && $(this).find('.history-content .trumbowyg-editor').text().length) core_history_save(this); }); } if(targetInPanel) return; $('.history-panel').addClass('fold'); $('#'+uid).remove(); }); }); break; /** * data-regex : regex de vérification (defaut : ^[0-9]{10}$, les espaces sont trimés pour vérification) * data-spacing : espace automatiquement les chiffre si collés (défaut true) * data-empty-field : vide le champs si invalide (défaut false) * data-invalid-class : définit la classe a ajouter si invalide (défaut .invalid-value) * data-blur : si défini, trigger le blur indiqué après validation du champ (le onblur classique trigger avant) * data-type-only : empeche l'utilisateur de taper autre caractere que définis dans cette expression (defaut : [0-9\+\s]) */ case 'phone': input.phone(input.data()); break; /** * data-delete : définit la fonction JS qui sera appelée au clic sur la croix pour supprimer l'image * data-save : définit la fonction JS qui sera appelée après le changement de l'image * data-default-src : chemin vers l'image par défaut à utiliser */ case 'image': console.warn('[DEPRECATED] : Image doit être remplacé par le composant file'); if(input.hasClass('hidden')) return; if(input.closest('.type-image-bloc').length!=0) break; input.attr('type', 'file'); input.wrap( "
"); var save = input.attr('data-save'); var src = ($(input).attr('value')!='') ? $(input).attr('value') : 'img/default-image-muted.png'; src += src.indexOf('?')!=-1 ? '&' : '?'; src += 't='+(Math.random()*1000); var thumbnail = $(''); var deleteBtn = !input.attr('data-delete') ? '' : '