Skip to content

feat(committees): import meeting registrants into add-member flow - #1081

Draft
manishdixitlfx wants to merge 3 commits into
mainfrom
feat/LFXV2-2607-import-meeting-registrants
Draft

feat(committees): import meeting registrants into add-member flow#1081
manishdixitlfx wants to merge 3 commits into
mainfrom
feat/LFXV2-2607-import-meeting-registrants

Conversation

@manishdixitlfx

Copy link
Copy Markdown
Contributor

LFXV2-2607 — Import meeting registrants into a group

Lets a group manager pull a meeting's registrants into the group instead of re-typing them. Today linking is one-way only (committee → meeting via MeetingCommitteeManagerComponent); there was no registrants → group path. A real manager (Connie, Velocity Engine) built the meeting roster first and faced full manual re-entry into the group.

What changed

Adds an optional "Import from a meeting" picker to the committee AddMemberDialogComponent:

  • Lists meetings in the committee's project via the existing MeetingService.getMeetingsByProject endpoint.
  • On Import, getMeetingRegistrants returns the full roster (the BFF auto-pages internally), and a new shared util extractRegistrantEmails trims, de-dupes case-insensitively, and counts registrants with no email.
  • The resulting emails are appended to the dialog's existing emails textarea, so they flow through the existing parse → dedupe (already-member / already-invited / invalid) → preview → bounded-concurrency invite fan-out unchanged. No invite logic is duplicated.

Decisions (per ticket)

  • No new BFF routes — reuses getMeetingsByProject and getMeetingRegistrants.
  • Invite-based only — direct add is out of scope (LFXV2-2227).
  • No role/org prefill from the registrant record in v1 — import contributes emails only.
  • Registrants without an email are skipped and surfaced in the import summary line.
  • Large rosters (~200) — the registrants endpoint auto-pages server-side and the fan-out already bounds concurrency, so no client-side paging was needed.

No 2606 / commit 9d497dc dependency

The ticket noted existingInvites might depend on a pending getCommitteeInvites() from PR #1078 (feat/LFXV2-2606-wizard-bulk-invite). That does not apply to this surface: getCommitteeInvites() is already on main and this dialog's member+invite dedupe was already wired. Commit 9d497dc is a separate dedupe fix in committee-members-manager.component.ts, unrelated here. No rebase or cherry-pick.

Tests

  • New Vitest cases for extractRegistrantEmails (mixed valid/blank, case-insensitive dedupe, all-blank, empty/nullish).
  • yarn check-types, yarn lint, yarn build (SSR bundle) all pass.

Draft: pending integration validation before marking ready for review.

Add an optional "Import from a meeting" picker to the committee
AddMemberDialog so a group manager can pull a meeting's registrant
emails straight into the invite list instead of re-typing them (LFXV2-2607).

The picker lists meetings in the committee's project via the existing
getMeetingsByProject endpoint; on Import, getMeetingRegistrants returns
the full roster (the BFF auto-pages) and a new shared util
extractRegistrantEmails trims, de-dupes case-insensitively, and counts
registrants with no email. Those emails are appended to the existing
emails textarea, so they flow through the existing parse/dedupe/preview
and bounded-concurrency invite fan-out unchanged.

No new BFF routes. Invite-based only (direct add is LFXV2-2227); no
role/org prefill from registrant records in v1; registrants without an
email are skipped and surfaced in the import summary.

Signed-off-by: Manish Dixit <mdixit@linuxfoundation.org>
Copilot AI review requested due to automatic review settings July 8, 2026 18:25
@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Draft detected.

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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 08fb95f1-45a3-4840-ae52-e79c2db8c1e2

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/LFXV2-2607-import-meeting-registrants

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

- Restore MeetingRegistrant's JSDoc (the new interfaces had split it from
  its declaration); place MeetingSelectOption/RegistrantEmailExtraction above it.
- Guard the meeting sort comparator against unparseable start_time (NaN → 0).
- Clear a stale import summary when a registrant fetch fails.

Signed-off-by: Manish Dixit <mdixit@linuxfoundation.org>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 adds an optional "Import from a meeting" picker to the committee AddMemberDialogComponent, letting a group manager pull a meeting's registrant emails into the add-member flow instead of re-typing them. It reuses existing endpoints (getMeetingsByProject, getMeetingRegistrants) and feeds imported emails into the dialog's existing parse → dedupe → preview → invite fan-out, so no invite logic is duplicated. A new shared util extractRegistrantEmails trims, case-insensitively de-dupes, and counts email-less registrants.

Changes:

  • New shared util extractRegistrantEmails (+ two supporting interfaces MeetingSelectOption / RegistrantEmailExtraction) with Vitest coverage.
  • Import picker wiring in AddMemberDialogComponent (meeting fetch/sort, registrant import, dedupe against already-listed emails, human-readable summary).
  • Template section rendering the meeting select + Import button and summary line.

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
packages/shared/src/utils/meeting.utils.ts Adds extractRegistrantEmails to trim/dedupe emails and count skipped registrants
packages/shared/src/utils/meeting.utils.spec.ts Vitest cases covering mixed/blank/case-insensitive/nullish inputs
packages/shared/src/interfaces/meeting.interface.ts Adds MeetingSelectOption and RegistrantEmailExtraction; insertion orphans the MeetingRegistrant JSDoc
apps/lfx-one/src/app/modules/committees/components/add-member-dialog/add-member-dialog.component.ts Import picker logic: meeting options, registrant fetch, dedupe append, summary
apps/lfx-one/src/app/modules/committees/components/add-member-dialog/add-member-dialog.component.html Renders the import section (select + button + summary)

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

Comment on lines +408 to +432
/**
* Dropdown option for the "import registrants from a meeting" picker (LFXV2-2607).
* `label` is the display string (title + date); `title` is kept separately so
* import summaries can name the meeting cleanly.
*/
export interface MeetingSelectOption {
/** Meeting id passed to the registrants fetch */
value: string;
/** Display label, e.g. "Q3 Roadmap — Jul 3, 2026" */
label: string;
/** Bare meeting title, for summary copy */
title: string;
}

/**
* Result of pulling invite-ready emails off a meeting's registrant list.
* `emails` is de-duplicated (case-insensitive, first-seen casing preserved);
* `skippedNoEmail` counts registrants that carried no usable email.
*/
export interface RegistrantEmailExtraction {
/** Unique, trimmed registrant emails ready to feed the invite flow */
emails: string[];
/** Count of registrants skipped because they had no email */
skippedNoEmail: number;
}
Copilot AI review requested due to automatic review settings July 8, 2026 18:29

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 5 out of 5 changed files in this pull request and generated no new comments.

Bind the Import button's disabled state to importForm.value.meeting instead
of importForm.get('meeting')!.value, removing a non-null assertion from the
template (preflight type-safety check).

Signed-off-by: Manish Dixit <mdixit@linuxfoundation.org>
Copilot AI review requested due to automatic review settings July 8, 2026 21:44

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 5 out of 5 changed files in this pull request and generated no new comments.

@jordane jordane left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This should be implemented with a proper async request in the backend, rather than relying on the UI/BFF to implement it. Similar UI+BFF-only implementations in PCC have been notoriously problematic.

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