b75bbe708bc810fc1cfbd7e579940ba1c7b0f39f
tdreszer
Fri Dec 10 09:32:37 2010 -0800
Added support for 'downloadsOnly' style tracks which will call fileDb APIs to present downloadable files from cgi.
diff --git src/hg/hgTrackUi/hgTrackUi.c src/hg/hgTrackUi/hgTrackUi.c
index 1a6990e..9a56277 100644
--- src/hg/hgTrackUi/hgTrackUi.c
+++ src/hg/hgTrackUi/hgTrackUi.c
@@ -1,27 +1,28 @@
#include "common.h"
#include "linefile.h"
#include "hash.h"
#include "cheapcgi.h"
#include "htmshell.h"
#include "jksql.h"
#include "jsHelper.h"
#include "trackDb.h"
#include "hgTrackUi.h"
#include "hdb.h"
#include "hCommon.h"
#include "hui.h"
+#include "fileUi.h"
#include "ldUi.h"
#include "snpUi.h"
#include "snp125Ui.h"
#include "snp125.h"
#include "sample.h"
#include "wiggle.h"
#include "hgMaf.h"
#include "obscure.h"
#include "chainCart.h"
#include "chainDb.h"
#include "gvUi.h"
#include "oregannoUi.h"
#include "chromGraph.h"
#include "hgConfig.h"
#include "customTrack.h"
@@ -2147,45 +2148,51 @@
sqlFreeResult(&sr);
jsMakeCheckboxGroupSetClearButton(cartVarName, TRUE);
jsMakeCheckboxGroupSetClearButton(cartVarName, FALSE);
cgiMakeCheckboxGroupWithVals(cartVarName, labelArr, valueArr, refCount, checked, 4);
hFreeConn(&conn);
}
void superTrackUi(struct trackDb *superTdb)
/* List tracks in this collection, with visibility controls and UI links */
{
struct trackDb *tdb;
printf("
");
tdbSortPrioritiesFromCart(cart, &superTdb->subtracks);
for (tdb = superTdb->subtracks; tdb != NULL; tdb = tdb->next)
{
- if (!hTableOrSplitExists(database, tdb->table) && tdb->subtracks != NULL &&
- trackDbLocalSetting(tdb, "compositeTrack") == NULL)
+ if (!hTableOrSplitExists(database, tdb->table)
+ && tdb->subtracks != NULL && trackDbLocalSetting(tdb, "compositeTrack") == NULL
+ && !sameWord(tdb->type,"downloadsOnly"))
// NOTE: tdb if composite, is not yet populated with it's own subtracks!
continue;
printf("");
printf("%s | ",
hgTrackUiName(), cartSessionVarName(), cartSessionId(cart),
chromosome, cgiEncode(tdb->track), tdb->shortLabel);
printf("");
+ if (sameWord(tdb->type,"downloadsOnly"))
+ printf(" ");
+ else
+ {
enum trackVisibility tv =
hTvFromString(cartUsualString(cart, tdb->track,
hStringFromTv(tdb->visibility)));
hTvDropDownClassVisOnly(tdb->track, tv, tdb->canPack,
tv == tvHide ? "hiddenText" : "normalText",
trackDbSetting(tdb, "onlyVisibility"));
+ }
printf(" | %s", tdb->longLabel);
char *dataVersion = trackDbSetting(tdb, "dataVersion");
if (dataVersion)
printf("  %s", dataVersion);
printf(" |
");
}
printf("
");
}
void specificUi(struct trackDb *tdb, struct customTrack *ct, boolean ajax)
/* Draw track specific parts of UI. */
{
char *track = tdb->track;
if (sameString(track, "stsMap"))
@@ -2493,58 +2500,62 @@
/* Print link for parent track */
struct trackDb *parentTdb = tdb->parent;
if (parentTdb && !ajax)
{
char *encodedMapName = cgiEncode(parentTdb->track);
printf(" (
%s)",
hgTrackUiName(), cartSessionVarName(), cartSessionId(cart),
chromosome, encodedMapName, parentTdb->shortLabel);
freeMem(encodedMapName);
}
puts("
");
if (ct && sameString(tdb->type, "maf"))
tdb->canPack = TRUE;
+// Don't bother with vis controls for downloadsOnly
+if (!sameWord(tdb->type,"downloadsOnly"))
+ {
/* Display visibility menu */
if (tdbIsComposite(tdb) && multViewCount(tdb) > 0)
printf("Maximum display mode: ");
else
printf("Display mode: ");
if (tdbIsSuper(tdb))
{
/* This is a supertrack -- load its members and show hide/show dropdown */
hTrackDbLoadSuper(database, tdb);
superTrackDropDown(cart, tdb, 1);
}
else
{
/* normal visibility control dropdown */
enum trackVisibility vis = tdb->visibility;
boolean canPack = tdb->canPack;
if (ajax)
{
vis = tdbVisLimitedByAncestry(cart, tdb, TRUE); // ajax popups should show currently inherited visability
if (tdbIsCompositeChild(tdb))
canPack = TRUE;
}
else
vis = hTvFromString(cartUsualString(cart,tdb->track, hStringFromTv(vis))); // But hgTrackUi page should show local vis
hTvDropDownClassVisOnlyAndExtra(tdb->track,vis,
canPack, "normalText visDD", trackDbSetting(tdb, "onlyVisibility"),
(tdb->parent != NULL ?"onchange='return visTriggersHiddenSelect(this);'":NULL));
}
+ }
if (!ajax)
{
printf(" ");
cgiMakeButton("Submit", "Submit");
if(tdbIsComposite(tdb))
printf("\n Reset to defaults\n",setting);
}
if (ct)
{
puts(" ");
cgiMakeButton(CT_DO_REMOVE_VAR, "Remove custom track");
cgiMakeHiddenVar(CT_SELECTED_TABLE_VAR, tdb->track);
puts(" ");
@@ -2570,30 +2581,60 @@
{
printf(" ");
makeDownloadsLink(database, tdb, trackHash);
}
char *downArrow = "⇓";
enum browserType browser = cgiBrowser();
if (browser == btIE || browser == btFF)
downArrow = "↓";
printf(" Subtracks%s",downArrow);
printf(" Description%s",downArrow);
printf(" ");
}
}
printf("
\n");
+// FIXME: Do something here for downloadOnly tracks.
+if (sameWord(tdb->type,"downloadsOnly"))
+ {
+ filesDownloadUi(database,cart,tdb);
+ // FIXME: To be written: hgTracUi cgi which is downloads page.
+ // Should be lib code and 2 cgis:
+ // hgTrackUi when we have downloads ONLY, except for this on trackDb entry to point us there
+ // hgFilesUi when we have composite tracks AND download filess, so that hgTrackUi handles composite and offers link to hgFilesUi for downloads
+ /*
+ struct fileDb, contains mdbObj struct
+ get composite name (in trackDb) from cart: g=wgEncodeBroadHistone
+ // Use composite name to aquire list of mdbObjs where composite= and fileName exists
+ // Use trackDb settings to get at html description, long and short labels
+ // Acquire composite level setting for:
+ // experiment defining variables?
+ // major sort order?
+ // filterComposite stuff? Or is this defined in trackDb for pseudo-composite?
+ // Sort list of mdbObjs?
+ // Weed list of mdbObjects via fileExists.
+ // Get preamble from dir
+ // Make any selection controls (filterBoxes) Do we want a matrix?
+ // Make table class=sortable
+ // Get html from trackDb
+ // Recommend different color background to get the point across that these are files, not tracks
+
+ */
+ //makeDownloadsLink(database, tdb, trackHash);
+ //extraUiLinks(database,tdb, trackHash);
+ }
+else
specificUi(tdb, ct, ajax);
puts("");
if (ct && !ajax)
{
/* hidden form for custom tracks CGI */
printf("\n");
}
if (ajax)
return;
@@ -2670,65 +2711,67 @@
{
return trackDbForPseudoTrack(RULER_TRACK_NAME,
RULER_TRACK_LABEL, RULER_TRACK_LONGLABEL, tvFull, FALSE);
}
struct trackDb *trackDbForOligoMatch()
/* Create a trackDb entry for the oligo matcher pseudo-track. */
{
return trackDbForPseudoTrack(OLIGO_MATCH_TRACK_NAME,
OLIGO_MATCH_TRACK_LABEL, OLIGO_MATCH_TRACK_LONGLABEL, tvHide, TRUE);
}
void doMiddle(struct cart *theCart)
/* Write body of web page. */
{
+struct trackDb *tdbList = NULL;
struct trackDb *tdb = NULL;
char *track;
struct customTrack *ct = NULL, *ctList = NULL;
char *ignored;
cart = theCart;
track = cartString(cart, "g");
getDbAndGenome(cart, &database, &ignored, NULL);
chromosome = cartUsualString(cart, "c", hDefaultChrom(database));
-trackHash = makeTrackHash(database, chromosome);
+
+trackHash = trackHashMakeWithComposites(database,chromosome,&tdbList,FALSE);
if (sameWord(track, WIKI_TRACK_TABLE))
tdb = trackDbForWikiTrack();
else if (sameWord(track, RULER_TRACK_NAME))
/* special handling -- it's not a full-fledged track */
tdb = trackDbForRuler();
else if (sameWord(track, OLIGO_MATCH_TRACK_NAME))
tdb = trackDbForOligoMatch();
else if (sameWord(track, CUTTERS_TRACK_NAME))
tdb = trackDbForPseudoTrack(CUTTERS_TRACK_NAME, CUTTERS_TRACK_LABEL, CUTTERS_TRACK_LONGLABEL, tvHide, TRUE);
else if (isCustomTrack(track))
{
ctList = customTracksParseCart(database, cart, NULL, NULL);
for (ct = ctList; ct != NULL; ct = ct->next)
{
if (sameString(track, ct->tdb->track))
{
tdb = ct->tdb;
break;
}
}
}
else if (sameString(track, "hgPcrResult"))
tdb = pcrResultFakeTdb();
else
{
- tdb = hTrackDbForTrack(database, track);
+ tdb = tdbForTrack(database, track,&tdbList);
}
if (tdb == NULL)
{
uglyAbort("Can't find %s in track database %s chromosome %s. TrackHash has %d els",
track, database, chromosome, trackHash->elCount);
errAbort("Can't find %s in track database %s chromosome %s",
track, database, chromosome);
}
char *super = trackDbGetSupertrackName(tdb);
if (super)
{
/* configured as a supertrack member in trackDb */
if (tdb->parent)
{
/* the supertrack is also configured, so use supertrack defaults */