82aeb03255f4f45baf5bd9e8c0d06ba57a071f8f tdreszer Fri May 27 14:46:46 2011 -0700 Fixed mistake of not using tags on hgFileUi filterBy boxes. This resulted in UChicago downloads page not showing control terms properly. diff --git src/hg/lib/fileUi.c src/hg/lib/fileUi.c index 02f2e8f..be49043 100644 --- src/hg/lib/fileUi.c +++ src/hg/lib/fileUi.c @@ -395,68 +395,67 @@ } return dyStringCannibalize(&dyLink); } static int filterBoxesForFilesList(char *db,struct mdbObj *mdbObjs,sortOrder_t *sortOrder) { // Will create filterBoxes for each sortOrder field. Returns count of filterBoxes made int count = 0; if (sortOrder != NULL) { struct dyString *dyFilters = dyStringNew(256); int sIx=0; for(sIx = 0;sIx<sortOrder->count;sIx++) { char *var = sortOrder->column[sIx]; enum cvSearchable searchBy = cvSearchMethod(var); - //if (searchBy == cvSearchByDateRange || searchBy == cvSearchByIntegerRange) // dates and numbers probably not good for filtering. FIXME: Should cvsNotSearchable be filterable?? if (searchBy != cvSearchBySingleSelect && searchBy != cvSearchByMultiSelect) continue; // Only single selects and multi-select make good candidates for filtering - struct sqlConnection *conn = hAllocConn(db); - struct slPair *valsAndLabels = mdbValLabelSearch(conn, var, MDB_VAL_STD_TRUNCATION, FALSE, FALSE, TRUE); // not tags, not tables, just files - hFreeConn(&conn); - // Need to verify that each val exists in an object for these files - struct slPair *relevantVals = NULL; - while(valsAndLabels != NULL) - { - struct slPair *oneVal = slPopHead(&valsAndLabels); - if(mdbObjsContainAltleastOneMatchingVar(mdbObjs,var,mdbPairVal(oneVal))) + // get all vals for var, then convert to tag/label pairs for filterBys + struct slName *vals = mdbObjsFindAllVals(mdbObjs, var); + struct slPair *tagLabelPairs = NULL; + while(vals != NULL) { - eraseNonAlphaNum(mdbPairVal(oneVal)); // Have to squeeze out uglies from val to ensure filter by class works - slAddHead(&relevantVals,oneVal); - } - else - slPairFreeValsAndList(&oneVal); + struct slName *term = slPopHead(&vals); + char *tag = (char *)cvTag(var,term->name); + if (tag == NULL) + tag = term->name; + slPairAdd(&tagLabelPairs,tag,cloneString((char *)cvLabel(term->name))); + slNameFree(&term); } - if (slCount(relevantVals) > 1) + + // If there is more than one val for this var then create filterBy box for it + if (slCount(tagLabelPairs) > 1) { - slReverse(&relevantVals); + slPairValSortCase(&tagLabelPairs); // should have a list sorted on the label char extraClasses[256]; safef(extraClasses,sizeof extraClasses,"filterTable %s",var); - char *dropDownHtml = cgiMakeMultiSelectDropList(var,relevantVals,NULL,"All",extraClasses,"onchange='filterTable();' onclick='filterTableExclude(this);'"); + char *dropDownHtml = cgiMakeMultiSelectDropList(var,tagLabelPairs,NULL,"All",extraClasses,"onchange='filterTable();' onclick='filterTableExclude(this);'"); // Note filterBox has classes: filterBy & {var} if (dropDownHtml) { dyStringPrintf(dyFilters,"<td align='left'>\n<B>%s</B>:<BR>\n%s</td><td width=10> </td>\n", - labelWithVocabLink(var,sortOrder->title[sIx],relevantVals,TRUE),dropDownHtml); // TRUE were sending tags, not values + labelWithVocabLink(var,sortOrder->title[sIx],tagLabelPairs,TRUE),dropDownHtml); // TRUE were sending tags, not values freeMem(dropDownHtml); count++; } } - if (slCount(relevantVals) > 0) - slPairFreeValsAndList(&relevantVals); + if (slCount(tagLabelPairs) > 0) + slPairFreeValsAndList(&tagLabelPairs); } + + // Finally ready to print the filterBys out if (count) { webIncludeResourceFile("ui.dropdownchecklist.css"); jsIncludeFile("ui.dropdownchecklist.js",NULL); #define FILTERBY_HELP_LINK "<A HREF=\"../goldenPath/help/multiView.html\" TARGET=ucscHelp>help</A>" cgiDown(0.9); printf("<B>Filter files by:</B> (select multiple %sitems - %s)\n<table><tr valign='bottom'>\n", (count >= 1 ? "categories and ":""),FILTERBY_HELP_LINK); printf("%s\n",dyStringContents(dyFilters)); printf("</tr></table>\n"); printf("<script type='text/javascript'>$(document).ready(function() { $('.filterBy').each( function(i) { $(this).dropdownchecklist({ firstItemChecksAll: true, noneIsAll: true, maxDropHeight: filterByMaxHeight(this) });});});</script>\n"); } dyStringFree(&dyFilters); } return count; @@ -599,32 +598,39 @@ sprintWithGreekByte(niceNumber, sizeof(niceNumber), oneFile->fileSize); field = oneFile->sortFields[sortOrder->order[ix] - 1]; printf("<TD abbr='%s' align='right' nowrap>%s</td>",field,niceNumber); } else { field = oneFile->sortFields[sortOrder->order[ix] - 1]; boolean isFieldEmpty = cvTermIsEmpty(sortOrder->column[ix],field); char class[128]; class[0] = '\0'; if (filterable) { enum cvSearchable searchBy = cvSearchMethod(sortOrder->column[ix]); if (searchBy == cvSearchBySingleSelect || searchBy == cvSearchByMultiSelect) { - char *cleanClass = cloneString(isFieldEmpty?"None":field); - eraseNonAlphaNum(cleanClass); + char *cleanClass = NULL; + if (isFieldEmpty) + cleanClass = "None"; + else + { + cleanClass = (char *)cvTag(sortOrder->column[ix],field); // class should be tag + if (cleanClass == NULL) + cleanClass = field; + } safef(class,sizeof class," class='%s %s'",sortOrder->column[ix],cleanClass); } } if (sameString("dateUnrestricted",sortOrder->column[ix]) && field && dateIsOld(field,"%F")) printf("<TD%s nowrap style='color: #BBBBBB;'%s>%s</td>",align,class,field); else printf("<TD%s nowrap%s>%s</td>",align,class,isFieldEmpty?" ":field); if (!sameString("fileType",sortOrder->column[ix])) mdbObjRemoveVars(oneFile->mdb,sortOrder->column[ix]); // Remove this from mdb now so that it isn't displayed in "extras' } } } #ifndef INCLUDE_FILENAMES else