690fa17cbf29efbe0f1b6c9b724f4e3614a615fb galt Thu Mar 2 23:23:09 2017 -0800 fixes #18981. track search js problems from CSP2 changes. Needed to add id to some functions in cheapcgi.c and hui.c. diff --git src/hg/hgTracks/searchTracks.c src/hg/hgTracks/searchTracks.c index a1e69c1..cfd13cf 100644 --- src/hg/hgTracks/searchTracks.c +++ src/hg/hgTracks/searchTracks.c @@ -312,100 +312,106 @@ refAdd(&tracks, subTrack); } else warn("found subtrack is NULL."); } } } } } } return tracks; } #define MAX_FOUND_TRACKS 100 -static void findTracksPageLinks(int tracksFound, int startFrom) +static void findTracksPageLinks(int tracksFound, int startFrom, int instance) { +char id[256]; if (tracksFound <= MAX_FOUND_TRACKS) return; // Opener int willStartAt = 0; int curPage = (startFrom/MAX_FOUND_TRACKS) + 1; int endAt = startFrom+MAX_FOUND_TRACKS; if (endAt > tracksFound) endAt = tracksFound; hPrintf("<span><em style='font-size:.9em;'>Listing %d - %d of %d tracks</em> ", startFrom+1,endAt,tracksFound); // << and < if (startFrom >= MAX_FOUND_TRACKS) { - hPrintf("<a href='../cgi-bin/hgTracks?%s=Search&%s=0' id='ftpl1' title='First page of found tracks'" + safef(id, sizeof id, "ftpl%d-first", instance); + hPrintf("<a href='../cgi-bin/hgTracks?%s=Search&%s=0' id='%s' title='First page of found tracks'" ">«</a> ", - TRACK_SEARCH,TRACK_SEARCH_PAGER); - jsOnEventByIdF("click", "ftpl1", "return findTracks.page(\"%s\",0);", TRACK_SEARCH_PAGER); + TRACK_SEARCH,TRACK_SEARCH_PAGER,id); + jsOnEventByIdF("click", id, "return findTracks.page(\"%s\",0);", TRACK_SEARCH_PAGER); + safef(id, sizeof id, "ftpl%d-prev", instance); willStartAt = startFrom - MAX_FOUND_TRACKS; - hPrintf(" <a href='../cgi-bin/hgTracks?%s=Search&%s=%d' id='ftpl2' " + hPrintf(" <a href='../cgi-bin/hgTracks?%s=Search&%s=%d' id='%s' " "title='Previous page of found tracks'>‹</a> ", - TRACK_SEARCH,TRACK_SEARCH_PAGER,willStartAt); - jsOnEventByIdF("click", "ftpl2", "return findTracks.page(\"%s\",%d);", TRACK_SEARCH_PAGER,willStartAt); + TRACK_SEARCH,TRACK_SEARCH_PAGER,willStartAt,id); + jsOnEventByIdF("click", id, "return findTracks.page(\"%s\",%d);", TRACK_SEARCH_PAGER,willStartAt); } // page number links int lastPage = (tracksFound/MAX_FOUND_TRACKS); if ((tracksFound % MAX_FOUND_TRACKS) > 0) lastPage++; int thisPage = curPage - 3; // Window of 3 pages above and below if (thisPage < 1) thisPage = 1; for (;thisPage <= lastPage && thisPage <= curPage + 3; thisPage++) { + safef(id, sizeof id, "ftpl%d-%d", instance, thisPage); if (thisPage != curPage) { willStartAt = ((thisPage - 1) * MAX_FOUND_TRACKS); endAt = willStartAt+ MAX_FOUND_TRACKS; if (endAt > tracksFound) endAt = tracksFound; - hPrintf(" <a href='../cgi-bin/hgTracks?%s=Search&%s=%d' id='ftpl3' " + hPrintf(" <a href='../cgi-bin/hgTracks?%s=Search&%s=%d' id='%s' " "title='Page %d (%d - %d) tracks'>%d</a> ", - TRACK_SEARCH,TRACK_SEARCH_PAGER,willStartAt,thisPage,willStartAt+1,endAt,thisPage); - jsOnEventByIdF("click", "ftpl3", "return findTracks.page(\"%s\",%d);",TRACK_SEARCH_PAGER,willStartAt); + TRACK_SEARCH,TRACK_SEARCH_PAGER,willStartAt,id,thisPage,willStartAt+1,endAt,thisPage); + jsOnEventByIdF("click", id, "return findTracks.page(\"%s\",%d);",TRACK_SEARCH_PAGER,willStartAt); } else hPrintf(" <em style='color:%s;'>%d</em> ",COLOR_DARKGREY,thisPage); } // > and >> if ((startFrom + MAX_FOUND_TRACKS) < tracksFound) { + safef(id, sizeof id, "ftpl%d-next", instance); willStartAt = startFrom + MAX_FOUND_TRACKS; - hPrintf(" <a href='../cgi-bin/hgTracks?%s=Search&%s=%d' id='ftpl4' " + hPrintf(" <a href='../cgi-bin/hgTracks?%s=Search&%s=%d' id='%s' " "title='Next page of found tracks'>›</a> ", - TRACK_SEARCH,TRACK_SEARCH_PAGER,willStartAt); - jsOnEventByIdF("click", "ftpl4", "return findTracks.page(\"%s\",%d);",TRACK_SEARCH_PAGER,willStartAt); + TRACK_SEARCH,TRACK_SEARCH_PAGER,willStartAt,id); + jsOnEventByIdF("click", id, "return findTracks.page(\"%s\",%d);",TRACK_SEARCH_PAGER,willStartAt); + safef(id, sizeof id, "ftpl%d-last", instance); willStartAt = tracksFound - (tracksFound % MAX_FOUND_TRACKS); if (willStartAt == tracksFound) willStartAt -= MAX_FOUND_TRACKS; - hPrintf(" <a href='../cgi-bin/hgTracks?%s=Search&%s=%d' id='ftpl5' title='Last page of found tracks' " + hPrintf(" <a href='../cgi-bin/hgTracks?%s=Search&%s=%d' id='%s' title='Last page of found tracks' " ">»</a></span>\n", - TRACK_SEARCH,TRACK_SEARCH_PAGER,willStartAt); - jsOnEventByIdF("click", "ftpl5", "return findTracks.page(\"%s\",%d);",TRACK_SEARCH_PAGER,willStartAt); + TRACK_SEARCH,TRACK_SEARCH_PAGER,willStartAt,id); + jsOnEventByIdF("click", id, "return findTracks.page(\"%s\",%d);",TRACK_SEARCH_PAGER,willStartAt); } } static void displayFoundTracks(struct cart *cart, struct slRef *tracks, int tracksFound, enum sortBy sortBy) // Routine for displaying found tracks { char id[256]; char javascript[1024]; hPrintf("<div id='found' style='display:none;'>\n"); // This div is emptied with 'clear' button if (tracksFound < 1) { hPrintf("<p>No tracks found</p>\n"); } else @@ -425,31 +431,31 @@ hPrintf("<INPUT TYPE=SUBMIT NAME='submit' VALUE='return to browser' class='viewBtn' " "style='font-size:.8em;'>"); hPrintf(" <span class='selCbCount'></span>\n"); startFrom = cartUsualInt(cart,TRACK_SEARCH_PAGER,0); if (startFrom > 0 && startFrom < tracksFound) { int countUp = 0; for (countUp=0; countUp < startFrom;countUp++) { if (slPopHead(&tracks) == NULL) // memory waste break; } } hPrintf("</td><td align='right' valign='bottom'>\n"); - findTracksPageLinks(tracksFound,startFrom); + findTracksPageLinks(tracksFound,startFrom,0); hPrintf("</td></tr>\n"); } // Begin foundTracks table //hPrintf("<table id='foundTracks'><tr><td colspan='2'>\n"); hPrintf("<tr><td colspan='2'>\n"); hPrintf("</td><td align='right'>\n"); hPrintf("</td></tr><tr bgcolor='#%s'><td>",HG_COL_HEADER); #define PM_BUTTON \ "<IMG height=18 width=18 " \ "id='btn_%s' src='../images/%s' title='%s all found tracks'>" hPrintf(PM_BUTTON,"plus_all", "add_sm.gif", "Select"); hPrintf(PM_BUTTON,"minus_all","remove_sm.gif","Unselect"); jsOnEventById("click", "btn_plus_all", "return findTracks.checkAllWithWait(true);"); jsOnEventById("click", "btn_minus_all", "return findTracks.checkAllWithWait(false);"); @@ -507,42 +513,42 @@ // Setup the check box #define CB_HIDDEN_VAR "<INPUT TYPE=HIDDEN disabled=true NAME='%s_sel' VALUE='%s'>" // subtracks and folder children get "_sel" var. ("_sel" var is temp on folder children) if (tdbIsContainerChild(track->tdb) || tdbIsFolderContent(track->tdb)) hPrintf(CB_HIDDEN_VAR,track->track,checked?"1":CART_VAR_EMPTY); #define CB_SEEN "<INPUT TYPE=CHECKBOX id='%s_sel_id' VALUE='on' class='selCb' %s>" hPrintf(CB_SEEN,track->track,(checked ? " CHECKED" : "")); safef(id, sizeof id, "%s_sel_id", track->track); // XSS Filter? jsOnEventById("click", id, "findTracks.clickedOne(this,true);"); hPrintf("</td><td>\n"); // Setup the visibility drop down #define VIS_HIDDEN_VAR "<INPUT TYPE=HIDDEN disabled=true NAME='%s' VALUE='%s'>" hPrintf(VIS_HIDDEN_VAR,track->track,CART_VAR_EMPTY); // All tracks get vis hidden var - if (tdbIsFolder(track->tdb)) - { + + safef(id, sizeof id, "%s_id", track->track); // XSS Filter? safef(javascript, sizeof javascript, "findTracks.changeVis(this);"); struct slPair *event = slPairNew("change", cloneString(javascript)); - hideShowDropDownWithClassAndExtra(track->track, (track->visibility != tvHide), + if (tdbIsFolder(track->tdb)) + { + hideShowDropDownWithClassAndExtra(track->track, id, (track->visibility != tvHide), "normalText visDD", event); } else { - safef(javascript, sizeof javascript, "findTracks.changeVis(this);"); - struct slPair *event = slPairNew("change", cloneString(javascript)); - hTvDropDownClassWithJavascript(NULL, track->visibility,track->canPack, + hTvDropDownClassWithJavascript(NULL, id, track->visibility,track->canPack, "normalText seenVis",event); } // If this is a container track, allow configuring... if (tdbIsContainer(track->tdb) || tdbIsFolder(track->tdb)) { containerTrackCount++; // Using onclick ensures return to search tracks on submit hPrintf(" <IMG SRC='../images/folderWrench.png' style='cursor:pointer;' " "id='%s_confSet' title='Configure this track container...' " "> ", track->track); safef(id, sizeof id, "%s_confSet", track->track); // XSS Filter? jsOnEventByIdF("click", id, "findTracks.configSet(\"%s\");", track->track); } //#define SHOW_PARENT_FOLDER #ifdef SHOW_PARENT_FOLDER @@ -566,31 +572,31 @@ jsOnEventByIdF("click", id, "popUp.hgTrackUi('%s',true); return false;", track->track); hPrintf("<td>%s", track->longLabel); compositeMetadataToggle(database, track->tdb, NULL, TRUE, FALSE); hPrintf("</td></tr>\n"); } //hPrintf("</table>\n"); // Closing view in browser button and foundTracks count hPrintf("<tr><td nowrap colspan=3>"); hPrintf("<INPUT TYPE=SUBMIT NAME='submit' VALUE='Return to Browser' class='viewBtn' " "style='font-size:.8em;'>"); hPrintf(" <span class='selCbCount'></span>"); if (tracksFound >= ENOUGH_FOUND_TRACKS) { hPrintf("</td><td align='right' valign='top'>\n"); - findTracksPageLinks(tracksFound,startFrom); + findTracksPageLinks(tracksFound,startFrom,1); hPrintf("</td></tr>\n"); } hPrintf("</table>\n"); if (containerTrackCount > 0) hPrintf("<BR><IMG SRC='../images/folderWrench.png'> Tracks so marked are containers " "which group related data tracks. Containers may need additional configuration " "(by clicking on the <IMG SRC='../images/folderWrench.png'> icon) before they can " "be viewed in the browser.<BR>\n"); //hPrintf("* Tracks so marked are containers which group related data tracks. These may " // "not be visible unless further configuration is done. Click on the * to " // "configure these.<BR><BR>\n"); hPrintf("\n</form>\n"); // be done with json