26a38dbb5ff226e6848067217518ff9e212696b8
kent
Sat Jan 30 11:43:20 2021 -0800
Refactoring facetedTable stuff from a hgc module into a library routine.
diff --git src/hg/lib/facetedTable.c src/hg/lib/facetedTable.c
new file mode 100644
index 0000000..d512ad1
--- /dev/null
+++ src/hg/lib/facetedTable.c
@@ -0,0 +1,196 @@
+
+#include "common.h"
+#include "hash.h"
+#include "hdb.h"
+#include "web.h"
+#include "trashDir.h"
+#include "hCommon.h"
+#include "hgColors.h"
+#include "fieldedTable.h"
+#include "tablesTables.h"
+#include "facetField.h"
+#include "hgConfig.h"
+#include "facetedTable.h"
+
+static struct facetedTable *facetedTableNew(char *name, char *varPrefix, char *facets)
+/* Return new, mostly empty faceted table */
+{
+struct facetedTable *facTab;
+AllocVar(facTab);
+facTab->name = cloneString(name);
+facTab->varPrefix = cloneString(varPrefix);
+facTab->facets = cloneString(facets);
+return facTab;
+}
+
+struct facetedTable *facetedTableFromTable(struct fieldedTable *table,
+ char *varPrefix, char *facets)
+/* Construct a facetedTable around a fieldedTable */
+{
+struct facetedTable *facTab = facetedTableNew(table->name, varPrefix, facets);
+facTab->table = table;
+AllocArray(facTab->ffArray, table->fieldCount);
+return facTab;
+}
+
+
+void facetedTableFree(struct facetedTable **pFt)
+/* Free up resources associated with faceted table */
+{
+struct facetedTable *facTab = *pFt;
+if (facTab != NULL)
+ {
+ freeMem(facTab->name);
+ freeMem(facTab->varPrefix);
+ freeMem(facTab->facets);
+ freeMem(facTab->ffArray);
+ freez(pFt);
+ }
+}
+
+static void facetedTableWebInit()
+/* Print out scripts and css that we need. We should be in a page body or title. */
+{
+static boolean initted = FALSE;
+if (initted)
+ return;
+initted = TRUE;
+webIncludeResourceFile("facets.css");
+printf("\t\t");
+printf("\t\t\n"
+ "\n"
+ "\t\t\n"
+ "\t\t\n"
+ "\n"
+ "\t\t\n"
+ "\t\t\n"
+ );
+}
+
+static char *facetedTableSelList(struct facetedTable *facTab, struct cart *cart)
+/* Look up list of selected items in facets from cart */
+{
+char var[256];
+safef(var, sizeof(var), "%s_facet_selList", facTab->varPrefix);
+return cartOptionalString(cart, var);
+}
+
+static char *facetedTableSelOp(struct facetedTable *facTab, struct cart *cart)
+/* Look up selOp in cart */
+{
+char var[256];
+safef(var, sizeof(var), "%s_facet_op", facTab->varPrefix);
+return cartOptionalString(cart, var);
+}
+
+static char *facetedTableSelField(struct facetedTable *facTab, struct cart *cart)
+/* Look up sel field in cart */
+{
+char var[256];
+safef(var, sizeof(var), "%s_facet_fieldName", facTab->varPrefix);
+return cartOptionalString(cart, var);
+}
+
+static char *facetedTableSelVal(struct facetedTable *facTab, struct cart *cart)
+/* Look up sel val in cart */
+{
+char var[256];
+safef(var, sizeof(var), "%s_facet_fieldVal", facTab->varPrefix);
+return cartOptionalString(cart, var);
+}
+
+static void facetedTableRemoveOpVars(struct facetedTable *facTab, struct cart *cart)
+/* Remove sel op/field/name vars from cart */
+{
+char var[256];
+safef(var, sizeof(var), "%s_facet_op", facTab->varPrefix);
+cartRemove(cart, var);
+safef(var, sizeof(var), "%s_facet_fieldVal", facTab->varPrefix);
+cartRemove(cart, var);
+safef(var, sizeof(var), "%s_facet_fieldName", facTab->varPrefix);
+cartRemove(cart, var);
+}
+
+boolean facetedTableUpdateOnClick(struct facetedTable *facTab, 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(facTab, cart);
+if (selOp)
+ {
+ char *selFieldName = facetedTableSelField(facTab, cart);
+ char *selFieldVal = facetedTableSelVal(facTab, cart);
+ if (selFieldName && selFieldVal)
+ {
+ char selListVar[256];
+ safef(selListVar, sizeof(selListVar), "%s_facet_selList", facTab->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(facTab, cart);
+ }
+ return TRUE;
+ }
+else
+ return FALSE;
+}
+
+struct fieldedTable *facetedTableSelect(struct facetedTable *facTab, struct cart *cart)
+/* Return table containing rows of table that have passed facet selection */
+{
+char *selList = facetedTableSelList(facTab, cart);
+return facetFieldsFromFieldedTable(facTab->table, selList, facTab->ffArray);
+}
+
+struct slInt *facetedTableSelectOffsets(struct facetedTable *facTab, struct cart *cart)
+/* Return a list of row positions that pass faceting */
+{
+char *selList = facetedTableSelList(facTab, cart);
+struct fieldedTable *ft = facTab->table;
+int fieldCount = ft->fieldCount;
+struct slInt *retList = NULL;
+facetFieldsFromSqlTableInit(ft->fields, fieldCount,
+ selList, facTab->ffArray);
+struct fieldedRow *fr;
+int ix = 0;
+for (fr = facTab->table->rowList; fr != NULL; fr = fr->next)
+ {
+ if (perRowFacetFields(fieldCount, fr->row, "", facTab->ffArray))
+ {
+ struct slInt *el = slIntNew(ix);
+ slAddHead(&retList, el);
+ }
+ ++ix;
+ }
+slReverse(&retList);
+return retList;
+}
+
+
+void facetedTableWriteHtml(struct facetedTable *facTab, struct cart *cart,
+ struct fieldedTable *selected, char *displayList,
+ char *returnUrl, int maxLenField,
+ struct hash *tagOutputWrappers, void *wrapperContext, int facetUsualSize)
+/* Write out the main HTML associated with facet selection and table. */
+{
+facetedTableWebInit();
+struct hash *emptyHash = hashNew(0);
+webFilteredFieldedTable(cart, selected,
+ displayList, returnUrl, facTab->varPrefix,
+ maxLenField, tagOutputWrappers, wrapperContext,
+ FALSE, NULL,
+ selected->rowCount, facetUsualSize,
+ NULL, emptyHash,
+ facTab->ffArray, facTab->facets,
+ NULL);
+hashFree(&emptyHash);
+}
+