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(" <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> </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(" <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)) {