7dc6cf43e46774f66fdae62e8df2d674c7dfcf43
tdreszer
  Mon Dec 20 15:21:29 2010 -0800
Subtrack list needed to exclude the view all/visible radio buttons when it is sortable.
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 948e1f1..8d4a44e 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -3855,99 +3855,124 @@
 struct slRef *subtrackRef, *subtrackRefList = trackDbListGetRefsToDescendantLeaves(parentTdb->subtracks);
 
 // Look for dividers, heirarchy, dimensions, sort and dragAndDrop!
 char **lastDivide = NULL;
 dividers_t *dividers = dividersSettingGet(parentTdb);
 if (dividers)
     lastDivide = needMem(sizeof(char*)*dividers->count);
 hierarchy_t *hierarchy = hierarchySettingGet(parentTdb);
 
 membersForAll_t* membersForAll = membersForAllSubGroupsGet(parentTdb,NULL);
 int dimCount=0,di;
 for(di=0;di<membersForAll->dimMax;di++) { if (membersForAll->members[di]) dimCount++; }
 sortOrder_t* sortOrder = sortOrderGet(cart,parentTdb);
 boolean preSorted = FALSE;
 boolean useDragAndDrop = sameOk("subTracks",trackDbSetting(parentTdb, "dragAndDrop"));
+boolean displayAll = sameString(cartUsualString(cart, "displaySubtracks", "all"), "all");
 
 // Determine whether there is a restricted until date column
 boolean restrictions = FALSE;
 for (subtrackRef = subtrackRefList; subtrackRef != NULL; subtrackRef = subtrackRef->next)
     {
     subtrack = subtrackRef->val;
     (void)metadataForTable(db,subtrack,NULL);
     if (NULL != metadataFindValue(subtrack,"dateUnrestricted"))
         {
         restrictions = TRUE;
         break;
         }
     }
 
 // Table wraps around entire list so that "Top" link can float to the correct place.
 printf("<table><tr><td class='windowSize'>");
 printf("<A NAME='DISPLAY_SUBTRACKS'></A>");
+if (sortOrder != NULL)
+    {
+    // First table row contains the display "selected/visible" or "all" radio buttons
+    // NOTE: list subtrack radio buttons are inside tracklist table header if there are no sort columns
+    //       The reason is to ensure spacing of lines column headers when the only column header is "Restricted Until"
+    printf("<B>List subtracks:&nbsp;");
+    char javascript[JBUFSIZE];
+    safef(javascript, sizeof(javascript), "onclick=\"showOrHideSelectedSubtracks(true);\"");
+    cgiMakeOnClickRadioButton("displaySubtracks", "selected", !displayAll,javascript);
+    puts("only selected/visible &nbsp;&nbsp;");
+    safef(javascript, sizeof(javascript), "onclick=\"showOrHideSelectedSubtracks(false);\"");
+    cgiMakeOnClickRadioButton("displaySubtracks", "all", displayAll,javascript);
+    printf("all</B>");
+    if (slCount(subtrackRefList) > 5)
+        printf("&nbsp;&nbsp;&nbsp;&nbsp;(<FONT class='subCBcount'></font>)");
+    makeTopLink(parentTdb);
+    printf("</td></tr></table>");
+    }
+else
 makeTopLink(parentTdb);
 
 // Now we can start in on the table of subtracks  It may be sortable and/or dragAndDroppable
 printf("\n<TABLE CELLSPACING='2' CELLPADDING='0' border='0'");
 dyStringClear(dyHtml);
 if (sortOrder != NULL)
     dyStringPrintf(dyHtml, "sortable");
 if (useDragAndDrop)
     {
     if (dyStringLen(dyHtml) > 0)
         dyStringAppendC(dyHtml,' ');
     dyStringPrintf(dyHtml, "tableWithDragAndDrop");
     }
 if (dyStringLen(dyHtml) > 0)
     {
-    printf(" class='subtracks %s'",dyStringContents(dyHtml));
+    printf(" class='subtracks bglevel1 %s'",dyStringContents(dyHtml));
     colorIx = COLOR_BG_ALTDEFAULT_IX;
     }
 if (sortOrder != NULL)
     puts("><THEAD class=sortable>");
 else
     puts("><THEAD>");
 
-// First table row contains the display "selected/visible" or "all" radio buttons
-boolean displayAll = sameString(cartUsualString(cart, "displaySubtracks", "all"), "all");
 boolean doColorPatch = trackDbSettingOn(parentTdb, "showSubtrackColorOnUi");
 int colspan = 3;
 if (sortOrder != NULL)
     colspan = sortOrder->count+2;
 if (doColorPatch)
     colspan += 1;
 int columnCount = 0;
