Skip to content

feat(org): add Org Lens Meetings page list only UI#1043

Merged
luismoriguerra merged 52 commits into
mainfrom
feat/LFXV2-1901
Jul 2, 2026
Merged

feat(org): add Org Lens Meetings page list only UI#1043
luismoriguerra merged 52 commits into
mainfrom
feat/LFXV2-1901

Conversation

@danoqualls

@danoqualls danoqualls commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Business case: UI only and list view only of Meetings that an organization's employees are involved in.

This pull request introduces the new Organization Meetings feature to the application, making the Meetings page and navigation visible and functional. It adds UI components for viewing upcoming and past meetings, complete with meeting details, filters, and resource links. The changes also update the organization dashboard navigation and routes to enable direct access to the Meetings page.

Feature: Organization Meetings Page

  • Added a new route and enabled navigation for the Organization Meetings page, making it accessible from the sidebar and routing system. (app.routes.ts, main-layout.component.ts) [1] [2]
  • Implemented the main org-meetings component, which includes a page header, KPI summary, filter bar (tabs, search, type filter), and tabbed views for upcoming and past meetings. (org-meetings.component.html)

UI Components: Upcoming and Past Meetings

  • Added OrgUpcomingMeetingsComponent and OrgPastMeetingsComponent to display lists of upcoming and past meetings, respectively, each with skeleton loaders, empty states, and detailed meeting cards. (org-upcoming-meetings.component.ts/.html, org-past-meetings.component.ts/.html) [1] [2] [3] [4]
  • Meeting cards include privacy/type badges, agenda previews (with show more/less), resources, copy-to-clipboard functionality, People Invited / See Details actions, and status artifacts (e.g., recording, transcripts, AI summary). [1] [2]

Navigation and Routing Updates

  • Updated the organization dashboard navigation and routing to unhide the Meetings page, replacing the previous redirect to Overview with a direct link and component load. (app.routes.ts, main-layout.component.ts) [1] [2]

Summary

  • Implements the Org Lens Meetings page (LFXV2-1901/1902/1903/1904) with demo data seam
  • Includes KPI strip (switches per tab), combined tab/filter bar (Upcoming/Past + Search + All Types), and per-tab card lists
  • Upcoming cards: privacy badge, recurrence, copy link, date chip, status artifact pills, agenda show-more, Resources + People Invited (Guests/See Details) two-column layout — no RSVP/Register CTAs in this list-only pass
  • Past cards: privacy/type badges, copy link, date chip, artifact pills, Resources + See Meeting Details layout
  • Wires /org/meetings route and re-enables the Meetings nav entry in the org sidebar

Removed

  • Pending RSVP as a separate top-level nav tab was removed (not on live site at app.lfx.dev/meetings). A "Pending RSVP" filter toggle remains on the Upcoming tab, narrowing the existing list to meetings with an outstanding RSVP — this is a filter, not a tab.
  • Removed openJoin button (label/action mismatch — placeholder until meeting detail routing is wired)
  • "Resource links" are currently rendered as plain text (data model is string[], no URLs) — clickable resource links are follow-up work pending a real attachment/document model

Test plan

  • Navigate to /org/meetings — page loads with KPI strip and Upcoming tab active
  • Switch to Past tab — KPI strip updates to Past Meetings + Recordings Available
  • Search filters meetings by title/agenda
  • All Types dropdown filters by meeting type
  • Tab pills show aria-pressed state for screen readers
  • Copy link buttons announce "Copy meeting link" to screen readers (aria-label)
  • Loading skeletons render when loading=true
  • Empty state renders when no meetings match filters

🤖 Generated with Claude Code

Implement Meetings page for Org Lens with demo data seam. Includes
KPI strip, combined tab/filter bar (Upcoming/Past/Pending RSVP +
Search + All Projects + All Types), and per-tab card lists.

