From 7cf1cb346f3b72ddadd8dae4cc5c3380c003c82c Mon Sep 17 00:00:00 2001 From: Laura C Date: Mon, 16 Mar 2026 23:01:09 +0000 Subject: [PATCH 1/8] update page title to alarm clock app --- Sprint-3/alarmclock/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sprint-3/alarmclock/index.html b/Sprint-3/alarmclock/index.html index 48e2e80d9..5de159cd6 100644 --- a/Sprint-3/alarmclock/index.html +++ b/Sprint-3/alarmclock/index.html @@ -4,7 +4,7 @@ - Title here + Alarm Clock app
From 1e78cd6174b4268e42656bb3d35a80e1e9b0c498 Mon Sep 17 00:00:00 2001 From: Laura C Date: Mon, 16 Mar 2026 23:05:44 +0000 Subject: [PATCH 2/8] install jest-environment-jsdom for tests --- package.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 package.json diff --git a/package.json b/package.json new file mode 100644 index 000000000..519cc218c --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "jest-environment-jsdom": "^30.3.0" + } +} From 7376ed6997731f8c5ce22088426c389cb038e8f9 Mon Sep 17 00:00:00 2001 From: Laura C Date: Mon, 16 Mar 2026 23:11:25 +0000 Subject: [PATCH 3/8] implement alarm countdown and timer logic --- Sprint-3/alarmclock/alarmclock.js | 33 ++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 6ca81cd3b..cc46c03ed 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -1,4 +1,35 @@ -function setAlarm() {} +let secondsRemaining = 0; +let timer = null; + +function setAlarm() { + const input = document.getElementById("alarmSet"); + const heading = document.getElementById("timeRemaining"); + + secondsRemaining = Number(input.value); + + updateHeading(heading, secondsRemaining); + + timer = setInterval(() => { + secondsRemaining -= 1; + + updateHeading(heading, secondsRemaining); + + if (secondsRemaining === 0) { + clearInterval(timer); + playAlarm(); + } + }, 1000); +} + +function updateHeading(heading, totalSeconds) { + const minutes = Math.floor(totalSeconds / 60); + const seconds = totalSeconds % 60; + + const formattedMinutes = String(minutes).padStart(2, "0"); + const formattedSeconds = String(seconds).padStart(2, "0"); + + heading.innerText = `Time Remaining: ${formattedMinutes}:${formattedSeconds}`; +} // DO NOT EDIT BELOW HERE From 8dfde180aafe0854061c0e4f6382dfd91928e9b6 Mon Sep 17 00:00:00 2001 From: Laura C Date: Mon, 16 Mar 2026 23:13:13 +0000 Subject: [PATCH 4/8] install testing dependencies for alarm clock tests --- Sprint-3/alarmclock/package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Sprint-3/alarmclock/package.json b/Sprint-3/alarmclock/package.json index e1331e071..92e81d7b7 100644 --- a/Sprint-3/alarmclock/package.json +++ b/Sprint-3/alarmclock/package.json @@ -13,5 +13,8 @@ "bugs": { "url": "https://github.com/CodeYourFuture/CYF-Coursework-Template/issues" }, - "homepage": "https://github.com/CodeYourFuture/CYF-Coursework-Template#readme" + "homepage": "https://github.com/CodeYourFuture/CYF-Coursework-Template#readme", + "devDependencies": { + "@testing-library/jest-dom": "^6.9.1" + } } From 864b51a880a38df1f84e96258b5a1959eb6d59e8 Mon Sep 17 00:00:00 2001 From: Laura C Date: Mon, 16 Mar 2026 23:26:45 +0000 Subject: [PATCH 5/8] remove accidental root package.json file --- package.json | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 package.json diff --git a/package.json b/package.json deleted file mode 100644 index 519cc218c..000000000 --- a/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "devDependencies": { - "jest-environment-jsdom": "^30.3.0" - } -} From fe6dc12f3bbb1d176e290d219dd054e667f2d0ea Mon Sep 17 00:00:00 2001 From: Laura C Date: Tue, 24 Mar 2026 23:26:48 +0000 Subject: [PATCH 6/8] handle invalid input, prevent multiple timers, and improve stop alarm behaviour --- Sprint-3/alarmclock/alarmclock.js | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index cc46c03ed..32661a6f3 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -7,6 +7,17 @@ function setAlarm() { secondsRemaining = Number(input.value); + // Handle invalid values (0 or negative) + if (secondsRemaining <= 0) { + updateHeading(heading, 0); + return; + } + + // Prevent multiple timers running + if (timer !== null) { + clearInterval(timer); + } + updateHeading(heading, secondsRemaining); timer = setInterval(() => { @@ -16,6 +27,7 @@ function setAlarm() { if (secondsRemaining === 0) { clearInterval(timer); + timer = null; playAlarm(); } }, 1000); @@ -49,8 +61,14 @@ function playAlarm() { audio.play(); } +// improvement: stop timer as well as sound function pauseAlarm() { audio.pause(); + + if (timer !== null) { + clearInterval(timer); + timer = null; + } } -window.onload = setup; +window.onload = setup; \ No newline at end of file From 113017ef41f98764b0868e06d5e4e31c988dee92 Mon Sep 17 00:00:00 2001 From: Laura C Date: Thu, 26 Mar 2026 14:17:45 +0000 Subject: [PATCH 7/8] move stop timer logic above protected section --- Sprint-3/alarmclock/alarmclock.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 32661a6f3..d7928eaa3 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -7,15 +7,14 @@ function setAlarm() { secondsRemaining = Number(input.value); - // Handle invalid values (0 or negative) if (secondsRemaining <= 0) { updateHeading(heading, 0); return; } - // Prevent multiple timers running if (timer !== null) { clearInterval(timer); + timer = null; } updateHeading(heading, secondsRemaining); @@ -43,6 +42,17 @@ function updateHeading(heading, totalSeconds) { heading.innerText = `Time Remaining: ${formattedMinutes}:${formattedSeconds}`; } +function stopTimer() { + if (timer !== null) { + clearInterval(timer); + timer = null; + } +} + +window.addEventListener("load", () => { + document.getElementById("stop").addEventListener("click", stopTimer); +}); + // DO NOT EDIT BELOW HERE var audio = new Audio("alarmsound.mp3"); @@ -61,14 +71,8 @@ function playAlarm() { audio.play(); } -// improvement: stop timer as well as sound function pauseAlarm() { audio.pause(); - - if (timer !== null) { - clearInterval(timer); - timer = null; - } } window.onload = setup; \ No newline at end of file From 42174b048df9b8c7f372369e09bfd49ccecd370e Mon Sep 17 00:00:00 2001 From: Laura C Date: Fri, 27 Mar 2026 12:45:20 +0000 Subject: [PATCH 8/8] handle decimal input and improve validation --- Sprint-3/alarmclock/alarmclock.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index d7928eaa3..b6ea392d4 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -5,13 +5,15 @@ function setAlarm() { const input = document.getElementById("alarmSet"); const heading = document.getElementById("timeRemaining"); - secondsRemaining = Number(input.value); + const value = Number(input.value); - if (secondsRemaining <= 0) { + if (!Number.isFinite(value) || value <= 0) { updateHeading(heading, 0); return; } + secondsRemaining = Math.floor(value); + if (timer !== null) { clearInterval(timer); timer = null;