85a520a7ab42a996e7102ce4bd9eeca56b1fce00 tdreszer Tue Nov 2 14:56:34 2010 -0700 The '...' metadata table now links to term definitions and specific cv defined terms diff --git src/hg/lib/hui.c src/hg/lib/hui.c index c33cfce..a4cd58a 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -122,110 +122,121 @@ if (isNotEmpty(tbOff) && sameString(nextWord(&tbOff), "off")) return FALSE; char *hint = " title='Open table schema in new window'"; if( label == NULL) label = " View table schema"; struct trackDb *topLevel = trackDbTopLevelSelfOrParent(tdb); printf(SCHEMA_LINKED, db, topLevel->grp, topLevel->track, tdb->table, hint, label); return TRUE; } return FALSE; } char *controlledVocabLink(char *file,char *term,char *value,char *title, char *label,char *suffix) // returns allocated string of HTML link to controlled vocabulary term { -#define VOCAB_LINK "%s" -char *encFile = cgiEncode(file); +#define VOCAB_LINK_WITH_FILE "%s" +#define VOCAB_LINK "%s" +struct dyString *dyLink = NULL; char *encTerm = cgiEncode(term); char *encValue = cgiEncode(value); -struct dyString *dyLink = dyStringCreate(VOCAB_LINK,encFile,encTerm,encValue,title,label); +if (file != NULL) + { + char *encFile = cgiEncode(file); + dyLink = dyStringCreate(VOCAB_LINK_WITH_FILE,encFile,encTerm,encValue,title,label); + freeMem(encFile); + } +else + dyLink = dyStringCreate(VOCAB_LINK,encTerm,encValue,title,label); if (suffix != NULL) dyStringAppend(dyLink,suffix); // Don't encode since this may contain HTML -freeMem(encFile); freeMem(encTerm); freeMem(encValue); return dyStringCannibalize(&dyLink); } char *metadataAsHtmlTable(char *db,struct trackDb *tdb,boolean showLongLabel,boolean showShortLabel, struct hash *trackHash) /* If metadata from metaDb exists, return string of html with table definition */ { const struct mdbObj *safeObj = metadataForTable(db,tdb,NULL); if (safeObj == NULL || safeObj->vars == NULL) return NULL; //struct dyString *dyTable = dyStringCreate("",tdb->table); struct dyString *dyTable = dyStringCreate("
"); if(showLongLabel) dyStringPrintf(dyTable,"",tdb->longLabel); if(showShortLabel) dyStringPrintf(dyTable,"",tdb->shortLabel); -//#define DONT_USE_CV_WHITELIST -#ifndef DONT_USE_CV_WHITELIST -// Need whiteListed cv terms and the cv.ra file -struct slPair *oneTerm,*whiteList = mdbCvWhiteList(FALSE,TRUE); // Want terms that are defined in cv, not searchable via trackSearch -char *cvFile = NULL; -char *vocab = trackDbSetting(tdb, "controlledVocabulary"); -if(vocab != NULL) - cvFile = firstWordInLine(cloneString(vocab)); -#endif///ndef DONT_USE_CV_WHITELIST +// Get the hash of mdb and cv term types +struct hash *cvTermTypes = mdbCvTermTypeHash(); struct mdbObj *mdbObj = mdbObjClone(safeObj); // Important if we are going to remove vars! mdbObjRemoveVars(mdbObj,"composite project objType"); // Don't bother showing these (suggest: "composite project dataType view tableName") mdbObjReorderVars(mdbObj,"grant lab dataType cell treatment antibody protocol replicate view setType inputType",FALSE); // Bring to front mdbObjReorderVars(mdbObj,"subId submittedDataVersion dateSubmitted dateResubmitted dateUnrestricted dataVersion tableName fileName fileIndex",TRUE); // Send to back struct mdbVar *mdbVar; for (mdbVar=mdbObj->vars;mdbVar!=NULL;mdbVar=mdbVar->next) { if ((sameString(mdbVar->var,"fileName") || sameString(mdbVar->var,"fileIndex") ) && trackDbSettingClosestToHome(tdb,"wgEncode") != NULL) { dyStringPrintf(dyTable,""); } else { // If antibody and metadata contains input={sameValue} then just print input if(sameString(mdbVar->var,"antibody") && mdbObjContains(mdbObj,"input",mdbVar->val)) continue; -#ifndef DONT_USE_CV_WHITELIST - if (cvFile && whiteList) + if (cvTermTypes && differentString(mdbVar->var,"tableName")) // Don't bother with tableName { - for(oneTerm=whiteList;oneTerm!=NULL;oneTerm=oneTerm->next) + struct hash *cvTerm = hashFindVal(cvTermTypes,mdbVar->var); + if (cvTerm != NULL) { - if (sameWord(oneTerm->name,mdbVar->var)) - break; - } - if (oneTerm != NULL) + if(SETTING_NOT_ON(hashFindVal(cvTerm,"hidden"))) // NULL is not on + { + char *label=hashFindVal(cvTerm,"label"); + if (label == NULL) + label = mdbVar->var; + char *linkOfType = controlledVocabLink(NULL,"type",mdbVar->var,label,label,NULL); + char *cvDefined=hashFindVal(cvTerm,"cvDefined"); + if (cvDefined != NULL && differentWord(cvDefined,"no") && differentWord(cvDefined,"0")) { - //build link then - // TODO: If hgEncodeVocab was changed to give a description of a term not found in cv.ra, then "type" could almost always be linked - char *linkOfType = controlledVocabLink(cvFile,"type",oneTerm->name,oneTerm->val,oneTerm->val,NULL); - char *linkOfTerm = controlledVocabLink(cvFile,"term",mdbVar->val,mdbVar->val,mdbVar->val,NULL); + char *linkOfTerm = controlledVocabLink(NULL,"term",mdbVar->val,mdbVar->val,mdbVar->val,NULL); dyStringPrintf(dyTable,"",linkOfType,linkOfTerm); - freeMem(linkOfType); freeMem(linkOfTerm); + } + else + dyStringPrintf(dyTable,"",linkOfType,mdbVar->val); + //{ // NOTE: Could just have a tool tip for these. + //char *descr=cgiEncode(hashMustFindVal(cvTerm,"description")); + //label = cgiEncode(label); + //dyStringPrintf(dyTable,"",descr,label,mdbVar->val); + //freeMem(descr); + //freeMem(label); + //} + freeMem(linkOfType); continue; } } -#endif///ndef DONT_USE_CV_WHITELIST + } dyStringPrintf(dyTable,"",mdbVar->var,mdbVar->val); } } dyStringAppend(dyTable,"
%s
shortLabel:%s
%s:",mdbVar->var); dyStringAppend(dyTable,htmlStringForDownloadsLink(db, tdb, mdbVar->val, TRUE, trackHash)); dyStringAppend(dyTable,"
%s:%s
%s:%s
%s:%s
%s:%s
"); //mdbObjsFree(&mdbObj); // spill some memory return dyStringCannibalize(&dyTable); } boolean compositeMetadataToggle(char *db,struct trackDb *tdb,char *title, boolean embeddedInText,boolean showLongLabel, struct hash *trackHash) /* If metadata from metaTbl exists, create a link that will allow toggling it's display */ { const struct mdbObj *safeObj = metadataForTable(db,tdb,NULL); if(safeObj == NULL || safeObj->vars == NULL) return FALSE;