8fdc86ea29f656cf7efee9954fdae6b573190fb3 tdreszer Fri May 6 17:23:22 2011 -0700 Standardized replacement for

with cgiDown and worked out more spacing issues in hgFileUi and hgTrackUi. diff --git src/hg/lib/hui.c src/hg/lib/hui.c index c22e694..9584bb8 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -270,66 +270,71 @@ metadataAsHtmlTable(db,tdb,showLongLabel,TRUE,trackHash) ); } else printf("

",tdb->track); return TRUE; } void extraUiLinks(char *db,struct trackDb *tdb, struct hash *trackHash) /* Show downlaods, schema and metadata links where appropriate */ { boolean schemaLink = (isCustomTrack(tdb->table) == FALSE) && (hTableOrSplitExists(db, tdb->table)); boolean metadataLink = (!tdbIsComposite(tdb) && metadataForTable(db, tdb, NULL) != NULL); boolean downloadLink = (trackDbSetting(tdb, "wgEncode") != NULL && !tdbIsSuperTrack(tdb)); -boolean moreThanOne = (schemaLink && metadataLink) - || (schemaLink && downloadLink) - || (downloadLink && metadataLink); +int links = 0; +if (schemaLink) + links++; +if (metadataLink) + links++; +if (downloadLink) + links++; -printf("\n
"); -if(moreThanOne) +if(links > 0) + cgiDown(0.7); +if(links > 1) printf("
View table: "); if(schemaLink) { - makeSchemaLink(db,tdb,(moreThanOne ? "schema":"View table schema")); + makeSchemaLink(db,tdb,(links > 1 ? "schema":"View table schema")); if(downloadLink || metadataLink) printf(", "); } if(downloadLink) { // special case exception (hg18:NHGRI BiPs are in 7 different dbs but only hg18 has downloads): char *targetDb = trackDbSetting(tdb, "compareGenomeLinks"); if (targetDb != NULL) { targetDb = cloneFirstWordByDelimiter(targetDb,'='); if (!startsWith("hg",targetDb)) freez(&targetDb); } if (targetDb == NULL) targetDb = cloneString(db); - makeNamedDownloadsLink(targetDb, tdb, (moreThanOne ? "downloads":"Downloads"), trackHash); + makeNamedDownloadsLink(targetDb, tdb, (links > 1 ? "downloads":"Downloads"), trackHash); freez(&targetDb); if(metadataLink) printf(","); } if (metadataLink) compositeMetadataToggle(db,tdb,"metadata", TRUE, TRUE, trackHash); -if(moreThanOne) +if(links > 1) printf("
"); } char *hUserCookie() /* Return our cookie name. */ { return cfgOptionDefault("central.cookie", "hguid"); } char *hDownloadsServer() /* get the downloads server from hg.conf or the default */ { return cfgOptionDefault("downloads.server", "hgdownload.cse.ucsc.edu"); } @@ -3026,108 +3031,96 @@ return NULL; sortOrder_t *sortOrder = needMem(sizeof(sortOrder_t)); sortOrder->htmlId = needMem(strlen(parentTdb->track)+15); safef(sortOrder->htmlId, (strlen(parentTdb->track)+15), "%s.sortOrder", parentTdb->track); char *cartSetting = NULL; if(cart != NULL) cartSetting = cartCgiUsualString(cart, sortOrder->htmlId, setting); if(cart != NULL && strlen(cartSetting) > strlen(setting)) // If setting is bigger, then it may be due to a trackDb change sortOrder->sortOrder = cloneString(cartSetting); // cart order else sortOrder->sortOrder = cloneString(setting); // old cart value is abandoned! sortOrder->setting = cloneString(setting); sortOrder->count = chopByWhite(sortOrder->setting,NULL,0); // Get size -#ifdef SORT_ON_TRACK_NAME if (cart && !stringIn(SORT_ON_TRACK_NAME,setting)) sortOrder->count += 1; -#endif///def SORT_ON_TRACK_NAME -#ifdef SORT_ON_RESTRICTED if (cart && !stringIn(SORT_ON_RESTRICTED,setting)) sortOrder->count += 1; -#endif///def SORT_ON_RESTRICTED sortOrder->column = needMem(sortOrder->count*sizeof(char*)); int foundColumns = chopByWhite(sortOrder->setting, sortOrder->column,sortOrder->count); sortOrder->title = needMem(sortOrder->count*sizeof(char*)); sortOrder->forward = needMem(sortOrder->count*sizeof(boolean)); sortOrder->order = needMem(sortOrder->count*sizeof(int)); -#if defined(SORT_ON_TRACK_NAME) || defined(SORT_ON_RESTRICTED) if (cart && foundColumns < sortOrder->count) { int columnCount = foundColumns; int size = 0; char *moreOrder = NULL; - #ifdef SORT_ON_TRACK_NAME if (cart && columnCount < sortOrder->count && !stringIn(SORT_ON_TRACK_NAME,setting)) { assert(sortOrder->column[columnCount] == NULL); sortOrder->column[columnCount] = cloneString(SORT_ON_TRACK_NAME "=+"); if (!stringIn(SORT_ON_TRACK_NAME,sortOrder->sortOrder)) { size = strlen(sortOrder->sortOrder) + strlen(sortOrder->column[columnCount]) + 5; // little bit more moreOrder = needMem(size); safef(moreOrder,size,"%s %s",sortOrder->sortOrder, sortOrder->column[columnCount]); freeMem(sortOrder->sortOrder); sortOrder->sortOrder = moreOrder; } columnCount++; } - #endif///def SORT_ON_TRACK_NAME - #ifdef SORT_ON_RESTRICTED if (cart && columnCount < sortOrder->count && !stringIn(SORT_ON_RESTRICTED,setting)) { assert(sortOrder->column[columnCount] == NULL); sortOrder->column[columnCount] = cloneString(SORT_ON_RESTRICTED "=+"); if (!stringIn(SORT_ON_RESTRICTED,sortOrder->sortOrder)) { size = strlen(sortOrder->sortOrder) + strlen(sortOrder->column[columnCount]) + 5; // little bit more moreOrder = needMem(size); safef(moreOrder,size,"%s %s",sortOrder->sortOrder, sortOrder->column[columnCount]); freeMem(sortOrder->sortOrder); sortOrder->sortOrder = moreOrder; } columnCount++; } - #endif///def SORT_ON_RESTRICTED } -#endif///def SORT_ON_TRACK_NAME for (ix = 0; ixcount; ix++) { strSwapChar(sortOrder->column[ix],'=',0); // Don't want 'CEL=+' but 'CEL' and '+' char *pos = stringIn(sortOrder->column[ix], sortOrder->sortOrder);// find tdb substr in cart current order string //assert(pos != NULL && pos[strlen(sortOrder->column[ix])] == '='); if(pos != NULL && pos[strlen(sortOrder->column[ix])] == '=') { int ord=1; char* pos2 = sortOrder->sortOrder; for(;*pos2 && pos2 < pos;pos2++) { if(*pos2 == '=') // Discovering sort order in cart ord++; } sortOrder->forward[ix] = (pos[strlen(sortOrder->column[ix]) + 1] == '+'); sortOrder->order[ix] = ord; } else // give up on cartSetting { sortOrder->forward[ix] = TRUE; sortOrder->order[ix] = ix+1; } -#ifdef SORT_ON_TRACK_NAME if (ix < foundColumns) -#endif///def SORT_ON_TRACK_NAME subgroupFindTitle(parentTdb,sortOrder->column[ix],&(sortOrder->title[ix])); } return sortOrder; // NOTE cloneString:words[0]==*sortOrder->column[0] and will be freed when sortOrder is freed } void sortOrderFree(sortOrder_t **sortOrder) /* frees any previously obtained sortOrder settings */ { if(sortOrder && *sortOrder) { int ix; for(ix=0;ix<(*sortOrder)->count;ix++) { subgroupFree(&((*sortOrder)->title[ix])); } freeMem((*sortOrder)->sortOrder); freeMem((*sortOrder)->htmlId); freeMem((*sortOrder)->column); freeMem((*sortOrder)->forward); @@ -3859,30 +3852,31 @@ // 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. +cgiDown(0.7); printf(""); columnCount = colspan; } // Add column headers which are sort button links if (sortOrder != NULL) { printf("\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;sIxcount;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(""); columnCount++; } // longLabel column -#ifdef SORT_ON_TRACK_NAME assert(sameString(SORT_ON_TRACK_NAME,sortOrder->column[sIx])); printf(""); -#else///ifndef SORT_ON_TRACK_NAME - puts(""); -#endif///ndef SORT_ON_TRACK_NAME columnCount++; } puts(""); // schema column columnCount++; // Finally there may be a restricted until column if (restrictions) { -#ifdef SORT_ON_RESTRICTED if (sortOrder != NULL) { int sIx=sortOrder->count-1; assert(sameString(SORT_ON_RESTRICTED,sortOrder->column[sIx])); printf(""); } else -#endif///def SORT_ON_RESTRICTED { printf(""); } columnCount++; } puts(""); // The end of the header section. // 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) { preSorted = tdbRefSortPrioritiesFromCart(cart, &subtrackRefList); // preserves user's prev sort/drags printf("\n",(sortOrder != NULL ? "sortable " : "") ); } @@ -4191,45 +4175,47 @@ { if (dateIsOld(dateDisplay,"%F")) printf("\n\n\n"); checkBoxIdFree(&id); subgroupMembershipFree(&membership); } // End of the table -puts(""); -printf("\n"); -puts("
"); printf(""); 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("List subtracks: "); char javascript[JBUFSIZE]; safef(javascript, sizeof(javascript), "onclick=\"showOrHideSelectedSubtracks(true);\""); cgiMakeOnClickRadioButton("displaySubtracks", "selected", !displayAll,javascript); puts("only selected/visible   "); safef(javascript, sizeof(javascript), "onclick=\"showOrHideSelectedSubtracks(false);\""); cgiMakeOnClickRadioButton("displaySubtracks", "all", displayAll,javascript); printf("all"); @@ -3942,79 +3936,69 @@ if (slCount(subtrackRefList) > 5) printf("    ()"); puts(" %s", sortOrder->column[sIx],(sortOrder->forward[sIx]?"":" sortRev"),sortOrder->order[sIx],sortOrder->title[sIx]); printf("%s",(sortOrder->forward[sIx]?"↓":"↑")); if (sortOrder->count > 1) printf ("%d",sortOrder->order[sIx]); printf(""); puts ("  Track Name", sortOrder->column[sIx],(sortOrder->forward[sIx]?"":" sortRev"),sortOrder->order[sIx]); printf("%s%d",(sortOrder->forward[sIx]?"↓":"↑"),sortOrder->order[sIx]); puts ("   Restricted Until", sortOrder->column[sIx],(sortOrder->forward[sIx]?"":" sortRev"),sortOrder->order[sIx]); printf("%s%d",(sortOrder->forward[sIx]?"↓":"↑"),sortOrder->order[sIx]); //printf(" ? ", ENCODE_DATA_RELEASE_POLICY); puts (" "); printf("Restricted Until", ENCODE_DATA_RELEASE_POLICY); puts(" 
 %s ", dateDisplay); else printf(" %s ", dateDisplay); } } // End of row and free ourselves of this subtrack puts("
    ",columnCount-1); +puts(""); +if (slCount(subtrackRefList) > 5 || (restrictions && sortOrder != NULL)) + { + printf("
    ", + COLOR_BG_DEFAULT_DARKER,columnCount-1); // Count of subtracks is filled in by javascript. if (slCount(subtrackRefList) > 5) printf("\n"); // Restruction policy needs a link -#ifdef SORT_ON_RESTRICTED if (restrictions && sortOrder != NULL) printf("Restriction Policy", ENCODE_DATA_RELEASE_POLICY); -#endif///def SORT_ON_RESTRICTED -printf("
