From 34238c43f10e27c3e7637f2af98d5e1812dff83c Mon Sep 17 00:00:00 2001 From: Tomislav Dukez Date: Mon, 27 Jul 2026 11:42:29 +0100 Subject: [PATCH 01/10] add app title to html --- Sprint-3/alarmclock/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sprint-3/alarmclock/index.html b/Sprint-3/alarmclock/index.html index 48e2e80d9..66748001e 100644 --- a/Sprint-3/alarmclock/index.html +++ b/Sprint-3/alarmclock/index.html @@ -1,10 +1,10 @@ - + - Title here + Alarm clock app
From 314d996926d0f283d7e5ce7c5c1324da25e71df6 Mon Sep 17 00:00:00 2001 From: Tomislav Dukez Date: Mon, 27 Jul 2026 12:27:24 +0100 Subject: [PATCH 02/10] add update heading and seconds/time calculation --- Sprint-3/alarmclock/alarmclock.js | 32 ++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 6ca81cd3b..7dbd36ded 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -1,5 +1,35 @@ -function setAlarm() {} +let countDown = null; +let secondsTillEnd = 0; +function setAlarm() { + // TODO: Get input from user + const input = document.getElementById("alarmSet").value; + const seconds = parseInt(input); + // TODO: Validate input + if (isNaN(seconds) || seconds < 0) { + alert("Please enter a valid number of seconds"); + return; + } + // TODO: Clear any existing countdown + if (countDown) { + clearInterval(countDown); + } + secondsTillEnd = seconds; + + // Update heading + updateHeading(secondsTillEnd); + + // TODO: Start countdown + // TODO: Play alarm if end reached +} + +function updateHeading(timeInSeconds) { + const minutes = Math.floor(timeInSeconds / 60); + const seconds = timeInSeconds % 60; + const formattedTime = `Time Remaining: ${minutes}:${timeInSeconds.toString().padStart(2, "0")}`; + document.getElementById("timeRemaining").innerText = formattedTime; + return; +} // DO NOT EDIT BELOW HERE var audio = new Audio("alarmsound.mp3"); From 305f66af94b72d33ac92f47eabdb8433f1a8e22f Mon Sep 17 00:00:00 2001 From: Tomislav Dukez Date: Mon, 27 Jul 2026 12:40:57 +0100 Subject: [PATCH 03/10] add countdown function and display fix --- Sprint-3/alarmclock/alarmclock.js | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 7dbd36ded..27ed8385a 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -1,32 +1,44 @@ -let countDown = null; +let countDownId = null; let secondsTillEnd = 0; + function setAlarm() { - // TODO: Get input from user + // Get input from user const input = document.getElementById("alarmSet").value; const seconds = parseInt(input); - // TODO: Validate input + // Validate input if (isNaN(seconds) || seconds < 0) { alert("Please enter a valid number of seconds"); return; } - // TODO: Clear any existing countdown - if (countDown) { - clearInterval(countDown); + // Clear any existing countdown + if (countDownId) { + clearInterval(countDownId); } secondsTillEnd = seconds; // Update heading updateHeading(secondsTillEnd); - // TODO: Start countdown - // TODO: Play alarm if end reached + // Start countdown + countDownId = setInterval(() => { + secondsTillEnd--; + + // Play alarm if end reached + if (secondsTillEnd <= 0) { + clearInterval(countDownId); + updateHeading(0); + playAlarm(); + } else { + updateHeading(secondsTillEnd); + } + }, 1000); } function updateHeading(timeInSeconds) { const minutes = Math.floor(timeInSeconds / 60); const seconds = timeInSeconds % 60; - const formattedTime = `Time Remaining: ${minutes}:${timeInSeconds.toString().padStart(2, "0")}`; + const formattedTime = `Time Remaining: ${minutes}:${seconds.toString().padStart(2, "0")}`; document.getElementById("timeRemaining").innerText = formattedTime; return; } From 426aedfbb042b4a13068eb1b90643cd6d5ee05b7 Mon Sep 17 00:00:00 2001 From: Tomislav Dukez Date: Mon, 27 Jul 2026 12:42:34 +0100 Subject: [PATCH 04/10] fix padding for minutes --- Sprint-3/alarmclock/alarmclock.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 27ed8385a..f2f8bc063 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -38,7 +38,7 @@ function setAlarm() { function updateHeading(timeInSeconds) { const minutes = Math.floor(timeInSeconds / 60); const seconds = timeInSeconds % 60; - const formattedTime = `Time Remaining: ${minutes}:${seconds.toString().padStart(2, "0")}`; + const formattedTime = `Time Remaining: ${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`; document.getElementById("timeRemaining").innerText = formattedTime; return; } From 74a7e946212737ae2ce94c68ce601d4ba506d1e4 Mon Sep 17 00:00:00 2001 From: Tomislav Dukez Date: Mon, 27 Jul 2026 13:07:14 +0100 Subject: [PATCH 05/10] add flash class to css --- Sprint-3/alarmclock/style.css | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Sprint-3/alarmclock/style.css b/Sprint-3/alarmclock/style.css index 0c72de38b..baa72f2f4 100644 --- a/Sprint-3/alarmclock/style.css +++ b/Sprint-3/alarmclock/style.css @@ -13,3 +13,19 @@ h1 { text-align: center; } + +.flash { + padding: 30px; + animation: blink 400ms infinite; +} + +@keyframes blink { + 0%, + 49.9% { + background: white; + } + 50%, + 99.9% { + background: red; + } +} From 8e6130b451e921ac39b6f8936a5b19b1439ab9a2 Mon Sep 17 00:00:00 2001 From: Tomislav Dukez Date: Mon, 27 Jul 2026 13:07:25 +0100 Subject: [PATCH 06/10] add flash background function --- Sprint-3/alarmclock/alarmclock.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index f2f8bc063..32ee3abaf 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -15,6 +15,7 @@ function setAlarm() { if (countDownId) { clearInterval(countDownId); } + flashAlarm("off"); secondsTillEnd = seconds; // Update heading @@ -29,6 +30,7 @@ function setAlarm() { clearInterval(countDownId); updateHeading(0); playAlarm(); + flashAlarm(); } else { updateHeading(secondsTillEnd); } @@ -42,7 +44,16 @@ function updateHeading(timeInSeconds) { document.getElementById("timeRemaining").innerText = formattedTime; return; } -// DO NOT EDIT BELOW HERE + +function flashAlarm(mode = "on") { + const alarmDiv = document.getElementsByClassName("centre")[0]; + if (mode === "off") { + alarmDiv.classList.remove("flash"); + } else { + alarmDiv.classList.add("flash"); + } + return; +} var audio = new Audio("alarmsound.mp3"); From ac009e21a380b9f592d20477747615bece51f73c Mon Sep 17 00:00:00 2001 From: Tomislav Dukez Date: Mon, 27 Jul 2026 13:12:19 +0100 Subject: [PATCH 07/10] add flash off button and event --- Sprint-3/alarmclock/alarmclock.js | 4 ++++ Sprint-3/alarmclock/index.html | 1 + 2 files changed, 5 insertions(+) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 32ee3abaf..1b797e4a5 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -1,5 +1,9 @@ let countDownId = null; let secondsTillEnd = 0; +let offFlashButton = document.getElementById("flash"); +offFlashButton.addEventListener("click", () => { + flashAlarm("off"); +}); function setAlarm() { // Get input from user diff --git a/Sprint-3/alarmclock/index.html b/Sprint-3/alarmclock/index.html index 66748001e..dedd52fda 100644 --- a/Sprint-3/alarmclock/index.html +++ b/Sprint-3/alarmclock/index.html @@ -14,6 +14,7 @@

Time Remaining: 00:00

+
From 348bc8f5d7df13fe29b1ddd1f040b6e9c21fa242 Mon Sep 17 00:00:00 2001 From: Tomislav Dukez Date: Mon, 27 Jul 2026 13:46:36 +0100 Subject: [PATCH 08/10] add pause/resume alarm --- Sprint-3/alarmclock/alarmclock.js | 23 ++++++++++++++++++++++- Sprint-3/alarmclock/index.html | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 1b797e4a5..79069e0e9 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -1,12 +1,22 @@ let countDownId = null; let secondsTillEnd = 0; +let pausedAlarm = false; + let offFlashButton = document.getElementById("flash"); +let pauseButton = document.getElementById("pause"); + offFlashButton.addEventListener("click", () => { flashAlarm("off"); }); +pauseButton.addEventListener("click", togglePausedAlarm); + function setAlarm() { // Get input from user + if (pausedAlarm) { + togglePausedAlarm(); + } + const input = document.getElementById("alarmSet").value; const seconds = parseInt(input); @@ -15,10 +25,12 @@ function setAlarm() { alert("Please enter a valid number of seconds"); return; } + // Clear any existing countdown if (countDownId) { clearInterval(countDownId); } + flashAlarm("off"); secondsTillEnd = seconds; @@ -27,7 +39,9 @@ function setAlarm() { // Start countdown countDownId = setInterval(() => { - secondsTillEnd--; + if (!pausedAlarm) { + secondsTillEnd--; + } // Play alarm if end reached if (secondsTillEnd <= 0) { @@ -59,6 +73,13 @@ function flashAlarm(mode = "on") { return; } +function togglePausedAlarm() { + const alarmText = pauseButton.innerText; + pauseButton.innerText = + alarmText === "Pause Alarm" ? "Resume Alarm" : "Pause Alarm"; + pausedAlarm = !pausedAlarm; +} + var audio = new Audio("alarmsound.mp3"); function setup() { diff --git a/Sprint-3/alarmclock/index.html b/Sprint-3/alarmclock/index.html index dedd52fda..daf670c46 100644 --- a/Sprint-3/alarmclock/index.html +++ b/Sprint-3/alarmclock/index.html @@ -15,6 +15,7 @@

Time Remaining: 00:00

+ From 068e7c62d06438c36d44e40c8a845d29ace45f02 Mon Sep 17 00:00:00 2001 From: Tomislav Dukez Date: Mon, 27 Jul 2026 13:50:22 +0100 Subject: [PATCH 09/10] fix insert removed do not edit comment --- Sprint-3/alarmclock/alarmclock.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 79069e0e9..24a172f5e 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -80,6 +80,8 @@ function togglePausedAlarm() { pausedAlarm = !pausedAlarm; } +// DO NOT EDIT BELOW HERE + var audio = new Audio("alarmsound.mp3"); function setup() { From e9034c3a85da06d460cd81d6e9e09c74231a743a Mon Sep 17 00:00:00 2001 From: Tomislav Dukez Date: Mon, 27 Jul 2026 15:17:17 +0100 Subject: [PATCH 10/10] fix change code - integrate reviewers suggestions --- Sprint-3/alarmclock/alarmclock.js | 73 ++++++++++++++++++------------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 24a172f5e..9e29e1a76 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -11,12 +11,29 @@ offFlashButton.addEventListener("click", () => { pauseButton.addEventListener("click", togglePausedAlarm); -function setAlarm() { - // Get input from user - if (pausedAlarm) { - togglePausedAlarm(); +function startTimer() { + // Clear any existing timer before starting a new one + if (countDownId) { + clearInterval(countDownId); } + countDownId = setInterval(() => { + secondsTillEnd--; + + // Play alarm if end reached + if (secondsTillEnd <= 0) { + clearInterval(countDownId); + countDownId = null; + updateHeading(0); + playAlarm(); + flashAlarm("on"); + } else { + updateHeading(secondsTillEnd); + } + }, 1000); +} + +function setAlarm() { const input = document.getElementById("alarmSet").value; const seconds = parseInt(input); @@ -26,33 +43,20 @@ function setAlarm() { return; } - // Clear any existing countdown - if (countDownId) { - clearInterval(countDownId); + // Reset pause state if setting a new alarm + if (pausedAlarm) { + pausedAlarm = false; + pauseButton.innerText = "Pause Alarm"; } flashAlarm("off"); secondsTillEnd = seconds; - // Update heading + // Update heading immediately updateHeading(secondsTillEnd); - // Start countdown - countDownId = setInterval(() => { - if (!pausedAlarm) { - secondsTillEnd--; - } - - // Play alarm if end reached - if (secondsTillEnd <= 0) { - clearInterval(countDownId); - updateHeading(0); - playAlarm(); - flashAlarm(); - } else { - updateHeading(secondsTillEnd); - } - }, 1000); + // Start the countdown timer + startTimer(); } function updateHeading(timeInSeconds) { @@ -60,7 +64,6 @@ function updateHeading(timeInSeconds) { const seconds = timeInSeconds % 60; const formattedTime = `Time Remaining: ${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`; document.getElementById("timeRemaining").innerText = formattedTime; - return; } function flashAlarm(mode = "on") { @@ -70,14 +73,24 @@ function flashAlarm(mode = "on") { } else { alarmDiv.classList.add("flash"); } - return; } function togglePausedAlarm() { - const alarmText = pauseButton.innerText; - pauseButton.innerText = - alarmText === "Pause Alarm" ? "Resume Alarm" : "Pause Alarm"; - pausedAlarm = !pausedAlarm; + // Only toggle if an alarm is actually active/running + if (secondsTillEnd <= 0) return; + + if (pausedAlarm) { + // Resume alarm + pausedAlarm = false; + pauseButton.innerText = "Pause Alarm"; + startTimer(); + } else { + // Pause alarm: stop the interval completely + pausedAlarm = true; + pauseButton.innerText = "Resume Alarm"; + clearInterval(countDownId); + countDownId = null; + } } // DO NOT EDIT BELOW HERE