feat(frontend): game system selector UI + free-text coexistence + suggested-match nudge (#135) #207
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/135-system-selector-ui"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Frontend for the v3.9.0 Game-Aware Systems pillar. Targets the integration branch. Consumes #133's backend.
Closes #135.
What
GameSystemSelectcomponent — a registry dropdown (short_nameper system, value = id) plus a "Free text / Other" option (always first, the default) that reveals the existing free-text input. The free-text input is never removed; selecting a registry system hides it, switching back reveals it.systems/loadingare lifted to the parent soCampaignDetailshares one fetch between the selector and the nudge.fetchGameSystems()API client (GET /api/game-systems).Dashboard.jsx) and settings edit form (CampaignDetail.jsx) use the selector;game_system_idthreaded throughcreateCampaign/updateCampaign. A subtle "Linked" badge appears on cards/header whengame_system_refis set.CampaignDetail) — when a campaign is unlinked, has non-blank free text, and it matches a registry system'sshort_name/name/aliases(case-insensitive), a dismissible banner offers to link it. Accept sends a partial{game_system_id}PATCH (free text untouched); dismiss persists tolocalStorage(qb:gameSystemNudgeDismissed:<id>) so it doesn't nag. Never writes until the GM explicitly accepts.Verification (Node 20)
Dashboard.test.jsx/CampaignDetail.test.jsx: both selector modes, create/save payload shape, nudge show/hide/dismiss/accept) — vianode:20-alpine(npm ci && npm test).npm run build, Vite + PWA).Notes
game_system_ref.🤖 Generated with Claude Code