Skip to content

Commit f029203

Browse files
authored
Merge pull request #1 from karadHub:hot-fix-2.0.1
Enhance countdown timer functionality and UI, add GitHub icon
2 parents 53820ac + a408d5c commit f029203

5 files changed

Lines changed: 305 additions & 258 deletions

File tree

assets/countdown_timer.js

Lines changed: 54 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
start_button.disabled = true;
4040
pause_button.disabled = false;
4141
set_button.disabled = true;
42-
reset_button.disabled = false;
42+
disableInputs(true);
4343

4444
startTime = new Date().valueOf();
4545

@@ -55,6 +55,7 @@
5555
start_button.disabled = false;
5656
pause_button.disabled = true;
5757
set_button.disabled = false;
58+
disableInputs(false);
5859

5960
window.clearTimeout(timer);
6061
};
@@ -65,6 +66,7 @@
6566
pause_button.disabled = true;
6667
set_button.disabled = false;
6768
reset_button.disabled = true;
69+
disableInputs(false);
6870

6971
hour_input.value = "00";
7072
min_input.value = "00";
@@ -78,6 +80,7 @@
7880
start_button.disabled = false;
7981
pause_button.disabled = true;
8082
set_button.disabled = false;
83+
disableInputs(false);
8184

8285
var hour = hour_input.value;
8386
var min = min_input.value;
@@ -97,6 +100,16 @@
97100
window.clearTimeout(timer);
98101
};
99102

103+
function disableInputs(disabled) {
104+
hour_input.disabled = disabled;
105+
min_input.disabled = disabled;
106+
sec_input.disabled = disabled;
107+
const presetButtons = document.querySelectorAll(
108+
".preset-btn, .custom-preset-btn"
109+
);
110+
presetButtons.forEach((btn) => (btn.disabled = disabled));
111+
}
112+
100113
function padZero(n) {
101114
return n < 10 ? "0" + n : n;
102115
}
@@ -107,15 +120,13 @@
107120
let h = Math.floor(t / 3600);
108121
let m = Math.floor(t / 60) % 60;
109122
let s = Math.floor(t) % 60;
110-
timer_main.innerHTML = `<strong>${padZero(h)}:${padZero(m)}:${padZero(
111-
s
112-
)}</strong>`;
113-
let color = "#a3dafd";
123+
timer_main.innerHTML = `${padZero(h)}:${padZero(m)}:${padZero(s)}`;
124+
let color = "#e0f7ff";
114125
if (duration !== undefined) {
115126
if (counter < 0 && counter % 2 === 0) {
116127
color = "red";
117-
} else if (counter < 60) {
118-
color = "yellow";
128+
} else if (counter > 0 && counter < 10) {
129+
color = "#ffc107"; // A warning yellow
119130
}
120131
}
121132
timer_main.style.color = color;
@@ -125,12 +136,23 @@
125136
counter--;
126137
updateCounter();
127138
window.clearTimeout(timer);
128-
if (counter <= 0) {
139+
if (counter < 0) {
140+
// Changed to < 0 to allow 00:00:00 to show
129141
start_button.disabled = true;
130142
pause_button.disabled = true;
131143
set_button.disabled = false;
132-
reset_button.disabled = false;
133-
timer = window.setTimeout(onTimer, 500);
144+
disableInputs(false);
145+
// Flash timer when done
146+
let flash = true;
147+
const flashInterval = setInterval(() => {
148+
timer_main.style.visibility = flash ? "hidden" : "visible";
149+
flash = !flash;
150+
}, 500);
151+
// Stop flashing after a few seconds
152+
setTimeout(() => {
153+
clearInterval(flashInterval);
154+
timer_main.style.visibility = "visible";
155+
}, 5000);
134156
return;
135157
}
136158

@@ -152,44 +174,39 @@
152174

153175
presetButtons.forEach((btn) => {
154176
btn.addEventListener("click", function () {
155-
const hours = this.dataset.hours;
156-
const minutes = this.dataset.minutes;
157-
const seconds = this.dataset.seconds;
177+
const hours = this.dataset.hours.padStart(2, "0");
178+
const minutes = this.dataset.minutes.padStart(2, "0");
179+
const seconds = this.dataset.seconds.padStart(2, "0");
158180

159-
hour_input.value = hours.padStart(2, "0");
160-
min_input.value = minutes.padStart(2, "0");
161-
sec_input.value = seconds.padStart(2, "0");
181+
hour_input.value = hours;
182+
min_input.value = minutes;
183+
sec_input.value = seconds;
162184

163185
setTime();
164186
});
165187
});
166188

167189
if (savePresetBtn) {
168190
savePresetBtn.addEventListener("click", function () {
169-
const name = prompt("Enter a name for this preset:");
191+
const h = hour_input.value;
192+
const m = min_input.value;
193+
const s = sec_input.value;
194+
if (h === "00" && m === "00" && s === "00") {
195+
alert("Please set a time before saving a preset.");
196+
return;
197+
}
198+
const name = prompt(
199+
`Enter a name for this preset (${h}:${m}:${s}):`
200+
);
170201
if (name && name.trim()) {
171-
saveCustomPreset(name.trim());
202+
saveCustomPreset(name.trim(), h, m, s);
172203
}
173204
});
174205
}
175206
}
176207

177-
function saveCustomPreset(name) {
178-
const hours = hour_input.value;
179-
const minutes = min_input.value;
180-
const seconds = sec_input.value;
181-
182-
if (hours === "00" && minutes === "00" && seconds === "00") {
183-
alert("Please set a time before saving a preset.");
184-
return;
185-
}
186-
187-
const preset = {
188-
name: name,
189-
hours: hours,
190-
minutes: minutes,
191-
seconds: seconds,
192-
};
208+
function saveCustomPreset(name, hours, minutes, seconds) {
209+
const preset = { name, hours, minutes, seconds };
193210

194211
let customPresets = JSON.parse(
195212
localStorage.getItem("customPresets") || "[]"
@@ -212,7 +229,7 @@
212229

213230
customPresets.forEach((preset, index) => {
214231
const presetBtn = document.createElement("button");
215-
presetBtn.className = "custom-preset-btn";
232+
presetBtn.className = "preset-btn custom-preset-btn";
216233
presetBtn.innerHTML = `${preset.name}<br><small>${preset.hours}:${preset.minutes}:${preset.seconds}</small>`;
217234

218235
presetBtn.addEventListener("click", function () {
@@ -222,9 +239,10 @@
222239
setTime();
223240
});
224241

225-
const deleteBtn = document.createElement("button");
242+
const deleteBtn = document.createElement("span");
226243
deleteBtn.className = "delete-btn";
227244
deleteBtn.innerHTML = "×";
245+
deleteBtn.title = "Delete preset";
228246
deleteBtn.addEventListener("click", function (e) {
229247
e.stopPropagation();
230248
deleteCustomPreset(index);

0 commit comments

Comments
 (0)