You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Closes#2881 · epic #1765 · targets the integration branch feat/meeting-details-v2
Summary
E2-05 adds the prototype's "Will you attend?" RSVP card, the action slot's rsvp kind (FR-023 / FR-024). It replaces the one-line placeholder from E2-04.
Answers:Yes, I'll attend / Maybe / Can't attend. They are 42px pills outlined in the answer's colour and filled once it is the answer (aria-pressed). RSVP is a three-value enum; "pending" is the absence of a record.
Confirmation: once answered, the card shows the answer ("You're going", "You replied maybe", "You can't attend") with Change. While changing, Keep my answer backs out.
Series scope (FR-024): when meeting.recurrence is set, the card asks All occurrences / This occurrence only / This and following occurrences before saving, using lfx-radio-button with a reactive form. A single meeting saves scope: 'all' silently.
Saving, as V1's lfx-rsvp-button-group does:
the same request, with occurrence_id for single and this_and_following;
the same "RSVP Updated" / "RSVP Failed" toasts;
the same 404 copy, "Only invited users are allowed to RSVP to this meeting.", plus the BFF's message or V1's generic fallback otherwise.
The saved RSVP goes to MeetingDetailsStateService.setMyRsvp (E2-04), so the status pill and the card update at once, ahead of the indexer.
An organizer who isn't invited still gets this card from the resolver, but the page only loads an invitee's own answer. The card therefore keeps the answer it saved, so a save never looks like it didn't happen.
Accessibility:
Every step change moves focus to the step's control: the current answer, the checked scope, the opening answer on cancel, or Change after a save.
A save is announced once, through a persistent polite live region.
The error is role="alert".
The step state resets when the page moves to another meeting or occurrence (linkedSignal).
Testids:meeting-rsvp-card* rows added to testid-contract.md. data-my-rsvp moves from the placeholder line to the card.
Deviation from the issue
The issue asks to restyle the scope modal. The scope question is instead a step inside the card:
V1's RsvpScopeModalComponent is shared with V1 and the meeting cards (and carries V1's testids), so restyling it would change V1.
A new V2 dialog would be appended to <body>, outside the page's scoped --md-* design tokens.
The options, words and behaviour are V1's.
The issue's "RSVP not tracked" presentation is N-01's (#3263); it is not in this PR.
Validation
Tests: meetings 948 (card spec 16). yarn build, a forced check-types, lint:check (0 errors) and format:check are green.
Coverage:
each answer;
Change and Keep my answer;
the single meeting's silent all;
each scope, and occurrence_id only for single and this_and_following;
cancel;
saving disabled;
the 404, BFF and generic copy;
the announcement;
focus after each step;
the uninvited-organizer fallback;
the reset when the occurrence changes.
Pre-PR review: one round with the general, repo-code and learnings reviewers. Fixed in 4b60d6f:
focus handling;
a persistent live region;
the uninvited-organizer save not showing;
Change having no way back, and its state surviving an occurrence change;
the raw radio replaced with lfx-radio-button.
/lfx-self-serve-pr-readiness (against the integration branch) READY; /preflight passes.
Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Essentials
Run ID: c84830e5-2475-4f93-8036-d3873e6b8526
You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.
Use the checkbox below for a quick retry:
🔍 Trigger review
Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Comment @coderabbitai help to get the list of available commands.
Medium Risk
New user-facing RSVP writes and recurring scope behavior on meeting details; mitigated by reusing V1 API/contracts and broad unit tests, but still touches invite-only and occurrence-keyed state.
Overview
Replaces the meeting details action slot’s one-line RSVP placeholder (E2-04) with a full lfx-meeting-rsvp-card for the rsvp kind (E2-05, FR-023 / FR-024). The slot no longer builds rsvpMessage or data-my-rsvp on meeting-action-message; that lives on the card.
The new card offers Yes / Maybe / Can’t attend, shows a confirmation with Change / Keep my answer, and for recurring meetings adds an in-card scope step (all / this occurrence / this and following) instead of V1’s modal. Saves use the existing createMeetingRsvp API and setMyRsvp, with V1 toasts and error copy, guards for navigation mid-save, focus management, and a live region for announcements.
Tests and testid-contract.md are updated: action-slot specs assert the card stub; the card has a dedicated spec suite.
Reviewed by Cursor Bugbot for commit ff50ca1. Bugbot is set up for automated code reviews on this repo. Configure here.
@nunoeufrasio I'm starting review 1 of this pull request now (started 2026-10-07 11:40 UTC). This usually takes a few minutes — I'll update this comment with the summary when I'm done.
Hi @nunoeufrasio, thanks for the PR. The V2 RSVP card is well scoped: it reuses V1's request, toasts and copy, and keeping the scope question inside the card rather than restyling the shared V1 modal is a sound call. The focus handling, persistent live region and linkedSignal resets are careful, and the spec covers the behaviours the description lists.
🟡 Minor: 1 issue: A save that finishes after an occurrence switch writes into the new occurrence's state
⚪ Nit: 1 issue: Import order in the spec
✅ Approved with minor comments
➡️ This auto-review agent is a preview. Please send feedback to @dealako.
savedResponse is reset whenever rsvpKey changes. For the uninvited-organizer path this fallback exists to support, state.myRsvp() stays unknown, so saving on occurrence A, visiting B, and returning to A shows an unanswered card again; an all-scope save is likewise forgotten on the next occurrence. Preserve successful responses by their applicable meeting/occurrence scope instead of discarding them on every key transition.
This issue also appears in the following locations of the same file:
The meeting-details epic explicitly requires existing lfx-* controls and says not to rebuild buttons. The shared ButtonComponent already supports loading, disabled, styleClass, and ariaPressed, but this card introduces native buttons for the answers and the Change/Save/Cancel/Keep controls. Use lfx-button throughout (extending the wrapper only if a capability is genuinely missing) to preserve the stated component-reuse boundary.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #2881 · epic #1765 · targets the integration branch
feat/meeting-details-v2Summary
E2-05 adds the prototype's "Will you attend?" RSVP card, the action slot's
rsvpkind (FR-023 / FR-024). It replaces the one-line placeholder from E2-04.Answers: Yes, I'll attend / Maybe / Can't attend. They are 42px pills outlined in the answer's colour and filled once it is the answer (
aria-pressed). RSVP is a three-value enum; "pending" is the absence of a record.Confirmation: once answered, the card shows the answer ("You're going", "You replied maybe", "You can't attend") with Change. While changing, Keep my answer backs out.
Series scope (FR-024): when
meeting.recurrenceis set, the card asks All occurrences / This occurrence only / This and following occurrences before saving, usinglfx-radio-buttonwith a reactive form. A single meeting savesscope: 'all'silently.Saving, as V1's
lfx-rsvp-button-groupdoes:occurrence_idforsingleandthis_and_following;The saved RSVP goes to
MeetingDetailsStateService.setMyRsvp(E2-04), so the status pill and the card update at once, ahead of the indexer.An organizer who isn't invited still gets this card from the resolver, but the page only loads an invitee's own answer. The card therefore keeps the answer it saved, so a save never looks like it didn't happen.
Accessibility:
role="alert".linkedSignal).Testids:
meeting-rsvp-card*rows added totestid-contract.md.data-my-rsvpmoves from the placeholder line to the card.Deviation from the issue
The issue asks to restyle the scope modal. The scope question is instead a step inside the card:
RsvpScopeModalComponentis shared with V1 and the meeting cards (and carries V1's testids), so restyling it would change V1.<body>, outside the page's scoped--md-*design tokens.The options, words and behaviour are V1's.
The issue's "RSVP not tracked" presentation is N-01's (#3263); it is not in this PR.
Validation
yarn build, a forcedcheck-types,lint:check(0 errors) andformat:checkare green.all;occurrence_idonly for single and this_and_following;lfx-radio-button./lfx-self-serve-pr-readiness(against the integration branch) READY;/preflightpasses.🤖 Generated with Claude Code