Add Coach mode: dark-chrome shell, mode switcher, C1 Today, C2 Bench attendance
First slice of the coach-mode build (design_handoff_rosterchief_platform/ README.md's "Coach mode" section, C1-C6). Ships the foundation together with the two screens the design doc calls out as the reason coaches install anything at all, rather than landing a Today screen with a dead "Check attendance" button: - mobile/coach_mixins.py's CoachScopeMixin -- the dark-mode mirror of PersonScopeMixin, scoped by active team (via club.services.access' teams_staffed_by/teams_managed_by) instead of managed people. - A standalone dark ink/ice shell (mobile/templates/mobile/coach/base.html) with the mode's signature 20px-radius overlapping sheet, reusing the --color-ice/--color-ink tokens that already existed in assets/mobile.css but were unconsumed until now. - The Coach/Member role switcher is re-added to the member shell, gated on a real staff assignment (has_coach_access), replacing the "deliberately not rendered yet" placeholder. - C1 Today: stat tiles, a tonight's-session card, a silent-players "needs you" row, and an "Also yours" card reusing HomeView's own hero-RSVP pattern scoped to the coach's own member record. - C2 Bench attendance: writes through events.services.attendance. record_check_in, which existed for exactly this and had no caller yet. Read-only for staff on a team without a management position. Line-up (C3), create event (C4), post news (C5), and add-to-roster (C6) follow in later stages -- see the coach-mode plan. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ECGMEwrc2k4D8VQuwjstj9
This commit is contained in:
@@ -7,7 +7,7 @@ them) don't each re-derive this.
|
||||
|
||||
from django.conf import settings
|
||||
|
||||
from club.services.access import current_season, has_management_access
|
||||
from club.services.access import current_season, has_management_access, teams_staffed_by
|
||||
from members.models import FamilyMembership, Member
|
||||
from members.views import ClubScopedPublicMixin
|
||||
from notifications.models import Notification
|
||||
@@ -89,6 +89,12 @@ class PersonScopeMixin(ClubScopedPublicMixin):
|
||||
scope_person=self.scope_person,
|
||||
scope_everyone=self.scope_everyone,
|
||||
has_staff_access=self.me is not None and has_management_access(self.request.user, self.request.club),
|
||||
# Narrower than has_staff_access above: an ADMIN/EDITOR with no
|
||||
# personal StaffAssignment satisfies that (desktop management
|
||||
# access), but the design doc is explicit the Coach/Member
|
||||
# switcher itself only appears for an account holding an actual
|
||||
# staff assignment -- see mobile/coach_mixins.py's CoachScopeMixin.
|
||||
has_coach_access=self.me is not None and teams_staffed_by(self.request.user, self.request.club).exists(),
|
||||
unread_notification_count=unread_notification_count,
|
||||
season=current_season(self.request.club),
|
||||
vapid_public_key=settings.VAPID_PUBLIC_KEY,
|
||||
|
||||
Reference in New Issue
Block a user