"); + printf("\n"); + } +puts(""); if (sortOrder == NULL) printf(""); // Tying subtracks with matrix and subtrack cfgs with views requires javascript help puts(""); #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); dividersFree(÷rs); @@ -4520,60 +4506,60 @@ boolean compositeLevel = isNameAtCompositeLevel(tdb,prefix); char *scoreMinStr = trackDbSettingClosestToHome(tdb, GRAY_LEVEL_SCORE_MIN); if (scoreMinStr != NULL) { int scoreMin = atoi(scoreMinStr); // maxShade=9 taken from hgTracks/simpleTracks.c. Ignore the 10 in shadesOfGray[10+1] -- // maxShade is used to access the array. int maxShade = 9; int scoreMinGrayLevel = scoreMin * maxShade/scoreMax; if (scoreMinGrayLevel <= 0) scoreMinGrayLevel = 1; char *setting = trackDbSettingClosestToHome(tdb, MIN_GRAY_LEVEL); int minGrayLevel = cartUsualIntClosestToHome(cart, tdb, compositeLevel, MIN_GRAY_LEVEL, setting ? atoi(setting) : scoreMinGrayLevel); if (minGrayLevel <= 0) minGrayLevel = 1; if (minGrayLevel > maxShade) minGrayLevel = maxShade; - puts("\n

