b8b56383b460baeded0eb044c5c50998564f4b9d
jcasper
Sun Jan 25 22:35:48 2026 -0800
Initial pass at making data types optional for the new faceted
composite UI. refs #36320
diff --git src/hg/cartDump/cartDump.c src/hg/cartDump/cartDump.c
index 186ca36adc9..c74cc4544ea 100644
--- src/hg/cartDump/cartDump.c
+++ src/hg/cartDump/cartDump.c
@@ -1,173 +1,190 @@
/* cartDump - Dump contents of cart. */
/* Copyright (C) 2014 The Regents of the University of California
* See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */
#include "common.h"
#include "linefile.h"
#include "hash.h"
#include "cheapcgi.h"
#include "cart.h"
#include "hdb.h"
#include "jsHelper.h"
#include "hui.h"
#include "botDelay.h"
/* for earlyBotCheck() function at the beginning of main() */
#define delayFraction 1.0 /* standard penalty for most CGIs */
static boolean issueBotWarning = FALSE;
#define CART_DUMP_REMOVE_VAR "n/a"
struct hash *oldVars = NULL;
void doMiddle(struct cart *cart)
/* cartDump - Dump contents of cart. */
{
#define MATCH_VAR "match"
char *vName = "cartDump.varName";
char *vVal = "cartDump.newValue";
char *mName = "cartDump.metaDataId";
char *wildcard;
boolean asTable = cartVarExists(cart,CART_DUMP_AS_TABLE);
if (cgiVarExists("submit"))
{
char *varName = cgiOptionalString(vName);
char *newValue = cgiOptionalString(vVal);
if (isNotEmpty(varName) && isNotEmpty(newValue))
{
varName = skipLeadingSpaces(varName);
eraseTrailingSpaces(varName);
if (sameString(newValue, CART_DUMP_REMOVE_VAR) || sameString(newValue, CART_VAR_EMPTY))
cartRemove(cart, varName);
else
cartSetString(cart, varName, newValue);
}
cartRemove(cart, vVal);
cartRemove(cart, "submit");
}
if (cgiVarExists("noDisplay"))
{
// update cart vars for a track, called by hgTracks.js and ajax.js
// not useful to hackers, so there is no need to call bottleneck.
char *trackName = cgiOptionalString("g");
if (trackName != NULL && hashNumEntries(oldVars) > 0)
{
char *db = cartString(cart, "db");
struct trackDb *tdb = hTrackDbForTrack(db, trackName);
if (tdb != NULL && tdbIsComposite(tdb))
{
struct lm *lm = lmInit(0);
cartTdbTreeCleanupOverrides(tdb,cart,oldVars,lm);
lmCleanup(&lm);
}
}
if (cgiVarExists(mName))
{
char *mdid = cgiOptionalString(mName);
char mdid_de[1024], mdid_dt[1024];
safef(mdid_de, sizeof(mdid_de), "%s.de", mdid);
safef(mdid_dt, sizeof(mdid_dt), "%s.dt", mdid);
struct slName *de_list = cgiStringList(mdid_de);
struct slName *dt_list = cgiStringList(mdid_dt);
// This component should change. Erasing settings doesn't preserve any user selections
// (like bigWig display changes) and doesn't work at all for tracks that are on by default.
char wc_mdid[1024];
safef(wc_mdid, sizeof(wc_mdid), "*_%s", mdid);
cartRemoveLike(cart, wc_mdid);
cartRemovePrefix(cart, mdid);
+
+ // Check for empty-string sentinel: means no data type suffix
+ boolean noDataTypes = (dt_list != NULL &&
+ dt_list->name[0] == '\0' &&
+ dt_list->next == NULL);
+
char subtrackSetting[1024];
for (struct slName *de_itr = de_list; de_itr; de_itr = de_itr->next)
+ {
+ if (noDataTypes)
+ {
+ // No data type suffix - use simpler track names
+ safef(subtrackSetting, sizeof(subtrackSetting), "%s_%s_sel", mdid, de_itr->name);
+ cartSetString(cart, subtrackSetting, "1");
+ safef(subtrackSetting, sizeof(subtrackSetting), "%s_%s", mdid, de_itr->name);
+ cartSetString(cart, subtrackSetting, "1");
+ }
+ else
{
struct slName *dt_itr = NULL;
for (dt_itr = dt_list; dt_itr; dt_itr = dt_itr->next)
{
safef(subtrackSetting, sizeof(subtrackSetting), "%s_%s_%s_sel", mdid, de_itr->name, dt_itr->name);
cartSetString(cart, subtrackSetting, "1");
safef(subtrackSetting, sizeof(subtrackSetting), "%s_%s_%s", mdid, de_itr->name, dt_itr->name);
cartSetString(cart, subtrackSetting, "1");
}
}
+ }
cartRemove(cart, mName);
cartRemove(cart, mdid_de);
cartRemove(cart, mdid_dt);
}
return;
}
// To discourage hacking, call bottleneck
if (issueBotWarning)
{
char *ip = getenv("REMOTE_ADDR");
botDelayMessage(ip, botDelayMillis);
}
if (asTable)
{
jsIncludeFile("jquery.js",NULL); // required by utils.js
jsIncludeFile("utils.js",NULL);
jsIncludeFile("ajax.js",NULL);
printf("Show as plain text.
",CART_DUMP_AS_TABLE);
printf("
");
wildcard = cgiOptionalString(MATCH_VAR);
if (wildcard)
cartDumpLike(cart, wildcard);
else
cartDump(cart);
printf("");
if (!asTable)
{
printf("\n");
}
printf("Cookies passed to %s:
\n%s\n