0d1ffc7e1c162f115ffa1622a70535b99c465ee0 kate Tue Jan 20 18:12:40 2015 -0800 Add inputFieldMetaTables setting to trackDb. It provides a way to add meta tables to non-composites (same functionality as subGroupMetaTables setting). Used in details of DNase clusters, to replace cv.ra and metaDb. refs #14353 diff --git src/hg/lib/hui.c src/hg/lib/hui.c index e4f8e89..2fc793e 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -4174,76 +4174,97 @@ else printf("    ",columnCount); // Count of subtracks is filled in by javascript. if (subCount > 5) printf("\n"); // Restriction policy needs a link if (restrictions && sortOrder != NULL) printf("Restriction Policy", ENCODE_DATA_RELEASE_POLICY); printf("\n"); } } + /********************/ -/* Metadata for subgroups */ +/* Basic metadata for subgroups and input fields */ -struct meta { +struct metaBasic { + struct metaBasic *next; char *term; char *description; char *url; }; -static struct hash *metaForAllSubGroupsGet(struct trackDb *parentTdb, struct cart *cart) -/* Get description and URL for all subgroupMetaTables. Returns a hash of hashes */ +char *metaVocabLink(struct hash *metaFieldHash, char *term, char *title) +/* Make an anchor with mouseover containing description and link if present */ +{ +struct metaBasic *meta = hashFindVal(metaFieldHash, term); +if (meta == NULL) + return NULL; +struct dyString *ds = dyStringNew(0); +if (meta->url == NULL || strlen(meta->url) == 0) + dyStringPrintf(ds, "%s", + meta->description, term); +else + dyStringPrintf(ds, "%s\n", + meta->description, meta->url, term); +return dyStringCannibalize(&ds); +} + +struct hash *metaBasicFromSetting(struct trackDb *parentTdb, struct cart *cart, char *setting) +/* Get description and URL for all metaTables. Returns a hash of hashes */ { -char *setting = trackDbSetting(parentTdb, "subGroupMetaTables"); -if (!setting) +if (differentString(setting, "subGroupMetaTables") && + differentString(setting, "inputFieldMetaTables")) return NULL; -struct slPair *metaTables = slPairFromString(setting); +char *spec = trackDbSetting(parentTdb, setting); +if (!spec) + return NULL; +struct slPair *metaTables = slPairFromString(spec); struct hash *tableHash = hashNew(0); struct slPair *metaTable; struct sqlResult *sr; char **row; char query[256]; char *database = cartString(cart, "db"); char *db = database; for (metaTable = metaTables; metaTable != NULL; metaTable = metaTables->next) { char *tableName = chopPrefix(cloneString(metaTable->val)); if (differentString(tableName, metaTable->val)) { chopSuffix(metaTable->val); db = metaTable->val; } struct sqlConnection *conn = hAllocConn(db); boolean hasUrl = FALSE; struct hash *subgroupHash = hashNew(0); hashAdd(tableHash, metaTable->name, subgroupHash); if (hHasField(db, tableName, "url")) { sqlSafef(query, sizeof(query), "select term, description, url from %s", tableName); hasUrl = TRUE; } else sqlSafef(query, sizeof(query), "select term, description from %s", tableName); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { - struct meta *meta = NULL; + struct metaBasic *meta = NULL; AllocVar(meta); meta->term = cloneString(row[0]); meta->description = cloneString(row[1]); if (hasUrl) meta->url = cloneString(row[2]); hashAdd(subgroupHash, meta->term, meta); } sqlFreeResult(&sr); hFreeConn(&conn); } return tableHash; } static void printSubtrackTableBody(struct trackDb *parentTdb, struct slRef *subtrackRefList, struct subtrackConfigSettings *settings, struct cart *cart) @@ -4263,31 +4284,31 @@ { // preserves user's prev sort/drags preSorted = tdbRefSortPrioritiesFromCart(cart, &subtrackRefList); printf("\n", (sortOrder != NULL ? "sortable " : "") ); } else { slSort(&subtrackRefList, trackDbRefCmp); // straight from trackDb.ra preSorted = TRUE; puts(""); } // Finally the big "for loop" to list each subtrack as a table row. printf("\n\n"); membersForAll_t* membersForAll = membersForAllSubGroupsGet(parentTdb,NULL); -struct hash *subgroupMetaHash = metaForAllSubGroupsGet(parentTdb, cart); +struct hash *subgroupMetaHash = metaBasicFromSetting(parentTdb, cart, "subGroupMetaTables"); struct slRef *subtrackRef; /* Color handling ?? */ //char *colors[2] = { COLOR_BG_DEFAULT, // COLOR_BG_ALTDEFAULT }; char *colors[2] = { "bgLevel1", "bgLevel1" }; int colorIx = settings->bgColorIx; for (subtrackRef = subtrackRefList; subtrackRef != NULL; subtrackRef = subtrackRef->next) { struct trackDb *subtrack = subtrackRef->val; int ix; // Determine whether subtrack is checked, visible, configurable, has group membership, etc. @@ -4444,52 +4465,38 @@ ix = stringArrayIx(col, membership->subgroups, membership->count); // TODO: Sort needs to expand from subGroups to labels as well if (ix >= 0) { char *term = membership->membership[ix]; char *title = membership->titles[ix]; char *titleRoot=NULL; if (cvTermIsEmpty(col, title)) titleRoot = cloneString("  "); else titleRoot = labelRoot(title, NULL); // Each sortable column requires hidden goop (in the "abbr" field currently) // which is the actual sort on value printf("", subtrack->track, col, term); printf(" "); - boolean printed = FALSE; + char *link = NULL; if (subgroupMetaHash) { struct hash *colHash = hashFindVal(subgroupMetaHash, col); if (colHash) - { - struct meta *meta = hashFindVal(colHash, term); - if (meta != NULL) - { - if (meta->url == NULL || strlen(meta->url) == 0) - /* add pointer to suggest hover */ - printf("%s", - meta->description, titleRoot); - else - printf("%s\n", - meta->description, meta->url, titleRoot); - printed = TRUE; - } - } + link = metaVocabLink(colHash, term, titleRoot); } - if (!printed) - printf("%s",titleRoot); + printf("%s", link ? link : titleRoot); puts(""); freeMem(titleRoot); } else if (sameString(col, SUBTRACK_COLOR_SUBGROUP)) { char *hue = subtrackColorToCompare(subtrack); printf("" "    ", subtrack->track, col, hue, subtrack->colorR, subtrack->colorG, subtrack->colorB); } } } else // Non-sortable tables do not have sort by columns but will display a short label { // (which may be a configurable link)