f225bd9ef750fb706f2f14bd87e3512b43e23dc1
max
  Wed May 13 13:50:34 2020 -0700
Revert "adding a protease track to uniprot, refs #25192". I have no idea what happened here, looks like I typed git commit -a instead of git commit -m

This reverts commit db7c8abb6d7674bb26f579eabb58bc080ce76fdd.

diff --git src/hg/hgTrackUi/hgTrackUi.c src/hg/hgTrackUi/hgTrackUi.c
index d59e030..738c147 100644
--- src/hg/hgTrackUi/hgTrackUi.c
+++ src/hg/hgTrackUi/hgTrackUi.c
@@ -3076,30 +3076,126 @@
     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 showSupertrackInfo(struct trackDb *tdb)
+{
+// A bit of context when we're in hierarchy: parent description and sibling track list
+
+if (!tdb->parent)
+    return;
+
+// 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 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,
+               endsWith(grp->label," Tracks")?"":" tracks");
+        break;
+        }
+    }
+grpFreeList(&grps);
+
+// collapsed panel for Description
+
+printf("<p>");
+printf("<p><table>");  // required by jsCollapsible
+jsBeginCollapsibleSectionFontSize(cart, tdb->track, "superDescription", "Description", FALSE,
+                                        "medium");
+char *html = replaceChars(tdbParent->html, "<H", "<h");
+html = replaceChars(html, "</H", "</h");
+
+// remove Description header
+html = replaceChars(html, "<h2>Description</h2>", "");
+html = replaceChars(html, "<h3>Description</h3>", "");
+html = replaceChars(html, "<h1>Description</h1>", "");
+
+// remove everything after Description text
+char *end = stringIn("<h2>", html);
+if (!end)
+    end = stringIn("<h1>", html);
+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, "All tracks in this collection (%d)", 
+                    slCount(tdbParent->children));
+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))
+        {
+        printf("<tr><td><b>%s</b></td>\n", sibTdb->shortLabel);
+        printf("<td>%s</td></tr>\n", sibTdb->longLabel);
+        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>");
+}
+
 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"
@@ -3135,30 +3231,32 @@
             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);
         else
             safef(longLabel, sizeof(longLabel), "Ensembl Gene Predictions - %s", trackVersion->version);
         }
     else
@@ -3177,75 +3275,70 @@
 	}
     else
 	{
 	struct trackVersion *trackVersion = getTrackVersion(database, "ncbiRefSeq");
 	if ((trackVersion != NULL) && !isEmpty(trackVersion->version))
 	    {
 	    safef(longLabel, sizeof(longLabel), "%s - Annotation Release %s", tdb->longLabel, trackVersion->version);
 	    }
 	else
 	    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"))
+    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" : "");
+                tdb->longLabel, tdbIsSuper(tdb) ? " tracks" : "");
 
     }