Upcoming card matches app.lfx.dev/meetings: privacy badge, recurrence,
3 action icons, date chip, artifact text-links, agenda show-more,
Resources/People-Invited two-column layout with progress bar and
company invitees (Org Lens addition from prototype), Guests/Details
footer buttons. Past card shows attendance bar, artifact pills, and
org attendance. Pending RSVP shows compact rows with RSVP actions.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
Guard window/navigator calls in copyLink and openJoin with isPlatformBrowser
to prevent SSR crashes. Replace plain Set with signal<ReadonlySet<string>>
for expandedIds so show-more/less toggles trigger change detection in
zoneless mode.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
The button label says See Meeting Details but was wired to openJoin
which opens a join URL — a label/action mismatch. Remove the click
handler and the unused openJoin method; the button is a no-op
placeholder until meeting detail routing is wired.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
Replace OrgPendingRsvpMeeting duplicate field declarations with
Pick<OrgMeeting, ...> to avoid interface drift. Replace stale
Date.now() captured at construction time with a private hoursUntil()
helper that reads Date.now() at call time, fixing stale deadline
chips in SSR and long-lived sessions. Also guard negative hours
with 'Starting soon' label.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
Top-level constant expressions using Date.now() execute once at SSR
module load time and produce stale timestamps for all subsequent users.
Replace with a static ISO string so the demo date is deterministic.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
…base

Conflict resolution during rebase accidentally dropped the
project-staff.constants barrel export, breaking PROJECT_STAFF_ROWS
consumers. Restore it alongside the org-meetings.constants export.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
Move hoursUntil private helper after all protected methods to satisfy
the typescript-eslint/member-ordering rule.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
…meetings

- Filter bar is now a standalone lfx-card (was nested inside shared content card)
- Upcoming and past meeting cards render directly in page flex column with gap-6
- Remove outer lfx-card wrapper that previously wrapped filter bar + tab content
- Remove Pending RSVP tab and All Projects filter (not on live site)
- Past meeting cards converted from divide-y list to individual bordered cards
- OrgMeetingsTabId union type narrowed from 'upcoming'|'past'|'pending' to 'upcoming'|'past'
- Drop filteredPending, pendingMeetings, filterProject, onRsvp, and OrgPendingRsvpMeetingsComponent

LFXV2-1901 LFXV2-1902 LFXV2-1903 LFXV2-1904

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
- Filter bar tabs show plain labels (no counts) matching app.lfx.dev/meetings
- Search bar fills center with flex-1; All Types pushed to right
- Meeting cards use white bg + shadow-sm matching live site card style
- Upcoming cards show type badge (Board=violet, Working Group=blue)
- Upcoming cards show only copy icon (edit/delete removed)

LFXV2-1901

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
- KPI strip switches per tab: past shows Past Meetings + Recordings Available
- Inactive tab pill uses bg-gray-100 (no border) to match live site
- Upcoming cards: Private badge uses shield-heart icon + rounded-full;
  no badge for public meetings; Board/WG = blue border pill; Other = gray
  border pill; recurrence shown as border pill; status artifacts inline on
  date row; right column = RSVP (Yes/No/Maybe) for private, Register for
  public + See Meeting Details; removed Guests/Details bottom row
- Past cards simplified to match live site: privacy/type badges + title +
  date + inline artifacts + Resources | See Meeting Details only; removed
  attendance bar, artifact section, org invitees

LFXV2-1901

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
…ator

- Use fa-circle-dot for Recording (not fa-circle-video)
- Use en-dash (&ndash;) in date time range to match live site
- Align AI Summary to emerald-500 matching live site color

LFXV2-1901

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
- Artifact chips (Recording/Transcripts/AI Summary/Minutes) now use
  colored background pills (bg-red-50, bg-blue-50, bg-emerald-50)
  with matching light borders to match live site
- Other type badge uses bg-gray-100 with no border (not gray border)
- Recurrence pill uses bg-gray-100 with no border

LFXV2-1901

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
…ressed to tab buttons

- Remove unused tabPillOptions computed signal and initTabPillOptions()
  method; template uses the tabs constant directly
- Remove now-unused FilterPillOption import
- Add [attr.aria-pressed] to tab toggle buttons for screen reader support

LFXV2-1901

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
…utton aria-label

Delete org-pending-rsvp-meetings component files left on disk after the
Pending RSVP tab was removed in a12399b. Replace title= with aria-label=
on icon-only copy buttons in upcoming and past meeting cards.

LFXV2-1901

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
Copilot AI review requested due to automatic review settings June 29, 2026 20:38
@danoqualls danoqualls requested a review from a team as a code owner June 29, 2026 20:38
@danoqualls danoqualls marked this pull request as draft June 29, 2026 20:38
@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds the Org Meetings dashboard to Org Lens with shared meeting data types, a routed meetings page with tab and filter state, upcoming and past meeting views, sidebar navigation, and Playwright coverage.

Changes

Org Meetings Dashboard

