365fbd229ddd9ccd90b74788973cd8f011476954
kent
  Sun Dec 12 14:58:01 2021 -0800
Adding in unmerge buttons to the line with the Clear All button.

diff --git src/hg/lib/tablesTables.c src/hg/lib/tablesTables.c
index 7612139..755e1ff 100644
--- src/hg/lib/tablesTables.c
+++ src/hg/lib/tablesTables.c
@@ -439,43 +439,46 @@
 	    visibleFacetList, varPrefix);
 
 if (visibleFacetList)
     {
     // Show top bar with quick-deselects for selected facet values
     //  as well a clear restriction button that cleans out _filter cart var. 
 
     struct dyString *facetBar = dyStringNew(1024);
     char filterVar[256];
     safef(filterVar, sizeof(filterVar), "%s_filter", varPrefix);
 
     char *where = cartUsualString(cart, filterVar, "");
 
 
     boolean gotSelected = FALSE;
+    boolean anyMerged = FALSE;
 
     struct slName *visList = slNameListFromComma(visibleFacetList);
     struct slName *vis;
     for (vis = visList; vis != NULL; vis = vis->next)
 	{
 	int fIx = fieldedTableFindFieldIx(table, vis->name);
 	if (fIx >= 0)
 	    {
 	    struct facetField *field = ffArray[fIx];
 	    if (!field->allSelected)
 		{
 		gotSelected = TRUE;
-		htmlDyStringPrintf(facetBar, "<span class='card facet-card' style='display: inline-block;'><span class='card-body'>\n");
+		htmlDyStringPrintf(facetBar, 
+		    "<span class='card facet-card' style='display: inline-block;'>"
+		    "<span class='card-body'>\n");
 		htmlDyStringPrintf(facetBar, "<dt style='display: inline-block;'>\n");
 		htmlDyStringPrintf(facetBar, "<h6 class='card-title'>%s</h6></dt>\n", 
 		    field->fieldName);
 
 		struct facetVal *val;
 
 		// Sort values alphabetically
 		// Make a copy to not disturb the original order 
 		struct facetVal *valListCopy = facetsClone(field->valList);
 		slSort(&valListCopy, facetValCmp);
 		
 		for (val = valListCopy; val; val=val->next)
 		    {
 		    boolean specificallySelected = (val->selected && !field->allSelected);
 		    if (specificallySelected)
@@ -494,75 +497,95 @@
 				"&%s_page=1'"
 				">",
 			    returnUrl, varPrefix,
 			    op, varPrefix, field->fieldName, varPrefix, val->val, varPrefix
 			    );
 			htmlDyStringPrintf(facetBar, "%s (%d)</a>", 
 			    naForEmpty(val->val), val->selectCount);
 			htmlDyStringPrintf(facetBar, "</dd>\n");
 			}
 		    }
 		slFreeList(&valListCopy);
 		
 		htmlDyStringPrintf(facetBar, "</span></span>\n");
 		}
 	    }
+	else
+	    {
+	    anyMerged = TRUE;
+	    htmlDyStringPrintf(facetBar, 
+		"<span class='card facet-card' style='display: inline-block;'>"
+		"<span class='card-body'>\n");
+	    htmlDyStringPrintf(facetBar, "<dt style='display: inline-block;'>\n");
+	    htmlDyStringPrintf(facetBar, "<h6 class='card-title'>%s</h6></dt>\n", 
+		vis->name);
+	    htmlDyStringPrintf(facetBar, " <a class='btn btn-secondary' href='%s"
+		    "&%s_facet_op=%s|none|"
+		    "&%s_facet_fieldName=%s|url|"
+		    "&%s_facet_fieldVal=%s|url|"
+		    "&%s_page=1' "
+		    ">", 
+		    returnUrl, varPrefix, "unmerge", varPrefix, vis->name, 
+		    varPrefix, "", varPrefix);
+	    htmlDyStringPrintf(facetBar, " %s", "unmerge");
+	    htmlDyStringPrintf(facetBar, "</a>");
+	    htmlDyStringPrintf(facetBar, "</span></span>\n");
+	    }
 	}
 
-    if (!isEmpty(where) || gotSelected)
+    if (!isEmpty(where) || gotSelected || anyMerged)
         {
 	printf("<div>\n");
         }
 
     if (!isEmpty(where))
 	{
 	// left column
         
 	printf("Restricting files to where %s. ", where);
 
 	printf("&nbsp&nbsp;");
 	printf("<input class='btn btn-secondary' type='button' id='clearRestrictionButton' VALUE=\"Clear Restriction\">");
 	char jsText[1024];
 	safef(jsText, sizeof(jsText),
 	    "$('[name=%s_page]').val('1');\n"
 	    "$('[name=clearRestriction]').val('1');\n"
 	    "$('#submit').click();\n", varPrefix);
 	jsOnEventById("click", "clearRestrictionButton", jsText);
 
 	printf("<br>");
         }
 
-
-    if (gotSelected)
+    if (gotSelected || anyMerged)
 	{
 	// reset all facet value selections button
 	char *op = "resetAll";
 	htmlPrintf("<a class='btn btn-secondary' href='%s"
 	    "&%s_facet_op=%s|none|"
 	    "&%s_facet_fieldName=%s|url|"
 	    "&%s_facet_fieldVal=%s|url|"
 	    "&%s_page=1' "
 		">%s</a>\n",
 		returnUrl, varPrefix, op, varPrefix, "", varPrefix, "", varPrefix, "Clear All"
 	    );
 
 	printf("<dl style='display: inline-block;'>\n");
 	printf("%s\n", facetBar->string);
 	printf("</dl>\n");
 	}
 
-    if (!isEmpty(where) || gotSelected)
+    if (!isEmpty(where) || gotSelected || anyMerged)
 	printf("</div><br>\n");
 
     dyStringFree(&facetBar);
     }
 
 printf("<div class='row'>\n"); // parent container
 
 if (visibleFacetList)
     {
     // left column
     printf("<div class='col-xs-6 col-sm-4 col-md-4 col-lg-3 col-xl-3'>\n");
 
     struct slName *visList = slNameListFromComma(visibleFacetList);
     struct slName *vis;
     for (vis = visList; vis != NULL; vis = vis->next)