Olá,
Clicando no botao de buscar (AJAX api), adicionamos indefinidamente os dados na tabela (novas linhas).
Qual a melhor maneira impossibilitar a duplicação de dados?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Olá,
Clicando no botao de buscar (AJAX api), adicionamos indefinidamente os dados na tabela (novas linhas).
Qual a melhor maneira impossibilitar a duplicação de dados?
Olá Daniel, tudo bem com você?
Peço desculpas pela demora em lhe responder.
Para adicionarmos a lógica para evitar duplicação dos dados precisaremos de verificar se já existe um paciente com o mesmo nome na tabela. Se já existir, podemos exibir uma mensagem de erro na tela e caso o dado seja único, iremos adicioná-lo à tabela.
Vamos à prática:
Modificaremos a função adicionaPacienteNaTabela presente no arquivo forms.js. Onde, usando o método querySelector selecionamos a tabela por sua tag e usando o método querySelectorAll iremos obter uma lista dos elementos de cada linha dentro da tabela. Em seguida, basta verificar se cada novo paciente já existe na tabela antes de adicioná-lo**, verificando se o nome já está presente em um das células com a classe info-nome da tabela. Conforme apresentado no trecho do código abaixo.
var tabela = document.querySelector('table');
var pacientesExistentes = tabela.querySelectorAll('.info-nome');
var pacienteJaExiste = Array.from(pacientesExistentes).some(function (elemento) {
return elemento.textContent === paciente.nome;
});No código acima estamos usando método some que retorna true se pelo menos um elemento no array satisfaz a condição passada, ou seja, retorna true se o paciente que vamos adicionar já está na tabela. Em seguida, caso o paciente não exista na tabela, basta adicioná-lo a ela. Usando o código abaixo.
// se o paciente não existe na tabela, adicione-o
if (!pacienteJaExiste) {
var pacienteTr = montaTr(paciente);
tabela.querySelector("#tabela-pacientes").appendChild(pacienteTr);
} else {
mostraMensagemDeDuplicacao('Paciente já existe. Confira novamente.');
}Código completo da função adicionaPacienteNaTabela
function adicionaPacienteNaTabela(paciente) {
// verifica se o paciente já existe na tabela
var tabela = document.querySelector('table');
var pacientesExistentes = tabela.querySelectorAll('.info-nome');
var pacienteJaExiste = Array.from(pacientesExistentes).some(function (elemento) {
return elemento.textContent === paciente.nome;
});
// se o paciente não existe na tabela, adicione-o
if (!pacienteJaExiste) {
var pacienteTr = montaTr(paciente);
tabela.querySelector("#tabela-pacientes").appendChild(pacienteTr);
} else {
mostraMensagemDeDuplicacao('Paciente já existe. Confira novamente.');
}
}Para que o usuário receba um alerta visual informando que ocorreu a tentativa de adição de um paciente repetido, podemos criar um alerta que mostra a mensagem: "Paciente já existe. Confira novamente.". Para isso, no arquivo form.js adicione a seguinte função.:
function mostraMensagemDeDuplicacao(mensagem) {
const flashMessage = document.createElement('div');
flashMessage.textContent = mensagem;
flashMessage.style.position = 'fixed';
flashMessage.style.top = '0';
flashMessage.style.width = '100%';
flashMessage.style.padding = '1rem';
flashMessage.style.textAlign = 'center';
flashMessage.style.backgroundColor = '#f44336';
flashMessage.style.color = '#fff';
flashMessage.style.fontWeight = 'bold';
document.body.appendChild(flashMessage);
setTimeout(function () {
flashMessage.parentNode.removeChild(flashMessage);
}, 3000);
}A função acima é responsável por criar um alerta através de uma div e adicionar as propriedades de estilos CSS a ela e além disso, mostrará a mensagem de paciente repetido por 3 segundos na tela.
Após as mudanças realizadas, salve os arquivos. Abra o arquivo index.html no navegador e realize o carregamento dos pacientes e a tentativa de adição de um paciente repetido.

Não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.
Em caso de dúvidas estou à disposição.
Abraços e bons estudos!