f059c823c500cb98784e9ab20ced74a2d0df3de7
tdreszer
  Wed Jan 11 14:03:48 2012 -0800
Adding an ectra column to subtrack list so that drag and drop works with subVis. 4665
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 70da773..58d9434 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -3837,41 +3837,30 @@
 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"));
-#ifdef SUBTRACK_CFG
-if (useDragAndDrop)  // IE9 & Chrom fail on subVisDD when dragAndDrop !
-    {
-    char *browserVersion;
-    enum browserType browserType = cgiClientBrowser(&browserVersion, NULL, NULL);
-    if ( browserType == btChrome
-    ||   browserType == btSafari
-    ||  (browserType == btIE  && *browserVersion > '8'))
-        useDragAndDrop = FALSE;
-    }
-#endif///def SUBTRACK_CFG
 char buffer[SMALLBUF];
 char *displaySubs = NULL;
 int subCount = slCount(subtrackRefList);
 #define LARGE_COMPOSITE_CUTOFF 30
 if (subCount > LARGE_COMPOSITE_CUTOFF)
     {
     safef(buffer,SMALLBUF,"%s.displaySubtracks",parentTdb->track);
     displaySubs = cartUsualString(cart, buffer,"some");              // track specific defaults to only selected
     }
 else
     {
     displaySubs = cartUsualString(cart, "displaySubtracks", "all");  // browser wide defaults to all
     }
 boolean displayAll = sameString(displaySubs, "all");
 
@@ -3931,30 +3920,34 @@
 printf(" class='subtracks");
 if (dyStringLen(dyHtml) > 0)
     {
     printf(" bglevel1 %s'",dyStringContents(dyHtml));
     colorIx = COLOR_BG_ALTDEFAULT_IX;
     }
 if (sortOrder != NULL)
     puts("'><THEAD class=sortable>");
 else
     puts("'><THEAD>");
 
 boolean doColorPatch = trackDbSettingOn(parentTdb, "showSubtrackColorOnUi");
 int colspan = 3;
 if (sortOrder != NULL)
     colspan = sortOrder->count+2;
+#ifdef SUBTRACK_CFG
+else if (!tdbIsMultiTrack(parentTdb)) // An extra column for subVis/wrench so dragAndDrop works
+    colspan++;
+#endif///def SUBTRACK_CFG
 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), "class='allOrOnly' onclick='showOrHideSelectedSubtracks(true);'");
     if (subCount > LARGE_COMPOSITE_CUTOFF)
