94041c12e043016875ebd340568bda0ccaf122f6
lrnassar
  Wed Jul 8 13:53:22 2026 -0700
Add db= to cross-CGI hgTracks/hgTrackUi/hgc links to prevent wrong-assembly errors. refs #37840

Completes the incomplete work from #26892: links from the browser to a different
CGI omitted db=, so the target CGI fell back to the cart's db (often wrong),
producing "Can't find <track> in track database <db>" errors and broken shared
links. Adds the current-assembly db to link builders across hgTracks
(chromGraphTrack, expRatioTracks, config ruler and per-track configure links,
variation), hgVai, hgFileUi, hgGtexTrackSettings, hgBlat, hgGene, hgNear, the
barChart/GTEx faceted UI (facetedBar, barChartUi, gtexUi), and the hgTrackUi
group-configure link.

diff --git src/hg/lib/barChartUi.c src/hg/lib/barChartUi.c
index d5899209c6c..0347f738c8b 100644
--- src/hg/lib/barChartUi.c
+++ src/hg/lib/barChartUi.c
@@ -445,44 +445,44 @@
 
 void barChartFacetedUi(char *database, struct cart *cart, struct trackDb *tdb, char *track, 
                         char *title, boolean boxed)
 /* Bar chart track type that has an associated facets tables */
 {
 puts("<br>");
 barChartUiLogTransform(cart, track, tdb);
 puts("&nbsp;&nbsp;");
 barChartUiViewLimits(cart, track, tdb);
 
 if (isPopup)
     {
     char *categoryLabel =  trackDbSettingClosestToHomeOrDefault(tdb,
                     BAR_CHART_CATEGORY_LABEL, BAR_CHART_CATEGORY_LABEL_DEFAULT);
     printf("<div><b>%s:</b>\n", categoryLabel);
-    printf("<a href='%s?g=%s'><button type='button'>Change</button><a>",
-                hTrackUiForTrack(track), track);
+    printf("<a href='%s?db=%s&g=%s'><button type='button'>Change</button><a>",
+                hTrackUiForTrack(track), database, track);
     }
 else
     {
     char *facets = trackDbSetting(tdb, "barChartFacets");
     char *statsFile = hReplaceGbdb(trackDbRequiredSetting(tdb, "barChartStatsUrl"));
 
     /* Write html to make white background */
     hInsideStyleToWhite();
 
     /* Set up url that has enough context to get back to us.  */
     struct dyString *returnUrl = dyStringNew(0);
-    dyStringPrintf(returnUrl, "../cgi-bin/hgTrackUi?g=%s", track);
+    dyStringPrintf(returnUrl, "../cgi-bin/hgTrackUi?db=%s&g=%s", database, track);
     dyStringPrintf(returnUrl, "&%s", cartSidUrlString(cart));
 
     /* Load up table from tsv file */
     char *requiredStatsFields[] = {"count",};
     struct fieldedTable *table = fieldedTableFromTabFile(statsFile, statsFile, 
         requiredStatsFields, ArraySize(requiredStatsFields));
 
     /* Update facet selections from users input if any and get selected part of table */
     struct facetedTable *facTab = facetedTableFromTable(table, tdb->track, facets);
     facTab->mergeFacetsOk = trackDbSettingOn(tdb, "barChartMerge");
     facetedTableUpdateOnClick(facTab, cart);
     struct facetField **selectedFf = NULL;
     struct fieldedTable *selected = facetedTableSelect(facTab, cart, &selectedFf);
 
     /* Add wrapper function(s) */