diff --git a/apps/tevtimer/interface.html b/apps/tevtimer/interface.html index 2c75b593d..f2930da5a 100644 --- a/apps/tevtimer/interface.html +++ b/apps/tevtimer/interface.html @@ -186,6 +186,13 @@ return maxId + 1; } + function splitHMS(hms) { + let h = Math.floor(hms / 3600); + let m = Math.floor((hms % 3600) / 60); + let s = Math.floor(hms % 60); + return [h, m, s]; + } + function updateTimerBlocks() { // Track the currently focused element const activeElement = document.activeElement; @@ -235,9 +242,7 @@ console.error('Unsupported timer rate'); continue; } - let h = Math.floor(timer.origin / 3600); - let m = Math.floor((timer.origin % 3600) / 60); - let s = Math.floor(timer.origin % 60); + let [h, m, s] = splitHMS(timer.origin); let atEndTimer = timer.chain_id ? getTimerById(timers, timer.chain_id) : null; let atEndSelected = atEndTimer ? atEndTimer.id : 'null'; @@ -308,16 +313,28 @@ // Update only the At End dropdowns updateAtEndDropdowns(); } else if (type === 'hours' || type === 'minutes' || type === 'seconds') { - let h = parseInt(document.getElementById(`hours-${index}`).value) || 0; - let m = parseInt(document.getElementById(`minutes-${index}`).value) || 0; - let s = parseInt(document.getElementById(`seconds-${index}`).value) || 0; - userTimers[index].origin = h * 3600 + m * 60 + s; + let hInput = document.getElementById(`hours-${index}`); + let mInput = document.getElementById(`minutes-${index}`); + let sInput = document.getElementById(`seconds-${index}`); + let h = parseInt(hInput.value) || 0; + let m = parseInt(mInput.value) || 0; + let s = parseInt(sInput.value) || 0; + userTimers[index].origin = Math.max( + Math.min(h * 3600 + m * 60 + s, 99 * 3600 + 59 * 60 + 59), + 0); + // Normalize the values in case minutes/seconds >59 + [h, m, s] = splitHMS(userTimers[index].origin); + hInput.value = h; + mInput.value = m; + sInput.value = s; } else if (type === 'atend') { userTimers[index].chain_id = value == 'null' ? null : parseInt(value); } else if (type === 'vibrate') { userTimers[index].vibrate_pattern = value; } else if (type === 'buzz') { - userTimers[index].buzz_count = parseInt(value); + userTimers[index].buzz_count = + Math.max(Math.min(MAX_BUZZ_COUNT, parseInt(value)), 0); + event.target.value = userTimers[index].buzz_count; } }); }); @@ -406,11 +423,13 @@ } function saveTimers() { - // Save the timers to storage - console.log(userTimers); - // Util.writeStorageJSON('tevtimer.timers.json', userTimers, () => { - // console.log('Timers saved successfully'); - // }); + if (userTimers.length) { + // (Guard in case the user manages to click Save before + // the timers are loaded, or something like that) + Util.writeStorage(TIMERS_FILE, JSON.stringify(userTimers), () => { + alert('Timers saved successfully.'); + }); + }; } function reloadTimers() {