From 659c721cac6c72337dfefe74e109152b9386147a Mon Sep 17 00:00:00 2001 From: ChamalJulanJS <0168julajs@gmail.com> Date: Fri, 19 Jun 2026 22:20:08 +0530 Subject: [PATCH 01/12] fix: connect launch check submit handler --- js/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/app.js b/js/app.js index 5dc8d87..ccb58a5 100644 --- a/js/app.js +++ b/js/app.js @@ -91,7 +91,7 @@ const activityLog = document.getElementById("activityLog"); let checks = loadChecks(); let currentView = checks; -form.addEventListener("submit", (event) => handleAddChek(event)); // Intentional bug: misspelled function name. +form.addEventListener("submit", (event) => handleAddCheck(event)); // Intentional bug: misspelled function name. searchInput.addEventListener("input", applyFilters); statusFilter.addEventListener("change", applyFilters); priorityFilter.addEventListener("change", applyFilters); From cb5e55603d5f615f0a15fae86d9f1b8dc1d195d1 Mon Sep 17 00:00:00 2001 From: ChamalJulanJS <0168julajs@gmail.com> Date: Fri, 19 Jun 2026 22:20:24 +0530 Subject: [PATCH 02/12] fix: require title and category before adding checks --- js/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/app.js b/js/app.js index ccb58a5..991345e 100644 --- a/js/app.js +++ b/js/app.js @@ -132,7 +132,7 @@ function handleAddCheck(event) { const owner = ownerInput.value.trim() || "Unassigned"; const dueDate = dueDateInput.value || new Date().toISOString().slice(0, 10); - if (!title && !category) { + if (!title || !category) { // Intentional bug: validation should stop when either required field is missing. formMessage.textContent = "Please enter a check title and choose a category."; From 89a624bd6a7c13f40c8f85ecf19194b6f7f805c5 Mon Sep 17 00:00:00 2001 From: ChamalJulanJS <0168julajs@gmail.com> Date: Fri, 19 Jun 2026 22:20:41 +0530 Subject: [PATCH 03/12] fix: search across launch check fields --- js/app.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/js/app.js b/js/app.js index 991345e..529ba3d 100644 --- a/js/app.js +++ b/js/app.js @@ -164,7 +164,11 @@ function applyFilters() { const selectedPriority = priorityFilter.value; let filtered = checks.filter((check) => - check.owner.toLowerCase().includes(searchTerm), + check.title.toLowerCase().includes(searchTerm) || + check.category.toLowerCase().includes(searchTerm) || + check.priority.toLowerCase().includes(searchTerm) || + check.status.toLowerCase().includes(searchTerm) || + check.owner.toLowerCase().includes(searchTerm) ); // Intentional bug: search should include title, category, priority, status, and owner. if (selectedStatus !== "All") { From a6b39a1d70125450bfc3a29d10b05a12b8d7f2cd Mon Sep 17 00:00:00 2001 From: ChamalJulanJS <0168julajs@gmail.com> Date: Fri, 19 Jun 2026 22:21:00 +0530 Subject: [PATCH 04/12] fix: filter checklist by status --- js/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/app.js b/js/app.js index 529ba3d..46cb80e 100644 --- a/js/app.js +++ b/js/app.js @@ -172,7 +172,7 @@ function applyFilters() { ); // Intentional bug: search should include title, category, priority, status, and owner. if (selectedStatus !== "All") { - filtered = filtered.filter((check) => check.priority === selectedStatus); + filtered = filtered.filter((check) => check.status === selectedStatus); } // Intentional bug: status filter compares against priority. if (selectedPriority !== "All") { From 8deb9b02ae86f91b29fb8de04ef6d88166795b65 Mon Sep 17 00:00:00 2001 From: ChamalJulanJS <0168julajs@gmail.com> Date: Fri, 19 Jun 2026 22:21:30 +0530 Subject: [PATCH 05/12] fix: slug status badge class names --- js/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/app.js b/js/app.js index 46cb80e..3a56801 100644 --- a/js/app.js +++ b/js/app.js @@ -195,7 +195,7 @@ function renderRows(list) { const rows = list.map((check) => { const priorityClass = `priority-${check.priority.toLowerCase()}`; - const statusClass = `status-${check.status.toLowerCase()}`; // Intentional bug: "In Progress" needs a slug class. + const statusClass = `status-${check.status.toLowerCase().replaceAll(" ", "-")}`; // Intentional bug: "In Progress" needs a slug class. return ` From 343074c50b8661dd9d1aa0b09546e23bd7399cc3 Mon Sep 17 00:00:00 2001 From: ChamalJulanJS <0168julajs@gmail.com> Date: Fri, 19 Jun 2026 22:21:49 +0530 Subject: [PATCH 06/12] fix: calculate readiness from fixed checks --- js/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/app.js b/js/app.js index 3a56801..c818261 100644 --- a/js/app.js +++ b/js/app.js @@ -235,7 +235,7 @@ function renderRows(list) { function updateMetrics() { const total = checks.length; - const fixed = checks.filter((check) => check.status === "Complete").length; // Intentional bug: valid fixed status is "Fixed". + const fixed = checks.filter((check) => check.status === "Fixed").length; // Intentional bug: valid fixed status is "Fixed". const criticalOpen = checks.filter( (check) => check.priority === "Critical" && check.status !== "Fixed", ).length; From 453e8960c51f7163fce01ee601f8ee03932a071e Mon Sep 17 00:00:00 2001 From: ChamalJulanJS <0168julajs@gmail.com> Date: Fri, 19 Jun 2026 22:22:07 +0530 Subject: [PATCH 07/12] fix: count checks due within seven days --- js/app.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/js/app.js b/js/app.js index c818261..f63d296 100644 --- a/js/app.js +++ b/js/app.js @@ -239,7 +239,10 @@ function updateMetrics() { const criticalOpen = checks.filter( (check) => check.priority === "Critical" && check.status !== "Fixed", ).length; - const dueSoon = checks.filter((check) => daysUntil(check.dueDate) > 7).length; // Intentional bug: this should count items due within 7 days. + const dueSoon = checks.filter((check) => { + const days = daysUntil(check.dueDate); + return days >= 0 && days <= 7; + }).length; // Intentional bug: this should count items due within 7 days. const score = total === 0 ? 0 : Math.round((fixed / total) * 100); totalCount.textContent = total; From 0dd2b4e80f2858f56ddcd72a3f655f03bf5614af Mon Sep 17 00:00:00 2001 From: ChamalJulanJS <0168julajs@gmail.com> Date: Fri, 19 Jun 2026 22:22:23 +0530 Subject: [PATCH 08/12] fix: wire delete action to row button --- js/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/app.js b/js/app.js index f63d296..307fc06 100644 --- a/js/app.js +++ b/js/app.js @@ -254,13 +254,13 @@ function updateMetrics() { } function handleTableClick(event) { - const deleteButton = event.target.closest("[data-delete-id]"); // Intentional bug: button uses data-remove-id. + const deleteButton = event.target.closest("[data-remove-id]"); // Intentional bug: button uses data-remove-id. if (!deleteButton) { return; } - const id = Number(deleteButton.dataset.deleteId); + const id = Number(deleteButton.dataset.removeId); const removed = checks.find((check) => check.id === id); checks = checks.filter((check) => check.id !== id); saveChecks(); From efdef8b3f866426d0384053ba5e6003c173aa479 Mon Sep 17 00:00:00 2001 From: ChamalJulanJS <0168julajs@gmail.com> Date: Fri, 19 Jun 2026 22:22:42 +0530 Subject: [PATCH 09/12] fix: persist status changes and refresh metrics --- js/app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/app.js b/js/app.js index 307fc06..3a42018 100644 --- a/js/app.js +++ b/js/app.js @@ -283,7 +283,8 @@ function handleStatusChange(event) { } check.status = statusSelect.value; - renderRows(currentView); + saveChecks(); + applyFilters(); logActivity(`Changed "${check.title}" to ${check.status}.`); // Intentional bug: status changes should save, update filters, and refresh metrics. } From 6d65424e738f2c667cf545ca0fdec2966711dc28 Mon Sep 17 00:00:00 2001 From: ChamalJulanJS <0168julajs@gmail.com> Date: Fri, 19 Jun 2026 22:23:01 +0530 Subject: [PATCH 10/12] fix: use one local storage key --- js/app.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/js/app.js b/js/app.js index 3a42018..011215c 100644 --- a/js/app.js +++ b/js/app.js @@ -1,5 +1,4 @@ -const STORAGE_SAVE_KEY = "launchdesk-v1-items"; -const STORAGE_LOAD_KEY = "launchdesk-items-v1"; // Intentional bug: this key should match STORAGE_SAVE_KEY. +const STORAGE_KEY = "launchdesk-v1-items"; const demoChecks = [ { @@ -104,7 +103,7 @@ renderApp(); logActivity("Demo data loaded. Start by testing the checklist workflows."); function loadChecks() { - const saved = localStorage.getItem(STORAGE_LOAD_KEY); + const saved = localStorage.getItem(STORAGE_KEY); if (!saved) { return [...demoChecks]; @@ -119,7 +118,7 @@ function loadChecks() { } function saveChecks() { - localStorage.setItem(STORAGE_SAVE_KEY, JSON.stringify(checks)); + localStorage.setItem(STORAGE_KEY, JSON.stringify(checks)); } function handleAddCheck(event) { From f3c86773ba158bd7f6373366414e991bb2a4849b Mon Sep 17 00:00:00 2001 From: ChamalJulanJS <0168julajs@gmail.com> Date: Fri, 19 Jun 2026 22:24:35 +0530 Subject: [PATCH 11/12] fix: load demo checks from correct json file --- js/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/app.js b/js/app.js index 011215c..3ddc56c 100644 --- a/js/app.js +++ b/js/app.js @@ -292,7 +292,7 @@ async function resetDemoData() { formMessage.textContent = ""; try { - const response = await fetch("data/launch-seed.json"); // Intentional bug: real file is data/launch-checks.json. + const response = await fetch("data/launch-checks.json"); // Intentional bug: real file is data/launch-checks.json. if (!response.ok) { throw new Error(`Demo data request failed with ${response.status}`); From 98e4642a48f9027ce4e509ff50b73b4194018c6d Mon Sep 17 00:00:00 2001 From: ChamalJulanJS <0168julajs@gmail.com> Date: Fri, 19 Jun 2026 22:25:10 +0530 Subject: [PATCH 12/12] fix: export launch check titles --- js/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/app.js b/js/app.js index 3ddc56c..4adaaf8 100644 --- a/js/app.js +++ b/js/app.js @@ -319,7 +319,7 @@ function exportCsv() { "Due Date", ]; const rows = currentView.map((check) => [ - check.name, // Intentional bug: property should be check.title. + check.title, // Intentional bug: property should be check.title. check.category, check.priority, check.status,