c5a326f3cc42beca0b59c284a2819763548c166a
max
  Wed Jul 8 05:31:13 2026 -0700
Add top-right "Share a link" and "Login" links to the menu bar, refs #10138

New js/topLinks.js drives two links at the top-right of the menu bar on all pages:

- Login: links to the login page when logged out; when logged in it shows the
username and opens an account dialog (My Sessions / My Custom Tracks /
My Track Hubs, change password, sign out).
- Share a link: on hgTracks, one click saves the current view as a session and
shows a copyable short link, with an optional "Specify name" rename step; works
logged-in or anonymously (reserved user "l"). On hgTrackUi and the hgc/hgGene
item-details popup it instead shares the page URL with the hgsid stripped and
the db argument kept.

hgSession gains two JSON endpoints (hgS_doSaveSessionJson, hgS_doRenameSessionJson)
that reuse saveCartAsSession() and addSessionLink(). The menu bar is patched in
lib/web.c (CGI pages) and hgMenubar.c (static pages) via comment placeholders in
globalNavBar.inc. On narrow/phone screens the links collapse into a menu icon with
a dropdown so they no longer overlap the menu.

diff --git src/hg/hgSession/hgSession.h src/hg/hgSession/hgSession.h
index 8d6c7db61f2..f46c0336c92 100644
--- src/hg/hgSession/hgSession.h
+++ src/hg/hgSession/hgSession.h
@@ -9,30 +9,37 @@
 /* NOTE: some of the original contents have been moved up to cart.h for 
  * sharing with hgTracks. */
 
 #include "cart.h"
 
 /* Global variables - generally set during initialization and then read-only. */
 extern struct cart *cart;	/* This holds cgi and other variables between clicks. */
 extern char *database;		/* Current database, often but not always dbDatabase. */
 
 /* hgSession form inputs */
 #define hgsNewSessionName hgSessionPrefix "newSessionName"
 #define hgsNewSessionShare hgSessionPrefix "newSessionShare"
 #define hgsNewSessionDescription hgSessionPrefix "newSessionDescription"
 #define hgsDoNewSession hgSessionPrefix "doNewSession"
 
+// AJAX endpoint behind the "Share a link" menu button (see topLinks.js).  hgsShareAnon (when
+// set, or when no user is logged in) saves under the reserved anonymous user "l".
+#define hgsDoSaveSessionJson hgSessionPrefix "doSaveSessionJson"
+#define hgsShareAnon hgSessionPrefix "shareAnon"
+// Rename an existing session (hgsOldSessionName -> hgsNewSessionName) for the "Specify name" step.
+#define hgsDoRenameSessionJson hgSessionPrefix "doRenameSessionJson"
+
 #define hgsSharePrefix hgSessionPrefix "share_"
 #define hgsGalleryPrefix hgSessionPrefix "gallery_"
 #define hgsEditPrefix hgSessionPrefix "edit_"
 #define hgsLoadPrefix hgSessionPrefix "load_"
 #define hgsDeletePrefix hgSessionPrefix "delete_"
 
 #define hgsShowDownloadPrefix hgSessionPrefix "showDownload_"
 #define hgsMakeDownloadPrefix hgSessionPrefix "makeDownload_"
 #define hgsDoDownloadPrefix hgSessionPrefix "doDownload_"
 
 #define hgsSaveLocalBackupFileName hgSessionPrefix "saveLocalBackupFileName"
 #define hgsSaveLocalFileName hgSessionPrefix "saveLocalFileName"
 #define hgsSaveLocalFileCompress hgSessionPrefix "saveLocalFileCompress"
 #define hgsDoSaveLocal hgSessionPrefix "doSaveLocal"