Layer / File(s) Summary
Data contracts and demo datasets
packages/shared/src/interfaces/org-meetings.interface.ts, packages/shared/src/interfaces/index.ts, packages/shared/src/constants/org-meetings.constants.ts, packages/shared/src/constants/index.ts, packages/shared/src/interfaces/stat-card.interface.ts, apps/lfx-one/src/app/shared/components/stat-card-grid/stat-card-grid.component.html
Defines Org Meetings tab, meeting, invitee, artifact, tally, and status types, exports tab config, KPI/filter constants, and demo upcoming/past meeting datasets, and adds stat card subline support through shared contracts and template rendering.
Page state and route wiring
apps/lfx-one/src/app/modules/dashboards/org/org-meetings/org-meetings.component.ts, apps/lfx-one/src/app/modules/dashboards/org/org-meetings/org-meetings.component.html, apps/lfx-one/src/app/app.routes.ts, apps/lfx-one/src/app/layouts/main-layout/main-layout.component.ts
Implements the Org Meetings page component with query-param tab state, KPI selection, filter form state, and filtered upcoming and past lists, and registers the route plus sidebar navigation entry for the meetings page.
Upcoming meetings list
apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.ts, apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.html
Adds the standalone upcoming meetings component with loading and empty states, expansion state for agendas, browser-gated copy-link handling, and per-meeting cards with badges, agenda toggle, resources, RSVP actions, and details links.
Past meetings list
apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.ts, apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.html
Adds the standalone past meetings component with loading and empty states, browser-gated copy-link handling, per-meeting cards with badges, resources, details links, and the load-older-meetings call to action.
Org Meetings dashboard E2E
apps/lfx-one/e2e/org-meetings-dashboard.spec.ts
Adds Playwright coverage for the Org Meetings dashboard, including Auth0 skip logic, cookie seeding, backend route stubs, page navigation helper, and tab-switching assertions.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding the Org Lens Meetings list-only page UI.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description check ✅ Passed The description clearly matches the added Org Meetings page, routing, navigation, and meeting list UI changes.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/LFXV2-1901

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

@danoqualls danoqualls changed the title feat(org): add Org Lens Meetings page feat(org): add Org Lens Meetings page list only UI Jun 29, 2026
@danoqualls danoqualls self-assigned this Jun 29, 2026

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

Implements a new Org Lens “Meetings” page under /org/meetings, including demo-data-driven upcoming/past tabs, KPI strip, and a shared filter bar, and re-enables the org sidebar navigation entry for Meetings.

Changes:

  • Added shared Org Meetings interfaces + demo constants for tabs, KPIs, meeting records, and filter options.
  • Introduced new Org Meetings dashboard component and tab subcomponents (Upcoming/Past) with filtering, skeleton/empty states, and card layouts.
  • Wired the /org/meetings route and restored the Meetings nav entry in the org sidebar.

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
packages/shared/src/interfaces/org-meetings.interface.ts Adds shared types for Org Meetings page data modeling (tabs, meetings, artifacts, RSVP/attendance).
packages/shared/src/interfaces/index.ts Re-exports Org Meetings interfaces from the shared interfaces barrel.
packages/shared/src/constants/org-meetings.constants.ts Introduces Org Meetings demo data and constants (tabs, KPIs, filter options, demo meeting lists).
packages/shared/src/constants/index.ts Re-exports Org Meetings constants from the shared constants barrel.
apps/lfx-one/src/app/modules/dashboards/org/org-meetings/org-meetings.component.ts Adds the Org Meetings page container with query-param tab state + search/type filtering.
apps/lfx-one/src/app/modules/dashboards/org/org-meetings/org-meetings.component.html Implements the Org Meetings page layout (header, KPI strip, tab/filter bar, tab content).
apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.ts Adds Upcoming tab logic (expand/collapse + copy link handler).
apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.html Renders Upcoming meeting cards including badges, agenda expand, resources, and RSVP/register layout.
apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.ts Adds Past tab logic (copy link handler).
apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.html Renders Past meeting cards including artifacts, resources, and “load older meetings” CTA.
apps/lfx-one/src/app/layouts/main-layout/main-layout.component.ts Re-enables Meetings in the org sidebar navigation.
apps/lfx-one/src/app/app.routes.ts Routes /org/meetings to the new OrgMeetingsComponent (removes prior redirect-to-overview).

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

Comment thread apps/lfx-one/src/app/app.routes.ts
Comment thread packages/shared/src/constants/org-meetings.constants.ts Outdated
@github-actions

Copy link
Copy Markdown

🚀 Deployment Status

