From 32c6ae98a1c4d9e60918bd36760174a794895728 Mon Sep 17 00:00:00 2001 From: Mix Date: Sat, 10 Oct 2026 02:36:04 +0300 Subject: [PATCH] panel-redesign: the queue in the new shell; the old design is removed Stage 2, steps 7 and 8 in one commit: the static guard fails as soon as the ratchet holds no page while legacy.css still exists, and the tests of the old layout need it while that layout exists - the two steps do not split into states that pass on their own. Written by Sonnet, reviewed by Opus. The queue - out-queue, named after its mockup: today's content - the listing of postqueue -p in a log pane, polled as before (GET /outbound/queue/fragment) - and the "How retries work" facts. The mockup's table of messages is the roadmap's queue-as-a-table; the outline guard exempts this page for exactly that reason. Routes and the global-only check are unchanged; the page has no actions and never had. - Inbound has no Queue entry and no route serves one. The old design is gone - Deleted: layout_legacy.html, legacy.css, logo-compact.svg, mail_queue.html, mail_queue_body.html. - view.go has one path: every page is layout.html + components.html + its own files; kitPages, kitFragments, the map-data branch of Render, the dict and back template functions and metaOf's map branch are removed. handlers: pageBase removed. - legacy_pages.txt holds its header and no entry. - panel.js: the old copy handler (button.copy in .code-row) is removed. A show-when rule now applies to every element it matches, and hiding adds Bulma's is-hidden beside the hidden attribute - a .box or a grid row has a display of its own and stayed visible. - The user form hides both domain lists again when the role is Global (Box.DomainPick, an attribute; data-global-role on the select). - Tests of the old layout are deleted; what they asserted about the shell (version only signed in, the menu follows the user's reach, Inbound only with the feature, Help present, the current entry marked) is asserted on the kit pages, two tests added for it. For the owner: is-hidden is a Bulma class outside the subset of check.py. No template writes it - the script sets it at run time to hide a block - so no guard sees it; say if it should be on the list. Evidence - docs/assets/panel-redesign/evidence/out-queue.png: 1440 px wide, headless Edge, the real template served locally with its fixture - NOT from the container (no Docker on this machine). - panel/audit.js on out-queue, user and backup at 1440 and 1280: 366 texts checked, problems: []. - In a browser against the local fixture server: the encryption fields of Backup, the manual / auto limit fields and the custom report address of Domain settings show and hide with their control; all 28 fixture pages answer 200 with panel.css, /static/legacy.css answers 404. - Not exercised: polling against a real postqueue (none on Windows). - go test -count=1 ./internal/web/... ./cmd/panel ok internal/web ok internal/web/auth ok internal/web/handlers ok internal/web/validate ok internal/web/view ok cmd/panel Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 5 + .../panel-redesign/evidence/out-queue.png | Bin 0 -> 71923 bytes docs/plans/panel-redesign.md | 4 +- docs/roadmap.md | 2 +- internal/web/handlers/authz.go | 11 - .../web/handlers/handlers_account_test.go | 3 - .../web/handlers/handlers_components_test.go | 3 - internal/web/handlers/handlers_monitor.go | 29 +- .../web/handlers/handlers_monitor_test.go | 17 +- .../handlers/handlers_outbound_log_test.go | 5 +- internal/web/handlers/handlers_server_test.go | 2 +- internal/web/view/components.go | 25 +- internal/web/view/components_test.go | 77 +- internal/web/view/fixtures_test.go | 17 +- internal/web/view/legacy_pages.txt | 1 - internal/web/view/outbound_queue.go | 81 ++ internal/web/view/outbound_queue_test.go | 60 ++ internal/web/view/server.go | 4 +- internal/web/view/server_test.go | 18 +- internal/web/view/static/legacy.css | 862 ------------------ internal/web/view/static/logo-compact.svg | 8 - internal/web/view/static/panel.js | 52 +- internal/web/view/static_test.go | 2 +- internal/web/view/templates/components.html | 2 +- .../web/view/templates/layout_legacy.html | 158 ---- internal/web/view/templates/mail_queue.html | 42 - .../web/view/templates/mail_queue_body.html | 6 - internal/web/view/templates/out_queue.html | 14 + .../web/view/templates/out_queue_body.html | 6 + internal/web/view/templates/user.html | 10 +- internal/web/view/templates_test.go | 376 +------- internal/web/view/view.go | 139 +-- 32 files changed, 329 insertions(+), 1712 deletions(-) create mode 100644 docs/assets/panel-redesign/evidence/out-queue.png create mode 100644 internal/web/view/outbound_queue.go create mode 100644 internal/web/view/outbound_queue_test.go delete mode 100644 internal/web/view/static/legacy.css delete mode 100644 internal/web/view/static/logo-compact.svg delete mode 100644 internal/web/view/templates/layout_legacy.html delete mode 100644 internal/web/view/templates/mail_queue.html delete mode 100644 internal/web/view/templates/mail_queue_body.html create mode 100644 internal/web/view/templates/out_queue.html create mode 100644 internal/web/view/templates/out_queue_body.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 580cc3e..bb96c0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -113,6 +113,11 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); version the help drawer is gone. The user form sets the user's e-mail. The backup download is encrypted unless the box is unticked. Only the queue page is left on the ratchet. +- panel-redesign (stage 2): the **Outbound queue** page is in the new shell + with its content unchanged - the listing of `postqueue -p` and how + retries work. With it every page is built from the component kit: the old + stylesheet, the old layout and the engine's second rendering path are + deleted, and the ratchet is empty. ### Changed diff --git a/docs/assets/panel-redesign/evidence/out-queue.png b/docs/assets/panel-redesign/evidence/out-queue.png new file mode 100644 index 0000000000000000000000000000000000000000..d574963fa2e0f7601a5de27aeb29a59a2e76c48a GIT binary patch literal 71923 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 G_`d+%rT_*2 literal 0 HcmV?d00001 diff --git a/docs/plans/panel-redesign.md b/docs/plans/panel-redesign.md index 3118c8c..6098cbd 100644 --- a/docs/plans/panel-redesign.md +++ b/docs/plans/panel-redesign.md @@ -519,8 +519,8 @@ only when both are done. Every stage-2 step ends with the evidence of - [x] Outbound: log, message, DMARC hub / domain / report — **Sonnet** - [x] Inbound: domains, domain with the *Spam filter* box, delete — **Sonnet** - [x] Server: system log, backup, users, user form, delete; Help as `help_topic` partials, the drawer removed — **Sonnet** -- [ ] Queues: old content inside the new shell (outbound), Inbound › Queue hidden — **Sonnet** -- [ ] Remove the old `panel.css`, the drawer code in `panel.js` and every class nothing references; `legacyPages` empty, vocabulary test green with no allow-list — **Sonnet** +- [x] Queues: old content inside the new shell (outbound), Inbound › Queue hidden — **Sonnet** +- [x] Remove the old `panel.css`, the drawer code in `panel.js` and every class nothing references; `legacyPages` empty, vocabulary test green with no allow-list — **Sonnet** **Stage 3 — reviews, docs, 2.0.0** diff --git a/docs/roadmap.md b/docs/roadmap.md index 02ea499..d646782 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -39,7 +39,7 @@ in `git log` and [CHANGELOG.md](../CHANGELOG.md). | panel-notifications | E-mail notifications about important events | candidate | — | — | | delivery-log-storage | Keep a message's `mail.log` lines with its send-log row | candidate | — | — | | password-reset | Password reset by e-mail | candidate | — | — | -| panel-redesign | Panel redesign (accepted mockups, design contract) | agreed | 21/27 | [plans/panel-redesign.md](plans/panel-redesign.md) | +| panel-redesign | Panel redesign (accepted mockups, design contract) | agreed | 23/27 | [plans/panel-redesign.md](plans/panel-redesign.md) | | schema-squash | Squash SQLite migrations into a 2.x baseline | built in panel-redesign (stage 1) | — | [plans/panel-redesign.md](plans/panel-redesign.md) | **Recommended order** (not binding; owner, 2026-10-09: feature order follows diff --git a/internal/web/handlers/authz.go b/internal/web/handlers/authz.go index a2d088e..4d3c337 100644 --- a/internal/web/handlers/authz.go +++ b/internal/web/handlers/authz.go @@ -22,17 +22,6 @@ func (h *Handlers) requireGlobal(w http.ResponseWriter, r *http.Request) (auth.P return p, true } -func (h *Handlers) pageBase(r *http.Request) map[string]any { - p, _ := h.principal(r) - return map[string]any{ - "User": auth.CurrentUser(r), - "IsGlobal": p.IsGlobal(), - // Which groups the menu shows this user (plan § Who sees what). - "HasOutbound": p.HasOutbound(), - "HasInbound": p.HasInbound(), - } -} - // shellMeta is what the shell of a page of the component kit needs to know // about the person looking at it: their name and which groups of the menu they // reach. The page's constructor adds its title and where it sits in the menu. diff --git a/internal/web/handlers/handlers_account_test.go b/internal/web/handlers/handlers_account_test.go index 1f2ba28..f266f02 100644 --- a/internal/web/handlers/handlers_account_test.go +++ b/internal/web/handlers/handlers_account_test.go @@ -184,9 +184,6 @@ func TestAccountPageIsDrawnInTheShell(t *testing.T) { t.Errorf("account page missing %q", want) } } - if strings.Contains(out, "/static/legacy.css") { - t.Error("account page loads the old stylesheet") - } } // A refused form is shown again with the error above the boxes and what the diff --git a/internal/web/handlers/handlers_components_test.go b/internal/web/handlers/handlers_components_test.go index 8dadd3e..6ac9c94 100644 --- a/internal/web/handlers/handlers_components_test.go +++ b/internal/web/handlers/handlers_components_test.go @@ -50,7 +50,4 @@ func TestComponentsPageRendersTheKitForTheGlobalRole(t *testing.T) { t.Errorf("the kit page is missing %q", want) } } - if strings.Contains(out, "/static/legacy.css") { - t.Error("the kit page loads the old stylesheet") - } } diff --git a/internal/web/handlers/handlers_monitor.go b/internal/web/handlers/handlers_monitor.go index 6deebfc..5d68b66 100644 --- a/internal/web/handlers/handlers_monitor.go +++ b/internal/web/handlers/handlers_monitor.go @@ -14,7 +14,6 @@ import ( "github.com/mixeme/selfpost/internal/mailhdr" "github.com/mixeme/selfpost/internal/postfix" "github.com/mixeme/selfpost/internal/store" - "github.com/mixeme/selfpost/internal/web/auth" "github.com/mixeme/selfpost/internal/web/view" ) @@ -333,26 +332,15 @@ func parsePage(v string) int { return n } -// HandleMailQueue renders the Mail queue page (architecture.md § Panel HTTP +// HandleMailQueue renders the Outbound queue page (architecture.md § Panel HTTP // surface). func (h *Handlers) HandleMailQueue(w http.ResponseWriter, r *http.Request) { if _, ok := h.requireGlobal(w, r); !ok { return } - out, errText := readQueue() policy := h.cfg.RetryPolicy - h.view.Render(w, http.StatusOK, "mail_queue", map[string]any{ - "Title": "SelfPost — mail queue", - "User": auth.CurrentUser(r), - "Active": "mail_queue", - "IsGlobal": true, - "Output": out, - "Error": errText, - "FirstRetry": policy.FirstRetry(), - "BackoffCap": policy.BackoffCap(), - "QueueLifetime": policy.QueueLifetime(), - "RetryFromDefaults": policy.FromDefaults, - }) + h.view.Render(w, http.StatusOK, "out-queue", h.outQueuePage(r). + WithRetryPolicy(policy.FirstRetry(), policy.BackoffCap(), policy.QueueLifetime(), policy.FromDefaults)) } // HandleMailQueueBody serves the HTMX polling fragment for the queue view. @@ -360,11 +348,14 @@ func (h *Handlers) HandleMailQueueBody(w http.ResponseWriter, r *http.Request) { if _, ok := h.requireGlobal(w, r); !ok { return } + h.view.RenderFragment(w, http.StatusOK, "out_queue_body", h.outQueuePage(r)) +} + +// outQueuePage reads the queue and gives it to the view; the page and its +// fragment draw the same box from it. +func (h *Handlers) outQueuePage(r *http.Request) *view.OutQueue { out, errText := readQueue() - h.view.RenderFragment(w, http.StatusOK, "mail_queue_body", map[string]any{ - "Output": out, - "Error": errText, - }) + return view.NewOutQueue(h.shellMeta(r), out, errText) } // readQueue runs postqueue -p, returning a friendly message instead of the diff --git a/internal/web/handlers/handlers_monitor_test.go b/internal/web/handlers/handlers_monitor_test.go index d000320..0a390c6 100644 --- a/internal/web/handlers/handlers_monitor_test.go +++ b/internal/web/handlers/handlers_monitor_test.go @@ -479,17 +479,17 @@ func fixtureRetryPolicy() postfix.RetryPolicy { } } -// The retry card sits on the page itself, outside the HTMX poll, and prints +// The retry policy sits on the page itself, outside the HTMX poll, and prints // whatever policy was cached on Config — never a live postconf. func TestMailQueueShowsRetryPolicyCard(t *testing.T) { h := &Handlers{view: mustView(t), cfg: Config{Version: "test", RetryPolicy: fixtureRetryPolicy()}} out := getBody(t, h.HandleMailQueue, "/outbound/queue") for _, want := range []string{ - "How delivery retries work", - "id=\"retry-policy\"", + "

