feat(dashboards): add hidden actions and meeting ui improvements#180
feat(dashboards): add hidden actions and meeting ui improvements#180
Conversation
- Add HiddenActionsService for 24-hour cookie-based action dismissal - Update pending-actions component with dismiss functionality - Integrate hidden actions filtering in all dashboard variants - Simplify meeting card UI with inline action buttons - Add dynamic committee label support using COMMITTEE_LABEL constant - Remove action menu dropdown from meeting cards - Remove badge display from pending actions LFXV2-814, LFXV2-815 Generated with [Claude Code](https://claude.ai/code) Signed-off-by: Asitha de Silva <asithade@gmail.com>
|
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 a HiddenActionsService that hides pending actions via cookies and wires it into pending-actions and dashboard components to filter actions; dashboards adopt computed signals and refresh signaling. Meeting components switch from action menus to explicit committee/delete buttons and use dynamic committee labels. Minor button styling tweak. Changes
Sequence Diagram(s)sequenceDiagram
actor User
participant PA as Pending Actions Component
participant HAS as HiddenActions Service
participant Dashboard as Dashboard Component
participant API as Backend API
User->>PA: Click action button
PA->>HAS: hideAction(item)
HAS->>HAS: set 24h cookie
PA->>Dashboard: emit actionClick
Dashboard->>Dashboard: handleActionClick()
Dashboard->>Dashboard: refresh$ next()
Dashboard->>API: refetch actions
API-->>Dashboard: return actions
Dashboard->>HAS: isActionHidden(action) [filter]
Dashboard-->>PA: update pendingActions (filtered)
PA-->>User: UI updates (action hidden)
sequenceDiagram
participant Component as Dashboard Component
participant Raw as rawActions Signal
participant Computed as computedActions
participant HAS as HiddenActions Service
Component->>Raw: initialize rawActions
Raw-->>Computed: propagate changes
loop for each action
Computed->>HAS: isActionHidden(action)
HAS-->>Computed: boolean
Computed->>Computed: include/exclude
end
Computed-->>Component: expose filtered actions
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes
Pre-merge checks and finishing touches❌ Failed checks (1 inconclusive)
✅ Passed checks (4 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro Disabled knowledge base sources:
📒 Files selected for processing (8)
🚧 Files skipped from review as they are similar to previous changes (1)
🧰 Additional context used📓 Path-based instructions (5)**/*.{html,ts,tsx}📄 CodeRabbit inference engine (CLAUDE.md)
Files:
**/*.html📄 CodeRabbit inference engine (CLAUDE.md)
Files:
**/*.{ts,tsx}📄 CodeRabbit inference engine (CLAUDE.md)
Files:
**/*.{ts,tsx,js,jsx}📄 CodeRabbit inference engine (CLAUDE.md)
Files:
**/*.component.ts📄 CodeRabbit inference engine (CLAUDE.md)
Files:
🧠 Learnings (2)📚 Learning: 2025-11-24T17:42:04.894ZApplied to files:
📚 Learning: 2025-11-24T17:42:04.894ZApplied to files:
🧬 Code graph analysis (1)apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.ts (1)
🔇 Additional comments (5)
Comment |
There was a problem hiding this comment.
Pull request overview
This PR implements a hidden actions feature for dashboard pending actions and improves the meeting UI with simplified controls and dynamic committee labeling.
Key Changes
- Hidden Actions Service: Cookie-based system to hide pending actions for 24 hours with automatic expiration
- Dashboard Integration: Filtering mechanism added to board member, core developer, and maintainer dashboards
- Meeting Card Simplification: Removed dropdown menu in favor of inline committee management and delete buttons
- Dynamic Committee Labels: Consistent use of COMMITTEE_LABEL constant across all committee-related UI text
Reviewed changes
Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| apps/lfx-one/src/app/shared/services/hidden-actions.service.ts | New service for cookie-based hidden actions with 24-hour expiration |
| apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts | Integrated hidden actions filtering with refresh mechanism using BehaviorSubject |
| apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.ts | Added filtering for hidden actions using computed signals |
| apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.ts | Added filtering for hidden actions using computed signals |
| apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts | Added dismiss functionality and updated to use ButtonComponent |
| apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.html | Replaced custom buttons with lfx-button component and removed badge display |
| apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.html | Connected actionClick event to refresh mechanism |
| apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts | Removed action menu, made deleteMeeting public, removed unused methods and imports |
| apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html | Replaced dropdown menu with inline committee and delete buttons |
| apps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.ts | Added COMMITTEE_LABEL import and dynamic label usage in error messages |
| apps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.html | Updated all UI text to use dynamic committee labels |
| apps/lfx-one/src/styles.scss | Modified secondary button selector to exclude text buttons |
Comments suppressed due to low confidence (1)
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts:101
- The refresh mechanism implementation has an issue: the
refresh$BehaviorSubject is triggered viahandleActionClick(), but this creates unnecessary API calls every time an action is clicked. The hidden actions are filtered client-side viacomputed(), so there's no need to refetch the data from the API just to re-filter it.
The current implementation causes the entire initializeBoardMemberActions observable chain to re-execute and make a new API call to getPendingActionSurveys() every time an action is dismissed, which is inefficient.
Consider removing the refresh mechanism since the filtering already happens reactively through the computed signal:
// Remove the refresh$ BehaviorSubject entirely
// Remove the handleActionClick method
// Simplify initializeBoardMemberActions to not use refresh$:
private initializeBoardMemberActions(): Signal<PendingActionItem[]> {
const project$ = toObservable(this.selectedProject);
return toSignal(
project$.pipe(
switchMap((project) => {
if (!project?.slug) {
return of([]);
}
return this.projectService.getPendingActionSurveys(project.slug).pipe(
catchError((error) => {
console.error('Failed to fetch survey actions:', error);
return of([]);
})
);
})
),
{ initialValue: [] }
);
}The filtering in the boardMemberActions computed signal will automatically update when cookies change on the next Angular change detection cycle.
private initializeBoardMemberActions(): Signal<PendingActionItem[]> {
// Convert project signal to observable to react to changes (handles both project and foundation)
const project$ = toObservable(this.selectedProject);
return toSignal(
this.refresh$.pipe(
takeUntilDestroyed(),
switchMap(() => {
return project$.pipe(
switchMap((project) => {
// If no project/foundation selected, return empty array
if (!project?.slug) {
return of([]);
}
// Fetch survey actions from API
return this.projectService.getPendingActionSurveys(project.slug).pipe(
catchError((error) => {
console.error('Failed to fetch survey actions:', error);
// Return empty array on error
return of([]);
})
);
})
);
})
),
{ initialValue: [] }
);
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts
Outdated
Show resolved
Hide resolved
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts
Show resolved
Hide resolved
apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 5
🧹 Nitpick comments (4)
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.html (1)
40-40: Event wiring looks good; consider passing the payload for future flexibilityThe new
(actionClick)="handleActionClick()"binding is fine ifhandleActionClickdoes not need the clicked item. If you expect to inspect which action was clicked later (analytics, different refresh behavior per item), you may want to change this to(actionClick)="handleActionClick($event)"now to avoid a future template/API tweak.apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts (1)
5-7: HiddenActions integration is solid; consider aligning the import aliasUsing
inject(HiddenActionsService)here and hiding the action before emittingactionClickmatches the intended behavior and keeps the component lean.One minor nit: this file imports the service from
@shared/services/hidden-actions.service, whereas the dashboards use@services/hidden-actions.service. For consistency with the rest of the app-level code and the configured path mappings, it’s worth standardizing on a single alias.Also applies to: 19-32
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts (2)
32-43: Signal-based filtering of hidden actions is clean and aligns with guidelinesUsing
rawBoardMemberActionsas the source signal and a separateboardMemberActionscomputed that filters viaHiddenActionsService.isActionHiddenis a good separation of concerns and fits the “signals for state” guideline. This keeps the fetch vs. presentation concerns nicely split and makes it trivial to change filtering behavior later.If
rawBoardMemberActionsis only ever used to deriveboardMemberActions, consider making itprotected/privateand documenting thatboardMemberActionsis the only signal templates/consumers should bind to, to avoid accidental use of unfiltered data.Also applies to: 61-67
78-99: Reactive fetch pipeline for pending actions is robustThe
initializeBoardMemberActionsimplementation is solid:
- Uses
refresh$as a trigger stream, so you can refetch after user actions.- Reacts to
selectedProjectchanges viaproject$ = toObservable(this.selectedProject).- Safely handles the “no project selected” case by returning
of([]).- Wraps the API call in
catchErrorand falls back to an empty array, avoiding error propagation into the signal.This is a good use of
toSignal+ RxJS interop for Angular 19-style zoneless change detection.One minor clean-up you could do later:
toSignalalready manages subscription lifetimes using the injection context; thetakeUntilDestroyed()in this pipeline is somewhat redundant. Dropping it would slightly simplify the chain without changing behavior.Also applies to: 88-95
📜 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 (12)
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.html(1 hunks)apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts(4 hunks)apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.html(2 hunks)apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts(1 hunks)apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.ts(2 hunks)apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.ts(2 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(6 hunks)apps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.html(6 hunks)apps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.ts(3 hunks)apps/lfx-one/src/app/shared/services/hidden-actions.service.ts(1 hunks)apps/lfx-one/src/styles.scss(1 hunks)
🧰 Additional context used
📓 Path-based instructions (6)
**/*.{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.htmlapps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.tsapps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.tsapps/lfx-one/src/app/shared/services/hidden-actions.service.tsapps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.tsapps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.htmlapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.tsapps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.tsapps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.htmlapps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.tsapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html
**/*.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/meeting-committee-modal/meeting-committee-modal.component.htmlapps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.htmlapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.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:
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.tsapps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.tsapps/lfx-one/src/app/shared/services/hidden-actions.service.tsapps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.tsapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.tsapps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.tsapps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.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:
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.tsapps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.tsapps/lfx-one/src/app/shared/services/hidden-actions.service.tsapps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.tsapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.tsapps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.tsapps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.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/dashboards/board-member/board-member-dashboard.component.tsapps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.tsapps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.tsapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.tsapps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.tsapps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.ts
**/*.{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
🧠 Learnings (5)
📚 Learning: 2025-11-24T17:42:04.894Z
Learnt from: CR
Repo: linuxfoundation/lfx-v2-ui PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T17:42:04.894Z
Learning: Follow Angular commit conventions: type(scope): description with valid types - feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert
Applied to files:
apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.html
📚 Learning: 2025-11-24T17:42:04.894Z
Learnt from: CR
Repo: linuxfoundation/lfx-v2-ui PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T17:42:04.894Z
Learning: Applies to **/*.component.ts : Use Angular 19 zoneless change detection with signals for component state management
Applied to files:
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.tsapps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.tsapps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.tsapps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts
📚 Learning: 2025-10-21T21:19:13.599Z
Learnt from: andrest50
Repo: linuxfoundation/lfx-v2-ui PR: 125
File: apps/lfx-one/src/app/modules/project/meetings/components/meeting-card/meeting-card.component.ts:345-350
Timestamp: 2025-10-21T21:19:13.599Z
Learning: In the Angular meeting card component (apps/lfx-one/src/app/modules/project/meetings/components/meeting-card/meeting-card.component.ts), when selecting between `summary.summary_data.edited_content` and `summary.summary_data.content`, the logical OR operator (`||`) is intentionally used instead of nullish coalescing (`??`) because empty string edited_content should fall back to the original content rather than being displayed as empty.
Applied to files:
apps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.htmlapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.tsapps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.tsapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html
📚 Learning: 2025-11-24T17:42:04.894Z
Learnt from: CR
Repo: linuxfoundation/lfx-v2-ui PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T17:42:04.894Z
Learning: All PrimeNG components are wrapped in LFX components for UI library independence
Applied to files:
apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts
📚 Learning: 2025-11-24T17:42:04.894Z
Learnt from: CR
Repo: linuxfoundation/lfx-v2-ui PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T17:42:04.894Z
Learning: Applies to packages/shared/src/**/*.{ts,tsx} : All shared types, interfaces, and constants are centralized in lfx-one/shared package
Applied to files:
apps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.ts
🧬 Code graph analysis (4)
apps/lfx-one/src/app/shared/services/hidden-actions.service.ts (1)
packages/shared/src/interfaces/components.interface.ts (1)
PendingActionItem(386-401)
apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.ts (1)
packages/shared/src/constants/action-items.constants.ts (1)
MAINTAINER_ACTION_ITEMS(39-64)
apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts (2)
packages/shared/src/constants/committees.constants.ts (1)
COMMITTEE_LABEL(16-19)packages/shared/src/interfaces/meeting.interface.ts (1)
PastMeetingRecording(641-662)
apps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.ts (1)
packages/shared/src/constants/committees.constants.ts (1)
COMMITTEE_LABEL(16-19)
⏰ 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 (12)
apps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.ts (3)
11-11: LGTM! Clean import of shared constants.The import correctly uses the path mapping configured in tsconfig.json and retrieves constants from the centralized shared package.
60-60: Well done exposing committeeLabel for template usage.The public readonly property correctly exposes COMMITTEE_LABEL for dynamic labeling in the template, supporting the i18n-friendly approach described in the PR objectives.
67-71: LGTM! Consistent dynamic label usage in messages.All user-facing messages correctly use
COMMITTEE_LABEL.plural.toLowerCase()for dynamic, localized text, maintaining consistency across success and error paths.Also applies to: 203-203, 209-213
apps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.html (1)
9-9: Excellent dynamic label implementation throughout the template.All static committee references have been replaced with dynamic
committeeLabel.singularorcommitteeLabel.pluralusage, providing consistent i18n-friendly text across loading states, form labels, info messages, and table headers.Also applies to: 14-14, 21-23, 30-33, 64-64, 76-77, 84-84, 111-111, 159-159, 175-175
apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html (2)
64-75: Well-designed inline committees button.The new button properly replaces the action menu dropdown with a cleaner inline action. The dynamic tooltip correctly uses
committeeLabel.pluraland adjusts text based on whether committees are already connected ("Manage" vs "Connect").
76-86: Clean inline delete button implementation.The delete button correctly restricts visibility to organizers only and uses a clear trash icon. This simplifies the UI by removing the need for an action menu dropdown.
apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts (4)
26-26: LGTM! Proper import and exposure of COMMITTEE_LABEL.The constant is correctly imported from the shared package and exposed as a public readonly property for template usage, consistent with the pattern in the meeting-committee-modal component.
Also applies to: 136-136
284-284: Correct visibility change for template access.Making
deleteMeeting()public is necessary for the new inline delete button in the template. The method logic remains unchanged, preserving existing deletion behavior for both recurring and non-recurring meetings.
322-344: Well-implemented helper methods.Both
getLargestSessionShareUrlandinitMeetingRegistrantCountare correctly implemented with proper null checks and computed signal usage. The registrant count logic appropriately handles the distinction between past and upcoming meetings.
530-538: Simplified container styling logic.The containerClass computation has been streamlined to return a static shadow-based border style, removing the previous meeting-type-specific border coloring. This aligns with the PR's goal of simplifying the meeting card UI.
apps/lfx-one/src/styles.scss (1)
134-144: Secondary button selector tightening looks goodExcluding
.p-button-textfrom the secondary styling is a clean way to avoid leaking card-action styles onto text-only variants; no issues from a CSS/specificity standpoint.apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts (1)
11-15: Imports follow path alias and RxJS usage conventionsThe new
HiddenActionsServiceand RxJS imports are consistent with existing alias usage and keep dependencies explicit; no issues from a structure or SSR-compatibility standpoint.
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts
Show resolved
Hide resolved
...lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.html
Show resolved
Hide resolved
apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.ts
Show resolved
Hide resolved
apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.ts
Show resolved
Hide resolved
- Replace manual cookie operations with ngx-cookie-service-ssr for SSR compatibility - Add event handling for hidden actions with refresh capability - Improve action identifier uniqueness by including text - Fix button click handling for link components - Remove unused handleDismiss method and ariaLabel attribute Signed-off-by: Asitha de Silva <asithade@gmail.com>
Summary
This PR implements two related features that improve the dashboard and meeting user experience:
Changes
Hidden Actions Feature (LFXV2-814)
New Service:
HiddenActionsServicewith cookie-based persistenceComponent Updates:
pending-actions.component: Added dismiss functionality with click handlingboard-member-dashboard.component: Integrated filtering with refresh mechanism using BehaviorSubjectcore-developer-dashboard.component: Integrated hidden actions filteringmaintainer-dashboard.component: Integrated hidden actions filteringMeeting UI Improvements (LFXV2-815)
Meeting Card Component:
Meeting Committee Modal:
COMMITTEE_LABELconstantPending Actions Component:
Technical Details
Testing
JIRA Tickets
Generated with Claude Code