Skip to content

feat(dashboards): add hidden actions and meeting ui improvements#180

Merged
asithade merged 2 commits intomainfrom
feat/LFXV2-814
Nov 24, 2025
Merged

feat(dashboards): add hidden actions and meeting ui improvements#180
asithade merged 2 commits intomainfrom
feat/LFXV2-814

Conversation

@asithade
Copy link
Contributor

Summary

This PR implements two related features that improve the dashboard and meeting user experience:

  1. Hidden Actions Feature (LFXV2-814): Cookie-based system allowing users to dismiss pending actions for 24 hours
  2. Meeting UI Improvements (LFXV2-815): Simplified meeting card interface and dynamic committee label support

Changes

Hidden Actions Feature (LFXV2-814)

  • New Service: HiddenActionsService with cookie-based persistence

    • 24-hour automatic expiration via browser cookies
    • SSR-compatible implementation
    • Simple hash-based cookie naming for action identification
  • Component Updates:

    • pending-actions.component: Added dismiss functionality with click handling
    • board-member-dashboard.component: Integrated filtering with refresh mechanism using BehaviorSubject
    • core-developer-dashboard.component: Integrated hidden actions filtering
    • maintainer-dashboard.component: Integrated hidden actions filtering

Meeting UI Improvements (LFXV2-815)

  • Meeting Card Component:

    • Removed action menu dropdown (ellipsis menu)
    • Added inline committee management button
    • Added inline delete button (for organizers only)
    • Simplified card layout with cleaner visual design
  • Meeting Committee Modal:

    • Added dynamic committee label support using COMMITTEE_LABEL constant
    • Updated all UI text to use dynamic labels (singular/plural forms)
    • Improved consistency across committee-related interfaces
  • Pending Actions Component:

    • Removed badge display for cleaner action item layout

Technical Details

  • All changes maintain SSR compatibility
  • Cookie-based state management for hidden actions (no localStorage)
  • Automatic cleanup via browser cookie expiration (no manual cleanup required)
  • Computed signals used for reactive filtering
  • Follows Angular 19 patterns with signals and zoneless change detection

Testing

  • ✅ License headers verified
  • ✅ Linting passed
  • ✅ Type checking passed
  • ✅ Build successful
  • ✅ Pre-commit hooks passed

JIRA Tickets

  • LFXV2-814: Add ability to hide pending actions for 24 hours
  • LFXV2-815: Simplify meeting card actions and add dynamic committee labels

Generated with Claude Code

- 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>
Copilot AI review requested due to automatic review settings November 24, 2025 18:45
@asithade asithade requested a review from jordane as a code owner November 24, 2025 18:45
@coderabbitai
Copy link

coderabbitai bot commented Nov 24, 2025

Note

Other AI code review bot(s) detected

CodeRabbit 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.

Walkthrough

Adds 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

Cohort / File(s) Summary
Hidden Actions Service
apps/lfx-one/src/app/shared/services/hidden-actions.service.ts
New service providing hideAction(item) and isActionHidden(item) using deterministic identifiers and 24‑hour cookies (SameSite=Strict) to record hidden pending actions.
Dashboard Action Filtering
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.html, apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts, apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.ts, apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.ts, apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.html, apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.html
Injects HiddenActionsService; introduces private raw*Actions signals and public computed signals that filter out hidden actions; adds refresh$ BehaviorSubject and handleActionClick() handlers to trigger refetch/refresh when actions occur; templates now bind (actionClick)="handleActionClick()" on pending-actions.
Pending Actions Component
apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.html, apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts
Template switched to lfx-button for action rendering; replaced TagComponent import with ButtonComponent; on action click the component calls HiddenActionsService.hideAction(item) before emitting the action event.
Meeting Components — UI & Labels
apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html, apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts, apps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.html, apps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.ts
Replaces action-menu based UI with explicit committees button and delete button; exposes committeeLabel (COMMITTEE_LABEL) publicly; makes deleteMeeting() public; committee modal text replaced with dynamic singular/plural labels.
Button Component & Styles
apps/lfx-one/src/app/shared/components/button/button.component.html, apps/lfx-one/src/styles.scss
Anchor branch of button component now forwards click events via (click)="handleClick($event)". SCSS refines .p-button-secondary selector to exclude elements containing p-button-text class.

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)
Loading
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
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Review HiddenActionsService: hashing, deterministic identifier logic, cookie expiry and SSR cookie service usage.
  • Verify computed-signal filtering in three dashboard components and correct initialization of raw vs computed signals.
  • Inspect pending-actions component changes: button binding, hide-before-emit semantics, and emitted event shape.
  • Validate meeting-card template refactor (action-menu removal) and public deleteMeeting() exposure.
  • Quick check of button anchor click forwarding and SCSS selector change.

Pre-merge checks and finishing touches

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Out of Scope Changes check ❓ Inconclusive The styles.scss change to button styling and button component click handling are supporting changes that enable the main features but extend slightly beyond the core PR objectives. Clarify whether the secondary button styling change and button component click handler are necessary for the primary features or represent scope creep beyond LFXV2-814 and LFXV2-815.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately reflects the main changes: adding hidden actions feature and meeting UI improvements to dashboards.
Description check ✅ Passed The description is well-structured and related to the changeset, clearly outlining both features, technical details, and related JIRA tickets.
Linked Issues check ✅ Passed All code changes directly implement requirements from LFXV2-814 (hidden actions with cookies, filtering, refresh) and LFXV2-815 (meeting card refactoring, dynamic labels, badge removal).
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/LFXV2-814

📜 Recent 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.

📥 Commits

Reviewing files that changed from the base of the PR and between d0d54e1 and d5138c2.

