docs(admin): dashboard page — stats, watcher, Quick Actions, scan panel

Second page of the admin tree. Documents the four-card stats grid with
what each number actually counts (instance-wide totals; Books = every
media item including podcast episodes), the File Watcher card's data
source (/api/scanner/watch/status, armed by Auto-Scan) and its
zero-libraries meaning, Force Rescan All Libraries with its real
mechanics (one job per library, skip-on-active, backfill tool vs.
routine shallow refresh), and the Scanning panel's live progress +
Cancel all scans. Links only to pages that exist (scanning.md); the
Settings reference stays prose until that page lands.

The real-tree nav test's Administration assertion loosens further: guide
leads, everything else strictly follows usabilityOrder — durable across
the remaining page landings. Also fixes the amend this commit replaces:
its first version briefly carried a forward link to the unwritten
settings.md (caught by the link gate, now removed) — the gate worked;
the && chain around go test let the bad commit through, which is exactly
why this amend exists.
This commit is contained in:
John O'Keefe committed 2026-11-02 13:49:23 -05:00
1 parent 89fc479bdb
commit ed550fa914
2 files changed
+76 -4

No files matched your search

+4 -4
View File
@@ -243,18 +243,18 @@ func TestBuildNavigationUsabilityOrder(t *testing.T) {
}
// Administration grows as its pages are written; pin its shape, not
// its size: the guide leads, Libraries follows, and every other item
// its size: the guide leads (pinned landing), and every other item
// must appear in usabilityOrder's declared relative order.
admin := find("Administration")
if len(admin.Items) < 2 || admin.Items[0].Title != "Admin Guide" || admin.Items[1].Title != "Libraries" {
t.Fatalf("Administration must lead with Admin Guide then Libraries, got %+v", admin.Items)
if len(admin.Items) < 1 || admin.Items[0].Title != "Admin Guide" {
t.Fatalf("Administration must lead with the Admin Guide, got %+v", admin.Items)
}
pos := map[string]int{}
for i, p := range usabilityOrder["Administration"] {
pos[docURL(p)] = i
}
last := -1
for _, item := range admin.Items[2:] {
for _, item := range admin.Items[1:] {
r, ok := pos[item.URL]
if !ok {
t.Errorf("Administration item %q (%s) is not in usabilityOrder", item.Title, item.URL)