Skip to content

Conversation

@asithade
Copy link
Contributor

@asithade asithade commented Nov 6, 2025

Summary

Updates the Angular meeting join component to match the new React design with improved layout, RSVP functionality placeholder, and compact date/time formatting.

Changes

  • RSVP Container: Added RSVP section for future meetings (authenticated users) with Yes/No/Maybe buttons using LFX button components with secondary styling
  • Date/Time Format: Updated meeting time display to compact format: "Wed, Aug 26 • 11:30 PM - 12:30 AM"
  • Layout Improvements: Restructured component to match React design with two-column layout
  • Component Integration: Integrated LFX button components with severity="secondary" and size="small"
  • Tooltip Enhancement: Replaced native title attribute with PrimeNG pTooltip in organization involvement component

Technical Details

  • Added new 'compact' format option to MeetingTimePipe
  • Updated meeting-join.component.html with new RSVP container structure
  • Fixed ESLint no-case-declarations violations by wrapping case blocks with curly braces
  • All builds and linting pass successfully

Test Plan

  • Verify RSVP container displays for future meetings when authenticated
  • Verify date/time displays in compact format: "Wed, Aug 26 • 11:30 PM - 12:30 AM"
  • Verify two-column layout matches React design
  • Verify LFX button styling matches meeting card patterns
  • Verify tooltips work correctly in organization involvement component

Scope

  • Attendee views only
  • Future/immediate meetings only
  • UI structure only (RSVP handlers not implemented yet)

LFXV2-710

Generated with Claude Code

- Add RSVP container for future meetings with lfx-button components
- Implement compact date/time format (Wed, Aug 26 • 11:30 PM - 12:30 AM)
- Restructure layout to two-column design matching React implementation
- Fix ESLint no-case-declarations violations in MeetingTimePipe
- Replace title attribute with pTooltip in organization involvement component

LFXV2-710