Your branch has been deployed to: https://ui-pr-1043.dev.v2.cluster.linuxfound.info

Deployment Details:

  • Environment: Development
  • Namespace: ui-pr-1043
  • ArgoCD App: ui-pr-1043

The deployment will be automatically removed when this PR is closed.

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 5

🧹 Nitpick comments (1)
packages/shared/src/constants/org-meetings.constants.ts (1)

56-57: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use OrgMeetingType for the valid-type set.

ReadonlySet<string> weakens the shared contract here. If OrgMeetingType changes later, this validator can drift without a compile-time failure. Type the set as ReadonlySet<OrgMeetingType> (or derive it from a typed tuple) so the constants stay locked to the interface.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/shared/src/constants/org-meetings.constants.ts` around lines 56 -
57, The VALID_ORG_MEETING_TYPE_VALUES constant is typed too loosely and can
drift from the OrgMeetingType contract. Update the constant in
org-meetings.constants so the set is typed as ReadonlySet<OrgMeetingType> (or
build it from a typed tuple) and keep the values aligned with OrgMeetingType,
ensuring compile-time failures if the shared type changes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.html`:
- Around line 41-47: The action buttons in org-past-meetings.component.html
remove the default focus outline via focus-visible:outline-none without
providing a visible replacement. Update the copy, resource, and details buttons
in this template to include a clear keyboard focus style (for example a ring or
outline state) while preserving the existing hover behavior, and make sure the
same fix is applied to the other affected buttons referenced in the component
markup.
- Around line 91-96: The resource button, the “See Meeting Details” button, and
the “Load older meetings” CTA in org-past-meetings.component.html are currently
dead controls with no bound behavior. Wire each control to a real action in the
corresponding org-past-meetings component by adding the appropriate click
handlers or navigation bindings, and connect them to existing methods or add new
ones in org-past-meetings.component.ts so the UI elements actually open the
resource, show meeting details, and load older meetings before exposing them.

In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.html`:
- Around line 46-53: Restore a visible keyboard focus indicator for the action
buttons in org-upcoming-meetings.component.html. The current button controls
(copy, expand, resource, RSVP/Register, and details) use
focus-visible:outline-none without a replacement style, so add a clear
focus-visible state (for example via an existing Tailwind focus class pattern)
on the relevant button elements. Update the interactive elements in the
org-upcoming-meetings template so their focus state is visible and consistent
while keeping the existing click handlers like copyLink and the other action
bindings intact.
- Around line 106-111: The CTA buttons in org-upcoming-meetings.component.html
are rendered as interactive controls without any action, so update the resource,
RSVP/Register, and meeting-details elements to either wire them to a real
click/routerLink/href behavior or mark them disabled/non-interactive. Use the
existing template blocks around the resource button and the other CTA sections
in the same component to either add the appropriate handlers/links or change
them to plain text so users are not misled by inert buttons.

In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/org-meetings.component.html`:
- Around line 12-29: The KPI strip and the filter bar are currently fixed to
desktop-only layouts, which can squeeze or overflow on smaller screens. Update
the org meetings template to add responsive breakpoints to the KPI grid and the
tabs/search/filter row so they stack or wrap appropriately on mobile and tablet
sizes. Use the existing template sections in org-meetings.component.html
(including the KPI card loop and the filter bar markup) as the place to apply
responsive Tailwind classes and keep the desktop layout unchanged.

---

Nitpick comments:
In `@packages/shared/src/constants/org-meetings.constants.ts`:
- Around line 56-57: The VALID_ORG_MEETING_TYPE_VALUES constant is typed too
loosely and can drift from the OrgMeetingType contract. Update the constant in
org-meetings.constants so the set is typed as ReadonlySet<OrgMeetingType> (or
build it from a typed tuple) and keep the values aligned with OrgMeetingType,
ensuring compile-time failures if the shared type changes.
🪄 Autofix (Beta)

❌ Autofix failed (check again to retry)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 11633b49-8c75-4663-9dfe-0004d4dc3d2e

📥 Commits

Reviewing files that changed from the base of the PR and between 5578277 and 1c1c7e6.

📒 Files selected for processing (12)
  • apps/lfx-one/src/app/app.routes.ts
  • apps/lfx-one/src/app/layouts/main-layout/main-layout.component.ts
  • apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.html
  • apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.ts
  • apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.html
  • apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.ts
  • apps/lfx-one/src/app/modules/dashboards/org/org-meetings/org-meetings.component.html
  • apps/lfx-one/src/app/modules/dashboards/org/org-meetings/org-meetings.component.ts
  • packages/shared/src/constants/index.ts
  • packages/shared/src/constants/org-meetings.constants.ts
  • packages/shared/src/interfaces/index.ts
  • packages/shared/src/interfaces/org-meetings.interface.ts

