00f1aed7796ee719e3468d4b4acfebfd4d542d1b
hiram
  Thu Aug 29 18:36:10 2024 -0700
correctly follow URL arguments and better state save and restore refs #32589

diff --git src/hg/js/assemblySearch.js src/hg/js/assemblySearch.js
index 37b1fc1..f6f8332 100644
--- src/hg/js/assemblySearch.js
+++ src/hg/js/assemblySearch.js
@@ -58,30 +58,31 @@
        }
     }
 
     // add extra element to the help text bullet list for API example
     if (debug) {
       var searchTipList = document.getElementById("searchTipList");
       // Create a new list item
       var li = document.createElement("li");
       li.innerHTML = "example API call: <span id=\"recentAjax\">n/a</span>";
       // Append the new list item to the ordered list
       searchTipList.appendChild(li);
     }
 
     // default starts as hidden
     stateObject.advancedSearchVisible = false;
+    advancedSearchVisible(false);
     var searchForm = document.getElementById('searchForm');
     var advancedSearchButton = document.getElementById('advancedSearchButton');
     var searchInput = document.getElementById('searchBox');
     var clearButton = document.getElementById('clearSearch');
     asmIdText = document.getElementById("formAsmId");
     betterCommonName = document.getElementById("betterCommonName");
     comment = document.getElementById("comment");
     requestSubmitButton = document.getElementById("submitButton");
 
     document.getElementById("modalFeedback").addEventListener("submit", checkForm, false);
     modalInit();
     var tableBody = document.getElementById('tableBody');
     tableBody.innerHTML = '<tr><td style="text-align:center;" colspan=8><b>(empty table)</b></td></tr>';
 
     clearButton.addEventListener('click', function() {
@@ -107,30 +108,31 @@
     advancedSearchButton.addEventListener('click', function() {
        var searchOptions = document.getElementById("advancedSearchOptions");
        // I don't know why it is false the first time ?
        if (! searchOptions.style.display || searchOptions.style.display === "none") {
           advancedSearchVisible(true);
        } else {
           advancedSearchVisible(false);
        }
     });
 
     // restore history on back button
     window.addEventListener('popstate', function(e) {
        var state = event.state;
        if (state) {
           stateObject.queryString = state.queryString;
+          stateObject.advancedSearchVisible = state.advancedSearchVisible;
           stateObject.maxItemsOutput = state.maxItemsOutput;
           stateObject.browser = state.browser;
           stateObject.debug = state.debug;
           stateObject.measureTiming = state.measureTiming;
           stateObject.wordMatch = state.wordMatch;
           stateObject.asmStatus = state.asmStatus;
           stateObject.refSeqCategory = state.refSeqCategory;
           stateObject.asmLevel = state.asmLevel;
           stateObject.jsonData = state.jsonData;
           document.getElementById('mustExist').checked = false;
           document.getElementById('notExist').checked = false;
           if (stateObject.browser === "mustExist") {
              document.getElementById('mustExist').checked = true;
           }
           if (stateObject.browser === "notExist") {
@@ -582,53 +584,56 @@
             queryPlus += " +" + word;
           }
         });
         queryString = queryPlus.trim();
       }
     }
     // remove stray white space from beginning or end
     queryString = queryString.trim();
 
     // Show the wait spinner
     document.querySelector(".submitContainer").classList.add("loading");
     document.getElementById("loadingSpinner").style.display = "block";
 
     var xhr = new XMLHttpRequest();
     var urlPrefix = "/cgi-bin/hubApi";
-    var url = "/findGenome?q=" + encodeURIComponent(queryString);
-    url += ";browser=" + browserExist;
-    url += ";maxItemsOutput=" + resultLimit;
+    var historyUrl = "?q=" + encodeURIComponent(queryString);
+    historyUrl += ";browser=" + browserExist;
+    historyUrl += ";maxItemsOutput=" + resultLimit;
     if (asmStatus !== "statusAny")	// default is any assembly status
-       url += ";status=" + asmStatus;	// something specific is being requested
+       historyUrl += ";status=" + asmStatus;	// something specific is being requested
     if (refSeqCategory !== "refSeqAny")	// default is any RefSeq category
-       url += ";category=" + refSeqCategory;	// something specific
+       historyUrl += ";category=" + refSeqCategory;	// something specific
     if (asmLevel !== "asmLevelAny")	// default is any level of assembly
-       url += ";level=" + asmLevel;	// something specific
-
-    var historyUrl = "?q=" + encodeURIComponent(queryString) + ";browser=" + browserExist + ";maxItemsOutput=" + resultLimit;
-    if (debug) {
+       historyUrl += ";level=" + asmLevel;	// something specific
+    if (debug)
        historyUrl += ";debug=1";
-    }
-    if (measureTiming) {
+    if (measureTiming)
        historyUrl += ";measureTiming=1";
-    }
+
+    var url = "/findGenome" + historyUrl;
 
     if (debug) {
       var apiUrl = "<a href='" + urlPrefix + url + "' target=_blank>" + url + "</a>";
       document.getElementById("recentAjax").innerHTML = apiUrl;
     }
     stateObject.queryString = queryString;
+    var searchOptions = document.getElementById("advancedSearchOptions");
+    if (searchOptions.style.display === "flex")
+        stateObject.advancedSearchVisible = true;
+    else
+        stateObject.advancedSearchVisible = false;
     stateObject.maxItemsOutput = maxItemsOutput;
     stateObject.browser = browserExist;
     stateObject.debug = debug;
     stateObject.measureTiming = measureTiming;
     stateObject.wordMatch = wordMatch;
     stateObject.asmStatus = asmStatus;
     stateObject.refSeqCategory = refSeqCategory;
     stateObject.asmLevel = asmLevel;
 
     xhr.open('GET', urlPrefix + url, true);
 
     xhr.onload = function() {
         if (xhr.status === 200) {
             // Hide the wait spinner once the AJAX request is complete
             document.querySelector(".submitContainer").classList.remove("loading");