2ed451a171f3939be436ccc3bf6f0800f9df2a3a
kate
  Fri Feb 21 17:41:17 2020 -0800
Implement collapsible panel with supertrack description, to appear at top of supertrack component track config page. refs #24948

diff --git src/hg/hgTrackUi/hgTrackUi.c src/hg/hgTrackUi/hgTrackUi.c
index 65b696f..e93ee24 100644
--- src/hg/hgTrackUi/hgTrackUi.c
+++ src/hg/hgTrackUi/hgTrackUi.c
@@ -3137,90 +3137,112 @@
     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);
     }
 
 if (tdb->parent)
     {
-    printf("This track is part of a super-track. "
-            "To configure the parent or sibling tracks, click a link below.");
+    printf("<i>This track is part of a super-track. "
+            "To configure the parent or sibling tracks, click a link below.</i>");
 
     // show super-track info
     struct trackDb *tdbParent = tdb->parent;
     printf("<p>");
     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 style='font-size:%d%%;'><a href='%s?%s=%s&c=%s&g=%s'"
-               " title='Configure parent track'>%s</a> Tracks</b>",
+               " title='Configure parent track'>%s tracks</b></a>",
                 strlen(tdb->longLabel) > 30 ? 133 : 200,
                 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);
 
     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><b><td>%s</td>\n", sibTdb->shortLabel);
-            printf("<td>%s</td></b></tr>\n", sibTdb->longLabel);
+            printf("<tr><td><b>%s</b></td>\n", sibTdb->shortLabel);
+            printf("<td>%s</td></tr>\n", sibTdb->longLabel);
             continue;
             }
         printf("<tr>");
-        //hPrintPennantIcon(sibTdb);
         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>");
+    printf("</table></p>");
+
+    // collapsed panel for Description
+    printf("<p><table>");
+    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 of this super-track, click the link above.</i>\n");
+    jsEndCollapsibleSection();
+    printf("</table></p>");
 
-// TODO:  Add collapsed panel for Description
+    //printf("</p><p>&nbsp;&nbsp;<b>+ Description</b>\n");
 
-    printf("</p><p>&nbsp;&nbsp;<b>+ Description</b>\n");
     printf("<hr>");
-    printf("</p>");
     }
 
 /* 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);
@@ -3248,31 +3270,31 @@
 	    {
 	    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") && !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)
         {
         // 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%%;'>"