bc46fd2a2f8163134a0eade3842108962915c1ac tdreszer Wed Dec 15 15:07:38 2010 -0800 Fixed some sort issure and minor styling for metadata '...' diff --git src/hg/lib/hui.c src/hg/lib/hui.c index df80277..e4de91a 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -153,93 +153,93 @@ dyStringAppend(dyLink,suffix); // Don't encode since this may contain HTML freeMem(encTerm); freeMem(encValue); return dyStringCannibalize(&dyLink); } char *metadataAsHtmlTable(char *db,struct trackDb *tdb,boolean showLongLabel,boolean showShortLabel, struct hash *trackHash) /* If metadata from metaDb exists, return string of html with table definition */ { const struct mdbObj *safeObj = metadataForTable(db,tdb,NULL); if (safeObj == NULL || safeObj->vars == NULL) return NULL; //struct dyString *dyTable = dyStringCreate("<table id='mdb_%s'>",tdb->table); -struct dyString *dyTable = dyStringCreate("<table>"); +struct dyString *dyTable = dyStringCreate("<table style='display:inline-table;'>"); if(showLongLabel) - dyStringPrintf(dyTable,"<tr><td colspan=2>%s</td></tr>",tdb->longLabel); + dyStringPrintf(dyTable,"<tr><td colspan=2 valign='bottom'>%s</td></tr>",tdb->longLabel); if(showShortLabel) - dyStringPrintf(dyTable,"<tr><td align=right><i>shortLabel:</i></td><td nowrap>%s</td></tr>",tdb->shortLabel); + dyStringPrintf(dyTable,"<tr valign='bottom'><td align='right'><i>shortLabel:</i></td><td nowrap>%s</td></tr>",tdb->shortLabel); // Get the hash of mdb and cv term types struct hash *cvTermTypes = mdbCvTermTypeHash(); struct mdbObj *mdbObj = mdbObjClone(safeObj); // Important if we are going to remove vars! mdbObjRemoveVars(mdbObj,"composite project objType"); // Don't bother showing these (suggest: "composite project dataType view tableName") mdbObjReorderVars(mdbObj,"grant lab dataType cell treatment antibody protocol replicate view setType inputType",FALSE); // Bring to front mdbObjReorderVars(mdbObj,"subId submittedDataVersion dateSubmitted dateResubmitted dateUnrestricted dataVersion tableName fileName fileIndex",TRUE); // Send to back struct mdbVar *mdbVar; for (mdbVar=mdbObj->vars;mdbVar!=NULL;mdbVar=mdbVar->next) { if ((sameString(mdbVar->var,"fileName") || sameString(mdbVar->var,"fileIndex") ) && trackDbSettingClosestToHome(tdb,"wgEncode") != NULL) { - dyStringPrintf(dyTable,"<tr><td align=right><i>%s:</i></td><td nowrap>",mdbVar->var); + dyStringPrintf(dyTable,"<tr valign='bottom'><td align='right'><i>%s:</i></td><td nowrap>",mdbVar->var); dyStringAppend(dyTable,htmlStringForDownloadsLink(db, tdb, mdbVar->val, TRUE, trackHash)); dyStringAppend(dyTable,"</td></tr>"); } else { // If antibody and metadata contains input={sameValue} then just print input if(sameString(mdbVar->var,"antibody") && mdbObjContains(mdbObj,"input",mdbVar->val)) continue; if (cvTermTypes && differentString(mdbVar->var,"tableName")) // Don't bother with tableName { struct hash *cvTerm = hashFindVal(cvTermTypes,mdbVar->var); if (cvTerm != NULL) { if(SETTING_NOT_ON(hashFindVal(cvTerm,"hidden"))) // NULL is not on { char *label=hashFindVal(cvTerm,"label"); if (label == NULL) label = mdbVar->var; char *linkOfType = controlledVocabLink(NULL,"type",mdbVar->var,label,label,NULL); char *cvDefined=hashFindVal(cvTerm,"cvDefined"); if (cvDefined != NULL && !SETTING_IS_OFF(cvDefined)) // assume setting is ON { char *linkOfTerm = controlledVocabLink(NULL,"term",mdbVar->val,mdbVar->val,mdbVar->val,NULL); - dyStringPrintf(dyTable,"<tr><td align=right><i>%s:</i></td><td nowrap>%s</td></tr>",linkOfType,linkOfTerm); + dyStringPrintf(dyTable,"<tr valign='bottom'><td align='right'><i>%s:</i></td><td nowrap>%s</td></tr>",linkOfType,linkOfTerm); freeMem(linkOfTerm); } else - dyStringPrintf(dyTable,"<tr><td align=right><i>%s:</i></td><td nowrap>%s</td></tr>",linkOfType,mdbVar->val); + dyStringPrintf(dyTable,"<tr valign='bottom'><td align='right'><i>%s:</i></td><td nowrap>%s</td></tr>",linkOfType,mdbVar->val); //{ // NOTE: Could just have a tool tip for these. //char *descr=cgiEncode(hashMustFindVal(cvTerm,"description")); //label = cgiEncode(label); - //dyStringPrintf(dyTable,"<tr><td align=right><i title='%s'>%s:</i></td><td nowrap>%s</td></tr>",descr,label,mdbVar->val); + //dyStringPrintf(dyTable,"<tr valign='bottom'><td align='right'><i title='%s'>%s:</i></td><td nowrap>%s</td></tr>",descr,label,mdbVar->val); //freeMem(descr); //freeMem(label); //} freeMem(linkOfType); continue; } } } - dyStringPrintf(dyTable,"<tr><td align=right><i>%s:</i></td><td nowrap>%s</td></tr>",mdbVar->var,mdbVar->val); + dyStringPrintf(dyTable,"<tr valign='bottom'><td align='right'><i>%s:</i></td><td nowrap>%s</td></tr>",mdbVar->var,mdbVar->val); } } dyStringAppend(dyTable,"</table>"); //mdbObjsFree(&mdbObj); // spill some memory return dyStringCannibalize(&dyTable); } boolean compositeMetadataToggle(char *db,struct trackDb *tdb,char *title, boolean embeddedInText,boolean showLongLabel, struct hash *trackHash) /* If metadata from metaTbl exists, create a link that will allow toggling it's display */ { const struct mdbObj *safeObj = metadataForTable(db,tdb,NULL); if(safeObj == NULL || safeObj->vars == NULL) return FALSE; @@ -3793,77 +3793,73 @@ // 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")); -// 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>"); -makeTopLink(parentTdb); - -//printf("<style type='text/css'>td {padding: 0px 5px 0px;}</style>"); - // 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)); 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; + colspan = sortOrder->count+4; if (doColorPatch) colspan += 1; printf("<TR%s>",useDragAndDrop?" id='noDrag' class='nodrop nodrag'":""); -printf("<TD colspan='%d'><B>List subtracks: ", colspan); +printf("<TD colspan='%d'>", colspan); +printf("<A NAME='DISPLAY_SUBTRACKS'></A>"); +printf("<B>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</B>"); if (slCount(subtrackRefList) > 5) printf(" (<FONT class='subCBcount'></font>)"); +makeTopLink(parentTdb); // "Top" link floats to right side of table puts("</TD>"); // Add column headers which are sort button links if (sortOrder != NULL) { puts("<TD colspan=5> </TD></TR>"); printf("<TR id=\"subtracksHeader\" class='nodrop nodrag sortable'>\n"); printf("<TH> <INPUT TYPE=HIDDEN NAME='%s' class='sortOrder' VALUE=\"%s\"></TH>\n", sortOrder->htmlId, sortOrder->sortOrder); // keeing track of sortOrder // Columns in tdb order (unchanging), sort in cart order (changed by user action) int sIx=0; for(sIx=0;sIx<sortOrder->count;sIx++) { printf("<TH id='%s' class='sortable%s sort%d' abbr='use' nowrap title='Sort list on this column' onclick='tableSortAtButtonPress(this);'>%s", sortOrder->column[sIx],(sortOrder->forward[sIx]?"":" sortRev"),sortOrder->order[sIx],sortOrder->title[sIx]); printf("<sup>%s",(sortOrder->forward[sIx]?"↓":"↑")); @@ -4053,31 +4049,31 @@ MAKE_CFG_SUBTRACK_DIV(subtrack->track,htmlIdentifier,open); safef(htmlIdentifier,sizeof(htmlIdentifier),"%s",subtrack->track); cfgByCfgType(cType,db,cart,subtrack,htmlIdentifier,"Subtrack",TRUE); printf("</DIV>"); } #endif///ndef SUBTRACK_CFG_POPUP // A schema link for each track printf("</td>\n<TD nowrap> "); makeSchemaLink(db,subtrack,"schema"); printf(" "); // Do we have a restricted until date? char *dateDisplay = encodeRestrictionDateDisplay(db,subtrack); if (dateDisplay) - printf("</TD>\n<TD align=\"CENTER\"> %s ", dateDisplay); + printf("</TD>\n<TD align=\"CENTER\" nowrap> %s ", dateDisplay); // End of row and free ourselves of this subtrack puts("</TD></TR>\n"); checkBoxIdFree(&id); subgroupMembershipFree(&membership); } // End of the table puts("</TBODY><TFOOT></TFOOT>"); puts("</TABLE>"); printf("</td></tr></table>"); // Count of subtracks is filled in by javascript. if (slCount(subtrackRefList) > 5) puts(" <FONT class='subCBcount'></font>");