d247275d8266bad8d22c108df1b40a8665e109bf tdreszer Fri Sep 23 16:16:24 2011 -0700 Another load of subCfg module (scm). Heavy work getting subCbs, matCbs and views all playing nice. diff --git src/hg/lib/hui.c src/hg/lib/hui.c index fdde31f..005d72d 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -2181,31 +2181,39 @@ fourState = FOUR_STATE_CHECKED; } // Now check visibility enum trackVisibility vis = tdbLocalVisibility(cart, subtrack, NULL); if (vis == tvHide) { if(tdbIsCompositeView(subtrack->parent)) { if(tdbLocalVisibility(cart, subtrack->parent, NULL) == tvHide) FOUR_STATE_DISABLE(fourState); } } safef(objName, sizeof(objName), "%s_sel", subtrack->track); -fourState = cartUsualInt(cart, objName, fourState); +//fourState = cartUsualInt(cart, objName, fourState); +setting = cartOptionalString(cart, objName); +if (setting != NULL) + { + if (sameWord("on",setting)) // ouch! atoi was interpreting "on" as 0, which was a bad bug! + fourState = 1; + else + fourState = atoi(setting); + } tdbExtrasFourStateSet(subtrack,fourState); return fourState; } void subtrackFourStateCheckedSet(struct trackDb *subtrack, struct cart *cart,boolean checked, boolean enabled) /* Sets the fourState Checked in the cart and updates cached state */ { int fourState = ( checked ? FOUR_STATE_CHECKED : FOUR_STATE_UNCHECKED ); if (!enabled) FOUR_STATE_DISABLE(fourState); char objName[SMALLBUF]; char objVal[5]; safef(objName, sizeof(objName), "%s_sel", subtrack->track); safef(objVal, sizeof(objVal), "%d", fourState); @@ -3481,51 +3489,45 @@ if(filterBySet == NULL) return; #define FILTERBY_HELP_LINK "<A HREF=\"../goldenPath/help/multiView.html\" TARGET=ucscHelp>help</A>" int count = slCount(filterBySet); if(count == 1) puts("<TABLE cellpadding=3><TR valign='top'>"); else printf("<B>Filter items by:</B> (select multiple categories and items - %s)<TABLE cellpadding=3><TR valign='top'>\n",FILTERBY_HELP_LINK); filterBy_t *filterBy = NULL; if(cartOptionalString(cart, "ajax") == NULL) { webIncludeResourceFile("ui.dropdownchecklist.css"); jsIncludeFile("ui.dropdownchecklist.js",NULL); -#ifdef NEW_JQUERY jsIncludeFile("ddcl.js",NULL); -#endif///def NEW_JQUERY } int ix=0; for(filterBy = filterBySet;filterBy != NULL; filterBy = filterBy->next) { puts("<TD>"); if(count == 1) printf("<B>Filter by %s</B> (select multiple items - %s)",filterBy->title,FILTERBY_HELP_LINK); else printf("<B>%s</B>",filterBy->title); printf("<BR>\n"); // TODO: columnCount (Number of filterBoxes per row) should be configurable through tdb setting - #ifdef NEW_JQUERY #define FILTER_BY_FORMAT "<SELECT id='fbc%d' name='%s.filterBy.%s' multiple style='display: none; font-size:.9em;' class='filterBy'><BR>\n" - #else///ifndef NEW_JQUERY - #define FILTER_BY_FORMAT "<SELECT id='fbc%d' name='%s.filterBy.%s' multiple style='display: none;' class='filterBy'><BR>\n" - #endif///ndef NEW_JQUERY printf(FILTER_BY_FORMAT,ix,tdb->track,filterBy->column); ix++; printf("<OPTION%s>All</OPTION>\n",(filterBy->slChoices == NULL || slNameInList(filterBy->slChoices,"All")?" SELECTED":"")); struct slName *slValue; int ix=1; for(slValue=filterBy->slValues;slValue!=NULL;slValue=slValue->next,ix++) { char varName[32]; char *label = NULL; char *name = NULL; if (filterBy->useIndex) { safef(varName, sizeof(varName), "%d",ix); name = varName; @@ -3545,34 +3547,30 @@ { char *styler = label + strlen(label)+1; if (*styler != '\0') { if (*styler == '#') // Legacy: just the color that follows printf(" style='color: %s;'",styler); else printf(" style='%s'",styler); } } printf(">%s</OPTION>\n",label); } } printf("</SELECT>\n"); -#ifndef NEW_JQUERY - // The following is needed to make msie scroll to selected option. - printf("<script type='text/javascript'>onload=function(){ if( $.browser.msie ) { $(\"select[name^='%s.filterBy.']\").children('option[selected]').each( function(i) { $(this).attr('selected',true); }); }}</script>\n",tdb->track); -#endif///ndef NEW_JQUERY puts("</TR></TABLE>"); return; } #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" */ { #ifdef SUBTRACK_CFG int len = strlen(tdb->track) + 10; @@ -4047,50 +4045,58 @@ (useDragAndDrop?" class='dragHandle' title='Drag to reorder'":"")); // The checkbox has identifying classes including subCB and the tag for each dimension (e.g. class='subCB GM12878 CTCF Peak') dyStringClear(dyHtml); dyStringAppend(dyHtml, "subCB"); // always first for(di=dimX;di<membersForAll->dimMax;di++) { if (membersForAll->members[di] && -1 != (ix = stringArrayIx(membersForAll->members[di]->groupTag, membership->subgroups, membership->count))) dyStringPrintf(dyHtml," %s",membership->membership[ix]); } if (membersForAll->members[dimV] && -1 != (ix = stringArrayIx(membersForAll->members[dimV]->groupTag, membership->subgroups, membership->count))) dyStringPrintf(dyHtml, " %s",membership->membership[ix]); // Saved view for last // And finally the checkBox is made! safef(buffer, sizeof(buffer), "%s_sel", subtrack->track); +#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 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 scm.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 scm.cfgToggle(this,\"%s\");' title='Configure this subtrack'><img src='../images/wrench.png'></span>\n" - printf(SUBTRACK_CFG_WRENCH,(visibleCB ? "":" halfVis"),subtrack->track); + printf(SUBTRACK_CFG_WRENCH,(visibleCB ? "":" disabled"),subtrack->track); } #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>", @@ -6430,33 +6436,31 @@ dyStringPrintf(dyLink,VOCAB_MULTILINK_END,members->groupTitle,members->groupTitle); freeMem(vocab); return dyStringCannibalize(&dyLink); } static boolean compositeUiByFilter(char *db, struct cart *cart, struct trackDb *parentTdb, char *formName) /* UI for composite tracks: filter subgroups by multiselects to select subtracks. */ { membersForAll_t* membersForAll = membersForAllSubGroupsGet(parentTdb,cart); if(membersForAll == NULL || membersForAll->filters == FALSE) // Not Matrix or filters return FALSE; if(cartOptionalString(cart, "ajax") == NULL) { webIncludeResourceFile("ui.dropdownchecklist.css"); jsIncludeFile("ui.dropdownchecklist.js",NULL); -#ifdef NEW_JQUERY jsIncludeFile("ddcl.js",NULL); -#endif///def NEW_JQUERY } cgiDown(0.7); printf("<B>Filter subtracks %sby:</B> (select multiple %sitems - %s)<BR>\n", (membersForAll->members[dimX] != NULL || membersForAll->members[dimY] != NULL ? "further ":""), (membersForAll->dimMax == dimA?"":"categories and "),FILTERBY_HELP_LINK); printf("<TABLE><TR valign='top'>\n"); // Do All [+][-] buttons if(membersForAll->members[dimX] == NULL && membersForAll->members[dimY] == NULL) // No matrix { #define PM_BUTTON_FILTER_COMP "<input type='button' class='inOutButton' onclick=\"waitOnFunction(filterCompositeSet,this,%s); return false;\" id='btn_%s' value='%c'>" printf("<TD align='left' width='50px'><B>All:</B><BR>"); printf(PM_BUTTON_FILTER_COMP,"true", "plus_fc",'+'); printf(PM_BUTTON_FILTER_COMP,"false","minus_fc",'-'); @@ -6469,35 +6473,31 @@ // Now make a filterComp box for each ABC dimension int dimIx=dimA; for(dimIx=dimA;dimIx<membersForAll->dimMax;dimIx++) { //printf("<TD align='right'><B>%s:</B></TD><TD align='left'>\n",labelWithVocabLinkForMultiples(db,parentTdb,membersForAll->members[dimIx])); printf("<TD align='left'><B>%s:</B><BR>\n",labelWithVocabLinkForMultiples(db,parentTdb,membersForAll->members[dimIx])); #ifdef FILTER_COMPOSITE_OPEN_SIZE int fullSize = membersForAll->members[dimIx]->count; #ifdef FILTER_COMPOSITE_ONLYONE if(membersForAll->members[dimIx]->fcType != fctOneOnly) #endif///def FILTER_COMPOSITE_ONLYONE fullSize++; // Room for "All" #endif///def FILTER_COMPOSITE_OPEN_SIZE -#ifdef NEW_JQUERY #define FILTER_COMPOSITE_FORMAT "<SELECT id='fc%d' name='%s.filterComp.%s' %s onchange='filterCompositeSelectionChanged(this);' style='display: none; font-size:.8em;' class='filterComp'><BR>\n" -#else///ifndef NEW_JQUERY - #define FILTER_COMPOSITE_FORMAT "<SELECT id='fc%d' name='%s.filterComp.%s' %s onchange='filterCompositeSelectionChanged(this);' style='display: none;' class='filterComp'><BR>\n" -#endif///ndef NEW_JQUERY printf(FILTER_COMPOSITE_FORMAT,dimIx,parentTdb->track,membersForAll->members[dimIx]->groupTag,"multiple"); #ifdef FILTER_COMPOSITE_ONLYONE // DO we support anything besides multi? (membersForAll->members[dimIx]->fcType == fctMulti?"multiple ":"")); if(membersForAll->members[dimIx]->fcType != fctOneOnly) #endif///def FILTER_COMPOSITE_ONLYONE printf("<OPTION%s>All</OPTION>\n",(sameWord("All",membersForAll->checkedTags[dimIx])?" SELECTED":"") ); int ix=0; for(ix=0;ix<membersForAll->members[dimIx]->count; ix++) { boolean alreadySet = membersForAll->members[dimIx]->selected[ix]; printf("<OPTION%s value=%s>%s</OPTION>\n",(alreadySet?" SELECTED":""), membersForAll->members[dimIx]->tags[ix],membersForAll->members[dimIx]->titles[ix]); } @@ -6664,43 +6664,41 @@ if(dimensionX && dimensionY) { safef(objName, sizeof(objName), "mat_%s_%s_cb", dimensionX->tags[ixX],dimensionY->tags[ixY]); } else { safef(objName, sizeof(objName), "mat_%s_cb", (dimensionX ? dimensionX->tags[ixX] : dimensionY->tags[ixY])); } //printf("<TD title='subCBs:%d checked:%d enabled:%d'>\n",cells[ixX][ixY],chked[ixX][ixY],enabd[ixX][ixY]); if(ttlX && ttlY) printf("<TD title='%s and %s'>\n",ttlX,ttlY); else printf("<TD title='%s'>\n",(ttlX ? ttlX : ttlY)); dyStringPrintf(dyJS, " class=\"matCB"); if(halfChecked) - dyStringPrintf(dyJS, " halfVis"); // needed for later js identification! + dyStringPrintf(dyJS, " disabled"); // appears disabled but still clickable! if(dimensionX) dyStringPrintf(dyJS, " %s",dimensionX->tags[ixX]); if(dimensionY) dyStringPrintf(dyJS, " %s",dimensionY->tags[ixY]); dyStringAppendC(dyJS,'"'); if(chked[ixX][ixY] > 0) dyStringAppend(dyJS," CHECKED"); if(halfChecked) - { - //dyStringAppend(dyJS," style='filter:alpha(opacity=50)'"); // Doesn't get set overkill with class=halfVis but IE doesn't cooperate! - dyStringAppend(dyJS," title='Not all associated subtracks have been selected'"); // overkill with class=halfVis but IE doesn't cooperate! - } + dyStringAppend(dyJS," title='Not all associated subtracks have been selected'"); + MAT_CB(objName,dyStringCannibalize(&dyJS)); // X&Y are set by javascript page load puts("</TD>"); } else { if(ttlX && ttlY) printf("<TD title='%s and %s'></TD>\n",ttlX,ttlY); else printf("<TD title='%s'></TD>\n",(ttlX ? ttlX : ttlY)); //puts("<TD> </TD>"); } } } if(dimensionX && cntX>MATRIX_RIGHT_BUTTONS_AFTER) matrixYheadings(db,parentTdb, membersForAll,ixY,FALSE); @@ -6898,37 +6896,34 @@ * var with that name so it looks like it was pressed. */ { bool hasSubgroups = (trackDbSetting(tdb, "subGroup1") != NULL); boolean isMatrix = dimensionsExist(tdb); boolean viewsOnly = FALSE; if (primarySubtrack == NULL && !cartVarExists(cart, "ajax")) { if(trackDbSetting(tdb, "dragAndDrop") != NULL) jsIncludeFile("jquery.tablednd.js", NULL); jsIncludeFile("ajax.js",NULL); #ifdef TABLE_SCROLL jsIncludeFile("jquery.fixedtable.js",NULL); #endif//def TABLE_SCROLL jsIncludeFile("hui.js",NULL); - } - #ifdef SUBTRACK_CFG - jsonHashAddBoolean(NULL, "subCfg", TRUE); -#else///ifndef SUBTRACK_CFG - jsonHashAddBoolean(NULL, "subCfg", FALSE); + jsIncludeFile("subCfg.js",NULL); #endif///ndef SUBTRACK_CFG + } cgiDown(0.7); if (trackDbCountDescendantLeaves(tdb) < MANY_SUBTRACKS && !hasSubgroups) { if(primarySubtrack) compositeUiSubtracksMatchingPrimary(db, cart, tdb,primarySubtrack); else compositeUiSubtracks(db, cart, tdb, trackHash); return; } if (fakeSubmit) cgiMakeHiddenVar(fakeSubmit, "submit"); if(primarySubtrack == NULL) {