13e3bdbc4767d3dc557c9921e56d81c115767a32
kent
  Mon Feb 1 16:11:15 2021 -0800
Adding some anchors and IDs so that when select a facet it will tend to come back to about where you were in the page rather than popping you back up to the top.

diff --git src/hg/lib/tablesTables.c src/hg/lib/tablesTables.c
index 14518a0..437e8fa 100644
--- src/hg/lib/tablesTables.c
+++ src/hg/lib/tablesTables.c
@@ -527,124 +527,142 @@
 	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 *visList = slNameListFromComma(visibleFacetList);
     struct slName *vis;
     for (vis = visList; vis != NULL; vis = vis->next)
 	{
+	char selfId[256];
+	safef(selfId, sizeof(selfId), "%s_self_a_%s", varPrefix, vis->name);
+	subChar(selfId, ' ', '_');
+
 	int f = fieldedTableMustFindFieldIx(table, vis->name);
 	struct facetField *field = ffArray[f];
-	htmlPrintf("<div class='card facet-card'><div class='card-body'>\n");
+	htmlPrintf("<div id=\"%s\" class='card facet-card'><div class='card-body'>\n", selfId);
 	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='%s"
 		    "&%s_facet_op=%s|url|"
 		    "&%s_facet_fieldName=%s|url|"
 		    "&%s_facet_fieldVal=%s|url|"
 		    "&%s_page=1' "
 		    ">%s</a></dd>\n",
 		returnUrl, varPrefix, op, 
 		varPrefix, field->fieldName, varPrefix, "", varPrefix,
 		"Clear"
 		);
 	    }
 
 	int valuesShown = 0;
 	int valuesNotShown = 0;
 	if (field->showAllValues)  // Sort alphabetically if they want all values 
 	    {
 	    slSort(&field->valList, facetValCmp);
 	    }
+	int extraAnchorPeriod = 10;
+	int extraAnchorPos = 0;
 	for (val = field->valList; val; val=val->next)
 	    {
 	    boolean specificallySelected = (val->selected && !field->allSelected);
 	    if ((val->selectCount > 0 && (field->showAllValues || valuesShown < facetUsualSize))
 		|| specificallySelected)
 		{
 		++valuesShown;
+		++extraAnchorPos;
 		char *op = "add";
 		if (specificallySelected)
 		    op = "remove";
-		printf("<dd class=\"facet\">\n");
+		printf("<dd class=\"facet\"");
+		if (extraAnchorPos >= extraAnchorPeriod)
+		    {
+		    safef(selfId, sizeof(selfId), "%s_self_a_%s_%s", varPrefix, vis->name, 
+			val->val);
+		    subChar(selfId, ' ', '_');
+		    printf(" id=\"%s\"", selfId);
+		    extraAnchorPos= 0;
+		    }
+		printf(">\n");
 		htmlPrintf("<input type=checkbox value=%s class=ttFsCheckBox %s>&nbsp;",
 		    specificallySelected ? "true" : "false", 
 		    specificallySelected ? "checked" : "");
 		htmlPrintf("<a href='%s"
 			"&%s_facet_op=%s|none|"
 			"&%s_facet_fieldName=%s|url|"
 			"&%s_facet_fieldVal=%s|url|"
-			"&%s_page=1' "
+			"&%s_page=1#%s' "
 			">",
 		    returnUrl, varPrefix,
-		    op, varPrefix, field->fieldName, varPrefix, val->val, varPrefix
+		    op, varPrefix, field->fieldName, varPrefix, val->val, varPrefix, selfId
 		    );
 		htmlPrintf("%s (%d)</a>", val->val, val->selectCount);
 		printf("</dd>\n");
 		}
 	    else if (val->selectCount > 0)
 		{
 		++valuesNotShown;
 		}
 	    }
 
 	// show "See More" link when facet has lots of values
 	if (valuesNotShown > 0)
 	    {
 	    char *op = "showAllValues";
 	    htmlPrintf("<dd><a href='%s"
 		    "&%s_facet_op=%s|url|"
 		    "&%s_facet_fieldName=%s|url|"
 		    "&%s_facet_fieldVal=%s|url|"
-		    "&%s_page=1' "
+		    "&%s_page=1#%s' "
 		    ">See %d More</a></dd>\n",
 		returnUrl, varPrefix, op, 
-		varPrefix, field->fieldName, varPrefix, "", varPrefix, valuesNotShown 
+		varPrefix, field->fieldName, varPrefix, "", 
+		varPrefix, selfId, valuesNotShown
 		);
 	    }
 
 	// show "See Fewer" link when facet has lots of values
 	if (field->showAllValues && valuesShown >= facetUsualSize)
 	    {
+	    safef(selfId, sizeof(selfId), "%s_self_a_%s", varPrefix, vis->name);
+	    subChar(selfId, ' ', '_');
 	    char *op = "showSomeValues";
 	    htmlPrintf("<dd><a href='%s"
 		    "&%s_facet_op=%s|url|"
 		    "&%s_facet_fieldName=%s|url|"
 		    "&%s_facet_fieldVal=%s|url|"
-		    "&%s_page=1' "
+		    "&%s_page=1#%s' "
 		    ">%s</a></dd>\n",
 		returnUrl, varPrefix, op, varPrefix, field->fieldName, varPrefix, "", varPrefix,
-		"See Fewer"
+		selfId, "See Fewer"
 		);
 	    }
 	htmlPrintf("</div></div>\n");
 	}
     printf("</div>\n");
     // Clicking a checkbox is actually a click on the following link
     jsInlineF(
 	"$(function () {\n"
 	"  $('.ttFsCheckBox').click(function() {\n"
 	"    this.nextSibling.nextSibling.click();\n"
 	"  });\n"
 	"});\n");
     }
 
 // start right column, if there are two columns