Skip to content

Conversation

@asithade
Copy link
Contributor

@asithade asithade commented Nov 4, 2025

Summary

  • Enhanced dashboard meeting card with colored borders, improved layout, and join URL pre-fetching
  • Added skeleton loading indicators to My Meetings component
  • Fixed button component ngClass and type attribute support

Changes

Dashboard Meeting Card

  • Added dynamic colored left border matching meeting type (purple/blue/red/green/amber/gray)
  • Implemented join URL pre-fetching for today's meetings with authenticated users
  • Restructured layout: moved feature icons under title with time display
  • Updated attachment icon styling with blue theme
  • Enhanced button layout with better touch targets and responsive width

My Meetings Component

  • Replaced spinner with PrimeNG skeleton loading (2 x 140px skeletons)
  • Added loading signal with reactive state management
  • Removed unused event handlers

Button Component

  • Fixed ngClass styling application for anchor tags
  • Added type attribute support for anchor tags

Test Plan

  • Verify colored borders display correctly for all meeting types (technical/maintainers/board/marketing/legal/other)
  • Test join URL pre-fetching with authenticated users on today's meetings
  • Verify graceful fallback to join page when URL unavailable
  • Test skeleton loading displays during My Meetings data fetch
  • Verify responsive button layouts on mobile (320px), tablet (768px), desktop (1024px+)
  • Test external link behavior (opens in new tabs)
  • Verify all feature icon tooltips display correctly
  • Test with meetings that have/don't have attachments
  • Verify layout with missing optional fields
  • Check for console errors or warnings

References

LFXV2-702

- Add colored left border to meeting cards matching meeting type
- Implement join URL pre-fetching for today's meetings
- Move feature icons from header to under title with time
- Update attachment icon styling with blue theme
- Add skeleton loading to My Meetings component
- Fix button component ngClass and type attribute support

Signed-off-by: Asitha de Silva <[email protected]>
@asithade asithade requested a review from jordane as a code owner November 4, 2025 19:55
Copilot AI review requested due to automatic review settings November 4, 2025 19:55
@coderabbitai
Copy link

coderabbitai bot commented Nov 4, 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 loading signal and skeleton UI for MyMeetings, removes event-based "see meeting" navigation in favor of computed join URLs on meeting cards, introduces meeting-type styling constants and a MeetingWithOccurrence interface, and extends the shared button template with type/style bindings.

Changes

Cohort / File(s) Summary
My meetings — loading & empty state
apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.ts, apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.html
Added a loading Signal and wired it to getMeetings() via toSignal(...pipe(finalize(...))); template now renders skeleton items while loading, preserves TODAY/UPCOMING lists without onSeeMeeting bindings, and shows a global dashed empty state when no meetings exist.
Dashboard meeting card — join URL & layout refactor
apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.ts, apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html
Removed onSeeMeeting output; added `joinUrl: Signal<string
Shared constants — meeting type configs
packages/shared/src/constants/meeting.constants.ts
Added MeetingTypeConfig and MeetingTypeBadge interfaces, MEETING_TYPE_CONFIGS mapping, and DEFAULT_MEETING_TYPE_CONFIG for meeting-type styling and icons.
Shared interfaces — composite meeting type
packages/shared/src/interfaces/meeting.interface.ts
Added exported MeetingWithOccurrence interface combining meeting, occurrence, and sortTime.
URL utils — removed alias export
packages/shared/src/utils/url.utils.ts
Removed the exported URL_REGEX alias (previously pointed to URL_DETECTION_REGEX).
Button template — anchor bindings
apps/lfx-one/src/app/shared/components/button/button.component.html
Added [type]="type()" and [ngClass]="styleClass()" bindings to anchor branch (introduces a type input usage).

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant MyMeetings
    participant MeetingCard as DashboardMeetingCard
    participant UserService
    participant JoinURL as joinUrl Signal
    participant Router

    rect `#E8F0FF`
    Note over MyMeetings: Data fetch with loading signal
    MyMeetings->>MyMeetings: call meetingService.getMeetings()
    MyMeetings->>MyMeetings: set loading = true
    MyMeetings-->>MyMeetings: toSignal(..., initialValue: [])
    MyMeetings->>MyMeetings: finalize -> set loading = false
    end

    rect `#F0FFF0`
    Note over MeetingCard,JoinURL: joinUrl computation
    MeetingCard->>UserService: request authenticated user info
    MeetingCard->>JoinURL: combine meeting + user + auth -> compute joinUrl
    JoinURL-->>MeetingCard: joinUrl (string|null)
    end

    rect `#FFF8E6`
    Note over User,MeetingCard: Interaction
    User->>MeetingCard: Click action
    alt joinUrl exists
        MeetingCard->>User: navigate via href (external join link)
    else joinUrl null
        MeetingCard->>Router: routerLink to internal meeting details
        Router-->>User: show meeting details page
    end
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Verify loading lifecycle: finalize correctly sets loading and toSignal initial value behavior.
  • Review joinUrl computation and buildJoinUrlWithParams for correct param encoding and privacy of user data.
  • Confirm removal of onSeeMeeting output does not leave parent components expecting that event.
  • Validate new meeting-type config mapping usage and default fallbacks in UI styling.