@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

⚠️ Branch updated during autofix.

The branch was updated while autofix was in progress. Please try again.

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 15 out of 15 changed files in this pull request and generated 2 comments.

Copilot AI review requested due to automatic review settings July 2, 2026 18:02

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 15 out of 15 changed files in this pull request and generated 3 comments.

Comment thread apps/lfx-one/e2e/org-meetings-dashboard.spec.ts
Copilot AI review requested due to automatic review settings July 2, 2026 18:09

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 15 out of 15 changed files in this pull request and generated 5 comments.

Comment thread apps/lfx-one/e2e/org-meetings-dashboard.spec.ts
@danoqualls danoqualls marked this pull request as ready for review July 2, 2026 18:34

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 1

🧹 Nitpick comments (8)
apps/lfx-one/src/app/modules/dashboards/org/org-meetings/org-meetings.component.html (2)

40-45: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Missing focus-visible ring styles on tab/toggle pill buttons.

Per the PR's stated fix of adding focus-visible ring styles to meeting card buttons for accessibility, these tab and pending-RSVP toggle buttons appear to lack the same treatment, leaving no visible keyboard-focus indicator.

Also applies to: 58-69

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/org-meetings.component.html`
around lines 40 - 45, The tab and pending-RSVP pill buttons in
org-meetings.component.html are missing the same focus-visible accessibility
treatment added elsewhere. Update the button class bindings for the tab selector
and the pending-RSVP toggle to include a visible focus-visible ring/outline
state, using the existing active/inactive styling in the button templates so
keyboard focus is clearly indicated.

38-45: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Extract duplicated pill-class ternary logic.

The active/inactive pill class strings are duplicated near-verbatim between the tab buttons and the pending-RSVP toggle button. Extracting a small helper (e.g., a pillClass(active: boolean): string method or template function) would avoid divergence if the styling changes later.

♻️ Suggested direction
-            [class]="
-              activeTab() === tab.id
-                ? 'px-3 py-1 rounded-full text-sm transition-colors bg-blue-500 text-white'
-                : 'px-3 py-1 rounded-full text-sm transition-colors bg-gray-100 text-gray-700 hover:bg-gray-200'
-            "
+            [class]="pillClass(activeTab() === tab.id)"
...
-            [class]="
-              pendingRsvpOnly()
-                ? 'px-3 py-1 rounded-full text-sm transition-colors bg-blue-500 text-white'
-                : 'px-3 py-1 rounded-full text-sm transition-colors bg-gray-100 text-gray-700 hover:bg-gray-200'
-            "
+            [class]="pillClass(pendingRsvpOnly())"
protected pillClass(active: boolean): string {
  return active
    ? 'px-3 py-1 rounded-full text-sm transition-colors bg-blue-500 text-white'
    : 'px-3 py-1 rounded-full text-sm transition-colors bg-gray-100 text-gray-700 hover:bg-gray-200';
}

Also applies to: 55-69

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/org-meetings.component.html`
around lines 38 - 45, The pill-style active/inactive class ternary is duplicated
in the org meetings template, so extract it into a shared helper on
org-meetings.component.ts (for example, a pillClass(active: boolean) method) and
use that from both the tab button and the pending-RSVP toggle button. Keep the
existing class strings centralized in the helper so any future styling change
only needs to be made once.
apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.html (2)

41-47: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

No success/failure feedback on copy action.

Same gap as the upcoming-meetings card: cdkCopyToClipboard is bound without (cdkCopyToClipboardCopied), so users get no confirmation the link was actually copied.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.html`
around lines 41 - 47, The copy button in org-past-meetings.component.html uses
cdkCopyToClipboard without any copied-state handling, so users get no
confirmation. Add a cdkCopyToClipboardCopied handler on the existing button
bound to meetingLinkUrl(meeting.id), and wire it to the same success feedback
pattern used in the upcoming-meetings card so the copy action visibly confirms
success.

89-96: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

track resource risks duplicate-key collisions.

Same concern as in the upcoming meetings template — tracking by the raw resource string can collide if two resources share a name. Prefer index or a stable id.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.html`
around lines 89 - 96, The `@for` loop in `org-past-meetings.component.html` is
tracking resources by the raw `resource` string, which can cause duplicate-key
collisions if names repeat. Update the tracking expression in the
`meeting.resources` loop to use a safer unique key, such as the item index or a
stable resource identifier if one exists, matching the approach used in the
other meetings template.
apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.ts (1)

