87ecaf60bfa5680a064df5cea4de88abe6da22cc braney Wed Nov 13 19:46:43 2019 -0800 some tweaks for filters diff --git src/hg/lib/hui.c src/hg/lib/hui.c index 1679f97..c124e43 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -3647,35 +3647,40 @@ /* Extract field name from a filter trackDb variable. Variables can either be * <columnName>Filter* or <columnName>.Filter* */ { char *field = cloneString(trackDbVariable); int ix = strlen(field) - strlen(filterType); field[ix] = '\0'; if (field[ix - 1] == '.') field[ix - 1] = '\0'; return field; } static char *getLabelSetting(struct cart *cart, struct trackDb *tdb, char *field) { char labelSetting[4096]; -safef(labelSetting, sizeof labelSetting, "%s%s", field, FILTER_LABEL_NAME); +safef(labelSetting, sizeof labelSetting, "%s.%s", FILTER_LABEL_NAME_LOW, field); char *trackDbLabel = cartOrTdbString(cart, tdb, labelSetting, NULL); if (trackDbLabel == NULL) { - safef(labelSetting, sizeof labelSetting, "%s.%s", field, FILTER_LABEL_NAME); + safef(labelSetting, sizeof labelSetting, "%s.%s", field, FILTER_LABEL_NAME_CAP); + trackDbLabel = cartOrTdbString(cart, tdb, labelSetting, NULL); + } +if (trackDbLabel == NULL) + { + safef(labelSetting, sizeof labelSetting, "%s%s", field, FILTER_LABEL_NAME_CAP); trackDbLabel = cartOrTdbString(cart, tdb, labelSetting, NULL); } return trackDbLabel; } static filterBy_t *buildFilterBy(struct trackDb *tdb, struct cart *cart, struct asObject *as, struct trackDbFilter *tdbFilter, char *name) /* Build a filterBy_t structure from a <column>FilterValues statement. */ { char *field = tdbFilter->fieldName; if (isEmpty(tdbFilter->setting)) errAbort("FilterValues setting of field '%s' must have a value.", tdbFilter->fieldName); char *value = cartUsualStringClosestToHome(cart, tdb, FALSE, tdbFilter->name, tdbFilter->setting); filterBy_t *filterBy; @@ -3988,39 +3993,41 @@ 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 cellpadding=3><TR valign='top'>"); else printf("<B>%s items by:</B> (select multiple categories and items - %s)" "<TABLE cellpadding=3><TR valign='bottom'>\n",filterTypeTitle,FILTERBY_HELP_LINK); +#ifdef ADVANCED_BUTTON if (tdbIsBigBed(tdb)) { char varName[1024]; safef(varName, sizeof(varName), "%s.doAdvanced", tdb->track); puts(" "); printf("<a id='%s' style='text-decoration: underline; color: #121E9A' title='Show advanced options..'>%s<img src='../images/downBlue.png'/></a>" ,varName,"Advanced "); printf("<BR>"); jsInlineF("$(function () { advancedSearchOnChange('%s'); });\n", varName); } +#endif // ADVANCED_BUTTON 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>"); @@ -4031,32 +4038,33 @@ 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_MULTIPLE_LIST_AND); char cartSettingString[4096]; - safef(cartSettingString, sizeof cartSettingString, "%s.%s.%s", prefix, filterBy->column, FILTER_TYPE_NAME_CAP); - printf("<div class='advanced' style='display:none'><b>Match if "); + 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++) { puts("<td>"); // value is always "All", even if label is different, to simplify javascript code int valIx = 0; if (filterByColumnIsMultiple(cart, tdb, filterBy->column)) @@ -6223,36 +6231,36 @@ if (!blocked) // scoreFilter is implicit unless NO_SCORE_FILTER return TRUE; return FALSE; } char *getFilterType(struct cart *cart, struct trackDb *tdb, char *field, char *def) // figure out how the trackDb is specifying the FILTER_TYPE variable and return its setting { char settingString[4096]; safef(settingString, sizeof settingString, "%s.%s", FILTER_TYPE_NAME_LOW, field); char *setting = cartOrTdbString(cart, tdb, settingString, NULL); if (setting == NULL) { - safef(settingString, sizeof settingString, "%s%s", field, FILTER_TYPE_NAME_CAP); + safef(settingString, sizeof settingString, "%s.%s", field, FILTER_TYPE_NAME_CAP); setting = cartOrTdbString(cart, tdb, settingString, NULL); } if (setting == NULL) { - safef(settingString, sizeof settingString, "%s.%s", field, FILTER_TYPE_NAME_CAP); + safef(settingString, sizeof settingString, "%s%s", field, FILTER_TYPE_NAME_CAP); setting = cartOrTdbString(cart, tdb, settingString, def); } return setting; } static int textFiltersShowAll(char *db, struct cart *cart, struct trackDb *tdb) /* Show all the text filters for this track. */ { int count = 0; struct trackDbFilter *trackDbFilters = tdbGetTrackTextFilters(tdb); if (trackDbFilters) { puts("<BR>"); struct trackDbFilter *filter = NULL; struct sqlConnection *conn = NULL; @@ -6263,31 +6271,31 @@ while ((filter = slPopHead(&trackDbFilters)) != NULL) { char *value = cartUsualStringClosestToHome(cart, tdb, FALSE, filter->name, filter->setting); struct asColumn *asCol = asColumnFind(as, filter->fieldName); if (asCol == NULL) errAbort("Building filter on field %s which is not in AS file.", filter->fieldName); count++; printf("<P><B>Filter items in '%s' field: ", filter->fieldName); char cgiVar[128]; safef(cgiVar,sizeof(cgiVar),"%s.%s",tdb->track,filter->name); cgiMakeTextVar(cgiVar, value, 45); char *setting = getFilterType(cart, tdb, filter->fieldName, FILTERTEXT_WILDCARD); - safef(cgiVar,sizeof(cgiVar),"%s.%s.%s",tdb->track,filter->fieldName, FILTER_TYPE_NAME_CAP); + safef(cgiVar,sizeof(cgiVar),"%s.%s.%s",tdb->track,FILTER_TYPE_NAME_LOW, filter->fieldName); printf(" using "); printf("<SELECT name='%s'> ", cgiVar); printf("<OPTION %s>%s</OPTION>", sameString(setting, FILTERTEXT_WILDCARD) ? "SELECTED" : "", FILTERTEXT_WILDCARD ); printf("<OPTION %s>%s</OPTION>", sameString(setting, FILTERTEXT_REGEXP) ? "SELECTED" : "", FILTERTEXT_REGEXP ); printf("</SELECT>"); printf("</P>"); } } return count; } 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