How retries work

", + "This Postfix's policy, read at panel start", ">10 minutes<", - "doubling, cap about 1 hour 7 minutes", + "capped at about 1 hour 7 minutes", ">2 days<", } { if !strings.Contains(out, want) { @@ -499,7 +499,7 @@ func TestMailQueueShowsRetryPolicyCard(t *testing.T) { if strings.Contains(out, ">5 minutes<") || strings.Contains(out, ">5 days<") { t.Errorf("mail queue shows stock defaults instead of the fixture:\n%s", out) } - if strings.Contains(out, "compiled-in defaults") { + if strings.Contains(out, "Compiled-in defaults") { t.Error("a fixture policy must not show the fallback note") } } @@ -508,7 +508,10 @@ func TestMailQueueBodyOmitsRetryPolicyCard(t *testing.T) { h := &Handlers{view: mustView(t), cfg: Config{RetryPolicy: fixtureRetryPolicy()}} out := getBody(t, h.HandleMailQueueBody, "/outbound/queue/fragment") - if strings.Contains(out, "How delivery retries work") || strings.Contains(out, "10 minutes") { + if !strings.HasPrefix(out, `
`, ``, ``, `name="password" type="password" autocomplete="new-password">`, `Leave empty to keep the current one.`, - ``, ``, @@ -185,11 +185,25 @@ func TestUserFormOfTheOnlyGlobalUser(t *testing.T) { p := NewUserForm(admin(), UserFormInput{ID: 1, Name: "admin", Username: "admin", Role: "global", RoleLocked: true, PasswordMin: 12, ShowInbound: true}) out := renderSignedIn(t, "user", p) - pageHas(t, "User", out, ``, ``, ``) + if n := strings.Count(out, `
`); n != 2 { + t.Errorf("%d boxes are marked data-domain-pick, want the outbound and the inbound list", n) + } + out = renderSignedIn(t, "user", NewUserForm(admin(), UserFormInput{ID: 2, Name: "shop-team", Username: "shop-team", Role: "domain", PasswordMin: 12})) + if n := strings.Count(out, "data-domain-pick"); n != 1 { + t.Errorf("%d boxes are marked without the inbound feature, want the outbound list alone", n) + } +} + // Inbound domains are offered only where the feature is on; the handler keeps // what the user already has there when the form has no such list. func TestUserFormHasNoInboundListWhenTheFeatureIsOff(t *testing.T) { diff --git a/internal/web/view/static/legacy.css b/internal/web/view/static/legacy.css deleted file mode 100644 index 87f7c97..0000000 --- a/internal/web/view/static/legacy.css +++ /dev/null @@ -1,862 +0,0 @@ -/* Panel stylesheet. It lives in a file rather than in a