eaa6da7f826e935dba8cdf70e52b556964017b54
max
  Tue Mar 12 03:02:59 2024 -0700
adding clear button to text filters, refs #24752

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 5ada320..5802fb5 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -6886,32 +6886,39 @@
 
         count++;
         printf("<P><B>Filter items in '%s' field:</B> ", trackDbLabel);
 
         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_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("&nbsp;&nbsp;<button class='buttonClear-%s'>Clear</button>\n", tdb->track);
         printf("</P>");
         }
+        // using jquery id= syntax to make sure that selector works even if trackname has a dot in it
+        jsInlineF("$('[class=\"buttonClear-%s\"]').click( function(ev) { \n"
+                    "$(ev.target).prevAll('input').val('*');\n"
+                    "$(ev.target).prevAll('select').val('%s');\n"
+                    "ev.preventDefault();\n"
+                  "});", tdb->track, FILTERTEXT_WILDCARD);
     }
 
 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
 {
 char option[256];
 if (cartOptionalString(cart, "ajax") == NULL)
     {
     webIncludeResourceFile("ui.dropdownchecklist.css");
     jsIncludeFile("ui.dropdownchecklist.js",NULL);
     jsIncludeFile("ddcl.js",NULL);