b49b64da2abd8202b9d2fd5243a777f3906de708
kate
Fri May 10 13:11:16 2019 -0700
Fix problem with +/- buttons controlling vertical colunmns in matrix. They were being created with non-unique ids. refs #23452
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index a38fb62..ca20e1b 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -7477,40 +7477,42 @@
jsOnEventById("click", id, javascript);
#define MATRIX_RIGHT_BUTTONS_AFTER 8
#define MATRIX_BOTTOM_BUTTONS_AFTER 20
static void buttonsForAll(boolean left, boolean top)
{
char id[256];
char javascript[1024];
char fullname[256];
safef(fullname, sizeof fullname, "plus_all_%s_%s", left ? "left" : "right", top ? "top" : "bottom");
PM_MAKE_BUTTON_UC("true", "", "", "", "", "", fullname, "add_sm.gif")
safef(fullname, sizeof fullname, "minus_all_%s_%s", left ? "left" : "right", top ? "top" : "bottom");
PM_MAKE_BUTTON_UC("false","", "", "", "", "", fullname, "remove_sm.gif")
}
-static void buttonsForOne(char *class, boolean vertical, boolean left)
+static void buttonsForOne(char *class, boolean vertical, boolean left, boolean top)
{
char id[256];
char javascript[1024];
char fullname[256];
-safef(fullname, sizeof fullname, "plus_%s_all_%s" , class, left?"left":"right");
+safef(fullname, sizeof fullname, "plus_%s_all_%s_%s" , class, left ? "left" : "right",
+ top ? "top" : "bottom");
PM_MAKE_BUTTON_UC("true", ",'", class, "'", "", "", fullname, "add_sm.gif")
if (vertical)
puts("
");
-safef(fullname, sizeof fullname, "minus_%s_all_%s", class, left?"left":"right");
+safef(fullname, sizeof fullname, "minus_%s_all_%s_%s", class, left ? "left" : "right",
+ top ? "top" : "bottom");
PM_MAKE_BUTTON_UC("false", ",'", class, "'", "", "", fullname, "remove_sm.gif")
}
#define MATRIX_SQUEEZE 10
static boolean matrixSqueeze(membersForAll_t* membersForAll)
// Returns non-zero if the matrix will be squeezed. Non-zero is actually squeezedLabelHeight
{
char *browserVersion;
if (btIE == cgiClientBrowser(&browserVersion, NULL, NULL) && *browserVersion < '9')
return 0;
members_t *dimensionX = membersForAll->members[dimX];
members_t *dimensionY = membersForAll->members[dimY];
if (dimensionX && dimensionY)
{
@@ -7608,100 +7610,100 @@
top ? "TOP" : "BOTTOM", dimensionX->groupTitle);
}
}
else if (dimensionY)
{
printf("
");
printf("%s", dimensionY->groupTitle);
printf(" | ");
buttonsForAll(FALSE, top);
puts(" | ");
}
puts("\n");
}
static void matrixXheadingsRow2(struct trackDb *parentTdb, boolean squeeze,
- membersForAll_t* membersForAll)
+ membersForAll_t* membersForAll, boolean top)
// prints the 2nd row of a matrix: Y title; X buttons; title Y
{
members_t *dimensionX = membersForAll->members[dimX];
members_t *dimensionY = membersForAll->members[dimY];
// If there are both X and Y dimensions, then there is a row of buttons in X
if (dimensionX && dimensionY)
{
int ixX,cntX=0;
printf("%s | ",
dimensionY->groupTitle);
for (ixX = 0; ixX < dimensionX->count; ixX++) // Special row of +- +- +-
{
if (dimensionX->subtrackList
&& dimensionX->subtrackList[ixX]
&& dimensionX->subtrackList[ixX]->val)
{
printf("\n",dimensionX->tags[ixX]);
- buttonsForOne( dimensionX->tags[ixX], squeeze, TRUE);
+ buttonsForOne(dimensionX->tags[ixX], squeeze, TRUE, top);
puts(" | ");
cntX++;
}
}
// If dimension is big enough, then add Y buttons to right as well
if (cntX>MATRIX_RIGHT_BUTTONS_AFTER)
printf("%s | ", dimensionY->groupTitle);
puts("
\n");
}
}
static boolean matrixXheadings(char *db,struct trackDb *parentTdb, membersForAll_t* membersForAll,
boolean top)
// UI for X headings in matrix
{
boolean squeeze = matrixSqueeze(membersForAll);
if (top)
matrixXheadingsRow1(db, parentTdb, squeeze, membersForAll, top);
-matrixXheadingsRow2(parentTdb,squeeze,membersForAll);
+matrixXheadingsRow2(parentTdb, squeeze, membersForAll, top);
if (!top)
matrixXheadingsRow1(db, parentTdb, squeeze, membersForAll, top);
return squeeze;
}
static void matrixYheadings(char *db,struct trackDb *parentTdb, membersForAll_t* membersForAll,
int ixY, boolean left)
// prints the column of Y labels and buttons
{
members_t *dimensionX = membersForAll->members[dimX];
members_t *dimensionY = membersForAll->members[dimY];
struct trackDb *childTdb = NULL;
if (dimensionY
&& dimensionY->subtrackList
&& dimensionY->subtrackList[ixY]
&& dimensionY->subtrackList[ixY]->val)
childTdb = dimensionY->subtrackList[ixY]->val;
if (dimensionX && dimensionY && childTdb != NULL) // Both X and Y, then column of buttons
{
printf("",
dimensionY->tags[ixY],left?"RIGHT":"LEFT");
if (left)
printf("%s ",compositeLabelWithVocabLink(db,parentTdb,childTdb,dimensionY->groupTag,
dimensionY->titles[ixY]));
- buttonsForOne( dimensionY->tags[ixY], FALSE, left);
+ buttonsForOne(dimensionY->tags[ixY], FALSE, left, FALSE);
if (!left)
printf(" %s",compositeLabelWithVocabLink(db,parentTdb,childTdb,dimensionY->groupTag,
dimensionY->titles[ixY]));
puts(" | ");
}
else if (dimensionX)
{
printf("",left?"RIGHT":"LEFT");
buttonsForAll(TRUE, TRUE); // WARNING: not tested (is this used ?)
puts(" | ");
}
else if (left && dimensionY && childTdb != NULL)
printf("%s | \n",dimensionY->tags[ixY],
compositeLabelWithVocabLink(db,parentTdb,childTdb,dimensionY->groupTag,
dimensionY->titles[ixY]));