20-26: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicate meetingLinkUrl implementation.

This method is byte-for-byte identical to OrgUpcomingMeetingsComponent.meetingLinkUrl (same SSR guard, same comment, same URL construction). Consider extracting a shared helper (e.g. a small pure function or an injectable service) so the SSR-link-building logic has a single source of truth instead of being maintained in two places.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.ts`
around lines 20 - 26, The meetingLinkUrl logic in OrgPastMeetingsComponent is
duplicated from OrgUpcomingMeetingsComponent, so move the SSR-safe URL building
into a shared helper or small service and have both components call that single
implementation. Keep the same isPlatformBrowser guard and relative-path
fallback, but centralize the path/origin construction so the copy button link
generation has one source of truth.
apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.ts (1)

43-68: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Template-bound methods recompute on every CD cycle for every row.

meetingLinkUrl, totalInvited, attendingPercent, rsvpPercent, and rsvpBadge are all plain methods invoked directly from template bindings inside the @for loop (several multiple times per row, e.g. totalInvited is called independently in three different places for the same meeting). In zoneless Angular this re-executes for every meeting card whenever any signal in the tree changes (e.g. toggling one card's expandedIds), not just the affected row. This mirrors the exact anti-pattern already flagged and fixed for isExpanded() in this same component (calls should be signal-driven rather than method-driven inside @for).

Consider deriving these once per meeting (e.g. a computed() that maps meetings() into a view-model array with pre-computed linkUrl, totalInvited, attendingPercent, and badge info) instead of recomputing them from the template.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.ts`
around lines 43 - 68, The template is repeatedly calling plain methods from
inside the `@for` loop, causing all meeting rows to recompute on every change
detection pass. Move the logic in meetingLinkUrl, totalInvited,
attendingPercent, rsvpPercent, and rsvpBadge out of direct template bindings by
deriving a per-meeting view model with computed() so each meeting’s link,
totals, percentages, and badge are calculated once and reused. Use the existing
org-upcoming-meetings.component.ts class and its meetings()/expandedIds pattern
as the place to precompute these values instead of invoking methods from the
template.
apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.html (2)

106-117: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

track resource risks duplicate-key collisions.

Resources are tracked by their raw string value. If two resources in the same meeting share an identical name/label, Angular's @for will treat them as the same tracked item, causing incorrect DOM reuse. Prefer tracking by index or a stable resource id if one exists on the model.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.html`
around lines 106 - 117, The `@for` in org-upcoming-meetings.component.html is
tracking resources by the raw string value, which can collide when duplicate
labels exist in meeting.resources. Update the tracking expression in the
resources loop to use a unique stable identifier if the model provides one, or
fall back to the item index so each resource is rendered distinctly.

46-51: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Handle the clipboard result
cdkCopyToClipboard emits the copy outcome, but nothing listens to it here. Bind (cdkCopyToClipboardCopied) and surface success/failure so permission-denied failures aren’t silent.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.html`
around lines 46 - 51, The copy action in orgUpcomingMeetingsComponent is missing
handling for the clipboard result, so failures can be silent. Update the button
that uses cdkCopyToClipboard in org-upcoming-meetings.component.html to bind
(cdkCopyToClipboardCopied) and route the outcome into
orgUpcomingMeetingsComponent so you can surface a success or failure state (for
example via an existing notification or handler method). Use the
meetingLinkUrl(meeting.id) binding and the copy button’s existing
data-testid/aria-label to locate the control.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.html`:
- Around line 154-174: The invitee list in org-upcoming-meetings.component.html
is tracking rows by invitee.name, which can collide when names repeat. Update
the `@for` in the orgInvitees block to use a stable unique identifier from
OrgMeetingInvitee instead, and if one does not exist, add an id/email field to
the model and bind the track expression to that unique value.

---

