// ******************************************************************************************************************************* // Classe que gerencia os botões vinculados a um objeto (pode ser usado pelo clCadastro, clColecao ou Cabecalho) // ******************************************************************************************************************************* function clBotoes(pai, novo) { this.pai = pai; // se não tem lista de botões, não monta if (!this.pai.botoes || this.pai.botoes.length == 0) return; this.paiNovo = novo; this.perm = this.pai.perm; if (this.pai.colocaDepois) this.colocaDepois = this.pai.colocaDepois; if (this.pai.limpa) this.limpa = this.pai.limpa; if (!this.perm) { if (this.pai.aba) this.perm = this.pai.aba.perm; else if (this.pai.abaClicada) this.perm = this.pai.abaClicada.perm; } this.listaBotoes = []; this.monta(); botao.tamanho(this.pai.onde); } clBotoes.prototype.monta = function() { var paiOnde = this.pai.onde || this.pai.elementoBase || this.pai.elementoDiv; var divBotoes = this.divBotoes = cria("div", { className: 'botoes' }); if (paiOnde.firstChild && !this.colocaDepois) paiOnde.insertBefore(divBotoes, paiOnde.firstChild); else paiOnde.appendChild(divBotoes); // passa pela lista de botoes para criar cada botão for (var i in this.pai.botoes) { var botao = this.pai.botoes[i]; if (typeof(botao) == 'string') botao = { tipo: botao }; this.criaBotao(botao); } if (this.limpa) divBotoes.appendChild($("
")[0]); if (tip) tip.acha(divBotoes); }; clBotoes.prototype.criaBotao = function(botao) { var tipo = botao.tipo || botao.label || 'padrao'; if (!window['Botao' + tipo]) { // se não existir a classe do tipo do botao, cria-se um botão padrão com o tipo no label if (!botao.label) botao.label = tipo; tipo = 'padrao'; } var tipoBotao = window['Botao' + tipo]; botao.tipo = tipo; botao.objBotao = new tipoBotao(this, botao); }; clBotoes.prototype.habilita = function(tipo) { if (!this.listaBotoes) return; // se não for passado que tipo de botão é para habilitar, habilita todos if (tipo && tipo.length) { var botaoTipo; for (var i = 0, t = this.listaBotoes.length; t--; i++) if (this.listaBotoes[i].tipo == tipo) { botaoTipo = this.listaBotoes[i].objBotao; break; } if (botaoTipo) botaoTipo.habilita(); } else { for (var i = 0, t = this.listaBotoes.length; t--; i++) this.listaBotoes[i].objBotao.habilita(); } }; clBotoes.prototype.desabilita = function(tipo) { if (!this.listaBotoes) return; // se não for passado que tipo de botão é para desabilitar, desabilita todos if (tipo && tipo.length) { var botaoTipo; for (var i = 0, t = this.listaBotoes.length; t--; i++) if (this.listaBotoes[i].tipo == tipo) { botaoTipo = this.listaBotoes[i].objBotao; break; } if (botaoTipo) botaoTipo.desabilita(); } else { for (var i = 0, t = this.listaBotoes.length; t--; i++) { this.listaBotoes[i].objBotao.desabilita(); } } }; clBotoes.prototype.incluir = function(botao) { this.listaBotoes.push({ objBotao: botao, tipo: botao.tipo }); }; clBotoes.prototype.excluir = function(botao) { for (var i = 0; i < this.listaBotoes.length; i++) { if (this.listaBotoes[i].objBotao == botao) { this.listaBotoes.splice(i, 1); break; } } }; // ******************************************************************************************************************************* // ******************************************************************************************************************************* // Classe que gerencia cada botão // ******************************************************************************************************************************* function clBotao(botoes, parametros) { // o pai do botão é o objeto que contem a lista de botoes (Cadastro ou Cabecalho) if (botoes) { this.botoes = botoes; this.pai = botoes.pai; this.divBotoes = botoes.divBotoes; this.paiNovo = botoes.paiNovo; } for (var i in parametros) { this[i] = parametros[i]; } if (this.pai) this.monta(); } clBotao.prototype.monta = function() { if (this.ajustaParametros) this.ajustaParametros(); if (this.condicao && !this.condicao()) { var naoCria = true; } else { // verifica se deve ser criado o botão. // tratamento para nao criar alguns botoes quando for um novo registro ou em um registro ja existente. // this.naoCriaNovo = true >> nao cria o botao quando o registro for novo. // this.naoCria = true >> nao cria o botao quando o registro ja existe. // obs: está horrivel... repensar a maneira de verificar estes tipos de botoes quando for "novo". var naoCria = (this.paiNovo == true && (this.naoCriaNovo || (this.tipo == 'excluir' && this.pai.classeObjeto == 'cabecalho') || this.tipo == 'exportar' || this.tipo == 'imprimir' || this.tipo == 'menuAcoes' || this.tipo == 'enviarSenha' || (this.tipo == 'exibir' && this.pai.classeObjeto != 'cabecalho' && this.pai.tipoCampo != "colecao") ) || (!this.paiNovo && this.naoCria) ) ? true : false; } // se quem criou o botão foi o Cadastro, a permissão vem do Cadastro, senão vem da aba do Cabeçalho var objPermissao = (this.pai.permissao) ? this.pai : this.pai.aba; //console.log(objPermissao.permissao.call(objPermissao, this.tipo)) //console.log(objPermissao) //console.log(permissao) // se o pai não tem permissão, sobe mais um nível if (!objPermissao || !objPermissao.permissao) objPermissao = (this.pai.pai.permissao) ? this.pai.pai : this.pai.pai.aba; if (!objPermissao || !objPermissao.permissao) objPermissao = (this.pai.pai.pai); if (!objPermissao.permissao && objPermissao.pai) objPermissao = objPermissao.pai; // tenta subir mais um nível até chegar ao cadastro if (!objPermissao.permissao && objPermissao.pai) objPermissao = objPermissao.pai; // botões em camposColecao de 2º nível if (!objPermissao.permissao && objPermissao.pai) objPermissao = objPermissao.pai; // botões em camposColecao de 3º nível if (!objPermissao.permissao && objPermissao.pai) objPermissao = objPermissao.pai; // botões em camposColecao de 4º nível if (!objPermissao.permissao && objPermissao.pai) objPermissao = objPermissao.pai; // botões em camposColecao de 4º nível if (!objPermissao.permissao && objPermissao.pai) objPermissao = objPermissao.pai; // botões em camposColecao de 4º nível //log(this.tipo, objPermissao, objPermissao.permissao.call(objPermissao, this.tipo)); //log(naoCria); if (objPermissao.criaSempre || !naoCria && objPermissao.permissao.call(objPermissao, this.tipo)) { this.cria(); this.botoes.incluir.call(this.botoes, this); if (this.desabilitado || (this.soHabilitaAberto && !this.pai.aberto)) this.desabilita(); else this.habilita(); if (this.aposMontar) this.aposMontar(); if (this.conteudo) $(this.elementoDom).append(this.conteudo); } if (this.condicaoDesabilitado && !this.condicaoDesabilitado.call(this)) { this.desabilita(); } }; clBotao.prototype.cria = function() { // log(this.classe) this.elementoDom = cria('a', { href: '#', className: this.classe }); if (this.colocaAntes) this.divBotoes.insertBefore(this.elementoDom, this.divBotoes.firstChild); else this.divBotoes.appendChild(this.elementoDom); }; clBotao.prototype.habilita = function() { var esteBotao = this; var elementoDom = this.elementoDom; if (!elementoDom) return; tiraClasse(elementoDom, 'desabilitado'); if (this.tooltip && !this.semTip) elementoDom.setAttribute('tip', this.tooltip); else elementoDom.removeAttribute('tip'); if (tip) { tip.coloca(elementoDom); elementoDom.setAttribute("title", ""); } elementoDom.onclick = function(e) { if (temClasse(this, 'desabilitado')) { if (e && e.preventDefault) e.preventDefault(); else return false; return; } var continuaExecucao = true; if (esteBotao.testes && esteBotao.testes.length > 0) continuaExecucao = esteBotao.testa.call(esteBotao); if (continuaExecucao) { if (esteBotao.textoSenha) esteBotao.pedeSenha.call(esteBotao); else esteBotao.executa.call(esteBotao); } if (e && e.preventDefault) e.preventDefault(); else return false; }; }; clBotao.prototype.executa = function() { var esteBotao = this; // se tem que executar algo antes da ação padrão do botão if (esteBotao.acaoAntes) esteBotao.acaoAntes.call(esteBotao); var nomeFuncao = esteBotao.funcao; // se o método existe no botão, executa // senão, se existe no pai (Cadastro ou Cabecalho), executa // senão, a partir do cadastro encontra o conteudo (Cadastro ou Colecao) e, se tiver o método, executa //log(nomeFuncao); //log(esteBotao); if (esteBotao[nomeFuncao]) esteBotao[nomeFuncao].call(esteBotao); else if (esteBotao.acao) esteBotao.acao(esteBotao); else if (esteBotao.pai[nomeFuncao]) esteBotao.pai[nomeFuncao].call(esteBotao.pai); else if (esteBotao.pai.item && esteBotao.pai.item.conteudo[nomeFuncao]&&esteBotao.carregaThis) esteBotao.pai.item.conteudo[nomeFuncao].call(this,esteBotao.pai.item.conteudo); else if (esteBotao.pai.item && esteBotao.pai.item.conteudo[nomeFuncao]) esteBotao.pai.item.conteudo[nomeFuncao].call(esteBotao.pai.item.conteudo); // se tem que executar algo após a ação padrão do botão if (esteBotao.acaoDepois) esteBotao.acaoDepois.call(esteBotao); }; clBotao.prototype.testa = function() { //cada teste do botão deve ter 3 parametros: //- o teste (retorna true ou false); //- o texto se retornar false; //- se continua a execução ou para (se retornar false). var avisos = []; var executa = true; for (var i = 0, t = this.testes.length; t--; i++) { var resultadoTeste = this.testes[i].resultadoTeste.call(this); if (!resultadoTeste) avisos.push( { aviso: this.testes[i].avisoSeFalse} ); if (!resultadoTeste && !this.testes[i].executaSeFalse) executa = false; } if (avisos.length > 0) { // mostrar avisos (como na hora gravar - mesmo objeto de aviso) this.avisoNaoExclui = new clAviso( { avisos: avisos, tempoAberto: 5000, temFechar: true, textoTit: 'aviso', classe: 'aviso matric' } ); var baseAviso = this.pai.onde; baseAviso.appendChild(this.avisoNaoExclui.cria()); this.avisoNaoExclui.mostra(); } return executa; }; clBotao.prototype.pedeSenha = function() { var esteBotao = this; var txtAviso = this.textoSenha; if (txtAviso.length == 0) txtAviso = "Confirma esta operação?"; var avisos = [{ aviso: txtAviso }]; var campo = { id: 'pass', tipo: CampoSenha, obrigatorio: true, campoFake: true, keydown: function() { if (event.keyCode == 13) esteBotao.verificaSenha.call(esteBotao); }, change: function() { esteBotao.testaValor.call(esteBotao); } }; var labelBot = (this.labelBot) ? this.labelBot : 'envia'; var botoes = [ { tipo: 'padrão', label: "envia", conteudo: labelBot , tip: "verifica a senha", desabilitado: true, acao: function() { esteBotao.verificaSenha.call(esteBotao); }}, { tipo: 'padrão', label: "cancela", conteudo: 'cancela', tip: "cancela", acao: function() { esteBotao.cancelaSenha.call(esteBotao); }} ]; this.avisoExclui = new clAviso({ avisos: avisos, temFechar: true, textoTit: 'aviso', classe: 'aviso matric', campo: campo, botoes: botoes, pai: esteBotao.pai }); this.pai.onde.appendChild(this.avisoExclui.cria()); this.avisoExclui.mostra(); // inclui a função de criptografia (incluindo uma tag "