Mini Projeto: Gerenciador de Tarefas Inteligente.🌴 TRILHA JavaScript 🚀 Etapa14

   Seja muito bem-vindo à Academy Code Christ!


🌍 Academy Code Christ está disponível em vários idiomas.
Fique à vontade para usar o tradutor na Barra lateral (Sidebar) 
e aprender no seu idioma.

📚 Continue sua jornada de aprendizado



A Academy Code Christ oferece trilhas de aprendizado em diferentes tecnologias. Explore os cursos, acompanhe as aulas e avance em sua jornada de conhecimento.  


📋 Menus correspondentes:



💻 Pratique o que você aprende

Para facilitar seu aprendizado, utilize o Code Editor da Mr Digitals, um editor online que permite escrever códigos em HTML, CSS e JavaScript e visualizar os resultados diretamente no navegador.


🚀 Etapa 14 

 O que você vai aprender nesta aula?

📘 PROJETO  Gerenciador de Tarefas Inteligente


🧱 Estrutura HTML


Criaremos a base no HTML — simples, sem dependências externas.

<!DOCTYPE html>

<html lang="pt-BR">

<head>

<meta charset="UTF-8">

<title>Gerenciador de Tarefas Inteligente</title>

<style>

  body {

    font-family: Arial, sans-serif;

    background-color: #f5f5f5;

    color: #333;

    margin: 0;

    padding: 20px;

    transition: 0.3s ease;

  }

 

  header {

    display: flex;

    justify-content: space-between;

    align-items: center;

    margin-bottom: 20px;

  }

 

  .dark {

    background: #121212;

    color: #f1f1f1;

  }

 

  h1 {

    font-size: 24px;

  }

 

  input, button, select {

    padding: 8px;

    margin: 5px 0;

    border: 1px solid #ccc;

    border-radius: 5px;

  }

 

  button {

    background: #0077ff;

    color: white;

    cursor: pointer;

  }

 

  button:hover {

    background: #005fd4;

  }

 

  ul {

    list-style: none;

    padding: 0;

  }

 

  li {

    padding: 10px;

    margin-bottom: 5px;

    background: #eaeaea;

    border-radius: 5px;

    display: flex;

    justify-content: space-between;

    align-items: center;

    transition: background 0.5s;

  }

 

  li.completa {

    text-decoration: line-through;

    background-color: #b6f2b6;

  }

 

  .fadein {

    animation: fadein 1s;

  }

 

  @keyframes fadein {

    from {opacity: 0;}

    to {opacity: 1;}

  }

 

  .filtros {

    margin-top: 15px;

  }

 

  .notificacao {

    background-color: #0077ff;

    color: white;

    padding: 10px;

    position: fixed;

    bottom: 30px;

    right: 30px;

    border-radius: 5px;

    display: none;

  }

</style>

</head>

<body>

 

<header>

  <h1>🧠 Lista de Tarefas Inteligente</h1>

  <button id="toggleTema">🌙 Tema</button>

</header>

 

<section>

  <input id="novaTarefa" placeholder="Digite uma nova tarefa">

  <button id="adicionar">Adicionar</button>

 

  <div class="filtros">

    <label>Filtrar:</label>

    <select id="filtro">

      <option value="todas">Todas</option>

      <option value="pendentes">Pendentes</option>

      <option value="completas">Completas</option>

    </select>

  </div>

 

  <ul id="listaTarefas"></ul>

</section>

 

<div id="notificacao" class="notificacao"></div>

 

<script src="app.js"></script>

</body>

</html>

 


⚙️ Script JavaScript (app.js)


A seguir, todo o coração lógico do aplicativo.

// ==========================

// INICIALIZAÇÃO

// ==========================

const input = document.getElementById("novaTarefa");

const btnAdicionar = document.getElementById("adicionar");

const lista = document.getElementById("listaTarefas");

const filtro = document.getElementById("filtro");

const botaoTema = document.getElementById("toggleTema");

const notificacao = document.getElementById("notificacao");

 

let tarefas = JSON.parse(localStorage.getItem("tarefas")) || [];

let darkMode = localStorage.getItem("tema") === "dark";

 

// ==========================

// FUNÇÕES DE AJUDA

// ==========================

 

function salvarLocal() {

  localStorage.setItem("tarefas", JSON.stringify(tarefas));

}

 

function mostrarNotificacao(msg) {

  notificacao.textContent = msg;

  notificacao.style.display = "block";

  setTimeout(() => notificacao.style.display = "none", 2500);

}

 

function carregarTema() {

  if (darkMode) document.body.classList.add("dark");

}

 

carregarTema();

 

// ==========================

// FUNÇÕES PRINCIPAIS

// ==========================

 

