feat(meetings): add public meeting registration and RSVP updates#193
feat(meetings): add public meeting registration and RSVP updates#193
Conversation
LFXV2-862 LFXV2-863 LFXV2-864 - Add public meeting self-registration for non-invited users - Add register button to meeting card and meeting join pages - Add public registration modal component - Add server endpoint for public meeting registration - Allow users to change their RSVP response after initial selection - Add invited status check to public meeting endpoint - Add meeting helper for user invitation status - Fix dashboard section header height alignment (h-8, leading-8) - Add M2M token support for public meeting operations Signed-off-by: Asitha de Silva <asithade@gmail.com>
|
Caution Review failedThe pull request is closed. Note Other AI code review bot(s) detectedCodeRabbit 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. WalkthroughAdds public meeting registration for unauthenticated users, a registration modal, server endpoint and helpers to compute invited status, UI conditionals for register vs RSVP, minor RSVP and styling adjustments, and shared Meeting interface update to include Changes
Sequence Diagram(s)sequenceDiagram
participant User as User (Unauthenticated)
participant UI as Meeting UI
participant Modal as PublicRegistrationModal
participant Client as Frontend Service
participant Server as API Server
participant Service as Meeting Service (microservice)
User->>UI: View public meeting (not invited)
UI->>UI: evaluate canRegisterForMeeting
UI->>User: Show "Register for Meeting" button
User->>UI: Click Register
UI->>Modal: Open PublicRegistrationModal
Modal->>User: Collect form (first_name, last_name, email, ...)
User->>Modal: Submit form
Modal->>Client: registerForPublicMeeting(registrantData)
Client->>Server: POST /public/api/meetings/register
Server->>Service: addMeetingRegistrantWithM2M(data, m2mToken)
Service-->>Server: Created MeetingRegistrant
Server-->>Client: 200 OK (registrant)
Client->>Modal: Return success
Modal-->>UI: Close with registrant result
UI->>UI: Increment registrant count, trigger refresh
UI->>Server: Fetch updated meeting (may reuse m2mToken)
Server-->>UI: Updated meeting (includes invited status)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes
Possibly related PRs
Suggested labels
Pre-merge checks and finishing touches✅ Passed checks (5 passed)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro Disabled knowledge base sources:
📒 Files selected for processing (4)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (7)
packages/shared/src/interfaces/meeting.interface.ts (1)
147-148: Ensureinvitedis consistently populated across all Meeting responses
invitedis added as a requiredbooleanonMeetingbut marked “response only”. That’s fine as long as every endpoint (including any that buildMeetingobjects server-side, and anything extendingMeetinglikePastMeeting) now setsinvitedexplicitly (e.g.,true/false), not by omission.If there are any Meeting responses that don’t yet add this flag, consider either:
- Updating those code paths to always include
invited, or- Making the field optional (
invited?: boolean) and treatingundefinedasfalsein consumers.This avoids silent divergence between runtime payloads and the shared type.
apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.html (1)
160-175: Invited vs register logic on join page looks correct; consider more specific test-idThe new branch:
- Shows the RSVP button group only when
isInvited()is true.- Falls back to a “Register for Meeting” button when
canRegisterForMeeting()is true.That cleanly matches the intended behavior for invited vs non-invited authenticated users on public, non-restricted meetings.
One minor suggestion: the
data-testid="register-meeting-button"used here is also used in the meeting card template. For clearer, less fragile tests, consider a more specific name, e.g.meeting-join-register-meeting-button, and aligning the card’s button similarly.apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html (1)
274-295: Meeting card invited/register behavior aligns with new flow; test-id could be more specificThis block correctly:
- Shows the RSVP button group only for invited, non-legacy, non-past meetings.
- Shows a centered “Register for Meeting” button when
canRegisterForMeeting()is true, gated by!pastMeeting()so it doesn’t appear for historical cards.That matches the public registration requirements and keeps legacy meetings disabled via the existing
isLegacyMeeting()flag on the RSVP group.As with the join template, you may want to rename
data-testid="register-meeting-button"to something card-specific (e.g.,meeting-card-register-meeting-button) to avoid selector collisions and make tests easier to scope.apps/lfx-one/src/app/modules/meetings/components/public-registration-modal/public-registration-modal.component.html (1)
48-53: Consider adding validation messages for first_name and last_name fields.Email validation messages are shown inline, but first_name and last_name (which also have required validators) don't have similar inline validation messages. This creates an inconsistent user experience.
If
lfx-input-textdoesn't handle validation display internally, consider adding validation messages similar to email:@if (form.get('first_name')?.errors?.['required'] && form.get('first_name')?.touched && form.get('first_name')?.dirty) { <p class="text-sm text-red-500">First name is required</p> }apps/lfx-one/src/app/modules/meetings/components/public-registration-modal/public-registration-modal.component.ts (1)
62-103: Submission logic is well-guarded but consider takeUntilDestroyed.The
onSubmitmethod properly guards against double submission withsubmitting()check. However, the subscription doesn't unsubscribe on component destruction, which could cause issues if the dialog closes during an in-flight request.Consider using
takeUntilDestroyedor a similar pattern to clean up the subscription:+import { DestroyRef, inject } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; export class PublicRegistrationModalComponent { + private readonly destroyRef = inject(DestroyRef); // ... other code public onSubmit(): void { // ... validation check this.meetingService .registerForPublicMeeting({...}) + .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe({...}); } }apps/lfx-one/src/server/helpers/meeting.helper.ts (1)
20-29: Consider adding structured logging for observability.Per coding guidelines, backend services should use Pino for structured JSON logs. Adding DEBUG-level logging for the invitation check operation would help with troubleshooting and monitoring.
export async function isUserInvitedToMeeting(req: Request, meetingUid: string, email: string, m2mToken?: string): Promise<boolean> { if (!email || !meetingUid) { return false; } const token = m2mToken || (await generateM2MToken(req)); + req.log.debug({ operation: 'is_user_invited_to_meeting', meeting_uid: meetingUid }, 'Checking if user is invited to meeting'); const registrants = await meetingService.getMeetingRegistrantsByEmail(req, meetingUid, email, token); return registrants.resources.length > 0; }apps/lfx-one/src/server/services/meeting.service.ts (1)
1249-1286: Minor: Simplify header property syntax.The implementation is correct. One minor style note: the computed property syntax
['X-Sync']on line 1261 is unusual when the key is a valid identifier.- { Authorization: `Bearer ${m2mToken}`, ['X-Sync']: 'true' } + { Authorization: `Bearer ${m2mToken}`, 'X-Sync': 'true' }
📜 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.
📒 Files selected for processing (17)
apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.html(1 hunks)apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.html(1 hunks)apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html(1 hunks)apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts(4 hunks)apps/lfx-one/src/app/modules/meetings/components/public-registration-modal/public-registration-modal.component.html(1 hunks)apps/lfx-one/src/app/modules/meetings/components/public-registration-modal/public-registration-modal.component.ts(1 hunks)apps/lfx-one/src/app/modules/meetings/components/rsvp-button-group/rsvp-button-group.component.html(3 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(9 hunks)apps/lfx-one/src/app/shared/services/meeting.service.ts(1 hunks)apps/lfx-one/src/server/controllers/meeting.controller.ts(5 hunks)apps/lfx-one/src/server/controllers/public-meeting.controller.ts(5 hunks)apps/lfx-one/src/server/helpers/meeting.helper.ts(1 hunks)apps/lfx-one/src/server/routes/public-meetings.route.ts(1 hunks)apps/lfx-one/src/server/services/meeting.service.ts(3 hunks)apps/lfx-one/src/styles.scss(1 hunks)packages/shared/src/interfaces/meeting.interface.ts(1 hunks)
🧰 Additional context used
📓 Path-based instructions (9)
**/*.{css,scss}
📄 CodeRabbit inference engine (CLAUDE.md)
Use Tailwind CSS with PrimeUI plugin and LFX custom colors for styling
Files:
apps/lfx-one/src/styles.scss
**/*.{html,ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
Always add data-testid attributes when creating new components for reliable test targeting
Files:
apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.htmlpackages/shared/src/interfaces/meeting.interface.tsapps/lfx-one/src/app/modules/meetings/components/public-registration-modal/public-registration-modal.component.htmlapps/lfx-one/src/app/modules/meetings/components/public-registration-modal/public-registration-modal.component.tsapps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.htmlapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.htmlapps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.tsapps/lfx-one/src/server/helpers/meeting.helper.tsapps/lfx-one/src/app/modules/meetings/components/rsvp-button-group/rsvp-button-group.component.htmlapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.tsapps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.htmlapps/lfx-one/src/server/routes/public-meetings.route.tsapps/lfx-one/src/server/controllers/public-meeting.controller.tsapps/lfx-one/src/server/services/meeting.service.tsapps/lfx-one/src/server/controllers/meeting.controller.tsapps/lfx-one/src/app/shared/services/meeting.service.ts
**/*.html
📄 CodeRabbit inference engine (CLAUDE.md)
Use data-testid naming convention - [section]-[component]-[element] for hierarchical structure
Files:
apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.htmlapps/lfx-one/src/app/modules/meetings/components/public-registration-modal/public-registration-modal.component.htmlapps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.htmlapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.htmlapps/lfx-one/src/app/modules/meetings/components/rsvp-button-group/rsvp-button-group.component.htmlapps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.html
**/*.{ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.{ts,tsx}: Always use direct imports for standalone components - no barrel exports
Use TypeScript interfaces instead of union types for better maintainability
Do not nest ternary expressions
Prefer interface for defining object shapes in TypeScript
Use path mappings and import aliases as configured in tsconfig.json for imports
Files:
packages/shared/src/interfaces/meeting.interface.tsapps/lfx-one/src/app/modules/meetings/components/public-registration-modal/public-registration-modal.component.tsapps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.tsapps/lfx-one/src/server/helpers/meeting.helper.tsapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.tsapps/lfx-one/src/server/routes/public-meetings.route.tsapps/lfx-one/src/server/controllers/public-meeting.controller.tsapps/lfx-one/src/server/services/meeting.service.tsapps/lfx-one/src/server/controllers/meeting.controller.tsapps/lfx-one/src/app/shared/services/meeting.service.ts
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.{ts,tsx,js,jsx}: License headers are required on all source files
Prepend 'Generated with Claude Code (https://claude.ai/code)' if assisted with the code
Files:
packages/shared/src/interfaces/meeting.interface.tsapps/lfx-one/src/app/modules/meetings/components/public-registration-modal/public-registration-modal.component.tsapps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.tsapps/lfx-one/src/server/helpers/meeting.helper.tsapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.tsapps/lfx-one/src/server/routes/public-meetings.route.tsapps/lfx-one/src/server/controllers/public-meeting.controller.tsapps/lfx-one/src/server/services/meeting.service.tsapps/lfx-one/src/server/controllers/meeting.controller.tsapps/lfx-one/src/app/shared/services/meeting.service.ts
packages/shared/src/**/*.{ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
All shared types, interfaces, and constants are centralized in @lfx-one/shared package
Files:
packages/shared/src/interfaces/meeting.interface.ts
**/*.component.ts
📄 CodeRabbit inference engine (CLAUDE.md)
Use Angular 19 zoneless change detection with signals for component state management
Files:
apps/lfx-one/src/app/modules/meetings/components/public-registration-modal/public-registration-modal.component.tsapps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.tsapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts
apps/**/**/server/**/*.{ts,js}
📄 CodeRabbit inference engine (CLAUDE.md)
apps/**/**/server/**/*.{ts,js}: Use Pino for structured JSON logs with sensitive data redaction in all backend services
Always use err field for errors to leverage Pino's error serializer - correct: req.log.error({ err: error, ...metadata }, 'message')
Log INFO level for business operation completions (created, updated, deleted) and successful data retrieval
Log WARN level for error conditions leading to exceptions and data quality issues
Log DEBUG level for internal operations, preparation steps, and intent statements
Log ERROR level for system failures, unhandled exceptions, and critical errors
Files:
apps/lfx-one/src/server/helpers/meeting.helper.tsapps/lfx-one/src/server/routes/public-meetings.route.tsapps/lfx-one/src/server/controllers/public-meeting.controller.tsapps/lfx-one/src/server/services/meeting.service.tsapps/lfx-one/src/server/controllers/meeting.controller.ts
apps/**/**/server/**/*controller*.{ts,js}
📄 CodeRabbit inference engine (CLAUDE.md)
All controller functions must use Logger helper methods: Logger.start(), Logger.success(), Logger.error(), Logger.warning(), Logger.validation()
Files:
apps/lfx-one/src/server/controllers/public-meeting.controller.tsapps/lfx-one/src/server/controllers/meeting.controller.ts
⏰ 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 (24)
apps/lfx-one/src/styles.scss (1)
31-33: h2 line-height change aligns with header height usageAdding
leading-8to the defaulth2style matches the newh-8header containers and should improve visual alignment without affecting elements that already set their own typography classes. Looks good.apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.html (1)
6-11: Header layout tweaks are consistent and non-breakingUsing
h-8on the header container and removing vertical padding from the<h2>aligns this header with the My Meetings header and the globalh2leading-8change. No functional concerns.apps/lfx-one/src/app/shared/services/meeting.service.ts (1)
481-489: Public registration service method is consistent and PII-safe
registerForPublicMeetingmirrors existing HTTP patterns (take(1)+catchError+ rethrow) and targets the correct/public/api/meetings/registerendpoint. Logging onlymeeting_uidavoids leaking registrant PII in console logs. No issues.apps/lfx-one/src/server/routes/public-meetings.route.ts (1)
11-13: New/registerpublic route is correctly wiredPOST
/registeris added ahead of the/:idroute, avoiding route conflicts, and delegates cleanly toPublicMeetingController.registerForPublicMeeting. The route shape matches the intended/public/api/meetings/registerendpoint when mounted. No further changes needed here.apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.html (1)
6-10: My Meetings header height change is consistent with dashboard layoutAdding
h-8to the header container brings this header in line with Pending Actions and the updatedh2line-height, improving cross-widget alignment without affecting behavior.apps/lfx-one/src/app/modules/meetings/components/rsvp-button-group/rsvp-button-group.component.html (1)
33-44: LGTM! RSVP button now allows response changes.The simplified disabled logic (only checking
isLoading()) correctly enables users to change their RSVP after initial selection per LFXV2-863. The consistent styling for non-selected states with hover feedback is appropriate.apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts (2)
139-143: LGTM! Registration eligibility signals are well-designed.The computed signals
isInvitedandcanRegisterForMeetingcorrectly derive registration eligibility reactively. The logic!isInvited && !restricted && visibility === 'public'aligns with the PR requirement to allow registration only for non-invited users on public, non-restricted meetings.
263-287: Registration dialog integration looks correct.The
registerForMeeting()method properly opens the modal with meeting context, handles the success result by incrementing registrant count and refreshing the meeting data.Note: The modal returns
{ registered: true, registrant }on success, but you're only checkingresult?.registered. Consider typing the result more precisely if you need the registrant data in the future.apps/lfx-one/src/app/modules/meetings/components/public-registration-modal/public-registration-modal.component.html (2)
4-7: LGTM! Form structure and data-testid attributes are well-implemented.The form properly binds to the FormGroup, has appropriate data-testid attributes following the naming convention, and displays meeting context to the user.
95-102: LGTM! Submit button correctly handles loading and validation states.The button properly shows loading state via
submitting()signal and is disabled when form is invalid or during submission, preventing duplicate submissions.apps/lfx-one/src/server/controllers/meeting.controller.ts (3)
48-53: LGTM! Good defensive check for missing organizer.Short-circuiting the registrant count fetch when no organizer is present prevents unnecessary API calls for invalid meeting states.
65-72: Invited status enrichment looks correct.The implementation properly extracts user email with a fallback to empty string for unauthenticated users, and enriches meetings with invited status before sending to the client.
Minor observation: Line 69 uses
invitedMeetings.forEachto mutate the array in place with count data. This works correctly since you're modifying properties on existing objects, not replacing them.
161-166: LGTM! Single meeting invited status enrichment.Consistent with the list endpoint, the single meeting fetch also enriches the response with invited status for the current user.
apps/lfx-one/src/app/modules/meetings/components/public-registration-modal/public-registration-modal.component.ts (2)
35-60: Form initialization and user data pre-population look correct.The form setup with appropriate validators and the logic to pre-populate from various user data sources (name, given_name/first_name, family_name/last_name) is well-implemented.
90-98: Error handling extracts message appropriately.The error handler correctly attempts to extract the API error message with a sensible fallback. The submitting state is properly reset on both success and error paths.
apps/lfx-one/src/server/helpers/meeting.helper.ts (1)
56-63: LGTM! Efficient M2M token reuse pattern.The implementation correctly generates a single M2M token and reuses it across all parallel meeting checks, avoiding redundant token generation.
apps/lfx-one/src/server/services/meeting.service.ts (1)
364-417: LGTM! Clean M2M token integration.The optional
m2mTokenparameter with conditional Authorization header is well-implemented. The backward compatibility is maintained since existing callers without the token will continue to work.apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts (3)
180-204: LGTM! Clean modal integration with proper subscription handling.The registration flow correctly:
- Opens the modal with appropriate configuration
- Uses
take(1)to auto-unsubscribe after first emission- Triggers data refresh only on successful registration
551-560: LGTM! Signals correctly implement registration eligibility logic.The computed signals properly derive:
isInvited: from meeting's invited property with nullish coalescingcanRegisterForMeeting: combines not-invited, not-restricted, and public visibility checks
68-71: DialogService is already provided at root level.DialogService is configured in
app.config.ts, so it's available globally and the component will function correctly without adding it to the local providers array. The emptyproviders: []does not cause an error.apps/lfx-one/src/server/controllers/public-meeting.controller.ts (4)
55-60: LGTM! Efficient M2M token reuse and invited status enrichment.Good improvements:
- M2M token is generated once and passed through to subsequent operations
- Invited status is correctly computed only for authenticated users
- Defaults to
invited: falsefor unauthenticated requestsAlso applies to: 98-104
289-307: LGTM! Comprehensive input validation.The validation properly checks required fields (email, first_name, last_name) with appropriate error messages using
ServiceValidationError.fromFieldErrors.
323-353: LGTM! Proper authorization guards for public meeting registration.The endpoint correctly validates:
- Meeting must be public (visibility check)
- Meeting must not be restricted
Both checks use
AuthorizationErrorwith appropriate error messages and logging.
432-443: LGTM! Clean refactor for M2M token reuse.The updated
fetchMeetingWithM2Mnow accepts an optional pre-generated token, avoiding redundant token generation while maintaining backward compatibility for callers that don't provide a token.
apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts
Show resolved
Hide resolved
There was a problem hiding this comment.
Pull request overview
This PR adds public meeting self-registration functionality for non-invited users, enables RSVP response changes after initial selection, and includes minor UI alignment fixes. The implementation includes a new public registration endpoint with M2M token authentication, frontend modal components for registration, and server-side invitation status checks to conditionally show registration or RSVP buttons.
Key Changes
- Public Meeting Registration: New POST endpoint
/public/api/meetings/registerwith validation for public, non-restricted meetings, plus frontend modal with form validation - RSVP Flexibility: Removed disabled state for already-selected RSVP buttons, allowing users to change their response
- Invitation Status Tracking: Added
invitedboolean field to Meeting interface with helper functions to check user invitation status via registrant lookup
Reviewed changes
Copilot reviewed 17 out of 17 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
packages/shared/src/interfaces/meeting.interface.ts |
Adds invited boolean field to Meeting interface for response-only invitation status |
apps/lfx-one/src/styles.scss |
Adds leading-8 to h2 elements for consistent header height alignment |
apps/lfx-one/src/server/services/meeting.service.ts |
Adds M2M token parameter to getMeetingRegistrantsByEmail and new addMeetingRegistrantWithM2M method |
apps/lfx-one/src/server/routes/public-meetings.route.ts |
Registers new POST /register route for public meeting registration |
apps/lfx-one/src/server/helpers/meeting.helper.ts |
New helper file with functions to check invitation status and add invited field to meetings |
apps/lfx-one/src/server/controllers/public-meeting.controller.ts |
Implements registerForPublicMeeting endpoint with validation and adds invited status to public meeting retrieval |
apps/lfx-one/src/server/controllers/meeting.controller.ts |
Adds invitation status checks to authenticated meeting endpoints and handles meetings without organizers |
apps/lfx-one/src/app/shared/services/meeting.service.ts |
Adds registerForPublicMeeting method to call public registration endpoint |
apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts |
Adds registration modal trigger, refresh logic, and computed signals for invitation status |
apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.html |
Shows registration button for non-invited users on public meetings |
apps/lfx-one/src/app/modules/meetings/components/rsvp-button-group/rsvp-button-group.component.html |
Removes disabled states to allow RSVP response changes |
apps/lfx-one/src/app/modules/meetings/components/public-registration-modal/* |
New modal component with form validation for public meeting registration |
apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts |
Adds registration modal trigger and refresh logic for invited status updates |
apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html |
Conditionally shows registration button for non-invited users |
apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.html |
Adds h-8 class to header for consistent height alignment |
apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.html |
Adds h-8 class to header for consistent height alignment |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts
Show resolved
Hide resolved
apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts
Outdated
Show resolved
Hide resolved
...modules/meetings/components/public-registration-modal/public-registration-modal.component.ts
Show resolved
Hide resolved
LFXV2-862 - Skip invited status check for meeting organizers in helper - Fix potential null reference in meeting card effect - Remove PII (email) from public registration logs - Change committee website link text to "Visit" Signed-off-by: Asitha de Silva <asithade@gmail.com>
Summary
JIRA Tickets
🤖 Generated with Claude Code