[fix](trx-frontend-http): fix WEFAX toggle button and bookmark decoder wiring

Per-entry caching in _ensureDecoderToggles prevents stale guard from
blocking re-scan. Direct syncWefaxToggle path ensures dataset.enabled
stays current for bookmark prefill.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
2026-04-04 07:54:26 +02:00
parent 0fcd45f1ba
commit e467ba0537
2 changed files with 18 additions and 1 deletions
@@ -469,10 +469,11 @@ let decodeHistoryRetentionMin = 24 * 60;
// field name (e.g. "ft8_decode_enabled"). Lazily populated on first SSE. // field name (e.g. "ft8_decode_enabled"). Lazily populated on first SSE.
const _decoderToggles = {}; const _decoderToggles = {};
function _ensureDecoderToggles() { function _ensureDecoderToggles() {
if (Object.keys(_decoderToggles).length > 0) return; if (decoderRegistry.length === 0) return;
for (const d of decoderRegistry) { for (const d of decoderRegistry) {
if (d.activation !== "toggle") continue; if (d.activation !== "toggle") continue;
const key = d.id.replace(/-/g, "_") + "_decode_enabled"; const key = d.id.replace(/-/g, "_") + "_decode_enabled";
if (_decoderToggles[key]) continue;
const el = document.getElementById(d.id + "-decode-toggle-btn"); const el = document.getElementById(d.id + "-decode-toggle-btn");
if (el) _decoderToggles[key] = { el, last: null, label: d.label }; if (el) _decoderToggles[key] = { el, last: null, label: d.label };
} }
@@ -3368,6 +3369,10 @@ function render(update) {
for (const [key, entry] of Object.entries(_decoderToggles)) { for (const [key, entry] of Object.entries(_decoderToggles)) {
syncDecoderToggle(entry, !!update[key], entry.label); syncDecoderToggle(entry, !!update[key], entry.label);
} }
// WEFAX toggle sync (plugin-owned, belt-and-suspenders alongside _decoderToggles).
if (typeof update.wefax_decode_enabled === "boolean" && window.syncWefaxToggle) {
window.syncWefaxToggle(update.wefax_decode_enabled);
}
// Recorder state sync. // Recorder state sync.
if (typeof update.recorder_enabled === "boolean" && window._syncRecorderState) { if (typeof update.recorder_enabled === "boolean" && window._syncRecorderState) {
window._syncRecorderState(update.recorder_enabled); window._syncRecorderState(update.recorder_enabled);
@@ -342,6 +342,18 @@ if (wefaxDom.sortSelect) {
}); });
} }
// ── Toggle button sync ──────────────────────────────────────────────
// Sync the Enable/Disable button from the SSE state update. This is
// belt-and-suspenders alongside app.js _decoderToggles — guarantees the
// WEFAX button always reflects the server state.
window.syncWefaxToggle = function (enabled) {
if (!wefaxDom.toggleBtn) return;
wefaxDom.toggleBtn.dataset.enabled = enabled ? 'true' : 'false';
wefaxDom.toggleBtn.textContent = enabled ? 'Disable WEFAX' : 'Enable WEFAX';
wefaxDom.toggleBtn.style.borderColor = enabled ? '#00d17f' : '';
wefaxDom.toggleBtn.style.color = enabled ? '#00d17f' : '';
};
// ── Button handlers ───────────────────────────────────────────────── // ── Button handlers ─────────────────────────────────────────────────
if (wefaxDom.toggleBtn) { if (wefaxDom.toggleBtn) {
wefaxDom.toggleBtn.addEventListener('click', async function () { wefaxDom.toggleBtn.addEventListener('click', async function () {