// ******************************************************************************************************************************* // Classe que gerencia os filtros de listas. // cada campo pode mudar o filtro via JS (direto na lista carregada) ou via AJAX - parâmetro "filtro" em cada campo - senão tiver assume "ajax" por default // ******************************************************************************************************************************* function clFiltro(pai, parametros) { for (var i in parametros) { this[i] = parametros[i]; } this.pai = pai; this.ehFiltro = true; } clFiltro.prototype.monta = function() { var esteFiltro = this; if (this.antesMontar) this.antesMontar.call(this); this.divFiltro = cria('div', { className: 'objFiltro' }); var limpaFiltro = cria('a', { href: '#', className: 'botao botLimpa', title: "retornar aos filtros iniciais", onclick: function(e) { esteFiltro.limpar.call(esteFiltro); if (e && e.preventDefault) e.preventDefault(); else return false; }}); var campoEscondido = false; for (var i = 0, t = this.campos.length; t--; i++) { if (this.campos[i].escondeCampo) { campoEscondido = true; break; } } if (campoEscondido) var mostraFiltro = cria('a', { href: '#', className: 'botao botMostra aberto', title: "oculta filtros", onclick: function(e) { esteFiltro.mostra.call(esteFiltro, e); if (e && e.preventDefault) e.preventDefault(); else return false; }}); if (this.emLinha) { colocaClasse(this.divFiltro, 'emLinha'); this.divFiltro.setAttribute("id", "objFiltro"); this.divFiltro.appendChild(limpaFiltro); if (campoEscondido) this.divFiltro.appendChild(mostraFiltro); } else if (this.fixoAberto) { colocaClasse(this.pai.elementoBase, "filtroFixo"); $(this.divFiltro).css("height", this.fixoAberto + "px"); } else if (this.flutuante) { colocaClasse(this.divFiltro, 'flutuante'); this.divFiltro.appendChild(limpaFiltro); if (campoEscondido) this.divFiltro.appendChild(mostraFiltro); var titulo = $("
"+ ""+ "" + "filtros" + ""+ ""+ "
"); $(this.divFiltro).append(titulo).on("click", "a.fecha", function() { if (temClasse(esteFiltro.divFiltro, 'fechado')) { tiraClasse(esteFiltro.divFiltro, 'fechado'); tiraClasse(esteFiltro.divFiltro.parentNode, 'fechado'); tiraClasse(esteFiltro.pai.elementoBase, 'filtroFechado'); } else { colocaClasse(esteFiltro.divFiltro, 'fechado'); colocaClasse(esteFiltro.divFiltro.parentNode, 'fechado'); colocaClasse(esteFiltro.pai.elementoBase, 'filtroFechado'); } } ); titulo.append($(limpaFiltro)); } else { var titulo = $("
busca
"); $(this.divFiltro).append(titulo).on("mouseenter", function() { tiraClasse(esteFiltro.pai.elementoBase, 'fechaComMouse'); esteFiltro.exibe.call(esteFiltro); }).on("mouseleave", function() { esteFiltro.oculta.call(esteFiltro); }).on("click", "a.botExibe", function(e) { if (e && e.preventDefault) e.preventDefault(); else return false; }); titulo.append($(limpaFiltro)); } this.listaFiltros = this.divFiltro.appendChild(cria('div', { id: 'listaCampos' })); this.camposID = {}; var temEsconde = false; for (var i = 0, t = this.campos.length; t--; i++) { var campo = this.campos[i]; this.camposID[campo.id] = campo; if (campo.tipo) { var objetoCampo = eval(campo.tipo); campo.alterouCampo = function(campo) { esteFiltro.alterouCampo.call(esteFiltro, campo.filtro) }; campo.objetoCampo = new objetoCampo(campo, this); campo.objetoCampo.campoDoFiltro = this; var divCampo = this.listaFiltros.appendChild(campo.objetoCampo.cria()); divCampo.setAttribute('semTooltip', 1); if (campo.objetoCampo.ajustaParaFiltro) campo.objetoCampo.ajustaParaFiltro.call(campo.objetoCampo); if (campo.objetoCampo.campoIni && campo.objetoCampo.campoIni.ajustaParaFiltro) campo.objetoCampo.campoIni.ajustaParaFiltro.call(campo.objetoCampo.campoIni); if (campo.objetoCampo.campoFim && campo.objetoCampo.campoFim.ajustaParaFiltro) campo.objetoCampo.campoFim.ajustaParaFiltro.call(campo.objetoCampo.campoFim); if (campo.objetoCampo.escondeCampo) temEsconde = true; } else { if (campo.label) this.listaFiltros.appendChild(cria('label', { innerHTML: campo.label, className: 'subtitulo' })); } divCampo.appendChild(cria('div', { className: 'limpa' })); } if (temEsconde) esteFiltro.mostra.call(esteFiltro, mostraFiltro); if (this.aposMontar) this.aposMontar.call(this); botao.tamanho(this.divFiltro); return this.divFiltro; }; clFiltro.prototype.ajustaMonta = function() { $(this.listaFiltros).css("height", this.alturaOriginal()); }; clFiltro.prototype.alturaOriginal = function() { if (this.fixoAberto > 0) return (this.fixoAberto + "px"); return (this.mostraUm) ? $(this.campos[0].objetoCampo.elementoDiv).outerHeight(true) + "px" : "0.1em"; }; clFiltro.prototype.exibe = function() { var div = $(this.listaFiltros); var alturaInicial = div.height(); var alturaAberto = div.css("height", "auto").height(); div.css("height", alturaInicial + "px"); div.stop(true, true).animate({ "height": alturaAberto + "px" }, 300, function() { $(this).css("height", "auto"); }); colocaClasse(this.divFiltro, "aberto"); this.campos[0].objetoCampo.campo.focus(); if (this.aposExibir) this.aposExibir.call(this.pai); // cria uma área maior que o filtro para não fechar tão facilmente $("
").prependTo($(this.divFiltro)).css("height", 1.2 * alturaAberto + "px"); }; clFiltro.prototype.oculta = function() { if (this.dialogAberto) { // se tiver com algum dialog aberto (de data) não fecha o filtro // var esteFiltro = this; // setTimeout(function() { esteFiltro.oculta.call(esteFiltro); }, 300); } else { var div = $(this.listaFiltros); var esteFiltro = this; div.stop(true, true).animate({ "height": this.alturaOriginal() }, 200, function() { tiraClasse(esteFiltro.divFiltro, 'aberto'); if (esteFiltro.aposOcultar) esteFiltro.aposOcultar.call(esteFiltro.pai); }); for (var i = 0, t = this.campos.length; t--; i++) if (this.campos[i].objetoCampo && this.campos[i].objetoCampo.fechaFiltro) this.campos[i].objetoCampo.fechaFiltro(); $(this.divFiltro).find("div.areaMouse").remove(); } }; clFiltro.prototype.limpar = function() { for (var i = 0, t = this.campos.length; t--; i++) { var campo = this.campos[i]; if (campo.objetoCampo) campo.objetoCampo.colocaValorOriginal(); } if (this.antesFiltrar) this.antesFiltrar(); if (this.metodo == "JS") this.filtraDireto(); else this.filtra(); }; clFiltro.prototype.alterouCampo = function(tipoFiltro) { if (tipoFiltro == "JS") { this.filtra(tipoFiltro); } else { this.temporiza(); } }; clFiltro.prototype.temporiza = function() { var esteItem = this; clearTimeout(this.tempo); this.tempo = setTimeout(function() { esteItem.filtra.call(esteItem) }, 1500); }; clFiltro.prototype.filtra = function(tipoFiltro) { if (this.antesFiltrar) this.antesFiltrar(); if (tipoFiltro == "JS") { this.filtraDireto(); } else { this.funcaoBuscar.call(this.pai, true); } }; clFiltro.prototype.filtraDireto = function() { var esteFiltro = this; this.pai.listaParaMontar = this.pai.listaCompleta.filter(item => esteFiltro.testaFiltro.call(esteFiltro, item)); this.funcaoMontar.call(this.pai); if (this.pai.listaParaMontar.length != this.pai.listaCompleta.length) colocaClasse(this.divFiltro, 'filtrado'); else tiraClasse(this.divFiltro, 'filtrado'); }; clFiltro.prototype.testaFiltro = function(item) { var passouNoFiltro = true; for (var contCampo in this.campos) { var campo = this.campos[contCampo]; var passouNesseCampo = true; if (campo.objetoCampo && campo.objetoCampo.valor && campo.filtro == "JS" && campo.chaves) { var passouNesseCampo = false; for (var contChave in campo.chaves) { var valorNaLista = item[campo.chaves[contChave]]; passouNesseCampo = passouNesseCampo || campo.objetoCampo.testaFiltro(valorNaLista, campo.chaves[contChave]); } } passouNoFiltro = passouNoFiltro && passouNesseCampo; } return passouNoFiltro; }; clFiltro.prototype.querystring = function() { var listaCampos = []; var temFiltro = false; for (var i = 0, t = this.campos.length; t--; i++) { if (this.campos[i].filtro != "JS" && this.campos[i].objetoCampo) { this.campos[i].objetoCampo.desfoca(); var valor = this.campos[i].objetoCampo.valor; if (valor == undefined) valor = this.campos[i].objetoCampo.valorOriginal(); if (valor == '|todos|') valor = ''; // campos do tipo select if (typeof(valor) == 'object') valor = valor.ini + ',' + valor.fim; // campos do tipo período listaCampos.push(this.campos[i].id + '=' + valor); if (valor.length > 0) temFiltro = true; } } if (temFiltro) colocaClasse(this.divFiltro, 'filtrado'); else tiraClasse(this.divFiltro, 'filtrado'); return '&' + listaCampos.join('&'); }; clFiltro.prototype.testaRetorno = function(retorno) { // se não retornar com os filtros, não é para testar: retorna true if (!retorno.filtros) return true; // se retornaram os filtros, compara com os selecionados para verificar se ainda são os mesmo do inicio da busca, // senão for retorna false para não mostrar os resultados // implementado apenas para a ferramenta de ocorrências. Não testado ainda nas outras ferramentas. Testar e tirar este IF!!!!!!!! // if (this.pai.urlBase != "crm_fx.php" && (this.pai.abaClicada && this.pai.abaClicada.urlBase != "func/abas/aulas_fx.php")) return true; return (retorno.filtros == this.querystring()); }; clFiltro.prototype.mostra = function(e) { var bot = origemEvento('a', e); if (temClasse(bot, "aberto")) { // fecha os filtros extra tiraClasse(bot, "aberto"); bot.title = "exibe mais filtros"; var funcao = "oculta"; } else { // exibe mais filtros colocaClasse(bot, "aberto"); bot.title = "oculta filtros"; var funcao = "exibe"; } for (var i = 0, t = this.campos.length; t--; i++) { var campo = this.campos[i]; if (campo.escondeCampo) campo.objetoCampo[funcao](); } tela.ajusta(); }; // ******************************************************************************************************************************* // ******************************************************************************************************************************* // sub-classes de tipos de filtros // ******************************************************************************************************************************* // filtro do tipo "ajax" // ******************************************************************************************************************************* function clFiltroAjax (parametros) { clFiltro.call(this, parametros); } clFiltroAjax.prototype = new clFiltro; clFiltroAjax.prototype.constructor = clFiltroAjax; clFiltroAjax.prototype.metodo = 'ajax'; // ******************************************************************************************************************************* // filtro do tipo "js" // ******************************************************************************************************************************* function clFiltroJs (parametros) { clFiltro.call(this, parametros); } clFiltroJs.prototype = new clFiltro; clFiltroJs.prototype.constructor = clFiltroJs; clFiltroJs.prototype.metodo = 'js'; // ******************************************************************************************************************************* // filtro do tipo "parametro" (usado nos relatórios) // ******************************************************************************************************************************* function clFiltroParametro (parametros) { clFiltro.call(this, parametros); } clFiltroParametro.prototype = new clFiltro; clFiltroParametro.prototype.constructor = clFiltroParametro; clFiltroParametro.prototype.metodo = 'parametro'; // *******************************************************************************************************************************