-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
151 lines (127 loc) · 4.01 KB
/
script.js
File metadata and controls
151 lines (127 loc) · 4.01 KB
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// Task data structure
let tasks = [];
// DOM elements
const taskInput = document.getElementById("task-input");
const addTaskBtn = document.getElementById("add-task");
const tasksList = document.getElementById("tasks-list");
const completedTasks = document.getElementById("completed-tasks");
const totalTasksSpan = document.getElementById("total-tasks");
const pendingTasksSpan = document.getElementById("pending-tasks");
const completedCountSpan = document.getElementById("completed-count");
// Add task when button is clicked
addTaskBtn.addEventListener("click", addTask);
// Add task when Enter is pressed
taskInput.addEventListener("keypress", function (e) {
if (e.key === "Enter") {
addTask();
}
});
// Add new task
function addTask() {
const taskText = taskInput.value.trim();
if (taskText === "") {
// Add shake animation to input
taskInput.style.animation = "shake 0.5s";
setTimeout(() => {
taskInput.style.animation = "";
}, 500);
return;
}
// Create task object
const task = {
id: Date.now(),
text: taskText,
completed: false,
createdAt: new Date(),
};
// Add to tasks array
tasks.push(task);
// Clear input
taskInput.value = "";
// Render tasks
renderTasks();
}
// Toggle task completion
function toggleTask(id) {
tasks = tasks.map((task) => {
if (task.id === id) {
return { ...task, completed: !task.completed };
}
return task;
});
renderTasks();
}
// Delete task
function deleteTask(id) {
tasks = tasks.filter((task) => task.id !== id);
renderTasks();
}
// Render tasks
function renderTasks() {
// Clear task lists
tasksList.innerHTML = "";
completedTasks.innerHTML = "";
// Filter pending and completed tasks
const pending = tasks.filter((task) => !task.completed);
const completed = tasks.filter((task) => task.completed);
// Render pending tasks
if (pending.length === 0) {
tasksList.innerHTML =
'<div class="empty-state"><i class="fas fa-inbox"></i><p>No active tasks</p></div>';
} else {
pending.forEach((task) => {
const taskElement = createTaskElement(task);
tasksList.appendChild(taskElement);
});
}
// Render completed tasks
if (completed.length === 0) {
completedTasks.innerHTML =
'<div class="empty-state"><i class="fas fa-check"></i><p>No completed tasks yet</p></div>';
} else {
completed.forEach((task) => {
const taskElement = createTaskElement(task);
completedTasks.appendChild(taskElement);
});
}
// Update stats
totalTasksSpan.textContent = tasks.length;
pendingTasksSpan.textContent = pending.length;
completedCountSpan.textContent = completed.length;
}
// Create task element
function createTaskElement(task) {
const taskElement = document.createElement("div");
taskElement.className = "task-item";
if (task.completed) {
taskElement.classList.add("task-completed");
}
taskElement.innerHTML = `
<input type="checkbox" class="task-checkbox" ${
task.completed ? "checked" : ""
}>
<span class="task-text">${task.text}</span>
<button class="delete-btn"><i class="fas fa-trash"></i></button>
`;
// Add event listeners
const checkbox = taskElement.querySelector(".task-checkbox");
checkbox.addEventListener("change", () => toggleTask(task.id));
const deleteBtn = taskElement.querySelector(".delete-btn");
deleteBtn.addEventListener("click", () => deleteTask(task.id));
return taskElement;
}
// Add shake animation for empty input
const style = document.createElement("style");
style.innerHTML = `
@keyframes shake {
0% { transform: translateX(0); }
20% { transform: translateX(-10px); }
40% { transform: translateX(10px); }
60% { transform: translateX(-10px); }
80% { transform: translateX(10px); }
100% { transform: translateX(0); }
}
`;
document.head.appendChild(style);
// Initialize the app
renderTasks();