a071c9a0e1db6bc5db3aec2c0fbd421a4a7389ee
tdreszer
  Wed Jan 26 17:17:13 2011 -0800
filterBy setting should allow spaces by wrapping strings in quotes.  Beds should be filterable by filterBy
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 6c89c6a..44c342d 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -3278,66 +3278,69 @@
 }
 
 filterBy_t *filterBySetGet(struct trackDb *tdb, struct cart *cart, char *name)
 /* Gets one or more "filterBy" settings (ClosestToHome).  returns NULL if not found */
 {
 filterBy_t *filterBySet = NULL;
 
 char *setting = trackDbSettingClosestToHome(tdb, FILTER_BY);
 if(setting == NULL)
     return NULL;
 if( name == NULL )
     name = tdb->track;
 
 setting = cloneString(setting);
 char *filters[10];
-int filterCount = chopLine(setting, filters);
+int filterCount = chopByWhiteRespectDoubleQuotes(setting, filters, ArraySize(filters));
 int ix;
 for(ix=0;ix<filterCount;ix++)
     {
     char *filter = cloneString(filters[ix]);
     filterBy_t *filterBy;
     AllocVar(filterBy);
     strSwapChar(filter,':',0);
     filterBy->column = filter;
     filter += strlen(filter) + 1;
     strSwapChar(filter,'=',0);
     filterBy->title = strSwapChar(filter,'_',' '); // Title does not have underscores
     filter += strlen(filter) + 1;
     if(filter[0] == '+') // values are indexes to the string titles
         {
         filter += 1;
         filterBy->useIndex = TRUE;
         }
     filterBy->valueAndLabel = (strchr(filter,'|') != NULL);
+    // Remove any double quotes now and rely upon commmas for delimiting
+    stripString(filter, "\"");
     filterBy->slValues = slNameListFromComma(filter);
     if(filterBy->valueAndLabel)
         {
         struct slName *val = filterBy->slValues;
         for(;val!=NULL;val=val->next)
             {
             char * lab =strchr(val->name,'|');
             if(lab == NULL)
                 {
                 warn("Using filterBy but only some values contain labels in form of value|label.");
                 filterBy->valueAndLabel = FALSE;
                 break;
                 }
-            *lab++ = 0;
+            *lab++ = 0;  // The label is found inside the filters->svValues as the next string
             strSwapChar(lab,'_',' '); // Title does not have underscores
             }
         }
+
     slAddTail(&filterBySet,filterBy); // Keep them in order (only a few)
 
     if(cart != NULL)
         {
         char suffix[64];
         safef(suffix, sizeof(suffix), "filterBy.%s", filterBy->column);
         boolean compositeLevel = isNameAtCompositeLevel(tdb,name);
         if(cartLookUpVariableClosestToHome(cart,tdb,compositeLevel,suffix,&(filterBy->htmlName)))
             filterBy->slChoices = cartOptionalSlNameList(cart,filterBy->htmlName);
         }
     if(filterBy->htmlName == NULL)
         {
         int len = strlen(name) + strlen(filterBy->column) + 15;
         filterBy->htmlName = needMem(len);
         safef(filterBy->htmlName, len, "%s.filterBy.%s", name,filterBy->column);
@@ -4730,31 +4733,30 @@
     deMin = cartOptionalStringClosestToHome(cart, tdb,FALSE,scoreLimitName);
     if(deMin != NULL)
         *min = strtod(deMin,NULL);
     }
 if(min && limitMin && (int)(*min) != NO_VALUE && *min < *limitMin) *min = *limitMin; // defaults within range
 if(min && limitMax && (int)(*min) != NO_VALUE && *min > *limitMax) *min = *limitMax;
 if(max && limitMax && (int)(*max) != NO_VALUE && *max > *limitMax) *max = *limitMax;
 if(max && limitMin && (int)(*max) != NO_VALUE && *max < *limitMin) *max = *limitMin;
 }
 
 void scoreCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *name, char *title,  int maxScore, boolean boxed)
 /* Put up UI for filtering bed track based on a score */
 {
 char option[256];
 boolean compositeLevel = isNameAtCompositeLevel(tdb,name);
-
 filterBy_t *filterBySet = filterBySetGet(tdb,cart,name);
 if(filterBySet != NULL)
     {
     if(!tdbIsComposite(tdb) && !tdbIsCompositeChild(tdb))
         jsIncludeFile("hui.js",NULL);
 
     filterBySetCfgUi(tdb,filterBySet);
     filterBySetFree(&filterBySet);
     return; // Cannot have both 'filterBy' score and 'scoreFilter'
     }
 
 
 boolean scoreFilterOk = (trackDbSettingClosestToHome(tdb, NO_SCORE_FILTER) == NULL);
 boolean glvlScoreMin = (trackDbSettingClosestToHome(tdb, GRAY_LEVEL_SCORE_MIN) != NULL);
 if (! (scoreFilterOk || glvlScoreMin))