feat(go): M6.5 — member-detail modal JS module for /adults and /juniors
All checks were successful
Deploy to K8s / deploy (push) Successful in 8s

Adds static/js/member-detail.js: fetches /api/<page> once on page load,
caches the response, and renders a per-member detail modal on [i] row click.
Keyboard nav: Esc closes, ↑/↓ walk visible (filtered) rows. All modal CSS
was already in place from M6.1.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-08 13:14:41 +02:00
parent 01573faced
commit 309c26f209
5 changed files with 674 additions and 4 deletions

View File

@@ -127,6 +127,47 @@ func TestAdultsPage(t *testing.T) {
}
}
func TestModalMarkup(t *testing.T) {
renderer, err := web.NewRenderer()
if err != nil {
t.Fatalf("NewRenderer: %v", err)
}
b := web.BuildInfo{Version: "v0", Commit: "abc1234", BuildDate: "2026-01-01"}
h := web.NewHTMLHandler(renderer, b, fixtureHandler(t))
cases := []struct {
path string
handler http.HandlerFunc
page string
wantRow string // data-name present only when the page has rows
}{
{"/adults", h.ServeAdults, "adults", `data-name="Test Member"`},
{"/juniors", h.ServeJuniors, "juniors", ""},
}
for _, tc := range cases {
t.Run(tc.path, func(t *testing.T) {
req := httptest.NewRequest(http.MethodGet, tc.path, nil)
w := httptest.NewRecorder()
tc.handler(w, req)
body := w.Body.String()
for _, want := range []string{
`data-page="` + tc.page + `"`,
`id="memberModal"`,
`/static/js/member-detail.js`,
} {
if !strings.Contains(body, want) {
t.Errorf("body missing %q", want)
}
}
if tc.wantRow != "" && !strings.Contains(body, tc.wantRow) {
t.Errorf("body missing info-icon row %q", tc.wantRow)
}
})
}
}
func TestPaymentsPage(t *testing.T) {
renderer, err := web.NewRenderer()
if err != nil {