Skip to content

Commit b718001

Browse files
committed
Committed index.html, script.mjs, todos.mjs and todos.test.mjs files
1 parent 96d077b commit b718001

File tree

4 files changed

+72
-9
lines changed

4 files changed

+72
-9
lines changed

Sprint-3/todo-list/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ <h1>My ToDo List</h1>
2020

2121
<ul id="todo-list" class="todo-list">
2222
</ul>
23+
<button id="delete-completed-btn">Delete completed tasks</button>
2324

2425
<!--
2526
This is a template for the To-do list item.

Sprint-3/todo-list/script.mjs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,16 @@ const todos = [];
88
window.addEventListener("load", () => {
99
document.getElementById("add-task-btn").addEventListener("click", addNewTodo);
1010

11+
document
12+
.getElementById("delete-completed-btn")
13+
.addEventListener("click", deleteCompletedTasks);
14+
1115
// Populate sample data
1216
Todos.addTask(todos, "Wash the dishes", false);
1317
Todos.addTask(todos, "Do the shopping", true);
1418

19+
Todos.addTask(todos, "Finish assignment", false, "2026-04-01");
20+
1521
render();
1622
});
1723

@@ -73,4 +79,9 @@ function createListItem(todo, index) {
7379
});
7480

7581
return li;
76-
}
82+
}
83+
84+
function deleteCompletedTasks() {
85+
Todos.deleteCompleted(todos);
86+
render();
87+
}

Sprint-3/todo-list/todos.mjs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
*/
1111

1212
// Append a new task to todos[]
13-
export function addTask(todos, task, completed = false) {
14-
todos.push({ task, completed });
13+
export function addTask(todos, task, completed = false, deadline = null) {
14+
todos.push({ task, completed, deadline });
1515
}
1616

1717
// Delete todos[taskIndex] if it exists
@@ -26,4 +26,14 @@ export function toggleCompletedOnTask(todos, taskIndex) {
2626
if (todos[taskIndex]) {
2727
todos[taskIndex].completed = !todos[taskIndex].completed;
2828
}
29-
}
29+
}
30+
31+
// Remove all completed tasks from the todos array
32+
export function deleteCompleted(todos) {
33+
// Iterate backwards to safely remove items while mutating array
34+
for (let i = todos.length - 1; i >= 0; i--) {
35+
if (todos[i].completed) {
36+
todos.splice(i, 1);
37+
}
38+
}
39+
}

Sprint-3/todo-list/todos.test.mjs

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ import * as Todos from "./todos.mjs";
1010
// Return a mock ToDo List data with exactly 4 elements.
1111
function createMockTodos() {
1212
return [
13-
{ task: "Task 1 description", completed: true },
14-
{ task: "Task 2 description", completed: false },
15-
{ task: "Task 3 description", completed: true },
16-
{ task: "Task 4 description", completed: false },
13+
{ task: "Task 1 description", completed: true, deadline: "2026-04-01" },
14+
{ task: "Task 2 description", completed: false, deadline: null },
15+
{ task: "Task 3 description", completed: true, deadline: "2026-04-05" },
16+
{ task: "Task 4 description", completed: false, deadline: null },
1717
];
1818
}
1919

2020
// A mock task to simulate user input
21-
const theTask = { task: "The Task", completed: false };
21+
const theTask = { task: "The Task", completed: false, deadline: null };
2222

2323
describe("addTask()", () => {
2424
test("Add a task to an empty ToDo list", () => {
@@ -130,3 +130,44 @@ describe("toggleCompletedOnTask()", () => {
130130
});
131131
});
132132

133+
describe("deleteCompleted()", () => {
134+
135+
test("Remove all completed tasks", () => {
136+
const todos = createMockTodos();
137+
138+
Todos.deleteCompleted(todos);
139+
140+
// Only incomplete tasks should remain
141+
expect(todos).toHaveLength(2);
142+
expect(todos[0].completed).toBe(false);
143+
expect(todos[1].completed).toBe(false);
144+
145+
expect(todos[0].task).toBe("Task 2 description");
146+
expect(todos[1].task).toBe("Task 4 description");
147+
});
148+
149+
test("No change if no tasks are completed", () => {
150+
const todos = [
151+
{ task: "Task A", completed: false },
152+
{ task: "Task B", completed: false }
153+
];
154+
155+
const before = JSON.parse(JSON.stringify(todos));
156+
157+
Todos.deleteCompleted(todos);
158+
159+
expect(todos).toEqual(before);
160+
});
161+
162+
test("All tasks removed if all are completed", () => {
163+
const todos = [
164+
{ task: "Task A", completed: true },
165+
{ task: "Task B", completed: true }
166+
];
167+
168+
Todos.deleteCompleted(todos);
169+
170+
expect(todos).toHaveLength(0);
171+
});
172+
173+
});

0 commit comments

Comments
 (0)