MyDayApp es una aplicación para gestionar tareas de forma sencilla, fácil y en donde pondrás a pruebas tus conocimientos en JS.
Live: https://mydayapp-platzi-lab.netlify.app/
- Hacer el fork de este proyecto en tu espacio personal
- Clonar el repositorio desde tu espacio personal en tu computadora
- Instalar dependencias, con el comando
npm install
- Comprobar ambiente de desarrollo, con el comando
npm run dev
- Instalar requerimientos para pruebas e2e, con el comando
npm run e2e:install
- Comprobar que se corran pruebas e2e, con el comando
npm run e2e
El proyecto ya viene con una configuración inicial, la cual ya incluye empaquetado con webpack y una organización sencilla de archivos y carpetas para empezar a incorporar las funcionalidades en JavaScript.
Debes mantener la estructura de carpetas y archivos de la siguiente manera:
├── README.md
├── e2e
│ └── example.spec.js
├── package.json
├── playwright.config.js
├── src
│ ├── css
│ ├── index.html
│ ├── index.js
│ └── js
└── webpack.config.js
Puedes agregar tus propios archivos de JavaScript en la carpeta src/js
en donde podrás crear los archivos que veas necesarios, por ejemplo:
js/
├── utils.js
└── store.js
Sin embargo, recuerda que el archivo de JavaScript principal es src/index.js
en donde podrás importar archivos y estilos usando módulos de ES6+ es decir usando export
e import
.
import "./css/base.css";
import { sayHello } from "./js/utils";
console.log(sayHello("Hello"));
Debes mantener el HTML con el mismo nombre de clases que se está empleando, el cual hace referencia a css/base.css
. El archivo base.css
NO debe editar, si necesitas cambiar los estilos, crea un nuevo archivo de estilos, aunque no es necesario para este ejercicio.
Si cambias el nombre de clases o estructura HTML probablemente las pruebas e2e van a fallar, ya que hace referencia específica a esos elementos con esas clases.
Inicialmente, el archivo src/index.html
tiene un ejemplo de como mostrar las tareas usando varios estilos de acuerdo a los estados:
<ul class="todo-list">
<li class="completed">
<div class="view">
<input class="toggle" type="checkbox" checked />
<label>Learn JavaScript</label>
<button class="destroy"></button>
</div>
<input class="edit" value="Learn JavaScript" />
</li>
<li>
<div class="view">
<input class="toggle" type="checkbox" />
<label>Buy a unicorn</label>
<button class="destroy"></button>
</div>
<input class="edit" value="Buy a unicorn" />
</li>
<li class="editing">
<div class="view">
<input class="toggle" type="checkbox" />
<label>Make dishes</label>
<button class="destroy"></button>
</div>
<input class="edit" value="Make dishes" />
</li>
</ul>
Se verían de la siguiente manera:
Sin embargo esto es solo un ejemplo, si para tu implementación manejas el render desde la logica en JavaScript puedes dejar el elemento ul
en vacio.
<ul class="todo-list"></ul>
- El comando
npm run start
inicia un servidor usandohttp-server
con la carpeta de/dist
que es la carpeta en donde quedan los archivos para producción, recuerda antes de correr este comando asegurarte de corrernpm run build
. - El comando
npm run dev
genera un servidor en modo desarrollo el cual tiene livereload. - El comando
npm run build
corre webpack en modo producción y deja los archivos de producción en la carpeta/dist
. - El comando
npm run e2e
corre las pruebas e2e usando playwright.
El modelo de datos recomendado para una tarea es:
- id: string
- title: string
- completed: boolen
Para crear una aplicación de tareas consistente y útil para los usuarios, la aplicación debe cumplir con la siguiente lista de 9 funcionalidades.
- Cuando no hay tareas, los elementos con ID
#main
y#footer
deberían estar ocultos.
- Se debe crear una nueva tarea se debe usar el input principal de la aplicación.
- Este input debe enfocarse cuando se cargue la página, preferiblemente utilizando el atributo
autofocus
en el input. - Al presionar la tecla Enter la tarea se crea con el estado pending y se agrega a la lista de tareas y el input debería quedar en limpio.
- Asegúrate de usar métodos como
.trim()
para limpiar espacios al inicio o al final y verifica que la tarea no sea unstring
vacío.
Una tarea debería tener 3 posibles interacciones:
- Cuando se haga clic en el checkbox las tareas es marcada como completed, de igual manera si se vuele a hacer clic sobre en el checkbox vuelve a su estado de pending.
- Si se hace doble clic en el
<label>
se activa el modo edición. - Si se hace la acción
:hover
en una tarea se debería mostrar el botón para eliminar (.destroy
).
- Cuando el modo edición está activado, se deberían ocultar los otros elementos y se mostrará un input que contiene el título de la tarea pendiente, que debe estar enfocado (
.focus()
). - La edición debe guardarse cuando se presione la tecla Enter y salir del modo edición.
- Asegúrate de usar métodos como
.trim()
limpiar espacios al inicio o al final. - Si se presiona la tecla Escape durante la edición, se debe salir del modo edición y descartar cualquier cambio.
- En el footer se debería mostrar el número de tareas en estado pending.
- Asegúrese de que el número esté envuelto por una etiqueta
<strong>
. - También asegúrese de pluralizar la palabra
item
correctamente, por ejemplo:0 items
,1 item
,2 items
.
- Debería existir un botón para eliminar todas las tareas que están con estado de completed.
- Cuando se recargue la aplicación se debe obtener las tareas, para esto tu aplicación debería guardar las tareas en LocalStorage.
- El key que se debe usar para el LocalStorage debe ser
mydayapp-js
, esto es importante ya que las pruebas e2e van a verificar el LocalStorage con esta la keymydayapp-js
. - NO es necesario persistir estados de la interfaz como por ejemplo guardar el modo de edición. Solo se debe guardar las tareas.
Deben existir tres filtros que funcione desde la URL y funcionan como links en el footer:
#/all
: Muestra todas las tareas tanto las que están en estado de completed y pending.#/pending
: Muestra todas las tareas en estado pending.#/completed
: Muestra todas las tareas en estado completed.
Desplegar la aplicación en alguno de los siguientes servicios: GitHub Pages, Netlify, Vercel, Firebase Hosting.
Las pruebas e2e corren bajo playwright con el comando npm run e2e
y ya esta incluido como parte de las dependencias del proyecto, sin embargo, antes de correr el comando, asegúrate de correr npm run e2e:install
para instalar los requerimientos de playwright para correr pruebas.
Cuando corras el comando npm run e2e
por primera vez y antes de crear todas las funcionalidades, las pruebas van a fallar y se verán así:
Una vez desarrolles todas las funcionalidades deberías pasar todas las pruebas y se verán así:
Puedes ir corriendo el comando
npm run e2e
de las funcionalidades que vayas creando para ir evaluando que vas por buen camino.
Debes de hacer un "Fork" de este proyecto, revolver los problemas y crear un Pull Request hacia este repositorio.
Este proyecto se lanza bajo la licencia MIT.