From be45fbe7549b56d8dce6b35bec778d3b5a3860f8 Mon Sep 17 00:00:00 2001 From: Manish Dixit Date: Thu, 19 Mar 2026 12:12:19 -0700 Subject: [PATCH 1/2] fix(committees): revert to permission-based access and address review findings - Revert canManageMembers to use API writer flag as sole authority (removes PersonaService, isBoardMember, isMaintainer signals) - Remove console.error from delete handler (toast handles UX) - Remove groupBehavioralClass input (never passed from parent, was dead code) - Simplify empty state to single generic message - Remove unnecessary target="_blank" from mailto button - Fix blank line artifacts in calendar attributes from onDateChange removal LFXV2-1190 Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Manish Dixit --- .../committee-members.component.html | 12 ++---------- .../committee-members.component.ts | 14 ++++---------- .../member-form/member-form.component.html | 4 ---- 3 files changed, 6 insertions(+), 24 deletions(-) diff --git a/apps/lfx-one/src/app/modules/committees/components/committee-members/committee-members.component.html b/apps/lfx-one/src/app/modules/committees/components/committee-members/committee-members.component.html index a510d6b7f..940c3eabd 100644 --- a/apps/lfx-one/src/app/modules/committees/components/committee-members/committee-members.component.html +++ b/apps/lfx-one/src/app/modules/committees/components/committee-members/committee-members.component.html @@ -157,7 +157,6 @@

{{ committeeLabel.singular }} Memb size="small" severity="secondary" [href]="'mailto:' + member.email" - target="_blank" pTooltip="Send Message"> } @@ -186,15 +185,8 @@

{{ committeeLabel.singular }} Memb
- @if (groupBehavioralClass() === 'governing-board' || groupBehavioralClass() === 'oversight-committee') { - -

No Board Members Found

-

Board members with voting rights will appear here once added.

- } @else { - -

No Contributors Yet

-

Contributors will appear here as they join this working group.

- } + +

No members found