+if (sortOrder != NULL)
+    printf("<TR id=\"subtracksHeader\" class='sortable%s'>\n",useDragAndDrop?" nodrop nodrag":"");
+else
+    {
 printf("<TR%s>",useDragAndDrop?" id='noDrag' class='nodrop nodrag'":"");
+    // First table row contains the display "selected/visible" or "all" radio buttons
+    // NOTE: list subtrack radio buttons are inside tracklist table header if there are no sort columns
+    //       The reason is to ensure spacing of lines column headers when the only column header is "Restricted Until"
 printf("<TD colspan='%d'><B>List subtracks:&nbsp;", colspan);
 char javascript[JBUFSIZE];
 safef(javascript, sizeof(javascript), "onclick=\"showOrHideSelectedSubtracks(true);\"");
 cgiMakeOnClickRadioButton("displaySubtracks", "selected", !displayAll,javascript);
 puts("only selected/visible &nbsp;&nbsp;");
 safef(javascript, sizeof(javascript), "onclick=\"showOrHideSelectedSubtracks(false);\"");
 cgiMakeOnClickRadioButton("displaySubtracks", "all", displayAll,javascript);
 printf("all</B>");
 if (slCount(subtrackRefList) > 5)
     printf("&nbsp;&nbsp;&nbsp;&nbsp;(<FONT class='subCBcount'></font>)");
 puts("</TD>");
-columnCount++;
+    columnCount = colspan;
+    }
 
 // Add column headers which are sort button links
 if (sortOrder != NULL)
     {
-    puts("<TD colspan=5>&nbsp;</TD></TR>");
-    printf("<TR id=\"subtracksHeader\" class='nodrop nodrag sortable'>\n");
     printf("<TH>&nbsp;<INPUT TYPE=HIDDEN NAME='%s' class='sortOrder' VALUE='%s'></TH>\n", sortOrder->htmlId, sortOrder->sortOrder); // keeing track of sortOrder
+    columnCount++;
     // Columns in tdb order (unchanging), sort in cart order (changed by user action)
     int sIx=0;
     for(sIx=0;sIx<sortOrder->count;sIx++)
         {
 #ifdef SORT_ON_TRACK_NAME
         if (sameString(SORT_ON_TRACK_NAME,sortOrder->column[sIx]))
             break; // All wrangler requested sort orders have been done.
 #endif///def SORT_ON_TRACK_NAME
 #ifdef SORT_ON_RESTRICTED
         if (sameString(SORT_ON_RESTRICTED,sortOrder->column[sIx]))
             break; // All wrangler requested sort orders have been done.
 #endif///def SORT_ON_RESTRICTED
         printf("<TH id='%s' class='sortable%s sort%d' abbr='use' onclick='tableSortAtButtonPress(this);'>%s",
             sortOrder->column[sIx],(sortOrder->forward[sIx]?"":" sortRev"),sortOrder->order[sIx],sortOrder->title[sIx]);
         printf("<sup>%s",(sortOrder->forward[sIx]?"&darr;":"&uarr;"));
@@ -4184,30 +4209,31 @@
 puts("</TBODY><TFOOT>");
 printf("<TR valign='top'><TD colspan=%d>&nbsp;&nbsp;&nbsp;&nbsp;",columnCount-1);
 
 // Count of subtracks is filled in by javascript.
 if (slCount(subtrackRefList) > 5)
     printf("<span class='subCBcount'></span>\n");
 
 // Restruction policy needs a link
 #ifdef SORT_ON_RESTRICTED
 if (restrictions && sortOrder != NULL)
     printf("</TD><TH><A HREF='%s' TARGET=BLANK style='font-size:.9em;'>Restriction Policy</A>", ENCODE_DATA_RELEASE_POLICY);
 #endif///def SORT_ON_RESTRICTED
 
 printf("</TD></TR>\n");
 puts("</TFOOT></TABLE>");
+if (sortOrder == NULL)
 printf("</td></tr></table>");
 
 puts("<P>");
 
 // Tying subtracks with matrix and subtrack cfgs with views requires javascript help
 puts("<script type='text/javascript'>matInitializeMatrix();</script>");
 #ifndef SUBTRACK_CFG_POPUP
 if (dependentCfgsNeedBinding)
     cfgLinkToDependentCfgs(cart,parentTdb,parentTdb->track);
 #endif//ndef SUBTRACK_CFG_POPUP
 
 // Finally we are free of all this
 membersForAllSubGroupsFree(parentTdb,&membersForAll);
 dyStringFree(&dyHtml)
 sortOrderFree(&sortOrder);