5f6658a63df1cb265727849cdb061c8bfbe74326 tdreszer Thu Dec 16 15:02:36 2010 -0800 Made Track Name and Restricted Until sortable columns in the subtrack list of hgTrackUi. diff --git src/hg/lib/hui.c src/hg/lib/hui.c index 03717a9..2b90d6a 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -2977,79 +2977,134 @@ members_t*members=subgroupMembersGet(parentTdb, name); //const members_t *members = membersFindByTag(parentTdb,name); // Can't use because of dimension dependence if(members==NULL) return FALSE; *value = cloneString(members->groupTitle); //subgroupMembersFree(&members); return TRUE; } void subgroupFree(char **value) /* frees subgroup memory */ { if(value && *value) freez(value); } +#define SORT_ON_TRACK_NAME "trackName" +#define SORT_ON_RESTRICTED "dateUnrestricted" sortOrder_t *sortOrderGet(struct cart *cart,struct trackDb *parentTdb) /* Parses any list sort order instructions for parent of subtracks (from cart or trackDb) Some trickiness here. sortOrder->sortOrder is from cart (changed by user action), as is sortOrder->order, But columns are in original tdb order (unchanging)! However, if cart is null, all is from trackDb.ra */ { int ix; char *setting = trackDbSetting(parentTdb, "sortOrder"); if(setting == NULL) // Must be in trackDb or not a sortable table 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(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->column = needMem(12*sizeof(char*)); // There aren't going to be more than 3 or 4! + sortOrder->setting = cloneString(setting); -sortOrder->count = chopByWhite(sortOrder->setting, sortOrder->column,12); +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); @@ -3793,30 +3848,43 @@ // 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;didimMax;di++) { if (membersForAll->members[di]) dimCount++; } sortOrder_t* sortOrder = sortOrderGet(cart,parentTdb); boolean preSorted = FALSE; boolean useDragAndDrop = sameOk("subTracks",trackDbSetting(parentTdb, "dragAndDrop")); +// 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. printf("
"); printf(""); makeTopLink(parentTdb); // Now we can start in on the table of subtracks It may be sortable and/or dragAndDroppable printf("\n 0) dyStringAppendC(dyHtml,' '); dyStringPrintf(dyHtml, "tableWithDragAndDrop"); @@ -3827,77 +3895,110 @@ colorIx = COLOR_BG_ALTDEFAULT_IX; } if (sortOrder != NULL) puts(">"); else puts(">"); // 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; if (doColorPatch) colspan += 1; +int columnCount = 0; printf("",useDragAndDrop?" id='noDrag' class='nodrop nodrag'":""); printf(""); +columnCount++; // Add column headers which are sort button links if (sortOrder != NULL) { puts(""); printf("\n"); - printf("\n", sortOrder->htmlId, sortOrder->sortOrder); // keeing track of sortOrder + printf("\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;sIxcount;sIx++) { - 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(""); +puts(""); // schema column +columnCount++; -// Determine whether there is a restricted until date column -for (subtrackRef = subtrackRefList; subtrackRef != NULL; subtrackRef = subtrackRef->next) +// Finally there may be a restricted until column +if (restrictions) { - subtrack = subtrackRef->val; - (void)metadataForTable(db,subtrack,NULL); - if (NULL != metadataFindValue(subtrack,"dateUnrestricted")) +#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(""); - break; // Don't need more than one } + 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 " : "") ); } else { slSort(&subtrackRefList, trackDbRefCmp); // straight from trackDb.ra preSorted = TRUE; puts(""); } @@ -4060,37 +4161,48 @@ makeSchemaLink(db,subtrack,"schema"); printf(" "); // Do we have a restricted until date? char *dateDisplay = encodeRestrictionDateDisplay(db,subtrack); if (dateDisplay) printf("\n\n"); checkBoxIdFree(&id); subgroupMembershipFree(&membership); } // End of the table -puts(""); -puts("
List subtracks: ", colspan); 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"); if (slCount(subtrackRefList) > 5) printf("    ()"); puts(" 
  %s", +#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("%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); // End of row and free ourselves of this subtrack puts("
"); -printf("
"); +puts(""); +printf("",columnCount-1); // Count of subtracks is filled in by javascript. +printf("    "); if (slCount(subtrackRefList) > 5) - puts("    "); + 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("\n"); +puts(""); +printf(""); + puts("

"); // 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); hierarchyFree(&hierarchy);