// *******************************************************************************************************************************
// Classe que gerencia as listas de itens editáveis
// *******************************************************************************************************************************
function clColecao(parametros) {
this.idElementoBase = 'conteudo'; // pode ser substituído pela instância
for (var i in parametros) {
this[i] = parametros[i];
}
this.classeObjeto = 'colecao';
// se não for para limpar o conteúdo, também não altera o objeto de conteudo do item, mantém o primeiro conteúdo
if (!this.naoLimpaConteudo && this.item) this.item.conteudo = this;
this.contNovo = 0;
this.montaInicial();
if (this.dadosExcel == undefined) this.dadosExcel = 'lista'; // por padrao onde estarão os dados para exportação excel vindo do _fx
//if (!this.dadosExcel) this.dadosExcel = ''; // por padrao onde estarão os dados para exportação excel vindo do _fx
}
clColecao.prototype.montaInicial = function() {
if (!this.elementoBase) {
removeObj(obj(this.idElementoBase));
var main = (this.elementoAlvo) ? this.elementoAlvo : ((this.item && this.item.elementoAlvo) ? this.item.elementoAlvo : obj('main'));
this.elementoBase = main.appendChild(cria('div', { id: this.idElementoBase }));
}
if (this.className && !temClasse(this.elementoBase, this.className)) colocaClasse(this.elementoBase, this.className);
if (this.antesMontar) this.antesMontar();
if (!this.naoLimpaConteudo) limpaConteudo(this.elementoBase);
if (this.botNovo && this.permissao("incluir")) ((this.botNovo.onde) ? this.botNovo.onde : this.elementoBase).appendChild(this.novoCad());
this.listaDOM = $("
");
if (!this.soMontaFinal) this.listaDOM.appendTo(this.elementoBase);
if (this.className) this.listaDOM.addClass(this.className);
if (this.ajustaLista) this.ajustaLista();
if (this.titulos) this.liTitulos = this.incluiTitulos();
if (this.ajustaTitulos) this.ajustaTitulos();
var itens = this.itens = {};
this.listaDOM.delegate("li .abrefecha", "click", function() {
var esteItem = itens[$(this).closest('li').attr('id')];
if (temClasse(esteItem.li, 'aberto')) esteItem.fecha();
// else esteItem.abre().slideDown(400);
else { if (esteItem.conteudo.url == "func/abas/relatHabilita_fx.php") esteItem.abre().slideDown(400); }
return false;
});
if (this.botoes) this.objBotoes = new clBotoes(this, this.botoes);
if (this.paginado) {
var paramPaginacao = { "pai": this, "forma": this.paginado, "funcaoBusca": this.buscaLista, "elementoBase": this.elementoBase, "tamPagina": this.tamPagina };
if (this.titulosExterno) paramPaginacao["elementoScroll"] = this.listaDOM;
this.paginacao = new clPaginacao(paramPaginacao);
}
if (typeof(this.dados) == "string") this.buscaDados = this.dados;
this.primeiraBusca = true;
if (this.filtros) {
this.objFiltro = new clFiltro(this, this.filtros);
if (typeof(this.objFiltro.emLinha) == "undefined") this.objFiltro.emLinha = true;
this.objFiltro.funcaoBuscar = this.buscaInicial;
this.objFiltro.funcaoMontar = this.montaFiltrado;
var filtroOnde = (this.filtroOnde) ? this.filtroOnde : this.elementoBase;
// if (this.filtroFixo) this.divFiltro = $(this.objFiltro.monta()).appendTo($("#cabecalho")[0]);
// else this.divFiltro = $(this.objFiltro.monta()).prependTo(filtroOnde);
this.divFiltro = $(this.objFiltro.monta()).prependTo(filtroOnde);
}
if (this.soApoio) {
obj('main').remove();
$(this.elementoBase).css('width', '98%');
}
if (this.antesBuscar) this.antesBuscar.call(this);
if (typeof(this.dados) == "object") this.monta();
else this.buscaInicial();
};
clColecao.prototype.buscaInicial = function() {
this.numPagina = 1;
if (this.paginacao) this.paginacao.inicia();
var mantem = (this.titulos) ? [this.liTitulos[0]] : [];
limpaConteudo(this.listaDOM[0], mantem);
this.buscaLista();
};
clColecao.prototype.montaFiltrado = function() {
var mantem = (this.titulos) ? [this.liTitulos[0]] : [];
limpaConteudo(this.listaDOM[0], mantem);
this.itens = {};
var lista = this.listaParaMontar;
if (lista.ord) {
for (var i = 0; i < lista.ord.length; i++) {
//altera o nome do parametro por que o parametro muda do primeiro item da coleção para os demais
if (this.cadastroMontaSemLabel == true && i == 0) {
this.cadastroSemLabel = false;
} else if (!this.cadastroMontaSemLabel) {
this.cadastroSemLabel = false;
} else {
this.cadastroSemLabel = true;
}
lista[lista.ord[i]].pos = i;
this.itens[lista.ord[i]] = new cl_Item(this, lista[lista.ord[i]]);
}
} else {
for (var i = 0; i < lista.length; i++) {
//altera o nome do parametro por que o parametro muda do primeiro item da coleção para os demais
if (this.cadastroMontaSemLabel == true && i == 0) {
this.cadastroSemLabel = false;
} else if (!this.cadastroMontaSemLabel) {
this.cadastroSemLabel = false;
} else {
this.cadastroSemLabel = true;
}
lista[i].pos = i;
this.itens[lista[i].id] = new cl_Item(this, lista[i]);
}
if (lista.length == 0 && this.iniciaComNovo && this.permissao("incluir")) {
var novo = { pos: 0 };
this.contNovo += 1;
var id = (this.usaSempreNovo) ? 'novo' : 'novo-' + this.contNovo;
novo["id"] = id;
this.itens[id] = new cl_Item(this, novo);
}
}
this.primeiraBusca = false;
};
clColecao.prototype.buscaLista = function(vemDaPaginacao) {
var estaLista = this;
// o ajuste do this.urlBuscaInfo é para a exportação para Excel.
var url = this.urlBuscaInfo = this.buscaDados;
if (this.paginacao) url += this.paginacao.querystring();
if (this.objFiltro) {
var paramFiltros = this.objFiltro.querystring();
url += paramFiltros;
this.urlBuscaInfo += paramFiltros;
}
if (this.ordenada) url += this.ordenada;
if (!this.carregando) {
this.carregando = true;
var classeAviso = 'carregandoMain';
if (this.objFiltro) classeAviso += ' comFiltro';
if (vemDaPaginacao) classeAviso += ' paginacao';
this.avisoCarregando = new clAviso({ avisos: { aviso: "carregando" + "..." }, textoTit: "por favor aguarde", comEspera: 'gr', classe: classeAviso });
var colocaAviso = (this.ondeAviso) ? this.ondeAviso : ((this.item) ? ((this.item.cabecalho) ? this.item.cabecalho : this.item.li) : this.elementoBase);
colocaAviso.appendChild(this.avisoCarregando.cria());
this.avisoCarregando.mostra();
}
if (this.paginacao) this.paginacao.ajustaCarregando();
this.url = url;
if (this.trocaBusca) this.trocaBusca.call(this);
else this.busca();
//if (this.paginado == 'scroll') $(window).scroll( function() { estaLista.mudaScroll.call(estaLista) });
};
clColecao.prototype.busca = function(metodo, complementaURL) {
var estaLista = this;
var url = (this.trataUrl) ? this.trataUrl.call(this) : this.url;
if (complementaURL) url += complementaURL;
if (!metodo) metodo = "retornaLista";
new cnx.carrega(url, function() { estaLista[metodo].call(estaLista, this.resposta); });
};
clColecao.prototype.retornaLista = function(dados) {
this.carregando = false;
this.avisoCarregando.fecha();
$(this.elementoBase).find("div.aviso.carregandoMain").remove();
this.dados = jQuery.parseJSON(dados);
if (this.objFiltro && !this.objFiltro.testaRetorno.call(this.objFiltro, this.dados)) return;
if (this.ajustaDados) this.ajustaDados();
if (!this.paginacao || this.paginacao.numPagina == 1) limpaConteudo(this.listaDOM[0], ((this.liTitulos) ? [this.liTitulos[0]] : null));
this.monta();
};
clColecao.prototype.monta = function() {
if (this.descarregado) return;
var colecao = this;
if (this.paginacao) this.paginacao.habilita();
if (this.mudaOrdem) this.colocaMudaOrdem();
this.itens = {};
// se a coleção estiver vazia (ou o parâmetro iniciaComNovo for true), inicia com um cadastro novo já aberto
var lista = (!this.dados.lista) ? this.dados : this.dados.lista;
this.listaCompleta = lista;
if (lista.length === 0 || (lista.ord && lista.ord.length == 0)) {
if (this.paginacao) this.paginacao.desabilita();
if (this.mostraAvisoVazio) {
if (!this.paginacao || this.paginacao.numPagina == 0) this.avisoVazio();
} else if (this.iniciaComNovo && this.permissao("incluir")) this.novoItem();
if (this.iniciaComNovo && !this.permissao("incluir")) {
this.novoItem();
}
} else {
if (this.iniciaComNovoSempre && this.permissao("incluir")) this.novoItem();
if (lista.ord) {
for (var i = 0; i < lista.ord.length; i++) {
//altera o nome do parametro por que o parametro muda do primeiro item da coleção para os demais
if (this.cadastroMontaSemLabel == true && i == 0) {
this.cadastroSemLabel = false;
} else if (!this.cadastroMontaSemLabel) {
this.cadastroSemLabel = false;
} else {
this.cadastroSemLabel = true;
}
lista[lista.ord[i]].pos = i;
this.itens[lista.ord[i]] = new cl_Item(this, lista[lista.ord[i]]);
}
var ultimo = lista.ord[lista.ord.length - 1];
} else {
for (var i = 0; i < lista.length; i++) {
//altera o nome do parametro por que o parametro muda do primeiro item da coleção para os demais
if (this.cadastroMontaSemLabel == true && i == 0) {
this.cadastroSemLabel = false;
} else if (!this.cadastroMontaSemLabel) {
this.cadastroSemLabel = false;
} else {
this.cadastroSemLabel = true;
}
lista[i].pos = i;
this.itens[lista[i].id] = new cl_Item(this, lista[i]);
}
var ultimo = lista[lista.length - 1].id;
}
if (this.paginacao && ultimo == this.dados.ultimo) this.paginacao.desabilita();
}
if (this.soMontaFinal) this.listaDOM.appendTo(this.elementoBase);
this.total();
this.ajustaOrdTitulos();
if (this.aposMontar) this.aposMontar.call(this);
};
clColecao.prototype.colocaMudaOrdem = function() {
if (this.jaTemMudaOrdem) return;
var colecao = this;
this.parametrosItem.botoes.push({ tipo: 'padrao', classe: 'mudaOrdem', tip: "clique e arraste para mudar a ordem" });
this.jaTemMudaOrdem = true;
$(this.listaDOM).sortable({
axis: "y",
handle: ".mudaOrdem",
items: ">li:not(.naoMudaOrdem)",
placeholder: "ui-state-highlight",
forcePlaceholderSize: true
}).disableSelection().on("sortstop", function() { colecao.mudaOrdemItem.call(colecao); } );
};
clColecao.prototype.mudaOrdemItem = function() {
// função usada quando a coleção tem mudaOrdem = true, que pode ser substituída pela instância
var lis = this.listaDOM.children();
for (var ordemDOM = 0, t = lis.length; t--; ordemDOM++) {
var id = lis[ordemDOM].getAttribute("id");
var item = this.itens[id];
if (item) {
var campoOrdem = item.objItem.camposID["ordem"];
if (campoOrdem && campoOrdem.objetoCampo) campoOrdem.objetoCampo.colocaValor(ordemDOM + 1);
}
}
if (this.aposMudarOrdemItem) this.aposMudarOrdemItem.call(this);
};
clColecao.prototype.novoItem = function(e, dados) {
// VERIFICAR ESTA DECISAO, pois ninguem esta conseguindo inserir um novo.
// se não tiver permissão para incluir, sai deste método
// o problema é quando o botão é inserido no Cabeclho!!!!!
//console.log(this.botNovo, this.item.pai.permissao('incluir'), (!this.botNovo || !this.item.pai.permissao('incluir')));
//if (!this.botNovo || !this.item.pai.permissao('incluir')) return;
// Se tiver limite na inclusão de novos itens na coleção, desabilita o botão de inclusão se já tiver um novo inserido.
if (this.limitaNovoItem) {
if (this.botaoIncluir) botao.desabilita(this.botaoIncluir);
var botoesAba = this.abaClicada.botoes;
// listando os botões da aba.
for (var i = 0, t = botoesAba.length; t--; i++) {
if (botoesAba[i].tipo == 'incluir') { // achou o botão de incluir, então desabilita.
if (this.permissao("incluir")) botoesAba[i].objBotao.desabilita();
break;
}
}
}
// log(dados = this.dados)
var novo = { pos: 0 };
if (dados) {
var id = dados["id"];
for (var i in dados) novo[i] = dados[i];
} else {
this.contNovo += 1;
if (this.usaSempreNovo) {
id = 'novo';
novo["id"] = id;
} else {
var id = 'novo-' + this.contNovo;
novo["id"] = id;
}
}
var listaBot = [];
for (var i in this.parametrosItem.botoes) {
listaBot.push(this.parametrosItem.botoes[i]);
if (this.parametrosItem.botoes[i] == "excluir") var posExcluir = i;
}
var lista = (!this.dados.lista) ? this.dados : this.dados.lista;
var listaVazia = (lista.length === 0 || (lista.ord && lista.ord.length == 0));
//if (this.iniciaComNovo && !this.dados.length && !this.itens[id]) this.parametrosItem.botoes.splice(posExcluir, 1);
//if (this.iniciaComNovo && listaVazia && !this.itens[id]) this.parametrosItem.botoes.splice(posExcluir, 1);
var contador = 0;
for (var item in this.itens) contador +=1;
if (this.iniciaComNovo && this.semExcluir && !this.dados.length && contador < 1) this.parametrosItem.botoes.splice(posExcluir, 1);
this.itens[id] = new cl_Item(this, novo);
this.parametrosItem.botoes = listaBot;
this.itens[id].detalhes = {};
this.itens[id].editando = true;
$(this.itens[id].li).find('.principal').find('input.nome').focus();
if (this.aposInserirNovo) this.aposInserirNovo.call(this, this.itens[id]);
if (e && e.preventDefault) e.preventDefault();
return this.itens[id];
};
clColecao.prototype.inclui = function(item, cadastroOriginal, retornoGravacao) {
// o parâmetro cadastroOriginal pode ser utilizado em métodos "inclui" de instâncias que substituem este método
item.retornoGravacao = retornoGravacao;
if (this.itens[item.id] && this.itens[item.id].li) item.troca = this.itens[item.id].li;
else {
if (!retornoGravacao) item.novo = true;
// se foi incluido um item novo coloca o item gravado nos dados da coleção
var lista = (!this.dados.lista) ? this.dados : this.dados.lista;
if (lista.ord) {
lista.ord.push(item.id);
lista[item.id] = item;
} else {
lista.push(item);
}
this.total();
}
this.itens[item.id] = new cl_Item(this, item);
if (this.iniciaComNovoSempre) this.novoItem();
};
clColecao.prototype.excluiItem = function(itemID) {
var lista = (this.dados.lista) ? this.dados.lista : this.dados;
if (lista.ord && lista[itemID]) {
delete lista[itemID];
for (var i = 0, t = lista.ord.length; t--; i++) {
if (lista.ord[i] == itemID) {
lista.ord.splice(i, 1);
break;
}
}
} else {
for (var i = 0, t = lista.length; t--; i++) {
if (lista[i].id == itemID) {
lista.splice(i, 1);
break;
}
}
}
this.total();
};
clColecao.prototype.novoCad = function() {
var div = cria('div', { className: 'novoCad' });
var estaColecao = this;
this.botaoIncluir = botao.habilita(div.appendChild(botao.cria("incluir", function() { estaColecao.novoItem.call(estaColecao) },
true, false, false, this.botNovo.semTamanho)));
div.appendChild(cria('label', null, null, this.botNovo.label));
botao.tamanho(div);
return div;
};
clColecao.prototype.avisoVazio = function() {
$("
" + this.mostraAvisoVazio + "
").appendTo(this.listaDOM).fadeIn(250);
};
clColecao.prototype.permissao = function(acao) {
if (!this.item) {
var acoes = ["editar|gravar", "incluir", "excluir"];
var pos = -1;
for (var i = 0, t = acoes.length; t--; i++) if (acoes[i].indexOf(acao) >= 0) pos = i;
if (pos < 0) return true;
// _quem = [||idesc||, ||resp||, ||escopo||, ||edita||, ||inclui||, ||exclui||, ||emp||, ||pai||, ||idLic||, ||tempoSessao|| ]
//else return (_quem[2] > (pos + 1));
else return _quem[pos + 3];
}
// encontra a aba e verifica a permissão
// this.abaClicada
var item = this.item;
while (item && !item.objCabecalho) item = item.pai.item;
if (item) {
var aba = item.objCabecalho.aba;
if (aba && aba.permissao) return aba.permissao(acao);
} else if (this.perm) return this.perm[acao];
// se não encontrar a aba (ou a permissão da aba) encontra a lista e verifica a permissao da lista
if (this.item) {
var lista = this.item.pai;
while (lista.item) lista = lista.item.pai;
return (typeof(lista.permissao) == "function") ? lista.permissao(acao) : lista.permissao;
}
};
clColecao.prototype.total = function() {
if (!this.labelTotal) return;
if (!this.divTotal) {
colocaClasse(this.elementoBase, 'comTotal');
this.divTotal = $("").prependTo(this.elementoBase);
this.divTotal.span = $("").appendTo(this.divTotal);
this.divTotal.label = $("").appendTo(this.divTotal);
}
var quant = this.dados.total;
if (!quant) {
var lista = (!this.dados.lista) ? this.dados : this.dados.lista;
var quant = (lista.ord) ? lista.ord.length : lista.length;
}
this.divTotal.span.text(quant);
this.divTotal.label.text((quant > 1) ? this.labelTotal.plural : this.labelTotal.singular);
if (this.aposTotal) this.aposTotal.call(this);
};
clColecao.prototype.incluiTitulos = function() {
var estaColecao = this;
var tag = (this.titulosExterno) ? "div" : "li";
var liTitulos = $("<" + tag + " class='titulos'>" + tag + ">");
var div = $("").prependTo(liTitulos);
var classeCampo = "campo ";
let linkOrdena = "";
if (this.ordenacaoTitulo) {
classeCampo += "comOrd ";
linkOrdena = "";
div.on("click", "a.ord", function(e) { estaColecao.ordena.call(estaColecao, e); } );
}
for (var i = 0; i < this.titulos.length; i++) {
var classe = classeCampo + this.titulos[i].id;
if (this.titulos[i].classe) classe += " " + this.titulos[i].classe;
div.append($("
" + linkOrdena + "
"));
}
let acaoApend = (this.titulosExterno) ? "insertBefore" : "appendTo";
liTitulos[acaoApend](this.listaDOM);
return liTitulos;
};
clColecao.prototype.ordena = function(e) {
const bot = e.target;
const sentido = (temClasse(bot, "dec")) ? "d" : "c";
const coluna = bot.parentNode.getAttribute("id");
this.ordenada = "&ord=" + coluna + "_" + sentido;
if (this.paginacao) this.paginacao.numPagina = 1;
this.buscaLista();
};
clColecao.prototype.ajustaOrdTitulos = function() {
let ord = this.dados.ord;
if (!ord) return;
if (typeof(this.dados.ord) == "string") ord = ord.split("_");
const colunaOrdenada = ord[0];
const sentido = (ord[1] == "d") ? "dec" : "cre";
if (this.liTitulos) {
this.liTitulos.find("div.campo a.sele").removeClass("sele");
this.liTitulos.find("div#" + colunaOrdenada + " a." + sentido).addClass("sele");
}
};
// *******************************************************************************************************************************
// *******************************************************************************************************************************
// *******************************************************************************************************************************
// Classe que gerencia cada item da coleção
// *******************************************************************************************************************************
function cl_Item(pai, objItem) {
this.pai = pai;
for (var i in objItem) {
this[i] = objItem[i];
}
this.classeOrigem = 'Item';
if (this.id && this.id.toString().substring(0,4) == 'novo') this.novo = true;
if (this.retornoGravacao && !this.troca) this.eraNovo = true;
this.cria();
};
cl_Item.prototype.cria = function() {
// var $li = $("
").attr('id', this.id);
var tag = (this.pai.listaDOM) ? "" : "";
var $li = $(tag).attr('id', this.id);
if (this.id && this.id.toString().substring(0,4) == 'novo') {
$($li).attr('class', "novo");
}
this.li = $li[0];
if (this.novo || this.eraNovo) {
if (!this.pai.itens || !this.pai.itens['novo']) {
// se for um item novo, coloca no início do UL
var onde = (this.pai.listaDOM) ? this.pai.listaDOM : this.pai.onde;
if (this.retornoGravacao && this.pai.inverte) $li.appendTo(onde).fadeIn(500);
else $li.prependTo(onde).fadeIn(500);
}
} else if (this.troca) {
// se for para trocar um LI por outro - por exemplo quando grava - coloca o novo antes do original e exclui o original
$li.insertAfter(this.troca).show();
removeObj(this.troca);
this.troca = false;
this.trocou = true;
} else {
// senão, só coloca no final do UL
$li.appendTo(this.pai.listaDOM).fadeIn(250);
}
if (this.pai.trocaValores) this.pai.trocaValores.call(this);
var parametrosItem = (this.pai.parametrosItem) ? this.pai.parametrosItem : this.parametrosItem;
var objItem = (this.pai.objItem) ? this.pai.objItem : this.objItem;
parametrosItem.item = this;
parametrosItem.onde = this.li;
parametrosItem.dados = this;
parametrosItem.cadastroSemLabel = this.pai.cadastroSemLabel;
parametrosItem.objTipo = "colecao";
this.objItem = new objItem(parametrosItem);
//this.objItem.objTipo = 'colecao';
if (this.pai.ajustaItem) this.pai.ajustaItem.call(this, this.pai);
};
cl_Item.prototype.exclui = function() {
var esteItem = this;
$(this.li).addClass("excluido").slideUp(400, function() {
$(this).remove();
if (esteItem.objItem.aposExcluirItem) esteItem.objItem.aposExcluirItem.call(esteItem);
});
delete this.pai.itens[this.id];
this.pai.excluiItem.call(this.pai, this.id);
};
cl_Item.prototype.oculta = function() {
$(this.li).hide();
this.oculto = true;
};
cl_Item.prototype.exibe = function() {
$(this.li).show();
delete(this.oculto);
};
// *******************************************************************************************************************************
// *******************************************************************************************************************************