-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
109 lines (89 loc) · 2.62 KB
/
script.js
File metadata and controls
109 lines (89 loc) · 2.62 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
const taskInput = document.getElementById('taskInput');
const addBtn = document.getElementById('addBtn');
const todoList = document.getElementById('todoList');
const totalTasksEl = document.getElementById('totalTasks');
const completedTasksEl = document.getElementById('completedTasks');
// Load tasks from localStorage
let tasks = JSON.parse(localStorage.getItem('tasks')) || [];
// Render all tasks
function renderTasks() {
todoList.innerHTML = '';
if (tasks.length === 0) {
todoList.innerHTML = `
<div class="empty-state">
<p>🎯 No tasks yet</p>
<p>Add a new task to get started!</p>
</div>`;
updateStats();
return;
}
tasks.forEach((task, index) => {
const item = document.createElement('div');
item.className = `todo-item ${task.completed ? 'completed' : ''}`;
item.innerHTML = `
<input type="checkbox" ${task.completed ? 'checked' : ''} />
<span class="todo-text">${task.text}</span>
<button class="delete-btn">×</button>
`;
// Checkbox toggle
const checkbox = item.querySelector('input[type="checkbox"]');
checkbox.addEventListener('change', () => {
tasks[index].completed = checkbox.checked;
saveTasks();
renderTasks();
});
// Delete button
const deleteBtn = item.querySelector('.delete-btn');
deleteBtn.addEventListener('click', () => {
tasks.splice(index, 1);
saveTasks();
renderTasks();
});
todoList.appendChild(item);
});
updateStats();
}
// Save tasks to localStorage
function saveTasks() {
localStorage.setItem('tasks', JSON.stringify(tasks));
}
// Update statistics
function updateStats() {
const total = tasks.length;
const completed = tasks.filter(task => task.completed).length;
totalTasksEl.textContent = `${total} task${total !== 1 ? 's' : ''}`;
completedTasksEl.textContent = `${completed} completed`;
}
// Add new task
function addTask() {
const text = taskInput.value.trim();
if (text === '') return;
tasks.unshift({
text: text,
completed: false,
date: new Date().toISOString()
});
saveTasks();
renderTasks();
taskInput.value = '';
taskInput.focus();
}
// Event Listeners
addBtn.addEventListener('click', addTask);
taskInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter') {
addTask();
}
});
// Bonus: Ctrl + Delete to clear all completed tasks
document.addEventListener('keydown', (e) => {
if (e.key === 'Delete' && e.ctrlKey) {
if (confirm('Clear all completed tasks?')) {
tasks = tasks.filter(task => !task.completed);
saveTasks();
renderTasks();
}
}
});
// Initial render
renderTasks();