// *******************************************************************************************************************************
// 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 = $("
");
$(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';
// *******************************************************************************************************************************