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);