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

[Projeto] Conclusão do curso

Terminei o curso e inclui umas funções diferentes das usadas pelo Pedro Marins.

A primeira delas foi a função padronizaNome, que tem o intuito de que os nomes dos itens inseridos tenham a mesma formatação. Isso impede que tenham dois itens diferentes, mas com o mesmo nome (camisa preta e CAMISA PRETA, por exemplo).

A segunda foi a função criaId, com o intuito também de padronizar os IDs dos itens. Nesse projeto específico, acredito que não seja necessária a inclusão de IDs, visto que os itens podem ser identificados pelos seus nomes e (talvez) isso não faça diferença. No entanto, em futuros projetos, isso faça mais sentido e foi bom praticar agora. Todos os IDs estariam formatados assim: camisa-preta, saco-de-dormir.

Aqui está a página do Github para quem quiser ver: https://github.com/alberto-palmeira/mochila-de-viagem E aqui a página do projeto funcionando: https://alberto-palmeira.github.io/mochila-de-viagem/

E aqui o código do arquivo main.js. Não vou por do HTML porque não mudei nada em relação ao curso.

// ---------- Funções ----------
function padronizaNome (nome) {
    return nome.value[0].toUpperCase() + nome.value.slice(1).toLowerCase();
};

function criaId (nome) {
    const novoId = nome.replace(/ /g,'-');
    return novoId.toLowerCase();
};

function criaElemento (itemAtual) {
    const novoItem = document.createElement('li');
    novoItem.classList.add('item');

    const quantidadeItem = document.createElement('strong');
    quantidadeItem.innerHTML = itemAtual.quantidade;
    quantidadeItem.dataset.id = itemAtual.id;
    novoItem.appendChild(quantidadeItem);

    novoItem.innerHTML += itemAtual.nome;
    listaItens.appendChild(novoItem);

    novoItem.appendChild(deletaItem(quantidadeItem));
};

function atualizaElemento (itemAtual) {
    let itemAtualizado = document.querySelector(`[data-id='${itemAtual.id}']`);
    console.log(itemAtualizado);
    itemAtualizado.innerHTML = itemAtual.quantidade;
};

function deletaItem () {
    const elementoBotao = document.createElement('button');
    elementoBotao.innerHTML = 'X';

    elementoBotao.addEventListener('click', (evento) => {
        const elementoPai = evento.target.parentNode;
        const elementoIrmao = evento.target.previousElementSibling.dataset.id;
        const indiceElementoIrmao = listaLocalStorage.findIndex(elemento => elemento.id === elementoIrmao);

        if (listaLocalStorage.length === 1){
            listaLocalStorage.length = 0;
        } else if (listaLocalStorage.length > 1) {
            listaLocalStorage.splice(indiceElementoIrmao, 1);
        }

        localStorage.setItem('itens', JSON.stringify(listaLocalStorage));

        elementoPai.classList.add('deletar');
        setTimeout(() => {
            elementoPai.remove();
        }, 500);
    });

    return elementoBotao;
}

// ---------- Lógica ----------
const form = document.querySelector('#novo__item');
const listaItens = document.querySelector('#lista');
const listaLocalStorage =  JSON.parse(localStorage.getItem('itens')) || [];

listaLocalStorage.forEach((elemento) => {
    criaElemento(elemento);
})

form.addEventListener('submit', (evento) => {
    evento.preventDefault();

    let nome = padronizaNome(evento.target.elements['nome']);
    let quantidade = evento.target.elements['quantidade'];

    const existe = listaLocalStorage.find((elemento) => {
        return elemento.nome === nome;
    });

    let itemAtual = {
        'nome': nome,
        'quantidade': quantidade.value
    };

    if (existe) {
        itemAtual.id = existe.id;

        atualizaElemento(itemAtual, existe);
        listaLocalStorage[existe.id] = itemAtual;
    } else {
        itemAtual.id = criaId(nome);

        criaElemento(itemAtual); 
        listaLocalStorage.push(itemAtual);
    };

    localStorage.setItem('itens', JSON.stringify(listaLocalStorage));

    nome.value = "";
    quantidade.value = "";
})

E essa parte do CSS foi somente para criar a animação de fade-out quando apagamos um item:

.deletar {
    opacity: 0;
    transition: 500ms;
}
1 resposta
solução!

Oi José, tudo bem?

Legal que você fez essas funções novas! É uma ótima maneira de praticar e com ideias super boas!

Muito obrigada por compartilhar com a gente o seu projeto! Ficou muito bom, testei suas funcionalidades e tá funcionando certinho, parabéns!

Vai ajudar muitas pessoas, e isso que faz do fórum esse lugar super legal.

Um abraço e bons estudos.