@if (canManageMembers()) {
@if (form().errors?.['role_start_after_role_end']) { @@ -192,7 +190,6 @@ placeholder="Start date" [showButtonBar]="true" appendTo="body" - data-testid="member-form-voting-start">
@if (form().errors?.['voting_status_start_after_voting_status_end']) { From d3521eff036f201614544b7016607cede6877ebb Mon Sep 17 00:00:00 2001 From: Manish Dixit Date: Thu, 19 Mar 2026 10:53:53 -0700 Subject: [PATCH 2/2] fix(committees): committee view polish and settings cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove direct ConfirmDialogModule PrimeNG import from committee-view - Remove from committee-view template - Fix middot entity rendering (· → ·) - Add Join Mode select field to committee-settings - Remove console.error from committee-manage error handlers (toast handles UX) - Fix handleCommitteeError signature (remove unused error param) - Remove console.error from createMemberOperation catchError Leadership dialog and interface changes deferred to follow-up when server-side enrichment exists upstream. LFXV2-1190 Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Manish Dixit --- .../committee-manage.component.ts | 18 ++++-------- .../committee-view.component.html | 4 +-- .../committee-view.component.ts | 15 ++-------- .../committee-settings.component.html | 28 +++++++++++++++++++ .../committee-settings.component.ts | 3 +- 5 files changed, 39 insertions(+), 29 deletions(-) diff --git a/apps/lfx-one/src/app/modules/committees/committee-manage/committee-manage.component.ts b/apps/lfx-one/src/app/modules/committees/committee-manage/committee-manage.component.ts index 5a05a9750..066cbbdbe 100644 --- a/apps/lfx-one/src/app/modules/committees/committee-manage/committee-manage.component.ts +++ b/apps/lfx-one/src/app/modules/committees/committee-manage/committee-manage.component.ts @@ -208,13 +208,13 @@ export class CommitteeManageComponent { // Update existing committee this.committeeService.updateCommittee(this.committeeId()!, committeeData).subscribe({ next: () => this.handleCommitteeSuccess('updated'), - error: (error) => this.handleCommitteeError(error, 'update'), + error: () => this.handleCommitteeError('update'), }); } else { // Create new committee this.committeeService.createCommittee(committeeData).subscribe({ next: (committee) => this.handleCreateSuccess(committee), - error: (error) => this.handleCommitteeError(error, 'create'), + error: () => this.handleCommitteeError('create'), }); } } @@ -246,8 +246,7 @@ export class CommitteeManageComponent { this.showMemberOperationToast(totalSuccess, totalFailed, totalSuccess + totalFailed); this.router.navigate(['/groups']); }, - error: (error) => { - console.error('Error processing member changes:', error); + error: () => { this.messageService.add({ severity: 'error', summary: 'Error', @@ -333,8 +332,7 @@ export class CommitteeManageComponent { // Navigate back to committees list this.router.navigate(['/groups']); }, - error: (error: unknown) => { - console.error('Error saving committee and members:', error); + error: () => { this.messageService.add({ severity: 'error', summary: 'Error', @@ -455,8 +453,7 @@ export class CommitteeManageComponent { } } - private handleCommitteeError(error: unknown, operation: 'create' | 'update'): void { - console.error(`Error ${operation} committee:`, error); + private handleCommitteeError(operation: 'create' | 'update'): void { this.submitting.set(false); this.messageService.add({ @@ -570,10 +567,7 @@ export class CommitteeManageComponent { private createMemberOperation(type: string, operation: () => Observable) { return operation().pipe( switchMap(() => of({ type, success: 1, failed: 0 })), - catchError((error) => { - console.error(`Error ${type} member:`, error); - return of({ type, success: 0, failed: 1 }); - }) + catchError(() => of({ type, success: 0, failed: 1 })) ); } diff --git a/apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.html b/apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.html index c19741ac3..e91489b69 100644 --- a/apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.html +++ b/apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.html @@ -54,7 +54,7 @@

{{ committee()?.name }}

} Created {{ committee()?.created_at | date: 'MMM d, y' }} @if (committee()?.updated_at) { - · Updated {{ committee()?.updated_at | date: 'MMM d, y' }} + · Updated {{ committee()?.updated_at | date: 'MMM d, y' }} } @@ -187,6 +187,4 @@

{{ committee()?.name }}

} - - diff --git a/apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.ts b/apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.ts index 84e3cafb5..714efb9e8 100644 --- a/apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.ts +++ b/apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.ts @@ -8,11 +8,10 @@ import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { BreadcrumbComponent } from '@components/breadcrumb/breadcrumb.component'; import { ButtonComponent } from '@components/button/button.component'; import { TagComponent } from '@components/tag/tag.component'; +import { RouteLoadingComponent } from '@components/loading/route-loading.component'; import { Committee, CommitteeMemberVisibility, getCommitteeCategorySeverity, TagSeverity } from '@lfx-one/shared'; import { CommitteeService } from '@services/committee.service'; -import { RouteLoadingComponent } from '@components/loading/route-loading.component'; import { MenuItem, MessageService } from 'primeng/api'; -import { ConfirmDialogModule } from 'primeng/confirmdialog'; import { catchError, combineLatest, finalize, of, switchMap } from 'rxjs'; import { CommitteeOverviewComponent } from '../components/committee-overview/committee-overview.component'; @@ -21,17 +20,7 @@ type CommitteeTab = 'overview' | 'members' | 'votes' | 'meetings' | 'surveys' | @Component({ selector: 'lfx-committee-view', - imports: [ - BreadcrumbComponent, - ButtonComponent, - TagComponent, - ConfirmDialogModule, - RouterLink, - RouteLoadingComponent, - DatePipe, - NgClass, - CommitteeOverviewComponent, - ], + imports: [BreadcrumbComponent, ButtonComponent, TagComponent, RouterLink, RouteLoadingComponent, DatePipe, NgClass, CommitteeOverviewComponent], templateUrl: './committee-view.component.html', styleUrl: './committee-view.component.scss', }) diff --git a/apps/lfx-one/src/app/modules/committees/components/committee-settings/committee-settings.component.html b/apps/lfx-one/src/app/modules/committees/components/committee-settings/committee-settings.component.html index 24c4c7618..aa8f82844 100644 --- a/apps/lfx-one/src/app/modules/committees/components/committee-settings/committee-settings.component.html +++ b/apps/lfx-one/src/app/modules/committees/components/committee-settings/committee-settings.component.html @@ -47,6 +47,34 @@

Member Visibility

+ +
+

How Can People Join the Group?

+
+
+
+
+ +
+
+ +

Control how new members can join this {{ committeeLabel.toLowerCase() }}

+
+
+ + +
+
+
+

{{ committeeLabel }} Features

diff --git a/apps/lfx-one/src/app/modules/committees/components/committee-settings/committee-settings.component.ts b/apps/lfx-one/src/app/modules/committees/components/committee-settings/committee-settings.component.ts index 1af9406ce..9564ed012 100644 --- a/apps/lfx-one/src/app/modules/committees/components/committee-settings/committee-settings.component.ts +++ b/apps/lfx-one/src/app/modules/committees/components/committee-settings/committee-settings.component.ts @@ -6,7 +6,7 @@ import { FormGroup, ReactiveFormsModule } from '@angular/forms'; import { MessageComponent } from '@components/message/message.component'; import { SelectComponent } from '@components/select/select.component'; import { ToggleComponent } from '@components/toggle/toggle.component'; -import { COMMITTEE_LABEL, COMMITTEE_SETTINGS_FEATURES, MEMBER_VISIBILITY_OPTIONS } from '@lfx-one/shared/constants'; +import { COMMITTEE_LABEL, COMMITTEE_SETTINGS_FEATURES, JOIN_MODE_OPTIONS, MEMBER_VISIBILITY_OPTIONS } from '@lfx-one/shared/constants'; @Component({ selector: 'lfx-committee-settings', @@ -21,4 +21,5 @@ export class CommitteeSettingsComponent { public readonly features = COMMITTEE_SETTINGS_FEATURES; public readonly committeeLabel = COMMITTEE_LABEL.singular; public readonly memberVisibilityOptions = MEMBER_VISIBILITY_OPTIONS; + public readonly joinModeOptions = JOIN_MODE_OPTIONS; }