panel-redesign: ratchet list, fixture registry and a route seam for the guards
Groundwork the guard tests of stage 0 stand on; no behaviour changes.
- internal/web/view/legacy_pages.txt: the redesign ratchet. Every page of
today's panel is listed as still old, plus @kit and @routes for the two
pieces of work whose tests stay quiet until they land. The list only
shrinks (enforced by CI in the next commits).
- internal/web/view/fixtures_test.go: the registry of fixtures the guards
render redesigned pages with. Empty until the kit page exists.
- web.go: route registration moves out of Handler() into muxes(), so a
test can ask the real muxes which pattern answers a path.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,17 @@
|
|||||||
|
package view
|
||||||
|
|
||||||
|
// pageFixtures is the data each redesigned page is rendered with by the guard
|
||||||
|
// tests (guard_panel_test.go): one entry per page that has left
|
||||||
|
// legacy_pages.txt, keyed by the page's engine name. The guards render the page
|
||||||
|
// through Engine.Render with this value and hold the result to the design
|
||||||
|
// contract — its class vocabulary, its page structure and the component
|
||||||
|
// skeleton recorded for the mockup of the same name in
|
||||||
|
// docs/assets/panel-redesign/panel/outlines.json.
|
||||||
|
//
|
||||||
|
// A fixture therefore has to fill the page the way its mockup is filled: the
|
||||||
|
// same boxes, the same number of records. It is also what the evidence
|
||||||
|
// screenshots are compared against, so use plausible values, not "foo".
|
||||||
|
//
|
||||||
|
// This file belongs to the implementation, not to the guards: the step that
|
||||||
|
// restyles a page adds its fixture here in the same commit.
|
||||||
|
var pageFixtures = map[string]func() any{}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# The redesign ratchet (docs/plans/panel-redesign.md § Against resurrected pages).
|
||||||
|
#
|
||||||
|
# One entry per line: what is still pre-2.0 and therefore not yet held to the
|
||||||
|
# design contract by the guard tests. This list ONLY SHRINKS — CI fails a
|
||||||
|
# commit whose list is not a subset of its parent's (.github/scripts/design-first.sh).
|
||||||
|
# Finishing a piece of work means deleting its line in the same commit; from
|
||||||
|
# then on the guards hold that piece for good.
|
||||||
|
#
|
||||||
|
# @kit the component kit is not complete (stage 0): panel.css,
|
||||||
|
# components.html, components.go, layout.html, GET /server/components
|
||||||
|
# @routes the pre-2.0 route table is still in place (stage 1)
|
||||||
|
# <name> a page of the view engine that is still the old template
|
||||||
|
@kit
|
||||||
|
@routes
|
||||||
|
backup
|
||||||
|
dashboard
|
||||||
|
deliveries
|
||||||
|
delivery
|
||||||
|
dmarc
|
||||||
|
dmarc_domain
|
||||||
|
dmarc_report
|
||||||
|
domain_delete
|
||||||
|
domain_detail
|
||||||
|
help
|
||||||
|
inbound
|
||||||
|
inbound_delete
|
||||||
|
inbound_domain
|
||||||
|
login
|
||||||
|
mail_queue
|
||||||
|
settings
|
||||||
|
setup
|
||||||
|
status
|
||||||
|
system_log
|
||||||
|
user_delete
|
||||||
|
user_form
|
||||||
|
users
|
||||||
+13
-3
@@ -147,6 +147,17 @@ func (s *Server) Start() error {
|
|||||||
|
|
||||||
// Handler returns the panel's HTTP handler (router).
|
// Handler returns the panel's HTTP handler (router).
|
||||||
func (s *Server) Handler() http.Handler {
|
func (s *Server) Handler() http.Handler {
|
||||||
|
mux, authed := s.muxes()
|
||||||
|
mux.Handle("/", s.auth.RequireAuth(authed))
|
||||||
|
return s.secure(mux)
|
||||||
|
}
|
||||||
|
|
||||||
|
// muxes registers every route: the public ones, and the ones behind a session.
|
||||||
|
// Both muxes are flat — one pattern per route, nothing mounted as a sub-router —
|
||||||
|
// and building them only takes method values, it never calls into s.auth or
|
||||||
|
// s.handlers: the route guard test (guard_routes_test.go) runs this on a bare
|
||||||
|
// Server and asks each mux which pattern answers a path.
|
||||||
|
func (s *Server) muxes() (public, authed *http.ServeMux) {
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
h := s.handlers
|
h := s.handlers
|
||||||
|
|
||||||
@@ -157,7 +168,7 @@ func (s *Server) Handler() http.Handler {
|
|||||||
mux.HandleFunc("/login", s.auth.HandleLogin)
|
mux.HandleFunc("/login", s.auth.HandleLogin)
|
||||||
mux.HandleFunc("/logout", s.auth.HandleLogout)
|
mux.HandleFunc("/logout", s.auth.HandleLogout)
|
||||||
|
|
||||||
authed := http.NewServeMux()
|
authed = http.NewServeMux()
|
||||||
authed.HandleFunc("GET /{$}", redirectHome)
|
authed.HandleFunc("GET /{$}", redirectHome)
|
||||||
authed.HandleFunc("GET /help", h.HandleHelp)
|
authed.HandleFunc("GET /help", h.HandleHelp)
|
||||||
|
|
||||||
@@ -224,8 +235,7 @@ func (s *Server) Handler() http.Handler {
|
|||||||
authed.HandleFunc("GET /system-log", h.HandleSystemLog)
|
authed.HandleFunc("GET /system-log", h.HandleSystemLog)
|
||||||
authed.HandleFunc("GET /system-log/body", h.HandleSystemLogBody)
|
authed.HandleFunc("GET /system-log/body", h.HandleSystemLogBody)
|
||||||
|
|
||||||
mux.Handle("/", s.auth.RequireAuth(authed))
|
return mux, authed
|
||||||
return s.secure(mux)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// redirectSettings sends legacy /account bookmarks to /settings (308 preserves POST).
|
// redirectSettings sends legacy /account bookmarks to /settings (308 preserves POST).
|
||||||
|
|||||||
Reference in New Issue
Block a user