📒 Files selected for processing (8)
  • 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.html (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.html (1 hunks)
  • apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.ts (2 hunks)
  • apps/lfx-one/src/app/shared/components/button/button.component.html (1 hunks)
  • apps/lfx-one/src/app/shared/services/hidden-actions.service.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/lfx-one/src/app/shared/services/hidden-actions.service.ts
🧰 Additional context used
📓 Path-based instructions (5)
**/*.{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.html
  • apps/lfx-one/src/app/shared/components/button/button.component.html
  • apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.html
  • apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.ts
  • apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts
  • apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.ts
  • apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.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.html
  • apps/lfx-one/src/app/shared/components/button/button.component.html
  • apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.html
  • apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.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/maintainer/maintainer-dashboard.component.ts
  • apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts
  • apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.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/maintainer/maintainer-dashboard.component.ts
  • apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts
  • apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.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/maintainer/maintainer-dashboard.component.ts
  • apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts
  • apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.ts
🧠 Learnings (2)
📚 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/maintainer/maintainer-dashboard.component.html
  • apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.ts
  • apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts
  • apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.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: 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
🧬 Code graph analysis (1)
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)
🔇 Additional comments (5)
apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.html (1)

20-20: Event wiring for pending actions looks correct

The (actionClick)="handleActionClick()" binding cleanly connects lfx-pending-actions to the dashboard handler while using the computed coreDevActions() list; this matches the PendingActionsComponent API and the intended refresh flow.

apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.html (1)

20-20: Consistent actionClick wiring into maintainer dashboard

The new (actionClick)="handleActionClick()" binding correctly hooks lfx-pending-actions into the maintainer dashboard’s handler using the maintainerActions() computed list, matching the patterns used on other dashboards.

apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts (1)

5-7: Good encapsulation of hidden-action behavior in the component

Injecting HiddenActionsService and calling hideAction(item) inside handleActionClick before emitting actionClick keeps the hide logic localized to lfx-pending-actions, while dashboards just consume the filtered list via isActionHidden. The use of input.required/output and a standalone ButtonComponent import also matches the Angular 19 signal‑based patterns.

Also applies to: 14-15, 19-27

apps/lfx-one/src/app/shared/components/button/button.component.html (1)

27-28: Anchor variant now correctly participates in click handling

Wiring the <a pButton> branch through (click)="handleClick($event)" makes the link variant emit via the same handler/output as the p-button branch, which is important for consumers like PendingActions that rely on the onClick output.

apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.html (1)

24-24: Unified button usage and improved accessibility for pending actions

Switching both link and non-link actions to lfx-button with (onClick)="handleActionClick(item)" gives a consistent interaction path into the hide‑and‑emit flow, while rel="noopener noreferrer"/target="_blank" hardening the link case is a good security touch. Dropping the hardcoded ARIA label lets the accessible name follow item.buttonText, resolving the prior screen‑reader mismatch and keeping the layout cleaner without the badge.

Also applies to: 63-86


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

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR 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 via handleActionClick(), but this creates unnecessary API calls every time an action is clicked. The hidden actions are filtered client-side via computed(), 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.

Copy link

@coderabbitai coderabbitai bot left a comment

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 (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 flexibility

The new (actionClick)="handleActionClick()" binding is fine if handleActionClick does 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 alias

Using inject(HiddenActionsService) here and hiding the action before emitting actionClick matches 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 guidelines

Using rawBoardMemberActions as the source signal and a separate boardMemberActions computed that filters via HiddenActionsService.isActionHidden is 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 rawBoardMemberActions is only ever used to derive boardMemberActions, consider making it protected/private and documenting that boardMemberActions is 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 robust

The initializeBoardMemberActions implementation is solid:

  • Uses refresh$ as a trigger stream, so you can refetch after user actions.
  • Reacts to selectedProject changes via project$ = toObservable(this.selectedProject).
  • Safely handles the “no project selected” case by returning of([]).
  • Wraps the API call in catchError and 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:

  • toSignal already manages subscription lifetimes using the injection context; the takeUntilDestroyed() 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.

📥 Commits

Reviewing files that changed from the base of the PR and between ffb3e79 and d0d54e1.

📒 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.html
  • apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts
  • apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.ts
  • apps/lfx-one/src/app/shared/services/hidden-actions.service.ts
  • apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.ts
  • apps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.html
  • apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts
  • apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts
  • apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.html
  • apps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.ts
  • apps/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.html
  • apps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.html
  • apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.html
  • apps/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.ts
  • apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.ts
  • apps/lfx-one/src/app/shared/services/hidden-actions.service.ts
  • apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.ts
  • apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts
  • apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts
  • apps/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.ts
  • apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.ts
  • apps/lfx-one/src/app/shared/services/hidden-actions.service.ts
  • apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.ts
  • apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts
  • apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts
  • apps/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.ts
  • apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.ts
  • apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.ts
  • apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts
  • apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts
  • apps/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.ts
  • apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.ts
  • apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.ts
  • apps/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.html
  • apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts
  • apps/lfx-one/src/app/modules/meetings/components/meeting-committee-modal/meeting-committee-modal.component.ts
  • apps/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.singular or committeeLabel.plural usage, 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.plural and 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 getLargestSessionShareUrl and initMeetingRegistrantCount are 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 good

Excluding .p-button-text from 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 conventions

The new HiddenActionsService and RxJS imports are consistent with existing alias usage and keep dependencies explicit; no issues from a structure or SSR-compatibility standpoint.



- 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>
@asithade asithade merged commit cc3ae19 into main Nov 24, 2025
6 checks passed
@asithade asithade deleted the feat/LFXV2-814 branch November 24, 2025 19:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants