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 "<A HREF='hgEncodeVocab?ra=%s&%s=\"%s\"' title='%s details' TARGET=ucscVocab>%s</A>"
-char *encFile = cgiEncode(file);
+#define VOCAB_LINK_WITH_FILE "<A HREF='hgEncodeVocab?ra=%s&%s=\"%s\"' title='%s details' TARGET=ucscVocab>%s</A>"
+#define VOCAB_LINK "<A HREF='hgEncodeVocab?%s=\"%s\"' title='%s details' TARGET=ucscVocab>%s</A>"
+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("<table id='mdb_%s'>",tdb->table);
 struct dyString *dyTable = dyStringCreate("<table>");
 if(showLongLabel)
     dyStringPrintf(dyTable,"<tr><td colspan=2>%s</td></tr>",tdb->longLabel);
 if(showShortLabel)
     dyStringPrintf(dyTable,"<tr><td align=right><i>shortLabel:</i></td><td nowrap>%s</td></tr>",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,"<tr><td align=right><i>%s:</i></td><td nowrap>",mdbVar->var);
 
         dyStringAppend(dyTable,htmlStringForDownloadsLink(db, tdb, mdbVar->val, TRUE, trackHash));
         dyStringAppend(dyTable,"</td></tr>");
         }
     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,"<tr><td align=right><i>%s:</i></td><td nowrap>%s</td></tr>",linkOfType,linkOfTerm);
-                freeMem(linkOfType);
                 freeMem(linkOfTerm);
+                        }
+                    else
+                        dyStringPrintf(dyTable,"<tr><td align=right><i>%s:</i></td><td nowrap>%s</td></tr>",linkOfType,mdbVar->val);
+                        //{  // NOTE: Could just have a tool tip for these.
+                        //char *descr=cgiEncode(hashMustFindVal(cvTerm,"description"));
+                        //label = cgiEncode(label);
+                        //dyStringPrintf(dyTable,"<tr><td align=right><i title='%s'>%s:</i></td><td nowrap>%s</td></tr>",descr,label,mdbVar->val);
+                        //freeMem(descr);
+                        //freeMem(label);
+                        //}
+                    freeMem(linkOfType);
                 continue;
                 }
             }
-#endif///ndef DONT_USE_CV_WHITELIST
+            }
         dyStringPrintf(dyTable,"<tr><td align=right><i>%s:</i></td><td nowrap>%s</td></tr>",mdbVar->var,mdbVar->val);
         }
     }
 dyStringAppend(dyTable,"</table>");
 //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;