# DOM - ToDo
Aplicaremos lo aprendido en nuestra sección DOM.
# Apoya el Directo 😃
Suscríbete al canal de Youtube
¡GRATIS! 😍 Solo tienes que suscribirte para apoyar el canal, click aquí
CURSO EN UDEMY OFERTA!
Aprende desde cero a trabajar con Vue.js y Firebase aquí: http://curso-vue-js-udemy.bluuweb.cl Nos vemos en clases!
CURSO EN UDEMY OFERTA!
Aprende desde cero a trabajar con React.js y Firebase aquí: http://curso-react-js-udemy.bluuweb.cl Nos vemos en clases!
CURSO EN UDEMY OFERTA!
Aprende desde cero a trabajar con Bootstrap 4! aquí: http://curso-bootstrap-4-udemy.bluuweb.cl Nos vemos en clases!
# Preguntas y Respuestas
# ¿Qué vamos a realizar?
# Requisitos
# Recursos
- Bootstrap
 - CDN Font Awesome
 - icons/check-circle
 - icons/minus-circle
 - icons/undo-alt
 - DOMContentLoaded
 - classList
 - HTMLElement/style
 - text-decoration
 - localStorage
 - JSON/parse
 - JSON/stringify
 - Tutorial LocalStorage bluuweb 🙌
 
# ToDo Object
Utilizaremos una colección de objetos. (también puedes utilizar un array 🐱👤)
// Objeto con index
// Colecciones de datos ordenados por un valor de índice
let todos = {
  1: { nombre: "item 1" },
  2: { nombre: "item 2" },
};
// Recorrer objetos
for (const key in todos) {
  if (todos.hasOwnProperty(key)) {
    const element = todos[key];
    console.log(element);
  }
}
// forEach en objetos
Object.values(todos).forEach((item) => console.log(item));
// Acceder al elemento según su indice
console.log(todos[1]);
// Nos sirve para contar elementos
console.log(Object.keys(todos).length);
# HTML
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>❤ Regalame un Like ❤</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css" integrity="sha512-+4zCK9k+qNFUR5X+cKL9EIR+ZOhtIloNl9GIKS57V1MyNsYpYcUrUeQc9vNfzsWfV28IaLL3i96P9sdNyeRssA==" crossorigin="anonymous" />
</head>
<body>
    <div class="container">
        <h1 class="my-5">ToDo List</h1>
        <form id="formulario">
            <input type="text"
                placeholder="Ingrese tarea"
                class="form-control my-2"
            >
            <button class="btn btn-primary btn-block" type="submit">Agregar</button>
        </form>
        <hr>
        <div id="lista-tareas" class="mt-2">
            <div class="alert alert-dark">
                Sin tareas pendientes 😍
            </div>
        </div>
    </div>
    
    <template id="template">
        <div class="alert alert-warning d-flex justify-content-between align-items-center">
            <p class="m-0">Tarea #1</p>
            <h3 class="m-0">
                <i class="fas fa-check-circle text-success" role="button"></i>
                <i class="fas fa-minus-circle text-danger"  role="button"></i>
            </h3>
        </div>
    </template>
    <script src="app.js"></script>
</body>
</html>
# JS
console.log('Suscríbete al canal y dale me gusta 😍')
const formulario = document.getElementById('formulario')
const listaTareas = document.getElementById('lista-tareas')
const template = document.getElementById('template').content
const fragment = document.createDocumentFragment()
let tareas = {}
document.addEventListener('DOMContentLoaded', () => {
    if (localStorage.getItem('tareas')) {
        tareas = JSON.parse(localStorage.getItem('tareas'))
    }
    pintarTareas()
})
listaTareas.addEventListener('click', (e) => {btnAccion(e)})
formulario.addEventListener('submit', e => {
    e.preventDefault()
    // console.log(e.target[0].value)
    // console.log(e.target.querySelector('input').value)
    setTarea(e)
})
const setTarea = e => {
    const texto = e.target.querySelector('input').value
    
    if (texto.trim() === '') {
        console.log('está vacio')
        return
    }
    const tarea = {
        id: Date.now(),
        texto: texto,
        estado: false
    }
    
    tareas[tarea.id] = tarea
    pintarTareas()
    formulario.reset()
    e.target.querySelector('input').focus()
}
const pintarTareas = () => {
    
    localStorage.setItem('tareas', JSON.stringify(tareas))
    if (Object.values(tareas).length === 0) {
        listaTareas.innerHTML = `
        <div class="alert alert-dark text-center">
        Sin tareas pendientes 😍
        </div>
        `
        return
    }
    
    listaTareas.innerHTML = ''
    Object.values(tareas).forEach(tarea => {
        const clone = template.cloneNode(true)
        clone.querySelector('p').textContent = tarea.texto
        if (tarea.estado) {
            clone.querySelectorAll('.fas')[0].classList.replace('fa-check-circle', 'fa-undo-alt')
            clone.querySelector('.alert').classList.replace('alert-warning', 'alert-primary')
            clone.querySelector('p').style.textDecoration = 'line-through'
        }
        clone.querySelectorAll('.fas')[0].dataset.id = tarea.id
        clone.querySelectorAll('.fas')[1].dataset.id = tarea.id
        fragment.appendChild(clone)
    })
    listaTareas.appendChild(fragment)
}
const btnAccion = e => {
    // console.log(e.target.classList.contains('fa-check-circle'))
    if (e.target.classList.contains('fa-check-circle')) {
        tareas[e.target.dataset.id].estado = true
        pintarTareas()
    }
    if (e.target.classList.contains('fa-minus-circle')) {
        // console.log(e.target.dataset.id)
        delete tareas[e.target.dataset.id]
        pintarTareas()
    }
    if (e.target.classList.contains('fa-undo-alt')) {
        tareas[e.target.dataset.id].estado = false
        pintarTareas()
    }
    e.stopPropagation()
}