0e3cd383acb8a9946add69acd91fbd7437c26a05 braney Mon Jun 14 10:56:44 2021 -0700 fix bug in bigBed filtering #27713 diff --git src/hg/lib/hui.c src/hg/lib/hui.c index 29bb8dd..77e9ffe 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -4230,44 +4230,46 @@ printf(" value='%s'",name); if (filterBy->styleFollows) { char *styler = label + strlen(label)+1; if (*styler != '\0') { if (*styler == '#') // Legacy: just the color that follows printf(" style='color: %s;'",styler); else printf(" style='%s'",styler); } } printf(">%s</OPTION>\n",label); } -static boolean filterByColumnIsList(struct cart *cart, struct trackDb *tdb, char *setting) -/* Is this filter setting expecting a list of items (e.g. has checkboxes) */ +static boolean filterByColumnIsMultiple(struct cart *cart, struct trackDb *tdb, char *setting) +/* Is this filter setting expecting multiple items (e.g. has checkboxes in the UI) */ { -return (sameString(setting, FILTERBY_SINGLE_LIST) || +return (sameString(setting, FILTERBY_MULTIPLE) || sameString(setting, FILTERBY_MULTIPLE_LIST_OR) || + sameString(setting, FILTERBY_MULTIPLE_LIST_ONLY_OR) || + sameString(setting, FILTERBY_MULTIPLE_LIST_ONLY_AND) || sameString(setting, FILTERBY_MULTIPLE_LIST_AND)); } -static boolean filterByColumnIsMultiple(struct cart *cart, struct trackDb *tdb, char *setting) -/* Is this filter setting for a comma separated column. */ +static boolean advancedFilter(struct cart *cart, struct trackDb *tdb, char *setting) { -return (sameString(setting, FILTERBY_MULTIPLE) || - sameString(setting, FILTERBY_MULTIPLE_LIST_OR) || - sameString(setting, FILTERBY_MULTIPLE_LIST_AND)); +if (!tdbIsBigBed(tdb)) + return FALSE; + +return sameString(setting, FILTERBY_MULTIPLE_LIST_OR) || sameString(setting, FILTERBY_MULTIPLE_LIST_AND); } void filterBySetCfgUiGuts(struct cart *cart, struct trackDb *tdb, filterBy_t *filterBySet, boolean onOneLine, char *filterTypeTitle, char *selectIdPrefix, char *allLabel, char *prefix) // Does the UI for a list of filterBy structure for either filterBy or highlightBy controls { if (filterBySet == NULL) return; #define FILTERBY_HELP_LINK "<A HREF=\"../goldenPath/help/multiView.html\" TARGET=ucscHelp>help</A>" int count = slCount(filterBySet); if (count == 1) puts("<TABLE class='trackUiFilterTable'><TR valign='top'>"); else @@ -4289,68 +4291,68 @@ filterBy_t *filterBy = NULL; if (cartOptionalString(cart, "ajax") == NULL) { webIncludeResourceFile("ui.dropdownchecklist.css"); jsIncludeFile("ui.dropdownchecklist.js",NULL); jsIncludeFile("ddcl.js",NULL); } // TODO: columnCount (Number of filterBoxes per row) should be configurable through tdb setting for (filterBy = filterBySet; filterBy != NULL; filterBy = filterBy->next) { puts("<TD>"); char selectStatement[4096]; - char *setting = getFilterType(cart, tdb, filterBy->column, FILTERBY_SINGLE_LIST); - if (filterByColumnIsList(cart, tdb, setting)) + char *setting = getFilterType(cart, tdb, filterBy->column, FILTERBY_DEFAULT); + if (filterByColumnIsMultiple(cart, tdb, setting)) safef(selectStatement, sizeof selectStatement, " (select multiple items - %s)", FILTERBY_HELP_LINK); else selectStatement[0] = 0; if(count == 1) printf("<B>%s by %s</B>%s",filterTypeTitle,filterBy->title,selectStatement); else printf("<B>%s</B>",filterBy->title); puts("</TD>"); } puts("</tr><tr>"); for (filterBy = filterBySet; filterBy != NULL; filterBy = filterBy->next) { puts("<td>"); - char *setting = getFilterType(cart, tdb, filterBy->column, FILTERBY_SINGLE_LIST); - if (filterByColumnIsMultiple(cart, tdb, setting) && filterByColumnIsList(cart, tdb, setting) && tdbIsBigBed(tdb)) + char *setting = getFilterType(cart, tdb, filterBy->column, FILTERBY_DEFAULT); + if (advancedFilter(cart, tdb, setting)) { char cartSettingString[4096]; safef(cartSettingString, sizeof cartSettingString, "%s.%s.%s", prefix,FILTER_TYPE_NAME_LOW, filterBy->column); printf("<div ><b>Match if "); // ADVANCED BUTTON printf("<div class='advanced' style='display:none'><b>Match if "); cgiMakeRadioButton(cartSettingString, FILTERBY_MULTIPLE_LIST_AND, sameString(setting, FILTERBY_MULTIPLE_LIST_AND)); printf(" all "); cgiMakeRadioButton(cartSettingString, FILTERBY_MULTIPLE_LIST_OR, sameString(setting, FILTERBY_MULTIPLE_LIST_OR)); printf(" one or more match</b></div> "); } puts("</td>"); } puts("</tr><tr>"); int ix=0; for (filterBy = filterBySet; filterBy != NULL; filterBy = filterBy->next, ix++) { - char *setting = getFilterType(cart, tdb, filterBy->column, FILTERBY_SINGLE_LIST); + char *setting = getFilterType(cart, tdb, filterBy->column, FILTERBY_DEFAULT); puts("<td>"); // value is always "All", even if label is different, to simplify javascript code int valIx = 1; - if (filterByColumnIsList(cart, tdb, setting)) + if (filterByColumnIsMultiple(cart, tdb, setting)) printf( "<SELECT id='%s%d' name='%s' multiple style='display: none; font-size:.9em;' class='filterBy'><BR>\n", selectIdPrefix,ix,filterBy->htmlName); else printf( "<SELECT id='%s%d' name='%s' style='font-size:.9em;'<BR>\n", selectIdPrefix,ix,filterBy->htmlName); printf("<OPTION%s value=\"All\">%s</OPTION>\n", (filterByAllChosen(filterBy)?" SELECTED":""), allLabel); struct slName *slValue; for (slValue=filterBy->slValues;slValue!=NULL;slValue=slValue->next,valIx++) { char varName[32]; char *label = NULL; char *name = NULL; if (filterBy->useIndex) { safef(varName, sizeof(varName), "%d",valIx);