Nitpick comments:
In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.html`:
- Around line 41-47: The copy button in org-past-meetings.component.html uses
cdkCopyToClipboard without any copied-state handling, so users get no
confirmation. Add a cdkCopyToClipboardCopied handler on the existing button
bound to meetingLinkUrl(meeting.id), and wire it to the same success feedback
pattern used in the upcoming-meetings card so the copy action visibly confirms
success.
- Around line 89-96: The `@for` loop in `org-past-meetings.component.html` is
tracking resources by the raw `resource` string, which can cause duplicate-key
collisions if names repeat. Update the tracking expression in the
`meeting.resources` loop to use a safer unique key, such as the item index or a
stable resource identifier if one exists, matching the approach used in the
other meetings template.

In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.ts`:
- Around line 20-26: The meetingLinkUrl logic in OrgPastMeetingsComponent is
duplicated from OrgUpcomingMeetingsComponent, so move the SSR-safe URL building
into a shared helper or small service and have both components call that single
implementation. Keep the same isPlatformBrowser guard and relative-path
fallback, but centralize the path/origin construction so the copy button link
generation has one source of truth.

In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.html`:
- Around line 106-117: The `@for` in org-upcoming-meetings.component.html is
tracking resources by the raw string value, which can collide when duplicate
labels exist in meeting.resources. Update the tracking expression in the
resources loop to use a unique stable identifier if the model provides one, or
fall back to the item index so each resource is rendered distinctly.
- Around line 46-51: The copy action in orgUpcomingMeetingsComponent is missing
handling for the clipboard result, so failures can be silent. Update the button
that uses cdkCopyToClipboard in org-upcoming-meetings.component.html to bind
(cdkCopyToClipboardCopied) and route the outcome into
orgUpcomingMeetingsComponent so you can surface a success or failure state (for
example via an existing notification or handler method). Use the
meetingLinkUrl(meeting.id) binding and the copy button’s existing
data-testid/aria-label to locate the control.

In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.ts`:
- Around line 43-68: The template is repeatedly calling plain methods from
inside the `@for` loop, causing all meeting rows to recompute on every change
detection pass. Move the logic in meetingLinkUrl, totalInvited,
attendingPercent, rsvpPercent, and rsvpBadge out of direct template bindings by
deriving a per-meeting view model with computed() so each meeting’s link,
totals, percentages, and badge are calculated once and reused. Use the existing
org-upcoming-meetings.component.ts class and its meetings()/expandedIds pattern
as the place to precompute these values instead of invoking methods from the
template.

In
`@apps/lfx-one/src/app/modules/dashboards/org/org-meetings/org-meetings.component.html`:
- Around line 40-45: The tab and pending-RSVP pill buttons in
org-meetings.component.html are missing the same focus-visible accessibility
treatment added elsewhere. Update the button class bindings for the tab selector
and the pending-RSVP toggle to include a visible focus-visible ring/outline
state, using the existing active/inactive styling in the button templates so
keyboard focus is clearly indicated.
- Around line 38-45: The pill-style active/inactive class ternary is duplicated
in the org meetings template, so extract it into a shared helper on
org-meetings.component.ts (for example, a pillClass(active: boolean) method) and
use that from both the tab button and the pending-RSVP toggle button. Keep the
existing class strings centralized in the helper so any future styling change
only needs to be made once.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: fed33e03-2aba-4818-a900-b0011a047989

📥 Commits

Reviewing files that changed from the base of the PR and between 1738701 and 1e3fc90.

📒 Files selected for processing (11)
  • apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.html
  • apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-past-meetings/org-past-meetings.component.ts
  • apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.html
  • apps/lfx-one/src/app/modules/dashboards/org/org-meetings/components/org-upcoming-meetings/org-upcoming-meetings.component.ts
  • apps/lfx-one/src/app/modules/dashboards/org/org-meetings/org-meetings.component.html
  • apps/lfx-one/src/app/modules/dashboards/org/org-meetings/org-meetings.component.ts
  • apps/lfx-one/src/app/shared/components/stat-card-grid/stat-card-grid.component.html
  • packages/shared/src/constants/org-meetings.constants.ts
  • packages/shared/src/interfaces/index.ts
  • packages/shared/src/interfaces/org-meetings.interface.ts
  • packages/shared/src/interfaces/stat-card.interface.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/shared/src/interfaces/index.ts
  • packages/shared/src/interfaces/org-meetings.interface.ts

Copilot AI review requested due to automatic review settings July 2, 2026 19:31
Address review comments from copilot-pull-request-reviewer[bot]:

- org-upcoming-meetings.component.html/.ts, org-past-meetings.component.html/.ts:
  wrapped the copy-link button in @defer (on idle), matching the
  dashboard-meeting-card pattern, and reworded the SSR-guard comment so it
  stays accurate whether the button renders eagerly or deferred
