aboutsummaryrefslogtreecommitdiffstats
path: root/static/offline.js
diff options
context:
space:
mode:
Diffstat (limited to 'static/offline.js')
-rw-r--r--static/offline.js37
1 files changed, 37 insertions, 0 deletions
diff --git a/static/offline.js b/static/offline.js
new file mode 100644
index 0000000..f3e7f62
--- /dev/null
+++ b/static/offline.js
@@ -0,0 +1,37 @@
+// deck-it - the card a panel shows while what it watches is switched off
+// Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2 as
+// published by the Free Software Foundation.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+// Replaces box's content with a dimmed app icon, a title, a line on what
+// brings it back, and a pulsing "checking" note, since the poll keeps going
+// and the panel returns by itself. icon is a URL; a missing one is hidden.
+// The raw reason, if any, is kept in the tooltip rather than shown.
+export function offline(box, { icon, title, detail, reason }) {
+ const key = `${icon}|${title}|${detail}|${reason ?? ""}`;
+ if (box._offline === key && box.firstElementChild?.classList.contains("offline")) return;
+ box._offline = key;
+ box.innerHTML = `<div class="offline">
+ <img class="off-icon" alt="">
+ <div class="off-title"></div>
+ <div class="off-detail"></div>
+ <div class="off-poll"><i></i>checking</div>
+ </div>`;
+ const img = box.querySelector(".off-icon");
+ img.onerror = () => img.remove();
+ img.src = icon;
+ box.querySelector(".off-title").textContent = title;
+ box.querySelector(".off-detail").textContent = detail;
+ if (reason) box.firstElementChild.title = reason;
+}