84769302d77939430b003999bd6397ecc64207b5
galt
  Fri Feb 7 15:33:28 2020 -0800
CIRM cdwWebBrowse: Placing the Clear-All-Facets button in a more logical location. Now only visble if some facets have been chosen.

diff --git src/hg/lib/tablesTables.c src/hg/lib/tablesTables.c
index dab9121..77e170c 100644
--- src/hg/lib/tablesTables.c
+++ src/hg/lib/tablesTables.c
@@ -393,147 +393,152 @@
     boolean withFilters, char *itemPlural, 
     int pageSize, struct fieldedTableSegment *largerContext, struct hash *suggestHash, 
     struct facetField **ffArray, char *visibleFacetList,
     void (*addFunc)(int))
 /* Show a fielded table that can be sorted by clicking on column labels and optionally
  * that includes a row of filter controls above the labels .
  * The maxLenField is maximum character length of field before truncation with ...
  * Pass in 0 for no max */
 {
 if (strchr(returnUrl, '?') == NULL)
      errAbort("Expecting returnUrl to include ? in showFieldedTable\nIt's %s", returnUrl);
 
 if (withFilters || visibleFacetList)
     showTableFilterInstructionsEtc(table, itemPlural, largerContext, addFunc, visibleFacetList);
 
-// Show top bar with quick-deselects for selected facet values
-//  as well a clear restriction button that cleans out cdwFile_filter cart var. 
-
 if (visibleFacetList)
     {
-    char *where = cartUsualString(cart, "cdwFile_filter", "");
 
-    if (!isEmpty(where))
-	{
-	// left column
-	printf("<div>\n");
+    // Show top bar with quick-deselects for selected facet values
+    //  as well a clear restriction button that cleans out cdwFile_filter cart var. 
 
-	printf("Restricting files to where %s. ", where);
+    struct dyString *facetBar = dyStringNew(1024);
 
-	printf("&nbsp&nbsp;");
-	printf("<input class='btn btn-secondary' type='button' id='clearRestrictionButton' VALUE=\"Clear Restriction\">");
-	jsOnEventById("click", "clearRestrictionButton",
-	    "$('[name=cdwBrowseFiles_page]').val('1');\n"
-	    "$('[name=clearRestriction]').val('1');\n"
-	    "$('#submit').click();\n");
+    char *where = cartUsualString(cart, "cdwFile_filter", "");
 
-	printf("<br>");
-        }
 
     boolean gotSelected = FALSE;
 
     struct slName *nameList = slNameListFromComma(visibleFacetList);
     int f;
     for (f = 0; f < table->fieldCount; ++f) 
 	{
 	struct facetField *field = ffArray[f];
 	if (slNameInListUseCase(nameList, field->fieldName)) // i.e. is this field a visible facet?
 	    {
 	    if (!field->allSelected)
 		{
-		if (!gotSelected)
-		    {
-		    if (isEmpty(where))  // we still need to do this
-			{
-			// left column
-			printf("<div>\n");
-			}
-		    htmlPrintf("<dl style='display: inline-block;'>\n");
 		gotSelected = TRUE;
-		    }
-		htmlPrintf("<span class='card facet-card' style='display: inline-block;'><span class='card-body'>\n");
-		htmlPrintf("<dt style='display: inline-block;'>\n");
-		htmlPrintf("<h6 class='card-title'>%s</h6></dt>\n", field->fieldName);
+		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)
 			{
 			char *op = "remove";
-			printf("<dd class=\"facet\" style='display: inline-block;'>\n");
-			htmlPrintf("<input type=checkbox value=%s class=cdwFSCheckBox %s>&nbsp;",
+			htmlDyStringPrintf(facetBar, "<dd class=\"facet\" style='display: inline-block;'>\n");
+			htmlDyStringPrintf(facetBar, "<input type=checkbox value=%s class=cdwFSCheckBox %s>&nbsp;",
 			    specificallySelected ? "true" : "false", 
 			    specificallySelected ? "checked" : "");
-			htmlPrintf("<a href='../cgi-bin/cdwWebBrowse?%s=%s|url|&cdwCommand=browseFiles"
+			htmlDyStringPrintf(facetBar, "<a href='../cgi-bin/cdwWebBrowse?%s=%s|url|&cdwCommand=browseFiles"
 				"&browseFiles_facet_op=%s|url|"
 				"&browseFiles_facet_fieldName=%s|url|"
 				"&browseFiles_facet_fieldVal=%s|url|"
 				"&cdwBrowseFiles_page=1' "
 				">",
 			    cartSessionVarName(), cartSessionId(cart),
 			    op, field->fieldName, val->val
 			    );
-			htmlPrintf("%s (%d)</a>", val->val, val->selectCount);
-			printf("</dd>\n");
+			htmlDyStringPrintf(facetBar, "%s (%d)</a>", val->val, val->selectCount);
+			htmlDyStringPrintf(facetBar, "</dd>\n");
 			}
 		    }
 		slFreeList(&valListCopy);
 		
-		htmlPrintf("</span></span>\n");
+		htmlDyStringPrintf(facetBar, "</span></span>\n");
 
 		}
 
 	    }
 	}
 
-    if (gotSelected)
-	htmlPrintf("</dl>\n");
-   
     if (!isEmpty(where) || gotSelected)
-	printf("</div><br>\n");
-
+        {
+	printf("<div>\n");
         }
 
-printf("<div class='row'>\n"); // parent container
-
-if (visibleFacetList)
+    if (!isEmpty(where))
 	{
-
 	// left column
-    printf("<div class='col-xs-6 col-sm-4 col-md-4 col-lg-3 col-xl-3'>\n");
         
-    // reset all facet value selections
+	printf("Restricting files to where %s. ", where);
+
+	printf("&nbsp&nbsp;");
+	printf("<input class='btn btn-secondary' type='button' id='clearRestrictionButton' VALUE=\"Clear Restriction\">");
+	jsOnEventById("click", "clearRestrictionButton",
+	    "$('[name=cdwBrowseFiles_page]').val('1');\n"
+	    "$('[name=clearRestriction]').val('1');\n"
+	    "$('#submit').click();\n");
+
+	printf("<br>");
+        }
+
+
+    if (gotSelected)
+	{
+	// reset all facet value selections button
 	char *op = "resetAll";
 	htmlPrintf("<a class='btn btn-secondary' href='../cgi-bin/cdwWebBrowse?%s=%s|url|&cdwCommand=browseFiles"
 	    "&browseFiles_facet_op=%s|url|"
 	    "&browseFiles_facet_fieldName=%s|url|"
 	    "&browseFiles_facet_fieldVal=%s|url|"
 	    "&cdwBrowseFiles_page=1' "
-	    ">%s</a><br><br>\n",
+		">%s</a>\n",
 		cartSessionVarName(), cartSessionId(cart),
 	    op, "", "",
 	    "Clear All"
 	    );
 
+	printf("<dl style='display: inline-block;'>\n");
+	printf("%s\n", facetBar->string);
+	printf("</dl>\n");
+	}
+
+    if (!isEmpty(where) || gotSelected)
+	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 *nameList = slNameListFromComma(visibleFacetList);
     int f;
     for (f = 0; f < table->fieldCount; ++f) 
 	{
 	struct facetField *field = ffArray[f];
 	if (slNameInListUseCase(nameList, field->fieldName)) // i.e. is this field a visible facet?
 	    {
             htmlPrintf("<div class='card facet-card'><div class='card-body'>\n");
             htmlPrintf("<h6 class='card-title'>%s</h6><dl>\n", field->fieldName);
 	    struct facetVal *val;
 
 	    if (!field->allSelected)  // add reset facet link
 		{
 		char *op = "reset";
 		htmlPrintf("<dd><a class='btn btn-secondary' href='../cgi-bin/cdwWebBrowse?%s=%s|url|&cdwCommand=browseFiles"