-
Notifications
You must be signed in to change notification settings - Fork 0
/
todolist.js
123 lines (104 loc) · 3.01 KB
/
todolist.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
let filterValue = "all";
const todoInput = document.querySelector(".todo-input");
const todoForm = document.querySelector(".todo-form");
const todoList = document.querySelector(".todolist");
const selectFilter = document.querySelector(".filter-todos");
// events
todoForm.addEventListener("submit", addNewTodo);
selectFilter.addEventListener("change", (e) => {
filterValue = e.target.value;
filterTodos();
});
document.addEventListener("DOMContentLoaded", (e) => {
const todos = getAllTodos();
createTodos(todos);
});
function addNewTodo(e) {
e.preventDefault();
if (!todoInput.value) return null;
const newTodo = {
id: Date.now(),
createdAt: new Date().toISOString(),
title: todoInput.value,
isCompleted: false,
};
// todos.push(newTodo);
saveTodo(newTodo);
filterTodos();
}
function createTodos(todos) {
// create todos on DOM
let result = "";
todos.forEach((todo) => {
result += `<li class="todo">
<p class="todo__title ${todo.isCompleted && "completed"}">${
todo.title
}</p>
<span class="todo__createdAt">${new Date(
todo.createdAt
).toLocaleDateString("fa-IR")}</span>
<button class="todo__check" data-todo-id=${
todo.id
} ><i class="far fa-check-square"></i></button>
<button class="todo__remove" data-todo-id=${
todo.id
} ><i class="far fa-trash-alt"></i></button>
</li>`;
});
todoList.innerHTML = result;
todoInput.value = "";
const removeBtns = [...document.querySelectorAll(".todo__remove")];
removeBtns.forEach((btn) => btn.addEventListener("click", removeTodo));
const checkBtns = [...document.querySelectorAll(".todo__check")];
checkBtns.forEach((btn) => btn.addEventListener("click", checkTodo));
}
function filterTodos() {
const todos = getAllTodos();
switch (filterValue) {
case "all": {
createTodos(todos);
break;
}
case "completed": {
const filteredTodos = todos.filter((t) => t.isCompleted);
createTodos(filteredTodos);
break;
}
case "uncompleted": {
const filteredTodos = todos.filter((t) => !t.isCompleted);
createTodos(filteredTodos);
break;
}
default:
createTodos(todos);
}
}
function removeTodo(e) {
let todos = getAllTodos();
const todoId = Number(e.target.dataset.todoId);
todos = todos.filter((t) => t.id !== todoId);
saveAllTodos(todos);
filterTodos();
}
function checkTodo(e) {
const todos = getAllTodos();
const todoId = Number(e.target.dataset.todoId);
const todo = todos.find((t) => t.id === todoId);
todo.isCompleted = !todo.isCompleted;
saveAllTodos(todos);
filterTodos();
}
// localStorage => web API
function getAllTodos() {
const savedTodos = JSON.parse(localStorage.getItem("todos")) || [];
return savedTodos;
}
function saveTodo(todo) {
const savedTodos = getAllTodos();
savedTodos.push(todo);
localStorage.setItem("todos", JSON.stringify(savedTodos));
return savedTodos;
}
function saveAllTodos(todos) {
localStorage.setItem("todos", JSON.stringify(todos));
}