aeaebac6e25be25c1205747abf248fd7092ebdb3
hiram
  Sat May 2 14:53:35 2026 -0700
add a reset button and outlinks to browsers refs #31811

diff --git src/hg/utils/otto/userRequests/ottoRequestView.cgi src/hg/utils/otto/userRequests/ottoRequestView.cgi
index c918d8e69af..add167a7d1e 100644
--- src/hg/utils/otto/userRequests/ottoRequestView.cgi
+++ src/hg/utils/otto/userRequests/ottoRequestView.cgi
@@ -141,78 +141,86 @@
         'body{font-family:sans-serif;margin:1em;font-size:13px}\n'
         'h2{margin:.2em 0}\n'
         'table{border-collapse:collapse;width:100%;margin-top:.5em}\n'
         'th,td{border:1px solid #ccc;padding:3px 6px;vertical-align:top;'
         'font-size:12px}\n'
         'th{background:#eee;text-align:left;position:sticky;top:0}\n'
         'tr:nth-child(even){background:#f8f8f8}\n'
         'td.comment{max-width:28em;white-space:pre-wrap;'
         'word-break:break-word}\n'
         'tr.s7 td{background:#ffe0e0}\n'
         'tr.s8 td{background:#e0f0e0;color:#555}\n'
         'select,button{font-size:12px}\n'
         '.banner{padding:.5em;margin:.4em 0;border-radius:4px}\n'
         '.info {background:#dfd;border:1px solid #5a5}\n'
         '.error{background:#fdd;border:1px solid #a55}\n'
-        '.legend{font-size:12px;color:#555;margin:.4em 0}\n'
-        '.legend code{background:#eee;padding:0 3px}\n'
+        '.legend{font-size:15px;color:#333;margin:.4em 0}\n'
+        '.legend code{background:#eee;padding:0 3px;font-size:14px}\n'
+        '.refreshBtn{font-size:14px;padding:3px 10px;margin-left:6px;'
+        'cursor:pointer}\n'
         '</style></head><body>\n')
 
     out(f'<h2>{DB}.{TABLE}</h2>\n')
     if galaxyStatus:
         staleNote = ' <b>[stale]</b>' if galaxyStatus.get('stale') else ''
         out('<div class="legend">Galaxy queue: '
             f'<b>{galaxyStatus.get("running", "?")}</b> running &middot; '
             f'<b>{galaxyStatus.get("queued",  "?")}</b> queued &middot; '
             f'<b>{galaxyStatus.get("new",     "?")}</b> new '
             f'<small>(as of {html.escape(galaxyStatus.get("ts", ""))})</small>'
             f'{staleNote}</div>\n')
     else:
         out('<div class="legend">Galaxy queue: '
             '<i>status unavailable</i></div>\n')
     if info:
         out(f'<div class="banner info">{html.escape(info)}</div>\n')
     if error:
         out(f'<div class="banner error">{html.escape(error)}</div>\n')
 
     out('<div class="legend">status: ')
     out(' &middot; '.join(f'<code>{k}</code>={html.escape(v)}'
                           for k, v in STATUS_NAMES.items()))
-    out(f' &middot; <b>{len(rows)}</b> row(s) &middot; '
-        f'<a href="">refresh</a></div>\n')
+    out(f' &middot; <b>{len(rows)}</b> row(s)'
+        '<button class="refreshBtn" type="button" '
+        'onclick="location.reload()">refresh</button></div>\n')
 
     out('<table class="sortable">\n<tr>')
     for c in COLS:
         out(f'<th>{c}</th>')
     out('<th>set status</th></tr>\n')
 
     for r in rows:
         rid = r[0]
         try:
             stnum = int(r[7])
         except (ValueError, IndexError):
             stnum = -1
         cls = f's{stnum}' if stnum in (7, 8) else ''
         out(f'<tr class="{cls}">')
         for i, c in enumerate(COLS):
             cell = r[i] if i < len(r) else ''
             if c == 'comment':
                 out(f'<td class="comment">{html.escape(cell)}</td>')
             elif c == 'status':
                 label = STATUS_NAMES.get(stnum, '?')
                 out(f'<td><b>{html.escape(cell)}</b> '
                     f'<small>{html.escape(label)}</small></td>')
+            elif c in ('fromDb', 'toDb') and cell:
+                href = ('https://genome-test.gi.ucsc.edu/cgi-bin/hgTracks?db='
+                        + urllib.parse.quote(cell, safe=''))
+                out(f'<td><a href="{html.escape(href)}" target="_blank">'
+                    f'{html.escape(cell)}</a></td>')
             else:
                 out(f'<td>{html.escape(cell)}</td>')
         # reset form
         out('<td><form method="post" '
             'onsubmit="return confirm(\'Reset status of id=' +
             html.escape(rid) + ' to \' + this.status.value + \'?\')">'
             '<input type="hidden" name="action" value="resetStatus">'
             f'<input type="hidden" name="id" value="{html.escape(rid)}">'
             '<select name="status">')
         for k in sorted(STATUS_NAMES):
             sel = ' selected' if k == stnum else ''
             out(f'<option value="{k}"{sel}>{k}</option>')
         out('</select> <button type="submit">set</button></form></td>')
         out('</tr>\n')
     out('</table>\n')