Possibly related PRs

Suggested labels

deploy-preview

Pre-merge checks and finishing touches

✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat(dashboard): enhance meeting card UI and add loading states' clearly summarizes the main changes: dashboard card enhancements and loading state additions to the My Meetings component.
Description check ✅ Passed The description provides comprehensive details about the changeset, covering dashboard card improvements, My Meetings component changes, button component fixes, and references the linked JIRA issue.
Linked Issues check ✅ Passed The PR implements all objectives from LFXV2-702: enhanced dashboard card UI with colored borders LFXV2-702, loading indicators with skeleton UI LFXV2-702, join URL pre-fetching LFXV2-702, button component fixes LFXV2-702, and reactive state management LFXV2-702.
Out of Scope Changes check ✅ Passed All changes are within scope of LFXV2-702: URL_REGEX deprecation removal is tangential but not out-of-scope; all other changes directly support the dashboard card enhancements and loading state objectives.
✨ 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-702

📜 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 1ad5d77 and 272c259.

📒 Files selected for processing (6)
  • apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.ts (1 hunks)
  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html (1 hunks)
  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.ts (4 hunks)
  • packages/shared/src/constants/meeting.constants.ts (1 hunks)
  • packages/shared/src/interfaces/meeting.interface.ts (1 hunks)
  • packages/shared/src/utils/url.utils.ts (0 hunks)
💤 Files with no reviewable changes (1)
  • packages/shared/src/utils/url.utils.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.ts
🧰 Additional context used
📓 Path-based instructions (6)
apps/lfx-one/src/**/*.html

📄 CodeRabbit inference engine (CLAUDE.md)

apps/lfx-one/src/**/*.html: Always add data-testid attributes when creating new Angular components for reliable test targeting
Use data-testid naming convention [section]-[component]-[element]

Files:

  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html
**/*.{ts,tsx,js,jsx,mjs,cjs,html,css,scss}

📄 CodeRabbit inference engine (CLAUDE.md)

Include required license headers on all source files

Files:

  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html
  • packages/shared/src/constants/meeting.constants.ts
  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.ts
  • packages/shared/src/interfaces/meeting.interface.ts
packages/shared/src/constants/**/*.ts

📄 CodeRabbit inference engine (CLAUDE.md)

Place all reusable constants in the shared package at packages/shared/src/constants

Files:

  • packages/shared/src/constants/meeting.constants.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Use TypeScript interfaces instead of union types for better maintainability
When defining PrimeNG-related types, reference the official PrimeNG component interfaces

Files:

  • packages/shared/src/constants/meeting.constants.ts
  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.ts
  • packages/shared/src/interfaces/meeting.interface.ts
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Do not nest ternary expressions

