[fix](trx-frontend-http): sanitize stale tune step options

Co-authored-by: Codex <codex@openai.com>
Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
2026-02-28 12:21:39 +01:00
parent 2ed68e4210
commit 778e695941
@@ -1720,6 +1720,7 @@ const jogDownBtn = document.getElementById("jog-down");
const jogUpBtn = document.getElementById("jog-up"); const jogUpBtn = document.getElementById("jog-up");
const jogStepEl = document.getElementById("jog-step"); const jogStepEl = document.getElementById("jog-step");
const jogMultEl = document.getElementById("jog-mult"); const jogMultEl = document.getElementById("jog-mult");
const VALID_JOG_DIVISORS = new Set([1, 10]);
function applyJogStep() { function applyJogStep() {
jogStep = Math.max(Math.round(jogUnit / jogMult), minFreqStepHz); jogStep = Math.max(Math.round(jogUnit / jogMult), minFreqStepHz);
@@ -1731,7 +1732,7 @@ function applyJogStep() {
} }
function setJogDivisor(divisor) { function setJogDivisor(divisor) {
const next = divisor === 10 ? 10 : 1; const next = VALID_JOG_DIVISORS.has(divisor) ? divisor : 1;
jogMult = next; jogMult = next;
if (jogMultEl) { if (jogMultEl) {
jogMultEl.querySelectorAll("button[data-mult]").forEach((b) => { jogMultEl.querySelectorAll("button[data-mult]").forEach((b) => {
@@ -1820,13 +1821,16 @@ jogStepEl.addEventListener("click", (e) => {
// Step multiplier selector // Step multiplier selector
if (jogMultEl) { if (jogMultEl) {
jogMultEl.querySelectorAll("button[data-mult]").forEach((btn) => {
const divisor = parseInt(btn.dataset.mult, 10);
if (!VALID_JOG_DIVISORS.has(divisor)) {
btn.remove();
}
});
jogMultEl.addEventListener("click", (e) => { jogMultEl.addEventListener("click", (e) => {
const btn = e.target.closest("button[data-mult]"); const btn = e.target.closest("button[data-mult]");
if (!btn) return; if (!btn) return;
jogMult = parseInt(btn.dataset.mult, 10); setJogDivisor(parseInt(btn.dataset.mult, 10));
jogMultEl.querySelectorAll("button").forEach((b) => b.classList.remove("active"));
btn.classList.add("active");
applyJogStep();
}); });
} }
@@ -1844,12 +1848,16 @@ if (jogMultEl) {
if (jogMultEl) { if (jogMultEl) {
const multBtns = Array.from(jogMultEl.querySelectorAll("button[data-mult]")); const multBtns = Array.from(jogMultEl.querySelectorAll("button[data-mult]"));
const activeMult = const activeMult =
multBtns.find((b) => parseInt(b.dataset.mult, 10) === jogMult) || multBtns.find((b) => parseInt(b.dataset.mult, 10) === jogMult && VALID_JOG_DIVISORS.has(jogMult)) ||
multBtns.find((b) => parseInt(b.dataset.mult, 10) === 1) || multBtns.find((b) => parseInt(b.dataset.mult, 10) === 1) ||
multBtns[0]; multBtns[0];
if (activeMult) { if (activeMult) {
jogMult = parseInt(activeMult.dataset.mult, 10); jogMult = VALID_JOG_DIVISORS.has(parseInt(activeMult.dataset.mult, 10))
? parseInt(activeMult.dataset.mult, 10)
: 1;
multBtns.forEach((b) => b.classList.toggle("active", b === activeMult)); multBtns.forEach((b) => b.classList.toggle("active", b === activeMult));
} else {
jogMult = 1;
} }
} }
jogStep = Math.max(Math.round(jogUnit / jogMult), minFreqStepHz); jogStep = Math.max(Math.round(jogUnit / jogMult), minFreqStepHz);