Local Secondary SDRs card: 'Unsaved' outranks 'Running'; unknown when unreachable

QA blocker: a reordered but unsaved list still showed the old order's
decoder as 'Running'. Also shows 'Unknown' rather than 'Waiting for SDR'
when the secondary-sdr service doesn't answer (server-26#187).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Logan Cusano
2026-09-27 14:14:49 -04:00
co-authored by Claude Opus 5.5
parent 9b6c64fbbf
commit c82fc61910
+8 -4
View File
@@ -547,8 +547,12 @@
let rank = 0; let rank = 0;
sdrRows.forEach((row, i) => { sdrRows.forEach((row, i) => {
const [name, hint] = SDR_LABELS[row.mode] || [row.mode, '']; const [name, hint] = SDR_LABELS[row.mode] || [row.mode, ''];
const running = sdrRunning.includes(row.mode); const running = (sdrRunning || []).includes(row.mode);
const state = !row.enabled ? 'Off' : running ? 'Running' : (sdrDirty ? 'Unsaved' : 'Waiting for SDR'); // Unsaved first: a reorder must not keep claiming the old order is live.
const state = !row.enabled ? 'Off'
: sdrDirty ? 'Unsaved'
: sdrRunning === null ? 'Unknown'
: running ? 'Running' : 'Waiting for SDR';
const el = document.createElement('div'); const el = document.createElement('div');
el.className = 'sdr-row'; el.className = 'sdr-row';
el.innerHTML = ` el.innerHTML = `
@@ -557,7 +561,7 @@
<span class="sdr-name">${name}<small>${hint}</small></span> <span class="sdr-name">${name}<small>${hint}</small></span>
<button class="sdr-move" aria-label="Move ${name} up" ${i === 0 ? 'disabled' : ''}>▲</button> <button class="sdr-move" aria-label="Move ${name} up" ${i === 0 ? 'disabled' : ''}>▲</button>
<button class="sdr-move" aria-label="Move ${name} down" ${i === sdrRows.length - 1 ? 'disabled' : ''}>▼</button> <button class="sdr-move" aria-label="Move ${name} down" ${i === sdrRows.length - 1 ? 'disabled' : ''}>▼</button>
<span class="sdr-state ${running && row.enabled ? 'on' : ''}">${state}</span>`; <span class="sdr-state ${state === 'Running' ? 'on' : ''}">${state}</span>`;
const [box] = el.getElementsByTagName('input'); const [box] = el.getElementsByTagName('input');
const [up, down] = el.getElementsByTagName('button'); const [up, down] = el.getElementsByTagName('button');
box.onchange = () => { row.enabled = box.checked; markSdrDirty(); }; box.onchange = () => { row.enabled = box.checked; markSdrDirty(); };
@@ -580,7 +584,7 @@
const r = await fetch('/api/secondary'); const r = await fetch('/api/secondary');
if (!r.ok) return; if (!r.ok) return;
const d = await r.json(); const d = await r.json();
sdrRunning = d.running || []; sdrRunning = d.running; // null = secondary SDR service unreachable
sdrRows = [ sdrRows = [
...d.priority.map(mode => ({ mode, enabled: true })), ...d.priority.map(mode => ({ mode, enabled: true })),
...d.modes.filter(m => !d.priority.includes(m)).map(mode => ({ mode, enabled: false })), ...d.modes.filter(m => !d.priority.includes(m)).map(mode => ({ mode, enabled: false })),