Extract AssembleJuniors(ctx) from the JSON handler (api/handler.go) so HTML and JSON share one assembly path — mirrors the AssembleAdults pattern from M6.2.
JuniorsPageData wrapper type added to render.go.
HTMLHandler.ServeJuniors wired to call AssembleJuniors and render the new template (parallel to ServeAdults).
juniors.tmpl replaced: member table, name filter, month-range filter, totals row, Credits + Debts sections, Pay / Pay All buttons (links to /qr). No Unmatched section — parity with Python juniors.html.
J/A attendance breakdown (3/500 CZK (4:2J,1A)) and "?" sentinel rendered via MonthCell.Text produced by buildJuniorMemberRow — no extra template logic.
Test plan
go build ./... — clean
go test ./... — all pass
make parity — 3/3 routes OK (wire output unchanged)
Browser smoke on :8080/juniors: table renders, name filter works, month-range filter hides columns, Pay/Pay All links present on unpaid past-month cells, Credits + Debts sections visible
## Summary
- **Extract `AssembleJuniors(ctx)`** from the JSON handler (`api/handler.go`) so HTML and JSON share one assembly path — mirrors the `AssembleAdults` pattern from M6.2.
- **`JuniorsPageData`** wrapper type added to `render.go`.
- **`HTMLHandler.ServeJuniors`** wired to call `AssembleJuniors` and render the new template (parallel to `ServeAdults`).
- **`juniors.tmpl`** replaced: member table, name filter, month-range filter, totals row, Credits + Debts sections, Pay / Pay All buttons (links to `/qr`). No Unmatched section — parity with Python `juniors.html`.
- J/A attendance breakdown (`3/500 CZK (4:2J,1A)`) and `"?"` sentinel rendered via `MonthCell.Text` produced by `buildJuniorMemberRow` — no extra template logic.
## Test plan
- [ ] `go build ./...` — clean
- [ ] `go test ./...` — all pass
- [ ] `make parity` — 3/3 routes OK (wire output unchanged)
- [ ] Browser smoke on `:8080/juniors`: table renders, name filter works, month-range filter hides columns, Pay/Pay All links present on unpaid past-month cells, Credits + Debts sections visible
🤖 Generated with [Claude Code](https://claude.com/claude-code)
- Extract AssembleJuniors(ctx) from ServeJuniors JSON handler so HTML
and JSON share the same view-model path (mirrors AssembleAdults pattern)
- Add JuniorsPageData wrapper in render.go
- Wire HTMLHandler.ServeJuniors to AssembleJuniors + render template
- Replace 4-line placeholder juniors.tmpl with full template:
member table, name filter, month-range filter, totals row,
Credits + Debts sections, Pay / Pay All buttons via /qr links
(no Unmatched section — matches Python juniors.html parity)
- J/A attendance breakdown ("3/500 CZK (4:2J,1A)") and "?" sentinel
rendered via MonthCell.Text from buildJuniorMemberRow, no extra
template logic needed
- All tests pass; make parity reports 3/3 routes OK
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
AssembleJuniors(ctx)from the JSON handler (api/handler.go) so HTML and JSON share one assembly path — mirrors theAssembleAdultspattern from M6.2.JuniorsPageDatawrapper type added torender.go.HTMLHandler.ServeJuniorswired to callAssembleJuniorsand render the new template (parallel toServeAdults).juniors.tmplreplaced: member table, name filter, month-range filter, totals row, Credits + Debts sections, Pay / Pay All buttons (links to/qr). No Unmatched section — parity with Pythonjuniors.html.3/500 CZK (4:2J,1A)) and"?"sentinel rendered viaMonthCell.Textproduced bybuildJuniorMemberRow— no extra template logic.Test plan
go build ./...— cleango test ./...— all passmake parity— 3/3 routes OK (wire output unchanged):8080/juniors: table renders, name filter works, month-range filter hides columns, Pay/Pay All links present on unpaid past-month cells, Credits + Debts sections visible🤖 Generated with Claude Code
- Extract AssembleJuniors(ctx) from ServeJuniors JSON handler so HTML and JSON share the same view-model path (mirrors AssembleAdults pattern) - Add JuniorsPageData wrapper in render.go - Wire HTMLHandler.ServeJuniors to AssembleJuniors + render template - Replace 4-line placeholder juniors.tmpl with full template: member table, name filter, month-range filter, totals row, Credits + Debts sections, Pay / Pay All buttons via /qr links (no Unmatched section — matches Python juniors.html parity) - J/A attendance breakdown ("3/500 CZK (4:2J,1A)") and "?" sentinel rendered via MonthCell.Text from buildJuniorMemberRow, no extra template logic needed - All tests pass; make parity reports 3/3 routes OK Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>