95433400da33b5bae4c4c8475f1305fc08510f66 jcasper Sat Jun 11 14:25:14 2016 -0700 Store the sort/filter state of jQuery-DataTables-enabled tables in hgSession and hgPublicSessions to the cart, without including that state in saved sessions. Block IE versions before 11 from seeing the DataTables table version, due to checkbox issues. Bonus: fix for a minor session deletion bug. refs #15312, #17509 diff --git src/hg/lib/cart.c src/hg/lib/cart.c index 2074c8c..2b43a38 100644 --- src/hg/lib/cart.c +++ src/hg/lib/cart.c @@ -491,35 +491,43 @@ if (isEmpty(sessionName)) errAbort("Please go back and enter a session name to load."); sqlSafef(query, sizeof(query), "SELECT shared, contents FROM %s " "WHERE userName = '%s' AND sessionName = '%s';", namedSessionTable, encSessionOwner, encSessionName); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { boolean shared = atoi(row[0]); if (shared || (userName && sameString(sessionOwner, userName))) { char *sessionVar = cartSessionVarName(); char *hgsid = cartSessionId(cart); + char *sessionTableString = cartOptionalString(cart, hgSessionTableState); + sessionTableString = cloneString(sessionTableString); + char *pubSessionsTableString = cartOptionalString(cart, hgPublicSessionsTableState); + pubSessionsTableString = cloneString(pubSessionsTableString); struct sqlConnection *conn2 = hConnectCentral(); sessionTouchLastUse(conn2, encSessionOwner, encSessionName); cartRemoveLike(cart, "*"); cartParseOverHash(cart, row[1]); cartSetString(cart, sessionVar, hgsid); + if (sessionTableString != NULL) + cartSetString(cart, hgSessionTableState, sessionTableString); + if (pubSessionsTableString != NULL) + cartSetString(cart, hgPublicSessionsTableState, pubSessionsTableString); if (oldVars) hashEmpty(oldVars); /* Overload settings explicitly passed in via CGI (except for the * command that sent us here): */ loadCgiOverHash(cart, oldVars); if (isNotEmpty(actionVar)) cartRemove(cart, actionVar); hDisconnectCentral(&conn2); } else errAbort("Sharing has not been enabled for user %s's session %s.", sessionOwner, sessionName); } else errAbort("Could not find session %s for user %s.", @@ -529,33 +537,41 @@ } #endif /* GBROWSE */ void cartLoadSettings(struct lineFile *lf, struct cart *cart, struct hash *oldVars, char *actionVar) /* Load settings (cartDump output) into current session, and then * reload the CGI settings (to support override of session settings). * If non-NULL, oldVars will contain values overloaded when reloading CGI. * If non-NULL, actionVar is a cartRemove wildcard string specifying the * CGI action variable that sent us here. */ { char *line = NULL; int size = 0; char *sessionVar = cartSessionVarName(); char *hgsid = cartSessionId(cart); - +char *sessionTableString = cartOptionalString(cart, hgSessionTableState); +sessionTableString = cloneString(sessionTableString); +char *pubSessionsTableString = cartOptionalString(cart, hgPublicSessionsTableState); +pubSessionsTableString = cloneString(pubSessionsTableString); cartRemoveLike(cart, "*"); cartSetString(cart, sessionVar, hgsid); +if (sessionTableString != NULL) + cartSetString(cart, hgSessionTableState, sessionTableString); +if (pubSessionsTableString != NULL) + cartSetString(cart, hgPublicSessionsTableState, pubSessionsTableString); + while (lineFileNext(lf, &line, &size)) { char *var = nextWord(&line); if (isEmpty(var)) // blank line continue; char *val = line; if (sameString(var, sessionVar)) continue; else { if (val != NULL) { struct dyString *dy = dyStringSub(val, "\\n", "\n");