Skip to content

feat(meetings): align the public past-meeting view with the admin details page #3259

Description

@nunoeufrasio

Requirements: FR-041 in specs/011-meeting-details-redesign/requirements.md. State model: state-matrix.md in the same directory.
Branch: PRs for this issue target the integration branch feat/meeting-details-v2, not main. Nothing in this epic reaches production until the release PR #3249 merges.

Design: https://claude.ai/design/p/c70cdcac-911f-4337-9d87-3daed9d85f58?file=Meeting+Details.dc.html&via=share

Prototype settings panel: time / viewer / privacy / rsvpTracking / pastAccess / myRsvp / recur / via / pageStatus. Its look and feel differs from the current app on purpose — follow it.

Epic: #1765 · Meetings v2 epic: #1451 · Plan ID: E4-05 · Size: M · Depends on: E0-03, E4-01

Delivery: this ships as part of meeting details V2, side by side with the existing page, behind MEETING_V2_ENABLED_FLAG. Do not modify, refactor or delete the existing meeting details page. V1 stays fully functional and is what untargeted users see. Parent: Meetings v2 epic #1451. Full rules in #1765.
Components: follow the prototype for design, but build it from the existing lfx-* components in app/shared/components/. Extend a wrapper before forking it; create a new component only when the design can't be expressed otherwise, and say so in the PR.


Rewritten 2026-09-09. Was "consolidate past-meeting surfaces onto /meetings/:id". The redirect and the deletion are dropped — /details is now the deliberate admin surface (E0-03). What remains is making the two surfaces consistent and fixing the defects that are wrong on either one.

Scope. Implement the E0-03 split on the public page, and fix the shared defects:

  • Public page keeps the read experience; admin-only capabilities are not duplicated onto it.
  • Add the organizer-gated entry point to the admin page, if E0-03 decided in favour.
  • Fold in the parts of the admin page that belong to the read experience — participants table with voting status, attendance rate bar and its colour thresholds, invited/uninvited filters.
  • Do not carry over the permanently-disabled Invite button with tooltip="Coming soon".

Acceptance criteria

  • Attendance figures come from one source of truth. Today meeting.attended_count and a client-side filter(is_attended) disagree.
  • @if (meeting.participant_count) no longer hides the whole stats row when the count is legitimately 0.
  • Attendance colour semantics consistent — the admin page uses red for the avatar overlay and grey for the pill, for the same "absent".
  • Copy consistent: the filter says "Uninvited", the cell says "Not invited". Pick one.
  • No capability appears on both surfaces unless E0-03 said it should.
  • Existing E2E specs for /details still pass; the route is not removed or redirected.

Added 2026-10-05: E0-03 decision (meeting-surface-boundary.md, merged in #3268). This narrows the scope above:

  • The public roster carries only § Public roster fields. Committee voting status stays on the admin page and is not folded in, and neither are email or job title.
  • The public → admin entry point is organizer-only (FGA v1_past_meeting#organizer), on ended meetings only, and uses getEntityCommands(…, 'details'). There is no new admin → public link.
  • Attendance writes never appear on the public page.

Filed from meeting-details-redesign-implementation-plan.md (revised 2026-09-23).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestmeetingsAn epic, feature, story, task, or bug related to meetings.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions