0ea39935da576d4466d1bfdcd68f84f4a7ec80e6
braney
  Thu Nov 14 14:25:23 2019 -0800
add filterValuesDefault specification

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 35570d2..0a3bc83 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -3644,30 +3644,49 @@
 }
 
 char *extractFieldNameOld(char *trackDbVariable, char *filterType)
 /* 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 *getFilterValueDefaultsSetting(struct cart *cart, struct trackDb *tdb, char *field)
+// grab the default setting for a filterValues statement
+{
+char defaultsSetting[4096];
+safef(defaultsSetting, sizeof defaultsSetting, "%s.%s", FILTER_VALUES_DEFAULT_NAME_LOW, field);
+char *defaults = cartOrTdbString(cart, tdb, defaultsSetting, NULL);
+if (defaults == NULL)
+    {
+    safef(defaultsSetting, sizeof defaultsSetting, "%s.%s", field, FILTER_VALUES_DEFAULT_NAME_CAP);
+    defaults = cartOrTdbString(cart, tdb, defaultsSetting, NULL);
+    }
+if (defaults == NULL)
+    {
+    safef(defaultsSetting, sizeof defaultsSetting, "%s%s", field, FILTER_VALUES_DEFAULT_NAME_CAP);
+    defaults = cartOrTdbString(cart, tdb, defaultsSetting, NULL);
+    }
+return defaults;
+}
+
 static char *getLabelSetting(struct cart *cart, struct trackDb *tdb, char *field)
 {
 char labelSetting[4096];
 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_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);
     }
@@ -3698,30 +3717,36 @@
 filterBy->useIndex = FALSE;
 filterBy->slValues = slNameListFromCommaEscaped(value);
 chopUpValues(filterBy);
 if (cart != NULL)
     {
     char suffix[256];
     safef(suffix, sizeof(suffix), "%s.%s", "filterBy", filterBy->column);
     boolean parentLevel = isNameAtParentLevel(tdb,tdb->track);
     if (cartLookUpVariableClosestToHome(cart,tdb,parentLevel,suffix,&(filterBy->htmlName)))
         {
         filterBy->slChoices = cartOptionalSlNameList(cart,filterBy->htmlName);
         freeMem(filterBy->htmlName);
         }
     }
 
+if (filterBy->slChoices == NULL)  // no settings in cart, initialize from trackDb
+    {
+    char *setting = getFilterValueDefaultsSetting(cart, tdb, field);
+    filterBy->slChoices = slNameListFromCommaEscaped(setting);
+    }
+
 struct dyString *dy = newDyString(128);
 dyStringPrintf(dy, "%s.%s.%s", name, "filterBy", filterBy->column);
 filterBy->htmlName = dy->string;
 
 return filterBy;
 }
 
 filterBy_t *filterByValues(struct trackDb *tdb, struct cart *cart, struct trackDbFilter *trackDbFilters, char *name)
 /* Build a filterBy_t list from tdb variables of the form *FilterValues */
 {
 struct asObject *as = asForTdb(NULL, tdb);
 if (as == NULL)
     errAbort("Unable to get autoSql for %s", name);
 filterBy_t *filterByList = NULL, *filter;
 struct trackDbFilter *fieldFilter;