Review: CRM: full player detail view on profile click
Verdict: APPROVED
Re-review after refinement. All four NEEDS_REFINEMENT items from the first review have been addressed: backend decomposed to basketball-api#249, dependency gate added, existing route conflict documented, scope clarified as admin-only frontend view. AC reduced from 8 to 7.
Template Completeness
- [x] Type — Feature
- [x] Lineage — "Decomposed — frontend only. Backend dependency: basketball-api#249"
- [x] Repo — forgejo_admin/westside-landing
- [x] User Story — As Marcus (admin), click player in CRM to see all info
- [x] Context — Explains admin detail supplements non-admin profile, references basketball-api#249 deployment
- [x] Dependency Gate — Explicit: "This ticket MUST NOT execute until basketball-api#249 is merged and deployed"
- [x] File Targets — Create target and exclusions documented with rationale
- [x] Acceptance Criteria — 7 criteria, all visually verifiable
- [x] Test Expectations — Playwright screenshot + manual validation
- [x] Constraints — Frontend-only, match existing admin design patterns (dark theme, card layout)
- [x] Checklist — Standard PR/tests/no-unrelated
- [x] Related — project-westside-basketball, basketball-api#249 (BLOCKING), westside-landing#183
All required sections present and complete.
Traceability
- [x] story:WS-S5 label — present. Note: WS-S5 on project page maps to "view registration stats on dashboard" (admin) / "basketball-api DB on CNPG" (superadmin). The issue's actual user story is about player detail view. WS-S5 is used as a broad admin-CRM catch-all across the board (items #624, #536, #383 follow the same pattern). Accepted as-is given established usage.
- [x] story note verified — WS-S5 found in project-westside-basketball user-stories section under both Superadmin and Admin headings
- [x] arch:westside-app label — present
- [ ] arch note MISSING — [SCOPE] No
arch-westside-appnote found in pal-e-docs. Systemic gap affecting all arch:westside-app board items. - [x] Forgejo issue — westside-landing#185, open
File Targets
- [x]
src/routes/(app)/admin/players/[id]/+page.svelte— to be created. Confirmed: directory does not exist yet. Parentadmin/players/directory exists with list page. - [x]
src/routes/(app)/players/[id]/+page.svelte— correctly excluded (existing non-admin profile page, confirmed present) - [x]
src/routes/(app)/jersey/— correctly excluded - [ ] MISSING target:
src/routes/(app)/admin/players/+page.svelteline 290 — currently links to/players/{player.id}(non-admin profile). Must update to/admin/players/{player.id}so clicking a player row navigates to the new admin detail page. [BODY] Add this file as a modify target.
Repo Placement
Correct. Frontend work in westside-landing, backend dependency correctly split to basketball-api#249 (separate Forgejo issue, separate board item #676). Previous review's cross-repo concern is fully resolved by the decomposition.
Dependencies
- [x] BLOCKING: basketball-api#249 (board item #676, backlog) —
GET /admin/players/{id}endpoint. Dependency gate explicitly documented in ticket body. Ticket MUST NOT execute until #249 is merged and deployed. Status: open, not yet started. - [x] Related: westside-landing#183 (board item #667, backlog) — CRM jersey payment badges. Not blocking but touches adjacent admin CRM UI.
- [x] Related: basketball-api#248 (open) — Add jersey fields to AdminPlayerItem response. May affect data available for the detail view's jersey section.
All dependencies identified and documented. The blocking dependency has an explicit gate in the issue body.
Acceptance Criteria
7 criteria — all verifiable by Playwright screenshot or manual navigation:
- [x] AC 1 (click navigates to /admin/players/{id}) — testable, frontend routing
- [x] AC 2 (personal info: name, photo, DOB, height, position, school, graduating class) — testable once basketball-api#249 provides the data
- [x] AC 3 (parent info: name, email) — testable
- [x] AC 4 (team assignment, division, registration status, contract status) — testable
- [x] AC 5 (jersey option, size, number, order status) — testable once basketball-api#249 provides the data
- [x] AC 6 (back navigation returns to player list) — testable, frontend only
- [x] AC 7 (works on mobile) — testable via Playwright mobile viewport
All criteria are specific and testable. No ambiguous language. The dependency gate ensures the API endpoint exists before execution begins, so all AC are satisfiable at execution time.
Blast Radius
- Admin players list link (line 290 of
admin/players/+page.svelte) needs updating from/players/{id}to/admin/players/{id}. Changes click behavior for admin users on the CRM list. Low risk, expected behavior change. - No other routes reference
admin/players/[id]— clean addition to the route tree. - The non-admin
players/[id]/+page.sveltecalls admin API endpoints (/admin/players/{id}/mark-paid,/admin/players/{id}/cancel-subscription). Existing concern, not introduced by this ticket. - Rollback: straightforward — revert the new page file and restore the old link target.
Decomposition Assessment
1 file to create, 1 file to modify (link update), 1 repo, 7 AC — all for a single SvelteKit page. Well within the three-thing limit (2 discrete changes) and five-minute rule. No independent subtasks that need parallelization. No decomposition needed. The previous review's decomposition concern has been fully resolved by splitting backend to basketball-api#249.
Recommendation
[BODY]Addsrc/routes/(app)/admin/players/+page.svelteto File Targets (modify section) — update player name link on line 290 from/players/{player.id}to/admin/players/{player.id}.[SCOPE]Create architecture notearch-westside-appfor the westside-app frontend component in pal-e-docs. Systemic gap affecting allarch:westside-appboard items, not specific to this ticket.