Shade of lowest-scoring items: "); + puts("\nShade of lowest-scoring items: "); // Add javascript to select so that its color is consistent with option colors: int level = 255 - (255*minGrayLevel / maxShade); printf("

\n"); + printf("\n"); } } static boolean getScoreDefaultsFromTdb(struct trackDb *tdb, char *scoreName,char *defaults,char**min,char**max) /* returns TRUE if defaults exist and sets the string pointer (because they may be float or int) if min or max are set, then they should be freed */ { if(min) *min = NULL; // default these outs! if(max) *max = NULL; char *setting = trackDbSettingClosestToHome(tdb, scoreName); if(setting) { if(strchr(setting,':') != NULL) @@ -6135,31 +6121,31 @@ printf("> "); int ix2=ix; while(0 < ix2--) printf(" "); printf("",membersOfView->count+1); safef(varName, sizeof(varName), "%s", view->track); if(configurable[ix] != cfgNone) { cfgByCfgType(configurable[ix],db,cart,view->subtracks,varName, membersOfView->titles[ix],TRUE); cfgLinkToDependentCfgs(cart,parentTdb,varName); } } } } -puts("
"); +puts(""); subgroupMembersFree(&membersOfView); freeMem(matchedSubtracks); return TRUE; } char *compositeLabelWithVocabLink(char *db,struct trackDb *parentTdb, struct trackDb *childTdb, char *vocabType, char *label) /* If the parentTdb has a controlledVocabulary setting and the vocabType is found, then label will be wrapped with the link to display it. Return string is cloned. */ { char *vocab = trackDbSetting(parentTdb, "controlledVocabulary"); (void)metadataForTable(db,childTdb,NULL); if(vocab == NULL) return cloneString(label); // No wrapping! @@ -6470,30 +6456,31 @@ 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; jsIncludeFile("ui.core.js",NULL); jsIncludeFile("ui.dropdownchecklist.js",NULL); webIncludeResourceFile("ui.dropdownchecklist.css"); // TODO: // 1) Scroll long lists should be configurable through tdb setting // #define FILTER_COMPOSITE_OPEN_SIZE 16 // 2) columnCount (Number of filterBoxes per row) should be configurable through tdb setting +cgiDown(0.7); printf("Filter subtracks %sby: (select multiple %sitems - %s)
\n", (membersForAll->members[dimX] != NULL || membersForAll->members[dimY] != NULL ? "further ":""), (membersForAll->dimMax == dimA?"":"categories and "),FILTERBY_HELP_LINK); printf("\n"); // Do All [+][-] buttons if(membersForAll->members[dimX] == NULL && membersForAll->members[dimY] == NULL) // No matrix { #define PM_BUTTON_FILTER_COMP "" printf("\n",(ttlX ? ttlX : ttlY)); //puts(""); } } } if(dimensionX && cntX>MATRIX_RIGHT_BUTTONS_AFTER) matrixYheadings(db,parentTdb, membersForAll,ixY,FALSE); puts("\n"); } } if(dimensionY && cntY>MATRIX_BOTTOM_BUTTONS_AFTER) matrixXheadings(db,parentTdb,membersForAll,FALSE); puts("
All:
"); printf(PM_BUTTON_FILTER_COMP,"true", "plus_fc",'+'); printf(PM_BUTTON_FILTER_COMP,"false","minus_fc",'-'); //#define PM_BUTTON2_FILTER_COMP "" //printf(PM_BUTTON2_FILTER_COMP,"true", "plus_fc", "add_sm.gif"); //printf(PM_BUTTON2_FILTER_COMP,"false","minus_fc","remove_sm.gif"); @@ -6729,53 +6716,52 @@ else printf("
 
