38 lines
1.1 KiB
JavaScript
38 lines
1.1 KiB
JavaScript
function formatRemaining(totalSeconds) {
|
|
const seconds = Math.max(0, Math.ceil(totalSeconds));
|
|
const minutes = Math.floor(seconds / 60);
|
|
const rest = seconds % 60;
|
|
return `${minutes}:${String(rest).padStart(2, "0")}`;
|
|
}
|
|
|
|
function updateTimers() {
|
|
const now = Date.now() / 1000;
|
|
document.querySelectorAll("[data-auto-off-at]").forEach((item) => {
|
|
const target = Number(item.dataset.autoOffAt || 0);
|
|
if (!target) {
|
|
return;
|
|
}
|
|
const remaining = target - now;
|
|
if (remaining <= 0) {
|
|
item.textContent = item.dataset.expiredLabel || "Automatic turn-off pending";
|
|
item.classList.add("timer-expired");
|
|
return;
|
|
}
|
|
item.textContent = `${item.dataset.prefix || "Automatic turn-off in"} ${formatRemaining(remaining)}`;
|
|
});
|
|
}
|
|
|
|
document.addEventListener("submit", (event) => {
|
|
const form = event.target;
|
|
if (!(form instanceof HTMLFormElement) || form.dataset.requiresAck !== "true") {
|
|
return;
|
|
}
|
|
const message = form.dataset.ackMessage || "Confirm this action";
|
|
if (!window.confirm(message)) {
|
|
event.preventDefault();
|
|
}
|
|
});
|
|
|
|
updateTimers();
|
|
setInterval(updateTimers, 1000);
|