[fix](trx-frontend-http): populate scheduler bookmark picker after async load

The TimeSpan bookmark <select> was populated in wireSchedulerEvents() which
runs before the apiGetBookmarks() fetch completes, leaving it empty.
Moved population to populateTsBookmarkSelect() called from loadScheduler()'s
.then() callback so bookmarkList is already filled.

Also pre-fill grayline lat/lon from serverLat/serverLon when the field has
no saved value.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
2026-03-10 23:28:00 +01:00
parent 4f9f93c9c1
commit 877573c905
@@ -117,6 +117,7 @@
.then(function ([config, bms]) { .then(function ([config, bms]) {
currentConfig = config; currentConfig = config;
bookmarkList = Array.isArray(bms) ? bms : []; bookmarkList = Array.isArray(bms) ? bms : [];
populateTsBookmarkSelect();
renderScheduler(); renderScheduler();
}) })
.catch(function (e) { .catch(function (e) {
@@ -181,13 +182,27 @@
// Grayline inputs // Grayline inputs
if (mode === "grayline" && currentConfig && currentConfig.grayline) { if (mode === "grayline" && currentConfig && currentConfig.grayline) {
const gl = currentConfig.grayline; const gl = currentConfig.grayline;
setInputValue("scheduler-gl-lat", gl.lat != null ? gl.lat : ""); // Prefer saved value; fall back to server coordinates from app.js globals.
setInputValue("scheduler-gl-lon", gl.lon != null ? gl.lon : ""); const lat = gl.lat != null ? gl.lat : (typeof serverLat !== "undefined" ? serverLat : "");
const lon = gl.lon != null ? gl.lon : (typeof serverLon !== "undefined" ? serverLon : "");
setInputValue("scheduler-gl-lat", lat != null ? lat : "");
setInputValue("scheduler-gl-lon", lon != null ? lon : "");
setInputValue("scheduler-gl-window", gl.transition_window_min != null ? gl.transition_window_min : 20); setInputValue("scheduler-gl-window", gl.transition_window_min != null ? gl.transition_window_min : 20);
renderBookmarkSelect("scheduler-gl-dawn", gl.dawn_bookmark_id); renderBookmarkSelect("scheduler-gl-dawn", gl.dawn_bookmark_id);
renderBookmarkSelect("scheduler-gl-day", gl.day_bookmark_id); renderBookmarkSelect("scheduler-gl-day", gl.day_bookmark_id);
renderBookmarkSelect("scheduler-gl-dusk", gl.dusk_bookmark_id); renderBookmarkSelect("scheduler-gl-dusk", gl.dusk_bookmark_id);
renderBookmarkSelect("scheduler-gl-night", gl.night_bookmark_id); renderBookmarkSelect("scheduler-gl-night", gl.night_bookmark_id);
} else if (mode === "grayline") {
// No saved grayline config yet — pre-fill coords from server if available.
const lat = typeof serverLat !== "undefined" ? serverLat : "";
const lon = typeof serverLon !== "undefined" ? serverLon : "";
setInputValue("scheduler-gl-lat", lat != null ? lat : "");
setInputValue("scheduler-gl-lon", lon != null ? lon : "");
setInputValue("scheduler-gl-window", 20);
renderBookmarkSelect("scheduler-gl-dawn", null);
renderBookmarkSelect("scheduler-gl-day", null);
renderBookmarkSelect("scheduler-gl-dusk", null);
renderBookmarkSelect("scheduler-gl-night", null);
} else { } else {
renderBookmarkSelect("scheduler-gl-dawn", null); renderBookmarkSelect("scheduler-gl-dawn", null);
renderBookmarkSelect("scheduler-gl-day", null); renderBookmarkSelect("scheduler-gl-day", null);
@@ -343,6 +358,7 @@
startEl.value = ""; startEl.value = "";
endEl.value = ""; endEl.value = "";
bmEl.value = ""; // reset select to first option
if (labelEl) labelEl.value = ""; if (labelEl) labelEl.value = "";
renderTimespanEntries(); renderTimespanEntries();
@@ -473,17 +489,21 @@
const addBtn = document.getElementById("scheduler-ts-add-btn"); const addBtn = document.getElementById("scheduler-ts-add-btn");
if (addBtn) addBtn.addEventListener("click", addEntry); if (addBtn) addBtn.addEventListener("click", addEntry);
// Populate add-entry bookmark selector }
const tsBookmarkEl = document.getElementById("scheduler-ts-bookmark");
if (tsBookmarkEl) { function populateTsBookmarkSelect() {
tsBookmarkEl.innerHTML = '<option value="">— select bookmark —</option>'; const sel = document.getElementById("scheduler-ts-bookmark");
bookmarkList.forEach(function (bm) { if (!sel) return;
const opt = document.createElement("option"); const prev = sel.value;
opt.value = bm.id; sel.innerHTML = '<option value="">— select bookmark —</option>';
opt.textContent = bm.name + " (" + formatFreq(bm.freq_hz) + " " + bm.mode + ")"; bookmarkList.forEach(function (bm) {
tsBookmarkEl.appendChild(opt); const opt = document.createElement("option");
}); opt.value = bm.id;
} opt.textContent = bm.name + " (" + formatFreq(bm.freq_hz) + " " + bm.mode + ")";
sel.appendChild(opt);
});
// Restore previous selection if still valid.
if (prev) sel.value = prev;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------