"); -puts("
\n"); // If any filter additional filter composites, they can be added at the end. compositeUiByFilter(db, cart, parentTdb, formName); return TRUE; } static boolean compositeUiAllButtons(char *db, struct cart *cart, struct trackDb *parentTdb, char *formName) /* UI for composite tracks: all/none buttons only (as opposed to matrix or lots of buttons */ { if (trackDbCountDescendantLeaves(parentTdb) <= 1) return FALSE; if(dimensionsExist(parentTdb)) return FALSE; #define PM_BUTTON_GLOBAL "" #define BUTTON_PLUS_ALL_GLOBAL() printf(PM_BUTTON_GLOBAL,"true", "plus_all", "add_sm.gif") #define BUTTON_MINUS_ALL_GLOBAL() printf(PM_BUTTON_GLOBAL,"false","minus_all","remove_sm.gif") BUTTON_PLUS_ALL_GLOBAL(); BUTTON_MINUS_ALL_GLOBAL(); -puts(" Select all subtracks

"); +puts(" Select all subtracks
"); return TRUE; } static boolean compositeUiNoMatrix(char *db, struct cart *cart, struct trackDb *parentTdb, char *primarySubtrack, char *formName) /* UI for composite tracks: subtrack selection. This is the default UI without matrix controls. */ { int i, j, k; char *words[SMALLBUF]; char option[SMALLBUF]; int wordCnt; char javascript[JBUFSIZE]; char *primaryType = getPrimaryType(primarySubtrack, parentTdb); char *name, *value; @@ -6939,52 +6925,53 @@ 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_POPUP printf(""); cgiMakeHiddenVar("db", db); printf("\n",tdb->track); #endif -puts("
"); +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) { if(subgroupingExists(tdb,"view")) { hCompositeDisplayViewDropDowns(db, cart,tdb); if(subgroupCount(tdb) <= 1) viewsOnly = TRUE; } if(!viewsOnly) { + cgiDown(0.7); if(trackDbSettingOn(tdb, "allButtonPair")) { compositeUiAllButtons(db, cart, tdb, formName); } else if (!hasSubgroups || !isMatrix || primarySubtrack) { compositeUiNoMatrix(db, cart,tdb,primarySubtrack,formName); } else { compositeUiByMatrix(db, cart, tdb, formName); } } #ifdef SUBTRACK_CFG_POPUP if(primarySubtrack == NULL) @@ -6993,31 +6980,31 @@ #endif } cartSaveSession(cart); cgiContinueHiddenVar("g"); if(primarySubtrack) compositeUiSubtracksMatchingPrimary(db, cart, tdb,primarySubtrack); else compositeUiSubtracks(db, cart, tdb, trackHash); if (primarySubtrack == NULL) // primarySubtrack is set for tableBrowser but not hgTrackUi { if (trackDbCountDescendantLeaves(tdb) > 5) { - puts("
"); + cgiDown(0.7); cgiMakeButton("Submit", "Submit"); } } } boolean superTrackDropDownWithExtra(struct cart *cart, struct trackDb *tdb, int visibleChild,char *extra) /* Displays hide/show dropdown for supertrack. * Set visibleChild to indicate whether 'show' should be grayed * out to indicate that no supertrack members are visible: * 0 to gray out (no visible children) * 1 don't gray out (there are visible children) * -1 don't know (this function should determine) * If -1,i the subtracks field must be populated with the child trackDbs. * Returns false if not a supertrack */