eb1bae3e9dfdebcb95f621724dc5c08e7904e555 chmalee Wed Mar 5 10:05:48 2025 -0800 Explicitly add the db= parameter to calls to navigateInPlace() to prevent weird to the user bugs when multiple tabs are open. This is just a quick fix to prevent unwanted behavior while we figure out the multiple tabs = can still be one hgsid problem, refs #35199 diff --git src/hg/js/hgTracks.js src/hg/js/hgTracks.js index 8c70a2e9205..8ac4b39491b 100644 --- src/hg/js/hgTracks.js +++ src/hg/js/hgTracks.js @@ -1234,31 +1234,31 @@ closeOnEscape: true, resizable: false, autoOpen: false, revertToOriginalPos: true, minWidth: 550, buttons: { "Zoom In": function() { // Zoom to selection $(this).dialog("option", "revertToOriginalPos", false); if ($("#disableDragHighlight").prop('checked')) hgTracks.enableHighlightingDialog = false; if (imageV2.inPlaceUpdate) { if (hgTracks.virtualSingleChrom && (newPosition.search("multi:")===0)) { newPosition = genomePos.disguisePosition(newPosition); // DISGUISE } - var params = "position=" + newPosition; + var params = "db=" + getDb() + "&position=" + newPosition; if (!hgTracks.enableHighlightingDialog) params += "&enableHighlightingDialog=0"; imageV2.navigateInPlace(params, null, true); } else { $('body').css('cursor', 'wait'); if (!hgTracks.enableHighlightingDialog) cart.setVarsObj({'enableHighlightingDialog': 0 },null,false); // async=false document.TrackHeaderForm.submit(); } $(this).dialog("close"); }, "Single Highlight": function() { // Clear old highlight and Highlight selection $(imageV2.imgTbl).imgAreaSelect({hide:true}); if ($("#disableDragHighlight").prop('checked')) @@ -1334,31 +1334,31 @@ if (event.altKey) { // with the alt-key, only highlight the region, do not zoom dragSelect.highlightThisRegion(newPosition, true); $(imageV2.imgTbl).imgAreaSelect({hide:true}); } else { if (hgTracks.enableHighlightingDialog && !(event.metaKey || event.ctrlKey)) // don't show the dialog if: clicked on ruler, if dialog deactivated or meta/ctrl was pressed dragSelect.selectionEndDialog(newPosition); else { // in every other case, show the dialog $(imageV2.imgTbl).imgAreaSelect({hide:true}); if (imageV2.inPlaceUpdate) { if (hgTracks.virtualSingleChrom && (newPosition.search("multi:")===0)) { newPosition = genomePos.disguisePosition(newPosition); // DISGUISE } - imageV2.navigateInPlace("position=" + newPosition, null, true); + imageV2.navigateInPlace("db=" + getDb() + "&position=" + newPosition, null, true); } else { jQuery('body').css('cursor', 'wait'); document.TrackHeaderForm.submit(); } } } } else { $(imageV2.imgTbl).imgAreaSelect({hide:true}); genomePos.revertToOriginalPos(); } dragSelect.startTime = null; // blockMapClicks/allowMapClicks() is necessary if selectEnd was over a map item. setTimeout(posting.allowMapClicks,50); return true; } @@ -1541,31 +1541,31 @@ selRange = rangeNormalizeToChrom(selRange,chr); if (mouseHasMoved === false) { // Update highlight by converting bp back to pix pxDown = convertFromBases(selRange.beg); pxUp = convertFromBases(selRange.end); hiliteShow(pxDown,pxUp); } //if ((selRange.end - selRange.beg) < 50000) // dontAsk = true; if (dontAsk || confirm("Jump to new position:\n\n"+chr.name+":"+commify(selRange.beg)+ "-"+commify(selRange.end)+" size:"+commify(selRange.width)) ) { genomePos.setByCoordinates(chr.name, selRange.beg, selRange.end); // Stop the presses :0) $('area.cytoBand').on("mousedown", function(e) { return false; }); if (imageV2.backSupport) { - imageV2.navigateInPlace("position=" + + imageV2.navigateInPlace("db=" + getDb() + "&position=" + encodeURIComponent(genomePos.get().replace(/,/g,'')) + "&findNearest=1",null,true); hiliteCancel(); } else document.TrackHeaderForm.submit(); return true; // Make sure the setTimeout below is not called. } } } hiliteCancel(); setTimeout(posting.allowMapClicks,50); } mouseIsDown = false; mouseHasMoved = false; } @@ -1900,31 +1900,31 @@ beyondImage = false; if (savedPosition) genomePos.set(savedPosition); var oldPos = prevX.toString() + "px"; $(".panImg").css( {'left': oldPos }); $('.tdData').css( {'backgroundPosition': oldPos } ); if (highlightAreas) imageV2.drawHighlights(); return true; } // Do we need to fetch anything? if (beyondImage) { if (imageV2.inPlaceUpdate) { var pos = parsePosition(genomePos.get()); - imageV2.navigateInPlace("position=" + + imageV2.navigateInPlace("db=" + getDb() + "&position=" + encodeURIComponent(pos.chrom + ":" + pos.start + "-" + pos.end), null, true); } else { document.TrackHeaderForm.submit(); } return true; // Make sure the setTimeout below is not called. } // Just a normal scroll within a >1X image if (prevX !== newX) { prevX = newX; if (!only1xScrolling) { //panAdjustHeight(newX); // Will resize image AFTER scrolling. // Important, since AJAX could lead to reinit after this within bounds scroll hgTracks.imgBoxPortalOffsetX = (prevX * -1) - hgTracks.imgBoxLeftLabel; @@ -2261,31 +2261,31 @@ } return null; }, windowOpenFailedMsg: function () { warn("Your web browser prevented us from opening a new window.\n\n" + "Please change your browser settings to allow pop-up windows from " + document.domain + "."); }, handleZoomCodon: function (response, status) { var json = JSON.parse(response); if (json.pos) { - imageV2.navigateInPlace("position="+json.pos); + imageV2.navigateInPlace("db=" + getDb() + "&position="+json.pos); } else { alert(json.error); } }, handleViewImg: function (response, status) { // handles view image response, which must get new image without imageV2 gimmickery jQuery('body').css('cursor', ''); var str = "<IMG[^>]*SRC='([^']+)'"; var reg = new RegExp(str); var a = reg.exec(response); if (a && a[1]) { if ( ! window.open(a[1]) ) { rightClick.windowOpenFailedMsg(); } @@ -2648,31 +2648,31 @@ } } } else if (cmd === 'jumpToHighlight') { // If highlight exists for this assembly, jump to it if (hgTracks.highlight && rightClick.clickedHighlightIdx!==null) { var newPos = getHighlight(hgTracks.highlight, rightClick.clickedHighlightIdx); if (newPos && newPos.db === getDb()) { if ( $('#highlightItem').length === 0) { // not visible? jump to it var curPos = parsePosition(genomePos.get()); var diff = ((curPos.end - curPos.start) - (newPos.end - newPos.start)); if (diff > 0) { // new position is smaller then current, then center it newPos.start = Math.max( Math.floor(newPos.start - (diff/2) ), 0 ); newPos.end = newPos.start + (curPos.end - curPos.start); } } if (imageV2.inPlaceUpdate) { - var params = "position=" + newPos.chrom+':'+newPos.start+'-'+newPos.end; + var params = "db=" + getDb() + "&position=" + newPos.chrom+':'+newPos.start+'-'+newPos.end; imageV2.navigateInPlace(params, null, true); } else { genomePos.setByCoordinates(newPos.chrom, newPos.start, newPos.end); jQuery('body').css('cursor', 'wait'); document.TrackHeaderForm.submit(); } } } } else if (cmd === 'removeHighlight') { var highlights = hgTracks.highlight.split("|"); highlights.splice(rightClick.clickedHighlightIdx, 1); // splice = remove element from array hgTracks.highlight = highlights.join("|"); cart.setVarsObj({'highlight' : hgTracks.highlight}); @@ -3795,31 +3795,31 @@ return false; } // A function for the keyboard shortcuts "zoom to x bp" function zoomTo(zoomSize) { var flankSize = Math.floor(zoomSize/2); var posStr = genomePos.get(); posStr = posStr.replace("virt:", "multi:"); var pos = parsePosition(posStr); var mid = pos.start+(Math.floor((pos.end-pos.start)/2)); var newStart = Math.max(mid - flankSize, 0); var newEnd = mid + flankSize - 1; var newPos = genomePos.setByCoordinates(pos.chrom, newStart, newEnd); if (hgTracks.virtualSingleChrom && (newPos.search("multi:")===0)) newPos = genomePos.disguisePosition(newPosition); // DISGUISE? - imageV2.navigateInPlace("position="+newPos, null, true); + imageV2.navigateInPlace("db=" + getDb() + "&position="+newPos, null, true); } // A function for the keyboard shortcuts "highlight add/clear/new" function highlightCurrentPosition(mode) { var pos = genomePos.get(); if (mode=="new") dragSelect.highlightThisRegion(pos, false); else if (mode=="add") dragSelect.highlightThisRegion(pos, true); else { hgTracks.highlight = ""; var cartSettings = {'highlight': ""}; cart.setVarsObj(cartSettings); imageV2.drawHighlights(); } @@ -4632,60 +4632,63 @@ } } }, navigateButtonClick: function (ele) // called from hgTracks.c { // code to update just the imgTbl in response to navigation buttons (zoom-out etc.). if (imageV2.inPlaceUpdate) { var params = ele.name + "=" + ele.value; $(ele).prop('disabled', 'disabled'); // dinking navigation needs additional data if (ele.name === "hgt.dinkLL" || ele.name === "hgt.dinkLR") { params += "&dinkL=" + $("input[name='dinkL']").val(); } else if (ele.name === "hgt.dinkRL" || ele.name === "hgt.dinkRR") { params += "&dinkR=" + $("input[name='dinkR']").val(); } + if (ele.name !== "db") { + params += "&db=" + getDb(); + } imageV2.navigateInPlace(params, $(ele), false); return false; } else { return true; } }, updateButtonClick: function (ele) // UNUSED? { // code to update the imgTbl based on changes in the track controls. // This is currently experimental code and is dead in the main branch. if (imageV2.mapIsUpdateable) { var data = ""; $("select").each(function(index, o) { var cmd = $(this).val(); if (cmd === "hide") { if (hgTracks.trackDb[this.name]) { alert("Need to implement hide"); } } else { if ( ! hgTracks.trackDb[this.name] || cmd !== vis.enumOrder[hgTracks.trackDb[this.name].visibility]) { if (data.length > 0) { data = data + "&"; } data = data + this.name + "=" + cmd; } } }); if (data.length > 0) { - imageV2.navigateInPlace(data, null, false); + imageV2.navigateInPlace("db=" + getDb() + "&" + data, null, false); } return false; } else { return true; } }, navigateInPlace: function (params, disabledEle, keepCurrentTrackVisible) { // request an hgTracks image, using params // disabledEle is optional; this element will be enabled when update is complete // If keepCurrentTrackVisible is true, we try to maintain relative position of the item // under the mouse after the in-place update. // Tim thinks we should consider disabling all UI input while we are doing in-place update. // TODO: waitOnFuction? @@ -4846,79 +4849,79 @@ // every-time the back button is pressed, all track settings should persist (not go back). // What will occasionally fail is vis box state and group expansion state. This is because // the back-button goes to a browser cached page and then the image alone is updated. imageV2.history = window.History; // The 'statechange' function triggerd by the back-button. // Whenever the position changes, then use ajax-update to refetch the position imageV2.history.Adapter._bind(window, 'statechange',function(){ var prevDbPos = imageV2.history.getState().data.lastDbPos; var prevPos = imageV2.history.getState().data.position; var curDbPos = hgTracks.lastDbPos; if (prevDbPos && prevDbPos !== curDbPos) { // NOTE: this function is NOT called when backing past a full retrieval boundary genomePos.set(decodeURIComponent(prevPos)); - imageV2.navigateInPlace("" + prevDbPos, null, false); + imageV2.navigateInPlace("db=" + getDb() + "&" + prevDbPos, null, false); } }); // With history support it is best that most position changes will ajax-update the image // This ensures that the 'go' and 'refresh' button will do so unless the chrom changes. $("#goButton,input[value='refresh']").on("click", function () { var newPos = genomePos.get().replace(/,/g,''); if (newPos.length > 2000) { alert("Sorry, you cannot paste identifiers or sequences with more than 2000 characters into this box."); $('input[name="hgt.positionInput"]').val(""); return false; } var newDbPos = hgTracks.lastDbPos; if ( ! imageV2.manyTracks() ) { var newChrom = newPos.split(':')[0]; var oldChrom = genomePos.getOriginalPos().split(':')[0]; if (newChrom === oldChrom) { imageV2.markAsDirtyPage(); - imageV2.navigateInPlace("position=" + encodeURIComponent(newPos), null, false); + imageV2.navigateInPlace("db=" + getDb() + "&position=" + encodeURIComponent(newPos), null, false); window.scrollTo(0,0); return false; } } // If not just image update AND there are vis updates waiting... if (cart.updatesWaiting()) { var url = "../cgi-bin/hgTracks?position=" + newPos + "&" + cart.varsToUrlData({ 'db': getDb(), 'hgsid': getHgsid() }); window.location.assign(url); return false; } // redirect to hgBlat if the input looks like a DNA sequence // minimum length=19 so we do not accidentally redirect to hgBlat for a gene identifier // like ATG5 var dnaRe = new RegExp("^(>[^\n\r ]+[\n\r ]+)?(\\s*[actgnACTGN \n\r]{19,}\\s*)$"); if (dnaRe.test(newPos)) { var blatUrl = "hgBlat?type=BLAT%27s+guess&userSeq="+newPos; window.location.href = blatUrl; return false; } // helper functions for checking whether a plain chrom name was searched for term = encodeURIComponent(genomePos.get().replace(/^[\s]*/,'').replace(/[\s]*$/,'')); function onSuccess(jqXHR, textStatus) { if (jqXHR.chromName !== null) { imageV2.markAsDirtyPage(); - imageV2.navigateInPlace("position=" + encodeURIComponent(newPos), null, false); + imageV2.navigateInPlace("db=" + getDb() + "&position=" + encodeURIComponent(newPos), null, false); window.scrollTo(0,0); } else { window.location.assign("../cgi-bin/hgSearch?search=" + term + "&hgsid="+ getHgsid()); } } function onFail(jqXHR, textStatus) { window.location.assign("../cgi-bin/hgSearch?search=" + term + "&hgsid="+ getHgsid()); } // redirect to search disambiguation page if it looks like we didn't enter a regular position: var canonMatch = newPos.match(canonicalRangeExp); var gbrowserMatch = newPos.match(gbrowserRangeExp); var lengthMatch = newPos.match(lengthRangeExp); var bedMatch = newPos.match(bedRangeExp); var sqlMatch = newPos.match(sqlRangeExp);