|
|
|
@ -93,6 +93,7 @@
|
|
|
|
const COMMAND_WAKE = "WakeUp";
|
|
|
|
const COMMAND_WAKE = "WakeUp";
|
|
|
|
const COMMAND_SHUTDOWN = "ShutDown";
|
|
|
|
const COMMAND_SHUTDOWN = "ShutDown";
|
|
|
|
const COMMAND_RESTART = "Restart";
|
|
|
|
const COMMAND_RESTART = "Restart";
|
|
|
|
|
|
|
|
const ON_STATUSES = new Set(["running", "out_of_schedule"]);
|
|
|
|
|
|
|
|
|
|
|
|
// Application state
|
|
|
|
// Application state
|
|
|
|
const state = {
|
|
|
|
const state = {
|
|
|
|
@ -145,6 +146,10 @@
|
|
|
|
restartAutoRefresh();
|
|
|
|
restartAutoRefresh();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function isTerminalOn(terminal) {
|
|
|
|
|
|
|
|
return ON_STATUSES.has(String(terminal?.status || "").toLowerCase());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function setupListeners() {
|
|
|
|
function setupListeners() {
|
|
|
|
document.getElementById("nscRefreshInterval").addEventListener("change", (e) => {
|
|
|
|
document.getElementById("nscRefreshInterval").addEventListener("change", (e) => {
|
|
|
|
let val = parseInt(e.target.value);
|
|
|
|
let val = parseInt(e.target.value);
|
|
|
|
@ -362,7 +367,7 @@
|
|
|
|
function renderGlobalExhibition(allLocations, visibleLocations) {
|
|
|
|
function renderGlobalExhibition(allLocations, visibleLocations) {
|
|
|
|
const container = document.getElementById("nscExhibitionCard");
|
|
|
|
const container = document.getElementById("nscExhibitionCard");
|
|
|
|
const allT = state.terminals;
|
|
|
|
const allT = state.terminals;
|
|
|
|
const onT = allT.filter(t => t.status?.toLowerCase() === 'running').length;
|
|
|
|
const onT = allT.filter(isTerminalOn).length;
|
|
|
|
const total = allT.length;
|
|
|
|
const total = allT.length;
|
|
|
|
const pct = total ? Math.round((onT/total)*100) : 0;
|
|
|
|
const pct = total ? Math.round((onT/total)*100) : 0;
|
|
|
|
const visibleLocationCount = visibleLocations.length;
|
|
|
|
const visibleLocationCount = visibleLocations.length;
|
|
|
|
@ -408,14 +413,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
function renderLocationCard(loc) {
|
|
|
|
function renderLocationCard(loc) {
|
|
|
|
const total = loc.terminals.length;
|
|
|
|
const total = loc.terminals.length;
|
|
|
|
const on = loc.terminals.filter(t => t.status?.toLowerCase() === 'running').length;
|
|
|
|
const on = loc.terminals.filter(isTerminalOn).length;
|
|
|
|
const pct = total ? Math.round((on/total)*100) : 0;
|
|
|
|
const pct = total ? Math.round((on/total)*100) : 0;
|
|
|
|
|
|
|
|
|
|
|
|
const pcs = loc.terminals.filter(t => t.player === 'PC');
|
|
|
|
const pcs = loc.terminals.filter(t => t.player === 'PC');
|
|
|
|
const onPcs = pcs.filter(t => t.status?.toLowerCase() === 'running').length;
|
|
|
|
const onPcs = pcs.filter(isTerminalOn).length;
|
|
|
|
|
|
|
|
|
|
|
|
const lights = loc.terminals.filter(t => t.player === 'CTRL');
|
|
|
|
const lights = loc.terminals.filter(t => t.player === 'CTRL');
|
|
|
|
const onLights = lights.filter(t => t.status?.toLowerCase() === 'running').length;
|
|
|
|
const onLights = lights.filter(isTerminalOn).length;
|
|
|
|
|
|
|
|
|
|
|
|
let dotCls = "bg-slate-400";
|
|
|
|
let dotCls = "bg-slate-400";
|
|
|
|
if(total > 0 && on === total) dotCls = "bg-emerald-500 shadow-glow";
|
|
|
|
if(total > 0 && on === total) dotCls = "bg-emerald-500 shadow-glow";
|
|
|
|
@ -506,7 +511,7 @@
|
|
|
|
if(!terminals.length) return '';
|
|
|
|
if(!terminals.length) return '';
|
|
|
|
|
|
|
|
|
|
|
|
const rows = terminals.map(t => {
|
|
|
|
const rows = terminals.map(t => {
|
|
|
|
const isRun = t.status?.toLowerCase() === 'running';
|
|
|
|
const isRun = isTerminalOn(t);
|
|
|
|
const statusCls = isRun ? "text-emerald-500" : "text-slate-400 dark:text-slate-500";
|
|
|
|
const statusCls = isRun ? "text-emerald-500" : "text-slate-400 dark:text-slate-500";
|
|
|
|
const dotCls = isRun ? "bg-emerald-500" : "bg-slate-300 dark:bg-slate-600";
|
|
|
|
const dotCls = isRun ? "bg-emerald-500" : "bg-slate-300 dark:bg-slate-600";
|
|
|
|
|
|
|
|
|
|
|
|
|