Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Tabela retorna altura/peso inválidos (mesmo inserindo paciente com os dados corretos).

Arquivo form.js

let botaoAdicionar = document.querySelector('#adicionar-paciente')
botaoAdicionar.addEventListener('click', function (event) {
    event.preventDefault();

    let form = document.querySelector('#form-adiciona')

    //Extraindo informações do paciente do form
    let paciente = obtemPacienteDoFormulario(form)
    console.log(paciente)

    //Cria a tr e a td do paciente
    let pacienteTr = montaTr(paciente)

    let erros = validaPacientes(paciente)
    console.log(erros)

    if (erros.length > 0) {
        exibeMensagensDeErro(erros)
        return
    }

    //Adicionando o paciente na tabela
    let tabela = document.querySelector('#tabela-pacientes')
    tabela.appendChild(pacienteTr)

    console.log(pacienteTr)
})

function exibeMensagensDeErro(erros) {
    var ul = document.querySelector("#mensagens-erro");
    erros.forEach(function (erro) {
        var li = document.createElement("li");
        li.textContent = erro;
        ul.appendChild(li);
    });
}

function obtemPacienteDoFormulario(form) {

    let paciente = {
        nome: form.nome.value,
        peso: form.peso.value,
        altura: form.altura.value,
        gordura: form.gordura.value,
        imc: calculaImc(form.peso.value, form.altura.value)
    }
    return paciente
}

function montaTr(paciente) {

    let pacienteTr = document.createElement('tr')
    pacienteTr.classList.add('paciente')

    pacienteTr.appendChild(montaTd(paciente.nome, 'info-nome'))
    pacienteTr.appendChild(montaTd(paciente.peso, 'info-peso'))
    pacienteTr.appendChild(montaTd(paciente.altura, 'info-altura'))
    pacienteTr.appendChild(montaTd(paciente.gordura, 'info-gordura'))
    pacienteTr.appendChild(montaTd(paciente.imc, 'info-imc'))

    return pacienteTr
}

function montaTd(dado, classe) {
    let td = document.createElement('td')
    td.textContent = dado
    td.classList.add(classe)

    return td
}

function validaPacientes(paciente) {

    let erros = []

    if (validaPeso(paciente.peso)) erros.push('O peso é inválido!')

    if (validaAltura(paciente.altura)) erros.push('A altura é inválida!')

    return erros
}

Arquivo calcula-imc.js

let titulo = document.querySelector(".titulo")

titulo.textContent = 'Aparecida Nutricionista'

let pacientes = document.querySelectorAll('.paciente')

for (let i = 0; i < pacientes.length; i++) {

    let paciente = pacientes[i]

    let tdPeso = paciente.querySelector('.info-peso')
    let peso = tdPeso.textContent

    let tdAltura = paciente.querySelector('.info-altura')
    let altura = tdAltura.textContent

    let tdImc = paciente.querySelector('.info-imc')

    let pesoEhValido = validaPeso(peso)
    let alturaEhValida = validaAltura(altura)

    if (!pesoEhValido) {
        console.log('Peso inválido')
        pesoEhValido = false
        tdImc.textContent = 'Peso Inválido!'
        paciente.classList.add('paciente-invalido')
    }

    if (!alturaEhValida) {
        console.log('Altura inválida')
        alturaEhValida = false
        tdImc.textContent = 'Altura Inválida!'
        paciente.classList.add('paciente-invalido')
    }

    if (alturaEhValida && pesoEhValido) {
        let imc = calculaImc(peso, altura)
        tdImc.textContent = imc
    }
}

function validaPeso(peso) {
    if (peso >= 0 && peso < 1000) {
        return true
    } else {
        return false
    }
}

function validaAltura(altura) {
    if (altura >= 0 && altura <= 3.0) {
        return true
    } else {
        return false
    }
}

function calculaImc(peso, altura) {
    let imc = 0

    imc = peso / (altura * altura)

    return imc.toFixed(2)
}
1 resposta
solução!

Olá, Lucas, tudo bem?

O problema está na função validaPacientes():

function validaPacientes(paciente) {

    let erros = []

    if (validaPeso(paciente.peso)) erros.push('O peso é inválido!')

    if (validaAltura(paciente.altura)) erros.push('A altura é inválida!')

    return erros
}

Note que você adiciona os erros quando as validações na verdade ocorrem com sucesso! As funções validaPeso() e validaAltura() retornam true quando o peso e a altura são válidas. Logo, você precisa adicionar os erros apenas quando essas funções retornam false! Para isso, vamos usar o operador de negação ! nas condições dos if:

function validaPacientes(paciente) {

    let erros = []

    if (!validaPeso(paciente.peso)) erros.push('O peso é inválido!')  // Adicionado o operador de negação na condição

    if (!validaAltura(paciente.altura)) erros.push('A altura é inválida!')   // Adicionado o operador de negação na condição

    return erros
}

Isso já deve funcionar!

Espero ter ajudado! Se tiver mais dúvidas ou dificuldades, estaremos aqui para te responder. Abraços e bons estudos :)

Caso esta resposta tenha resolvido sua dúvida, por favor, marque como solucionada ✓. Bons Estudos!