Files:

  • packages/shared/src/constants/meeting.constants.ts
  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.ts
  • packages/shared/src/interfaces/meeting.interface.ts
packages/shared/src/interfaces/**/*.ts

📄 CodeRabbit inference engine (CLAUDE.md)

Place all TypeScript interfaces in the shared package at packages/shared/src/interfaces

Files:

  • packages/shared/src/interfaces/meeting.interface.ts
🧠 Learnings (4)
📚 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/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html
  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.ts
📚 Learning: 2025-09-16T03:32:46.518Z
Learnt from: CR
Repo: linuxfoundation/lfx-v2-ui PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-09-16T03:32:46.518Z
Learning: Applies to apps/lfx-one/src/**/*.html : Always add data-testid attributes when creating new Angular components for reliable test targeting

Applied to files:

  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html
📚 Learning: 2025-09-16T03:32:46.518Z
Learnt from: CR
Repo: linuxfoundation/lfx-v2-ui PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-09-16T03:32:46.518Z
Learning: Applies to packages/shared/src/constants/**/*.ts : Place all reusable constants in the shared package at packages/shared/src/constants

Applied to files:

  • packages/shared/src/constants/meeting.constants.ts
📚 Learning: 2025-09-16T03:32:46.518Z
Learnt from: CR
Repo: linuxfoundation/lfx-v2-ui PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-09-16T03:32:46.518Z
Learning: Applies to packages/shared/src/interfaces/**/*.ts : Place all TypeScript interfaces in the shared package at packages/shared/src/interfaces

Applied to files:

  • packages/shared/src/interfaces/meeting.interface.ts
🧬 Code graph analysis (1)
apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.ts (4)
packages/shared/src/interfaces/meeting.interface.ts (2)
  • Meeting (75-150)
  • MeetingOccurrence (156-167)
packages/shared/src/interfaces/meeting-attachment.interface.ts (1)
  • MeetingAttachment (8-27)
packages/shared/src/constants/meeting.constants.ts (2)
  • MEETING_TYPE_CONFIGS (130-185)
  • DEFAULT_MEETING_TYPE_CONFIG (191-199)
packages/shared/src/interfaces/auth.interface.ts (1)
  • User (8-41)
🔇 Additional comments (5)
packages/shared/src/interfaces/meeting.interface.ts (1)

169-180: LGTM! Well-structured interface for meeting display.

The new MeetingWithOccurrence interface properly combines meeting details with occurrence information and includes a sortTime field for chronological sorting. The documentation is clear, and the interface follows the project's conventions for shared types.

packages/shared/src/constants/meeting.constants.ts (1)

96-199: LGTM! Excellent centralization of meeting type UI configuration.

The new interfaces and constants provide a clean, maintainable approach to meeting type styling:

  • MeetingTypeConfig captures all styling variants (colors, borders, icons) in one place
  • MEETING_TYPE_CONFIGS maps each meeting type to its visual configuration
  • DEFAULT_MEETING_TYPE_CONFIG provides a sensible fallback for unrecognized types

This eliminates the need for scattered switch statements and makes it easy to add or modify meeting types in the future.

apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html (1)

5-92: Nice UI enhancements with colored borders and improved layout.

The restructured layout with dynamic colored left borders, consolidated feature icons, and updated attachment styling improves the visual hierarchy and user experience. The use of data-testid attributes throughout ensures good test coverage.

apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.ts (2)

34-42: Excellent refactor: code duplication eliminated.

Both meetingTypeInfo and borderColorClass now derive their values from the centralized MEETING_TYPE_CONFIGS and DEFAULT_MEETING_TYPE_CONFIG constants. This resolves the previous code duplication issue where meeting type mappings were hardcoded in multiple switch statements.

Also applies to: 135-139


155-189: Well-implemented join URL pre-fetching with proper safeguards.

