632d91991149700af031438008b9270e366cf830
jcasper
  Fri Aug 16 11:01:01 2024 -0700
Adds support for multiple filterBy sets on the same page, refs #32644

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index ae0841b..b3d034a 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -4462,38 +4462,46 @@
 		}
 	    }
 	printf(">%s</OPTION>\n",label);
 	}
     printf("</SELECT>\n");
     puts("</td>");
     }
 
 puts("</TR></TABLE>");
 }
 
 void filterBySetCfgUi(struct cart *cart, struct trackDb *tdb,
 		  filterBy_t *filterBySet, boolean onOneLine, char *prefix)
 /* Does the filter UI for a list of filterBy structure */
 {
-filterBySetCfgUiGuts(cart, tdb, filterBySet, onOneLine, "Filter", "fbc", "All", prefix, FALSE);
+char selectIdPrefix[4096];
+safef(selectIdPrefix, sizeof(selectIdPrefix), "fbc_%s", prefix);
+// Our checklists use ddcl.js, which doesn't seem to play nicely when elements have id strings that include '.'
+replaceChar(selectIdPrefix, '.', '_');
+filterBySetCfgUiGuts(cart, tdb, filterBySet, onOneLine, "Filter", selectIdPrefix, "All", prefix, FALSE);
 }
 
 void highlightBySetCfgUi(struct cart *cart, struct trackDb *tdb,
 		     filterBy_t *filterBySet, boolean onOneLine, char *prefix, boolean isHighlight)
 /* Does the highlight UI for a list of filterBy structure */
 {
-filterBySetCfgUiGuts(cart, tdb, filterBySet, onOneLine, "Highlight", "hbc", "None", prefix, TRUE);
+char selectIdPrefix[4096];
+safef(selectIdPrefix, sizeof(selectIdPrefix), "hbc_%s", prefix);
+// Our checklists use ddcl.js, which doesn't seem to play nicely when elements have id strings that include '.'
+replaceChar(selectIdPrefix, '.', '_');
+filterBySetCfgUiGuts(cart, tdb, filterBySet, onOneLine, "Highlight", selectIdPrefix, "None", prefix, TRUE);
 }
 
 #define COLOR_BG_DEFAULT_IX     0
 #define COLOR_BG_ALTDEFAULT_IX  1
 #define DIVIDING_LINE "<TR valign=\"CENTER\" line-height=\"1\" BGCOLOR=\"%s\"><TH colspan=\"5\" " \
 		  "align=\"CENTER\"><hr noshade color=\"%s\" width=\"100%%\"></TD></TR>\n"
 #define DIVIDER_PRINT(color) printf(DIVIDING_LINE,COLOR_BG_DEFAULT,(color))
 
 static boolean divisionIfNeeded(char **lastDivide,dividers_t *dividers,membership_t *membership)
 // Keeps track of location within subtracks in order to provide requested division lines
 {
 boolean division = FALSE;
 if (dividers)
     {
     if (lastDivide != NULL)