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

[Dúvida] [Dúvida] Minha Versao do Projeto focus

Projeto no GitHub GitHub Pages

Estava desenvolvendo um projeto que praticasse o conteúdo das minha aulas e com isso eu fiz o notas:

Imagem do site notasA logica do projeto segue a mesma do focus, adiciona uma secao com a informacao que o usuario inserir, envia ao local storage e traz as informacoes de volta quando a tela é carregada. O problema é q na hora de executar o código para editar a msg o código apresentou alguns erros "não altera a local storage e em vez de alterar a nota ele junta o texto antigo com o novo.

A funcao que edita a nota esta na linha 46

    botaoEditar.onclick = () => {
        const attTarefa = prompt('Editando nota:');
        if (attTarefa) {
            elementoDivTarefasConteudoP.textContent = attTarefa
            itemLista.item = attTarefa;
            enviaLista();
        }
    }

Segue o codigo completo:

const botaoEnviar = document.getElementById('enviar');
const PaiLista = document.querySelector('.lista_tarefas');
const textBox = document.querySelector('input');
var conteudoTextBox;

const listaDeElementos = JSON.parse(localStorage.getItem('itens')) || [];

var ano;
var dataAtual;
var dia;
var mes;

function enviaLista() {
    localStorage.setItem('itens', JSON.stringify(listaDeElementos));
}

function criaNota(conteudoTextBox, ano, dia, mes) {
    const elementoItem = document.createElement('elementoItem');
    elementoItem.classList.add('tarefas');

    const elementoDivTarefasTitulo = document.createElement('div');
    elementoDivTarefasTitulo.classList.add('tarefas__titulo');
    elementoItem.append(elementoDivTarefasTitulo);

    const elementoDivTarefasTituloH2 = document.createElement('h2');
    elementoDivTarefasTituloH2.classList.add('tarefas__titulo-titulo');

    elementoDivTarefasTituloH2.innerHTML = `${dia}/${mes}/${ano}`;
    elementoDivTarefasTitulo.append(elementoDivTarefasTituloH2);

    const botaoEditar = document.createElement('button');
    elementoDivTarefasTitulo.append(botaoEditar);
    
    const svg = document.createElement('img');
    svg.setAttribute('src', './assets/imgs/caneta.svg');
    botaoEditar.append(svg);
    
    const elementoDivTarefasConteudo = document.createElement('div');
    elementoDivTarefasConteudo.classList.add('tarefas__conteudo');
    elementoDivTarefasConteudo.textContent = conteudoTextBox;
    elementoItem.append(elementoDivTarefasConteudo);
    
    const elementoDivTarefasConteudoP = document.createElement('p');
    elementoDivTarefasConteudo.append(elementoDivTarefasConteudoP);
    
    botaoEditar.onclick = () => {
        const attTarefa = prompt('Editando nota:');
        if (attTarefa) {
            elementoDivTarefasConteudoP.textContent = attTarefa
            itemLista.item = attTarefa;
            enviaLista();
        }
    }

    return elementoItem;
}

botaoEnviar.addEventListener('click', function () {
    conteudoTextBox = textBox.value;
    if (textBox.value) {
        ano = new Date().getFullYear().toString().slice(-2);
        dataAtual = new Date();
        dia = dataAtual.getDate();
        mes = dataAtual.getMonth() + 1;
        const containerItem = criaNota(conteudoTextBox, ano, dia, mes);
        var itemLista = {
            item: conteudoTextBox,
            ano,
            dia,
            mes
        }
        listaDeElementos.push(itemLista);
        enviaLista()

        if (PaiLista.firstChild) {
            PaiLista.insertBefore(containerItem, PaiLista.firstChild);
        } else {
            PaiLista.appendChild(containerItem);
        }

        textBox.value = '';
    }
});

listaDeElementos.forEach(itemLista => {
    const containerItem = criaNota(itemLista.item, itemLista.ano, itemLista.dia, itemLista.mes);
    if (PaiLista.firstChild) {
        PaiLista.insertBefore(containerItem, PaiLista.firstChild);
    } else {
        PaiLista.appendChild(containerItem);
    }
});
1 resposta
solução!

E aí, João!

Dei uma olhada no código que você mandou e pelo jeito o pepino tá na hora de atualizar a nota editada na lista listaDeElementos, que é o lugar de onde você tá puxando os dados pra guardar no localStorage.

Na parte do código que você colou pra função de edição:

botaoEditar.onclick = () => {
    const attTarefa = prompt('Editando nota:');
    if (attTarefa) {
        elementoDivTarefasConteudoP.textContent = attTarefa
        itemLista.item = attTarefa;
        enviaLista();
    }
}

Tá ligado que você tá atualizando o valor de itemLista.item com o texto novo da nota (attTarefa), mas itemLista não tá apontando pro item certo na lista listaDeElementos. Pra consertar isso, você precisa achar o item certo na lista e dar um update antes de chamar o enviaLista().

Umas dicas de como resolver:

  1. Bota um identificador único pra cada nota, tipo um id, pode ser um índice ou um UUID.
  2. Quando criar o botão de edição, conecta esse id de alguma forma, tipo usando um atributo de dados.
  3. Na função de clique do botão, usa esse id pra achar a nota na lista listaDeElementos e manda ver na atualização.

Ficaria assim:

// Colocando um id único pra cada itemLista (pode ser um UUID ou só o índice)
var itemLista = {
    id: listaDeElementos.length, // Exemplo usando o índice como ID
    item: conteudoTextBox,
    ano,
    dia,
    mes
}

// ...

// Conectando o id ao botãoEditar usando um atributo de dados
botaoEditar.dataset.id = itemLista.id;

// ...

// Na função de clique, usando o id pra encontrar e atualizar a nota certa
botaoEditar.onclick = () => {
    const attTarefa = prompt('Editando nota:');
    if (attTarefa) {
        elementoDivTarefasConteudoP.textContent = attTarefa;
        const idNota = botaoEditar.dataset.id;
        const notaParaEditar = listaDeElementos.find(nota => nota.id.toString() === idNota);
        if (notaParaEditar) {
            notaParaEditar.item = attTarefa;
            enviaLista();
        }
    }
}

Lembra também que, ao recriar as notas do localStorage quando a página carrega, precisa garantir que os ids tão certos pra edição funcionar direitinho.

Falou e bons estudos!