@@ -3965,30 +3958,37 @@
     puts("only selected/visible &nbsp;&nbsp;");
     safef(javascript, sizeof(javascript), "class='allOrOnly' onclick='showOrHideSelectedSubtracks(false);'");
     cgiMakeOnClickRadioButton(buffer, "all", displayAll,javascript);
     printf("all</B>");
     if (slCount(subtrackRefList) > 5)
         printf("&nbsp;&nbsp;&nbsp;&nbsp;(<span class='subCBcount'></span>)");
     puts("</TD>");
     columnCount = colspan;
     }
 
 // Add column headers which are sort button links
 if (sortOrder != NULL)
     {
     printf("<TH>&nbsp;<INPUT TYPE=HIDDEN NAME='%s' class='sortOrder' VALUE='%s'></TH>\n", sortOrder->htmlId, sortOrder->sortOrder); // keeing track of sortOrder
     columnCount++;
+#ifdef SUBTRACK_CFG
+    if (!tdbIsMultiTrack(parentTdb))  // An extra column for subVis/wrench so dragAndDrop works
+        {
+        printf("<TH></TH>\n");
+        columnCount++;
+        }
+#endif///def SUBTRACK_CFG
     // Columns in tdb order (unchanging), sort in cart order (changed by user action)
     int sIx=0;
     for(sIx=0;sIx<sortOrder->count;sIx++)
         {
         if (sameString(SORT_ON_TRACK_NAME,sortOrder->column[sIx]))
             break; // All wrangler requested sort orders have been done.
         if (sameString(SORT_ON_RESTRICTED,sortOrder->column[sIx]))
             break; // All wrangler requested sort orders have been done.
         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;"));
         if (sortOrder->count > 1)
             printf ("%d",sortOrder->order[sIx]);
         printf("</sup>");
         puts ("</TH>");
@@ -4128,47 +4128,49 @@
 #ifdef SUBTRACK_CFG
     if (!enabledCB)
         {
         dyStringAppend(dyHtml, " disabled");
         cgiMakeCheckBoxFourWay(buffer,checkedCB,enabledCB,id,dyStringContents(dyHtml),"onclick='matSubCbClick(this);' style='cursor:pointer' title='view is hidden'");
         }
     else
 #endif///def SUBTRACK_CFG
         cgiMakeCheckBoxFourWay(buffer,checkedCB,enabledCB,id,dyStringContents(dyHtml),"onclick='matSubCbClick(this);' style='cursor:pointer'");
     if (useDragAndDrop)
         printf("&nbsp;");
 
 #ifdef SUBTRACK_CFG
     if (!tdbIsMultiTrack(parentTdb))  // MultiTracks never have independent vis
         {
+        printf("<TD>"); // An extra column for subVis/wrench so dragAndDrop works
         enum trackVisibility vis = tdbVisLimitedByAncestors(cart,subtrack,FALSE,FALSE);
         char *view = NULL;
         if (membersForAll->members[dimV]
         && -1 != (ix = stringArrayIx(membersForAll->members[dimV]->groupTag, membership->subgroups, membership->count)))
             view = membership->membership[ix];
             char classList[256];
             if (view != NULL)
                 safef(classList,sizeof(classList),"clickable fauxInput%s subVisDD %s",(visibleCB ? "":" disabled"),view); // view should be last!
             else
                 safef(classList,sizeof(classList),"clickable fauxInput%s subVisDD",(visibleCB ? "":" disabled"));
             #define SUBTRACK_CFG_VIS "<div id= '%s_faux' class='%s' style='width:65px;' onclick='return subCfg.replaceWithVis(this,\"%s\",true);'>%s</div>\n"
             printf(SUBTRACK_CFG_VIS,subtrack->track,classList,subtrack->track,hStringFromTv(vis));
         if (cType != cfgNone)  // make a wrench
             {
             #define SUBTRACK_CFG_WRENCH "<span class='clickable%s' onclick='return subCfg.cfgToggle(this,\"%s\");' title='Configure this subtrack'><img src='../images/wrench.png'></span>\n"
             printf(SUBTRACK_CFG_WRENCH,(visibleCB ? "":" disabled"),subtrack->track);
             }
+        printf("</TD>");
         }
 #endif///def SUBTRACK_CFG
 
     // 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\">", buffer, priority); // keeing track of priority
         }
 
     // A color patch which helps distinguish subtracks in some types of composites
     if (doColorPatch)
         {
         printf("<TD BGCOLOR='#%02X%02X%02X'>&nbsp;&nbsp;&nbsp;&nbsp;</TD>",
@@ -4263,40 +4265,44 @@
                 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);
     }
 
 // End of the table
 puts("</TBODY>");
 if (slCount(subtrackRefList) > 5 || (restrictions && sortOrder != NULL))
     {
-    printf("<TFOOT style='background-color:%s;'><TR valign='top'><TD colspan=%d>&nbsp;&nbsp;&nbsp;&nbsp;",
-           COLOR_BG_DEFAULT_DARKER,columnCount-1);
+    printf("<TFOOT style='background-color:%s;'><TR valign='top'>", COLOR_BG_DEFAULT_DARKER);
+    if (restrictions && sortOrder != NULL)
+        printf("<TD colspan=%d>&nbsp;&nbsp;&nbsp;&nbsp;",columnCount-1);
+    else
+        printf("<TD colspan=%d>&nbsp;&nbsp;&nbsp;&nbsp;",columnCount);
 
     // Count of subtracks is filled in by javascript.
     if (slCount(subtrackRefList) > 5)
         printf("<span class='subCBcount'></span>\n");
 
-    // Restruction policy needs a link
+    // Restriction policy needs a link
     if (restrictions && sortOrder != NULL)
-        printf("</TD><TH><A HREF='%s' TARGET=BLANK style='font-size:.9em;'>Restriction Policy</A>", ENCODE_DATA_RELEASE_POLICY);
+        printf("</TD><TH><A HREF='%s' TARGET=BLANK style='font-size:.9em;'>Restriction Policy</A>",
+               ENCODE_DATA_RELEASE_POLICY);
 
     printf("</TD></TR></TFOOT>\n");
     }
 puts("</TABLE>");
 if (sortOrder == NULL)
     printf("</td></tr></table>");
 
 #ifndef SUBTRACK_CFG
 if (dependentCfgsNeedBinding)
     cfgLinkToDependentCfgs(cart,parentTdb,parentTdb->track);
 #endif//ndef SUBTRACK_CFG
 
 // Finally we are free of all this
 membersForAllSubGroupsFree(parentTdb,&membersForAll);
 dyStringFree(&dyHtml)