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))