The reactive join URL flow correctly:

  • Only fetches URLs for today's meetings when users are authenticated
  • Gracefully falls back to null on errors (handled in template with @else block)
  • Matches existing meeting-join component logic for URL parameter encoding
  • Uses proper RxJS operators for stream composition

The authentication and date checks ensure URLs are only fetched when needed, avoiding unnecessary API calls.


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 enhances the dashboard meeting card component by adding direct meeting join functionality, visual improvements, and loading states. Key changes include fetching join URLs directly for today's meetings, redesigning the card layout with colored borders and improved button actions, and adding loading skeleton UI.

  • Integrated direct join URL fetching for authenticated users on today's meetings
  • Redesigned meeting card UI with meeting-type colored borders and reorganized layout
  • Added loading state skeleton UI to the my-meetings dashboard component

Reviewed Changes

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

Show a summary per file
File Description
dashboard-meeting-card.component.ts Added join URL fetching logic, removed output event, added color and styling computed signals
dashboard-meeting-card.component.html Redesigned layout with colored borders, direct join buttons, and improved visual hierarchy
button.component.html Added type attribute and ngClass binding support for anchor elements
my-meetings.component.ts Added loading signal and removed unused handleSeeMeeting method
my-meetings.component.html Added skeleton loading state UI
Comments suppressed due to low confidence (3)

apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html:134

            type="button"

apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html:142

            rel="noopener noreferrer"

apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html:125

            rel="noopener noreferrer"

💡 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 (3)
apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.ts (1)

218-226: Replace deprecated unescape() with modern encoding approach.

The method uses the deprecated unescape() function in the encoding chain. While the comment indicates this matches the meeting-join component logic, consider using a modern approach for Unicode-safe base64 encoding.

Replace the deprecated unescape() with a TextEncoder-based approach:

   private buildJoinUrlWithParams(joinUrl: string, user: User): string {
     const displayName = user.name || user.email;
-    const encodedName = btoa(unescape(encodeURIComponent(displayName)));
+    // Modern Unicode-safe base64 encoding
+    const encodedName = btoa(
+      String.fromCharCode(...new TextEncoder().encode(displayName))
+    );

     const queryParams = new HttpParams().set('uname', displayName).set('un', encodedName);

     const separator = joinUrl.includes('?') ? '&' : '?';
     return `${joinUrl}${separator}${queryParams.toString()}`;
   }

Note: If you update this, ensure the meeting-join component uses the same encoding logic for consistency.

apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html (2)

5-7: Clarify border styling: combine border and border-l-4 creates unintended borders.

Line 7 applies both border (1px on all sides) and border-l-4 (4px on left), resulting in 1px borders on top/right/bottom plus a 4px left border. If the intent is only a colored left border, remove the border class.

-  <div aria-hidden="true" class="absolute border border-l-4 border-solid inset-0 pointer-events-none rounded-xl" [ngClass]="borderColorClass()"></div>
+  <div aria-hidden="true" class="absolute border-l-4 inset-0 pointer-events-none rounded-xl" [ngClass]="borderColorClass()"></div>

Additionally, border-solid is redundant in Tailwind (borders are solid by default).


102-113: Remove duplicate w-full class and reconsider type="button" usage.

Minor issues in the See Meeting Details button:

  1. Line 103: The wrapper has class="w-full" and line 110 includes w-full in styleClass, creating duplication.
  2. Line 108: type="button" may not apply correctly when using routerLink, as the button component likely renders an anchor tag for navigation.
   <lfx-button
-    class="w-full"
     label="See Meeting Details"
     [routerLink]="['/meetings', meeting().uid]"
     [queryParams]="{ password: meeting().password || '' }"
     target="_blank"
-    type="button"
     rel="noopener noreferrer"
     [styleClass]="'border border-gray-300 text-gray-900 hover:bg-gray-50 h-8 text-sm font-medium w-full'"
     [outlined]="true"
     icon="fa-light fa-up-right-from-square text-xs"
     data-testid="dashboard-meeting-card-see-button" />
