From 52c8e90aded3f272de696264051eefc8890eff91 Mon Sep 17 00:00:00 2001 From: Punkrig Date: Wed, 5 Jun 2024 10:25:00 -0300 Subject: [PATCH 01/48] =?UTF-8?q?feat(Bug):notifica=C3=A7=C3=A3o.=20-Filtr?= =?UTF-8?q?ando=20caracteres=20especiais=20em=20alguns=20campos;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/assets/js/formulario.js | 65 +++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/lgbtq_connect/assets/js/formulario.js b/lgbtq_connect/assets/js/formulario.js index 610c42ff..7163beda 100644 --- a/lgbtq_connect/assets/js/formulario.js +++ b/lgbtq_connect/assets/js/formulario.js @@ -1,23 +1,73 @@ var ajaxUrl = my_ajax_object.ajax_url; document.addEventListener('DOMContentLoaded', function () { + // Verifica se há dados no localStorage e os exibe + if (localStorage.getItem('formData')) { + console.log('Dados enviados anteriormente:'); + console.log(JSON.parse(localStorage.getItem('formData'))); + localStorage.removeItem('formData'); // Limpa os dados após exibi-los + } + $('#meu_formulario').on('submit', function (e) { - e.preventDefault(); // Previne que o formulário dê submit na forma padrão - // Verifica se os campos estão preenchidos + e.preventDefault(); + var nome = document.getElementById('nome').value; var email = document.getElementById('email_f').value; var latitude = document.getElementById('latitude').value; var longitude = document.getElementById('longitude').value; var servico = document.getElementById('servico').value; var descricao = document.getElementById('descricao').value; - var outroServico = document.getElementById('servico_outro').value + var outroServico = document.getElementById('servico_outro').value; + + // Função para verificar caracteres especiais + function hasSpecialChars(str) { + return /[^a-zA-Z0-9 ]/.test(str); + } + + // Verifica a presença de caracteres especiais + console.log('Verificação de caracteres especiais:'); + console.log('Nome:', nome, ' - ', hasSpecialChars(nome)); + console.log('Email:', email, ' - ', hasSpecialChars(email)); + console.log('Latitude:', latitude, ' - ', hasSpecialChars(latitude)); + console.log('Longitude:', longitude, ' - ', hasSpecialChars(longitude)); + console.log('Serviço:', servico, ' - ', hasSpecialChars(servico)); + console.log('Descrição:', descricao, ' - ', hasSpecialChars(descricao)); + console.log('Outro Serviço:', outroServico, ' - ', hasSpecialChars(outroServico)); + + // Log dos dados do formulário antes do envio + console.log('Dados do formulário:'); + console.log({ + nome: nome, + email: email, + latitude: latitude, + longitude: longitude, + servico: servico, + descricao: descricao, + outroServico: outroServico + }); + if (nome === '' || email === '' || latitude === '' || longitude === '' || (servico === 'outro' && outroServico === '')) { alert('Por favor, preencha todos os campos.'); - console.log(nome,email,latitude,longitude,servico,descricao,outroServico) return; - }else { + } else if (hasSpecialChars(nome) || hasSpecialChars(servico) || hasSpecialChars(descricao) || hasSpecialChars(outroServico)) { + alert("Não insira caracteres especiais"); + console.log('Campos com caracteres especiais:', { nome, email, latitude, longitude, servico, descricao, outroServico }); + return; + } else { // Serializa os dados do formulário var formData = $(this).serialize(); + var formDataObject = { + nome: nome, + email: email, + latitude: latitude, + longitude: longitude, + servico: servico, + descricao: descricao, + outroServico: outroServico + }; + + // Armazena os dados no localStorage + localStorage.setItem('formData', JSON.stringify(formDataObject)); // Envia o pedido do AJAX $.ajax({ @@ -29,16 +79,15 @@ document.addEventListener('DOMContentLoaded', function () { }, success: function (response) { // Resposta caso dê certo - console.log(response); + console.log('Resposta do servidor:', response); // Se o envio for bem-sucedido, executar a função exit_page() transicaoPagina("PaginaComPopup", "div_saida"); }, error: function (xhr, status, error) { // Resposta caso dê errado - console.error(error); + console.error('Erro no envio do formulário:', error); }, }); } }); }); - From b89d900fe3f2ac08db298ae00592da2e7ee6be08 Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Wed, 5 Jun 2024 11:10:54 -0300 Subject: [PATCH 02/48] =?UTF-8?q?test(devs):=20adicionado=20teste=20do=20f?= =?UTF-8?q?iltro=20da=20p=C3=A1gina=20de=20administa=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/includes/admin/admin_script.js | 10 +++++++--- tests/js/math.test.js | 5 ----- 2 files changed, 7 insertions(+), 8 deletions(-) delete mode 100644 tests/js/math.test.js diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index a40a9777..45e1b830 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -1,7 +1,7 @@ class Filtro { static status = "Todos"; static nome = ""; - static servico = "todos"; + static servico = ""; static realizarFiltragem(arr) { const self = this; @@ -20,7 +20,7 @@ class Filtro { } static checarNome(formulario) { - return(formulario.nome.toLowerCase().trim().startsWith(this.nome)); + return(formulario.nome.toLowerCase().trim().startsWith(this.nome.toLowerCase().trim())); } static checarServico(formulario) { @@ -278,7 +278,7 @@ function filtrar(elemento) { if(filtro_nome) { - Filtro.nome = filtro_nome.value.toLowerCase().trim(); + Filtro.nome = filtro_nome.value } if (filtro_servico) @@ -310,3 +310,7 @@ window.onload = function () { initMapAdmin(); }; +// Exporta as classes +module.exports = { + Filtro +}; \ No newline at end of file diff --git a/tests/js/math.test.js b/tests/js/math.test.js deleted file mode 100644 index 6c5b0a9c..00000000 --- a/tests/js/math.test.js +++ /dev/null @@ -1,5 +0,0 @@ -import {Mapa} from '../../lgbtq_connect/assets/js/script.js'; - -test('adds 1 + 2 to equal 3', () => { - expect(Mapa.sum(1, 2)).toBe(3); -}); From 188e952558c22e6367d020c38af94c7107b155c4 Mon Sep 17 00:00:00 2001 From: Punkrig Date: Wed, 5 Jun 2024 11:18:18 -0300 Subject: [PATCH 03/48] =?UTF-8?q?feat(Bug):notifica=C3=A7=C3=A3o.=20-Filtr?= =?UTF-8?q?ando=20caracteres=20especiais=20em=20alguns=20campos;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/assets/js/formulario.js | 6 +++--- lgbtq_connect/includes/data/process_form.php | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lgbtq_connect/assets/js/formulario.js b/lgbtq_connect/assets/js/formulario.js index 7163beda..a2770180 100644 --- a/lgbtq_connect/assets/js/formulario.js +++ b/lgbtq_connect/assets/js/formulario.js @@ -49,9 +49,9 @@ document.addEventListener('DOMContentLoaded', function () { if (nome === '' || email === '' || latitude === '' || longitude === '' || (servico === 'outro' && outroServico === '')) { alert('Por favor, preencha todos os campos.'); return; - } else if (hasSpecialChars(nome) || hasSpecialChars(servico) || hasSpecialChars(descricao) || hasSpecialChars(outroServico)) { + } else if (hasSpecialChars(nome) || hasSpecialChars(descricao) || hasSpecialChars(outroServico)) { alert("Não insira caracteres especiais"); - console.log('Campos com caracteres especiais:', { nome, email, latitude, longitude, servico, descricao, outroServico }); + console.log('Campos com caracteres especiais:', { nome, descricao, outroServico }); return; } else { // Serializa os dados do formulário @@ -90,4 +90,4 @@ document.addEventListener('DOMContentLoaded', function () { }); } }); -}); +}); \ No newline at end of file diff --git a/lgbtq_connect/includes/data/process_form.php b/lgbtq_connect/includes/data/process_form.php index 63cb8fd9..b817eacc 100644 --- a/lgbtq_connect/includes/data/process_form.php +++ b/lgbtq_connect/includes/data/process_form.php @@ -11,13 +11,13 @@ function processar_formulario() { parse_str($_POST['formData'], $formFields); // Filtra o conteúdo enviado nos formulários - $nome = isset($formFields['nome']) ? Auxiliar_Process_Forms::sanitize_data($formFields['nome'], 'text') : ''; - $email = isset($formFields['email']) ? Auxiliar_Process_Forms::sanitize_data($formFields['email'], 'email') : ''; - $descricao = isset($formFields['descricao']) ? Auxiliar_Process_Forms::sanitize_data($formFields['descricao'], 'textarea') : ''; - $latitude = isset($formFields['latitude']) ? Auxiliar_Process_Forms::sanitize_data($formFields['latitude'], 'float') : 0; - $longitude = isset($formFields['longitude']) ? Auxiliar_Process_Forms::sanitize_data($formFields['longitude'], 'float') : 0; - $servico = isset($formFields['servico']) ? Auxiliar_Process_Forms::sanitize_data($formFields['servico'], 'text') : ''; - + $nome = isset($formFields['nome']) ? filter_var($formFields['nome'], FILTER_SANITIZE_STRING) : ''; + $email = isset($formFields['email']) ? filter_var($formFields['email'], FILTER_SANITIZE_EMAIL) : ''; + $descricao = isset($formFields['descricao']) ? filter_var($formFields['descricao'], FILTER_SANITIZE_STRING) : ''; + $latitude = isset($formFields['latitude']) ? filter_var($formFields['latitude'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND | FILTER_FLAG_ALLOW_SCIENTIFIC) : 0; + $longitude = isset($formFields['longitude']) ? filter_var($formFields['longitude'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND | FILTER_FLAG_ALLOW_SCIENTIFIC) : 0; + $servico = isset($formFields['servico']) ? filter_var($formFields['servico'], FILTER_SANITIZE_STRING) : ''; + // Verifica se todos os campos necessários estão presentes if ($nome && $email && $descricao && $latitude && $longitude && $servico) { $data_hora_envio = Auxiliar_Process_Forms::get_current_time(); From 15e4fb165269f9a73d6fc721bae406d12643d289 Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Wed, 5 Jun 2024 11:24:46 -0300 Subject: [PATCH 04/48] =?UTF-8?q?test(devs):=20adicionado=20m=C3=A9todo=20?= =?UTF-8?q?de=20reiniciar=20o=20filtro=20da=20classe=20Filtro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/includes/admin/admin_script.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index 45e1b830..a74520dd 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -31,6 +31,13 @@ class Filtro { return true; } } + + static reiniciarFiltro() + { + this.status="Todos"; + this.nome=""; + this.servico=""; + } } function mostrarDescricaoCompleta(id) { @@ -312,5 +319,8 @@ window.onload = function () { // Exporta as classes module.exports = { - Filtro + Filtro, + adicionarZero, + formatarDataHora, + gerarLinhas }; \ No newline at end of file From d95d889dbabd10c6f43d53147a718a6c665f887e Mon Sep 17 00:00:00 2001 From: Will Date: Wed, 5 Jun 2024 12:47:30 -0300 Subject: [PATCH 05/48] Feat: Adicionando esqueleto da tela de edicao + funcionalidades basicas --- lgbtq_connect/includes/admin/admin_script.js | 50 ++++++++++++++++++- .../includes/admin/pagina_administracao.php | 50 +++++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index a40a9777..30640e8f 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -255,7 +255,7 @@ function gerarLinhas(tabela, arr) ${acoes} - + `; @@ -263,6 +263,54 @@ function gerarLinhas(tabela, arr) }); } +function abrirModalEdicao(dados) { + var modal = document.getElementById('editModal'); + var cancelEditBtn = document.getElementById('cancelEditBtn'); + + // Preenche os campos do formulário com os dados fornecidos + document.getElementById('editId').value = dados.id; + document.getElementById('editNome').value = dados.nome; + document.getElementById('editEmail').value = dados.email; + document.getElementById('editLatitude').value = dados.latitude; + document.getElementById('editLongitude').value = dados.longitude; + document.getElementById('editServico').value = dados.servico; + document.getElementById('editDescricao').value = dados.descricao; + + // Mostrar campo "Outro" se necessário + if (dados.servico === "outro") { + document.getElementById('editOutroServico').style.display = 'block'; + document.getElementById('editServicoOutro').value = dados.servico_outro; + } else { + document.getElementById('editOutroServico').style.display = 'none'; + document.getElementById('editServicoOutro').value = ''; + } + + // Exibe o modal de edição + modal.style.display = "block"; + + // Fecha o modal de edição quando o botão cancelar é clicado + cancelEditBtn.onclick = function() { + modal.style.display = "none"; + }; + + // Fecha o modal de edição quando o usuário clica fora do modal + window.onclick = function(event) { + if (event.target == modal) { + modal.style.display = "none"; + } + }; +} + +// Função para mostrar o campo "Outro" no modal de edição +function mostrarOutroEdit() { + var servico = document.getElementById('editServico').value; + if (servico === 'outro') { + document.getElementById('editOutroServico').style.display = 'block'; + } else { + document.getElementById('editOutroServico').style.display = 'none'; + } +} + function filtrar(elemento) { let arr = []; diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index e0d342f3..2f9f7501 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -90,6 +90,56 @@ function mostrar_dados() { + + + + From 9a263ce37dab7e50c0b5ccf4b91850734a65d6a2 Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Thu, 6 Jun 2024 12:37:26 -0300 Subject: [PATCH 06/48] =?UTF-8?q?test(devs):=20foram=20adicionados=203=20c?= =?UTF-8?q?onjuntos=20de=20testes=20para=20o=20JavaScript=20-=20foi=20adic?= =?UTF-8?q?ionado=20um=20conjunto=20de=20testes=20para=20o=20filtro=20na?= =?UTF-8?q?=20p=C3=A1gina=20do=20admin=20-=20foi=20adicionado=20um=20conju?= =?UTF-8?q?nto=20de=20testes=20para=20a=20ordena=C3=A7=C3=A3o=20na=20p?= =?UTF-8?q?=C3=A1gina=20do=20admin=20-=20foi=20adicionado=20um=20conjunto?= =?UTF-8?q?=20de=20testes=20para=20a=20tabela=20na=20p=C3=A1gina=20do=20ad?= =?UTF-8?q?min=20-=20o=20c=C3=B3digo=20do=20admin=5Fscript.js=20foi=20refa?= =?UTF-8?q?torado=20para=20maior=20facilidade=20nos=20testes=20unit=C3=A1r?= =?UTF-8?q?ios=20-=20alguns=20outros=20arquivos=20foram=20modificados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/includes/admin/admin_script.js | 336 +++++++++--------- .../includes/admin/pagina_administracao.php | 6 +- lgbtq_connect/includes/admin/style-admin.css | 5 + lgbtq_connect/index.php | 6 + tests/js/filtro_admin.test.js | 63 ++++ tests/js/ordenacao_admin.test.js | 78 ++++ tests/js/tabela_admin.test.js | 74 ++++ 7 files changed, 399 insertions(+), 169 deletions(-) create mode 100644 tests/js/filtro_admin.test.js create mode 100644 tests/js/ordenacao_admin.test.js create mode 100644 tests/js/tabela_admin.test.js diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index a74520dd..dde0298d 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -40,27 +40,122 @@ class Filtro { } } -function mostrarDescricaoCompleta(id) { - var descricaoResumida = document.getElementById('descricaoResumida_' + id); - var descricaoCompleta = document.getElementById('descricaoCompleta_' + id); - var botao = document.querySelector('button[data-id="' + id + '"]'); +class Ordenador { + static coluna = "nome"; + static ordem = "asc"; - if (descricaoResumida.style.display === 'none') { - descricaoResumida.style.display = 'inline'; - descricaoCompleta.style.display = 'none'; - botao.innerText = 'Ver mais'; - } else { - descricaoResumida.style.display = 'none'; - descricaoCompleta.style.display = 'inline'; - botao.innerText = 'Ver menos'; + static realizarOrdenacao(arr) { + const self = this; + return arr.sort(function (a, b) { + const aValue = a[self.coluna].trim().toLowerCase(); + const bValue = b[self.coluna].trim().toLowerCase(); + + return (self.ordem === 'asc') ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue); + }); } } + +// Classe Singleton com todo os métodos e atributos relacionado a tabela +class Tabela { + static adicionarZero(numero) { + return numero < 10 ? '0' + numero : numero; + } + + static formatarDataHora(data) { + const dia = Tabela.adicionarZero(data.getDate()); + const mes = Tabela.adicionarZero(data.getMonth() + 1); // Adiciona 1 porque os meses são indexados de 0 a 11 + const ano = data.getFullYear(); + const hora = Tabela.adicionarZero(data.getHours()); + const minutos = Tabela.adicionarZero(data.getMinutes()); + const segundos = Tabela.adicionarZero(data.getSeconds()); + + return `${dia}/${mes}/${ano} ${hora}:${minutos}:${segundos}`; + } + + constructor(arr, tabela) { + if(Tabela.instance) + return Tabela.instance + + this.arr = arr; + this.tabela = tabela; + Tabela.instance = this; + } + + // Limpa o conteúdo da tabela + excluirLinhas() { + const tbody = this.tabela.querySelector('tbody'); + tbody.innerHTML=""; + } + + // Gera novas linhas na tabela de acordo com a array definida + gerarLinhas() + { + const STATUS_BOTOES = { + "Aprovado" : ` + + `, + "Negado" : ` + + `, + "Pendente" : ` + + + ` + } + const tbody = this.tabela.querySelector('tbody'); + + this.arr.forEach(dados => { + const linha = document.createElement('tr'); + linha.id = "formulario-" + dados.id; + let descricao; + let data = new Date(dados.data_hora); + let dataFormatada = Tabela.formatarDataHora(data); + if (dados.descricao.length > 10){ + descricao = ` + ${dados.descricao.substring(0, 10)}... + + + ` + } + else { + descricao = dados.descricao; + } + + let acoes = STATUS_BOTOES[dados.situacao]; + + linha.innerHTML = ` + + + + + + + + + + `; + tbody.appendChild(linha); + }); + } +} + function destacarLinhaTabela(id) { - var tabela = document.getElementById("tabela"); - var linha = document.getElementById(id); + let tabela = document.getElementById("tabela"); + let linha = document.getElementById(("formulario-" +id)); + + if(linha===null) { + return; + } // Loop para remover a linha-destacada de todas as linhas - for (var i = 0, row; (row = tabela.rows[i]); i++) { + for (let i = 0, row; (row = tabela.rows[i]); i++) { row.classList.remove('linha-destacada'); } @@ -73,6 +168,22 @@ function destacarLinhaTabela(id) { }, 2000); } +function mostrarDescricaoCompleta(id) { + var descricaoResumida = document.getElementById('descricaoResumida_' + id); + var descricaoCompleta = document.getElementById('descricaoCompleta_' + id); + var botao = document.querySelector('button[data-id="' + id + '"]'); + + if (descricaoResumida.style.display === 'none') { + descricaoResumida.style.display = 'inline'; + descricaoCompleta.style.display = 'none'; + botao.innerText = 'Ver mais'; + } else { + descricaoResumida.style.display = 'none'; + descricaoCompleta.style.display = 'inline'; + botao.innerText = 'Ver menos'; + } +} + function initMapAdmin() { if(document.getElementById('mapa_admin') == null) { @@ -94,93 +205,6 @@ function initMapAdmin() { }); } -function initSortButtons() { - // Adiciona um evento de clique aos botões de ordenação - var sortButtons = document.querySelectorAll('.sort-btn'); - - sortButtons.forEach(function(button) { - button.addEventListener('click', function() { - var table = button.closest('table'); - var columnIndex = Array.from(button.parentNode.parentNode.children).indexOf(button.parentNode); - var order = button.getAttribute('data-order') || 'asc'; - - order = (order === 'asc') ? 'desc' : 'asc'; - button.setAttribute('data-order', order); - - // Atualiza o ícone do botão de ordenação - var icon = button.querySelector('.sort-icon'); - - // Remove e adiciona a classe do ícone com base na direção da ordenação - if (order === 'asc') { - icon.innerHTML = '▾'; // Triângulo para baixo (ordem crescente) - } else { - icon.innerHTML = '▴'; // Triângulo para cima (ordem decrescente) - } - - // Obtém todas as linhas da tabela, exceto a primeira (cabeçalho) - var rows = Array.from(table.querySelectorAll('tbody > tr')); - - // Determina o critério de ordenação com base na classe do botão - if (button.classList.contains('sort-by-date')) { - rows.sort(function(a, b) { - var aValue = new Date(a.children[columnIndex].textContent.trim().replace(/(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}):(\d{2})/, '$3-$2-$1T$4:$5:$6')); - var bValue = new Date(b.children[columnIndex].textContent.trim().replace(/(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}):(\d{2})/, '$3-$2-$1T$4:$5:$6')); - - return (order === 'asc') ? aValue - bValue : bValue - aValue; - }); - } else if (button.classList.contains('sort-by-email')) { - rows.sort(function(a, b) { - var aValue = a.children[columnIndex].textContent.trim().toLowerCase(); - var bValue = b.children[columnIndex].textContent.trim().toLowerCase(); - - return (order === 'asc') ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue); - }); - } else { - // Caso padrão: ordenação por texto - rows.sort(function(a, b) { - var aValue = a.children[columnIndex].textContent.trim().toLowerCase(); - var bValue = b.children[columnIndex].textContent.trim().toLowerCase(); - - return (order === 'asc') ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue); - }); - } - - // Limpa o conteúdo da tabela antes de reordenar - while (table.querySelector('tbody').firstChild) { - table.querySelector('tbody').removeChild(table.querySelector('tbody').firstChild); - } - - // Reinsere as linhas ordenadas na tabela - rows.forEach(function(row) { - table.querySelector('tbody').appendChild(row); - }); - }); - }); -} - -// Limpa o conteúdo da tabela -function excluirLinhas(tabela) -{ - while (tabela.querySelector('tbody').firstChild) { - tabela.querySelector('tbody').removeChild(tabela.querySelector('tbody').firstChild); - } -} - -function adicionarZero(numero) { - return numero < 10 ? '0' + numero : numero; -} - -function formatarDataHora(data) { - const dia = adicionarZero(data.getDate()); - const mes = adicionarZero(data.getMonth() + 1); // Adiciona 1 porque os meses são indexados de 0 a 11 - const ano = data.getFullYear(); - const hora = adicionarZero(data.getHours()); - const minutos = adicionarZero(data.getMinutes()); - const segundos = adicionarZero(data.getSeconds()); - - return `${dia}/${mes}/${ano} ${hora}:${minutos}:${segundos}`; -} - function confirmarAcao(mensagem, formulario, acao) { // Seleciona o modal e seus elementos var modal = document.getElementById('confirmModal'); @@ -213,64 +237,6 @@ function confirmarAcao(mensagem, formulario, acao) { }; } -function gerarLinhas(tabela, arr) -{ - const STATUS_BOTOES = { - "Aprovado" : ` - - `, - "Negado" : ` - - `, - "Pendente" : ` - - - ` - } - var tbody = tabela.querySelector('tbody'); - - arr.forEach(dados => { - var linha = document.createElement('tr'); - linha.id = dados.id; - var descricao; - var data = new Date(dados.data_hora); - var dataFormatada = formatarDataHora(data); - if (dados.descricao.length > 10){ - descricao = ` - ${dados.descricao.substring(0, 10)}... - - - ` - } - else { - descricao = dados.descricao; - } - - acoes = STATUS_BOTOES[dados.situacao]; - - linha.innerHTML = ` - - - - - - - - - - `; - tbody.appendChild(linha); - }); -} - - function filtrar(elemento) { let arr = []; @@ -299,8 +265,48 @@ function filtrar(elemento) { `; const tabela = document.getElementById("tabela"); - excluirLinhas(tabela); - gerarLinhas(tabela, arr); + const tabelaObj = new Tabela([], tabela); + tabelaObj.arr = arr; + + tabelaObj.excluirLinhas() + tabelaObj.gerarLinhas(); +} + +function ordenar(elemento) { + let order = elemento.getAttribute('data-order') || 'asc'; + + order = (order === 'asc') ? 'desc' : 'asc'; + elemento.setAttribute('data-order', order); + + // Atualiza o ícone do botão de ordenação + var icon = elemento.querySelector('.sort-icon'); + + // Remove e adiciona a classe do ícone com base na direção da ordenação + if (order === 'asc') { + icon.innerHTML = '▾'; // Triângulo para baixo (ordem crescente) + } else { + icon.innerHTML = '▴'; // Triângulo para cima (ordem decrescente) + } + + Ordenador.ordem = order; + + // Determina o critério de ordenação com base na classe do botão + if (elemento.classList.contains('sort-by-date')) { + Ordenador.coluna = "data_hora" + } + else if (elemento.classList.contains('sort-by-email')) { + Ordenador.coluna = "email" + } + else { + // Caso padrão: ordenação por nome + Ordenador.coluna = "nome" + } + + const tabelaObj = new Tabela([], tabela); + tabelaObj.arr = Ordenador.realizarOrdenacao(tabelaObj.arr); + + tabelaObj.excluirLinhas(); + tabelaObj.gerarLinhas() } // Adiciona um evento de clique a todos os botões de "Ver mais/menos" @@ -313,14 +319,12 @@ document.querySelectorAll('.ver-mais-btn').forEach(function(button) { // Inicializa o mapa e os botões de ordenação quando a página carrega window.onload = function () { - initSortButtons(); initMapAdmin(); }; // Exporta as classes module.exports = { Filtro, - adicionarZero, - formatarDataHora, - gerarLinhas + Ordenador, + Tabela, }; \ No newline at end of file diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index e0d342f3..c63dc112 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -93,13 +93,13 @@ function mostrar_dados() {
${dados.nome}${dados.email}${dados.latitude}${dados.longitude}${dados.servico}${descricao}${dataFormatada}${dados.situacao} +
+ + + ${acoes} + + +
${dados.nome}${dados.email}${dados.latitude}${dados.longitude}${dados.servico}${descricao}${dataFormatada}${dados.situacao} - - - - ${acoes} - - -
- - + + - + diff --git a/lgbtq_connect/includes/admin/style-admin.css b/lgbtq_connect/includes/admin/style-admin.css index d66fecb9..9ef3385b 100644 --- a/lgbtq_connect/includes/admin/style-admin.css +++ b/lgbtq_connect/includes/admin/style-admin.css @@ -59,6 +59,11 @@ button[data-id]:hover { text-decoration: underline; } +@keyframes fadeOut { + 0% { background-color: #90cc90!important;} + 100% { background-color: transparent!important;} +} + .linha-destacada { animation: fadeOut 2s ease; } diff --git a/lgbtq_connect/index.php b/lgbtq_connect/index.php index 61395a06..5a484da6 100644 --- a/lgbtq_connect/index.php +++ b/lgbtq_connect/index.php @@ -61,6 +61,11 @@ function enfileirar_scripts_admin() { wp_localize_script('admin_script.js', 'formularios_todos', $formularios); } +function enfileirar_styles_admin() +{ + wp_enqueue_style('admin-style', plugin_dir_url(__FILE__) . 'includes/admin/style-admin.css', array(), '1.0'); +} + // Função para criar a tabela na ativação do plugin function add_tabela_bd() { global $wpdb; @@ -91,6 +96,7 @@ function enfileirar_scripts() { } add_action('admin_enqueue_scripts', 'enfileirar_scripts_admin'); +add_action('admin_enqueue_scripts', 'enfileirar_styles_admin'); // Função para adicionar o shortcode function meu_plugin_shortcode() { diff --git a/tests/js/filtro_admin.test.js b/tests/js/filtro_admin.test.js new file mode 100644 index 00000000..5936ba26 --- /dev/null +++ b/tests/js/filtro_admin.test.js @@ -0,0 +1,63 @@ +import {Filtro} from '../../lgbtq_connect/includes/admin/admin_script.js'; + +describe("filtro (página do admin)", () => { + let arr = []; + let arr_filtrada; + + let formulario1 = { + nome: "Cabana", + situacao: "Aprovado", + servico: "entretenimento" + } + let formulario2 = { + nome: "pizza", + situacao: "Negado", + servico: "bar/restaurante" + } + let formulario3 = { + nome: "Escola", + situacao: "Pendente", + servico: "ensino" + } + + arr.push(formulario1, formulario2, formulario3); + test('filtro por nome está funcionando', () => { + Filtro.reiniciarFiltro(); + Filtro.nome="Cabana "; + arr_filtrada = Filtro.realizarFiltragem(arr); + expect(arr_filtrada).toContain(formulario1); + expect(arr_filtrada).toHaveLength(1); + }) + + test('filtro por status está funcionando', () => { + Filtro.reiniciarFiltro(); + Filtro.status="Pendente"; + arr_filtrada = Filtro.realizarFiltragem(arr); + expect(arr_filtrada).toContain(formulario3); + expect(arr_filtrada).toHaveLength(1); + }) + + test('filtro por serviço está funcionando', () => { + Filtro.reiniciarFiltro(); + Filtro.servico="ensino" + arr_filtrada = Filtro.realizarFiltragem(arr) + expect(arr_filtrada).toContain(formulario3); + expect(arr_filtrada).toHaveLength(1); + }) + + test('todos os filtros ao mesmo tempo estão funcionando com valores não-nulos', () => { + Filtro.reiniciarFiltro(); + Filtro.nome=" Cabana "; + Filtro.status="Aprovado"; + Filtro.servico="entretenimento" + arr_filtrada = Filtro.realizarFiltragem(arr) + expect(arr_filtrada).toContain(formulario1); + expect(arr_filtrada).toHaveLength(1); + }) + + test('todos os filtros ao mesmo tempo estão funcionando com valores nulos', () => { + Filtro.reiniciarFiltro(); + arr_filtrada = Filtro.realizarFiltragem(arr) + expect(arr_filtrada).toHaveLength(3); + }) +}) \ No newline at end of file diff --git a/tests/js/ordenacao_admin.test.js b/tests/js/ordenacao_admin.test.js new file mode 100644 index 00000000..b7ada2ec --- /dev/null +++ b/tests/js/ordenacao_admin.test.js @@ -0,0 +1,78 @@ +import {Ordenador} from '../../lgbtq_connect/includes/admin/admin_script.js'; + +describe("ordenador (página do admin)", () => { + let arr = []; + + let formulario1 = { + "id": 1, + "nome": "Cabana", + "email": "exemplo1@gmail.com", + "latitude": 50.2, + "longitude": 20.3, + "data_hora": "2024-01-01 00:00:00", + "servico": "entretenimento", + "descricao": "Bom demais", + "situacao": "Aprovado" + } + + let formulario2 = { + "id": 1, + "nome": "Pizza", + "email": "exemplo2@gmail.com", + "latitude": 50.2, + "longitude": 20.3, + "data_hora": "2024-01-02 00:00:00", + "servico": "bar/restaurante", + "descricao": "Bom demais", + "situacao": "Aprovado" + } + + let formulario3 = { + "id": 1, + "nome": "Hamburguer", + "email": "exemplo3@gmail.com", + "latitude": 50.2, + "longitude": 20.3, + "data_hora": "2024-01-01 00:00:01", + "servico": "bar/restaurante", + "descricao": "Bom demais", + "situacao": "Aprovado" + } + + arr.push(formulario1, formulario2, formulario3); + test('ordenação por nome está funcionando', () => { + Ordenador.coluna = "nome"; + + Ordenador.ordem = "asc"; + arr = Ordenador.realizarOrdenacao(arr); + expect(arr[0]).toBe(formulario1); + + Ordenador.ordem = "desc"; + arr = Ordenador.realizarOrdenacao(arr); + expect(arr[0]).toBe(formulario2); + }) + + test('ordenação por email está funcionando', () => { + Ordenador.coluna = "email"; + + Ordenador.ordem = "asc"; + arr = Ordenador.realizarOrdenacao(arr); + expect(arr[0]).toBe(formulario1); + + Ordenador.ordem = "desc"; + arr = Ordenador.realizarOrdenacao(arr); + expect(arr[0]).toBe(formulario3); + }) + + test('ordenação por data e hora está funcionando', () => { + Ordenador.coluna = "data_hora"; + + Ordenador.ordem = "asc"; + arr = Ordenador.realizarOrdenacao(arr); + expect(arr[0]).toBe(formulario1); + + Ordenador.ordem = "desc"; + arr = Ordenador.realizarOrdenacao(arr); + expect(arr[0]).toBe(formulario2); + }) +}) \ No newline at end of file diff --git a/tests/js/tabela_admin.test.js b/tests/js/tabela_admin.test.js new file mode 100644 index 00000000..9a65e5a5 --- /dev/null +++ b/tests/js/tabela_admin.test.js @@ -0,0 +1,74 @@ +import {Tabela} from '../../lgbtq_connect/includes/admin/admin_script.js'; + +describe("manipulação da tabela do admin", () => { + + let arr=[]; + + let formulario1 = { + "id": 1, + "nome": "Cabana", + "email": "exemplo1@gmail.com", + "latitude": 50.2, + "longitude": 20.3, + "data_hora": "2024-01-01 00:00:00", + "servico": "entretenimento", + "descricao": "Bom demais", + "situacao": "Aprovado" + } + + arr.push(formulario1); + + test('a geração de linhas está funcionando', () => { + document.body.innerHTML = + '
Nome Email Nome Email Latitude Longitude Serviço DescriçãoData e hora Data e hora Status Ações
' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' '; + + const tabela = document.getElementById('tabela'); + const tabelaObj = new Tabela(arr, tabela); + tabelaObj.gerarLinhas(); + + // Verifica se o nome está correto + expect(document.getElementById("formulario-1-nome").innerHTML).toBe("Cabana"); + + // Verifica se o email está correto + expect(document.getElementById("formulario-1-email").innerHTML).toBe("exemplo1@gmail.com"); + + // Verifica se a latitude está correta + expect(document.getElementById("formulario-1-latitude").innerHTML).toBe("50.2"); + + // Verifica se a longitude está correta + expect(document.getElementById("formulario-1-longitude").innerHTML).toBe("20.3"); + + // Verifica se a data e hora está correta + expect(document.getElementById("formulario-1-data_hora").innerHTML).toBe("01/01/2024 00:00:00"); + + // Verifica se o serviço está correto + expect(document.getElementById("formulario-1-servico").innerHTML).toBe("entretenimento"); + + // Verifica se a descrição está correta + expect(document.getElementById("formulario-1-descricao").innerHTML).toBe("Bom demais"); + + // Verifica se a situação está correta + expect(document.getElementById("formulario-1-situacao").innerHTML).toBe("Aprovado"); + }) + + test('a exclusão de linhas está funcionando', () => { + const tabelaObj = new Tabela(arr, tabela); + + tabelaObj.excluirLinhas(); + expect(tabela.querySelector("tbody").innerHTML).toBe(""); + }) +}) \ No newline at end of file From 11b731934e87427ea844a421b3ed899b822f1dad Mon Sep 17 00:00:00 2001 From: Will Date: Thu, 6 Jun 2024 15:31:01 -0300 Subject: [PATCH 07/48] Feat: Adicionando as informacoes nos campos de edicao --- lgbtq_connect/includes/admin/admin_script.js | 19 ------------------- .../includes/admin/pagina_administracao.php | 18 ++---------------- lgbtq_connect/includes/admin/style-admin.css | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 35 deletions(-) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index 30640e8f..cd441809 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -276,15 +276,6 @@ function abrirModalEdicao(dados) { document.getElementById('editServico').value = dados.servico; document.getElementById('editDescricao').value = dados.descricao; - // Mostrar campo "Outro" se necessário - if (dados.servico === "outro") { - document.getElementById('editOutroServico').style.display = 'block'; - document.getElementById('editServicoOutro').value = dados.servico_outro; - } else { - document.getElementById('editOutroServico').style.display = 'none'; - document.getElementById('editServicoOutro').value = ''; - } - // Exibe o modal de edição modal.style.display = "block"; @@ -301,16 +292,6 @@ function abrirModalEdicao(dados) { }; } -// Função para mostrar o campo "Outro" no modal de edição -function mostrarOutroEdit() { - var servico = document.getElementById('editServico').value; - if (servico === 'outro') { - document.getElementById('editOutroServico').style.display = 'block'; - } else { - document.getElementById('editOutroServico').style.display = 'none'; - } -} - function filtrar(elemento) { let arr = []; diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index 2f9f7501..c5733d3e 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -104,22 +104,8 @@ function mostrar_dados() {
-
- - -
- - -
+
+ diff --git a/lgbtq_connect/includes/admin/style-admin.css b/lgbtq_connect/includes/admin/style-admin.css index d66fecb9..e4ef8003 100644 --- a/lgbtq_connect/includes/admin/style-admin.css +++ b/lgbtq_connect/includes/admin/style-admin.css @@ -127,6 +127,21 @@ table th:last-child { } +#editModal{ + display: none; + position: fixed; + width: 80%; + height: 87%; + overflow: auto; + top: 10%; + left: 16%; + background-color: #fefefe; + border: 2px solid black; + border-radius: 10px; + z-index: 1001; +} + + #confirmBtn, #cancelBtn { padding: 10px 20px; margin: 10px; From 33d2afb0355b4019f966d65c9a7e1084d4fd362b Mon Sep 17 00:00:00 2001 From: Gustavo Date: Thu, 6 Jun 2024 09:08:10 -0300 Subject: [PATCH 08/48] =?UTF-8?q?DOCS:=20corrigindo=20o=20erro=20do=20gr?= =?UTF-8?q?=C3=A1fico=20da=20arquitetura=20na=20documenta=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/index.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/index.html b/docs/index.html index 30001b2f..9c9e0e95 100644 --- a/docs/index.html +++ b/docs/index.html @@ -127,6 +127,8 @@ } } + + From 3452374f4be77f3870feb32f1a4a8e0fd5a48d2f Mon Sep 17 00:00:00 2001 From: Punkrig Date: Fri, 7 Jun 2024 09:26:54 -0300 Subject: [PATCH 09/48] FIX:console.log. -limpando console.log usados para debug; --- lgbtq_connect/assets/js/formulario.js | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/lgbtq_connect/assets/js/formulario.js b/lgbtq_connect/assets/js/formulario.js index a2770180..056c0e5e 100644 --- a/lgbtq_connect/assets/js/formulario.js +++ b/lgbtq_connect/assets/js/formulario.js @@ -24,27 +24,7 @@ document.addEventListener('DOMContentLoaded', function () { return /[^a-zA-Z0-9 ]/.test(str); } - // Verifica a presença de caracteres especiais - console.log('Verificação de caracteres especiais:'); - console.log('Nome:', nome, ' - ', hasSpecialChars(nome)); - console.log('Email:', email, ' - ', hasSpecialChars(email)); - console.log('Latitude:', latitude, ' - ', hasSpecialChars(latitude)); - console.log('Longitude:', longitude, ' - ', hasSpecialChars(longitude)); - console.log('Serviço:', servico, ' - ', hasSpecialChars(servico)); - console.log('Descrição:', descricao, ' - ', hasSpecialChars(descricao)); - console.log('Outro Serviço:', outroServico, ' - ', hasSpecialChars(outroServico)); - - // Log dos dados do formulário antes do envio - console.log('Dados do formulário:'); - console.log({ - nome: nome, - email: email, - latitude: latitude, - longitude: longitude, - servico: servico, - descricao: descricao, - outroServico: outroServico - }); + if (nome === '' || email === '' || latitude === '' || longitude === '' || (servico === 'outro' && outroServico === '')) { alert('Por favor, preencha todos os campos.'); From 51151c80f58803b153cfdfc5ce91e3cad49ad354 Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Fri, 7 Jun 2024 10:27:29 -0300 Subject: [PATCH 10/48] =?UTF-8?q?bugfix(usu=C3=A1rios):=20a=20fun=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20destacar=20a=20linha=20de=20tabela=20corresponde?= =?UTF-8?q?nte=20ao=20marcador=20no=20mapa=20voltou=20a=20funcionar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/includes/admin/admin_script.js | 5 ----- lgbtq_connect/includes/admin/pagina_administracao.php | 2 -- lgbtq_connect/includes/admin/style-admin.css | 6 +++--- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index dde0298d..d4f775a3 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -161,11 +161,6 @@ function destacarLinhaTabela(id) { linha.classList.add('linha-destacada'); // Adiciona a classe 'linha-destacada' linha.scrollIntoView({ behavior: 'smooth' }); // Rola a página para a linha - - // Remove a classe linha-destacada depois de um determinado tempo - setTimeout(function () { - linha.classList.remove('linha-destacada'); - }, 2000); } function mostrarDescricaoCompleta(id) { diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index c63dc112..d06a69e6 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -39,8 +39,6 @@ function mostrar_dados() { - -
diff --git a/lgbtq_connect/includes/admin/style-admin.css b/lgbtq_connect/includes/admin/style-admin.css index 9ef3385b..001350b4 100644 --- a/lgbtq_connect/includes/admin/style-admin.css +++ b/lgbtq_connect/includes/admin/style-admin.css @@ -60,11 +60,11 @@ button[data-id]:hover { } @keyframes fadeOut { - 0% { background-color: #90cc90!important;} - 100% { background-color: transparent!important;} + 0% { background-color: #90cc90;} + 100% { background-color: transparent;} } -.linha-destacada { +.linha-destacada td{ animation: fadeOut 2s ease; } From bd271f234521d541e34a65ed51fe2c51525a133b Mon Sep 17 00:00:00 2001 From: Will Date: Mon, 10 Jun 2024 13:11:11 -0300 Subject: [PATCH 11/48] FEAT: Adicionando mapa na tela de edicao --- lgbtq_connect/includes/admin/admin_script.js | 59 ++++++++++++++++--- .../includes/admin/pagina_administracao.php | 2 +- 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index cd441809..083358b5 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -1,3 +1,6 @@ +let mapAdmin; +let mapEdit; + class Filtro { static status = "Todos"; static nome = ""; @@ -67,12 +70,16 @@ function destacarLinhaTabela(id) { } function initMapAdmin() { - if(document.getElementById('mapa_admin') == null) - { + if (document.getElementById('mapa_admin') == null) { return; } - mapAdmin = L.map('mapa_admin', {doubleClickZoom: false}).setView([-15.8267, -47.9218], 13); + // Verifica se o mapa já foi inicializado e destrói se necessário + if (mapAdmin !== undefined) { + mapAdmin.remove(); + } + + mapAdmin = L.map('mapa_admin', { doubleClickZoom: false }).setView([-15.8267, -47.9218], 13); // Adiciona o provedor de mapa OpenStreetMap L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { @@ -81,12 +88,38 @@ function initMapAdmin() { formularios_aprovados.forEach(function(formulario) { L.marker([formulario.latitude, formulario.longitude]).addTo(mapAdmin).on('click', function() { - destacarLinhaTabela(formulario.id); }); }); } +function initMapEdit(latitude, longitude, nome, servico, descricao) { + document.getElementById('mapa_admin').style.display = "none"; + + // Verifica se o mapa já foi inicializado e destrói se necessário + if (mapEdit !== undefined) { + mapEdit.remove(); + } + + mapEdit = L.map('mapa_formulario_edit', { doubleClickZoom: false }).setView([-15.8267, -47.9218], 13); + + // Adiciona o provedor de mapa OpenStreetMap + L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors' + }).addTo(mapEdit); + + var popupConteudo = ` +
+

${nome}

+ ${servico} +
+

${descricao}

+
+ `; + + L.marker([latitude, longitude]).addTo(mapEdit).bindPopup(popupConteudo); +} + function initSortButtons() { // Adiciona um evento de clique aos botões de ordenação var sortButtons = document.querySelectorAll('.sort-btn'); @@ -271,27 +304,37 @@ function abrirModalEdicao(dados) { document.getElementById('editId').value = dados.id; document.getElementById('editNome').value = dados.nome; document.getElementById('editEmail').value = dados.email; - document.getElementById('editLatitude').value = dados.latitude; - document.getElementById('editLongitude').value = dados.longitude; document.getElementById('editServico').value = dados.servico; document.getElementById('editDescricao').value = dados.descricao; + initMapEdit(dados.latitude, dados.longitude, dados.nome, dados.servico, dados.descricao); + // Exibe o modal de edição modal.style.display = "block"; + // Atualiza o tamanho do mapa e define a visualização após um pequeno atraso para garantir que o modal tenha sido completamente exibido + setTimeout(function() { + mapEdit.invalidateSize(); + mapEdit.setView([dados.latitude, dados.longitude], 13); + }, 200); + // Fecha o modal de edição quando o botão cancelar é clicado cancelEditBtn.onclick = function() { - modal.style.display = "none"; + fecharEditor(); }; // Fecha o modal de edição quando o usuário clica fora do modal window.onclick = function(event) { if (event.target == modal) { - modal.style.display = "none"; + fecharEditor(); } }; } +function fecharEditor() { + document.getElementById('editModal').style.display = "none"; + document.getElementById('mapa_admin').style.display = "block"; +} function filtrar(elemento) { let arr = []; diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index c5733d3e..58e6345f 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -116,7 +116,7 @@ function mostrar_dados() {
-
+
From 3871ed99d3641a9c25265168fc1128c498f038de Mon Sep 17 00:00:00 2001 From: Will Date: Wed, 12 Jun 2024 10:49:13 -0300 Subject: [PATCH 12/48] Feat: campo de busca na tela edicao --- lgbtq_connect/includes/admin/admin_script.js | 110 ++++++++++++++++++ .../includes/admin/pagina_administracao.php | 5 +- 2 files changed, 113 insertions(+), 2 deletions(-) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index 083358b5..6af7f0f6 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -334,6 +334,116 @@ function abrirModalEdicao(dados) { function fecharEditor() { document.getElementById('editModal').style.display = "none"; document.getElementById('mapa_admin').style.display = "block"; + document.getElementById('listaResultadosEdit').innerHTML = ''; + document.getElementById('searchInputFormEdit').value = ''; +} + +function searchButtonClickedEdit() { + var searchTerm = document.getElementById('searchInputFormEdit').value; + searchLocations(searchTerm); +} + +function searchLocations(query) { + resultados = []; + var apiUrl = 'https://nominatim.openstreetmap.org/search?format=json&q=' + encodeURIComponent(query); + fetch(apiUrl) + .then(response => response.json()) + .then(data => { + data.forEach(location => { + resultados.push({ + display_name: location.display_name, + lat: location.lat, + lon: location.lon + }); + }); + imprimirResultados(resultados); + + }) + .catch(error => { + console.error('Erro ao buscar locais:', error); + }); +} + +function imprimirResultados(resultados) { + var listaResultadosOcultados = []; + var listaResultados = document.getElementById('listaResultadosEdit'); + + listaResultados.innerHTML = ''; + var count = 0; + var div = document.createElement('div'); + resultados.forEach(resultado => { + var divResultado = document.createElement('div'); + divResultado.classList.add('celula_resultado'); + divResultado.style.borderRadius = '3px'; + divResultado.style.margin = '5px 5px 5px 0px'; + divResultado.style.cursor = 'pointer'; + divResultado.innerHTML = '' + resultado.display_name; + divResultado.addEventListener('click', function () { + changeMapView(resultado.lat, resultado.lon); + }); + count += 1; + if(count <=5){ + div.appendChild(divResultado); + } else { + divResultado.style.display = 'none'; + listaResultadosOcultados.push(divResultado); + div.appendChild(divResultado); + } + }); + + + listaResultados.appendChild(div); + + if (count > 5){ + // Adicionando botão "Ver Mais" + var verMaisButton = document.createElement('button'); + verMaisButton.textContent = 'Ver Mais'; + verMaisButton.setAttribute('type', 'button'); + verMaisButton.setAttribute('class', 'ver'); + verMaisButton.addEventListener('click', function() { + MostrarMaisResultados(); + }); + + listaResultados.appendChild(verMaisButton); + + // Adicionando botão "Ver Menos" + var verMenosButton = document.createElement('button'); + verMenosButton.textContent = 'Ver Menos'; + verMenosButton.setAttribute('type', 'button'); + verMenosButton.setAttribute('class', 'ver'); + verMenosButton.addEventListener('click', function() { + MostrarMenosResultados(); + }); + verMenosButton.style.display = 'none'; + + listaResultados.appendChild(verMenosButton); + + // Função para mostrar mais resultados + function MostrarMaisResultados() { + listaResultadosOcultados.forEach(resultado => { + resultado.style.display = 'block'; + }); + verMaisButton.style.display = 'none'; + verMenosButton.style.display = 'block'; + } + + // Função para mostrar menos resultados + function MostrarMenosResultados() { + listaResultadosOcultados.forEach(resultado => { + resultado.style.display = 'none'; + }); + verMaisButton.style.display = 'block'; + verMenosButton.style.display = 'none'; + } + } + + function changeMapView(lat, lng) { + if (mapEdit) { + mapEdit.setView([lat, lng], 13); + } else { + console.error("Mapa de edição não ativo"); + } + } } function filtrar(elemento) { diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index 58e6345f..4afd4ce5 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -112,9 +112,10 @@ function mostrar_dados() {
- +
-
+ +
From 8b3ebec02f91bfe9f535f7eec58e51e641198fbe Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Wed, 12 Jun 2024 14:38:50 -0300 Subject: [PATCH 13/48] =?UTF-8?q?refactor(devs):=20refatorado=20o=20c?= =?UTF-8?q?=C3=B3digo=20JS=20da=20parte=20de=20pesquisas=20no=20mapa=20-?= =?UTF-8?q?=20tamb=C3=A9m=20foi=20modificado=20o=20index.html=20para=20aco?= =?UTF-8?q?modar=20essas=20novas=20mudan=C3=A7as=20-=20foi=20adicionado=20?= =?UTF-8?q?uma=20imagem=20para=20a=20fonte=20da=20imagem=20customizada=20s?= =?UTF-8?q?er=20local?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/assets/imgs/custom_marker.png | Bin 0 -> 35808 bytes lgbtq_connect/assets/index.html | 4 +- lgbtq_connect/assets/js/funcionalidades.js | 219 ++++++++++---------- 3 files changed, 106 insertions(+), 117 deletions(-) create mode 100644 lgbtq_connect/assets/imgs/custom_marker.png diff --git a/lgbtq_connect/assets/imgs/custom_marker.png b/lgbtq_connect/assets/imgs/custom_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..902fc3bcac51fe811904ab4c2f6bd19c8a03db7b GIT binary patch literal 35808 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 C$
- +
@@ -49,7 +49,7 @@
- +
diff --git a/lgbtq_connect/assets/js/funcionalidades.js b/lgbtq_connect/assets/js/funcionalidades.js index 59f72f51..8933b529 100644 --- a/lgbtq_connect/assets/js/funcionalidades.js +++ b/lgbtq_connect/assets/js/funcionalidades.js @@ -1,137 +1,121 @@ -var resultados = []; // Array para armazenar os locais relacionados -var isSearchingIndex = false; // Status de busca no index -var isSearchingForm = false; // Status de busca no form - -function searchButtonClicked() { - if (!isSearchingIndex) { - isSearchingIndex = true; - var searchTerm = document.getElementById('searchInputIndex').value; - searchLocations(searchTerm, 'listaResultadosIndex'); +class Pesquisador { + constructor(listaId) { + this.listaId = listaId; + this.flag = false; } - return false; -} -function searchButtonClickedForm() { - if (!isSearchingForm) { - isSearchingForm = true; - var searchTerm = document.getElementById('searchInputForm').value; - searchLocations(searchTerm, 'listaResultadosForms'); - } - return false; -} + pesquisarLocalizacoes(query) { + if(this.flag) { + return; + } + + this.flag = true; -function searchLocations(query, resultListId) { - resultados = []; - var apiUrl = 'https://nominatim.openstreetmap.org/search?format=json&q=' + encodeURIComponent(query); - fetch(apiUrl) - .then(response => response.json()) - .then(data => { - data.forEach(location => { - resultados.push({ - display_name: location.display_name, - lat: location.lat, - lon: location.lon + let resultados = []; + const self = this; + let apiUrl = 'https://nominatim.openstreetmap.org/search?format=json&q=' + encodeURIComponent(query); + fetch(apiUrl) + .then(response => response.json()) + .then(data => { + data.forEach(location => { + resultados.push({ + display_name: location.display_name, + lat: location.lat, + lon: location.lon + }); }); - }); - imprimirResultados(resultados, resultListId); + self.imprimirResultados(resultados); - // Atualiza o estado da busca após a conclusão - if (resultListId === 'listaResultadosIndex') { - isSearchingIndex = false; // Marca a busca na página inicial como concluída - } else if (resultListId === 'listaResultadosForms') { - isSearchingForm = false; // Marca a busca no formulário como concluída - } - }) - .catch(error => { - console.error('Erro ao buscar locais:', error); + self.flag = false; // Marca a busca no formulário como concluída + }) + .catch(error => { + console.error('Erro ao buscar locais:', error); - // Em caso de erro, atualiza o estado da busca para permitir novas buscas - if (resultListId === 'listaResultadosIndex') { - isSearchingIndex = false; // Marca a busca na página inicial como concluída - } else if (resultListId === 'listaResultadosForms') { - isSearchingForm = false; // Marca a busca no formulário como concluída - } - }); -} + self.flag = false; // Marca a busca no formulário como concluída + }); + } -function imprimirResultados(resultados, resultListId) { - var listaResultadosOcultados = []; - var listaResultados = document.getElementById(resultListId); - listaResultados.innerHTML = ''; - var count = 0; - var div = document.createElement('div'); - resultados.forEach(resultado => { - var divResultado = document.createElement('div'); - divResultado.classList.add('celula_resultado'); - divResultado.style.borderRadius = '3px'; - divResultado.style.margin = '5px 5px 5px 0px'; - divResultado.style.cursor = 'pointer'; - divResultado.innerHTML = '' + resultado.display_name; - divResultado.addEventListener('click', function () { - changeMapLocation(resultado.lat, resultado.lon); + imprimirResultados(resultados) { + let listaResultadosOcultados = []; + const listaResultados = document.getElementById(this.listaId); + listaResultados.innerHTML = ''; + let count = 0; + const div = document.createElement('div'); + resultados.forEach(resultado => { + const divResultado = document.createElement('div'); + divResultado.classList.add('celula_resultado'); + divResultado.style.borderRadius = '3px'; + divResultado.style.margin = '5px 5px 5px 0px'; + divResultado.style.cursor = 'pointer'; + divResultado.innerHTML = '' + resultado.display_name; + divResultado.addEventListener('click', function () { + if (pagina) { + pagina.mapa.mudarLocalizacao([resultado.lat, resultado.lon]); + } + }); + count += 1; + if(count <=5){ + div.appendChild(divResultado); + } else { + divResultado.style.display = 'none'; + listaResultadosOcultados.push(divResultado); + div.appendChild(divResultado); + } }); - count += 1; - if(count <=5){ - div.appendChild(divResultado); - } else { - divResultado.style.display = 'none'; - listaResultadosOcultados.push(divResultado); - div.appendChild(divResultado); - } - }); - listaResultados.appendChild(div); + listaResultados.appendChild(div); - if (count > 5){ - // Adicionando botão "Ver Mais" - var verMaisButton = document.createElement('button'); - verMaisButton.textContent = 'Ver Mais'; - verMaisButton.setAttribute('type', 'button'); - verMaisButton.setAttribute('class', 'ver'); - verMaisButton.addEventListener('click', function() { - MostrarMaisResultados(); - }); + if (count > 5){ + // Adicionando botão "Ver Mais" + const verMaisButton = document.createElement('button'); + verMaisButton.textContent = 'Ver Mais'; + verMaisButton.setAttribute('type', 'button'); + verMaisButton.setAttribute('class', 'ver'); + verMaisButton.addEventListener('click', function() { + MostrarMaisResultados(); + }); - listaResultados.appendChild(verMaisButton); + listaResultados.appendChild(verMaisButton); - // Adicionando botão "Ver Menos" - var verMenosButton = document.createElement('button'); - verMenosButton.textContent = 'Ver Menos'; - verMenosButton.setAttribute('type', 'button'); - verMenosButton.setAttribute('class', 'ver'); - verMenosButton.addEventListener('click', function() { - MostrarMenosResultados(); - }); - verMenosButton.style.display = 'none'; + // Adicionando botão "Ver Menos" + const verMenosButton = document.createElement('button'); + verMenosButton.textContent = 'Ver Menos'; + verMenosButton.setAttribute('type', 'button'); + verMenosButton.setAttribute('class', 'ver'); + verMenosButton.addEventListener('click', function() { + MostrarMenosResultados(); + }); + verMenosButton.style.display = 'none'; - listaResultados.appendChild(verMenosButton); + listaResultados.appendChild(verMenosButton); - // Função para mostrar mais resultados - function MostrarMaisResultados() { - listaResultadosOcultados.forEach(resultado => { - resultado.style.display = 'block'; - }); - verMaisButton.style.display = 'none'; - verMenosButton.style.display = 'block'; - } + // Função para mostrar mais resultados + function MostrarMaisResultados() { + listaResultadosOcultados.forEach(resultado => { + resultado.style.display = 'block'; + }); + verMaisButton.style.display = 'none'; + verMenosButton.style.display = 'block'; + } - // Função para mostrar menos resultados - function MostrarMenosResultados() { - listaResultadosOcultados.forEach(resultado => { - resultado.style.display = 'none'; - }); - verMaisButton.style.display = 'block'; - verMenosButton.style.display = 'none'; + // Função para mostrar menos resultados + function MostrarMenosResultados() { + listaResultadosOcultados.forEach(resultado => { + resultado.style.display = 'none'; + }); + verMaisButton.style.display = 'block'; + verMenosButton.style.display = 'none'; + } } } } -function changeMapLocation(latitude, longitude) { - if (pagina) - { - pagina.mapa.mudarLocalizacao([latitude, longitude]); - } +function pesquisar(id, listaId) { + const el = document.getElementById(id); + let query = el.value; + const pesquisador = new Pesquisador(listaId) + pesquisador.pesquisarLocalizacoes(query); } function mostrarOutro() { @@ -158,4 +142,9 @@ function updateSelectValue(){ } } -document.getElementById("meu_formulario").addEventListener("submit",updateSelectValue); \ No newline at end of file +document.getElementById("meu_formulario").addEventListener("submit",updateSelectValue); + +// Exporta as classes +module.exports = { + Pesquisador +}; \ No newline at end of file From 5eebf76ba6e126b0c86f481b449091bb89ea37ed Mon Sep 17 00:00:00 2001 From: Will Date: Thu, 13 Jun 2024 15:11:21 -0300 Subject: [PATCH 14/48] BUGFIX: Removendo resultados repetidos na busca da tela de edicao --- lgbtq_connect/includes/admin/admin_script.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index 6af7f0f6..ecbd5d81 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -1,5 +1,6 @@ let mapAdmin; let mapEdit; +let isSearching = false; class Filtro { static status = "Todos"; @@ -339,12 +340,16 @@ function fecharEditor() { } function searchButtonClickedEdit() { + if (isSearching) { + return; // Se uma busca já estiver em andamento, saia da função + } + isSearching = true; // Indica que uma busca está em andamento var searchTerm = document.getElementById('searchInputFormEdit').value; searchLocations(searchTerm); } function searchLocations(query) { - resultados = []; + var resultados = []; var apiUrl = 'https://nominatim.openstreetmap.org/search?format=json&q=' + encodeURIComponent(query); fetch(apiUrl) .then(response => response.json()) @@ -357,10 +362,11 @@ function searchLocations(query) { }); }); imprimirResultados(resultados); - + isSearching = false; // Indica que a busca foi concluída }) .catch(error => { console.error('Erro ao buscar locais:', error); + isSearching = false; // Indica que a busca foi concluída mesmo com erro }); } @@ -382,7 +388,7 @@ function imprimirResultados(resultados) { changeMapView(resultado.lat, resultado.lon); }); count += 1; - if(count <=5){ + if(count <= 5) { div.appendChild(divResultado); } else { divResultado.style.display = 'none'; @@ -391,10 +397,9 @@ function imprimirResultados(resultados) { } }); - listaResultados.appendChild(div); - if (count > 5){ + if (count > 5) { // Adicionando botão "Ver Mais" var verMaisButton = document.createElement('button'); verMaisButton.textContent = 'Ver Mais'; @@ -445,7 +450,6 @@ function imprimirResultados(resultados) { } } } - function filtrar(elemento) { let arr = []; From 7592fcb4266bc6fdd9f50e2dab0cf9484b9e8b20 Mon Sep 17 00:00:00 2001 From: Will Date: Thu, 13 Jun 2024 16:41:55 -0300 Subject: [PATCH 15/48] DOCS: Adicionando sprint 13 no backlog de sprints --- docs/releases/release3.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/releases/release3.md b/docs/releases/release3.md index 3f688d61..241cd3e4 100644 --- a/docs/releases/release3.md +++ b/docs/releases/release3.md @@ -44,3 +44,17 @@ O objetivo principal dessa sprint é a reestruturação dos códigos do plugin. | Customizações visuais na documentação|#149| +## **Sprint 13** + +O objetivo principal dessa sprint é o início do desenvolvimento da tela de edição de formulários na interface, atualização da documentação após a transição da ferramenta Gitpages para Docsify e a revisão dos códigos JavaScript para criação de testes e correção dos erros de console que os navegadores indicam. + +|Descrição| Nº issue| +|---------|---------| +| Remoção do bug nas telas do plugin |#74| +|Atualização da documentação do projeto |#152| +| Pesquisa para a adição da funcionalidade de buscar endereço a partir das coordenadas |#154| +| Corrigir o erro do gráfico da arquitetura na documentação do Docsify |#155| +| Implementação de testes para o código JS da página do administrador |#156| +| Implementação de testes para o código JS do shortcode |#157| +| Criação da tela básica de edição na interface do administrador |#158| +| Funcionalidades de exibição dos dados do formulário nos campos da tela de edição |#159| From 2c9c8af5b1363815db44eebfea0bd97f8fe15f39 Mon Sep 17 00:00:00 2001 From: Punkrig Date: Sun, 16 Jun 2024 11:39:34 -0300 Subject: [PATCH 16/48] Bug: filtro. -filtrando dados ; --- lgbtq_connect/assets/index.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lgbtq_connect/assets/index.html b/lgbtq_connect/assets/index.html index fd95f267..c2c24326 100644 --- a/lgbtq_connect/assets/index.html +++ b/lgbtq_connect/assets/index.html @@ -27,7 +27,7 @@
- +
+ From 5ee9cacd19583b3624eaed0dd38652aa27dbb6ed Mon Sep 17 00:00:00 2001 From: Max-Rohrer20 Date: Mon, 17 Jun 2024 11:39:05 -0300 Subject: [PATCH 17/48] =?UTF-8?q?Feature:=20Adi=C3=A7=C3=A3o=20de=20locali?= =?UTF-8?q?za=C3=A7=C3=A3o=20de=20endere=C3=A7o=20a=20partir=20da=20Latitu?= =?UTF-8?q?de=20e=20Longitude?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/includes/admin/admin_script.js | 8 ++--- .../includes/admin/pagina_administracao.php | 6 ++-- .../includes/data/auxiliar_process_form.php | 6 ---- lgbtq_connect/includes/data/conexao_bd.php | 19 ++++++------ lgbtq_connect/includes/data/process_form.php | 31 +++++++++++++++++-- 5 files changed, 44 insertions(+), 26 deletions(-) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index a40a9777..1605b338 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -65,7 +65,6 @@ function destacarLinhaTabela(id) { linha.classList.remove('linha-destacada'); }, 2000); } - function initMapAdmin() { if(document.getElementById('mapa_admin') == null) { @@ -86,7 +85,6 @@ function initMapAdmin() { }); }); } - function initSortButtons() { // Adiciona um evento de clique aos botões de ordenação var sortButtons = document.querySelectorAll('.sort-btn'); @@ -150,7 +148,6 @@ function initSortButtons() { }); }); } - // Limpa o conteúdo da tabela function excluirLinhas(tabela) { @@ -205,7 +202,6 @@ function confirmarAcao(mensagem, formulario, acao) { } }; } - function gerarLinhas(tabela, arr) { const STATUS_BOTOES = { @@ -244,8 +240,8 @@ function gerarLinhas(tabela, arr) linha.innerHTML = `
- - + + diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index e0d342f3..4aef9d2d 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -39,7 +39,7 @@ function mostrar_dados() { - + @@ -95,8 +95,8 @@ function mostrar_dados() { - - + + diff --git a/lgbtq_connect/includes/data/auxiliar_process_form.php b/lgbtq_connect/includes/data/auxiliar_process_form.php index 96084f7a..b6fc446d 100644 --- a/lgbtq_connect/includes/data/auxiliar_process_form.php +++ b/lgbtq_connect/includes/data/auxiliar_process_form.php @@ -1,5 +1,4 @@ insert($table_name, $data); } - // Função para obter o horário atual public static function get_current_time() { return current_time('mysql'); } - // Função para obter o e-mail do administrador public static function get_admin_email() { return get_option('admin_email'); } - // Função para obter a URL do painel de administração public static function get_admin_panel_url() { return admin_url('admin.php?page=lc_admin'); } - // Função para enviar e-mails public static function send_email($to, $subject, $message) { return wp_mail($to, $subject, $message); diff --git a/lgbtq_connect/includes/data/conexao_bd.php b/lgbtq_connect/includes/data/conexao_bd.php index 6690a387..94180e6e 100644 --- a/lgbtq_connect/includes/data/conexao_bd.php +++ b/lgbtq_connect/includes/data/conexao_bd.php @@ -1,10 +1,10 @@ get_charset_collate(); if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) { @@ -32,6 +32,8 @@ function criar_tabela_formulario($wpdb) { email VARCHAR(255) NOT NULL, latitude FLOAT(10, 6) NOT NULL, longitude FLOAT(10, 6) NOT NULL, + road VARCHAR(255), + city VARCHAR(255), data_hora VARCHAR(100) NOT NULL, servico VARCHAR(30) NOT NULL, descricao TEXT NOT NULL, @@ -41,8 +43,6 @@ function criar_tabela_formulario($wpdb) { } } - - // Função para retornar os formulários aprovados (Return é um array) function obter_formularios_aprovados($wpdb) { @@ -72,14 +72,15 @@ function obter_formularios($wpdb) { $query = "SELECT * FROM lc_formulario"; $dados_formulario = $wpdb->get_results($query); - // Array para armazenar os formulários aprovados + // Arraylongitude para armazenar os formulários aprovados $formularios = array(); // Itera sobre cada formulário foreach ($dados_formulario as $formulario) { - // Verifica se o formulário está aprovado + // Adiciona cada formulário ao array de formulários $formularios[] = $formulario; } return $formularios; -} \ No newline at end of file +} +?> diff --git a/lgbtq_connect/includes/data/process_form.php b/lgbtq_connect/includes/data/process_form.php index 63cb8fd9..8f00801e 100644 --- a/lgbtq_connect/includes/data/process_form.php +++ b/lgbtq_connect/includes/data/process_form.php @@ -20,6 +20,30 @@ function processar_formulario() { // Verifica se todos os campos necessários estão presentes if ($nome && $email && $descricao && $latitude && $longitude && $servico) { + // Obter o endereço usando a API do Nominatim com cURL + $url = "https://nominatim.openstreetmap.org/reverse?format=json&lat=$latitude&lon=$longitude&addressdetails=1"; + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'); + $response = curl_exec($ch); + curl_close($ch); + $locationData = json_decode($response, true); + + // Adicione um log para a resposta da API + error_log(print_r($locationData, true)); + + if (isset($locationData['error'])) { + $road = 'Rua não encontrada'; + $city = 'Cidade não encontrada'; + } else { + $road = isset($locationData['address']['road']) ? $locationData['address']['road'] : + (isset($locationData['address']['pedestrian']) ? $locationData['address']['pedestrian'] : 'Rua não encontrada'); + $city = isset($locationData['address']['city']) ? $locationData['address']['city'] : + (isset($locationData['address']['town']) ? $locationData['address']['town'] : + (isset($locationData['address']['village']) ? $locationData['address']['village'] : 'Cidade não encontrada')); + } + $data_hora_envio = Auxiliar_Process_Forms::get_current_time(); // Insere os dados no banco de dados @@ -29,6 +53,8 @@ function processar_formulario() { 'descricao' => $descricao, 'latitude' => $latitude, 'longitude' => $longitude, + 'road' => $road, + 'city' => $city, 'data_hora' => $data_hora_envio, 'servico' => $servico )); @@ -45,8 +71,9 @@ function processar_formulario() { $local_cadastrado = 'Nome do Local: ' . $nome . "\n"; $tipo_servico = 'Tipo de Serviço: ' . $servico . "\n"; $data_hora_cadastro = 'Data e Hora do Cadastro: ' . $data_hora_formatada . "\n"; + $endereco_informado = 'Rua: ' . $road . "\n" . 'Cidade: ' . $city . "\n"; // Constrói a mensagem do e-mail - $message = 'Olá! Uma nova resposta foi feita no seu formulário. Aqui estão os detalhes:' . "\n" . $local_cadastrado . $tipo_servico . $data_hora_cadastro . 'Verifique sua área de administração para mais informações: ' . $admin_panel_url; + $message = 'Olá! Uma nova resposta foi feita no seu formulário. Aqui estão os detalhes:' . "\n" . $local_cadastrado . $tipo_servico . $data_hora_cadastro . $endereco_informado . 'Verifique sua área de administração para mais informações: ' . $admin_panel_url; $subject = 'LGBTQ+ Connect - Nova solicitação de plotagem recebida'; // Envie o e-mail de notificação para o administrador do site @@ -54,7 +81,7 @@ function processar_formulario() { // Envie o e-mail de confirmação para o usuário $subject_user = 'LGBTQ+ Connect - Sua solicitação de plotagem foi recebida'; - $message_user = 'Olá! Sua solicitação de plotagem foi recebida. Aqui estão os detalhes:' . "\n" . $local_cadastrado . $tipo_servico . $data_hora_cadastro . 'Você será notificado quando sua solicitação for processada. Obrigado!'; + $message_user = 'Olá! Sua solicitação de plotagem foi recebida. Aqui estão os detalhes:' . "\n" . $local_cadastrado . $tipo_servico . $data_hora_cadastro . $endereco_informado . 'Você será notificado quando sua solicitação for processada. Obrigado!'; Auxiliar_Process_Forms::send_email($email, $subject_user, $message_user); } else { From ec72602b8b69f450a9902edc45900dcc8dd02f59 Mon Sep 17 00:00:00 2001 From: Punkrig Date: Wed, 19 Jun 2024 09:35:28 -0300 Subject: [PATCH 18/48] =?UTF-8?q?STYLE:=20dashboard.=20-Propondo=20um=20no?= =?UTF-8?q?vo=20design=20para=20a=20p=C3=A1gina=20no=20adm;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/includes/admin/pagina_administracao.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index e0d342f3..53cbae9f 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -41,6 +41,7 @@ function mostrar_dados() { +
@@ -113,6 +114,7 @@ function mostrar_dados() { + From 12fcf143f77ed7a8e863852a1747813b5cabf49c Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Thu, 20 Jun 2024 09:44:44 -0300 Subject: [PATCH 19/48] =?UTF-8?q?refactor(devs):=20retirado=20o=20m=C3=A9t?= =?UTF-8?q?odo=20est=C3=A1tico=20sum=20da=20classe=20Mapa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/assets/js/script.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lgbtq_connect/assets/js/script.js b/lgbtq_connect/assets/js/script.js index b5b1d154..ec640df5 100644 --- a/lgbtq_connect/assets/js/script.js +++ b/lgbtq_connect/assets/js/script.js @@ -50,10 +50,6 @@ class Mapa { this.mapa.remove() this.mapa = null; } - - static sum(a, b) { - return a+b; - } } class Pagina { From 8d48272fc2c97c07f1c6ae9fc71f699d0953ecfc Mon Sep 17 00:00:00 2001 From: Punkrig Date: Thu, 20 Jun 2024 10:05:29 -0300 Subject: [PATCH 20/48] STYLE: dashboard. -desenvolvendo template do dashboard; --- .../includes/admin/pagina_administracao.php | 32 +++++++++++-------- lgbtq_connect/includes/admin/style-admin.css | 29 +++++++++++++++++ 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index 53cbae9f..88639607 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -91,21 +91,27 @@ function mostrar_dados() {
-
Nome Email LatitudeLongitudeServiçoDescriçãoData e hora StatusAções
${dados.nome} ${dados.email}${dados.latitude}${dados.longitude}${dados.city}${dados.road} ${dados.servico} ${descricao} ${dataFormatada}
Nome Email LatitudeLongitudeCidadeRua Serviço Descrição Data e hora
- - - - - - - - - - - - +
+
Nome Email LatitudeLongitudeServiçoDescriçãoData e hora StatusAções
+ + + + + + + + + + + + + + +
Nome Email LatitudeLongitudeServiçoDescriçãoData e hora StatusAções
+ + diff --git a/lgbtq_connect/includes/admin/style-admin.css b/lgbtq_connect/includes/admin/style-admin.css index d66fecb9..1ff953ed 100644 --- a/lgbtq_connect/includes/admin/style-admin.css +++ b/lgbtq_connect/includes/admin/style-admin.css @@ -132,3 +132,32 @@ table th:last-child { margin: 10px; cursor: pointer; } +#tabela { + border: 1px solid #dee2e6; /* Borda da tabela */ + border-collapse: collapse; /* Colapsa as bordas */ +} + +#tabela th, +#tabela td { + border: 1px solid #dee2e6; /* Borda das células */ + padding: 8px; /* Espaçamento interno das células */ +} + +.sort-header { + cursor: pointer; +} + +.sort-header .sort-btn { + border: none; + background: none; + padding: 0; + margin-left: 5px; +} + +.sort-header .sort-icon { + font-size: 0.75rem; +} + +.table-hover tbody tr:hover { + background-color: #f1f1f1; +} \ No newline at end of file From e925193eaeaa38cafa897416d11a5f6b0b62e3f0 Mon Sep 17 00:00:00 2001 From: Punkrig Date: Fri, 21 Jun 2024 11:47:59 -0300 Subject: [PATCH 21/48] STYLE: dashboard. -desenvolvendo template do dashboard de acordo com o wireframe proposto; --- .../includes/admin/pagina_administracao.php | 12 +++-- lgbtq_connect/includes/admin/style-admin.css | 51 ++++++++++++++++++- 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index 88639607..b81a8c29 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -58,21 +58,23 @@ function mostrar_dados() { $aprovados = $wpdb->get_results($query_aprovados); $negados = $wpdb->get_results($query_negados); $pendentes = $wpdb->get_results($query_pendentes); - echo ''; - echo ''; - echo ''; + echo '
'; + echo ''; + echo ''; + echo ''; + echo '
'; ?>
-
+
- diff --git a/lgbtq_connect/includes/admin/style-admin.css b/lgbtq_connect/includes/admin/style-admin.css index 1ff953ed..47a8a217 100644 --- a/lgbtq_connect/includes/admin/style-admin.css +++ b/lgbtq_connect/includes/admin/style-admin.css @@ -8,6 +8,7 @@ position: relative; margin: 20px 10px 0px 0px; padding: 50px; + align-items: center; } #div-mapa_botoes { @@ -21,24 +22,36 @@ #filtros { display: flex; - align-items: center; + gap: 20px; + justify-content: center; + } .filtro { flex: 1; background-color: white; + display: flex; + align-items: center; } #busca_nome_container { display: flex; border: 1px solid grey; + border-radius: 10px; + width: 351.51px; + height: 40px; } #busca_nome { flex-grow: 2; border: none; -} +} +#selecao_servico{ + border-radius: 10px; + width: 351.51px; + height: 40px; +} #busca_nome:focus { outline: none; } @@ -69,6 +82,12 @@ button[data-id]:hover { margin-right: 1.5vw; position: relative; /* Adicionado para garantir que o z-index funcione */ z-index: 1; /* Baixo z-index para o mapa */ + width: 791px; + height: 279px; + gap: 0px; + border-radius: 20px; + opacity: 0px; + } th { @@ -160,4 +179,32 @@ table th:last-child { .table-hover tbody tr:hover { background-color: #f1f1f1; +} +.button-container{ + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; + margin-top: 50px; +} +.btn-aprovado, .btn-negado, .btn-pendente{ + border-radius: 20px; + width: 371px; + height: 70px; + color: white; + text-align:center; + border: none; + +} +.btn-pendente{ + background: rgb(238,202,16); + background: linear-gradient(149deg, rgba(238,202,16,1) 14%, rgba(235,115,10,1) 65%, rgba(221,73,28,1) 99%); +} +.btn-negado{ + background: rgb(238,16,24); + background: linear-gradient(149deg, rgba(238,16,24,1) 14%, rgba(153,10,235,1) 65%, rgba(221,28,145,1) 99%); +} +.btn-aprovado{ + background: rgb(64,126,0); + background: linear-gradient(149deg, rgba(64,126,0,0.9752275910364145) 17%, rgba(60,235,10,0.865983893557423) 65%, rgba(3,153,15,1) 99%); } \ No newline at end of file From 2c5ea619fb75c517738e5017fdb7ba76d919564d Mon Sep 17 00:00:00 2001 From: Punkrig Date: Fri, 21 Jun 2024 12:44:27 -0300 Subject: [PATCH 22/48] =?UTF-8?q?BUG:=20caract=C3=A9res.=20-Permitindo=20a?= =?UTF-8?q?lguns=20caract=C3=A9res=20de=20escrita;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/assets/js/formulario.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lgbtq_connect/assets/js/formulario.js b/lgbtq_connect/assets/js/formulario.js index 056c0e5e..6d285291 100644 --- a/lgbtq_connect/assets/js/formulario.js +++ b/lgbtq_connect/assets/js/formulario.js @@ -21,7 +21,7 @@ document.addEventListener('DOMContentLoaded', function () { // Função para verificar caracteres especiais function hasSpecialChars(str) { - return /[^a-zA-Z0-9 ]/.test(str); + return /[!#$%&()*+\/<=>?@[\\\]_{|}]/.test(str); } From b67bc5ed80a36107944455dff59773eb5a60f73f Mon Sep 17 00:00:00 2001 From: Will Date: Fri, 21 Jun 2024 12:57:29 -0300 Subject: [PATCH 23/48] FEAT: Adicionando funcionalidade de salvar alteracoes na tela de edicao --- lgbtq_connect/includes/admin/admin_script.js | 18 ++++++++- .../includes/admin/formulario-admin-page.php | 39 ++++++++++++++++++- .../includes/admin/pagina_administracao.php | 16 +++++--- 3 files changed, 66 insertions(+), 7 deletions(-) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index ecbd5d81..6ffc57e8 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -118,9 +118,25 @@ function initMapEdit(latitude, longitude, nome, servico, descricao) {
`; - L.marker([latitude, longitude]).addTo(mapEdit).bindPopup(popupConteudo); + // Função para atualizar os inputs de latitude e longitude + function updateInputs(lat, lng) { + document.getElementById('editLatitude').value = lat; + document.getElementById('editLongitude').value = lng; + } + + // Adiciona um marcador arrastável + var marker = L.marker([latitude, longitude], { + draggable: true + }).addTo(mapEdit).bindPopup(popupConteudo); + + // Evento que é chamado quando o marcador é arrastado + marker.on('dragend', function (e) { + var newPosition = marker.getLatLng(); + updateInputs(newPosition.lat, newPosition.lng); + }); } + function initSortButtons() { // Adiciona um evento de clique aos botões de ordenação var sortButtons = document.querySelectorAll('.sort-btn'); diff --git a/lgbtq_connect/includes/admin/formulario-admin-page.php b/lgbtq_connect/includes/admin/formulario-admin-page.php index 0d90f52b..493f062c 100644 --- a/lgbtq_connect/includes/admin/formulario-admin-page.php +++ b/lgbtq_connect/includes/admin/formulario-admin-page.php @@ -1,4 +1,9 @@ window.location.href = window.location.href;'; -} \ No newline at end of file +} + +// Função para processar a atualização do formulário +function atualizar_formulario($wpdb) { + // Verifique se os dados necessários estão presentes + if (!isset($_POST['id'], $_POST['nome'], $_POST['email'], $_POST['servico'], $_POST['descricao'], $_POST['latitude'], $_POST['longitude'])) { + wp_die('Dados insuficientes'); + } + + $id = intval($_POST['id']); + $nome = sanitize_text_field($_POST['nome']); + $email = sanitize_email($_POST['email']); + $servico = sanitize_text_field($_POST['servico']); + $descricao = sanitize_textarea_field($_POST['descricao']); + $latitude = sanitize_text_field($_POST['latitude']); + $longitude = sanitize_text_field($_POST['longitude']); + + // Atualiza os dados no banco de dados + $tabela = "lc_formulario"; + $dados = array( + 'nome' => $nome, + 'email' => $email, + 'servico' => $servico, + 'descricao' => $descricao, + 'latitude' => $latitude, + 'longitude' => $longitude, + ); + + $condicoes = array('id' => $id); + + $resultado = $wpdb->update($tabela, $dados, $condicoes); +} + \ No newline at end of file diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index 4afd4ce5..acf669d6 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -14,14 +14,20 @@ function adicionar_pagina_administracao() { add_action('admin_menu', 'adicionar_pagina_administracao'); +require 'formulario-admin-page.php'; + // Função para mostrar os dados na página do painel de administração function mostrar_dados() { global $wpdb; + + // Exibir mensagem de sucesso se os dados foram atualizados + if (isset($_GET['status']) && $_GET['status'] == 'success') { + echo '

Formulário atualizado com sucesso!

'; + } + // Consulta os dados da tabela formulario $dados_formulario = $wpdb->get_results("SELECT * FROM lc_formulario"); - require 'formulario-admin-page.php'; - // Verifica se o parâmetro "action" foi enviado via POST if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST['action'])) { // Verifica a ação do formulário @@ -94,9 +100,9 @@ function mostrar_dados() {
- +
From 47ea55851a1fc49dbce1c248e83966edee45ce1d Mon Sep 17 00:00:00 2001 From: Will Date: Mon, 24 Jun 2024 14:24:48 -0300 Subject: [PATCH 25/48] DEV: Resolvendo conflitos no merge --- lgbtq_connect/includes/admin/admin_script.js | 46 +++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index cbd990e3..59cd7ba8 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -94,6 +94,49 @@ function initMapAdmin() { }); } +function initMapEdit(latitude, longitude, nome, servico, descricao) { + document.getElementById('mapa_admin').style.display = "none"; + + // Verifica se o mapa já foi inicializado e destrói se necessário + if (mapEdit !== undefined) { + mapEdit.remove(); + } + + mapEdit = L.map('mapa_formulario_edit', { doubleClickZoom: false }).setView([-15.8267, -47.9218], 13); + + // Adiciona o provedor de mapa OpenStreetMap + L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors' + }).addTo(mapEdit); + + var popupConteudo = ` +
+

${nome}

+ ${servico} +
+

${descricao}

+
+ `; + + // Função para atualizar os inputs de latitude e longitude + function updateInputs(lat, lng) { + document.getElementById('editLatitude').value = lat; + document.getElementById('editLongitude').value = lng; + } + + // Adiciona um marcador arrastável + var marker = L.marker([latitude, longitude], { + draggable: true + }).addTo(mapEdit).bindPopup(popupConteudo); + + // Evento que é chamado quando o marcador é arrastado + marker.on('dragend', function (e) { + var newPosition = marker.getLatLng(); + updateInputs(newPosition.lat, newPosition.lng); + }); +} + + function initSortButtons() { // Adiciona um evento de clique aos botões de ordenação var sortButtons = document.querySelectorAll('.sort-btn'); @@ -467,5 +510,4 @@ document.querySelectorAll('.ver-mais-btn').forEach(function(button) { window.onload = function () { initSortButtons(); initMapAdmin(); -}; - +}; \ No newline at end of file From f72085686f8b29590199eedbecda19fe7d9811f3 Mon Sep 17 00:00:00 2001 From: Punkrig Date: Tue, 25 Jun 2024 10:28:41 -0300 Subject: [PATCH 26/48] =?UTF-8?q?STYLE:=20dashboard.=20-implementando=20os?= =?UTF-8?q?=20bot=C3=B5es=20do=20estilo=20proposto=20no=20figma;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/includes/admin/admin_script.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index a9dc7e8a..e3d359de 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -206,18 +206,17 @@ function confirmarAcao(mensagem, formulario, acao) { }; } -function gerarLinhas(tabela, arr) -{ +function gerarLinhas(tabela, arr) { const STATUS_BOTOES = { "Aprovado" : ` - + `, "Negado" : ` - + `, "Pendente" : ` - - + + ` } var tbody = tabela.querySelector('tbody'); @@ -232,7 +231,7 @@ function gerarLinhas(tabela, arr) descricao = ` ${dados.descricao.substring(0, 10)}... - + ` } else { @@ -257,12 +256,13 @@ function gerarLinhas(tabela, arr) From 76a4c8eda18c0579be2bee4d337cc5e4eb9321aa Mon Sep 17 00:00:00 2001 From: Will Date: Tue, 25 Jun 2024 16:14:39 -0300 Subject: [PATCH 27/48] BUGFIX: Inicializacao dos campos de de latitude e longitude --- lgbtq_connect/includes/admin/admin_script.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index 59cd7ba8..1afd5344 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -323,6 +323,8 @@ function abrirModalEdicao(dados) { document.getElementById('editEmail').value = dados.email; document.getElementById('editServico').value = dados.servico; document.getElementById('editDescricao').value = dados.descricao; + document.getElementById('editLatitude').value = dados.latitude; + document.getElementById('editLongitude').value = dados.longitude; initMapEdit(dados.latitude, dados.longitude, dados.nome, dados.servico, dados.descricao); From 734868f55e35ba81e2eedb5206ac0df6a642272a Mon Sep 17 00:00:00 2001 From: Will Date: Tue, 25 Jun 2024 17:00:33 -0300 Subject: [PATCH 28/48] DEV: Adicionando teste para a funcao de atualizar formulario --- tests/php/AlteraStatusTest.php | 75 +++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/tests/php/AlteraStatusTest.php b/tests/php/AlteraStatusTest.php index d7a8edda..77fe84a6 100644 --- a/tests/php/AlteraStatusTest.php +++ b/tests/php/AlteraStatusTest.php @@ -12,19 +12,91 @@ public function prepare($query, ...$args) { public function query($query) { return true; } + public function update($table, $data, $where) { + return true; + } } } +// Funções fictícias de sanitização +if (!function_exists('sanitize_text_field')) { + function sanitize_text_field($str) { + return $str; + } +} +if (!function_exists('sanitize_email')) { + function sanitize_email($email) { + return $email; + } +} +if (!function_exists('sanitize_textarea_field')) { + function sanitize_textarea_field($str) { + return $str; + } +} + +// Função wp_die customizada para testes +class WPDieException extends Exception {} + +function wp_die($message) { + throw new WPDieException($message); +} + class AlteraStatusTest extends TestCase { private $wpdb; protected function setUp(): void { // Mock do objeto $wpdb $this->wpdb = $this->getMockBuilder('wpdb') - ->onlyMethods(['prepare', 'query']) + ->onlyMethods(['prepare', 'query', 'update']) ->getMock(); } + // Testes para a função atualizar_formulario + public function test_atualizar_formulario_success() { + // Mock de $_POST + $_POST['id'] = 1; + $_POST['nome'] = 'Teste Nome'; + $_POST['email'] = 'teste@example.com'; + $_POST['servico'] = 'Teste Serviço'; + $_POST['descricao'] = 'Teste Descrição'; + $_POST['latitude'] = '12.345678'; + $_POST['longitude'] = '98.7654321'; + + // Defina o que o mock do $wpdb->update deve retornar + $this->wpdb->expects($this->once()) + ->method('update') + ->with( + $this->equalTo('lc_formulario'), + $this->equalTo([ + 'nome' => 'Teste Nome', + 'email' => 'teste@example.com', + 'servico' => 'Teste Serviço', + 'descricao' => 'Teste Descrição', + 'latitude' => '12.345678', + 'longitude' => '98.7654321', + ]), + $this->equalTo(['id' => 1]) + ) + ->willReturn(1); + + // Chame a função atualizar_formulario + atualizar_formulario($this->wpdb); + } + + public function test_atualizar_formulario_missing_data() { + // Limpe o $_POST para garantir que está vazio + $_POST = []; + + // Capture a saída para verificar se wp_die foi chamado + $this->expectException(WPDieException::class); + $this->expectExceptionMessage('Dados insuficientes'); + + // Chame a função atualizar_formulario e verifique se wp_die é chamado + atualizar_formulario($this->wpdb); + } + + // Testes para a função alteraStatus public function testAlteraStatusReturnsFalseWhenWpdbNotSet() { $result = alteraStatus(null, 1, 'new_status'); $this->assertFalse($result); @@ -74,3 +146,4 @@ public function testAlteraStatusReturnsTrueWhenQuerySucceeds() { $this->assertTrue($result); } } +?> From c46953fc19ba6a7c1d0e99b9fe861b849f05b1dc Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Thu, 27 Jun 2024 10:18:18 -0300 Subject: [PATCH 29/48] realizando o merge da developer na branch editar --- lgbtq_connect/includes/admin/admin_script.js | 356 ++++++++++--------- 1 file changed, 184 insertions(+), 172 deletions(-) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index 1afd5344..30576ac7 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -6,6 +6,7 @@ class Filtro { static status = "Todos"; static nome = ""; static servico = "todos"; + static servico = ""; static realizarFiltragem(arr) { const self = this; @@ -13,7 +14,6 @@ class Filtro { return (self.checarStatus(formulario) && self.checarNome(formulario) && self.checarServico(formulario)); }); } - static checarStatus(formulario) { if (this.status !== "Todos") { return (this.status == formulario.situacao); @@ -22,9 +22,9 @@ class Filtro { return true; } } - + static checarNome(formulario) { - return(formulario.nome.toLowerCase().trim().startsWith(this.nome)); + return(formulario.nome.toLowerCase().trim().startsWith(this.nome.toLowerCase().trim())); } static checarServico(formulario) { @@ -35,13 +35,142 @@ class Filtro { return true; } } + + static reiniciarFiltro() + { + this.status="Todos"; + this.nome=""; + this.servico=""; + } +} + +class Ordenador { + static coluna = "nome"; + static ordem = "asc"; + + static realizarOrdenacao(arr) { + const self = this; + return arr.sort(function (a, b) { + const aValue = a[self.coluna].trim().toLowerCase(); + const bValue = b[self.coluna].trim().toLowerCase(); + + return (self.ordem === 'asc') ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue); + }); + } +} + +// Classe Singleton com todo os métodos e atributos relacionado a tabela +class Tabela { + static adicionarZero(numero) { + return numero < 10 ? '0' + numero : numero; + } + + static formatarDataHora(data) { + const dia = Tabela.adicionarZero(data.getDate()); + const mes = Tabela.adicionarZero(data.getMonth() + 1); // Adiciona 1 porque os meses são indexados de 0 a 11 + const ano = data.getFullYear(); + const hora = Tabela.adicionarZero(data.getHours()); + const minutos = Tabela.adicionarZero(data.getMinutes()); + const segundos = Tabela.adicionarZero(data.getSeconds()); + + return `${dia}/${mes}/${ano} ${hora}:${minutos}:${segundos}`; + } + + constructor(arr, tabela) { + if(Tabela.instance) + return Tabela.instance + + this.arr = arr; + this.tabela = tabela; + Tabela.instance = this; + } + + // Limpa o conteúdo da tabela + excluirLinhas() { + const tbody = this.tabela.querySelector('tbody'); + tbody.innerHTML=""; + } + + // Gera novas linhas na tabela de acordo com a array definida + gerarLinhas() + { + const STATUS_BOTOES = { + "Aprovado" : ` + + `, + "Negado" : ` + + `, + "Pendente" : ` + + + ` + } + const tbody = this.tabela.querySelector('tbody'); + + this.arr.forEach(dados => { + const linha = document.createElement('tr'); + linha.id = "formulario-" + dados.id; + let descricao; + let data = new Date(dados.data_hora); + let dataFormatada = Tabela.formatarDataHora(data); + if (dados.descricao.length > 10){ + descricao = ` + ${dados.descricao.substring(0, 10)}... + + + ` + } + else { + descricao = dados.descricao; + } + + let acoes = STATUS_BOTOES[dados.situacao]; + + linha.innerHTML = ` +
+ + + + + + + + + `; + tbody.appendChild(linha); + }); + } +} + +function destacarLinhaTabela(id) { + let tabela = document.getElementById("tabela"); + let linha = document.getElementById(("formulario-" +id)); + + if(linha===null) { + return; + } + + // Loop para remover a linha-destacada de todas as linhas + for (let i = 0, row; (row = tabela.rows[i]); i++) { + row.classList.remove('linha-destacada'); + } + + linha.classList.add('linha-destacada'); // Adiciona a classe 'linha-destacada' + linha.scrollIntoView({ behavior: 'smooth' }); // Rola a página para a linha } function mostrarDescricaoCompleta(id) { var descricaoResumida = document.getElementById('descricaoResumida_' + id); var descricaoCompleta = document.getElementById('descricaoCompleta_' + id); var botao = document.querySelector('button[data-id="' + id + '"]'); - if (descricaoResumida.style.display === 'none') { descricaoResumida.style.display = 'inline'; descricaoCompleta.style.display = 'none'; @@ -52,23 +181,6 @@ function mostrarDescricaoCompleta(id) { botao.innerText = 'Ver menos'; } } -function destacarLinhaTabela(id) { - var tabela = document.getElementById("tabela"); - var linha = document.getElementById(id); - - // Loop para remover a linha-destacada de todas as linhas - for (var i = 0, row; (row = tabela.rows[i]); i++) { - row.classList.remove('linha-destacada'); - } - - linha.classList.add('linha-destacada'); // Adiciona a classe 'linha-destacada' - linha.scrollIntoView({ behavior: 'smooth' }); // Rola a página para a linha - - // Remove a classe linha-destacada depois de um determinado tempo - setTimeout(function () { - linha.classList.remove('linha-destacada'); - }, 2000); -} function initMapAdmin() { if (document.getElementById('mapa_admin') == null) { @@ -136,94 +248,6 @@ function initMapEdit(latitude, longitude, nome, servico, descricao) { }); } - -function initSortButtons() { - // Adiciona um evento de clique aos botões de ordenação - var sortButtons = document.querySelectorAll('.sort-btn'); - - sortButtons.forEach(function(button) { - button.addEventListener('click', function() { - var table = button.closest('table'); - var columnIndex = Array.from(button.parentNode.parentNode.children).indexOf(button.parentNode); - var order = button.getAttribute('data-order') || 'asc'; - - order = (order === 'asc') ? 'desc' : 'asc'; - button.setAttribute('data-order', order); - - // Atualiza o ícone do botão de ordenação - var icon = button.querySelector('.sort-icon'); - - // Remove e adiciona a classe do ícone com base na direção da ordenação - if (order === 'asc') { - icon.innerHTML = '▾'; // Triângulo para baixo (ordem crescente) - } else { - icon.innerHTML = '▴'; // Triângulo para cima (ordem decrescente) - } - - // Obtém todas as linhas da tabela, exceto a primeira (cabeçalho) - var rows = Array.from(table.querySelectorAll('tbody > tr')); - - // Determina o critério de ordenação com base na classe do botão - if (button.classList.contains('sort-by-date')) { - rows.sort(function(a, b) { - var aValue = new Date(a.children[columnIndex].textContent.trim().replace(/(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}):(\d{2})/, '$3-$2-$1T$4:$5:$6')); - var bValue = new Date(b.children[columnIndex].textContent.trim().replace(/(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}):(\d{2})/, '$3-$2-$1T$4:$5:$6')); - - return (order === 'asc') ? aValue - bValue : bValue - aValue; - }); - } else if (button.classList.contains('sort-by-email')) { - rows.sort(function(a, b) { - var aValue = a.children[columnIndex].textContent.trim().toLowerCase(); - var bValue = b.children[columnIndex].textContent.trim().toLowerCase(); - - return (order === 'asc') ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue); - }); - } else { - // Caso padrão: ordenação por texto - rows.sort(function(a, b) { - var aValue = a.children[columnIndex].textContent.trim().toLowerCase(); - var bValue = b.children[columnIndex].textContent.trim().toLowerCase(); - - return (order === 'asc') ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue); - }); - } - - // Limpa o conteúdo da tabela antes de reordenar - while (table.querySelector('tbody').firstChild) { - table.querySelector('tbody').removeChild(table.querySelector('tbody').firstChild); - } - - // Reinsere as linhas ordenadas na tabela - rows.forEach(function(row) { - table.querySelector('tbody').appendChild(row); - }); - }); - }); -} - -// Limpa o conteúdo da tabela -function excluirLinhas(tabela) -{ - while (tabela.querySelector('tbody').firstChild) { - tabela.querySelector('tbody').removeChild(tabela.querySelector('tbody').firstChild); - } -} - -function adicionarZero(numero) { - return numero < 10 ? '0' + numero : numero; -} - -function formatarDataHora(data) { - const dia = adicionarZero(data.getDate()); - const mes = adicionarZero(data.getMonth() + 1); // Adiciona 1 porque os meses são indexados de 0 a 11 - const ano = data.getFullYear(); - const hora = adicionarZero(data.getHours()); - const minutos = adicionarZero(data.getMinutes()); - const segundos = adicionarZero(data.getSeconds()); - - return `${dia}/${mes}/${ano} ${hora}:${minutos}:${segundos}`; -} - function confirmarAcao(mensagem, formulario, acao) { // Seleciona o modal e seus elementos var modal = document.getElementById('confirmModal'); @@ -256,63 +280,6 @@ function confirmarAcao(mensagem, formulario, acao) { }; } -function gerarLinhas(tabela, arr) -{ - const STATUS_BOTOES = { - "Aprovado" : ` - - `, - "Negado" : ` - - `, - "Pendente" : ` - - - ` - } - var tbody = tabela.querySelector('tbody'); - - arr.forEach(dados => { - var linha = document.createElement('tr'); - linha.id = dados.id; - var descricao; - var data = new Date(dados.data_hora); - var dataFormatada = formatarDataHora(data); - if (dados.descricao.length > 10){ - descricao = ` - ${dados.descricao.substring(0, 10)}... - - - ` - } - else { - descricao = dados.descricao; - } - - acoes = STATUS_BOTOES[dados.situacao]; - - linha.innerHTML = ` - - - - - - - - - - `; - tbody.appendChild(linha); - }); -} - function abrirModalEdicao(dados) { var modal = document.getElementById('editModal'); var cancelEditBtn = document.getElementById('cancelEditBtn'); @@ -468,14 +435,13 @@ function imprimirResultados(resultados) { } } } + function filtrar(elemento) { let arr = []; const filtro_nome = document.getElementById("busca_nome"); const filtro_servico = document.getElementById("selecao_servico"); - const contador_resultados = document.getElementById("contador_resultados"); - if (elemento) { Filtro.status = elemento.value; } @@ -483,21 +449,61 @@ function filtrar(elemento) { if(filtro_nome) { Filtro.nome = filtro_nome.value.toLowerCase().trim(); + Filtro.nome = filtro_nome.value } if (filtro_servico) { Filtro.servico = filtro_servico.value; } - arr = Filtro.realizarFiltragem(formularios_todos); contador_resultados.innerHTML = `

${arr.length} resultados encontrados

`; const tabela = document.getElementById("tabela"); - excluirLinhas(tabela); - gerarLinhas(tabela, arr); + const tabelaObj = new Tabela([], tabela); + tabelaObj.arr = arr; + + tabelaObj.excluirLinhas() + tabelaObj.gerarLinhas(); +} + +function ordenar(elemento) { + let order = elemento.getAttribute('data-order') || 'asc'; + + order = (order === 'asc') ? 'desc' : 'asc'; + elemento.setAttribute('data-order', order); + + // Atualiza o ícone do botão de ordenação + var icon = elemento.querySelector('.sort-icon'); + + // Remove e adiciona a classe do ícone com base na direção da ordenação + if (order === 'asc') { + icon.innerHTML = '▾'; // Triângulo para baixo (ordem crescente) + } else { + icon.innerHTML = '▴'; // Triângulo para cima (ordem decrescente) + } + + Ordenador.ordem = order; + + // Determina o critério de ordenação com base na classe do botão + if (elemento.classList.contains('sort-by-date')) { + Ordenador.coluna = "data_hora" + } + else if (elemento.classList.contains('sort-by-email')) { + Ordenador.coluna = "email" + } + else { + // Caso padrão: ordenação por nome + Ordenador.coluna = "nome" + } + + const tabelaObj = new Tabela([], tabela); + tabelaObj.arr = Ordenador.realizarOrdenacao(tabelaObj.arr); + + tabelaObj.excluirLinhas(); + tabelaObj.gerarLinhas() } // Adiciona um evento de clique a todos os botões de "Ver mais/menos" @@ -510,6 +516,12 @@ document.querySelectorAll('.ver-mais-btn').forEach(function(button) { // Inicializa o mapa e os botões de ordenação quando a página carrega window.onload = function () { - initSortButtons(); initMapAdmin(); +}; + +// Exporta as classes +module.exports = { + Filtro, + Ordenador, + Tabela, }; \ No newline at end of file From ad3e87512023aebc088a6c7a73f755a8fc989e63 Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Thu, 27 Jun 2024 10:44:25 -0300 Subject: [PATCH 30/48] bugfix(user): corrigido o bug onde uma linha podia ser destacada apenas uma vez sucessivamente --- lgbtq_connect/includes/admin/admin_script.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index 30576ac7..bc748ae4 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -165,6 +165,9 @@ function destacarLinhaTabela(id) { linha.classList.add('linha-destacada'); // Adiciona a classe 'linha-destacada' linha.scrollIntoView({ behavior: 'smooth' }); // Rola a página para a linha + setTimeout(function () { + linha.classList.remove('linha-destacada'); + }, 3000); } function mostrarDescricaoCompleta(id) { From 4b1b0e4a086cf42d9ca4d175009e861e2b8962d8 Mon Sep 17 00:00:00 2001 From: Will Date: Thu, 27 Jun 2024 13:01:38 -0300 Subject: [PATCH 31/48] DOCS: Adicionando SPRINT 15 no backlog de sprints --- docs/releases/release3.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docs/releases/release3.md b/docs/releases/release3.md index 241cd3e4..ecfc9190 100644 --- a/docs/releases/release3.md +++ b/docs/releases/release3.md @@ -58,3 +58,31 @@ O objetivo principal dessa sprint é o início do desenvolvimento da tela de edi | Implementação de testes para o código JS do shortcode |#157| | Criação da tela básica de edição na interface do administrador |#158| | Funcionalidades de exibição dos dados do formulário nos campos da tela de edição |#159| + +## **Sprint 14** + +O objetivo dessa sprint é a continuação do desenvolvimento da ferramenta de edição dos formulários, atualização da documentação, desenvolvimento do visual da interface do administrador, adição de um marcador personalizado nos mapas e desenvolvimento do desing da tela de edição. + +|Descrição| Nº issue| +|---------|---------| +| Adição do mapa na tela edição + funcionalidade de busca|#160| +| Atualização dos artefatos da documentação|#162| +| Desenvolvimento do desing da interface|#163| +| Desenvolvimento do design da tela de edição|#164| +| Marcador personalizado|#166| +| Campo de busca no mapa da edição |#167| +| Resultados repetidos na busca (tela de edição)|#168| +| Salvar alterações na tela de edição |#169| +| Implementação de testes para o código JS da página do administrador e refatoração parcial do código JS do shortcode|#171| + + +## **Sprint 15** + +O objetivo principal dessa sprint é a finalização da tela de edição para disponibilização da funcionalidade no ambiente de produção. Além de alguns ajustes no desenvolvimento do front end da tela de edição de acordo com o wireframe disponibilizado, resolução de bugs da tela de edição, criação do teste para a funcionalidade de editar os dados do formulário, finalizar transição da gitpages para docsify na documentação, adição da Sprint 15 na documentação. + +|Descrição| Nº issue| +|---------|---------| +| Desenvolvimento do front end da tela de edição |#173| +| Criação do teste para a funcionalidade de editar os dados do formulário|#175| +| Finalizar transição da gitpages para docsify na documentação|#176| +| Adição da Sprint 15 na documentação |#177| From 47080c87ae29f4f2a636f4d6b8917cb5e9448958 Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Thu, 27 Jun 2024 13:19:33 -0300 Subject: [PATCH 32/48] =?UTF-8?q?bugfix(user):=20corrigido=20a=20estiliza?= =?UTF-8?q?=C3=A7=C3=A3o=20de=20elementos=20HTML=20fora=20do=20escopo=20do?= =?UTF-8?q?=20plugin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/includes/admin/style-admin.css | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/lgbtq_connect/includes/admin/style-admin.css b/lgbtq_connect/includes/admin/style-admin.css index 7e5f1ff0..a1836226 100644 --- a/lgbtq_connect/includes/admin/style-admin.css +++ b/lgbtq_connect/includes/admin/style-admin.css @@ -76,15 +76,6 @@ button[data-id]:hover { z-index: 1; /* Baixo z-index para o mapa */ } -th { - background-color: #f5f5f5; -} - -td { - background-color: white; - text-align: center; -} - #tabela th { background-color: #f5f5f5; text-align: center; @@ -93,6 +84,12 @@ td { /* border-radius: 0px !important; */ } +#tabela td{ + border: none !important; + background-color: white; + text-align: center; +} + #tabela { border: none !important; } From ae5427040daefc961956141cc080d3bf3e20f954 Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Fri, 28 Jun 2024 10:08:07 -0300 Subject: [PATCH 33/48] =?UTF-8?q?feat(admin):=20estiliza=C3=A7=C3=A3o=20da?= =?UTF-8?q?=20tela=20de=20editar=20formul=C3=A1rios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/includes/admin/admin_script.js | 15 +- .../includes/admin/pagina_administracao.php | 83 ++++---- lgbtq_connect/includes/admin/style-admin.css | 196 +++++++++++++++++- 3 files changed, 237 insertions(+), 57 deletions(-) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index bc748ae4..8fc451b5 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -210,8 +210,6 @@ function initMapAdmin() { } function initMapEdit(latitude, longitude, nome, servico, descricao) { - document.getElementById('mapa_admin').style.display = "none"; - // Verifica se o mapa já foi inicializado e destrói se necessário if (mapEdit !== undefined) { mapEdit.remove(); @@ -249,6 +247,8 @@ function initMapEdit(latitude, longitude, nome, servico, descricao) { var newPosition = marker.getLatLng(); updateInputs(newPosition.lat, newPosition.lng); }); + + document.getElementById('mapa_admin').style.display = "block"; } function confirmarAcao(mensagem, formulario, acao) { @@ -284,8 +284,8 @@ function confirmarAcao(mensagem, formulario, acao) { } function abrirModalEdicao(dados) { - var modal = document.getElementById('editModal'); - var cancelEditBtn = document.getElementById('cancelEditBtn'); + const popup = document.getElementById("editPopup") + const modal = document.getElementById('editModal'); // Preenche os campos do formulário com os dados fornecidos document.getElementById('editId').value = dados.id; @@ -299,6 +299,7 @@ function abrirModalEdicao(dados) { initMapEdit(dados.latitude, dados.longitude, dados.nome, dados.servico, dados.descricao); // Exibe o modal de edição + popup.style.display = "flex"; modal.style.display = "block"; // Atualiza o tamanho do mapa e define a visualização após um pequeno atraso para garantir que o modal tenha sido completamente exibido @@ -307,10 +308,7 @@ function abrirModalEdicao(dados) { mapEdit.setView([dados.latitude, dados.longitude], 13); }, 200); - // Fecha o modal de edição quando o botão cancelar é clicado - cancelEditBtn.onclick = function() { - fecharEditor(); - }; + modal.scrollIntoView({ behavior: 'smooth' }); // Fecha o modal de edição quando o usuário clica fora do modal window.onclick = function(event) { @@ -321,6 +319,7 @@ function abrirModalEdicao(dados) { } function fecharEditor() { + document.getElementById('editPopup').style.display = "none"; document.getElementById('editModal').style.display = "none"; document.getElementById('mapa_admin').style.display = "block"; document.getElementById('listaResultadosEdit').innerHTML = ''; diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index 41e0ccc0..40bf725e 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -48,6 +48,48 @@ function mostrar_dados() {

+ + +
@@ -67,8 +109,7 @@ function mostrar_dados() { ?>
-
-
+
@@ -94,43 +135,6 @@ function mostrar_dados() {
- - - -
Nome ${dados.nome}${dados.email}${dados.latitude}${dados.longitude}${dados.servico}${descricao}${dataFormatada}${dados.situacao} +
+ + + ${acoes} + + +
${dados.nome}${dados.email}${dados.latitude}${dados.longitude}${dados.servico}${descricao}${dataFormatada}${dados.situacao} - - - - ${acoes} - - -
@@ -146,6 +150,7 @@ function mostrar_dados() { + diff --git a/lgbtq_connect/includes/admin/style-admin.css b/lgbtq_connect/includes/admin/style-admin.css index a1836226..73128100 100644 --- a/lgbtq_connect/includes/admin/style-admin.css +++ b/lgbtq_connect/includes/admin/style-admin.css @@ -102,6 +102,95 @@ table th:last-child { border-top-right-radius: 20px !important; } +.title{ + font-weight:bold; + font-size: 24px; + margin-bottom:20px; + text-align: center; + color: black; +} + +.blue_button, .button_search, .ver{ + width:100%; + background-color: #2a75f3; + padding:10px; + border:none; + border-radius: 10px; + color:white; + text-align:center; + align-items: center; + font-size: 16px; +} + +.button_search{ + width: 17%; +} + +.ver { + margin: auto; + display : block; + width: 10%; + height: 20px; + justify-content: center; + align-items: center; + border-radius: 5px; + font-size: 0.75rem; + padding: 0px; +} + +#editSalvar, #editCancelar { + width: 17%; + background-color: #2a75f3; + padding:10px; + border:none; + border-radius: 20px; + color:white; + text-align:center; + align-items: center; +} + +#editSalvar { + margin-right: auto; + margin-left: 21px; +} + +#editCancelar { + background-color: #F5F5F5; + color: #707070; + border: solid 2px; + margin-left: auto; + margin-right: 21px; +} + +#editFechar { + float: right; + padding: 0; + border: none; + background: none; +} + +#editNome, #editEmail, #editDescricao, #editServico, #searchInputFormEdit{ + width:97%; + resize:none; + background-color:#F5F5F5; + margin-bottom:10px; + border: 1px solid #D0D0D0; + border-radius:10px; + padding:10px; + font-size: 16px; +} + +#searchInputFormEdit{ + width: 77%; + margin: 0 auto; + padding:10px !important; + margin-left:0px; +} + +.blue_button:hover, .button_search:hover, .ver:hover, #editSalvar{ + background-color: #1266f1; +} + .modal { display: none; position: fixed; @@ -129,23 +218,110 @@ table th:last-child { } -#editModal{ - display: none; +#editPopup { position: fixed; - width: 80%; - height: 87%; - overflow: auto; - top: 10%; - left: 16%; - background-color: #fefefe; - border: 2px solid black; - border-radius: 10px; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.4); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; + } + + +#editModal { + position: absolute; + width: 65%; + height: auto; + background-color: white; z-index: 1001; + border-radius: 15px; /* Adjust the value to your desired roundness */ + box-shadow: 2px 2px 5px #d0d0d0; + padding: 50px; + left: 50%; + transform: translateX(-50%); +} + +#editModal::before { + content: ""; + position: absolute; + top: -3px; /* Adjust based on border width */ + left: -3px; /* Adjust based on border width */ + width: calc(100% + 6px); /* Adjust based on border width */ + height: calc(100% + 6px); /* Adjust based on border width */ + background: linear-gradient(to bottom right, red, hotpink, blue, lime, yellow); + border-radius: 18px; /* Adjust for border radius + border width */ + z-index: -1; /* Ensure the pseudo-element is behind the modal content */ } +#editModal::after { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: white; + border-radius: 15px; /* Same as #editModal border-radius */ + z-index: -1; /* Ensure the pseudo-element is behind the modal content but above the gradient border */ + box-sizing: border-box; /* Ensure the padding and border width are considered */ +} + +#listaResultadosEdit{ + background-color: white; + margin-top:10px; + margin-bottom:10px; +} + +#listaResultadosForms, #listaResultadosIndex{ + background-color: white; + margin-top:10px; + margin-bottom:10px; +} + +.celula_resultado{ + background-color: #F5F5F5; + width:97%; + text-align:center; + font-size:16px; + padding:10px; + display:flex; + align-items:center; + justify-content: center; + margin:20px; + border-radius:10px !important; +} + +.celula_resultado:hover{ + background-color: #E6E6E6; +} + +.celula_resultado:active{ + background-color: #ccc; +} + +.search_wrapper{ + background-color: white; + display:flex; + align-items:center; + justify-content:center; +} #confirmBtn, #cancelBtn { padding: 10px 20px; margin: 10px; cursor: pointer; } + +#editDivBotoes { + width: 100%; + display: flex; + font-size: 16px; +} + +#editLabelNome, #editLabelEmail, #editLabelServico, #editLabelDescricao { + font-size: 18px; +} \ No newline at end of file From dba22f7613887d4343cc77a31753a54ebb8e025d Mon Sep 17 00:00:00 2001 From: Max-Rohrer20 Date: Fri, 28 Jun 2024 10:10:51 -0300 Subject: [PATCH 34/48] =?UTF-8?q?Feature:=20Adi=C3=A7=C3=A3o=20do=20marcad?= =?UTF-8?q?or=20personalizado=20dentro=20dos=20mapas=20do=20plugin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/assets/js/script.js | 76 ++-- lgbtq_connect/includes/admin/admin_script.js | 377 ++++++++++--------- 2 files changed, 226 insertions(+), 227 deletions(-) diff --git a/lgbtq_connect/assets/js/script.js b/lgbtq_connect/assets/js/script.js index b5b1d154..6036d1e0 100644 --- a/lgbtq_connect/assets/js/script.js +++ b/lgbtq_connect/assets/js/script.js @@ -1,6 +1,13 @@ let pagina = null; - // CLASSES +// Definindo o ícone personalizado no escopo global +var personalIcon = L.icon({ + iconUrl: 'https://res.cloudinary.com/dxsx0emuu/image/upload/f_auto,q_auto/lc_marker', + iconSize: [20, 30], // tamanho do ícone + popupAnchor: [1, -10] +}); + +// CLASSES class Mapa { container; @@ -15,7 +22,7 @@ class Mapa { this.mapa = L.map(this.container, { doubleClickZoom: false }).setView([-15.8267, -47.9218], 13); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { - attribution: '© OpenStreetMap contributors' + attribution: '© OpenStreetMap contributors' }).addTo(this.mapa); this.marcadores = []; @@ -47,12 +54,12 @@ class Mapa { } destruirMapa() { - this.mapa.remove() + this.mapa.remove(); this.mapa = null; } static sum(a, b) { - return a+b; + return a + b; } } @@ -62,7 +69,6 @@ class Pagina { this.id = id; this.div = document.getElementById(id); this.mapa = null; - } inicializar() { @@ -72,8 +78,7 @@ class Pagina { } destruir() { - if(this.mapa !== null) - { + if(this.mapa !== null) { this.mapa.destruirMapa(); } this.div.style.display = "none"; @@ -84,18 +89,17 @@ class PaginaComPopup extends Pagina { inicializar() { super.inicializar(); - for(var i = 0; i -

${formulario.nome}

- ${formulario.servico} -
-

${formulario.descricao}

- - `; - this.mapa.adicionarMarcador(L.marker([formulario.latitude, formulario.longitude]).bindPopup(popupConteudo)); +
+

${formulario.nome}

+ ${formulario.servico} +
+

${formulario.descricao}

+
+ `; + this.mapa.adicionarMarcador(L.marker([formulario.latitude, formulario.longitude], {icon: personalIcon}).bindPopup(popupConteudo)); } } @@ -105,18 +109,14 @@ class PaginaComPopup extends Pagina { } class PaginaFormulario extends Pagina { - inicializar() { super.inicializar(); this.marcador = null; var self = this; this.mapa.mapa.on('click', function(e) { - - if(self.marcador==null) - { - self.marcador = L.marker(e.latlng).addTo(self.mapa.mapa); + if(self.marcador == null) { + self.marcador = L.marker(e.latlng, {icon: personalIcon}).addTo(self.mapa.mapa); } - self.marcador.setLatLng(e.latlng); var lat = e.latlng.lat; // Latitude @@ -125,9 +125,9 @@ class PaginaFormulario extends Pagina { // Atualiza os valores dos campos de entrada ocultos document.getElementById('latitude').value = lat; document.getElementById('longitude').value = lng; - }) + }); - this.mapa.mapa.on('contextmenu', function (e) { + this.mapa.mapa.on('contextmenu', function(e) { // Verifica se existe um marcador atual if (self.marcador !== null) { // Remove o marcador do mapa @@ -138,10 +138,9 @@ class PaginaFormulario extends Pagina { } }); - for(var i = 0; iNegar + `, + "Negado": ` + + `, + "Pendente": ` + + + ` + } + const tbody = this.tabela.querySelector('tbody'); + + this.arr.forEach(dados => { + const linha = document.createElement('tr'); + linha.id = "formulario-" + dados.id; + let descricao; + let data = new Date(dados.data_hora); + let dataFormatada = Tabela.formatarDataHora(data); + if (dados.descricao.length > 10) { + descricao = ` + ${dados.descricao.substring(0, 10)}... + + + `; + } else { + descricao = dados.descricao; + } + + let acoes = STATUS_BOTOES[dados.situacao]; + + linha.innerHTML = ` +
+ + + + + + + + + `; + tbody.appendChild(linha); + }); + } +} + +function destacarLinhaTabela(id) { + let tabela = document.getElementById("tabela"); + let linha = document.getElementById(("formulario-" + id)); + + if (linha === null) { + return; + } + + // Loop para remover a linha-destacada de todas as linhas + for (let i = 0, row; (row = tabela.rows[i]); i++) { + row.classList.remove('linha-destacada'); + } + + linha.classList.add('linha-destacada'); // Adiciona a classe 'linha-destacada' + linha.scrollIntoView({ behavior: 'smooth' }); // Rola a página para a linha } function mostrarDescricaoCompleta(id) { @@ -48,132 +182,26 @@ function mostrarDescricaoCompleta(id) { botao.innerText = 'Ver menos'; } } -function destacarLinhaTabela(id) { - var tabela = document.getElementById("tabela"); - var linha = document.getElementById(id); - - // Loop para remover a linha-destacada de todas as linhas - for (var i = 0, row; (row = tabela.rows[i]); i++) { - row.classList.remove('linha-destacada'); - } - - linha.classList.add('linha-destacada'); // Adiciona a classe 'linha-destacada' - linha.scrollIntoView({ behavior: 'smooth' }); // Rola a página para a linha - - // Remove a classe linha-destacada depois de um determinado tempo - setTimeout(function () { - linha.classList.remove('linha-destacada'); - }, 2000); -} function initMapAdmin() { - if(document.getElementById('mapa_admin') == null) - { + if (document.getElementById('mapa_admin') == null) { return; } - mapAdmin = L.map('mapa_admin', {doubleClickZoom: false}).setView([-15.8267, -47.9218], 13); + mapAdmin = L.map('mapa_admin', { doubleClickZoom: false }).setView([-15.8267, -47.9218], 13); // Adiciona o provedor de mapa OpenStreetMap L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap contributors' }).addTo(mapAdmin); - formularios_aprovados.forEach(function(formulario) { - L.marker([formulario.latitude, formulario.longitude]).addTo(mapAdmin).on('click', function() { - + formularios_aprovados.forEach(function (formulario) { + L.marker([formulario.latitude, formulario.longitude], { icon: personalIcon }).addTo(mapAdmin).on('click', function () { destacarLinhaTabela(formulario.id); }); }); } -function initSortButtons() { - // Adiciona um evento de clique aos botões de ordenação - var sortButtons = document.querySelectorAll('.sort-btn'); - - sortButtons.forEach(function(button) { - button.addEventListener('click', function() { - var table = button.closest('table'); - var columnIndex = Array.from(button.parentNode.parentNode.children).indexOf(button.parentNode); - var order = button.getAttribute('data-order') || 'asc'; - - order = (order === 'asc') ? 'desc' : 'asc'; - button.setAttribute('data-order', order); - - // Atualiza o ícone do botão de ordenação - var icon = button.querySelector('.sort-icon'); - - // Remove e adiciona a classe do ícone com base na direção da ordenação - if (order === 'asc') { - icon.innerHTML = '▾'; // Triângulo para baixo (ordem crescente) - } else { - icon.innerHTML = '▴'; // Triângulo para cima (ordem decrescente) - } - - // Obtém todas as linhas da tabela, exceto a primeira (cabeçalho) - var rows = Array.from(table.querySelectorAll('tbody > tr')); - - // Determina o critério de ordenação com base na classe do botão - if (button.classList.contains('sort-by-date')) { - rows.sort(function(a, b) { - var aValue = new Date(a.children[columnIndex].textContent.trim().replace(/(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}):(\d{2})/, '$3-$2-$1T$4:$5:$6')); - var bValue = new Date(b.children[columnIndex].textContent.trim().replace(/(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}):(\d{2})/, '$3-$2-$1T$4:$5:$6')); - - return (order === 'asc') ? aValue - bValue : bValue - aValue; - }); - } else if (button.classList.contains('sort-by-email')) { - rows.sort(function(a, b) { - var aValue = a.children[columnIndex].textContent.trim().toLowerCase(); - var bValue = b.children[columnIndex].textContent.trim().toLowerCase(); - - return (order === 'asc') ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue); - }); - } else { - // Caso padrão: ordenação por texto - rows.sort(function(a, b) { - var aValue = a.children[columnIndex].textContent.trim().toLowerCase(); - var bValue = b.children[columnIndex].textContent.trim().toLowerCase(); - - return (order === 'asc') ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue); - }); - } - - // Limpa o conteúdo da tabela antes de reordenar - while (table.querySelector('tbody').firstChild) { - table.querySelector('tbody').removeChild(table.querySelector('tbody').firstChild); - } - - // Reinsere as linhas ordenadas na tabela - rows.forEach(function(row) { - table.querySelector('tbody').appendChild(row); - }); - }); - }); -} - -// Limpa o conteúdo da tabela -function excluirLinhas(tabela) -{ - while (tabela.querySelector('tbody').firstChild) { - tabela.querySelector('tbody').removeChild(tabela.querySelector('tbody').firstChild); - } -} - -function adicionarZero(numero) { - return numero < 10 ? '0' + numero : numero; -} - -function formatarDataHora(data) { - const dia = adicionarZero(data.getDate()); - const mes = adicionarZero(data.getMonth() + 1); // Adiciona 1 porque os meses são indexados de 0 a 11 - const ano = data.getFullYear(); - const hora = adicionarZero(data.getHours()); - const minutos = adicionarZero(data.getMinutes()); - const segundos = adicionarZero(data.getSeconds()); - - return `${dia}/${mes}/${ano} ${hora}:${minutos}:${segundos}`; -} - function confirmarAcao(mensagem, formulario, acao) { // Seleciona o modal e seus elementos var modal = document.getElementById('confirmModal'); @@ -188,82 +216,24 @@ function confirmarAcao(mensagem, formulario, acao) { modal.style.display = "block"; // Quando o usuário clica em "Confirmar" - confirmBtn.onclick = function() { + confirmBtn.onclick = function () { formulario.querySelector('input[name="action"]').value = acao; formulario.submit(); }; // Quando o usuário clica em "Cancelar" - cancelBtn.onclick = function() { + cancelBtn.onclick = function () { modal.style.display = "none"; }; // Quando o usuário clica fora do modal - window.onclick = function(event) { + window.onclick = function (event) { if (event.target == modal) { modal.style.display = "none"; } }; } -function gerarLinhas(tabela, arr) -{ - const STATUS_BOTOES = { - "Aprovado" : ` - - `, - "Negado" : ` - - `, - "Pendente" : ` - - - ` - } - var tbody = tabela.querySelector('tbody'); - - arr.forEach(dados => { - var linha = document.createElement('tr'); - linha.id = dados.id; - var descricao; - var data = new Date(dados.data_hora); - var dataFormatada = formatarDataHora(data); - if (dados.descricao.length > 10){ - descricao = ` - ${dados.descricao.substring(0, 10)}... - - - ` - } - else { - descricao = dados.descricao; - } - - acoes = STATUS_BOTOES[dados.situacao]; - - linha.innerHTML = ` - - - - - - - - - - `; - tbody.appendChild(linha); - }); -} - - function filtrar(elemento) { let arr = []; @@ -276,13 +246,11 @@ function filtrar(elemento) { Filtro.status = elemento.value; } - if(filtro_nome) - { - Filtro.nome = filtro_nome.value.toLowerCase().trim(); + if (filtro_nome) { + Filtro.nome = filtro_nome.value; } - if (filtro_servico) - { + if (filtro_servico) { Filtro.servico = filtro_servico.value; } @@ -292,13 +260,51 @@ function filtrar(elemento) { `; const tabela = document.getElementById("tabela"); - excluirLinhas(tabela); - gerarLinhas(tabela, arr); + const tabelaObj = new Tabela([], tabela); + tabelaObj.arr = arr; + + tabelaObj.excluirLinhas(); + tabelaObj.gerarLinhas(); +} + +function ordenar(elemento) { + let order = elemento.getAttribute('data-order') || 'asc'; + + order = (order === 'asc') ? 'desc' : 'asc'; + elemento.setAttribute('data-order', order); + + // Atualiza o ícone do botão de ordenação + var icon = elemento.querySelector('.sort-icon'); + + // Remove e adiciona a classe do ícone com base na direção da ordenação + if (order === 'asc') { + icon.innerHTML = '▾'; // Triângulo para baixo (ordem crescente) + } else { + icon.innerHTML = '▴'; // Triângulo para cima (ordem decrescente) + } + + Ordenador.ordem = order; + + // Determina o critério de ordenação com base na classe do botão + if (elemento.classList.contains('sort-by-date')) { + Ordenador.coluna = "data_hora"; + } else if (elemento.classList.contains('sort-by-email')) { + Ordenador.coluna = "email"; + } else { + // Caso padrão: ordenação por nome + Ordenador.coluna = "nome"; + } + + const tabelaObj = new Tabela([], tabela); + tabelaObj.arr = Ordenador.realizarOrdenacao(tabelaObj.arr); + + tabelaObj.excluirLinhas(); + tabelaObj.gerarLinhas(); } // Adiciona um evento de clique a todos os botões de "Ver mais/menos" -document.querySelectorAll('.ver-mais-btn').forEach(function(button) { - button.addEventListener('click', function() { +document.querySelectorAll('.ver-mais-btn').forEach(function (button) { + button.addEventListener('click', function () { var id = button.getAttribute('data-id'); mostrarDescricaoCompleta(id); }); @@ -306,7 +312,12 @@ document.querySelectorAll('.ver-mais-btn').forEach(function(button) { // Inicializa o mapa e os botões de ordenação quando a página carrega window.onload = function () { - initSortButtons(); initMapAdmin(); }; +// Exporta as classes +module.exports = { + Filtro, + Ordenador, + Tabela, +}; From 6d1d333555c7b823a956840ba0550c05c8037b48 Mon Sep 17 00:00:00 2001 From: Max-Rohrer20 Date: Fri, 28 Jun 2024 11:50:42 -0300 Subject: [PATCH 35/48] =?UTF-8?q?Corre=C3=A7=C3=A3o=20do=20css=20do=20pop-?= =?UTF-8?q?up=20para=20corrigir=20a=20linha=20que=20estava=20ficando=20sob?= =?UTF-8?q?reposta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/assets/styles/styles.css | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lgbtq_connect/assets/styles/styles.css b/lgbtq_connect/assets/styles/styles.css index 7ee38fab..11ea48bc 100644 --- a/lgbtq_connect/assets/styles/styles.css +++ b/lgbtq_connect/assets/styles/styles.css @@ -123,18 +123,19 @@ display:none; } -.leaflet-popup-content h4{ +.leaflet-popup-content h4 { font-family: Arial, sans-serif; font-size: 15px; - line-height: 10%; + line-height: 1.2; /* Ajuste a altura da linha para 120% */ color: #000000; text-align: center; + word-wrap: break-word; /* Permite a quebra de palavras longas */ + overflow-wrap: break-word; /* Permite a quebra de palavras longas */ + white-space: normal; /* Permite que o texto quebre em várias linhas */ } .leaflet-popup-content p{ font-family: Arial, sans-serif; text-align: center; - /* line-height: 10%; */ - /* font-size: 15px; */ color: #000000; } .leaflet-popup-content i{ From a31bb2aabf03ad22bcfc4181c42194d675a47114 Mon Sep 17 00:00:00 2001 From: Will Date: Mon, 1 Jul 2024 14:30:50 -0300 Subject: [PATCH 36/48] style: Mundanca do cursor nos botoes na tela de edicao --- lgbtq_connect/includes/admin/pagina_administracao.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index 40bf725e..9d17858b 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -52,7 +52,7 @@ function mostrar_dados() { From a33abb04911a6cef87ff5e59dc844e59a7ae1a3e Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Tue, 2 Jul 2024 11:15:29 -0300 Subject: [PATCH 37/48] =?UTF-8?q?resolu=C3=A7=C3=A3o=20dos=20testes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lgbtq_connect/includes/admin/admin_script.js | 22 +++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index ac53fd55..708f0b00 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -1,9 +1,3 @@ -// Definindo o ícone personalizado no escopo global -var personalIcon = L.icon({ - iconUrl: 'https://res.cloudinary.com/dxsx0emuu/image/upload/f_auto,q_auto/lc_marker', - iconSize: [20, 30], // tamanho do ícone - popupAnchor: [1, -10] -}); let mapAdmin; let mapEdit; let isSearching = false; @@ -186,6 +180,13 @@ function mostrarDescricaoCompleta(id) { } function initMapAdmin() { + // Definindo o ícone personalizado no escopo global + const personalIcon = L.icon({ + iconUrl: 'https://res.cloudinary.com/dxsx0emuu/image/upload/f_auto,q_auto/lc_marker', + iconSize: [20, 30], // tamanho do ícone + popupAnchor: [1, -10] + }); + if (document.getElementById('mapa_admin') == null) { return; } @@ -205,6 +206,13 @@ function initMapAdmin() { } function initMapEdit(latitude, longitude, nome, servico, descricao) { + // Definindo o ícone personalizado no escopo global + const personalIcon = L.icon({ + iconUrl: 'https://res.cloudinary.com/dxsx0emuu/image/upload/f_auto,q_auto/lc_marker', + iconSize: [20, 30], // tamanho do ícone + popupAnchor: [1, -10] + }); + // Verifica se o mapa já foi inicializado e destrói se necessário if (mapEdit !== undefined) { mapEdit.remove(); @@ -516,5 +524,5 @@ window.onload = function () { module.exports = { Filtro, Ordenador, - Tabela, + Tabela }; From 39ae4434b3d5c65879970a522e223e4bfe9d31c7 Mon Sep 17 00:00:00 2001 From: Punkrig Date: Tue, 2 Jul 2024 13:03:52 -0300 Subject: [PATCH 38/48] =?UTF-8?q?STYLE:=20dashboard.=20-implementando=20os?= =?UTF-8?q?=20bot=C3=B5es=20do=20estilo=20proposto=20no=20figma;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../includes/admin/pagina_administracao.php | 42 +++++++++++++++---- lgbtq_connect/includes/admin/style-admin.css | 7 +++- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index 184357b8..1e4f56ed 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -42,6 +42,7 @@ function mostrar_dados() { +
@@ -59,9 +60,21 @@ function mostrar_dados() { $negados = $wpdb->get_results($query_negados); $pendentes = $wpdb->get_results($query_pendentes); echo '
'; - echo ''; - echo ''; - echo ''; + echo ''; + echo ''; + echo ''; echo '
'; ?>
@@ -86,13 +99,24 @@ function mostrar_dados() {
-
${dados.nome}${dados.email}${dados.latitude}${dados.longitude}${dados.servico}${descricao}${dataFormatada}${dados.situacao} +
+ + + ${acoes} + + +
${dados.nome}${dados.email}${dados.latitude}${dados.longitude}${dados.servico}${descricao}${dataFormatada}${dados.situacao} - - - - ${acoes} - - -
diff --git a/lgbtq_connect/includes/admin/style-admin.css b/lgbtq_connect/includes/admin/style-admin.css index 47a8a217..99f035b1 100644 --- a/lgbtq_connect/includes/admin/style-admin.css +++ b/lgbtq_connect/includes/admin/style-admin.css @@ -194,11 +194,16 @@ table th:last-child { color: white; text-align:center; border: none; - + display: flex; + justify-content: space-between; + align-items: center; + font-size: 28px; + } .btn-pendente{ background: rgb(238,202,16); background: linear-gradient(149deg, rgba(238,202,16,1) 14%, rgba(235,115,10,1) 65%, rgba(221,73,28,1) 99%); + } .btn-negado{ background: rgb(238,16,24); From a785954566f58eab0b7bd5326f89213518adf71b Mon Sep 17 00:00:00 2001 From: Punkrig Date: Wed, 3 Jul 2024 09:49:09 -0300 Subject: [PATCH 39/48] =?UTF-8?q?BUG:=20github=20page.=20-tentando=20resol?= =?UTF-8?q?ver=20o=20problema=20do=20github=20page=20n=C3=A3o=20encontrar?= =?UTF-8?q?=20a=20p=C3=A1gina;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.nojekyll | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/.nojekyll diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 00000000..e69de29b From a8918b8710a37c9e831c240006219164f8380c4b Mon Sep 17 00:00:00 2001 From: Punkrig Date: Wed, 3 Jul 2024 11:53:36 -0300 Subject: [PATCH 40/48] STYLE: dashboard. -melhorando o design do modal; --- lgbtq_connect/includes/admin/pagina_administracao.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index 1e4f56ed..55a77b88 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -103,8 +103,7 @@ function mostrar_dados() { - - + + @@ -178,23 +178,9 @@ function mostrarDescricaoCompleta(id) { botao.innerText = 'Ver menos'; } } -function destacarLinhaTabela(id) { - var tabela = document.getElementById("tabela"); - var linha = document.getElementById(id); - // Loop para remover a linha-destacada de todas as linhas - for (var i = 0, row; (row = tabela.rows[i]); i++) { - row.classList.remove('linha-destacada'); - } - linha.classList.add('linha-destacada'); // Adiciona a classe 'linha-destacada' - linha.scrollIntoView({ behavior: 'smooth' }); // Rola a página para a linha - // Remove a classe linha-destacada depois de um determinado tempo - setTimeout(function () { - linha.classList.remove('linha-destacada'); - }, 2000); -} function initMapAdmin() { // Definindo o ícone personalizado no escopo global const personalIcon = L.icon({ @@ -220,90 +206,54 @@ function initMapAdmin() { }); }); } -function initSortButtons() { - // Adiciona um evento de clique aos botões de ordenação - var sortButtons = document.querySelectorAll('.sort-btn'); - - sortButtons.forEach(function(button) { - button.addEventListener('click', function() { - var table = button.closest('table'); - var columnIndex = Array.from(button.parentNode.parentNode.children).indexOf(button.parentNode); - var order = button.getAttribute('data-order') || 'asc'; - - order = (order === 'asc') ? 'desc' : 'asc'; - button.setAttribute('data-order', order); - // Atualiza o ícone do botão de ordenação - var icon = button.querySelector('.sort-icon'); - - // Remove e adiciona a classe do ícone com base na direção da ordenação - if (order === 'asc') { - icon.innerHTML = '▾'; // Triângulo para baixo (ordem crescente) - } else { - icon.innerHTML = '▴'; // Triângulo para cima (ordem decrescente) - } - - // Obtém todas as linhas da tabela, exceto a primeira (cabeçalho) - var rows = Array.from(table.querySelectorAll('tbody > tr')); - - // Determina o critério de ordenação com base na classe do botão - if (button.classList.contains('sort-by-date')) { - rows.sort(function(a, b) { - var aValue = new Date(a.children[columnIndex].textContent.trim().replace(/(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}):(\d{2})/, '$3-$2-$1T$4:$5:$6')); - var bValue = new Date(b.children[columnIndex].textContent.trim().replace(/(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}):(\d{2})/, '$3-$2-$1T$4:$5:$6')); +function initMapEdit(latitude, longitude, nome, servico, descricao) { + // Definindo o ícone personalizado no escopo global + const personalIcon = L.icon({ + iconUrl: 'https://res.cloudinary.com/dxsx0emuu/image/upload/f_auto,q_auto/lc_marker', + iconSize: [20, 30], // tamanho do ícone + popupAnchor: [1, -10] + }); - return (order === 'asc') ? aValue - bValue : bValue - aValue; - }); - } else if (button.classList.contains('sort-by-email')) { - rows.sort(function(a, b) { - var aValue = a.children[columnIndex].textContent.trim().toLowerCase(); - var bValue = b.children[columnIndex].textContent.trim().toLowerCase(); + // Verifica se o mapa já foi inicializado e destrói se necessário + if (mapEdit !== undefined) { + mapEdit.remove(); + } - return (order === 'asc') ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue); - }); - } else { - // Caso padrão: ordenação por texto - rows.sort(function(a, b) { - var aValue = a.children[columnIndex].textContent.trim().toLowerCase(); - var bValue = b.children[columnIndex].textContent.trim().toLowerCase(); + mapEdit = L.map('mapa_formulario_edit', { doubleClickZoom: false }).setView([-15.8267, -47.9218], 13); - return (order === 'asc') ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue); - }); - } + // Adiciona o provedor de mapa OpenStreetMap + L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors' + }).addTo(mapEdit); + + var popupConteudo = ` +
+

${nome}

+ ${servico} +
+

${descricao}

+
+ `; + + // Função para atualizar os inputs de latitude e longitude + function updateInputs(lat, lng) { + document.getElementById('editLatitude').value = lat; + document.getElementById('editLongitude').value = lng; + } - // Limpa o conteúdo da tabela antes de reordenar - while (table.querySelector('tbody').firstChild) { - table.querySelector('tbody').removeChild(table.querySelector('tbody').firstChild); - } + // Adiciona um marcador arrastável + var marker = L.marker( + [latitude, longitude], + {draggable: true, icon: personalIcon } + ).addTo(mapEdit).bindPopup(popupConteudo); - // Reinsere as linhas ordenadas na tabela - rows.forEach(function(row) { - table.querySelector('tbody').appendChild(row); - }); - }); + marker.on('dragend', function (e) { + var newPosition = marker.getLatLng(); + updateInputs(newPosition.lat, newPosition.lng); }); -} -// Limpa o conteúdo da tabela -function excluirLinhas(tabela) -{ - while (tabela.querySelector('tbody').firstChild) { - tabela.querySelector('tbody').removeChild(tabela.querySelector('tbody').firstChild); - } -} -function adicionarZero(numero) { - return numero < 10 ? '0' + numero : numero; -} - -function formatarDataHora(data) { - const dia = adicionarZero(data.getDate()); - const mes = adicionarZero(data.getMonth() + 1); // Adiciona 1 porque os meses são indexados de 0 a 11 - const ano = data.getFullYear(); - const hora = adicionarZero(data.getHours()); - const minutos = adicionarZero(data.getMinutes()); - const segundos = adicionarZero(data.getSeconds()); - - return `${dia}/${mes}/${ano} ${hora}:${minutos}:${segundos}`; + document.getElementById('mapa_admin').style.display = "block"; } function confirmarAcao(mensagem, formulario, acao) { @@ -337,63 +287,161 @@ function confirmarAcao(mensagem, formulario, acao) { } }; } -function gerarLinhas(tabela, arr) -{ - const STATUS_BOTOES = { - "Aprovado" : ` - - `, - "Negado" : ` - - `, - "Pendente" : ` - - - ` + +function abrirModalEdicao(dados) { + const popup = document.getElementById("editPopup"); + const modal = document.getElementById('editModal'); + + // Preenche os campos do formulário com os dados fornecidos + document.getElementById('editId').value = dados.id; + document.getElementById('editNome').value = dados.nome; + document.getElementById('editEmail').value = dados.email; + document.getElementById('editServico').value = dados.servico; + document.getElementById('editDescricao').value = dados.descricao; + document.getElementById('editLatitude').value = dados.latitude; + document.getElementById('editLongitude').value = dados.longitude; + + initMapEdit(dados.latitude, dados.longitude, dados.nome, dados.servico, dados.descricao); + + // Exibe o modal de edição + popup.style.display = "flex"; + modal.style.display = "block"; + + // Atualiza o tamanho do mapa e define a visualização após um pequeno atraso para garantir que o modal tenha sido completamente exibido + setTimeout(function() { + mapEdit.invalidateSize(); + mapEdit.setView([dados.latitude, dados.longitude], 13); + }, 200); + + modal.scrollIntoView({ behavior: 'smooth' }); + + // Fecha o modal de edição quando o usuário clica fora do modal + window.onclick = function(event) { + if (event.target == popup) { + fecharEditor(); + } + }; +} + +function fecharEditor() { + document.getElementById('editPopup').style.display = "none"; + document.getElementById('editModal').style.display = "none"; + document.getElementById('mapa_admin').style.display = "block"; + document.getElementById('listaResultadosEdit').innerHTML = ''; + document.getElementById('searchInputFormEdit').value = ''; +} + +function searchButtonClickedEdit() { + if (isSearching) { + return; // Se uma busca já estiver em andamento, saia da função } - var tbody = tabela.querySelector('tbody'); - - arr.forEach(dados => { - var linha = document.createElement('tr'); - linha.id = dados.id; - var descricao; - var data = new Date(dados.data_hora); - var dataFormatada = formatarDataHora(data); - if (dados.descricao.length > 10){ - descricao = ` - ${dados.descricao.substring(0, 10)}... - - - ` + isSearching = true; // Indica que uma busca está em andamento + var searchTerm = document.getElementById('searchInputFormEdit').value; + searchLocations(searchTerm); +} + +function searchLocations(query) { + var resultados = []; + var apiUrl = 'https://nominatim.openstreetmap.org/search?format=json&q=' + encodeURIComponent(query); + fetch(apiUrl) + .then(response => response.json()) + .then(data => { + data.forEach(location => { + resultados.push({ + display_name: location.display_name, + lat: location.lat, + lon: location.lon + }); + }); + imprimirResultados(resultados); + isSearching = false; // Indica que a busca foi concluída + }) + .catch(error => { + console.error('Erro ao buscar locais:', error); + isSearching = false; // Indica que a busca foi concluída mesmo com erro + }); +} + +function imprimirResultados(resultados) { + var listaResultadosOcultados = []; + var listaResultados = document.getElementById('listaResultadosEdit'); + + listaResultados.innerHTML = ''; + var count = 0; + var div = document.createElement('div'); + resultados.forEach(resultado => { + var divResultado = document.createElement('div'); + divResultado.classList.add('celula_resultado'); + divResultado.style.borderRadius = '3px'; + divResultado.style.margin = '5px 5px 5px 0px'; + divResultado.style.cursor = 'pointer'; + divResultado.innerHTML = '' + resultado.display_name; + divResultado.addEventListener('click', function () { + changeMapView(resultado.lat, resultado.lon); + }); + count += 1; + if(count <= 5) { + div.appendChild(divResultado); + } else { + divResultado.style.display = 'none'; + listaResultadosOcultados.push(divResultado); + div.appendChild(divResultado); + } + }); + + listaResultados.appendChild(div); + + if (count > 5) { + // Adicionando botão "Ver Mais" + var verMaisButton = document.createElement('button'); + verMaisButton.textContent = 'Ver Mais'; + verMaisButton.setAttribute('type', 'button'); + verMaisButton.setAttribute('class', 'ver'); + verMaisButton.addEventListener('click', function() { + MostrarMaisResultados(); + }); + + listaResultados.appendChild(verMaisButton); + + // Adicionando botão "Ver Menos" + var verMenosButton = document.createElement('button'); + verMenosButton.textContent = 'Ver Menos'; + verMenosButton.setAttribute('type', 'button'); + verMenosButton.setAttribute('class', 'ver'); + verMenosButton.addEventListener('click', function() { + MostrarMenosResultados(); + }); + verMenosButton.style.display = 'none'; + + listaResultados.appendChild(verMenosButton); + + // Função para mostrar mais resultados + function MostrarMaisResultados() { + listaResultadosOcultados.forEach(resultado => { + resultado.style.display = 'block'; + }); + verMaisButton.style.display = 'none'; + verMenosButton.style.display = 'block'; } - else { - descricao = dados.descricao; + + // Função para mostrar menos resultados + function MostrarMenosResultados() { + listaResultadosOcultados.forEach(resultado => { + resultado.style.display = 'none'; + }); + verMaisButton.style.display = 'block'; + verMenosButton.style.display = 'none'; } - - acoes = STATUS_BOTOES[dados.situacao]; - - linha.innerHTML = ` - - - - - - - - - - `; - tbody.appendChild(linha); - }); -} + } + function changeMapView(lat, lng) { + if (mapEdit) { + mapEdit.setView([lat, lng], 13); + } else { + console.error("Mapa de edição não ativo"); + } + } +} function filtrar(elemento) { let arr = []; diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index b62e7daa..bf40af09 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -45,11 +45,6 @@ function mostrar_dados() { -<<<<<<< HEAD - - -======= ->>>>>>> developer
@@ -143,17 +138,10 @@ function mostrar_dados() {
${dados.nome} ${dados.email}${dados.latitude}${dados.longitude}${dados.city}${dados.road} ${dados.servico} ${descricao} ${dataFormatada}${dados.nome}${dados.email}${dados.city}${dados.road}${dados.servico}${descricao}${dataFormatada}${dados.situacao} -
- - - ${acoes} - - -
-<<<<<<< HEAD - - - - -======= - - ->>>>>>> developer + + From 54cac0db79f472de0efe860b3d8c51a0788c6493 Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Wed, 3 Jul 2024 13:07:15 -0300 Subject: [PATCH 43/48] =?UTF-8?q?bugfix(devs):=20Modifica=C3=A7=C3=A3o=20d?= =?UTF-8?q?o=20conjunto=20de=20testes=20da=20tabela=20para=20se=20adaptar?= =?UTF-8?q?=20as=20mudan=C3=A7as=20realizadas=20na=20tabela?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/js/tabela_admin.test.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/js/tabela_admin.test.js b/tests/js/tabela_admin.test.js index 9a65e5a5..2c7f2b4d 100644 --- a/tests/js/tabela_admin.test.js +++ b/tests/js/tabela_admin.test.js @@ -9,6 +9,8 @@ describe("manipulação da tabela do admin", () => { "nome": "Cabana", "email": "exemplo1@gmail.com", "latitude": 50.2, + "city": "Cidade das boas", + "road": "Rua das boas", "longitude": 20.3, "data_hora": "2024-01-01 00:00:00", "servico": "entretenimento", @@ -47,10 +49,10 @@ describe("manipulação da tabela do admin", () => { expect(document.getElementById("formulario-1-email").innerHTML).toBe("exemplo1@gmail.com"); // Verifica se a latitude está correta - expect(document.getElementById("formulario-1-latitude").innerHTML).toBe("50.2"); + expect(document.getElementById("formulario-1-cidade").innerHTML).toBe("Cidade das boas"); // Verifica se a longitude está correta - expect(document.getElementById("formulario-1-longitude").innerHTML).toBe("20.3"); + expect(document.getElementById("formulario-1-rua").innerHTML).toBe("Rua das boas"); // Verifica se a data e hora está correta expect(document.getElementById("formulario-1-data_hora").innerHTML).toBe("01/01/2024 00:00:00"); From 6639d6d5dbef89fa6e1bd53b629959063dba5094 Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Wed, 3 Jul 2024 13:54:00 -0300 Subject: [PATCH 44/48] =?UTF-8?q?bugfix(admin):=20a=20cidade=20e=20a=20rua?= =?UTF-8?q?=20s=C3=A3o=20atualizadas=20quando=20a=20localiza=C3=A7=C3=A3o?= =?UTF-8?q?=20=C3=A9=20editada=20no=20formul=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../includes/admin/formulario-admin-page.php | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lgbtq_connect/includes/admin/formulario-admin-page.php b/lgbtq_connect/includes/admin/formulario-admin-page.php index 493f062c..e7e4129f 100644 --- a/lgbtq_connect/includes/admin/formulario-admin-page.php +++ b/lgbtq_connect/includes/admin/formulario-admin-page.php @@ -140,6 +140,29 @@ function atualizar_formulario($wpdb) { $latitude = sanitize_text_field($_POST['latitude']); $longitude = sanitize_text_field($_POST['longitude']); + $url = "https://nominatim.openstreetmap.org/reverse?format=json&lat=$latitude&lon=$longitude&addressdetails=1"; + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'); + $response = curl_exec($ch); + curl_close($ch); + $locationData = json_decode($response, true); + + // Adicione um log para a resposta da API + error_log(print_r($locationData, true)); + + if (isset($locationData['error'])) { + $road = 'Rua não encontrada'; + $city = 'Cidade não encontrada'; + } else { + $road = isset($locationData['address']['road']) ? $locationData['address']['road'] : + (isset($locationData['address']['pedestrian']) ? $locationData['address']['pedestrian'] : 'Rua não encontrada'); + $city = isset($locationData['address']['city']) ? $locationData['address']['city'] : + (isset($locationData['address']['town']) ? $locationData['address']['town'] : + (isset($locationData['address']['village']) ? $locationData['address']['village'] : 'Cidade não encontrada')); + } + // Atualiza os dados no banco de dados $tabela = "lc_formulario"; $dados = array( @@ -149,6 +172,8 @@ function atualizar_formulario($wpdb) { 'descricao' => $descricao, 'latitude' => $latitude, 'longitude' => $longitude, + 'road' => $road, + 'city' => $city, ); $condicoes = array('id' => $id); From b0bb08d1e2b85150ca16f90dcd3948a8bb1e066f Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Wed, 3 Jul 2024 14:35:33 -0300 Subject: [PATCH 45/48] =?UTF-8?q?bugfix(devs):=20atualizado=20os=20testes?= =?UTF-8?q?=20PHP=20para=20mockar=20a=20fun=C3=A7=C3=A3o=20de=20conseguir?= =?UTF-8?q?=20a=20rua=20e=20cidade?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../includes/admin/formulario-admin-page.php | 36 +++++++++++-------- tests/php/AlteraStatusTest.php | 13 ++++++- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/lgbtq_connect/includes/admin/formulario-admin-page.php b/lgbtq_connect/includes/admin/formulario-admin-page.php index e7e4129f..5d9a68a4 100644 --- a/lgbtq_connect/includes/admin/formulario-admin-page.php +++ b/lgbtq_connect/includes/admin/formulario-admin-page.php @@ -125,21 +125,7 @@ function excluir_formulario($id) { echo ''; } -// Função para processar a atualização do formulário -function atualizar_formulario($wpdb) { - // Verifique se os dados necessários estão presentes - if (!isset($_POST['id'], $_POST['nome'], $_POST['email'], $_POST['servico'], $_POST['descricao'], $_POST['latitude'], $_POST['longitude'])) { - wp_die('Dados insuficientes'); - } - - $id = intval($_POST['id']); - $nome = sanitize_text_field($_POST['nome']); - $email = sanitize_email($_POST['email']); - $servico = sanitize_text_field($_POST['servico']); - $descricao = sanitize_textarea_field($_POST['descricao']); - $latitude = sanitize_text_field($_POST['latitude']); - $longitude = sanitize_text_field($_POST['longitude']); - +function conseguir_rua_e_cidade($latitude, $longitude) { $url = "https://nominatim.openstreetmap.org/reverse?format=json&lat=$latitude&lon=$longitude&addressdetails=1"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); @@ -163,6 +149,26 @@ function atualizar_formulario($wpdb) { (isset($locationData['address']['village']) ? $locationData['address']['village'] : 'Cidade não encontrada')); } + return array($road, $city); +} + +// Função para processar a atualização do formulário +function atualizar_formulario($wpdb) { + // Verifique se os dados necessários estão presentes + if (!isset($_POST['id'], $_POST['nome'], $_POST['email'], $_POST['servico'], $_POST['descricao'], $_POST['latitude'], $_POST['longitude'])) { + wp_die('Dados insuficientes'); + } + + $id = intval($_POST['id']); + $nome = sanitize_text_field($_POST['nome']); + $email = sanitize_email($_POST['email']); + $servico = sanitize_text_field($_POST['servico']); + $descricao = sanitize_textarea_field($_POST['descricao']); + $latitude = sanitize_text_field($_POST['latitude']); + $longitude = sanitize_text_field($_POST['longitude']); + + list($road, $city) = conseguir_rua_e_cidade($latitude, $longitude); + // Atualiza os dados no banco de dados $tabela = "lc_formulario"; $dados = array( diff --git a/tests/php/AlteraStatusTest.php b/tests/php/AlteraStatusTest.php index 77fe84a6..e4a4f963 100644 --- a/tests/php/AlteraStatusTest.php +++ b/tests/php/AlteraStatusTest.php @@ -63,6 +63,15 @@ public function test_atualizar_formulario_success() { $_POST['latitude'] = '12.345678'; $_POST['longitude'] = '98.7654321'; + // Mock da função conseguir_rua_e_cidade + $this->getMockBuilder('stdClass') + ->setMethods(['conseguir_rua_e_cidade']) + ->getMock(); + + function conseguir_rua_e_cidade($latitude, $longitude) { + return ['Mock Rua', 'Mock Cidade']; + } + // Defina o que o mock do $wpdb->update deve retornar $this->wpdb->expects($this->once()) ->method('update') @@ -75,11 +84,13 @@ public function test_atualizar_formulario_success() { 'descricao' => 'Teste Descrição', 'latitude' => '12.345678', 'longitude' => '98.7654321', + 'road' => 'Mock Rua', + 'city' => 'Mock Cidade', ]), $this->equalTo(['id' => 1]) ) ->willReturn(1); - + // Chame a função atualizar_formulario atualizar_formulario($this->wpdb); } From 1261cb0c9a198a4e453a15f8e18747fe0199e98f Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Wed, 3 Jul 2024 14:45:19 -0300 Subject: [PATCH 46/48] =?UTF-8?q?bugfix(devs):=20atualizado=20os=20testes?= =?UTF-8?q?=20PHP=20para=20mockar=20a=20fun=C3=A7=C3=A3o=20de=20conseguir?= =?UTF-8?q?=20a=20rua=20e=20cidade=20(novamente)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../includes/admin/formulario-admin-page.php | 63 +++++++++---------- tests/php/AlteraStatusTest.php | 10 +-- 2 files changed, 34 insertions(+), 39 deletions(-) diff --git a/lgbtq_connect/includes/admin/formulario-admin-page.php b/lgbtq_connect/includes/admin/formulario-admin-page.php index 5d9a68a4..34bf53c6 100644 --- a/lgbtq_connect/includes/admin/formulario-admin-page.php +++ b/lgbtq_connect/includes/admin/formulario-admin-page.php @@ -1,7 +1,34 @@ window.location.href = window.location.href;'; } -function conseguir_rua_e_cidade($latitude, $longitude) { - $url = "https://nominatim.openstreetmap.org/reverse?format=json&lat=$latitude&lon=$longitude&addressdetails=1"; - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'); - $response = curl_exec($ch); - curl_close($ch); - $locationData = json_decode($response, true); - - // Adicione um log para a resposta da API - error_log(print_r($locationData, true)); - - if (isset($locationData['error'])) { - $road = 'Rua não encontrada'; - $city = 'Cidade não encontrada'; - } else { - $road = isset($locationData['address']['road']) ? $locationData['address']['road'] : - (isset($locationData['address']['pedestrian']) ? $locationData['address']['pedestrian'] : 'Rua não encontrada'); - $city = isset($locationData['address']['city']) ? $locationData['address']['city'] : - (isset($locationData['address']['town']) ? $locationData['address']['town'] : - (isset($locationData['address']['village']) ? $locationData['address']['village'] : 'Cidade não encontrada')); - } - - return array($road, $city); -} - // Função para processar a atualização do formulário -function atualizar_formulario($wpdb) { +function atualizar_formulario($wpdb, $funcao_localizacao) { // Verifique se os dados necessários estão presentes if (!isset($_POST['id'], $_POST['nome'], $_POST['email'], $_POST['servico'], $_POST['descricao'], $_POST['latitude'], $_POST['longitude'])) { wp_die('Dados insuficientes'); @@ -167,7 +167,7 @@ function atualizar_formulario($wpdb) { $latitude = sanitize_text_field($_POST['latitude']); $longitude = sanitize_text_field($_POST['longitude']); - list($road, $city) = conseguir_rua_e_cidade($latitude, $longitude); + list($road, $city) = $funcao_localizacao($latitude, $longitude); // Atualiza os dados no banco de dados $tabela = "lc_formulario"; @@ -185,5 +185,4 @@ function atualizar_formulario($wpdb) { $condicoes = array('id' => $id); $resultado = $wpdb->update($tabela, $dados, $condicoes); -} - \ No newline at end of file +} \ No newline at end of file diff --git a/tests/php/AlteraStatusTest.php b/tests/php/AlteraStatusTest.php index e4a4f963..11d63a04 100644 --- a/tests/php/AlteraStatusTest.php +++ b/tests/php/AlteraStatusTest.php @@ -64,13 +64,9 @@ public function test_atualizar_formulario_success() { $_POST['longitude'] = '98.7654321'; // Mock da função conseguir_rua_e_cidade - $this->getMockBuilder('stdClass') - ->setMethods(['conseguir_rua_e_cidade']) - ->getMock(); - - function conseguir_rua_e_cidade($latitude, $longitude) { + $mock_conseguir_rua_e_cidade = function($latitude, $longitude) { return ['Mock Rua', 'Mock Cidade']; - } + }; // Defina o que o mock do $wpdb->update deve retornar $this->wpdb->expects($this->once()) @@ -92,7 +88,7 @@ function conseguir_rua_e_cidade($latitude, $longitude) { ->willReturn(1); // Chame a função atualizar_formulario - atualizar_formulario($this->wpdb); + atualizar_formulario($this->wpdb, $mock_conseguir_rua_e_cidade); } public function test_atualizar_formulario_missing_data() { From 7cdfb0f872e94ff61c756589048fdb0681ecfec1 Mon Sep 17 00:00:00 2001 From: MarcosViniciusG Date: Wed, 3 Jul 2024 14:55:46 -0300 Subject: [PATCH 47/48] =?UTF-8?q?bugfix(devs):=20atualizado=20os=20testes?= =?UTF-8?q?=20PHP=20para=20mockar=20a=20fun=C3=A7=C3=A3o=20de=20conseguir?= =?UTF-8?q?=20a=20rua=20e=20cidade=20(novamente=20novamente)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.lock | 14 +++++++------- tests/php/AlteraStatusTest.php | 8 ++++++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/composer.lock b/composer.lock index 71b8d96f..e5f5631f 100644 --- a/composer.lock +++ b/composer.lock @@ -565,16 +565,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.20", + "version": "10.5.25", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3" + "reference": "831bf82312be6037e811833ddbea0b8de60ea314" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/547d314dc24ec1e177720d45c6263fb226cc2ae3", - "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/831bf82312be6037e811833ddbea0b8de60ea314", + "reference": "831bf82312be6037e811833ddbea0b8de60ea314", "shasum": "" }, "require": { @@ -646,7 +646,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.20" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.25" }, "funding": [ { @@ -662,7 +662,7 @@ "type": "tidelift" } ], - "time": "2024-04-24T06:32:35+00:00" + "time": "2024-07-03T05:49:17+00:00" }, { "name": "sebastian/cli-parser", @@ -1638,5 +1638,5 @@ "prefer-lowest": false, "platform": [], "platform-dev": [], - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.2.0" } diff --git a/tests/php/AlteraStatusTest.php b/tests/php/AlteraStatusTest.php index 11d63a04..04b1ef3e 100644 --- a/tests/php/AlteraStatusTest.php +++ b/tests/php/AlteraStatusTest.php @@ -81,7 +81,7 @@ public function test_atualizar_formulario_success() { 'latitude' => '12.345678', 'longitude' => '98.7654321', 'road' => 'Mock Rua', - 'city' => 'Mock Cidade', + 'city' => 'Mock Cidade' ]), $this->equalTo(['id' => 1]) ) @@ -99,8 +99,12 @@ public function test_atualizar_formulario_missing_data() { $this->expectException(WPDieException::class); $this->expectExceptionMessage('Dados insuficientes'); + $mock_conseguir_rua_e_cidade = function($latitude, $longitude) { + return ['Mock Rua', 'Mock Cidade']; + }; + // Chame a função atualizar_formulario e verifique se wp_die é chamado - atualizar_formulario($this->wpdb); + atualizar_formulario($this->wpdb, $mock_conseguir_rua_e_cidade); } // Testes para a função alteraStatus From 3c5f466558fb97b7eca361ca223176d92e2287c8 Mon Sep 17 00:00:00 2001 From: Punkrig Date: Thu, 4 Jul 2024 10:00:12 -0300 Subject: [PATCH 48/48] MERGE: dashboard. -resolvendo conflitos de merge; --- lgbtq_connect/includes/admin/admin_script.js | 257 +++++++++++++++--- .../includes/admin/pagina_administracao.php | 56 +++- lgbtq_connect/includes/admin/style-admin.css | 216 ++++++++++++++- 3 files changed, 472 insertions(+), 57 deletions(-) diff --git a/lgbtq_connect/includes/admin/admin_script.js b/lgbtq_connect/includes/admin/admin_script.js index 6887928f..f0762f76 100644 --- a/lgbtq_connect/includes/admin/admin_script.js +++ b/lgbtq_connect/includes/admin/admin_script.js @@ -208,17 +208,18 @@ function confirmarAcao(mensagem, formulario, acao) { function gerarLinhas(tabela, arr) { const STATUS_BOTOES = { - "Aprovado" : ` - + "Aprovado": ` + `, - "Negado" : ` - + "Negado": ` + `, - "Pendente" : ` - - + "Pendente": ` + + ` - } + }; + var tbody = tabela.querySelector('tbody'); arr.forEach(dados => { @@ -227,53 +228,219 @@ function gerarLinhas(tabela, arr) { var descricao; var data = new Date(dados.data_hora); var dataFormatada = formatarDataHora(data); - if (dados.descricao.length > 10){ + + if (dados.descricao.length > 10) { descricao = ` - ${dados.descricao.substring(0, 10)}... - - - ` - } - else { + ${dados.descricao.substring(0, 10)}... + + + `; + } else { descricao = dados.descricao; } - - acoes = STATUS_BOTOES[dados.situacao]; - linha.innerHTML = ` - - - - - - - - - + var acoes = STATUS_BOTOES[dados.situacao]; + linha.innerHTML = ` + + + + + + + + + `; + tbody.appendChild(linha); }); } +function mostrarDescricaoCompleta(id) { + var descricaoResumida = document.getElementById(`descricaoResumida_${id}`); + var descricaoCompleta = document.getElementById(`descricaoCompleta_${id}`); + + if (descricaoResumida && descricaoCompleta) { + descricaoResumida.style.display = 'none'; + descricaoCompleta.style.display = 'inline'; + } +} + +function abrirModalEdicao(dados) { + const popup = document.getElementById("editPopup") + const modal = document.getElementById('editModal'); + + // Preenche os campos do formulário com os dados fornecidos + document.getElementById('editId').value = dados.id; + document.getElementById('editNome').value = dados.nome; + document.getElementById('editEmail').value = dados.email; + document.getElementById('editServico').value = dados.servico; + document.getElementById('editDescricao').value = dados.descricao; + document.getElementById('editLatitude').value = dados.latitude; + document.getElementById('editLongitude').value = dados.longitude; + + initMapEdit(dados.latitude, dados.longitude, dados.nome, dados.servico, dados.descricao); + + // Exibe o modal de edição + popup.style.display = "flex"; + modal.style.display = "block"; + + // Atualiza o tamanho do mapa e define a visualização após um pequeno atraso para garantir que o modal tenha sido completamente exibido + setTimeout(function() { + mapEdit.invalidateSize(); + mapEdit.setView([dados.latitude, dados.longitude], 13); + }, 200); + + modal.scrollIntoView({ behavior: 'smooth' }); + + // Fecha o modal de edição quando o usuário clica fora do modal + window.onclick = function(event) { + if (event.target == modal) { + fecharEditor(); + } + }; +} + +function fecharEditor() { + document.getElementById('editPopup').style.display = "none"; + document.getElementById('editModal').style.display = "none"; + document.getElementById('mapa_admin').style.display = "block"; + document.getElementById('listaResultadosEdit').innerHTML = ''; + document.getElementById('searchInputFormEdit').value = ''; +} + +function searchButtonClickedEdit() { + if (isSearching) { + return; // Se uma busca já estiver em andamento, saia da função + } + isSearching = true; // Indica que uma busca está em andamento + var searchTerm = document.getElementById('searchInputFormEdit').value; + searchLocations(searchTerm); +} + +function searchLocations(query) { + var resultados = []; + var apiUrl = 'https://nominatim.openstreetmap.org/search?format=json&q=' + encodeURIComponent(query); + fetch(apiUrl) + .then(response => response.json()) + .then(data => { + data.forEach(location => { + resultados.push({ + display_name: location.display_name, + lat: location.lat, + lon: location.lon + }); + }); + imprimirResultados(resultados); + isSearching = false; // Indica que a busca foi concluída + }) + .catch(error => { + console.error('Erro ao buscar locais:', error); + isSearching = false; // Indica que a busca foi concluída mesmo com erro + }); +} + +function imprimirResultados(resultados) { + var listaResultadosOcultados = []; + var listaResultados = document.getElementById('listaResultadosEdit'); + + listaResultados.innerHTML = ''; + var count = 0; + var div = document.createElement('div'); + resultados.forEach(resultado => { + var divResultado = document.createElement('div'); + divResultado.classList.add('celula_resultado'); + divResultado.style.borderRadius = '3px'; + divResultado.style.margin = '5px 5px 5px 0px'; + divResultado.style.cursor = 'pointer'; + divResultado.innerHTML = '' + resultado.display_name; + divResultado.addEventListener('click', function () { + changeMapView(resultado.lat, resultado.lon); + }); + count += 1; + if(count <= 5) { + div.appendChild(divResultado); + } else { + divResultado.style.display = 'none'; + listaResultadosOcultados.push(divResultado); + div.appendChild(divResultado); + } + }); + + listaResultados.appendChild(div); + + if (count > 5) { + // Adicionando botão "Ver Mais" + var verMaisButton = document.createElement('button'); + verMaisButton.textContent = 'Ver Mais'; + verMaisButton.setAttribute('type', 'button'); + verMaisButton.setAttribute('class', 'ver'); + verMaisButton.addEventListener('click', function() { + MostrarMaisResultados(); + }); + + listaResultados.appendChild(verMaisButton); + + // Adicionando botão "Ver Menos" + var verMenosButton = document.createElement('button'); + verMenosButton.textContent = 'Ver Menos'; + verMenosButton.setAttribute('type', 'button'); + verMenosButton.setAttribute('class', 'ver'); + verMenosButton.addEventListener('click', function() { + MostrarMenosResultados(); + }); + verMenosButton.style.display = 'none'; + + listaResultados.appendChild(verMenosButton); + + // Função para mostrar mais resultados + function MostrarMaisResultados() { + listaResultadosOcultados.forEach(resultado => { + resultado.style.display = 'block'; + }); + verMaisButton.style.display = 'none'; + verMenosButton.style.display = 'block'; + } + + // Função para mostrar menos resultados + function MostrarMenosResultados() { + listaResultadosOcultados.forEach(resultado => { + resultado.style.display = 'none'; + }); + verMaisButton.style.display = 'block'; + verMenosButton.style.display = 'none'; + } + } +} + +function mostrarDescricaoCompleta(id) { + var descricaoResumida = document.getElementById(`descricaoResumida_${id}`); + var descricaoCompleta = document.getElementById(`descricaoCompleta_${id}`); + + if (descricaoResumida && descricaoCompleta) { + descricaoResumida.style.display = 'none'; + descricaoCompleta.style.display = 'inline'; + } +} + function filtrar(elemento) { let arr = []; diff --git a/lgbtq_connect/includes/admin/pagina_administracao.php b/lgbtq_connect/includes/admin/pagina_administracao.php index 55a77b88..61087c73 100644 --- a/lgbtq_connect/includes/admin/pagina_administracao.php +++ b/lgbtq_connect/includes/admin/pagina_administracao.php @@ -14,14 +14,20 @@ function adicionar_pagina_administracao() { add_action('admin_menu', 'adicionar_pagina_administracao'); +require 'formulario-admin-page.php'; + // Função para mostrar os dados na página do painel de administração function mostrar_dados() { global $wpdb; + + // Exibir mensagem de sucesso se os dados foram atualizados + if (isset($_GET['status']) && $_GET['status'] == 'success') { + echo '

Formulário atualizado com sucesso!

'; + } + // Consulta os dados da tabela formulario $dados_formulario = $wpdb->get_results("SELECT * FROM lc_formulario"); - require 'formulario-admin-page.php'; - // Verifica se o parâmetro "action" foi enviado via POST if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST['action'])) { // Verifica a ação do formulário @@ -39,6 +45,7 @@ function mostrar_dados() { + @@ -46,6 +53,48 @@ function mostrar_dados() {
+ + +
@@ -82,6 +131,7 @@ function mostrar_dados() {
+
@@ -114,6 +164,7 @@ function mostrar_dados() {
+
@@ -137,6 +188,7 @@ function mostrar_dados() {
Nome Email CidadeRuaNome Email LatitudeLongitudeCidadeRua Serviço Descrição Data e hora ${dados.nome}${dados.email}${dados.latitude}${dados.longitude}${dados.servico}${descricao}${dataFormatada}${dados.situacao} -
- - -
-
${dados.nome}${dados.email}${dados.latitude}${dados.longitude}${dados.servico}${descricao}${dataFormatada}${dados.situacao} +
+ + +
+
+ diff --git a/lgbtq_connect/includes/admin/style-admin.css b/lgbtq_connect/includes/admin/style-admin.css index c1741336..d4eccbb4 100644 --- a/lgbtq_connect/includes/admin/style-admin.css +++ b/lgbtq_connect/includes/admin/style-admin.css @@ -72,7 +72,12 @@ button[data-id]:hover { text-decoration: underline; } -.linha-destacada { +@keyframes fadeOut { + 0% { background-color: #90cc90;} + 100% { background-color: transparent;} +} + +.linha-destacada td{ animation: fadeOut 2s ease; } @@ -90,15 +95,6 @@ button[data-id]:hover { } -th { - background-color: #f5f5f5; -} - -td { - background-color: white; - text-align: center; -} - #tabela th { background-color: #f5f5f5; text-align: center; @@ -107,6 +103,12 @@ td { /* border-radius: 0px !important; */ } +#tabela td{ + border: none !important; + background-color: white; + text-align: center; +} + #tabela { border: none !important; } @@ -119,6 +121,95 @@ table th:last-child { border-top-right-radius: 20px !important; } +.title{ + font-weight:bold; + font-size: 24px; + margin-bottom:20px; + text-align: center; + color: black; +} + +.blue_button, .button_search, .ver{ + width:100%; + background-color: #2a75f3; + padding:10px; + border:none; + border-radius: 10px; + color:white; + text-align:center; + align-items: center; + font-size: 16px; +} + +.button_search{ + width: 17%; +} + +.ver { + margin: auto; + display : block; + width: 10%; + height: 20px; + justify-content: center; + align-items: center; + border-radius: 5px; + font-size: 0.75rem; + padding: 0px; +} + +#editSalvar, #editCancelar { + width: 17%; + background-color: #2a75f3; + padding:10px; + border:none; + border-radius: 20px; + color:white; + text-align:center; + align-items: center; +} + +#editSalvar { + margin-right: auto; + margin-left: 21px; +} + +#editCancelar { + background-color: #F5F5F5; + color: #707070; + border: solid 2px; + margin-left: auto; + margin-right: 21px; +} + +#editFechar { + float: right; + padding: 0; + border: none; + background: none; +} + +#editNome, #editEmail, #editDescricao, #editServico, #searchInputFormEdit{ + width:97%; + resize:none; + background-color:#F5F5F5; + margin-bottom:10px; + border: 1px solid #D0D0D0; + border-radius:10px; + padding:10px; + font-size: 16px; +} + +#searchInputFormEdit{ + width: 77%; + margin: 0 auto; + padding:10px !important; + margin-left:0px; +} + +.blue_button:hover, .button_search:hover, .ver:hover, #editSalvar{ + background-color: #1266f1; +} + .modal { display: none; position: fixed; @@ -146,11 +237,104 @@ table th:last-child { } +#editPopup { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.4); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; + } + + +#editModal { + position: absolute; + width: 65%; + height: auto; + background-color: white; + z-index: 1001; + border-radius: 15px; /* Adjust the value to your desired roundness */ + box-shadow: 2px 2px 5px #d0d0d0; + padding: 50px; + left: 50%; + transform: translateX(-50%); +} + +#editModal::before { + content: ""; + position: absolute; + top: -3px; /* Adjust based on border width */ + left: -3px; /* Adjust based on border width */ + width: calc(100% + 6px); /* Adjust based on border width */ + height: calc(100% + 6px); /* Adjust based on border width */ + background: linear-gradient(to bottom right, red, hotpink, blue, lime, yellow); + border-radius: 18px; /* Adjust for border radius + border width */ + z-index: -1; /* Ensure the pseudo-element is behind the modal content */ +} + +#editModal::after { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: white; + border-radius: 15px; /* Same as #editModal border-radius */ + z-index: -1; /* Ensure the pseudo-element is behind the modal content but above the gradient border */ + box-sizing: border-box; /* Ensure the padding and border width are considered */ +} + +#listaResultadosEdit{ + background-color: white; + margin-top:10px; + margin-bottom:10px; +} + +#listaResultadosForms, #listaResultadosIndex{ + background-color: white; + margin-top:10px; + margin-bottom:10px; +} + +.celula_resultado{ + background-color: #F5F5F5; + width:97%; + text-align:center; + font-size:16px; + padding:10px; + display:flex; + align-items:center; + justify-content: center; + margin:20px; + border-radius:10px !important; +} + +.celula_resultado:hover{ + background-color: #E6E6E6; +} + +.celula_resultado:active{ + background-color: #ccc; +} + +.search_wrapper{ + background-color: white; + display:flex; + align-items:center; + justify-content:center; +} + #confirmBtn, #cancelBtn { padding: 10px 20px; margin: 10px; cursor: pointer; } + #tabela { border: 1px solid #dee2e6; /* Borda da tabela */ border-collapse: collapse; /* Colapsa as bordas */ @@ -213,3 +397,15 @@ table th:last-child { background: rgb(64,126,0); background: linear-gradient(149deg, rgba(64,126,0,0.9752275910364145) 17%, rgba(60,235,10,0.865983893557423) 65%, rgba(3,153,15,1) 99%); } + + +#editDivBotoes { + width: 100%; + display: flex; + font-size: 16px; +} + +#editLabelNome, #editLabelEmail, #editLabelServico, #editLabelDescricao { + font-size: 18px; +} +