7597f413c7812055e03a9dd5177432be2a827571
kate
  Thu May 7 08:59:01 2020 -0700
Remove second section, moving supertrack info into main section to simplify page. Expecting this to be final design (has hadded extensive UI review). refs #24948

diff --git src/hg/hgTrackUi/hgTrackUi.c src/hg/hgTrackUi/hgTrackUi.c
index 18f52b5..130710c 100644
--- src/hg/hgTrackUi/hgTrackUi.c
+++ src/hg/hgTrackUi/hgTrackUi.c
@@ -3076,97 +3076,43 @@
     struct dyString *dy = dyStringNew(1024);
     jsonDyStringPrint(dy, jsonGlobalsHash, "common", 0);
     jsInline(dy->string);
     dyStringFree(&dy);
     }
 }
 
 void jsonObjectAddGlobal(char *name, struct jsonElement *ele)
 /* Add json object to global hash */
 {
 if (jsonGlobalsHash == NULL)
     jsonGlobalsHash = newJsonObject(newHash(5));
 jsonObjectAdd(jsonGlobalsHash, name, ele);
 }
 
-void trackUi(struct trackDb *tdb, struct trackDb *tdbList, struct customTrack *ct, boolean ajax)
-/* Put up track-specific user interface. */
-{
-if (!ajax)
+void showSupertrackInfo(struct trackDb *tdb)
 {
-    jsIncludeFile("jquery.js", NULL);
-    webIncludeResourceFile("jquery-ui.css");
-    jsIncludeFile("jquery-ui.js", NULL);
-    jsIncludeFile("utils.js",NULL);
-    webIncludeResourceFile("spectrum.min.css");
-    jsIncludeFile("spectrum.min.js",NULL);
-    jsonObjectAddGlobal("track", newJsonString(tdb->track));
-    jsonObjectAddGlobal("db", newJsonString(database));
-    }
-#define RESET_TO_DEFAULTS "defaults"
-char setting[128];
+// A bit of context when we're in hierarchy: parent description and sibling track list
 
-// NOTE: Currently only composite multi-view tracks because
-// reset relies upon all cart vars following naming convention:
-//   {track}.{varName}...  ( One exception supported: {track}_sel ).
-
-if (trackDbLocalSetting(tdb, "container"))
-    {
-    /* For the moment, be a composite... */
-    tdbMarkAsComposite(tdb);
-    }
-if (ajax && cartOptionalString(cart, "descriptionOnly"))
-    {
-    //struct trackDb *tdbParent = tdbFillInAncestry(cartString(cart, "db"),tdb);
-    if (tdb->html != NULL && tdb->html[0] != 0)
-        puts(tdb->html);
-    else
-        {
-        struct trackDb *tdbParent = tdb->parent;
-        for (;tdbParent && (tdbParent->html == NULL || tdbParent->html[0] == 0);
-              tdbParent = tdbParent->parent )
-            ; // Get the first parent that has html
-        if (tdbParent != NULL && tdbParent->html != NULL && tdbParent->html[0])
-            {
-            printf("<h2 style='color:%s'>Retrieved from %s Track...</h2>\n",
-                   COLOR_DARKGREEN,tdbParent->shortLabel);
-            puts(tdbParent->html);
-            }
-        else
-            printf("<h2>No description found for: %s.</h2>",tdbParent?tdbParent->track:tdb->track);
-        }
-    cartRemove(cart,"descriptionOnly"); // This is a once only request and should be deleted
+if (!tdb->parent)
     return;
-    }
-if (tdbIsContainer(tdb))
-    {
-    safef(setting,sizeof(setting),"%s.%s",tdb->track,RESET_TO_DEFAULTS);
-    // NOTE: if you want track vis to not be reset, move to after vis dropdown
-    if (1 == cartUsualInt(cart, setting, 0))
-        cartRemoveAllForTdbAndChildren(cart,tdb);
-    else if (!ajax) // Overkill on !ajax, because ajax shouldn't be called for a composite
-        cartTdbTreeReshapeIfNeeded(cart,tdb);
-    }
 
-if (tdb->parent)
-    {
 // show super-track info
 struct trackDb *tdbParent = tdb->parent;
 if (trackDbSetting(tdbParent, "wgEncode"))
     printf("<A HREF='/ENCODE/index.html'><IMG style='vertical-align:middle;' "
            "width=100 src='/images/ENCODE_scaleup_logo.png'><A>");
-    printf("<b>Track grouping: <a href='%s?%s=%s&c=%s&g=%s'>%s </b></a>",
+printf("<b>Track collection: <a href='%s?%s=%s&c=%s&g=%s'>%s </b></a>",
             hgTrackUiName(), cartSessionVarName(), cartSessionId(cart),
             chromosome, cgiEncode(tdbParent->track), tdbParent->longLabel);
 
 // show group info
 struct grp *grp, *grps = hLoadGrps(database);
 for (grp = grps; grp != NULL; grp = grp->next)
     {
     if (sameString(grp->name, tdb->grp))
         {
         printf("&nbsp;&nbsp;<B style='font-size:100%%;'>"
                "(<A HREF=\"%s?%s=%s&c=%s&hgTracksConfigPage=configure"
                "&hgtgroup_%s_close=0#%sGroup\" title='%s tracks in track configuration "
                "page'><IMG height=12 src='../images/ab_up.gif'>All %s%s</A>)</B>",
                hgTracksName(), cartSessionVarName(), cartSessionId(cart), chromosome,
                tdb->grp, tdb->grp, grp->label, grp->label,
@@ -3197,55 +3143,112 @@
 if (!end)
     end = stringIn("<h3>", html);
 if (end)
     *end = '\0';
 printf("%s", html);
 printf("<p><i>To view the full description, click "
             "<a target='_blank' href='%s?%s=%s&c=%s&g=%s#TRACK_HTML'>here.</i></a>\n",
                     hgTrackUiName(), cartSessionVarName(), cartSessionId(cart),
                     chromosome, cgiEncode(tdbParent->track));
 jsEndCollapsibleSection();
 printf("</table>"); // required by jsCollapsible
 
 // collapsed panel for list of other tracks in the supertrack
 
 char listTitle[1000];
-    safef(listTitle, sizeof listTitle, "Other tracks in this grouping (%d)", 
+safef(listTitle, sizeof listTitle, "Other tracks in this collection (%d)", 
                     slCount(tdbParent->children)-1);
 printf("<table>");  // required by jsCollapsible
 jsBeginCollapsibleSectionFontSize(cart, tdb->track, "superMembers", listTitle, FALSE, "medium");
 printf("<table cellpadding='2' style='margin-left: 50px';>");
 struct slRef *childRef;
 tdbRefSortPrioritiesFromCart(cart, &tdbParent->children);
 for (childRef = tdbParent->children; childRef != NULL; childRef = childRef->next)
     {
     struct trackDb *sibTdb = childRef->val;
     if (sameString(sibTdb->track, tdb->track))
         continue;
     printf("<tr>");
     printf("<td><a href='%s?%s=%s&c=%s&g=%s'>%s</a>&nbsp;</td>", 
                 tdbIsDownloadsOnly(sibTdb) ? hgFileUiName(): hTrackUiForTrack(sibTdb->track),
                 cartSessionVarName(), cartSessionId(cart), chromosome, cgiEncode(sibTdb->track), 
                 sibTdb->shortLabel);
     printf("<td>%s</td></tr>\n", sibTdb->longLabel);
     }
 printf("</table>");
 jsEndCollapsibleSection();
 printf("</table>"); // required by jsCollapsible
 printf("</p>");
+}
 
-    printf("<hr>");
+void trackUi(struct trackDb *tdb, struct trackDb *tdbList, struct customTrack *ct, boolean ajax)
+/* Put up track-specific user interface. */
+{
+if (!ajax)
+    {
+    jsIncludeFile("jquery.js", NULL);
+    webIncludeResourceFile("jquery-ui.css");
+    jsIncludeFile("jquery-ui.js", NULL);
+    jsIncludeFile("utils.js",NULL);
+    webIncludeResourceFile("spectrum.min.css");
+    jsIncludeFile("spectrum.min.js",NULL);
+    jsonObjectAddGlobal("track", newJsonString(tdb->track));
+    jsonObjectAddGlobal("db", newJsonString(database));
+    }
+#define RESET_TO_DEFAULTS "defaults"
+char setting[128];
+
+// NOTE: Currently only composite multi-view tracks because
+// reset relies upon all cart vars following naming convention:
+//   {track}.{varName}...  ( One exception supported: {track}_sel ).
+
+if (trackDbLocalSetting(tdb, "container"))
+    {
+    /* For the moment, be a composite... */
+    tdbMarkAsComposite(tdb);
+    }
+if (ajax && cartOptionalString(cart, "descriptionOnly"))
+    {
+    //struct trackDb *tdbParent = tdbFillInAncestry(cartString(cart, "db"),tdb);
+    if (tdb->html != NULL && tdb->html[0] != 0)
+        puts(tdb->html);
+    else
+        {
+        struct trackDb *tdbParent = tdb->parent;
+        for (;tdbParent && (tdbParent->html == NULL || tdbParent->html[0] == 0);
+              tdbParent = tdbParent->parent )
+            ; // Get the first parent that has html
+        if (tdbParent != NULL && tdbParent->html != NULL && tdbParent->html[0])
+            {
+            printf("<h2 style='color:%s'>Retrieved from %s Track...</h2>\n",
+                   COLOR_DARKGREEN,tdbParent->shortLabel);
+            puts(tdbParent->html);
+            }
+        else
+            printf("<h2>No description found for: %s.</h2>",tdbParent?tdbParent->track:tdb->track);
+        }
+    cartRemove(cart,"descriptionOnly"); // This is a once only request and should be deleted
+    return;
+    }
+if (tdbIsContainer(tdb))
+    {
+    safef(setting,sizeof(setting),"%s.%s",tdb->track,RESET_TO_DEFAULTS);
+    // NOTE: if you want track vis to not be reset, move to after vis dropdown
+    if (1 == cartUsualInt(cart, setting, 0))
+        cartRemoveAllForTdbAndChildren(cart,tdb);
+    else if (!ajax) // Overkill on !ajax, because ajax shouldn't be called for a composite
+        cartTdbTreeReshapeIfNeeded(cart,tdb);
     }
 
 /* track configuration form */
 
 printf("<FORM ACTION=\"%s\" NAME=\""MAIN_FORM"\" METHOD=%s>\n\n",
        hgTracksName(), cartUsualString(cart, "formMethod", "POST"));
 cartSaveSession(cart);
 if (sameWord(tdb->track,"ensGene"))
     {
     char longLabel[256];
     struct trackVersion *trackVersion = getTrackVersion(database, tdb->track);
     if ((trackVersion != NULL) && !isEmpty(trackVersion->version))
         {
         if (!isEmpty(trackVersion->dateReference) && differentWord("current", trackVersion->dateReference))
             safef(longLabel, sizeof(longLabel), "Ensembl Gene Predictions - archive %s - %s", trackVersion->version, trackVersion->dateReference);
@@ -3277,57 +3280,61 @@
 	    safef(longLabel, sizeof(longLabel), "%s", tdb->longLabel);
 	}
     printf("<B style='font-size:200%%;'>%s%s</B>\n", longLabel, tdbIsSuper(tdb) ? " Tracks" : "");
     }
 else
     {
     if (trackDbSetting(tdb, "wgEncode") && !tdb->parent)
         printf("<A HREF='/ENCODE/index.html'><IMG style='vertical-align:middle;' "
                "width=100 src='/images/ENCODE_scaleup_logo.png'><A>");
     // set large title font size, but less so for long labels to minimize wrap
     printf("<B style='font-size:%d%%;'>%s%s</B>\n", strlen(tdb->longLabel) > 30 ? 133 : 200,
                 tdb->longLabel, tdbIsSuper(tdb) ? " tracks" : "");
 
     }
 
+
 /* Print link for parent track */
 if (!ajax)
     {
     if (!tdb->parent)
         {
         // show group info
         struct grp *grp, *grps = hLoadGrps(database);
         for (grp = grps; grp != NULL; grp = grp->next)
             {
             if (sameString(grp->name,tdb->grp))
                 {
                 printf("&nbsp;&nbsp;<B style='font-size:100%%;'>"
                        "(<A HREF=\"%s?%s=%s&c=%s&hgTracksConfigPage=configure"
                        "&hgtgroup_%s_close=0#%sGroup\" title='%s tracks in track configuration "
                        "page'><IMG height=12 src='../images/ab_up.gif'>All %s%s</A>)</B>",
                        hgTracksName(), cartSessionVarName(), cartSessionId(cart),chromosome,
                        tdb->grp,tdb->grp,grp->label,grp->label,
                        endsWith(grp->label," Tracks")?"":" tracks");
                 break;
                 }
             }
         grpFreeList(&grps);
         }
 
     }
 puts("<BR><BR>");
 
+if (tdb->parent)
+    showSupertrackInfo(tdb);
+
 if (ct && sameString(tdb->type, "maf"))
     tdb->canPack = TRUE;
 else if (sameString(tdb->track, WIKI_TRACK_TABLE))
     // special case wikiTrack (there's no trackDb entry); fixes redmine 2395
     tdb->canPack = TRUE;
 else if (sameString(tdb->type, "halSnake"))
     tdb->canPack = TRUE;
 else if (!startsWith("bigWig", tdb->type) && startsWith("big", tdb->type))
     tdb->canPack = TRUE;
 else if (sameString(tdb->type, "bigNarrowPeak"))
     tdb->canPack = TRUE;
 
 // Don't bother with vis controls for downloadsOnly
 if (!tdbIsDownloadsOnly(tdb))
     {