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> ", 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