Skip to content

Skill groups — foundation (data model + UI) #33

@javaisbetterthanpython

Description

@javaisbetterthanpython

Summary

Upstream: pickleball-shuffler#25 (part 1 of 3)

Support skill-level groups (e.g. Standard vs Advanced) so groups can play separately or combined. This issue covers data model, enablement, and player assignment UI.

Use case

Beginner vs advanced players at one venue — usually separate schedules, occasionally combined.

Feature toggle

  • Off by default (backward compatible).
  • Toggle on /new: "Enable skill groups".
  • Can also enable mid-session — applies from next round onward (past rounds unchanged).
  • When enabled: default groups Standard and Advanced; all players start in Standard.

Groups

  • Unlimited named groups (not just two).
  • Default when enabled: Standard, Advanced.
  • Manual priority order (drag list) — top = highest skill; used for edge-case swing-player assignment.
  • Everyone must belong to at least one group when feature is on.

Player assignment

  • Assign on /new and in-game (Players modal or dedicated groups UI).
  • Player may belong to multiple groups — show visible warning (⚠️) for multi-group / swing players.
  • Fixed pairs must stay within the same group when groups enabled.
  • If one fixed-pair member is a swing player, pair is leveled to the higher-priority group.

Session defaults

Acceptance criteria

  • groups data model in app state + localStorage
  • Enable toggle on /new; enable mid-session from next round
  • Default Standard + Advanced; all players in Standard initially
  • Unlimited named groups; drag priority order
  • Player ↔ group assignment on /new and in-game
  • Multi-group membership shows warning indicator
  • Fixed pairs constrained to same group; higher-priority leveling for swing pairs
  • Session default: separate groups; per-round override field (used by Skill groups — court-to-group mapping + rounds layout #34)
  • yarn test:ci and yarn build pass

Files likely touched

  • src/useShuffler.tsx
  • pages/new.tsx
  • src/PlayersModal.tsx (or new Groups modal)
  • New: src/groups.ts (or similar)

Dependencies

none

Upstream reference

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions