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: ", 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 "); safef(javascript, sizeof(javascript), "class='allOrOnly' onclick='showOrHideSelectedSubtracks(false);'"); cgiMakeOnClickRadioButton(buffer, "all", displayAll,javascript); printf("all</B>"); if (slCount(subtrackRefList) > 5) printf(" (<span class='subCBcount'></span>)"); puts("</TD>"); columnCount = colspan; } // Add column headers which are sort button links if (sortOrder != NULL) { printf("<TH> <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]?"↓":"↑")); 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(" "); #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'> </TD>", @@ -4263,40 +4265,44 @@ printf("</TD>\n<TD align='center' nowrap style='color: #BBBBBB;'> %s ", dateDisplay); else printf("</TD>\n<TD align='center'> %s ", 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> ", - 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> ",columnCount-1); + else + printf("<TD colspan=%d> ",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)