Live updates during a cycle; Filter & sort dropdown on phones; layout polish

- Worker publishes the rows swept so far every few seconds (LivePublishSeconds)
  with a DataVersion stamp; the dashboard reloads on each new version, so
  tables, the Overview and open dialogs update mid-cycle. Shared files are
  written to a temp file and swapped in, so readers never see half a file.
- Phones / tablets: one Filter & sort button opens a column list instead of a
  row of chips, on every table.
- Details: a wrapped Simple / Advanced toggle sits on the left.
- Card fields: fixed-height dialog; field list and add list share it evenly.
This commit is contained in:
Johan Sandoval committed 2026-10-06 21:33:29 +00:00
1 parent 7242f8f8af
commit 9dc2d88726
8 files changed
+149 -31

No files matched your search

+6 -1
View File
@@ -897,6 +897,7 @@
}
let globalDataLastUpdated = "Never";
let globalDataVersion = "";
let globalTrackedHash = "";
const groupsArray = ["No Data", "Not Started", "Backup In Progress", "Backup Completed", "Restore In Progress", "Completed", "Not Associated"];
@@ -4361,7 +4362,10 @@
}
// Early return ONLY if the Worker AND the Tracked Devices list are both completely unchanged
if (state.LastUpdated === globalDataLastUpdated && apiData.length > 0 && currentTrackedHash === globalTrackedHash) {
// The worker publishes rows several times a cycle (DataVersion); older workers only
// once per cycle (LastUpdated)
const dataUnchanged = state.DataVersion ? state.DataVersion === globalDataVersion : state.LastUpdated === globalDataLastUpdated;
if (dataUnchanged && apiData.length > 0 && currentTrackedHash === globalTrackedHash) {
return;
}
@@ -4374,6 +4378,7 @@
const payload = await dataRes.json();
if (payload.LastUpdated && payload.Devices) {
apiData = payload.Devices;
globalDataVersion = payload.DataVersion || state.DataVersion || "";
globalDataLastUpdated = payload.LastUpdated;
btn.innerHTML = `<span class="st-pre">Data Updated At: </span>${globalDataLastUpdated}`;
} else {