Importante

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!

1
resposta

FOKUS Lista de exercicios - Projeto final

Olá segue meu codigo finalizado.

let tarefas = JSON.parse(localStorage.getItem('tarefas')) || []
let tarefaSelecionada = null
let litarefaSelecionada = null
function atualizarTarefas() {
    localStorage.setItem('tarefas', JSON.stringify(tarefas))
}
function criarElementoTarefa(tarefa) {
    const li = document.createElement('li')
    li.classList.add('app__section-task-list-item')

    const svg = document.createElement('svg')
    svg.innerHTML = `

    const paragrafo = document.createElement('p')
    paragrafo.textContent = tarefa.descricao
    paragrafo.classList.add('app__section-task-list-item-description')

    const botao = document.createElement('button')
    botao.classList.add('app_button-edit')

    botao.onclick = () => {
        //debugger
        const novaDescricao = prompt('Qual é o nome da nova tarefa?')
        //console.log('Valor obtido:', novaDescricao);
        
        if (!novaDescricao) {
            alert('Atualização da tarefa cancelada ou ínvalida!');
            return
        }
        paragrafo.textContent = novaDescricao
        tarefa.descricao = novaDescricao
        atualizarTarefas()
        alert('Tarefa atualizada com sucesso!');
    }
    const imagemBotao = document.createElement('img')
    imagemBotao.setAttribute('src', '/imagens/edit.png')
    botao.append(imagemBotao)
    li.append(svg)
    li.append(paragrafo)
    li.append(botao)

    if (tarefa.completa) {
        li.classList.add('app__section-task-list-item-complete')
        botao.setAttribute('disabled', 'disabled')
    } else{
        //Adicionando li ao DOM
        li.onclick = () => {
            // Remove o destaque de todas as tarefas
            document.querySelectorAll('.app__section-task-list-item-active')
                .forEach(elemento => {
                    elemento.classList.remove('app__section-task-list-item-active')
                })
            if (tarefaSelecionada == tarefa) {
                paragrafoDescricaoTarefa.textContent = ''
                tarefaSelecionada = null
                litarefaSelecionada = null
                return
            }
   
            tarefaSelecionada = tarefa
            litarefaSelecionada = li
            paragrafoDescricaoTarefa.textContent = tarefa.descricao
            li.classList.add('app__section-task-list-item-active')
        }
    }
    return li
}
BtnAdicionarTarefa.addEventListener('click', () => {
    formAdicionarTarefa.classList.toggle('hidden')
})
formAdicionarTarefa.addEventListener('submit', (evento) => {
    evento.preventDefault();
    const tarefa = {
        descricao: textArea.value
    }
    tarefas.push(tarefa)
    adicionarTarefaNaTela(tarefa)
    atualizarTarefas()
    limparFormulario()
})
const limparFormulario = () => {
    textArea.value = '';
    formAdicionarTarefa.classList.add('hidden');
}
btCancelar.addEventListener('click', limparFormulario);

tarefas.forEach(tarefa => {
    adicionarTarefaNaTela(tarefa)
});
function adicionarTarefaNaTela(tarefa) {
    const elementoTarefa = criarElementoTarefa(tarefa)
    ulTarefas.append(elementoTarefa)
}
document.addEventListener('FocoFinalizado', () => {
    //console.log('Tarefa de foco finalizada!');
    if (tarefaSelecionada && litarefaSelecionada) {
        litarefaSelecionada.classList.remove('app__section-task-list-item-active')
        litarefaSelecionada.classList.add('app__section-task-list-item-complete')
        litarefaSelecionada.querySelector('button').setAttribute('disabled', 'disabled')
        tarefaSelecionada.completa = true
        atualizarTarefas()
    }
})
const removerTarefas = (somenteCompletas)=> {
    // const seletor = somenteCompletas ? '.app__section-task-list-item-complete' : '.app__section-task-list-item' //(mesma coisa foi feita na linha de baixo)
    let seletor = '.app__section-task-list-item' // criando constante estabelecendo que se não forem completas vao ser removidas todas com essa 1º classe.
    if (somenteCompletas) {
        seletor = '.app__section-task-list-item-complete' // caso as tarefas foram completas somente serão deletadas as tarefas com essa classe.
    }
    document.querySelectorAll (seletor).forEach(elemento =>{ 
        elemento.remove()
    })
    tarefas = somenteCompletas ? tarefas.filter(elemento => !tarefa.completa) : [] //Se completas filtra se não array vazio.
    atualizarTarefas()
}
btnRemoverConcluidas.onclick = () => removerTarefas(true); //Remove somente as tarefas concluidas.
btnRemoverTodas.onclick = () => removerTarefas (false); // remove todas as tarefas.
1 resposta

Fala, Stephanie! Tudo bom?

Agradeço por trazer sua solução para o fórum!

Curti demais como trabalhou a manipulação do DOM para criar elementos dinâmicos em JavaScript, entendeu perfeitamente a importância da persistência com localStorage para manter os dados entre sessões e usou bem a função de atualização para garantir que as tarefas fiquem sincronizadas com o armazenamento.

Algo bem legal para complementar é corrigir o trecho de filtragem dentro da função removerTarefas, garantindo que o filtro utilize o parâmetro correto. Dessa maneira:

tarefas = somenteCompletas 
    ? tarefas.filter(tarefa => !tarefa.completa) 
    : []

Isso faz com que apenas as tarefas não concluídas sejam mantidas quando a opção de remover completas for escolhida.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Modularização: separar funções em arquivos distintos para facilitar manutenção.
  • Feedback visual: adicionar mensagens ou animações ao remover ou concluir tarefas.
  • Acessibilidade: incluir atributos ARIA para melhorar a experiência de usuários com leitores de tela.

Continue postando as suas soluções! Além de ganhar pontos de XP na plataforma, você pode ajudar outros estudantes no fórum.

Ah, uma pergunta: você prefere manter o projeto focado apenas em tarefas ou já pensa em evoluir para incluir funcionalidades como categorias e prazos de entrega?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!