afcbfbdf1e2c8cb1a76a08ca90f1e16833296e28
chmalee
  Tue Feb 10 15:25:32 2026 -0800
Fix hgGateway bugs found in #34078 note 39: fix show species tree link, when disconnecting a hub on hgHubConnect, remove the hub from localStorage, fix handling of native databases that don't follow canFam4, hg38, etc format (example GRCm38B), store public hub name in the item storage so we correctly detect clicks on public hubs in recents list, call draw species tree by default on page load even if it's hidden so we don't need to render it each time we call back to the server because connecting to hubs no longer go into the tree. refs #34078

diff --git src/hg/js/utils.js src/hg/js/utils.js
index 8f8bf66567b..1d7fad56e47 100644
--- src/hg/js/utils.js
+++ src/hg/js/utils.js
@@ -4478,30 +4478,49 @@
 
     let recentObj = JSON.parse(stored);
     let results = [];
     for (let genome of recentObj.stack) {
         if (recentObj.results[genome]) {
             let item = Object.assign({}, recentObj.results[genome]);
             // Preserve original category for setDbFromAutocomplete to detect GenArk/hubs
             // but also provide a display category for UI
             item.displayCategory = "Recent";
             results.push(item);
         }
     }
     return results;
 }
 
+function removeRecentGenomesByHubUrl(hubUrl) {
+    // Remove all recent genome entries whose hubUrl matches the given URL.
+    // Used when a hub is disconnected to clean up stale entries.
+    let stored = window.localStorage.getItem("recentGenomes");
+    if (!stored) return;
+    let recentObj = JSON.parse(stored);
+    let newStack = [];
+    for (let key of recentObj.stack) {
+        let item = recentObj.results[key];
+        if (item && item.hubUrl === hubUrl) {
+            delete recentObj.results[key];
+        } else {
+            newStack.push(key);
+        }
+    }
+    recentObj.stack = newStack;
+    window.localStorage.setItem("recentGenomes", JSON.stringify(recentObj));
+}
+
 function addRecentGenomesToMenuBar() {
     // Retrieve recent genome selections from localStorage and add them to the "Genomes" menu heading
     // Tries not add duplicate genomes
     let stored = window.localStorage.getItem("recentGenomes");
     if (!stored) return;
 
     let recentObj = JSON.parse(stored);
     let results = [];
     for (let genome of recentObj.stack) {
         if (recentObj.results[genome]) {
             let item = document.createElement("li");
             let link = document.createElement("a");
             // TODO: these links need to work if the result (ie: genark) does not have a db
             link.href = "../cgi-bin/hgTracks?hgsid=" + getHgsid() + "&db=" + recentObj.results[genome].db + "&position=lastDbPos";
             link.textContent = recentObj.results[genome].label;