+
+
 /* Print link for parent track */
 if (!ajax)
     {
-    if (tdb->parent)
-        {
-        char *encodedMapName = cgiEncode(tdb->parent->track);
-        printf("&nbsp;&nbsp;&nbsp;<B style='font-size:100%%;'>"
-               "Member of track group: "
-               "<A HREF=\"%s?%s=%s&c=%s&g=%s\" title='Link to parent track'>"
-               "<IMG height=12 src='../images/ab_up.gif'>%s</A></B>)",
-               hgTrackUiName(), cartSessionVarName(), cartSessionId(cart),
-               chromosome, encodedMapName, tdb->parent->shortLabel);
-        freeMem(encodedMapName);
-        }
-    /*else
+    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))
     {
@@ -3338,31 +3431,31 @@
     // NAVLINKS - For pages w/ matrix, add Description, Subtracks and Downloads links
     if (trackDbSetting(tdb, "dimensions")
     ||  (trackDbSetting(tdb, "wgEncode") && tdbIsComposite(tdb)))
         {
         printf("\n&nbsp;&nbsp;<span id='navDown' style='float:right; display:none;'>");
         if (trackDbSetting(tdb, "wgEncode") && isEncode2(database, tdb->track))
             {
             printf("<A TARGET=_BLANK HREF='../ENCODE/index.html' TITLE='ENCODE Portal'>ENCODE at UCSC</A>");
             printf("&nbsp;&nbsp;");
             makeDownloadsLink(database, tdb);
             }
         char *downArrow = "&dArr;";
         enum browserType browser = cgiBrowser();
         if (browser == btIE || browser == btFF)
             downArrow = "&darr;";
-        printf("&nbsp;&nbsp;<A HREF='#DISPLAY_SUBTRACKS' TITLE='Jump to subtracks section of "
+        printf("&nbsp;&nbsp;<A HREF='#DISPLAY_SUBTRACKS' TITLE='Jump to subtrack list section of "
                "page'>Subtracks%s</A>", downArrow);
         printf("&nbsp;&nbsp;<A HREF='#TRACK_HTML' TITLE='Jump to description section of page'>"
                "Description%s</A>", downArrow);
         if (trackDbSetting(tdb, "wgEncode") && isEncode2(database, tdb->track))
             {
             printf("&nbsp;&nbsp;<A HREF='#TRACK_CREDITS' TITLE='Jump to ENCODE lab contacts for this data'>"
                "Contact%s</A>", downArrow);
             }
         printf("&nbsp;</span>");
         }
     }
 if (!tdbIsSuperTrack(tdb) && !tdbIsComposite(tdb))
     puts("<BR>");
 
 if (tdbIsDownloadsOnly(tdb))             // Composites without tracks but with files to download
@@ -3519,44 +3612,59 @@
 else if (isHubTrack(track))
     {
     tdb = hubConnectAddHubForTrackAndFindTdb(database, track, &tdbList, trackHash);
     }
 else if (sameString(track, "hgPcrResult"))
     tdb = pcrResultFakeTdb();
 else
     {
     tdb = tdbForTrack(database, track,&tdbList);
     }
 if (tdb == NULL)
    {
    errAbort("Can't find %s in track database %s chromosome %s",
 	    track, database, chromosome);
    }
-char *title = (tdbIsSuper(tdb) ? "Super-track Settings" :
-               tdbIsDownloadsOnly(tdb) ? DOWNLOADS_ONLY_TITLE : "Track Settings");
 if(cartOptionalString(cart, "ajax"))
     {
     // html is going to be used w/n a dialog in hgTracks.js so serve up stripped down html
     // still need CSP2 header for security
     printf("%s", getCspMetaHeader());
     trackUi(tdb, tdbList, ct, TRUE);
     cartRemove(cart,"ajax");
     jsInlineFinish();
     }
 else
     {
-    cartWebStart(cart, database, "%s %s", tdb->shortLabel, title);
+    char title[1000];
+    if (tdb->parent)
+        {
+        safef(title, sizeof title, 
+                        // TODO: replace in-line styling with class
+                "<span style='background-color: #c3d4f4; "
+                    "padding-left: 10px; padding-right: 10px;"
+                    "margin-right: 10px; margin-left: -8px;'>"
+                       "%s</span> %s", 
+                tdb->parent->shortLabel, tdb->shortLabel);
+        }
+    else
+        safef(title, sizeof title, "%s", tdb->shortLabel);
+    char *titleEnd = (tdbIsSuper(tdb) ? "Tracks" :
+               tdbIsDownloadsOnly(tdb) ? DOWNLOADS_ONLY_TITLE : "Track Settings");
+    htmlNoEscape();     // allow HTML tags to format title blue bar (using short label)
+    cartWebStart(cart, database, "%s %s", title, titleEnd);
+    htmlDoEscape();
     trackUi(tdb, tdbList, ct, FALSE);
     printf("<BR>\n");
     jsonPrintGlobals();
     webEnd();
     }
 }
 
 char *excludeVars[] = { "submit", "Submit", "g", NULL, "ajax", NULL,};
 
 int main(int argc, char *argv[])
 /* Process command line. */
 {
 long enteredMainTime = clock1000();
 cgiSpoof(&argc, argv);
 cartEmptyShell(doMiddle, hUserCookie(), excludeVars, NULL);