82aeb03255f4f45baf5bd9e8c0d06ba57a071f8f
tdreszer
  Fri May 27 14:46:46 2011 -0700
Fixed mistake of not using tags on hgFileUi filterBy boxes.  This resulted in UChicago downloads page not showing control terms properly.
diff --git src/hg/lib/fileUi.c src/hg/lib/fileUi.c
index 02f2e8f..be49043 100644
--- src/hg/lib/fileUi.c
+++ src/hg/lib/fileUi.c
@@ -395,68 +395,67 @@
     }
 return dyStringCannibalize(&dyLink);
 }
 
 static int filterBoxesForFilesList(char *db,struct mdbObj *mdbObjs,sortOrder_t *sortOrder)
 {  // Will create filterBoxes for each sortOrder field.  Returns count of filterBoxes made
 int count = 0;
 if (sortOrder != NULL)
     {
     struct dyString *dyFilters = dyStringNew(256);
     int sIx=0;
     for(sIx = 0;sIx<sortOrder->count;sIx++)
         {
         char *var = sortOrder->column[sIx];
         enum cvSearchable searchBy = cvSearchMethod(var);
-        //if (searchBy == cvSearchByDateRange || searchBy == cvSearchByIntegerRange) // dates and numbers probably not good for filtering. FIXME: Should cvsNotSearchable be filterable??
         if (searchBy != cvSearchBySingleSelect && searchBy != cvSearchByMultiSelect)
             continue; // Only single selects and multi-select make good candidates for filtering
 
-        struct sqlConnection *conn = hAllocConn(db);
-        struct slPair *valsAndLabels = mdbValLabelSearch(conn, var, MDB_VAL_STD_TRUNCATION, FALSE, FALSE, TRUE); // not tags, not tables, just files
-        hFreeConn(&conn);
-        // Need to verify that each val exists in an object for these files
-        struct slPair *relevantVals = NULL;
-        while(valsAndLabels != NULL)
-            {
-            struct slPair *oneVal = slPopHead(&valsAndLabels);
-            if(mdbObjsContainAltleastOneMatchingVar(mdbObjs,var,mdbPairVal(oneVal)))
+        // get all vals for var, then convert to tag/label pairs for filterBys
+        struct slName *vals = mdbObjsFindAllVals(mdbObjs, var);
+        struct slPair *tagLabelPairs = NULL;
+        while(vals != NULL)
                 {
-                eraseNonAlphaNum(mdbPairVal(oneVal));   // Have to squeeze out uglies from val to ensure filter by class works
-                slAddHead(&relevantVals,oneVal);
-                }
-            else
-                slPairFreeValsAndList(&oneVal);
+            struct slName *term = slPopHead(&vals);
+            char *tag = (char *)cvTag(var,term->name);
+            if (tag == NULL)
+                tag = term->name;
+            slPairAdd(&tagLabelPairs,tag,cloneString((char *)cvLabel(term->name)));
+            slNameFree(&term);
             }
-        if (slCount(relevantVals) > 1)
+
+        // If there is more than one val for this var then create filterBy box for it
+        if (slCount(tagLabelPairs) > 1)
             {
-            slReverse(&relevantVals);
+            slPairValSortCase(&tagLabelPairs); // should have a list sorted on the label
             char extraClasses[256];
             safef(extraClasses,sizeof extraClasses,"filterTable %s",var);
-            char *dropDownHtml = cgiMakeMultiSelectDropList(var,relevantVals,NULL,"All",extraClasses,"onchange='filterTable();' onclick='filterTableExclude(this);'");
+            char *dropDownHtml = cgiMakeMultiSelectDropList(var,tagLabelPairs,NULL,"All",extraClasses,"onchange='filterTable();' onclick='filterTableExclude(this);'");
             // Note filterBox has classes: filterBy & {var}
             if (dropDownHtml)
                 {
                 dyStringPrintf(dyFilters,"<td align='left'>\n<B>%s</B>:<BR>\n%s</td><td width=10>&nbsp;</td>\n",
-                               labelWithVocabLink(var,sortOrder->title[sIx],relevantVals,TRUE),dropDownHtml);  // TRUE were sending tags, not values
+                               labelWithVocabLink(var,sortOrder->title[sIx],tagLabelPairs,TRUE),dropDownHtml);  // TRUE were sending tags, not values
                 freeMem(dropDownHtml);
                 count++;
                 }
             }
-        if (slCount(relevantVals) > 0)
-            slPairFreeValsAndList(&relevantVals);
+        if (slCount(tagLabelPairs) > 0)
+            slPairFreeValsAndList(&tagLabelPairs);
         }
+
+    // Finally ready to print the filterBys out
     if (count)
         {
         webIncludeResourceFile("ui.dropdownchecklist.css");
         jsIncludeFile("ui.dropdownchecklist.js",NULL);
         #define FILTERBY_HELP_LINK  "<A HREF=\"../goldenPath/help/multiView.html\" TARGET=ucscHelp>help</A>"
         cgiDown(0.9);
         printf("<B>Filter files by:</B> (select multiple %sitems - %s)\n<table><tr valign='bottom'>\n",
                (count >= 1 ? "categories and ":""),FILTERBY_HELP_LINK);
         printf("%s\n",dyStringContents(dyFilters));
         printf("</tr></table>\n");
         printf("<script type='text/javascript'>$(document).ready(function() { $('.filterBy').each( function(i) { $(this).dropdownchecklist({ firstItemChecksAll: true, noneIsAll: true, maxDropHeight: filterByMaxHeight(this) });});});</script>\n");
         }
     dyStringFree(&dyFilters);
     }
 return count;
@@ -599,32 +598,39 @@
                 sprintWithGreekByte(niceNumber, sizeof(niceNumber), oneFile->fileSize);
                 field = oneFile->sortFields[sortOrder->order[ix] - 1];
                 printf("<TD abbr='%s' align='right' nowrap>%s</td>",field,niceNumber);
                 }
             else
                 {
                 field = oneFile->sortFields[sortOrder->order[ix] - 1];
                 boolean isFieldEmpty = cvTermIsEmpty(sortOrder->column[ix],field);
                 char class[128];
                 class[0] = '\0';
                 if (filterable)
                     {
                     enum cvSearchable searchBy = cvSearchMethod(sortOrder->column[ix]);
                     if (searchBy == cvSearchBySingleSelect || searchBy == cvSearchByMultiSelect)
                         {
-                        char *cleanClass = cloneString(isFieldEmpty?"None":field);
-                        eraseNonAlphaNum(cleanClass);
+                        char *cleanClass = NULL;
+                        if (isFieldEmpty)
+                            cleanClass = "None";
+                        else
+                            {
+                            cleanClass = (char *)cvTag(sortOrder->column[ix],field); // class should be tag
+                            if (cleanClass == NULL)
+                                cleanClass = field;
+                            }
                         safef(class,sizeof class," class='%s %s'",sortOrder->column[ix],cleanClass);
                         }
                     }
 
                 if (sameString("dateUnrestricted",sortOrder->column[ix]) && field && dateIsOld(field,"%F"))
                     printf("<TD%s nowrap style='color: #BBBBBB;'%s>%s</td>",align,class,field);
                 else
                     printf("<TD%s nowrap%s>%s</td>",align,class,isFieldEmpty?" &nbsp;":field);
                 if (!sameString("fileType",sortOrder->column[ix]))
                     mdbObjRemoveVars(oneFile->mdb,sortOrder->column[ix]); // Remove this from mdb now so that it isn't displayed in "extras'
                 }
             }
         }
 #ifndef INCLUDE_FILENAMES
     else