// ******************************************************************************************************************************* // 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'>
    "); 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); }; // ******************************************************************************************************************************* // *******************************************************************************************************************************