feat(committees): add meetings tab and overview enhancements (split 3/3 of #300)#331
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
📝 Coding Plan
Comment |
There was a problem hiding this comment.
Pull request overview
Adds committee-scoped meeting retrieval and expands the committee detail UI with a full Meetings tab plus behavioral-class-specific Overview dashboard sections.
Changes:
- Add BFF endpoint
GET /api/committees/:id/meetingswired through controller/service. - Add frontend
CommitteeService.getCommitteeMeetings()and refactor upcoming-meeting widget + committee view to use it. - Enhance committee view with Meetings tab (upcoming/past toggle, skeleton loading, create-meeting navigation) and overview cards per behavioral class.
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| apps/lfx-one/src/server/services/committee.service.ts | Adds getCommitteeMeetings() that delegates to MeetingService. |
| apps/lfx-one/src/server/routes/committees.route.ts | Registers GET /:id/meetings route. |
| apps/lfx-one/src/server/controllers/committee.controller.ts | Adds controller handler for committee meetings endpoint. |
| apps/lfx-one/src/app/shared/services/committee.service.ts | Adds frontend API method to fetch committee meetings. |
| apps/lfx-one/src/app/modules/committees/components/upcoming-committee-meeting/upcoming-committee-meeting.component.ts | Switches upcoming meeting logic to committee-scoped meetings fetch. |
| apps/lfx-one/src/app/modules/committees/components/committee-settings/committee-settings.component.html | Updates join-mode copy/icon styling. |
| apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.ts | Adds meeting signals/loading, createMeeting navigation, and type-specific overview loading. |
| apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.html | Implements Meetings tab UI and large overview dashboard enhancements. |
Comments suppressed due to low confidence (1)
apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.html:113
- The "Edit" action button is now shown for any user who is not a board member. This is broader than the previous permission gate and will surface edit navigation to users who likely lack write access. Gate this button with the same permission signal used elsewhere (e.g., canManageConfigurations() or a specific writer/maintainer check) to avoid confusing/unauthorized UI.
@if (!isBoardMember()) {
<div class="flex items-center gap-2 flex-shrink-0">
<lfx-button
icon="fa-light fa-pen-to-square"
label="Edit"
size="small"
[routerLink]="['/groups', committee()?.uid || '', 'edit']"
data-testid="committee-view-edit-btn"></lfx-button>
</div>
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| <label for="join-mode" class="text-sm font-semibold text-gray-900">How can people join this {{ committeeLabel.toLowerCase() }}?</label> | ||
| <p class="text-xs text-gray-600">Controls whether members can self-join, be invited by colleagues, apply for review, or be added by admins only</p> | ||
| <label for="join-mode" class="text-sm font-semibold text-gray-900">Join Mode</label> | ||
| <p class="text-xs text-gray-600">Control how new members can join this {{ committeeLabel.toLowerCase() }}</p> |
| catchError(() => of([])) | ||
| ) | ||
| .subscribe((meetings) => { | ||
| this.committeeMeetings.set(Array.isArray(meetings) ? meetings : []); | ||
| this.meetingsLoading.set(false); |
| const params = { | ||
| ...query, | ||
| committee_uid: committeeId, |
| } catch { | ||
| logger.warning(req, 'get_committee_meetings', 'Failed to fetch committee meetings, returning empty', { | ||
| committee_uid: committeeId, | ||
| }); | ||
| return { data: [], page_token: undefined }; | ||
| } |
a914bc9 to
ec70d54
Compare
- Add meetings tab with upcoming/past meeting toggle and MeetingCardComponent - Add meetings BFF endpoint (GET /committees/:id/meetings) - Add overview sub-resource signals (votes, resolutions, activity, etc.) - Add behavioral-class-specific dashboard cards (governance, working-group, SIG, ambassador) - Add loadGroupTypeData$ for type-specific overview data fetching - Decouple meetings fetch from committee render path - Add createMeeting navigation with committee context Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Signed-off-by: Manish Dixit <mdixit@linuxfoundation.org>
- Fix grammar in settings label - Add takeUntilDestroyed to loadMeetings for lifecycle cleanup - Add error details to meetings catch block logging - Add TODO for committee_uid query param verification Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Signed-off-by: Manish Dixit <mdixit@linuxfoundation.org>
c13b85e to
7c99c45
Compare
ec70d54 to
410c9bb
Compare
Move meetingsLoading.set(false) from subscribe callback into finalize() operator so loading state is cleared regardless of completion path. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Signed-off-by: Manish Dixit <mdixit@linuxfoundation.org>
Review findings verified (commit b9c1082)Checked all 4 Copilot findings using
Validation: 🤖 Generated with Claude Code using |
Summary
Context
Split from PR #300. Depends on PR #330 (member dialogs) and PR #329 (BFF layer).
Test plan
🤖 Generated with Claude Code