File manager - Edit - /var/www/html/portal/public/pmar/js/paginas/contratos.js
Back
(function () { var configNode = document.getElementById('contratos-config'); if (!configNode) { return; } var endpoints = { lista: configNode.dataset.endpointLista || '', filtros: configNode.dataset.endpointFiltros || '', detalheTemplate: configNode.dataset.urlDetalheTemplate || '', licitacaoTemplate: configNode.dataset.urlLicitacaoTemplate || '' }; var textos = { numero: configNode.dataset.textoNumero || 'N.º', publicadoEm: configNode.dataset.textoPublicadoEm || 'Publicado em', ano: configNode.dataset.textoAno || 'Ano', modalidade: configNode.dataset.textoModalidade || 'Modalidade', situacao: configNode.dataset.textoSituacao || 'Situação', objeto: configNode.dataset.textoObjeto || 'Objeto', instituicao: configNode.dataset.textoInstituicao || 'Instituição', dataIni: configNode.dataset.textoDataIni || 'Data de início', dataFim: configNode.dataset.textoDataFim || 'Data de término', prorrogadoAte: configNode.dataset.textoProrrogadoAte || 'Prorrogado até', peloAnexo: configNode.dataset.textoPeloAnexo || 'pelo anexo n°', favorecido: configNode.dataset.textoFavorecido || 'Favorecido', valor: configNode.dataset.textoValor || 'Valor', processo: configNode.dataset.textoProcesso || 'N° do processo', fiscais: configNode.dataset.textoFiscais || 'Fiscais do Contrato', licitacao: configNode.dataset.textoLicitacao || 'Licitação', arquivos: configNode.dataset.textoArquivos || 'Arquivos', arquivo: configNode.dataset.textoArquivo || 'Arquivo', documentosEncontrados: configNode.dataset.textoDocumentosEncontrados || 'documento(s) encontrado(s)', semArquivos: configNode.dataset.textoSemArquivos || 'Sem arquivos vinculados.' }; var CONTRATO_STATUS_BADGE = { 0: 'lp-badge-default', 1: 'lp-badge-aberta', 2: 'lp-badge-encerrada', 3: 'lp-badge-cancelado', 4: 'lp-badge-suspenso' }; var CONTRATO_STATUS_ICON = { 0: 'fa-circle-dot', 1: 'fa-circle-play', 2: 'fa-circle-check', 3: 'fa-circle-xmark', 4: 'fa-circle-pause' }; var MODALIDADE_ICON = { 1: 'fa-gavel', 2: 'fa-gavel', 3: 'fa-envelope-open-text', 4: 'fa-store', 5: 'fa-store', 6: 'fa-file-circle-check', 7: 'fa-file-shield', 8: 'fa-id-badge' }; var form = document.getElementById('form-filtros-contratos'); var selectAno = document.getElementById('filtro-ano'); var selectSituacao = document.getElementById('filtro-situacao'); var selectSecretariaGestora = document.getElementById('filtro-secretaria-gestora'); var btnLimpar = document.getElementById('btn-limpar-filtros'); var btnCsv = document.getElementById('btn-download-csv'); var listaNode = document.getElementById('contratos-lista'); var paginacaoNode = document.getElementById('contratos-paginacao'); var totalResultados = document.getElementById('total-resultados-texto'); var estadoVazio = document.getElementById('contratos-estado-vazio'); var estadoErro = document.getElementById('contratos-erro'); var currentPage = 1; var lastItems = []; function escapeHtml(value) { return String(value || '') .replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } /** * Constrói o HTML da informação de prorrogação a partir do campo * server-computed `prorrogacao` retornado pela API. */ function getProrrogacaoHtml(item) { var p = item.prorrogacao; if (!p || !p.data) return ''; var html = ' <span class="text-muted">— ' + escapeHtml(textos.prorrogadoAte) + ' <strong>' + escapeHtml(p.data) + '</strong>'; if (p.titulo) { html += ' ' + escapeHtml(textos.peloAnexo) + ' ' + escapeHtml(p.titulo); } return html + '</span>'; } function getStatusBadgeClass(conStatus, labelFallback) { var code = parseInt(conStatus, 10); if (!isNaN(code) && Object.prototype.hasOwnProperty.call(CONTRATO_STATUS_BADGE, code)) { return CONTRATO_STATUS_BADGE[code]; } var normalized = String(labelFallback || '') .toLowerCase() .normalize('NFD') .replace(/[\u0300-\u036f]/g, ''); if (normalized.indexOf('ativo') !== -1) return 'lp-badge-aberta'; if (normalized.indexOf('encerr') !== -1) return 'lp-badge-encerrada'; if (normalized.indexOf('cancel') !== -1) return 'lp-badge-cancelado'; if (normalized.indexOf('suspen') !== -1) return 'lp-badge-suspenso'; return 'lp-badge-default'; } function getStatusIcon(conStatus, labelFallback) { var code = parseInt(conStatus, 10); if (!isNaN(code) && Object.prototype.hasOwnProperty.call(CONTRATO_STATUS_ICON, code)) { return CONTRATO_STATUS_ICON[code]; } var normalized = String(labelFallback || '') .toLowerCase() .normalize('NFD') .replace(/[\u0300-\u036f]/g, ''); if (normalized.indexOf('ativo') !== -1) return 'fa-circle-play'; if (normalized.indexOf('encerr') !== -1) return 'fa-circle-check'; if (normalized.indexOf('cancel') !== -1) return 'fa-circle-xmark'; if (normalized.indexOf('suspen') !== -1) return 'fa-circle-pause'; return 'fa-circle-dot'; } function getModalidadeIcon(conModalidade) { var code = parseInt(conModalidade, 10); return MODALIDADE_ICON[code] || 'fa-file-contract'; } function renderArquivos(arquivos) { if (!arquivos || arquivos.length === 0) { return '<span style="font-size:11px;color:#bbb">' + escapeHtml(textos.semArquivos) + '</span>'; } return arquivos.map(function (arquivo) { var legenda = arquivo.arq_titulo || arquivo.arq_numero || textos.arquivo; return ( '<a href="' + escapeHtml(arquivo.arquivo_url || '#') + '" target="_blank" rel="noopener noreferrer" class="lp-file-link">' + '<i class="fa-solid fa-download"></i>' + escapeHtml(legenda) + '</a>' ); }).join(''); } function getParams(page) { var data = new FormData(form); var params = new URLSearchParams(); data.forEach(function (value, key) { if (value !== null && String(value).trim() !== '') { params.append(key, String(value).trim()); } }); params.set('page', String(page || 1)); return params; } function setLoadingState() { estadoErro.classList.add('d-none'); estadoVazio.classList.add('d-none'); listaNode.innerHTML = ''; paginacaoNode.innerHTML = ''; totalResultados.textContent = '...'; } function renderCard(item) { var detalheUrl = endpoints.detalheTemplate ? endpoints.detalheTemplate.replace('__ID__', String(item.id_contrato || '')) : '#'; var status = item.status_label || '-'; var modalidade = item.modalidade_label || '-'; var statusClass = getStatusBadgeClass(item.con_status, status); var statusIcon = getStatusIcon(item.con_status, status); var modalidadeIcon = getModalidadeIcon(item.con_modalidade); var licitacaoUrl = (endpoints.licitacaoTemplate && item.licitacao_procedimento_id) ? endpoints.licitacaoTemplate.replace('__ID__', String(item.licitacao_procedimento_id)) : ''; var licitacaoLabel = escapeHtml(item.nr_licitacao || '-'); var licitacaoHtml = licitacaoUrl ? '<a href="' + escapeHtml(licitacaoUrl) + '" class="text-decoration-none">' + licitacaoLabel + '</a>' : licitacaoLabel; var prorrogacaoHtml = getProrrogacaoHtml(item); var dataFimHtml = escapeHtml(item.con_datafim || '-') + prorrogacaoHtml; var instituicao = escapeHtml(item.con_secretaria_gestora_nome || item.con_secretaria_nome || '-'); var cpfCnpjRaw = item.con_favorecido_formatado || item.con_favorecido || ''; return ( '<div class="lp-result-item">' + '<div class="lp-result-item-header">' + '<div class="lp-result-badges">' + (item.con_numero ? '<a href="' + escapeHtml(detalheUrl) + '" class="lp-badge lp-badge-numero">' + escapeHtml(item.con_numero) + '</a>' : '') + '<span class="lp-badge lp-badge-modalidade">' + '<i class="fa-solid ' + modalidadeIcon + '"></i>' + escapeHtml(modalidade) + '</span>' + '<span class="lp-badge ' + statusClass + '">' + '<i class="fa-solid ' + statusIcon + '"></i>' + escapeHtml(String(status)) + '</span>' + '</div>' + '</div>' + '<div class="lp-result-meta">' + '<div class="lp-meta-item">' + '<i class="fa-regular fa-calendar-check"></i>' + escapeHtml(item.con_datapub || '-') + '</div>' + '<div class="lp-meta-item">' + '<i class="fa-regular fa-calendar"></i>' + escapeHtml(item.con_ano || '-') + '</div>' + '<div class="lp-meta-item">' + '<i class="fa-regular fa-building"></i>' + instituicao + '</div>' + '<div class="lp-meta-item">' + '<i class="fa-regular fa-calendar-plus"></i>' + escapeHtml(item.con_dataini || '-') + '</div>' + (item.con_datafim || prorrogacaoHtml ? '<div class="lp-meta-item">' + '<i class="fa-regular fa-calendar-minus"></i>' + dataFimHtml + '</div>' : '') + (item.fav_nome ? '<div class="lp-meta-item">' + '<i class="fa-solid fa-user"></i>' + escapeHtml(item.fav_nome) + '</div>' : '') + (cpfCnpjRaw ? '<div class="lp-meta-item">' + '<i class="fa-regular fa-id-card"></i>' + escapeHtml(cpfCnpjRaw) + '</div>' : '') + (item.con_valor ? '<div class="lp-meta-item">' + '<i class="fa-regular fa-dollar-sign"></i>' + escapeHtml(item.con_valor) + '</div>' : '') + '<div class="lp-meta-item">' + '<i class="fa-regular fa-folder"></i>' + '<strong>' + escapeHtml(textos.processo) + '</strong>' + escapeHtml(item.con_processo || '-') + '</div>' + (item.nr_licitacao ? '<div class="lp-meta-item">' + '<i class="fa-regular fa-scale-balanced"></i>' + '<strong>' + escapeHtml(textos.licitacao) + '</strong>' + licitacaoHtml + '</div>' : '') + (item.con_fiscais ? '<div class="lp-meta-item">' + '<i class="fa-solid fa-users"></i>' + escapeHtml(item.con_fiscais) + '</div>' : '') + '</div>' + '<div class="lp-result-item-header">' + '<p class="lp-result-title">' + escapeHtml(item.con_titulo || '-') + '</p>' + '</div>' + '<div class="lp-file-links">' + renderArquivos(item.arquivos) + '</div>' + '</div>' ); } function renderPagination(meta) { if (!meta || meta.last_page <= 1) { paginacaoNode.innerHTML = ''; return; } var currentPage = Number(meta.current_page || 1); var lastPage = Number(meta.last_page || 1); var pages = []; function addPage(page) { if (page >= 1 && page <= lastPage && pages.indexOf(page) === -1) { pages.push(page); } } addPage(1); addPage(lastPage); for (var p = currentPage - 2; p <= currentPage + 2; p++) { addPage(p); } pages.sort(function (a, b) { return a - b; }); var html = '<nav aria-label="Navegacao de paginas"><ul class="pagination mb-0">'; html += '<li class="page-item' + (currentPage <= 1 ? ' disabled' : '') + '">' + '<a class="page-link" href="#" data-page="' + (currentPage - 1) + '" aria-label="Pagina anterior">«</a></li>'; var previousPage = 0; for (var i = 0; i < pages.length; i++) { var page = pages[i]; if (previousPage && page - previousPage > 1) { html += '<li class="page-item disabled"><span class="page-link">...</span></li>'; } html += '<li class="page-item' + (page === currentPage ? ' active' : '') + '">' + '<a class="page-link" href="#" data-page="' + page + '">' + page + '</a></li>'; previousPage = page; } html += '<li class="page-item' + (currentPage >= lastPage ? ' disabled' : '') + '">' + '<a class="page-link" href="#" data-page="' + (currentPage + 1) + '" aria-label="Proxima pagina">»</a></li>'; html += '</ul></nav>'; paginacaoNode.innerHTML = html; } function fetchList(page) { currentPage = page || 1; setLoadingState(); applyUrlState(currentPage); return fetch(endpoints.lista + '?' + getParams(currentPage).toString()) .then(function (response) { if (!response.ok) { throw new Error('request_failed'); } return response.json(); }) .then(function (payload) { var items = payload.data || []; var meta = payload.meta || {}; lastItems = items; totalResultados.textContent = String(meta.total || 0) + ' ' + textos.documentosEncontrados; if (!items.length) { estadoVazio.classList.remove('d-none'); return; } listaNode.innerHTML = items.map(renderCard).join(''); renderPagination(meta); }) .catch(function () { lastItems = []; estadoErro.classList.remove('d-none'); totalResultados.textContent = '-'; }); } function toCsv(rows) { var header = [ 'id_contrato', 'numero', 'ano', 'modalidade', 'status', 'data_publicacao', 'titulo', 'favorecido', 'cpf_cnpj', 'valor', 'processo', 'licitacao', 'instituicao', 'data_inicio', 'data_fim', 'fiscais' ]; var lines = [header.join(';')]; rows.forEach(function (row) { lines.push([ row.id_contrato, row.con_numero, row.con_ano, row.modalidade_label || row.con_modalidade, row.status_label || row.con_status, row.con_datapub, String(row.con_titulo || '').replace(/;/g, ',').replace(/\n/g, ' '), row.fav_nome, row.con_favorecido_formatado || row.con_favorecido, row.con_valor, row.con_processo, row.nr_licitacao, row.con_secretaria_gestora_nome || row.con_secretaria_nome, row.con_dataini, row.con_datafim, String(row.con_fiscais || '').replace(/;/g, ',').replace(/\n/g, ' ') ].map(function (value) { return '"' + String(value !== undefined && value !== null ? value : '') + '"'; }).join(';')); }); return lines.join('\n'); } function fillSelect(select, values) { values.forEach(function (value) { var option = document.createElement('option'); if (value && typeof value === 'object' && Object.prototype.hasOwnProperty.call(value, 'value')) { option.value = String(value.value); option.textContent = String(value.label || value.value); } else { option.value = String(value); option.textContent = String(value); } select.appendChild(option); }); } function fetchFiltros() { return fetch(endpoints.filtros) .then(function (response) { if (!response.ok) { throw new Error('request_failed'); } return response.json(); }) .then(function (payload) { fillSelect(selectAno, payload.anos || []); fillSelect(selectSituacao, payload.status || []); fillSelect(selectSecretariaGestora, payload.secretarias_gestoras || []); }); } function applyUrlState(page) { var params = getParams(page); var newUrl = window.location.pathname + '?' + params.toString(); window.history.replaceState({}, '', newUrl); } function restoreFromQueryString() { var params = new URLSearchParams(window.location.search); Array.prototype.forEach.call(form.elements, function (field) { if (!field.name) { return; } if (field.type === 'checkbox') { field.checked = params.get(field.name) === field.value; return; } if (params.has(field.name)) { field.value = params.get(field.name); } }); if (params.has('page')) { currentPage = parseInt(params.get('page'), 10) || 1; } } form.addEventListener('submit', function (event) { event.preventDefault(); fetchList(1); }); btnLimpar.addEventListener('click', function () { form.reset(); currentPage = 1; window.history.replaceState({}, '', window.location.pathname); fetchList(1); }); paginacaoNode.addEventListener('click', function (event) { var link = event.target.closest('a[data-page]'); if (!link) { return; } event.preventDefault(); var page = parseInt(link.dataset.page, 10); if (!isNaN(page) && page > 0) { fetchList(page); window.scrollTo({ top: 0, behavior: 'smooth' }); } }); if (btnCsv) { btnCsv.addEventListener('click', function (event) { event.preventDefault(); if (!lastItems.length) { return; } var csv = toCsv(lastItems); var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); var url = URL.createObjectURL(blob); var link = document.createElement('a'); link.href = url; link.download = 'contratos.csv'; document.body.appendChild(link); link.click(); link.remove(); URL.revokeObjectURL(url); }); } restoreFromQueryString(); fetchFiltros().finally(function () { fetchList(currentPage); }); })();
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings