4f491c033139d8b4f4a2b8b1c8fd76d0f775c090
hiram
  Mon Sep 2 17:00:03 2024 -0700
manage all the options in the html page URL and start providing a share this page link refs #32596

diff --git src/hg/js/assemblySearch.js src/hg/js/assemblySearch.js
index 96f8ee9..f0eac76 100644
--- src/hg/js/assemblySearch.js
+++ src/hg/js/assemblySearch.js
@@ -11,30 +11,71 @@
 // adjust default here and in assemblySearch.html
 var browserExist = "mayExist";
 var betterCommonName = null;
 var comment = null;
 var stateObject = {};	// maintain page state
 var requestSubmitButton = null;
 var completedAsmId = new Map();	// keep track of requests completed
 				// so they won't be repeated
 
 // This function is called on DOMContentLoaded as the initialization
 //  procedure for first time page draw
 document.addEventListener('DOMContentLoaded', function() {
     // allow semi colon separators as well as ampersand
     var urlArgList = window.location.search.replaceAll(";", "&");
     urlParams = new URLSearchParams(urlArgList);
+    if (urlParams.has('level')) {
+       let asmLevel = urlParams.get('level');
+       document.getElementById('asmLevelAny').checked = true;  // default
+       // only one of these four cases will be true
+       if (asmLevel === "complete")
+         document.getElementById('asmLevelComplete').checked = true;
+       if (asmLevel === "chromosome")
+         document.getElementById('asmLevelChromosome').checked = true;
+       if (asmLevel === "scaffold")
+         document.getElementById('asmLevelScaffold').checked = true;
+       if (asmLevel === "contig")
+         document.getElementById('asmLevelContig').checked = true;
+    }
+    if (urlParams.has('status')) {
+       let asmStatus = urlParams.get('status');
+       document.getElementById('statusAny').checked = true; // default
+       // only one of these three cases will be true
+       if (asmStatus === "latest")
+          document.getElementById('statusLatest').checked = true;
+       if (asmStatus === "replaced")
+          document.getElementById('statusReplaced').checked = true;
+       if (asmStatus === "suppressed")
+          document.getElementById('statusSuppressed').checked = true;
+    }
+    if (urlParams.has('category')) {
+       let refSeqCategory = urlParams.get('category');
+       document.getElementById('refSeqAny').checked = true; // default
+       // only one of these etwo cases will be true
+       if (refSeqCategory === "reference")
+          document.getElementById('refSeqReference').checked = true;
+       if (refSeqCategory === "representative")
+          document.getElementById('refSeqRepresentative').checked = true;
+    }
+    // default starts as hidden
+    stateObject.advancedSearchVisible = false;
+    advancedSearchVisible(false);
+    if (urlParams.has('advancedSearch')) {
+        let advancedSearch = urlParams.get('advancedSearch');
+        advancedSearchVisible(advancedSearch)
+        stateObject.advancedSearchVisible = advancedSearch;
+    }
     if (urlParams.has('measureTiming')) { // accepts no value or other string
        var measureValue = urlParams.get('measureTiming');
        if ("0" === measureValue | "off" === measureValue) {
          measureTiming = false;
        } else {			// any other string turns it on
          measureTiming = true;
        }
     }
     if (urlParams.has('browser')) {
        var browserValue = urlParams.get('browser');
        if ("mayExist" === browserValue) {
           browserExist = "mayExist";
           document.getElementById('mustExist').checked = true;
           document.getElementById('notExist').checked = true;
        } else if ("mustExist" === browserValue) {
@@ -58,33 +99,30 @@
        } else {			// any other string turns it on
          debug = true;
        }
     }
 
     // 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() {
@@ -96,31 +134,33 @@
 
         var searchTerm = document.getElementById('searchBox').value;
         var resultCountLimit = document.getElementById('maxItemsOutput');
         var mustExist = document.getElementById('mustExist').checked;
         var notExist = document.getElementById('notExist').checked;
         browserExist = "mustExist";
         if (mustExist && notExist) {
            browserExist = "mayExist";
         } else if (notExist) {
            browserExist = "notExist";
         }
         makeRequest(searchTerm, browserExist, resultCountLimit.value);
     });
 
     advancedSearchButton.addEventListener('click', function() {
-       var searchOptions = document.getElementById("advancedSearchOptions");
+       let shareThisSearch = document.getElementById('shareThisSearch');
+       shareThisSearch.innerHTML = "&nbsp;";
+       let 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;
@@ -623,30 +663,36 @@
     requestSubmitButton.disabled = false;
     var overflow = modalWindow.offsetHeight - document.documentElement.clientHeight;
     if (overflow > 0) {
         modalWindow.style.maxHeight = (parseInt(window.getComputedStyle(modalWindow).height) - overflow) + "px";
     }
     modalWindow.style.marginTop = (-modalWindow.offsetHeight)/2 + "px";
     modalWindow.style.marginLeft = (-modalWindow.offsetWidth)/2 + "px";
   }
   if (e.preventDefault) {
     e.preventDefault();
   } else {
     e.returnValue = false;
   }
 }
 
+function optionsChange(e) {
+  // options are changing, share URL is no longer viable, eliminate it
+  let shareThisSearch = document.getElementById('shareThisSearch');
+  shareThisSearch.innerHTML = "&nbsp;";
+}
+
 function makeRequest(query, browserExist, resultLimit) {
     // Disable the submit button
     disableButtons();
     var wordMatch = document.querySelector('input[name="wordMatch"]:checked').value;
     var asmStatus = document.querySelector('input[name="asmStatus"]:checked').value;
     var refSeqCategory = document.querySelector('input[name="refSeqCategory"]:checked').value;
     var asmLevel = document.querySelector('input[name="asmLevel"]:checked').value;
 
     // start with what the user requested:
     var queryString = query;
 
     // for allWords, place + sign in front of each word if not already there
     if (wordMatch === "allWords") {
       var words = queryString.split(/\s+/);
       if (words.length > 1) {	// not needed on only one word
@@ -680,42 +726,49 @@
     if (asmLevel !== "asmLevelAny")	// default is any level of assembly
        historyUrl += ";level=" + asmLevel;	// something specific
     if (debug)
        historyUrl += ";debug=1";
     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")
+    if (searchOptions.style.display === "flex") {
         stateObject.advancedSearchVisible = true;
-    else
+        historyUrl += ";advancedSearch=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;
+    let shareThisSearch = document.getElementById('shareThisSearch');
+    let thisPageHref = "<a href='assemblySearch.html";
+    thisPageHref += historyUrl;
+    thisPageHref += "'>share this search</a>"
+    shareThisSearch.innerHTML = thisPageHref;
 
     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");
             document.getElementById("loadingSpinner").style.display = "none";
             enableButtons();
 
             stateObject.jsonData = xhr.responseText;
             history.pushState(stateObject, '', historyUrl);
 
             var data = JSON.parse(xhr.responseText);
 	    populateTableAndInfo(data);