# 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()
}