911c470997f803252c2e9008b055ff61a445d30f braney Mon Jan 20 10:01:53 2020 -0800 fix a problem with singleList filters diff --git src/hg/lib/hui.c src/hg/lib/hui.c index 5a24754..32eb57f 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -4020,33 +4020,41 @@ 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 filterByColumnIsMultiple(struct cart *cart, struct trackDb *tdb, char *column) +static boolean filterByColumnIsList(struct cart *cart, struct trackDb *tdb, char *setting) +/* Is this filter setting expecting a list of items (e.g. has checkboxes) */ +{ +return (sameString(setting, FILTERBY_SINGLE_LIST) || + sameString(setting, FILTERBY_MULTIPLE_LIST_OR) || + 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. */ { -char *setting = getFilterType(cart, tdb, column, FILTERBY_MULTIPLE_LIST_AND); return (sameString(setting, FILTERBY_MULTIPLE) || 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); @@ -4071,76 +4079,73 @@ 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]; - if (filterByColumnIsMultiple(cart, tdb, filterBy->column)) + char *setting = getFilterType(cart, tdb, filterBy->column, FILTERBY_SINGLE_LIST); + if (filterByColumnIsList(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>"); - if (filterByColumnIsMultiple(cart, tdb, filterBy->column) && tdbIsBigBed(tdb)) + 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_MULTIPLE_LIST_AND); 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); puts("<td>"); // value is always "All", even if label is different, to simplify javascript code - int valIx = 0; - if (filterByColumnIsMultiple(cart, tdb, filterBy->column)) - { + int valIx = 1; + if (filterByColumnIsList(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); - printf("<OPTION%s value=\"All\">%s</OPTION>\n", (filterByAllChosen(filterBy)?" SELECTED":""), allLabel); - valIx = 1; - } else - { printf( "<SELECT id='%s%d' name='%s' style='font-size:.9em;'<BR>\n", selectIdPrefix,ix,filterBy->htmlName); - valIx = 0; - } + + 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); name = varName; label = slValue->name; } else {