Generated with [Claude Code](https://claude.ai/code)

Signed-off-by: Asitha de Silva <[email protected]>
@asithade asithade requested a review from jordane as a code owner November 6, 2025 23:11
Copilot AI review requested due to automatic review settings November 6, 2025 23:11
@coderabbitai
Copy link

coderabbitai bot commented Nov 6, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

Migrates tooltips to PrimeNG pTooltip, restructures meeting-join UI (badges, auth/guest flow, RSVP, clipboard copy), adds RSVP UI/components and backend RSVP endpoints/methods, extends meeting-time pipe with a compact format, and adjusts header merge behavior and minor UI defaults.

Changes

Cohort / File(s) Summary
Organization-involvement tooltip migration
apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.html, apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.ts
Replaces [title] bindings with [pTooltip] in template and registers PrimeNG TooltipModule in the component.
Meeting-join UI rework & clipboard/alert
apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.html, apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts
Replaces page layout with a main meeting card, dynamic badges, auth/guest join flows, RSVP gating, copy-link button. Removes joinUrlWithParams signal, adds Clipboard integration (handleCopyLink()), alertMessage signal, and file-type pipe usage.
RSVP UI components
apps/lfx-one/src/app/shared/components/rsvp-button-group/rsvp-button-group.component.ts, apps/lfx-one/src/app/shared/components/rsvp-button-group/rsvp-button-group.component.html, apps/lfx-one/src/app/shared/components/rsvp-scope-modal/rsvp-scope-modal.component.ts, apps/lfx-one/src/app/shared/components/rsvp-scope-modal/rsvp-scope-modal.component.html
Adds RsvpButtonGroupComponent (inputs, outputs, RSVP submission flow, severity states, scope modal integration) and RsvpScopeModalComponent (scope selection dialog and form).
Meeting card RSVP integration
apps/lfx-one/src/app/shared/components/meeting-card/meeting-card.component.html, apps/lfx-one/src/app/shared/components/meeting-card/meeting-card.component.ts
Introduces RSVP section in the meeting card, adds authenticated signal, refactors several signal initializers into init methods, and imports RsvpButtonGroupComponent.
Meeting service & server RSVP API changes
apps/lfx-one/src/app/shared/services/meeting.service.ts, apps/lfx-one/src/server/services/meeting.service.ts, apps/lfx-one/src/server/controllers/meeting.controller.ts, apps/lfx-one/src/server/routes/meetings.route.ts
Replaces user-centric RSVP APIs: removes getUserMeetingRsvp, adds getMeetingRsvps (list) and getMeetingRsvpByUsername (me endpoint). Server uses M2M token for internal RSVP queries, updates controller/route names and logging, and adds occurrence_id handling.
Client RSVP API / utilities
packages/shared/src/interfaces/meeting.interface.ts, packages/shared/src/utils/rsvp-calculator.util.ts
Renames RSVP scope value from followingthis_and_following, adds optional occurrence_id in CreateMeetingRsvpRequest, and updates RSVP selection logic to use the new scope name.
Meeting-join attachments / pipes / UI tweaks
apps/lfx-one/src/app/shared/pipes/meeting-time.pipe.ts, apps/lfx-one/src/app/shared/components/radio-button/radio-button.component.html, apps/lfx-one/src/app/shared/components/rsvp-button-group/rsvp-button-group.component.html, apps/lfx-one/src/app/shared/components/button/button.component.ts, apps/lfx-one/src/app/shared/components/meeting-card/meeting-card.component.html
Adds 'compact' format to MeetingTimePipe, removes [name] binding in radio-button form branch, sets ButtonComponent default target to '_self', and adds RSVP rendering/attachments UI changes.
Client meeting service API surface changes
apps/lfx-one/src/app/shared/services/meeting.service.ts
Adds getMeetingRsvps(meetingUid) and getMeetingRsvpByUsername(meetingUid, occurrenceId?), removes old getUserMeetingRsvp, and standardizes error/return shapes for RSVP queries.
ApiClient header merge behavior
apps/lfx-one/src/server/services/api-client.service.ts
Changes header merge order so customHeaders are applied last (allowing overrides of defaults and Authorization).
Tooling / small edits
.vscode/settings.json, apps/lfx-one/src/app/shared/components/button/button.component.ts
Adds "rsvps" to cSpell words; changes ButtonComponent default target to _self.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant UI as Meeting-Join UI
    participant Comp as MeetingJoinComponent
    participant RSVPComp as RsvpButtonGroupComponent
    participant Modal as RsvpScopeModalComponent
    participant Service as MeetingService (client)
    participant Server as MeetingService (server)
    participant Clipboard as Clipboard Service
    participant Toast as Toast Component

    User->>UI: View meeting page
    UI->>Comp: initialize (compute canJoin, alertMessage, auth state)
    Comp->>Service: fetch meeting details & attachments
    Service->>Server: GET /meetings/:uid
    Server-->>Service: meeting data
    Service-->>Comp: meeting data

    alt User clicks "Copy Link"
        User->>UI: Click copy
        UI->>Comp: handleCopyLink()
        Comp->>Clipboard: copy(URL with password)
        Clipboard-->>Comp: success
        Comp->>Toast: show success
    end

    alt Authenticated user clicks RSVP
        User->>UI: Click RSVP (Yes/No/Maybe)
        UI->>RSVPComp: handleRsvpClick(response)
        alt Meeting is recurring and scope needed
            RSVPComp->>Modal: open scope modal
            Modal-->>RSVPComp: confirmed + scope
            RSVPComp->>Service: createMeetingRsvp(uid, {response, scope, occurrence_id?, email})
        else Non-recurring
            RSVPComp->>Service: createMeetingRsvp(uid, {response, scope:'all', email})
        end
        Service->>Server: POST /meetings/:uid/rsvp
        Server-->>Service: created RSVP
        Service-->>RSVPComp: success
        RSVPComp->>UI: emit rsvpChanged
        RSVPComp->>Toast: show success
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Areas requiring extra attention:

  • Server-side RSVP changes: apps/lfx-one/src/server/services/meeting.service.ts and controller/route renames and M2M token usage.
  • New RSVP components: rsvp-button-group and rsvp-scope-modal (behavior, error paths, modal integration, tests).
  • Meeting-join component: UI rewrite, clipboard integration, and alertMessage logic replacing prior join URL flow.
  • Shared interface/type changes: RsvpScope rename and added occurrence_id may affect consumers.

Possibly related PRs

Suggested labels

deploy-preview

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning Most changes are in-scope (meeting join UI, RSVP container, date/time pipe, tooltips). However, several out-of-scope changes are present: ButtonComponent target default change, RsvpButtonGroupComponent and RsvpScopeModalComponent creation beyond UI placeholder, meeting.service and meeting.controller RSVP method changes, and backend service changes with M2M token usage and occurrence_id handling appear to go beyond the stated UI-only scope with no RSVP handlers. Review and clarify scope boundaries: either move RSVP handler implementation and backend changes to a separate PR, or update the PR objectives to include full RSVP feature implementation beyond UI-only placeholder.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat(meetings): update join component ui to match design' accurately describes the main change in the changeset—updating the meeting join component UI to match the React design.
Description check ✅ Passed The PR description provides clear details about the changes, including RSVP container updates, date/time formatting, layout improvements, and technical specifics, all of which align with the changeset.
Linked Issues check ✅ Passed The PR changes align with LFXV2-710 objectives: RSVP container added, compact date/time format implemented via MeetingTimePipe, two-column layout restructured, PrimeNG pTooltip integrated, case declarations fixed, and all builds passing.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/LFXV2-710

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR implements a comprehensive UI redesign of the meeting join page with improved layout, new features, and tooltip standardization across components.

Key Changes:

  • Redesigned meeting join page with a more compact, modern layout featuring improved badge organization, RSVP functionality placeholders, and better resource presentation
  • Added 'compact' date format to the meeting time pipe for displaying dates in a condensed format (e.g., "Wed, Aug 26 • 11:30 PM - 12:30 AM")
  • Standardized tooltip implementation by replacing native HTML [title] attributes with PrimeNG's [pTooltip] directive in the organization involvement component

Reviewed Changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
meeting-time.pipe.ts Added 'compact' format option to display meeting dates/times in a condensed format with proper case block structure
meeting-join.component.ts Added clipboard functionality for copying meeting links, new alert message signal, and imports for ClipboardModule and FileTypeIconPipe
meeting-join.component.html Complete UI redesign with reorganized layout, RSVP section for authenticated users, improved badge system, and better resource presentation
organization-involvement.component.ts Added TooltipModule import to support PrimeNG tooltip directive
organization-involvement.component.html Replaced native HTML [title] attributes with PrimeNG [pTooltip] directive for consistent tooltip behavior

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Jira integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 5147707 and 9ed6561.

📒 Files selected for processing (5)
  • apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.html (4 hunks)
  • apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.ts (1 hunks)
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.html (1 hunks)
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts (8 hunks)
  • apps/lfx-one/src/app/shared/pipes/meeting-time.pipe.ts (2 hunks)
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Use TypeScript interfaces instead of union types for better maintainability
When defining PrimeNG-related types, reference the official PrimeNG component interfaces

Files:

  • apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.ts
  • apps/lfx-one/src/app/shared/pipes/meeting-time.pipe.ts
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts
**/*.{ts,tsx,js,jsx,mjs,cjs,html,css,scss}

📄 CodeRabbit inference engine (CLAUDE.md)

Include required license headers on all source files

Files:

  • apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.ts
  • apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.html
  • apps/lfx-one/src/app/shared/pipes/meeting-time.pipe.ts
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.html
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Do not nest ternary expressions

Files:

  • apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.ts
  • apps/lfx-one/src/app/shared/pipes/meeting-time.pipe.ts
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts
apps/lfx-one/src/**/*.html

📄 CodeRabbit inference engine (CLAUDE.md)

apps/lfx-one/src/**/*.html: Always add data-testid attributes when creating new Angular components for reliable test targeting
Use data-testid naming convention [section]-[component]-[element]

Files:

  • apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.html
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.html
🧠 Learnings (2)
📚 Learning: 2025-09-16T03:32:46.518Z
Learnt from: CR
Repo: linuxfoundation/lfx-v2-ui PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-09-16T03:32:46.518Z
Learning: Applies to **/*.{ts,tsx} : When defining PrimeNG-related types, reference the official PrimeNG component interfaces

Applied to files:

  • apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.ts
📚 Learning: 2025-10-21T21:19:13.599Z
Learnt from: andrest50
Repo: linuxfoundation/lfx-v2-ui PR: 125
File: apps/lfx-one/src/app/modules/project/meetings/components/meeting-card/meeting-card.component.ts:345-350
Timestamp: 2025-10-21T21:19:13.599Z
Learning: In the Angular meeting card component (apps/lfx-one/src/app/modules/project/meetings/components/meeting-card/meeting-card.component.ts), when selecting between `summary.summary_data.edited_content` and `summary.summary_data.content`, the logical OR operator (`||`) is intentionally used instead of nullish coalescing (`??`) because empty string edited_content should fall back to the original content rather than being displayed as empty.

Applied to files:

  • apps/lfx-one/src/app/shared/pipes/meeting-time.pipe.ts
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.html
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts
🧬 Code graph analysis (1)
apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.ts (1)
apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts (1)
  • Component (39-457)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Agent
🔇 Additional comments (5)
apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.ts (1)

13-13: LGTM! Clean integration of PrimeNG TooltipModule.

The TooltipModule import and integration are correctly implemented, enabling the use of pTooltip directives in the template. This provides better UX than native title attributes with improved positioning, styling, and customization options.

Also applies to: 19-19

apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.html (1)

33-33: LGTM! Consistent replacement of native tooltips with PrimeNG pTooltip.

All [title] attribute bindings have been correctly replaced with [pTooltip] directives across status indicators and help icons. The tooltip content and logic remain unchanged, and the implementation is consistent throughout the template.

Also applies to: 69-69, 108-108, 111-111, 130-130, 133-133

apps/lfx-one/src/app/shared/pipes/meeting-time.pipe.ts (3)

11-11: LGTM: Type signature correctly extended.

The addition of 'compact' to the format union type is appropriate and maintains backward compatibility with the default value.


47-60: LGTM: Compact format implementation is correct.

The compact case correctly implements the specified format with short date components and the bullet separator. The logic properly handles both single-time and time-range scenarios.


66-73: LGTM: ESLint no-case-declarations violations properly fixed.

Wrapping the 'time' and 'default' cases in curly braces correctly addresses ESLint warnings by providing proper block scoping for variable declarations. This matches the pattern used in the new 'compact' case.

Also applies to: 79-86

- Add new RsvpButtonGroupComponent for streamlined RSVP selection
- Add new RsvpScopeModalComponent for occurrence-specific RSVP handling
- Integrate RSVP components into meeting join and card views
- Refactor backend RSVP endpoints for occurrence-specific support
- Update meeting service to use M2M tokens for RSVP retrieval
- Add recurring badge to meeting join component
- Improve RSVP API route organization and naming consistency

LFXV2-710

Generated with [Claude Code](https://claude.ai/code)

Signed-off-by: Asitha de Silva <[email protected]>
@asithade asithade changed the title feat(meetings): update join component ui to match react design feat(meetings): update join component ui to match design Nov 10, 2025
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

♻️ Duplicate comments (1)
apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.html (1)

214-215: Fix file type icon pipe precedence.

Angular parses attachment.mime_type || '' | fileTypeIcon as attachment.mime_type || ('' | fileTypeIcon), so whenever MIME type is present the pipe never runs and the icon class stays a raw MIME string. Wrap the left side before piping so the pipe always receives the MIME value.

-                        <i [class]="(attachment.mime_type || '' | fileTypeIcon) + ' text-3xl text-black'"></i>
+                        <i [class]="((attachment.mime_type || '') | fileTypeIcon) + ' text-3xl text-black'"></i>
🧹 Nitpick comments (1)
apps/lfx-one/src/app/shared/components/radio-button/radio-button.component.html (1)

7-7: Add data-testid attributes for reliable test targeting.

Per coding guidelines for apps/lfx-one/src/**/*.html, data-testid attributes should be included using the naming convention [section]-[component]-[element]. Both the form-controlled and non-form-controlled radio button instances lack these attributes.

Apply this diff to add data-testid attributes:

  @if (form() && control()) {
    <ng-container [formGroup]="form()!">
      <div class="flex items-center gap-2">
-       <p-radioButton [formControlName]="control()!" [value]="value()" [inputId]="inputId() || control()!" (onChange)="onRadioChange($event)"> </p-radioButton>
+       <p-radioButton 
+         [formControlName]="control()!" 
+         [value]="value()" 
+         [inputId]="inputId() || control()!" 
+         (onChange)="onRadioChange($event)"
+         [data-testid]="'radio-button-form-' + (control()! || 'control')">
+       </p-radioButton>
        @if (label()) {
          <label [for]="inputId() || control()!" class="text-sm font-medium text-gray-700 cursor-pointer">
            {{ label() }}
        </label>
  } @else {
    <div class="flex items-center gap-2">
-     <p-radioButton [name]="name()" [value]="value()" [inputId]="inputId()" (onChange)="onRadioChange($event)"> </p-radioButton>
+     <p-radioButton 
+       [name]="name()" 
+       [value]="value()" 
+       [inputId]="inputId()" 
+       (onChange)="onRadioChange($event)"
+       [data-testid]="'radio-button-' + (name() || 'input')">
+     </p-radioButton>
      @if (label()) {
        <label [for]="inputId()" class="text-sm font-medium text-gray-700 cursor-pointer">
          {{ label() }}

Also applies to: 17-17

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Jira integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 9ed6561 and 23d62c7.

📒 Files selected for processing (18)
  • .vscode/settings.json (1 hunks)
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.html (2 hunks)
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts (8 hunks)
  • apps/lfx-one/src/app/shared/components/button/button.component.ts (1 hunks)
  • apps/lfx-one/src/app/shared/components/meeting-card/meeting-card.component.html (1 hunks)
  • apps/lfx-one/src/app/shared/components/meeting-card/meeting-card.component.ts (6 hunks)
  • apps/lfx-one/src/app/shared/components/radio-button/radio-button.component.html (1 hunks)
  • apps/lfx-one/src/app/shared/components/rsvp-button-group/rsvp-button-group.component.html (1 hunks)
  • apps/lfx-one/src/app/shared/components/rsvp-button-group/rsvp-button-group.component.ts (1 hunks)
  • apps/lfx-one/src/app/shared/components/rsvp-scope-modal/rsvp-scope-modal.component.html (1 hunks)
  • apps/lfx-one/src/app/shared/components/rsvp-scope-modal/rsvp-scope-modal.component.ts (1 hunks)
  • apps/lfx-one/src/app/shared/services/meeting.service.ts (2 hunks)
  • apps/lfx-one/src/server/controllers/meeting.controller.ts (1 hunks)
  • apps/lfx-one/src/server/routes/meetings.route.ts (1 hunks)
  • apps/lfx-one/src/server/services/api-client.service.ts (1 hunks)
  • apps/lfx-one/src/server/services/meeting.service.ts (5 hunks)
  • packages/shared/src/interfaces/meeting.interface.ts (2 hunks)
  • packages/shared/src/utils/rsvp-calculator.util.ts (2 hunks)
🧰 Additional context used
📓 Path-based instructions (5)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Use TypeScript interfaces instead of union types for better maintainability
When defining PrimeNG-related types, reference the official PrimeNG component interfaces

Files:

  • apps/lfx-one/src/app/shared/components/button/button.component.ts
  • packages/shared/src/utils/rsvp-calculator.util.ts
  • packages/shared/src/interfaces/meeting.interface.ts
  • apps/lfx-one/src/app/shared/components/rsvp-scope-modal/rsvp-scope-modal.component.ts
  • apps/lfx-one/src/server/routes/meetings.route.ts
  • apps/lfx-one/src/server/services/api-client.service.ts
  • apps/lfx-one/src/app/shared/components/rsvp-button-group/rsvp-button-group.component.ts
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts
  • apps/lfx-one/src/server/controllers/meeting.controller.ts
  • apps/lfx-one/src/server/services/meeting.service.ts
  • apps/lfx-one/src/app/shared/services/meeting.service.ts
  • apps/lfx-one/src/app/shared/components/meeting-card/meeting-card.component.ts
**/*.{ts,tsx,js,jsx,mjs,cjs,html,css,scss}

📄 CodeRabbit inference engine (CLAUDE.md)

Include required license headers on all source files

Files:

  • apps/lfx-one/src/app/shared/components/button/button.component.ts
  • apps/lfx-one/src/app/shared/components/rsvp-scope-modal/rsvp-scope-modal.component.html
  • apps/lfx-one/src/app/shared/components/meeting-card/meeting-card.component.html
  • packages/shared/src/utils/rsvp-calculator.util.ts
  • apps/lfx-one/src/app/shared/components/radio-button/radio-button.component.html
  • packages/shared/src/interfaces/meeting.interface.ts
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.html
  • apps/lfx-one/src/app/shared/components/rsvp-scope-modal/rsvp-scope-modal.component.ts
  • apps/lfx-one/src/app/shared/components/rsvp-button-group/rsvp-button-group.component.html
  • apps/lfx-one/src/server/routes/meetings.route.ts
  • apps/lfx-one/src/server/services/api-client.service.ts
  • apps/lfx-one/src/app/shared/components/rsvp-button-group/rsvp-button-group.component.ts
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts
  • apps/lfx-one/src/server/controllers/meeting.controller.ts
  • apps/lfx-one/src/server/services/meeting.service.ts
  • apps/lfx-one/src/app/shared/services/meeting.service.ts
  • apps/lfx-one/src/app/shared/components/meeting-card/meeting-card.component.ts
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Do not nest ternary expressions

Files:

  • apps/lfx-one/src/app/shared/components/button/button.component.ts
  • packages/shared/src/utils/rsvp-calculator.util.ts
  • packages/shared/src/interfaces/meeting.interface.ts
  • apps/lfx-one/src/app/shared/components/rsvp-scope-modal/rsvp-scope-modal.component.ts
  • apps/lfx-one/src/server/routes/meetings.route.ts
  • apps/lfx-one/src/server/services/api-client.service.ts
  • apps/lfx-one/src/app/shared/components/rsvp-button-group/rsvp-button-group.component.ts
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts
  • apps/lfx-one/src/server/controllers/meeting.controller.ts
  • apps/lfx-one/src/server/services/meeting.service.ts
  • apps/lfx-one/src/app/shared/services/meeting.service.ts
  • apps/lfx-one/src/app/shared/components/meeting-card/meeting-card.component.ts
apps/lfx-one/src/**/*.html

📄 CodeRabbit inference engine (CLAUDE.md)

apps/lfx-one/src/**/*.html: Always add data-testid attributes when creating new Angular components for reliable test targeting
Use data-testid naming convention [section]-[component]-[element]

Files:

  • apps/lfx-one/src/app/shared/components/rsvp-scope-modal/rsvp-scope-modal.component.html
  • apps/lfx-one/src/app/shared/components/meeting-card/meeting-card.component.html
  • apps/lfx-one/src/app/shared/components/radio-button/radio-button.component.html
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.html
  • apps/lfx-one/src/app/shared/components/rsvp-button-group/rsvp-button-group.component.html
packages/shared/src/interfaces/**/*.ts

📄 CodeRabbit inference engine (CLAUDE.md)

Place all TypeScript interfaces in the shared package at packages/shared/src/interfaces

Files:

  • packages/shared/src/interfaces/meeting.interface.ts
🧠 Learnings (3)
📚 Learning: 2025-09-16T03:32:46.518Z
Learnt from: CR
Repo: linuxfoundation/lfx-v2-ui PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-09-16T03:32:46.518Z
Learning: Applies to apps/lfx-one/src/**/*.html : Always add data-testid attributes when creating new Angular components for reliable test targeting

Applied to files:

  • apps/lfx-one/src/app/shared/components/rsvp-scope-modal/rsvp-scope-modal.component.html
📚 Learning: 2025-10-21T21:19:13.599Z
Learnt from: andrest50
Repo: linuxfoundation/lfx-v2-ui PR: 125
File: apps/lfx-one/src/app/modules/project/meetings/components/meeting-card/meeting-card.component.ts:345-350
Timestamp: 2025-10-21T21:19:13.599Z
Learning: In the Angular meeting card component (apps/lfx-one/src/app/modules/project/meetings/components/meeting-card/meeting-card.component.ts), when selecting between `summary.summary_data.edited_content` and `summary.summary_data.content`, the logical OR operator (`||`) is intentionally used instead of nullish coalescing (`??`) because empty string edited_content should fall back to the original content rather than being displayed as empty.

Applied to files:

  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.html
  • apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts
  • apps/lfx-one/src/app/shared/components/meeting-card/meeting-card.component.ts
📚 Learning: 2025-09-16T03:32:46.518Z
Learnt from: CR
Repo: linuxfoundation/lfx-v2-ui PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-09-16T03:32:46.518Z
Learning: All PrimeNG components are wrapped in LFX components to keep UI library independence

Applied to files:

  • apps/lfx-one/src/app/shared/components/rsvp-scope-modal/rsvp-scope-modal.component.ts
🧬 Code graph analysis (4)
apps/lfx-one/src/app/shared/components/rsvp-scope-modal/rsvp-scope-modal.component.ts (3)
apps/lfx-one/src/app/shared/components/button/button.component.ts (1)
  • Component (11-82)
apps/lfx-one/src/app/shared/components/rsvp-button-group/rsvp-button-group.component.ts (1)
  • Component (17-194)
packages/shared/src/interfaces/meeting.interface.ts (1)
  • RsvpScope (729-729)
apps/lfx-one/src/app/shared/components/rsvp-button-group/rsvp-button-group.component.ts (4)
apps/lfx-one/src/app/shared/components/button/button.component.ts (1)
  • Component (11-82)
apps/lfx-one/src/app/shared/components/rsvp-scope-modal/rsvp-scope-modal.component.ts (1)
  • Component (12-52)
packages/shared/src/interfaces/auth.interface.ts (1)
  • User (8-41)
packages/shared/src/interfaces/meeting.interface.ts (5)
  • Meeting (75-150)
  • MeetingRsvp (750-771)
  • RsvpResponse (723-723)
  • RsvpScope (729-729)
  • CreateMeetingRsvpRequest (777-790)
apps/lfx-one/src/server/services/meeting.service.ts (2)
packages/shared/src/interfaces/meeting.interface.ts (1)
  • MeetingRsvp (750-771)
apps/lfx-one/src/server/utils/auth-helper.ts (1)
  • getUsernameFromAuth (10-22)
apps/lfx-one/src/app/shared/services/meeting.service.ts (1)
packages/shared/src/interfaces/meeting.interface.ts (1)
  • MeetingRsvp (750-771)
🔇 Additional comments (13)
.vscode/settings.json (1)

28-28: Spell-check configuration correctly updated.

The addition of "rsvps" is properly placed in alphabetical order and aligns with the RSVP-related functionality introduced across the codebase in this PR.

apps/lfx-one/src/app/shared/components/radio-button/radio-button.component.html (2)

1-2: License header is present and correctly formatted.


4-14: Form control binding logic is sound.

The removal of [name]="name()" from the form-controlled branch (line 7) is correct for reactive forms—formControlName handles the binding internally. The non-form-controlled branch correctly retains [name] for template-driven forms. The two branches are appropriately divergent and logically consistent.

Also applies to: 15-24

apps/lfx-one/src/app/shared/components/button/button.component.ts (1)

56-56: No issues found. The target default value change is safe and well-implemented.

The verification shows:

  • Zero TypeScript code references the target() value or checks for undefined
  • All 60+ button usages across the codebase either don't specify target (using the new default) or explicitly override it (like the recording modal's target="_blank")
  • Both undefined and '_self' produce identical same-window navigation behavior
  • Template correctly binds target to both anchor and PrimeNG button elements
  • License header and coding guidelines are met

The change is semantically safe and aligns with the PR's RSVP/meeting flow objectives.

packages/shared/src/utils/rsvp-calculator.util.ts (1)

8-8: LGTM! Scope rename aligns with interface changes.

The rename from "following" to "this_and_following" is consistent with the updated RsvpScope type in the shared interfaces. The logic correctly checks that the RSVP was created before or at the occurrence date.

Also applies to: 105-114

apps/lfx-one/src/server/services/api-client.service.ts (1)

44-51: Verify that allowing customHeaders to override Authorization is intentional.

The current implementation allows customHeaders to override the Authorization header, which could bypass authentication if not carefully controlled. If this behavior is intentional, please document it clearly.

Consider using a safer merge strategy:

 // Only add Authorization header if bearerToken is provided
 if (bearerToken) {
   headers['Authorization'] = `Bearer ${bearerToken}`;
 }

 if (customHeaders) {
-  Object.assign(headers, customHeaders);
+  // Merge custom headers but preserve critical headers
+  const { Authorization: _, ...safeHeaders } = customHeaders;
+  Object.assign(headers, safeHeaders);
 }

Alternatively, if overriding Authorization is needed for specific use cases, add a comment explaining why.

apps/lfx-one/src/app/shared/components/meeting-card/meeting-card.component.html (1)

246-251: LGTM! RSVP section properly integrated.

The RSVP section is correctly conditionally rendered for authenticated users who are not organizers on upcoming meetings. The integration with the RsvpButtonGroupComponent is clean and follows established patterns.

apps/lfx-one/src/app/shared/components/rsvp-button-group/rsvp-button-group.component.html (1)

1-58: LGTM! Well-structured RSVP button group template.

The template follows best practices:

  • License header is present
  • Data-testid attributes are properly applied for testing
  • Accessibility considerations (aria-hidden on decorative border)
  • Clean integration with lfx-button components
packages/shared/src/interfaces/meeting.interface.ts (2)

729-729: LGTM! RsvpScope type update is consistent.

The rename from 'following' to 'this_and_following' provides clearer semantics and aligns with the calculator utility changes.


784-785: LGTM! Optional occurrence_id enables per-occurrence RSVP.

The addition of occurrence_id?: string to CreateMeetingRsvpRequest appropriately supports per-occurrence RSVP functionality for recurring meetings.

apps/lfx-one/src/server/routes/meetings.route.ts (1)

55-57: LGTM! Clearer RSVP endpoint structure.

The refactoring provides better API semantics:

  • GET /:uid/rsvp → all RSVPs for the meeting
  • GET /:uid/rsvp/me → current user's RSVP (with optional occurrenceId support)

This separation of concerns improves the API design.

apps/lfx-one/src/app/shared/components/rsvp-scope-modal/rsvp-scope-modal.component.html (1)

1-50: LGTM! Modal template follows guidelines.

The template adheres to coding standards:

  • License header is present
  • Data-testid attributes are properly applied (as per coding guidelines)
  • Accessibility is well-handled with proper labels and keyboard navigation
  • Clean integration with LFX components

Based on coding guidelines.

apps/lfx-one/src/app/shared/components/rsvp-scope-modal/rsvp-scope-modal.component.ts (1)

1-52: LGTM! Well-implemented scope modal component.

The component demonstrates good practices:

  • License header is present
  • TypeScript interfaces are used appropriately (RsvpScope)
  • FormControl typing provides compile-time safety
  • Default value of 'all' is sensible for recurring meetings
  • PrimeNG DynamicDialog is correctly utilized for modal interaction

Based on coding guidelines.

@asithade asithade merged commit 6028208 into main Nov 10, 2025
7 checks passed
@asithade asithade deleted the feat/LFXV2-710 branch November 10, 2025 23:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants