fcb6dc8dfa166136193177c895ca181200850e4d
max
  Mon Jan 19 06:02:31 2026 -0800
changing superTrack TrackUi quite a bit. Removing dropdowns and
replacing them with buttons. Also adding buttons for setting all tracks
or all visible tracks to a visibility. While at it, making a change
to the js-query-library function (inversed the order of arguments) which was requested months ago by
Brian, but I forgot to make the change after code review. Also
shortening the "source data version" label to just "version". refs #36917.

I changed the library function
hTvDropDownClassVisOnlyAndExtra() rather than copying the code. This was
because I was hesitant to copy/paste all this code into a second
function, which would have been the only alternative, as the function
cannot be reused as-is. So I modified the function to return the list of
visibilities. It's never clear whether it's better to modify
functions or copy/paste code.
here, not breaking the function into smaller parts, so copy/pasting it, would risk
requiring more future copy/pasted code. But the risk is to break existing
tracks.

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 5cd03f48647..3bd55fa970a 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -887,98 +887,111 @@
     "dense",
     "squish",
     "pack",
     "full",
     };
 static int packIx[] = {tvHide,tvDense,tvSquish,tvPack,tvFull};
 if (canPack)
     cgiMakeDropListClassWithIdStyleAndJavascript(varName, id, pack, ArraySize(pack),
 					   pack[packIx[vis]], class, TV_DROPDOWN_STYLE,
 					   events);
 else
     cgiMakeDropListClassWithIdStyleAndJavascript(varName, id, noPack, ArraySize(noPack),
 					   noPack[vis], class, TV_DROPDOWN_STYLE, events);
 }
 
-void hTvDropDownClassVisOnlyAndExtra(char *varName, enum trackVisibility vis,
-				 boolean canPack, char *class, char *visOnly, struct slPair *events)
-// Make track visibility drop down for varName with style class, and potentially limited to visOnly
-{
 static char *denseOnly[] =
     {
     "hide",
     "dense",
+    NULL
     };
 static char *squishOnly[] =
     {
     "hide",
     "squish",
+    NULL
     };
 static char *packOnly[] =
     {
     "hide",
     "pack",
+    NULL
     };
 static char *fullOnly[] =
     {
     "hide",
     "full",
+    NULL
     };
 static char *noPack[] =
     {
     "hide",
     "dense",
     "full",
+    NULL
     };
 static char *pack[] =
     {
     "hide",
     "dense",
     "squish",
     "pack",
     "full",
+    NULL
     };
-static int packIx[] = {tvHide,tvDense,tvSquish,tvPack,tvFull};
+
+char ** hTvGetVizArr(enum trackVisibility vis, boolean canPack, char* visOnly) 
+/* return a NULL-terminated array of char* with possible track visibilities */
+{
 if (visOnly != NULL)
     {
-    int visIx = (vis > 0) ? 1 : 0;
     if (sameWord(visOnly,"dense"))
-	cgiMakeDropListClassWithStyleAndJavascript(varName, denseOnly, ArraySize(denseOnly),
-						   denseOnly[visIx],class,TV_DROPDOWN_STYLE, events);
+        return denseOnly;
     else if (sameWord(visOnly,"squish"))
-	cgiMakeDropListClassWithStyleAndJavascript(varName, squishOnly,
-						   ArraySize(squishOnly), squishOnly[visIx],
-						   class, TV_DROPDOWN_STYLE, events);
+        return squishOnly;
     else if (sameWord(visOnly,"pack"))
-	cgiMakeDropListClassWithStyleAndJavascript(varName, packOnly, ArraySize(packOnly),
-						   packOnly[visIx], class, TV_DROPDOWN_STYLE, events);
+        return packOnly;
     else if (sameWord(visOnly,"full"))
-	cgiMakeDropListClassWithStyleAndJavascript(varName, fullOnly, ArraySize(fullOnly),
-						   fullOnly[visIx], class, TV_DROPDOWN_STYLE, events);
+        return fullOnly;
     else /* default when not recognized */
-	cgiMakeDropListClassWithStyleAndJavascript(varName, denseOnly, ArraySize(denseOnly),
-						   denseOnly[visIx], class, TV_DROPDOWN_STYLE, events);
+        return denseOnly;
     }
 else
     {
     if (canPack)
-	cgiMakeDropListClassWithStyleAndJavascript(varName, pack, ArraySize(pack),
-						   pack[packIx[vis]], class, TV_DROPDOWN_STYLE, events);
+        return pack;
     else
-	cgiMakeDropListClassWithStyleAndJavascript(varName, noPack, ArraySize(noPack),
-						   noPack[vis], class, TV_DROPDOWN_STYLE, events);
+        return noPack;
+    }
 }
+
+void hTvDropDownClassVisOnlyAndExtra(char *varName, enum trackVisibility vis,
+				 boolean canPack, char *class, char *visOnly, struct slPair *events)
+// Make track visibility drop down for varName with style class, and potentially limited to visOnly
+{
+char** vizArr = hTvGetVizArr(vis, canPack, visOnly);
+int visIx = (vis > 0) ? 1 : 0;
+char* checked = vizArr[visIx];
+
+static int packIx[] = {tvHide,tvDense,tvSquish,tvPack,tvFull};
+if (visOnly && canPack)
+    checked = vizArr[packIx[vis]];
+
+int vizArrLen = arrNullLen(vizArr);
+
+cgiMakeDropListClassWithStyleAndJavascript(varName, vizArr, vizArrLen, checked, class,TV_DROPDOWN_STYLE, events);
 }
 
 void hideShowDropDownWithClassAndExtra(char *varName, char * id, boolean show, char *class, struct slPair *events)
 // Make hide/show dropdown for varName
 {
 static char *hideShow[] =
     {
     "hide",
     "show"
     };
 cgiMakeDropListClassWithIdStyleAndJavascript(varName, id, hideShow, ArraySize(hideShow),
 				       hideShow[show], class, TV_DROPDOWN_STYLE, events);
 }
 
 
@@ -10527,31 +10540,31 @@
 {
 char *version = checkDataVersion(database, tdb);
 
 if (version == NULL)
     {
     // try the hgFixed.trackVersion table
     struct trackVersion *trackVersion = getTrackVersion(database, tdb->track);
     // try trackVersion table with parent, for composites/superTracks
     if (trackVersion == NULL && tdb->parent != NULL)
         trackVersion = getTrackVersion(database, tdb->parent->track);
     if (trackVersion != NULL)
         version = trackVersion->version;
     }
 
 if (isNotEmpty(version))
-    printf("<B>Source data version:</B> %s <BR>\n", version);
+    printf("<B>Version:</B> %s <BR>\n", version);
 }
 
 void printRelatedTracks(char *database, struct hash *trackHash, struct trackDb *tdb, struct cart *cart)
 /* Maybe print a "related track" section */
 {
 if (trackHubDatabase(database))
     return;
 char *relatedTrackTable = cfgOptionDefault("db.relatedTrack","relatedTrack");
 struct sqlConnection *conn = hAllocConn(database);
 if (!sqlTableExists(conn, relatedTrackTable))
     {
     hFreeConn(&conn);
     return;
     }