feb380e4c526092d9793e1d70f8a484cca2ae338
galt
  Tue Oct 20 01:18:28 2020 -0700
Fix speed of javascript in View, Facets, and Subtracks for hgTrackUi. fixes #26381

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index f65adcb..53ed2fc 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -4189,48 +4189,30 @@
 }
 
 void highlightBySetCfgUi(struct cart *cart, struct trackDb *tdb,
 		     filterBy_t *filterBySet, boolean onOneLine, char *prefix)
 /* Does the highlight UI for a list of filterBy structure */
 {
 filterBySetCfgUiGuts(cart, tdb, filterBySet, onOneLine, "Highlight", "hbc", "None", prefix);
 }
 
 #define COLOR_BG_DEFAULT_IX     0
 #define COLOR_BG_ALTDEFAULT_IX  1
 #define DIVIDING_LINE "<TR valign=\"CENTER\" line-height=\"1\" BGCOLOR=\"%s\"><TH colspan=\"5\" " \
 		  "align=\"CENTER\"><hr noshade color=\"%s\" width=\"100%%\"></TD></TR>\n"
 #define DIVIDER_PRINT(color) printf(DIVIDING_LINE,COLOR_BG_DEFAULT,(color))
 
-static char *checkBoxIdMakeForTrack(struct trackDb *tdb,members_t** dims,int dimMax,
-				membership_t *membership)
-// Creates an 'id' string for subtrack checkbox in style that matrix understand:
-//     "cb_dimX_dimY_view_cb"
-{
-int len = strlen(tdb->track) + 10;
-char *id = needMem(len);
-safef(id,len,"%s_sel",tdb->track);
-return id;
-}
-
-static void checkBoxIdFree(char**id)
-// Frees 'id' string 
-{
-if (id && *id)
-    freez(id);
-}
-
 static boolean divisionIfNeeded(char **lastDivide,dividers_t *dividers,membership_t *membership)
 // Keeps track of location within subtracks in order to provide requested division lines
 {
 boolean division = FALSE;
 if (dividers)
     {
     if (lastDivide != NULL)
 	{
 	int ix;
 	for (ix=0;ix<dividers->count;ix++)
 	    {
 	    int sIx = stringArrayIx(dividers->subgroups[ix],membership->subgroups,
 				    membership->count);
 	    if ((lastDivide[ix] == (void*)NULL && sIx >= 0)
 	    ||  (lastDivide[ix] != (void*)NULL && sIx <  0)
@@ -4856,30 +4838,31 @@
     sqlFreeResult(&sr);
     hFreeConn(&conn);
     }
 return tableHash;
 }
 
 static void printSubtrackTableBody(struct trackDb *parentTdb, struct slRef *subtrackRefList,
 				struct subtrackConfigSettings *settings, struct cart *cart)
 /* Print list of subtracks */
 {
 sortOrder_t *sortOrder = settings->sortOrder;
 boolean useDragAndDrop = settings->useDragAndDrop;
 boolean restrictions = settings->restrictions;
 struct dyString *dyHtml = newDyString(SMALLBUF);
 char buffer[SMALLBUF];
+char id[SMALLBUF];
 char *db = cartString(cart, "db");
 
 // The subtracks need to be sorted by priority but only sortable and dragable will have
 // non-default (cart) priorities to sort on
 if (sortOrder != NULL || useDragAndDrop)
     {
     // preserves user's prev sort/drags, ignore returned value about where
     //  priorities come from
     (void) tdbRefSortPrioritiesFromCart(cart, &subtrackRefList);
     printf("<TBODY class='%saltColors'>\n", (sortOrder != NULL ? "sortable " : "") );
     }
 else
     {
     slSort(&subtrackRefList, trackDbRefCmp);  // straight from trackDb.ra
     puts("<TBODY>");
@@ -4939,33 +4922,31 @@
 	    cType = cfgNone;
 	}
 
     if (sortOrder == NULL && !useDragAndDrop)
 	{
 	char **lastDivide = NULL;
 	dividers_t *dividers = dividersSettingGet(parentTdb);
 	if (dividers)
 	    lastDivide = needMem(sizeof(char*)*dividers->count);
 	if (membership && divisionIfNeeded(lastDivide,dividers,membership) )
 	    colorIx = (colorIx == COLOR_BG_DEFAULT_IX ? COLOR_BG_ALTDEFAULT_IX
 						      : COLOR_BG_DEFAULT_IX);
 	dividersFree(&dividers);
 	}
 
-    // Start the TR which must have an id that is directly related to the checkBox id
-    char *id = checkBoxIdMakeForTrack(subtrack,membersForAll->members,membersForAll->dimMax,
-				      membership); // view is known tag
+    safef(id, sizeof(id), "%s_sel", subtrack->track);
     printf("<TR valign='top' class='%s%s'",
 		colors[colorIx],(useDragAndDrop?" trDraggable":""));
     printf(" id=tr_%s%s>\n",id,(!visibleCB && !settings->displayAll?" style='display:none'":""));
 
     // Now the TD that holds the checkbox
     printf("<TD%s%s>",
 	   (enabledCB?"":" title='view is hidden'"),
 	   (useDragAndDrop?" class='dragHandle' title='Drag to reorder'":""));
 
     // A hidden field to keep track of subtrack order if it could change
     if (sortOrder != NULL || useDragAndDrop)
 	{
 	safef(buffer, sizeof(buffer), "%s.priority", subtrack->track);
 	float priority = (float)cartUsualDouble(cart, buffer, subtrack->priority);
 	printf("<INPUT TYPE=HIDDEN NAME='%s' class='trPos' VALUE=\"%.0f\">",
@@ -5161,31 +5142,30 @@
     if (restrictions)
 	{
 	char *dateDisplay = encodeRestrictionDate(db,subtrack,FALSE); // includes dates in the past
 	if (dateDisplay)
 	    {
 	    if (dateIsOld(dateDisplay, MDB_ENCODE_DATE_FORMAT))
 		printf("</TD>\n<TD align='center' nowrap style='color: #BBBBBB;'>&nbsp;%s&nbsp;",
 		       dateDisplay);
 	    else
 		printf("</TD>\n<TD align='center'>&nbsp;%s&nbsp;", dateDisplay);
 	    }
 	}
 
     // End of row and free ourselves of this subtrack
     puts("</TD></TR>\n");
-    checkBoxIdFree(&id);
 
     boolean showCfg = trackDbSettingOn(subtrack, "showCfg");
     if (showCfg)
         jsInlineF(" subCfg.cfgToggle(document.getElementById(\"%s_toggle\"),\"%s\");",  subtrack->track, subtrack->track);
 
     }
 
 // End of the table
 puts("</TBODY>");
 dyStringFree(&dyHtml)
 membersForAllSubGroupsFree(parentTdb,&membersForAll);
 }
 
 static boolean membersHaveMatrix(membersForAll_t *membersForAll)
 /* Check for matrix */