dacec81196967c10d494c7b77a49cc41a5aa63ce
kent
  Thu Jan 28 22:10:56 2021 -0800
Making a couple of more variables use the varPrefix rather than be hard coded.

diff --git src/hg/hgFacetedBars/hgFacetedBars.c src/hg/hgFacetedBars/hgFacetedBars.c
index 0cfc09f..d01c3e7 100644
--- src/hg/hgFacetedBars/hgFacetedBars.c
+++ src/hg/hgFacetedBars/hgFacetedBars.c
@@ -9,84 +9,154 @@
 #include "web.h"
 #include "cheapcgi.h"
 #include "cart.h"
 #include "hui.h"
 #include "udc.h"
 #include "knetUdc.h"
 #include "genbank.h"
 #include "tablesTables.h"
 
 /* Global Variables */
 struct cart *cart;             /* CGI and other variables */
 struct hash *oldVars = NULL;
 char *database = NULL;
 char *genome = NULL;
 
-void doBody()
+struct facetedTable
+/* Help manage a faceted table */
     {
-struct sqlConnection *conn = sqlConnect(database);
-struct hash *emptyHash = hashNew(0);
+    struct facetedTable *next;
+    char *name;		/* Name of file or database table */
+    char *varPrefix;	/* Prefix used on variables */
+    };
 
-/* Write out html to pull in the other files we use. */
+struct facetedTable *facetedTableNew(char *name, char *varPrefix)
+{
+struct facetedTable *ft;
+AllocVar(ft);
+ft->name = cloneString(name);
+ft->varPrefix = cloneString(varPrefix);
+return ft;
+}
+
+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)
+/* 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"
     "\t\t integrity=\"sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl\"\n"
     "\t\t crossorigin=\"anonymous\"></script>\n"
     );
+}
 
-/* Working within a form we save context */
-printf("<form action=\"../cgi-bin/hgFacetedBars\" name=\"facetForm\" method=\"GET\">\n");
-cartSaveSession(cart);
+char *facetedTableSelOp(struct facetedTable *ft, struct cart *cart)
+/* Look up selOp in cart */
+{
+char var[256];
+safef(var, sizeof(var), "%s_facet_op", ft->varPrefix);
+return cartOptionalString(cart, var);
+}
 
+char *facetedTableSelField(struct facetedTable *ft, struct cart *cart)
+/* 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);
+}
+
+
+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);
+}
+
+void doBody()
+{
 /* Fake up a 'track' for development */
 char *trackName = "cellFacetsJk1";
 
+struct sqlConnection *conn = sqlConnect(database);
+struct hash *emptyHash = hashNew(0);
+struct facetedTable *ft = facetedTableNew("the original", trackName);
+
+/* Write out html to pull in the other files we use. */
+facetedTableWebInit(ft);
+
+/* 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 opVar[256];
-safef(opVar, sizeof(opVar), "%s_facet_op", trackName);
-char *selOp = cartOptionalString(cart, opVar);
+char *selOp = facetedTableSelOp(ft, cart);
 if (selOp)
     {
-    char *selFieldName = cartOptionalString(cart, "browseFiles_facet_fieldName");
-    char *selFieldVal = cartOptionalString(cart, "browseFiles_facet_fieldVal");
+    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);
-	cartRemove(cart, opVar);
-	cartRemove(cart, "browseFiles_facet_fieldName");
-	cartRemove(cart, "browseFiles_facet_fieldVal");
+	facetedTableRemoveOpVars(ft, cart);
 	}
     }
 
 /* Put up the big faceted search table */
 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",
     NULL);
 
 /* Clean up and go home. */
 printf("</form>\n");
 hashFree(&emptyHash);
 sqlDisconnect(&conn);