From e467ba053773e7cbf39bb2fc9e2d7ac9dc4a814a Mon Sep 17 00:00:00 2001 From: Stan Grams Date: Sat, 4 Apr 2026 07:54:26 +0200 Subject: [PATCH] [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 Signed-off-by: Stan Grams --- .../trx-frontend/trx-frontend-http/assets/web/app.js | 7 ++++++- .../trx-frontend-http/assets/web/plugins/wefax.js | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js index 365f6ff..16955b1 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js +++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js @@ -469,10 +469,11 @@ let decodeHistoryRetentionMin = 24 * 60; // field name (e.g. "ft8_decode_enabled"). Lazily populated on first SSE. const _decoderToggles = {}; function _ensureDecoderToggles() { - if (Object.keys(_decoderToggles).length > 0) return; + if (decoderRegistry.length === 0) return; for (const d of decoderRegistry) { if (d.activation !== "toggle") continue; const key = d.id.replace(/-/g, "_") + "_decode_enabled"; + if (_decoderToggles[key]) continue; const el = document.getElementById(d.id + "-decode-toggle-btn"); 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)) { 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. if (typeof update.recorder_enabled === "boolean" && window._syncRecorderState) { window._syncRecorderState(update.recorder_enabled); diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/wefax.js b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/wefax.js index 509e3d5..b20ca80 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/wefax.js +++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/wefax.js @@ -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 ───────────────────────────────────────────────── if (wefaxDom.toggleBtn) { wefaxDom.toggleBtn.addEventListener('click', async function () {