Quality of life: in-app dialogs, selections in the URL, editable widgets, token dialog, gallery search, status history, stream errors that say why, tab reordering and shortcuts, log out everywhere

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Mitchell-Johnson
2026-09-19 10:34:59 -07:00
co-authored by Claude Fable 5.1
parent 8ee2a2d293
commit d7ed4d8549
24 changed files with 361 additions and 101 deletions
+22 -18
View File
@@ -183,22 +183,26 @@ machine; hub terminals not leaking into another machine's page; CORS only on sen
token list never exposing hashes; cookie flags; deep nesting, empty bodies, odd methods
and `every=` values on the sensor API; phone drawer, key bar and picker.
## Quality of life — noted, not done
## Quality of life — all ✅ done 2026-09-19, each verified in the browser
- **Selections aren't in the URL.** Services, Cron and Disks forget what was selected on
reload, and can't be linked to. `#/grid/services/nginx.service` would fix both.
- **Browser Back with unsaved file edits** still leaves without asking (page and machine
changes ask; Back needs the history entry put back on Cancel).
- **Prompts are browser `prompt()`/`confirm()` boxes** — rename, new file, delete, token
name. They work, and look nothing like the rest of the console, worst on a phone.
- **Two step token creation** (name, then patterns) wants to be one small dialog, with the
patterns pickable from the catalog like the widget picker.
- **Widgets can't be edited**, only removed and re-added; no way to change a title or type.
- **The Widgets gallery has no search**, and 300+ tiles on `grid` is a long scroll.
- **A custom widget's sparkline starts empty for states and counts** (no history kept for
the background status sensors — only the sampler's ring remembers).
- **Embeds poll nothing while hidden but say nothing when the token is wrong** beyond
"check the token"; a 401 and an unreachable host look the same.
- **Default widget titles for patterns are the raw pattern** ("CPU.CORE.*.USAGE").
- **Terminal tabs can't be reordered**, and there's no keyboard shortcut to switch.
- **The hub's own session cookie is 30 days sliding with no "log out everywhere".**
1. ✅ **Selections are in the URL.** `#/grid/services/ssh.service`, `#/hub/cron/job:…`,
`#/hub/files/%2Fetc`: reload keeps them, links carry them, leaving a page drops them.
2. ✅ **Browser Back with unsaved file edits asks**, like page and machine changes do.
3. ✅ **No more browser `prompt()`/`confirm()` boxes** — all 30 are in-app dialogs (`askYes`,
`askText` in `ui.tsx`): Enter submits, Escape or a tap outside cancels, destructive
ones are red and say what they do ("Close", "Delete"), and they fit a phone.
4. ✅ **Token creation is one dialog**: name, patterns, and the machine's own sensor families
as chips to click.
5. ✅ **Widgets can be edited** — sensor, type and title — in place, from Customize.
6. ✅ **The Widgets gallery has a search** over IDs, names and labels (so "gitea" finds its
container's sensors).
7. ✅ **Status sensors keep a history** (300 readings each: an hour of container memory, two
days of drive wear), so their sparklines have a past.
8. ✅ **A stream that fails says why**: "the token was rejected", "too many live streams are
open", "that machine is unreachable", "can't reach Ham Lab" — in embeds and on Monitors.
9. ✅ **Pattern widgets get readable default titles**: `cpu.core.*.usage` → "CPU core usage".
10. ✅ **Terminal tabs reorder** — drag on a desktop, ‹ › on a touch screen, remembered per
machine in the browser — and **Alt+Shift+←/→** switches tabs, **Alt+Shift+T** opens one,
with the keyboard left in the terminal each time.
11. ✅ **"Log out everywhere"** in Settings ends every session on every device (tokens are
not sessions and keep working).