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 = " "; + 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 = " "; +} + 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);