function exibirTarefas(filtroSelecionado = "todas") {

  lista.innerHTML = "";

 

  let tarefasFiltradas = tarefas.filter(t => {

    if (filtroSelecionado === "pendentes") return !t.completa;

    if (filtroSelecionado === "completas") return t.completa;

    return true;

  });

 

  tarefasFiltradas.forEach((tarefa, indice) => {

    const li = document.createElement("li");

    li.classList.add("fadein");

    if (tarefa.completa) li.classList.add("completa");

 

    li.innerHTML = `

      <span>${tarefa.texto}</span>

      <div>

        <button class="concluir">✔️</button>

        <button class="excluir">❌</button>

      </div>

    `;

 

    // EVENTOS DE INTERAÇÃO

    li.querySelector(".concluir").addEventListener("click", () => {

      tarefas[indice].completa = !tarefas[indice].completa;

      salvarLocal();

      exibirTarefas(filtro.value);

    });

 

    li.querySelector(".excluir").addEventListener("click", () => {

      tarefas.splice(indice, 1);

      salvarLocal();

      exibirTarefas(filtro.value);

      mostrarNotificacao("Tarefa excluída 🗑️");

    });

 

    lista.appendChild(li);

  });

}

 

// ==========================

// EVENTOS

// ==========================

 

// Adicionar tarefa

btnAdicionar.addEventListener("click", async () => {

  let texto = input.value.trim();

  if (!texto) return mostrarNotificacao("Digite uma tarefa primeiro!");

 

  // Simula carregamento antes de adicionar — async/await

  await new Promise(resolve => setTimeout(resolve, 500));

 

  tarefas.push({ texto, completa: false });

  salvarLocal();

  input.value = "";

  exibirTarefas(filtro.value);

  mostrarNotificacao("Tarefa adicionada ✅");

});

 

// Filtrar tarefas

filtro.addEventListener("change", e => exibirTarefas(e.target.value));

 

// Alternar Tema

botaoTema.addEventListener("click", () => {

  document.body.classList.toggle("dark");

  darkMode = document.body.classList.contains("dark");

  localStorage.setItem("tema", darkMode ? "dark" : "light");

});

 

// ==========================

// INÍCIO

// ==========================

(async function iniciar() {

  console.log("Iniciando app...");

  await new Promise(resolve => setTimeout(resolve, 1000));

  console.log("Carregamento concluído ✅");

  exibirTarefas();

})();

 


⚡ Recursos Aplicados no Projeto


Recurso

Onde foi usado

Variáveis e Constantes

Controle de estado e DOM

Funções

Organização modular

Eventos

Botões e interações do usuário

DOM

Criação e atualização da lista

LocalStorage

Armazenar tarefas e tema

Condicionais (if/else)

Validação e filtros

Loops

Percorrer lista de tarefas

setTimeout / async/await

Notificações e simulação de carregamento

Temas (classList.toggle)

Alternância claro/escuro

CSS Animations

Efeito suave na renderização

JSON

Conversão de dados


🧮 Funcionamento Resumido


●     Cada tarefa tem:
 { texto: "Estudar JavaScript", completa: false }

●     São salvas automaticamente no LocalStorage;

●     A exibição é filtrada pelo <select> com três modos;

●     O botão ✔️ marca/desmarca conclusão;

●     O botão ❌ remove;

●     O botão 🌙 alterna tema e guarda a escolha;

●     Uma notificação automática aparece em cada ação;

●     Um pequeno delay com async/await simula ações de servidor (realismo).


🎨 Expansões Sugeridas


Quer levar esse app ainda mais longe?
 Tente implementar:

●     Edição do nome de uma tarefa;

●     Ordenação de tarefas concluídas no fim da lista;

●     Ligação com uma API real (ex: salvar online com fetch());

●     Notificações “desktop” (usando Notification API).


🎓 Conclusão Final


Parabéns! 🎉


 Você acaba de construir um aplicativo completo em JavaScript, combinando lógica, interface, armazenamento, interatividade, tempo e assincronismo —
 tudo o que um desenvolvedor real usa no dia a dia.

Você:

●     Aprendeu fundamentos sólidos da linguagem,

●     Entendeu a lógica por trás da programação moderna,

●     E aplicou conceitos práticos de maneira profissional.

💡 Agora seu próximo passo natural é:
 👉 mergulhar em HTML + CSS avançado e, em seguida, frameworks como React, Vue ou Node.js, onde tudo o que você aprendeu aqui continuará sendo usado.


✨ Missão cumprida!

 Deseja que eu te monte agora um segundo projeto final (exemplo: “App de Clima com API e Async/Await”) para treinar consumo de API real?



📚 Continue aprendendo JavaScript:





🚀 Etapa 05 👉 Estruturas Condicionais

🚀 Etapa 06 👉 Laços de Repetição

🚀 Etapa 07 👉 Funções

🚀 Etapa 08 👉 Eventos

🚀 Etapa 09 👉 O DOM





🚀 Etapa 14 👉 Você está nessa Etapa


Este conteúdo faz parte do Academy Code Christ. 

Um projeto criado para ajudar jovens e iniciantes a aprender programação do zero, de forma simples e gratuita.

Nossa missão é compartilhar conhecimento e incentivar mais pessoas a descobrir que também podem aprender tecnologia, criar projetos e desenvolver novas habilidades.
Todo o conteúdo é disponibilizado gratuitamente, de forma clara, prática e 
sem enrolação. 

Você pode apoiar o projeto se quiser 
com um café. 


Post a Comment

Postagem Anterior Próxima Postagem