📜 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 bb81511 and 1ad5d77.

📒 Files selected for processing (5)
  • apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.html (1 hunks)
  • apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.ts (2 hunks)
  • apps/lfx-one/src/app/shared/components/button/button.component.html (2 hunks)
  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html (1 hunks)
  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.ts (4 hunks)
🧰 Additional context used
📓 Path-based instructions (4)
apps/lfx-one/src/**/*.html

📄 CodeRabbit inference engine (CLAUDE.md)

apps/lfx-one/src/**/*.html: Always add data-testid attributes when creating new Angular components for reliable test targeting
Use data-testid naming convention [section]-[component]-[element]

Files:

  • apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.html
  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html
  • apps/lfx-one/src/app/shared/components/button/button.component.html
**/*.{ts,tsx,js,jsx,mjs,cjs,html,css,scss}

📄 CodeRabbit inference engine (CLAUDE.md)

Include required license headers on all source files

Files:

  • apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.html
  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html
  • apps/lfx-one/src/app/shared/components/button/button.component.html
  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.ts
  • apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Use TypeScript interfaces instead of union types for better maintainability
When defining PrimeNG-related types, reference the official PrimeNG component interfaces

Files:

  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.ts
  • apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.ts
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Do not nest ternary expressions

Files:

  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.ts
  • apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.ts
🧠 Learnings (1)
📚 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/dashboards/components/my-meetings/my-meetings.component.html
  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html
  • apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.ts
  • apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.ts
🧬 Code graph analysis (1)
apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.ts (2)
packages/shared/src/interfaces/meeting.interface.ts (2)
  • Meeting (75-150)
  • MeetingOccurrence (156-167)
packages/shared/src/interfaces/auth.interface.ts (1)
  • User (8-41)
🔇 Additional comments (6)
apps/lfx-one/src/app/shared/components/button/button.component.html (1)

26-27: LGTM! Style and class bindings added correctly.

The addition of [style]="style()" and [ngClass]="styleClass()" bindings enables dynamic styling for anchor buttons, consistent with the button element variant.

apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.html (2)

21-26: LGTM! Loading skeleton implementation is clean.

The loading state with two 140px skeleton loaders matches the expected card dimensions and provides good visual feedback during data fetch.


27-65: LGTM! Meeting list structure is well-organized.

The conditional rendering flow (loading → meeting list → empty state) is intuitive, and removing the onSeeMeeting bindings aligns with the new navigation approach. The data-testid attributes follow the correct naming convention.

apps/lfx-one/src/app/shared/components/dashboard-meeting-card/dashboard-meeting-card.component.html (2)

10-19: LGTM! Badge layout is clean and well-structured.

The meeting type and project badges in the header provide clear visual hierarchy. The use of data-testid attributes enables reliable testing.


22-97: LGTM! Title area layout is well-organized.

The consolidated layout with title, time, feature icons, and attachment icons provides a clean and intuitive card structure. The use of the fileTypeIcon pipe with ngClass for dynamic icon styling is implemented correctly.

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

5-12: LGTM! Imports correctly support the loading state feature.

The additions of signal, SkeletonModule, and rxjs operators (tap, finalize) properly support the new skeleton loading UI functionality.

Also applies to: 25-25

- Move MeetingTypeConfig and related constants to shared package
- Add comprehensive meeting type color mappings with all shade variations
- Move MeetingTypeBadge interface to shared library
- Move MeetingWithOccurrence interface to shared library
- Eliminate duplicate switch statements in dashboard-meeting-card component
- Update my-meetings component to use shared MeetingWithOccurrence interface

LFXV2-702

Signed-off-by: Asitha de Silva <[email protected]>
@asithade asithade merged commit 2f2fd9b into main Nov 4, 2025
6 checks passed
@asithade asithade deleted the feat/LFXV2-702 branch November 4, 2025 22:13
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