var Sinisa = Class.extend({ /** seletores jQuery | {fk_campo: '#fk_campo'} **/ _s: {}, _popUp: {}, /** retorna um objeto jQuery via id do seletor **/ s: function (idSeletor) { if (typeof (this._s[idSeletor]) == 'undefined') { throw 'Seletor não encontrado: ' + idSeletor; } return $(this._s[idSeletor]); }, init: function () { this.log('[sinisa.init] Inicializando aplicação'); this.unAlert(); $('.popover-item').popover({ container: 'body', placement: 'bottom', trigger: 'hover' }); }, config: function () { //this._configToastr(); this.stickyMenu(); this._configChosen(); $.blockUI.defaults['message'] = '

Aguarde...

'; }, unAlert: function () { this.log('[sinisa.unAlert] time alert'); $(".alert-danger, .alert-success").delay(4000).fadeTo(1000, 0).slideUp(200, function () { $(this).alert('close'); }); }, alert: function (message, callback, iconType) { if (!iconType) { iconType = 'info' } swal({ type: iconType, html: message, closeOnConfirm: true, allowOutsideClick: false, imageSize: '60x60' }, (callback || function () { })); }, confirm: function (message, fnConfirm, fnCancel) { swal({ title: 'Confirme', html: message, type: 'warning', showCancelButton: true, allowOutsideClick: false, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', confirmButtonText: 'Sim', cancelButtonText: 'Não', confirmButtonClass: 'confirm-class', cancelButtonClass: 'cancel-class', }, function (isConfirm) { if (isConfirm) { $.isFunction(fnConfirm) && fnConfirm(); } else { $.isFunction(fnCancel) && fnCancel(); } }); }, _configToastr: function () { this.log('[sinisa.config] Configurando o toastr js'); toastr = toastr || {}; toastr.options = { "closeButton": true, "debug": false, "newestOnTop": true, "progressBar": true, "positionClass": "toast-top-right", "preventDuplicates": false, "onclick": null, "showDuration": "300", "hideDuration": "1000", "timeOut": "5000", "extendedTimeOut": "1000", "showEasing": "swing", "hideEasing": "linear", "showMethod": "fadeIn", "hideMethod": "fadeOut" } }, _configChosen: function () { this.log('[sinisa.config] Configurando o Chosen combobox'); $('.chosen-select').each(function (k, v) { var $chosen = $(v); $chosen.chosen({ width: $chosen.attr('data-chosen-width') || '100%', allow_single_deselect: $chosen.attr('data-chosen-allow-single-deselect') || false }); }); }, log: function (mxMsg, strID, strTipo) { if (_.isUndefined(console) || !_.isObject(console) || !console) { return false; } strTipo = strTipo || 'log'; if (_.isUndefined(console[strTipo])) { throw('[sinisa.log] Erro de referência: console.' + strTipo + '()'); } if (strID) { console[strTipo](strID + ': ', mxMsg); } else { console[strTipo](mxMsg); } }, toggleInfo: function (codInfo) { $('.hint-' + codInfo).toggle('fast', function () { var $this = $(this); var isOpened = $this.css('display') != 'none'; if (isOpened) { $('.btn-info-' + codInfo).find('i') .removeClass('fa-plus') .addClass('fa-minus') ; } else { $('.btn-info-' + codInfo).find('i') .removeClass('fa-minus') .addClass('fa-plus') ; } }); }, /** * função que fixa o menu no topo quando rola o scroll */ stickyMenu: function () { $sticky_nav = $('div#box-cabecalho'); // $sticky_header = $('section.content-header'); // não está dentro dos forms da coleta if ($sticky_nav.length == 0) { return; } $sticky_nav_offset = $sticky_nav.offset(); $sticky_nav_top = $sticky_nav_offset.top; $sticky_nav_width = $sticky_nav.width(); // $sticky_header_offset = $sticky_header.offset(); // $sticky_header_top = $sticky_header_offset.top; var sticky_navigation = function () { var scroll_top = $(window).scrollTop(); // var headerHeight = $('.navbar-static-top').outerHeight(); var headerHeight = $('section.content').offset().top - 4; var offset = $('.sidebar-collapse').length > 0 ? 80 // menu lateral aberto : 260 // menu lateral fechado; // console.log($sticky_nav.get(0)); if (scroll_top >= headerHeight + 30) { $sticky_nav.css({ 'background-color': '#ecf0f5', 'padding-top': '10px', 'margin-bottom': '-15px', 'padding-bottom': '-15px !important', 'position': 'fixed', 'top': '50px', 'width': `calc(100% - ${offset}px)`, 'z-index': 299, // 'border-bottom': '3px solid #d2d6de' }); // $sticky_header.css({ // 'background-color' : '#ecf0f5', // 'padding-top' : '2px', // 'padding-bottom' : '2px', // 'position' : 'fixed', // 'top' : '50px', // 'width' : $sticky_nav_width, // 'z-index' : 299 // }); } else { $sticky_nav.css({ 'background-color': '#ecf0f5', 'padding-top': '10px', 'margin-bottom': '-15px', 'padding-bottom': '-15px !important', 'position': 'fixed', 'top': '50px', 'width': `calc(100% - ${offset}px)`, 'z-index': 299, // 'border-bottom': '3px solid #d2d6de' }); // $sticky_header.css({ // 'background-color' : '', // 'padding-top' : '0', // 'padding-bottom' : '0', // 'position' : 'relative', // 'top' : '0' // }); } }; sticky_navigation(); $(window).scroll(function () { sticky_navigation(); }); $(window).resize(function () { $sticky_nav_width = $('section.content-header').width(); var offset = $('.sidebar-collapse').length > 0 ? 80 // menu lateral aberto : 260 // menu lateral fechado; var headerHeight = $('section.content').offset().top - 4; $sticky_nav.css({ 'background-color': '#ecf0f5', 'padding-top': '10px', 'margin-bottom': '-15px', 'position': 'fixed', 'top': headerHeight + 'px', 'width': `calc(100% - ${offset}px)`, 'z-index': 299, 'border-bottom': '3px solid #d2d6de' }); }); }, maskIt: function (w, e, m, r, a) { String.prototype.reverse = function () { return this.split('').reverse().join(''); }; // Cancela se o evento for Backspace if (!e) var e = window.event if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; // Variaveis da funcao var txt = (!r) ? w.value.replace(/[^\d]+/gi, '') : w.value.replace(/[^\d]+/gi, '').reverse(); var mask = (!r) ? m : m.reverse(); var pre = (a) ? a.pre : ""; var pos = (a) ? a.pos : ""; var ret = ""; if (code == 9 || code == 8 || txt.length == mask.replace(/[^#]+/g, '').length) return false; // Loop na máscara para aplicar os caracteres for (var x = 0, y = 0, z = mask.length; x < z && y < txt.length; ) { if (mask.charAt(x) != '#') { ret += mask.charAt(x); x++; } else { ret += txt.charAt(y); y++; x++; } } // Retorno da função ret = (!r) ? ret : ret.reverse() w.value = pre + ret + pos; }, showPopupContatos: function (urlPopUp) { if (typeof (this._popUp["ContatoPsv"]) == 'undefined' || this._popUp.ContatoPsv.closed) { this._popUp["ContatoPsv"] = window.open(urlPopUp, "ContatoPsv", "height=750,width=1100, scrollbars=yes,statusbar=no,resizable=no,toolbar=0"); } else { this._popUp["ContatoPsv"].focus(); } }, closePopupContatos: function (opner) { if (typeof (this._popUp["ContatoPsv"]) != 'undefined' && this._popUp.ContatoPsv.closed) { this._popUp["ContatoPsv"].parent.close(); } else if (opner) { window.close(); } } });/** * Funções utilitárias de uso geral */ Sinisa.prototype.util = new (Sinisa.extend({ flash: function (element) { var $el = $(element), delay = arguments[arguments.length - 1] || 55, initialBgColor = $el.css('background-color'), opacity = 100, color = "255, 255, 20" // has to be in this format since we use rgba ; var interval = setInterval(function () { opacity -= 3; if (opacity <= 0) { clearInterval(interval); setTimeout(function () { $el.css('background-color', initialBgColor); }, 1); } $el.css({background: "rgba(" + color + ", " + opacity / 100 + ")"}); }, delay); }, jr: function (seletor) { return $(seletor).val(); }, jw: function (seletor, value) { $(seletor).val(value); }, attrId: function (mxObj) { return Number(this._extractAttrVlr(mxObj)[0]); }, attrVal: function (mxObj) { return String(this._extractAttrVlr(mxObj)[1]); }, /** * Extrai o par "id@sigla" dos campos que implementam a tabela tab_atributos_valores * Aceita: * 1. seletor jQuery. ex: #id | .classe * 2. objeto jQuery. ex: $('#id') * 3. objeto html. ex: * 4. string. ex: '22@DN' */ _extractAttrVlr: function (mxObj) { var r, m, s = '@'; if (!mxObj) return ''; if (_.isString(mxObj)) { // string if (mxObj.indexOf(s) > 0) { r = mxObj.split(s); } // seletor jQuery else if ((s = $(mxObj)).length > 0) { r = s.val().split(s); } else { throw new Error('[sinisa.util._extractAttrVlr] tipo do objeto "mxObj" não reconhecido como string válida.'); } } // objeto jquery $(..) else if (mxObj instanceof jQuery) { r = mxObj.val().split(s); } // objeto javascript else if (typeof mxObj == 'object') { r = $(mxObj).val().split(s); } else { throw new Error('[sinisa.util._extractAttrVlr] tipo do objeto "mxObj" não reconhecido como objeto válido.'); } return r; }, retiraFormatoMoeda: function (valor, casas) { var indexPont = valor.substr((-1 * (parseInt(casas) +1) ), 1); if(casas && casas>0 && indexPont=='.'){ valor = (valor) ? valor.replace(",", ".") : 0; }else{ valor = (valor) ? valor.replace(/\./g, "").replace(",", ".") : 0; } return parseFloat(valor); }, colocaFormatoMoeda: function (n, c, d, t) { c = isNaN(c = Math.abs(c)) ? 2 : c, d = d == undefined ? "," : d, t = t == undefined ? "." : t, s = n < 0 ? "-" : "", i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0; return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : ""); }, scrollTo: function (el, top) { top = top || 60; var _el = typeof (el) == 'jQuery' ? el : $("#" + el); if (_el.length > 0) { $("html, body").animate({scrollTop: _el.offset().top - top}, 2000); } }, scrollTop: function () { $("html, body").animate({scrollTop: 0}, 2000); }, tiraZeros: function (valor) { var tam = valor.length; var cont = 0; var comzero = new String; for (var i = 0; i < tam; i++) { if (valor.substring(i, i + 1) == 0) { comzero = comzero; if (cont == 1) { comzero = comzero + valor.substring(i, i + 1); } } else { comzero = comzero + valor.substring(i, i + 1); cont = 1; } } return (comzero == "") ? "0" : comzero; }, lpad: function (str, valor, max) { str = str.toString(); valor = valor.toString(); return str.length < max ? sinisa.util.lpad(valor + str, valor, max) : str; }, rpad: function (str, valor, max) { str = str.toString(); valor = valor.toString(); return str.length < max ? sinisa.util.rpad(str + valor, valor, max) : str; }, formataDecimal: function (campo, casas) { //se o valor for null ou não numerico casas = Math.trunc(casas); //se o numero de casas decimais for zero chama a funcao numerica if (!casas) { return sinisa.util.formataNumerico(campo); } var campoOriginal = campo.value; campo.value = sinisa.util.filtraCampo(campo); var vr = sinisa.util.tiraZeros(campo.value); var tam = vr.length; /* console.log('campoOriginal:'+campoOriginal); console.log('valor:'+campo.value); console.log('tam:'+tam); console.log('casas:'+casas); console.log('vr:'+vr); */ //campo nulo if (campo.value === "" || campoOriginal == (sinisa.util.rpad("0,", "0", casas + 1))) { campo.value = ""; tam = 0; } //campo igual a 0 else if (vr === "0") { campo.value = "0," + sinisa.util.rpad("0", '0', casas); tam = 0; } //inicia com zero else { campo.value = '0,' + sinisa.util.lpad(vr, '0', casas); } //de 9,9 ate 999,9 if ((tam > casas) && (tam <= 3 + casas)) { campo.value = vr.substr(0, tam - casas) + ',' + vr.substr(tam - casas, tam); } //de 9.999,9 ate 999,999,9 if ((tam >= 4 + casas) && (tam <= 6 + casas)) { campo.value = vr.substr(0, tam - (3 + casas)) + '.' + vr.substr(tam - (3 + casas), 3) + ',' + vr.substr(tam - casas, tam); } //de 9.999.999,9 ate 999.999,999,9 if ((tam >= 7 + casas) && (tam <= 9 + casas)) { campo.value = vr.substr(0, tam - (6 + casas)) + '.' + vr.substr(tam - (6 + casas), 3) + '.' + vr.substr(tam - (3 + casas), 3) + ',' + vr.substr(tam - casas, tam); } //de 9.999.999.999,9 ate 999.999,999.999,9 if ((tam >= 10 + casas) && (tam <= 12 + casas)) { campo.value = vr.substr(0, tam - (9 + casas)) + '.' + vr.substr(tam - (9 + casas), 3) + '.' + vr.substr(tam - (6 + casas), 3) + '.' + vr.substr(tam - (3 + casas), 3) + ',' + vr.substr(tam - casas, tam); } //define o limite maximo if (tam > 12 + casas) { vr = vr.substr(0, 12 + casas); tam = 12 + casas; campo.value = vr.substr(0, tam - (9 + casas)) + '.' + vr.substr(tam - (9 + casas), 3) + '.' + vr.substr(tam - (6 + casas), 3) + '.' + vr.substr(tam - (3 + casas), 3) + ',' + vr.substr(tam - casas, tam); } }, formataNumerico: function (campo) { campo.value = sinisa.util.filtraCampo(campo); var vr = sinisa.util.tiraZeros(campo.value); var tam = vr.length; //se 000 ate 000.000 if ((tam > 3) && (tam <= 6)) { campo.value = vr.substr(0, tam - 3) + '.' + vr.substr(tam - 3, 3); } //se 000.000 ate 000.000.000 if ((tam >= 7) && (tam <= 9)) { campo.value = vr.substr(0, tam - 6) + '.' + vr.substr(tam - 6, 3) + '.' + vr.substr(tam - 3, 3); } //se 000.000.000 ate 000.000.000.000 if ((tam >= 10) && (tam <= 12)) { campo.value = vr.substr(0, tam - 9) + '.' + vr.substr(tam - 9, 3) + '.' + vr.substr(tam - 6, 3) + '.' + vr.substr(tam - 3, 3); } //define o limite maximo if (tam > 12) { tam = 12; campo.value = vr.substr(0, tam - 9) + '.' + vr.substr(tam - 9, 3) + '.' + vr.substr(tam - 6, 3) + '.' + vr.substr(tam - 3, 3); } }, filtraCampo: function(campo) { var s = ""; var cp = ""; vr = campo.value; vr = vr.replace(/[^0-9]+/g, ''); tam = vr.length; for (i = 0; i < tam; i++) { if (vr.substring(i, i + 1) != "/" && vr.substring(i, i + 1) != "-" && vr.substring(i, i + 1) != "." && vr.substring(i, i + 1) != ",") { s = s + vr.substring(i, i + 1); } } campo.value = s; return cp = campo.value; }, formataDecimalDoBanco: function (v, c) { if (v.indexOf(',') == -1) { var regex1 = new RegExp('(\\d{' + c + '})$'); var regex2 = new RegExp('(\\d+)(\\d{3},\\d{' + c + '})$'); var numero = v.split('.'); if (numero[1] && c > 0) { var decimal = sinisa.util.rpad(numero[1], '0', c); decimal = decimal.substring(0, c); v = numero[0]; } v = v.replace(/\D/g, ""); //Remove tudo o que não é dígito v = v.replace(regex2, "$1.$2"); //Coloca o primeiro ponto var qtdLoop = ((v.length) - (3)) / 3; var count = 0; while (qtdLoop > count) { count++; v = v.replace(/(\d+)(\d{3}.*)/, "$1.$2"); //Coloca o resto dos pontos } v = v.replace(/^(0)(\d)/g, "$2"); //Coloca hífen entre o quarto e o quinto dígitos if (decimal) { v = v + ',' + decimal; } } return v; }, formataDecimalParaBanco: function (v) { if (v) { var vlor = v.replaceAll('.', ''); v = vlor.replaceAll(',', '.'); } else { v = 0.00; } return parseFloat(v); }, /** * Limpa os campos de um formulário modal * @param {*} formId : identificador do formulário modal a ser carregado * conforme aparece no div do modal-body */ limparCampos: function (formId) { // Checkboxes $(`#${formId} .box-body :checkbox`).each((i, box) => {box.checked = false;}); // Demais campos let campos = $(`#${formId} .box-body input, #${formId} .box-body select, #${formId} .box-body textArea`).not(':checkbox'); campos.val(null); }, /** * Carrega dados para um formulário modal; para uso em loadForm * @param {string} formId : identificador do formulário modal a ser * carregado (conforme aparece no div do modal-body) * @param {string} prefix : o prefixo usado para os campos do formulário * @param {object} response : a resposta ajax contendo os dados a serem * carregados no modal */ carregarDadosModal: function (formId, prefix, response) { $.each(response, function (i, val) { let seletor = `#${formId} #${prefix}-` + i; let campo = $(`${seletor}`); if (campo.length > 0) { // Seletores múltiplos e únicos if(campo.hasClass('checkboxAE')){ if(Array.isArray(val)){ // Checkboxes val.forEach((opt) => { campo.find( `.checkbox input[value=${opt}]` )[0].checked = true; }); } else campo.val(val); } else campo.val(val); } }); // Força validação no formulário $(`#${formId} input`).not(':hidden').not('[onchange]').first().trigger('blur'); }, /** * Remove asteriscos de obrigatoriedade associados aos campos informados. * Útil para simular, de forma estritamente visual, campos condicionalmente * obrigatórios (e.g. obrigatórios apenas para regionais etc). * @param {String} base : a base do nome da classe no formulário * @param {Array} campos : array de campos a terem asteriscos removidos */ removerAsteriscos: function (base, campos) { let baseSeletor = `.field-${base}-`; campos.forEach(function (codigo){ let campo = `${baseSeletor}${codigo}`; // Oculta span com asterisco associado ao campo, caso exista $($(`${campo}`).find('span')).each(function(){ if($(this).html() == '*'){ $(this).css('display', 'none'); } }); }); } })); /** * Tratamento de conexões via ajax */ Sinisa.prototype.ajax = new (Sinisa.extend({ intContadorReq: 0, // contador de requisições ajax init: function () { this.log('[sinisa.ajax] ajax pronto para uso'); }, defaultBlockUI: function(){ $.blockUI(); }, defaultUnblockUI: function(){ $.unblockUI(); }, blockUI: null, unblockUI: null, fnAjaxFail: function (jqXhr, textStatus, errorThrown) { console && console.log('[sinisa.ajax.fail] Falha na requisição [#'+ jqXhr.status +']: ' + errorThrown, null, 'error'); var msg = 'Erro interno'; if (typeof(jqXhr.responseJSON) !== 'undefined' && jqXhr.responseJSON.msg) { msg = jqXhr.responseJSON.msg; } if (typeof(sinisa.ajax.unblockUI) === 'function') { sinisa.ajax.unblockUI(); sinisa.ajax.unblockUI = null; } else { sinisa.ajax.defaultUnblockUI(); } sweetAlert('Houve um problema na requisição', msg, 'error'); }, fnAjaxAlways: function (mxDataOrJqXhr, textStatus, jqXhrOrErrorThrown) { var resposta = { mxDataOrJqXhr: mxDataOrJqXhr, textStatus: textStatus, jqXhrOrErrorThrown: jqXhrOrErrorThrown, }; if (typeof(sinisa.ajax.unblockUI) === 'function') { sinisa.ajax.unblockUI(); sinisa.ajax.unblockUI = null; } else { sinisa.ajax.defaultUnblockUI(); } console && console.log(resposta, '[sinisa.ajax.always] Resposta da requisição ['+ mxDataOrJqXhr.sinisaAjaxIntContadorReq +']'); }, fnAjaxDone: function (data, textStatus, jqXhr) { if (typeof(sinisa.ajax.unblockUI) === 'function') { sinisa.ajax.unblockUI(); sinisa.ajax.unblockUI = null; } else { sinisa.ajax.defaultUnblockUI(); } }, /** * Requisição genérica */ request: function (strUrl, objDados, fnCallback, strTipoRequisicao) { var me = this; // function(data) {} fnCallback = fnCallback || function() {}; // par {chave: valor, ...} objDados = objDados || {}; // POST | GET | JSON strTipoRequisicao = strTipoRequisicao || 'POST'; /** * Yii 2.0 CSRF validation for AJAX request */ if ($.inArray(strTipoRequisicao.toUpperCase(), ['GET', 'POST', 'OPTIONS'])) { var csrfParam = $('meta[name="csrf-param"]').attr("content"); var csrfToken = $('meta[name="csrf-token"]').attr("content"); objDados[csrfParam] = csrfToken; } objDados.sinisaAjaxIntContadorReq = ++this.intContadorReq; var jqXhr = $.ajax({ type: strTipoRequisicao, url: strUrl, data: objDados, success: function(data, textStatus, jqXHR){ if (typeof(sinisa.ajax.unblockUI) === 'function') { sinisa.ajax.unblockUI(); sinisa.ajax.unblockUI = null; } else { sinisa.ajax.defaultUnblockUI(); } if (typeof(jqXHR.responseJSON) !== 'undefined' && jqXHR.responseJSON.status == 'undefined') { $.error('Erro ao receber a resposta da requisição. "status" precisa estar presente na resposta.'); } else if (typeof(jqXHR.responseJSON) !== 'undefined' && jqXHR.responseJSON.status == 'erro') { sweetAlert('Houve um problema na requisição', (jqXHR.responseJSON.msg || ''), 'error'); } else { fnCallback(data, textStatus, jqXHR); } }, cache: false, async: true, beforeSend: function(jqXhr) { if (typeof(sinisa.ajax.blockUI) === 'function') { sinisa.ajax.blockUI(); sinisa.ajax.blockUI = null; } else { sinisa.ajax.defaultBlockUI(); } // log das requisições var ac = this.intContadorReq, msg = '[sinisa.ajax.request] ['+ ac +'] Requisição Ajax Efetuada: ' + strUrl ; me.log(objDados || {}, msg); } }) .then(function(dataJSON, textStatus, xhr) { if (strTipoRequisicao == 'POST' || _.isObject(dataJSON)) { if (dataJSON.status == 'erro') { return $.Deferred() .reject(xhr, dataJSON, dataJSON.msg) .promise(); } } return dataJSON; }) .always(this.fnAjaxAlways) .fail(this.fnAjaxFail) .done(this.fnAjaxDone); return jqXhr; }, post: function (strUrl, objDados, fnCallback) { if (_.isFunction(objDados)) { fnCallback = objDados; objDados = {}; } else if (_.isUndefined(objDados)) { objDados = {}; } return this.request(strUrl, objDados, fnCallback, 'POST'); }, get: function (strUrl, fnCallback) { return this.request(strUrl, {}, fnCallback, 'GET'); } })); sinisa = new Sinisa();sinisa.config();