19e6e03d64ce54f9db60a93734cd3b573eb0446b
kent
  Fri Jan 29 09:07:37 2021 -0800
I believe I got all the faceted variables using the varPrefix.  Tested this by having two faceted tables on the same page and it worked.  Looks clean by cartDump too.

diff --git src/hg/hgFacetedBars/hgFacetedBars.c src/hg/hgFacetedBars/hgFacetedBars.c
index d01c3e7..83ea6ae 100644
--- src/hg/hgFacetedBars/hgFacetedBars.c
+++ src/hg/hgFacetedBars/hgFacetedBars.c
@@ -39,31 +39,31 @@
 }
 
 void facetedTableFree(struct facetedTable **pFt)
 /* Free up resources associated with faceted table */
 {
 struct facetedTable *ft = *pFt;
 if (ft != NULL)
     {
     freeMem(ft->name);
     freeMem(ft->varPrefix);
     freez(pFt);
     }
 }
 
 
-void facetedTableWebInit(struct facetedTable *ft)
+void facetedTableWebInit()
 /* Print out scripts and css that we need.  We should be in a page body or title. */
 {
 webIncludeResourceFile("facets.css");
 printf("\t\t<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js\"></script>");
 printf("\t\t<link rel=\"stylesheet\" href=\"https://use.fontawesome.com/releases/v5.7.2/css/all.css\"\n"
     "\t\t integrity=\"sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr\"\n"
     "\t\t crossorigin=\"anonymous\">\n"
     "\n"
     "\t\t<!-- Latest compiled and minified CSS -->\n"
     "\t\t<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css\"\n"
     "\t\t integrity=\"sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm\"\n"
     "\t\t crossorigin=\"anonymous\">\n"
     "\n"
     "\t\t<!-- Latest compiled and minified JavaScript -->\n"
     "\t\t<script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js\"\n"
@@ -84,89 +84,124 @@
 /* Look up sel field in cart */
 {
 char var[256];
 safef(var, sizeof(var), "%s_facet_fieldName", ft->varPrefix);
 return cartOptionalString(cart, var);
 }
 
 char *facetedTableSelVal(struct facetedTable *ft, struct cart *cart)
 /* Look up sel val in cart */
 {
 char var[256];
 safef(var, sizeof(var), "%s_facet_fieldVal", ft->varPrefix);
 return cartOptionalString(cart, var);
 }
 
+char *facetedTableSelList(struct facetedTable *ft, struct cart *cart)
+/* Look up sel val in cart */
+{
+char var[256];
+safef(var, sizeof(var), "%s_facet_selList", ft->varPrefix);
+return cartOptionalString(cart, var);
+}
+
 
 void facetedTableRemoveOpVars(struct facetedTable *ft, struct cart *cart)
 /* Remove sel op/field/name vars from cart */
 {
 char var[256];
 safef(var, sizeof(var), "%s_facet_op", ft->varPrefix);
 cartRemove(cart, var);
 safef(var, sizeof(var), "%s_facet_fieldVal", ft->varPrefix);
 cartRemove(cart, var);
 safef(var, sizeof(var), "%s_facet_fieldName", ft->varPrefix);
 cartRemove(cart, var);
 }
 
+boolean facetedTableUpdateOnFacetClick(struct facetedTable *ft, struct cart *cart)
+/* If we got called by a click on a facet deal with that and return TRUE, else do
+ * nothing and return false */
+{
+char *selOp = facetedTableSelOp(ft, cart);
+if (selOp)
+    {
+    char *selFieldName = facetedTableSelField(ft, cart);
+    char *selFieldVal = facetedTableSelVal(ft, cart);
+    if (selFieldName && selFieldVal)
+	{
+	char selListVar[256];
+	safef(selListVar, sizeof(selListVar), "%s_facet_selList", ft->varPrefix);
+	char *selectedFacetValues=cartUsualString(cart, selListVar, "");
+	struct facetField *selList = deLinearizeFacetValString(selectedFacetValues);
+	selectedListFacetValUpdate(&selList, selFieldName, selFieldVal, selOp);
+	char *newSelectedFacetValues = linearizeFacetVals(selList);
+	cartSetString(cart, selListVar, newSelectedFacetValues);
+	facetedTableRemoveOpVars(ft, cart);
+	}
+    return TRUE;
+    }
+else
+    return FALSE;
+}
+
+
 void doBody()
 {
 /* Fake up a 'track' for development */
 char *trackName = "cellFacetsJk1";
+char *trackName2 = "tableList";
 
 struct sqlConnection *conn = sqlConnect(database);
 struct hash *emptyHash = hashNew(0);
 struct facetedTable *ft = facetedTableNew("the original", trackName);
+struct facetedTable *ft2 = facetedTableNew("the other", trackName2);
 
 /* Write out html to pull in the other files we use. */
-facetedTableWebInit(ft);
+facetedTableWebInit();
 
 /* Working within a form we save context */
 printf("<form action=\"../cgi-bin/hgFacetedBars\" name=\"facetForm\" method=\"GET\">\n");
 cartSaveSession(cart);
 
 /* Set up url that has enough context to get back to us.  This is very much a work in 
  * progress. */
 char returnUrl[PATH_LEN*2];
 safef(returnUrl, sizeof(returnUrl), "../cgi-bin/hgFacetedBars?%s",
     cartSidUrlString(cart) );
 
 /* If we got called by a click on a facet deal with that */
-char *selOp = facetedTableSelOp(ft, cart);
-if (selOp)
-    {
-    char *selFieldName = facetedTableSelField(ft, cart);
-    char *selFieldVal = facetedTableSelVal(ft, cart);
-    if (selFieldName && selFieldVal)
-	{
-	char *selectedFacetValues=cartUsualString(cart, "cdwSelectedFieldValues", "");
-	struct facetField *selList = deLinearizeFacetValString(selectedFacetValues);
-	selectedListFacetValUpdate(&selList, selFieldName, selFieldVal, selOp);
-	char *newSelectedFacetValues = linearizeFacetVals(selList);
-	cartSetString(cart, "cdwSelectedFieldValues", newSelectedFacetValues);
-	facetedTableRemoveOpVars(ft, cart);
-	}
-    }
 
 /* Put up the big faceted search table */
+printf("<div>\n");
+facetedTableUpdateOnFacetClick(ft, cart);
 webFilteredSqlTable(cart, conn, 
     "cell_count,organ,cell_type", trackName, "", 
     returnUrl, trackName, 32, 
     emptyHash, NULL, 
-    FALSE, NULL, 100, 10, emptyHash, "organ,cell_class,stage,cell_type",
+    FALSE, NULL, 50, 7, emptyHash, "organ,cell_class,stage,cell_type",
+    NULL);
+printf("</div>\n");
+
+printf("<div>\n");
+facetedTableUpdateOnFacetClick(ft2, cart);
+webFilteredSqlTable(cart, conn, 
+    "tableName,field,type,nullAllowed", trackName2, "", 
+    returnUrl, trackName2, 32, 
+    emptyHash, NULL, 
+    FALSE, NULL, 50, 7, emptyHash, "type,field,tableName",
     NULL);
+printf("</div>\n");
 
 /* Clean up and go home. */
 printf("</form>\n");
 hashFree(&emptyHash);
 sqlDisconnect(&conn);
 }
 
 void doMiddle(struct cart *theCart)
 /* Set up globals and make web page */
 {
 /* Set some major global variable and attach us to current genome and DB. */
 cart = theCart;
 getDbAndGenome(cart, &database, &genome, oldVars);
 initGenbankTableNames(database);