- org-meetings.component.ts: filtered the Upcoming list to startTime >= now
  and the Past list to startTime < now, so tabs can't show meetings that
  have already started/aren't actually in the past
- org-upcoming-meetings.component.html: track invitees by $index instead of
  invitee.name, since name isn't guaranteed unique or stable
- org-meetings-dashboard.spec.ts: added e2e coverage for the search filter
  and the Pending RSVP toggle narrowing the upcoming list

No code change (explained in PR description instead):
- resource links stay plain text pending a real attachment/document model
- PR description reworded to describe the actual Guests/See Details CTAs
  instead of RSVP/Register, which aren't part of this list-only pass

Resolves 10 review threads.

Signed-off-by: daniel qualls <dqualls@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

Copilot reviewed 15 out of 15 changed files in this pull request and generated 2 comments.

Copilot AI review requested due to automatic review settings July 2, 2026 19:38

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 15 out of 15 changed files in this pull request and generated 2 comments.

Comment thread packages/shared/src/constants/org-meetings.constants.ts Outdated
Comment thread apps/lfx-one/e2e/org-meetings-dashboard.spec.ts
Address review comments from Copilot:

- org-meetings.component.html: replace hand-rolled KPI markup with the
  shared lfx-stat-card-grid component (now supports a configurable
  2-column layout) so subLine rendering isn't maintained in two places
- org-upcoming-meetings.component.ts, org-past-meetings.component.ts:
  extract the duplicated SSR-safe meetingLinkUrl guard into a shared
  toAbsoluteUrl() util in @lfx-one/shared/utils
- org-meetings.constants.ts: derive demo meeting startTime/endTime
  relative to the current date instead of hardcoded absolute dates, so
  the Upcoming/Past demo data and dependent e2e assertions stay valid
  over time

Resolves 4 review threads.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
The multi-line div wrap in stat-card-grid.component.html failed
yarn format:check on PR #1043's CI.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
Copilot AI review requested due to automatic review settings July 2, 2026 21:34

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 17 out of 17 changed files in this pull request and generated no new comments.

@audigregorie audigregorie 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.

Code Review Summary

Solid Org Lens Meetings list-only UI with thoughtful demo-data seam (demoMeetingTimes), good a11y on tab pills and copy buttons, and Playwright coverage for core tab/search/RSVP flows. Remaining gaps are mostly placeholder CTAs and KPI values that do not match the visible demo list.

Major — outside the diff

  • Branch hygiene: main..HEAD spans 73 files and 40+ commits (many merge commits and auto-generated "Potential fix for pull request finding" messages). Consider squashing or rebasing to the org-meetings feature commits before merge so reviewers can focus on LFXV2-1901 scope.

Minor — outside the diff

  • E2E gaps: New spec covers tab switching, search, and Pending RSVP toggle but not project/type filters or Past-tab KPI assertions listed in the PR test plan.

What's done well

  • Shared types/constants split (OrgMeetingBase / OrgPastMeeting) and relative demo timestamps keep e2e stable.
  • Clipboard copy is SSR-safe via @defer (on idle) + toAbsoluteUrl with isPlatformBrowser.
  • Filter bar uses aria-pressed, sr-only labels, and data-testid hooks consistently.

- org-meetings.component.ts: derive KPI upcoming/past counts from
  filteredUpcoming()/filteredPast().length instead of static demo
  constants, so the strip matches the rendered list
- org-meetings.component.ts: reset pendingRsvpOnly when switching away
  from the upcoming tab so the filter doesn't leak across tabs
- org-upcoming-meetings.component.html: disable non-functional Guests/
  See Details/See Meeting Details buttons with aria-disabled + muted
  styling instead of leaving them clickable with no handler
- org-past-meetings.component.html: disable non-functional See Meeting
  Details and Load older meetings buttons the same way
- org-upcoming-meetings.component.html: use a composite
  name+title track key for orgInvitees instead of $index, since
  invitees don't reorder and a stable key avoids unnecessary re-renders
- org-upcoming-meetings.component.ts: move RSVP_BADGES/NO_RESPONSE_BADGE
  module-level consts into packages/shared/src/constants per the
  no-local-consts source hygiene rule

Resolves 8 review threads.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
@luismoriguerra luismoriguerra merged commit 8c05e2f into main Jul 2, 2026
12 checks passed
@luismoriguerra luismoriguerra deleted the feat/LFXV2-1901 branch July 2, 2026 22:05
@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

🧹 Deployment Removed

The deployment for PR #1043 has been removed.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants