-
Notifications
You must be signed in to change notification settings - Fork 0
refactor(architecture): major codebase cleanup and reorganization #169
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
This is a comprehensive refactoring effort that improves code organization, removes unused code, and enhances the overall architecture: - LFXV2-769: Reorganized meeting components from shared to meetings module - LFXV2-770: Removed unused project module and routes - LFXV2-771: Removed deprecated E2E test files - LFXV2-772: Optimized service layer by removing unused services - LFXV2-773: Enhanced styling system with new Tailwind utilities Changes summary: - 118 files changed, 378 insertions(+), 6662 deletions(-) - Improved module boundaries and component organization - Reduced bundle size by removing 6600+ lines of unused code - Enhanced design system with better utility classes Signed-off-by: Asitha de Silva <[email protected]>
WalkthroughThis pull request performs a comprehensive refactor of the LFX V2 UI codebase, consolidating badge rendering into a reusable tag component, removing legacy project/mailing-list dashboard features, removing E2E tests, renaming meeting registrant components, and migrating import paths to new alias conventions throughout the application. Changes
Sequence Diagram(s)sequenceDiagram
actor User
participant MeetingsDashboard
participant MeetingsTopBar
participant MeetingCard
participant TagComponent
Note over User,TagComponent: Old Flow (with List/Calendar View)
User->>MeetingsDashboard: View meetings
MeetingsDashboard->>MeetingsTopBar: render with view toggle
MeetingsTopBar->>MeetingsDashboard: currentView = 'list'|'calendar'
MeetingsDashboard->>MeetingCard: render conditional on view
MeetingCard->>MeetingCard: render inline badges
Note over User,TagComponent: New Flow (List Only)
User->>MeetingsDashboard: View meetings
MeetingsDashboard->>MeetingsTopBar: render with search only
MeetingsTopBar->>MeetingsDashboard: search via reactive form
MeetingsDashboard->>MeetingCard: render filtered meetings
MeetingCard->>TagComponent: render meeting badges
TagComponent->>User: unified tag rendering
sequenceDiagram
participant MeetingCardComponent
participant BadgeMapping
participant TagComponent
Note over MeetingCardComponent,TagComponent: Meeting Type Badge Transformation
MeetingCardComponent->>BadgeMapping: meetingTypeBadge signal
Note over BadgeMapping: OLD: {badgeClass, icon?, text}<br/>NEW: {badgeClass, severity, icon?, text}
BadgeMapping->>BadgeMapping: Add severity field<br/>(info|success|warn|danger|secondary|contrast)
BadgeMapping->>TagComponent: Pass {value, severity, icon}
TagComponent->>TagComponent: Render PrimeNG tag
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Areas requiring extra attention:
Possibly related PRs
Suggested labels
Pre-merge checks and finishing touches✅ Passed checks (5 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this 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 comprehensive codebase refactoring focused on improving code organization, removing unused code, and enhancing the architecture. The changes include moving meeting components from shared to the meetings module, removing unused project dashboard and activity functionality, deleting deprecated E2E tests, optimizing the service layer, and adding new tag and typography systems.
Key Changes:
- Relocated meeting-related components to appropriate modules with clearer boundaries
- Removed ~3,500 lines of unused code including project dashboard, activity service, and deprecated E2E tests
- Added comprehensive typography system and tag component with centralized styling configuration
Reviewed Changes
Copilot reviewed 110 out of 122 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
packages/shared/src/interfaces/permissions.interface.ts |
Added optional severity property to PermissionMatrixItem badge |
packages/shared/src/interfaces/components.interface.ts |
Added TagProps and TagSeverityOptions interfaces for new tag component |
packages/shared/src/interfaces/activity.interface.ts |
Removed unused activity interface definitions |
packages/shared/src/constants/typography.constants.ts |
Added comprehensive typography system with font families, sizes, and patterns |
packages/shared/src/constants/tag.constants.ts |
Added tag type configurations and committee category severity mappings |
packages/shared/src/constants/meeting.constants.ts |
Extended MeetingTypeBadge with severity and icon properties |
apps/lfx-one/src/server/services/supabase.service.ts |
Removed unused methods, streamlined to focus on email management |
apps/lfx-one/src/server/routes/projects.route.ts |
Removed recent-activity endpoint |
apps/lfx-one/src/app/shared/services/activity.service.ts |
Removed unused activity service |
apps/lfx-one/src/app/shared/components/tag/tag.component.ts |
Added new reusable tag component wrapper |
apps/lfx-one/src/app/modules/meetings/* |
Reorganized meeting components with clearer module boundaries |
apps/lfx-one/e2e/*.spec.ts |
Removed deprecated E2E test files |
apps/lfx-one/.env.example |
Updated database configuration comments |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 6
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
apps/lfx-one/src/app/modules/meetings/meeting-not-found/meeting-not-found.component.html (1)
49-49: Fix malformed Tailwind class concatenation on action buttons row.The class attribute has a spacing/concatenation error:
sm:items-centerflex-colconcatenates two distinct Tailwind classes without a space separator. This breaks Tailwind parsing and produces incorrect responsive layout behavior.Apply this diff to fix the class attribute:
- <div class="flex sm:items-centerflex-col sm:flex-row gap-6 justify-center"> + <div class="flex sm:items-center flex-col sm:flex-row gap-6 justify-center">This ensures the button row properly centers items on small screens and switches to a row layout on tablet/desktop breakpoints.
apps/lfx-one/src/server/services/supabase.service.ts (1)
228-269:updateEmailPreferenceshas a small race and assumes non-empty responsesThere’s a check‑then‑create pattern: two concurrent calls could both see no existing preferences and attempt to create, depending on DB constraints leading to either duplicates or a failed insert. Also, both the create and update branches assume
result[0]exists; an empty array (e.g., if no rows matched the PATCH) would returnundefineddespite theEmailPreferencesreturn type. Consider using an atomic upsert pattern or handling insert conflicts, and add a simple guard that throws if the response array is empty before returning.
🧹 Nitpick comments (13)
apps/lfx-one/src/app/modules/settings/components/user-permissions-table/user-permissions-table.component.ts (1)
81-82: Consider reformatting the multiline string for better readability.The confirmation message spans multiple lines with inconsistent indentation. Consider using a template literal with proper formatting for improved code readability.
Apply this diff to improve formatting:
- message: `Are you sure you want to remove ${userName} from this project? This will revoke all their permissions for this project - and cannot be undone.`, + message: `Are you sure you want to remove ${userName} from this project? ` + + `This will revoke all their permissions for this project and cannot be undone.`,apps/lfx-one/src/app/modules/meetings/components/meeting-delete-type-selection/meeting-delete-type-selection.component.ts (1)
24-24: Optional: Consider defensive null check.While the dialog data is typically provided when opening this dialog, adding a null check would make the component more defensive against unexpected usage.
- public readonly meeting: Meeting = this.dialogConfig.data.meeting; + public readonly meeting: Meeting = this.dialogConfig.data?.meeting;Alternatively, you could provide a fallback or throw a more descriptive error if data is missing. However, this is a low-priority improvement given that the component likely functions correctly in its current usage contexts.
apps/lfx-one/src/server/services/supabase.service.ts (2)
4-20: Consider failing fast when required Supabase env vars are missing
SUPABASE_URLandPOSTGRES_API_KEYare used without validation, so misconfiguration yields a base URL likeundefined/rest/v1and an empty API key, causing opaque downstream failures. Consider throwing a clear error in the constructor if either is missing so misconfigurations surface early in logs.
136-198: Primary email update is non-transactional; consider reducing race window
setPrimaryEmailperforms two separate updates (unset current primary, then set new primary). Under concurrent updates for the same user, there is a brief window where no primary exists or another request could change the state in between. If you expect concurrent changes, consider consolidating this into a single backend operation (e.g., stored function/RPC or DB-side transaction) that atomically moves the primary flag.apps/lfx-one/src/app/modules/dashboards/components/dashboard-meeting-card/dashboard-meeting-card.component.ts (1)
47-59: Consider more robust color-to-severity mapping.The current implementation uses
includes()to detect color keywords inconfig.textColor, which may be fragile if the color string format changes or contains unexpected values.Consider:
- If
MEETING_TYPE_CONFIGSprovides structured color values, use those directly instead of string parsing.- Add a default mapping or severity field to
MEETING_TYPE_CONFIGSto avoid runtime color string parsing.- Alternatively, add validation or logging for unmatched colors to detect configuration issues.
Example improvement if config structure can be enhanced:
// In the shared constants file, add severity directly to config export const MEETING_TYPE_CONFIGS = { webinar: { label: 'Webinar', severity: 'info' as const, // ... other fields }, // ... };Then use:
const severity = config.severity ?? 'secondary';packages/shared/src/interfaces/components.interface.ts (1)
10-13: Consider consolidating duplicate severity types.
TagSeverityOptionsandBadgeSeverityOptionsdefine identical severity type unions. Consider extracting a shared base type to follow DRY principles:type SeverityLevel = 'info' | 'success' | 'warn' | 'danger' | 'secondary' | 'contrast'; export interface BadgeSeverityOptions { severity: SeverityLevel; } export interface TagSeverityOptions { severity: SeverityLevel; }This would make future severity updates easier to maintain across both badge and tag components.
Also applies to: 41-48
apps/lfx-one/src/app/modules/meetings/meetings-dashboard/components/meetings-top-bar/meetings-top-bar.component.ts (1)
6-7: Reactive search form wiring looks good; consider optional model→form syncThe switch to a reactive
searchFormthat pushesvalueChangesinto thesearchQuerysignal is consistent with howMeetingsDashboardComponentconsumessearchQueryand should behave as expected. The unconditionaltimeFilter.set(value)also aligns with how the dashboard drives upcoming vs. past meeting loading.One optional improvement: if you ever need to initialize or update
searchQueryfrom the parent (e.g., via route params or a “preset search”), this component currently doesn’t reflect that back into the form control. You could, in the future, add a small effect/valueChangesbridge fromthis.searchQuery()intothis.searchForm(or set the initial control value fromthis.searchQuery()in the constructor) to keep them fully in sync.Also applies to: 13-13, 24-38, 41-42
packages/shared/src/constants/typography.constants.ts (1)
78-95: Consider differentiating h4, h5, and h6 styles.Currently, h4, h5, and h6 have identical typography definitions (0.875rem / 400 / 1.5). While this might be intentional for this design system, typical typographic hierarchies differentiate these heading levels through weight or size variations.
If differentiation is needed, consider:
/** H4 heading - 14px / text-sm / normal */ h4: { size: '0.875rem', weight: 400, lineHeight: 1.5, }, /** H5 heading - 14px / text-sm / normal */ h5: { size: '0.875rem', - weight: 400, + weight: 500, lineHeight: 1.5, }, /** H6 heading - 14px / text-sm / normal */ h6: { size: '0.875rem', - weight: 400, + weight: 600, lineHeight: 1.5, },apps/lfx-one/src/app/modules/committees/committee-dashboard/committee-dashboard.component.html (1)
75-101: Check empty‑state branching for cases without a project contextThe logic:
@if (committees().length === 0 && project()?.uid) { ... } } @else if (filteredCommittees().length === 0) { ... }means that if there are zero committees but
project()?.uidis falsy, the second branch will show “No {{ committeeLabelPlural.toLowerCase() }} match your filters” even though the real situation is “no committees exist”.If this dashboard is ever rendered without a valid
project()?.uid, consider either:
- treating “no project” as an error/loading state, or
- changing the conditions so the “no committees exist” message also covers the
!project()?.uidcase whencommittees().length === 0.apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.ts (1)
11-13: Category severity computation is sound; optional type alignmentThe new
categorySeveritysignal correctly derives a severity fromCOMMITTEE_CATEGORY_SEVERITYand safely falls back to'secondary'when the committee or its category is missing or unmapped. This should keep the UI robust as categories evolve.Optionally, you could type
categorySeverityin terms of the shared tag severity type (e.g., via the same alias used byTagProps['severity']) so it stays automatically in sync with the Tag system, rather than repeating the string union here. Not required, but it can reduce drift over time.Also applies to: 30-35, 62-79
apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts (1)
8-22: Meeting badge + delete/cancel wiring look correct; consider deduping badge logic
- The new imports (delete/cancel modals, RSVP group, registrants display, TagComponent, pipes) and their registration in
importsare consistent with how they’re used later in the component/template.meetingTypeBadgenow exposesseverityalongsidebadgeClass,icon, andtext, andinitMeetingTypeBadge()maps meeting types to severities in a way that matches the new tag system.- The recurring vs single-meeting delete flow (
deleteMeeting,showCancelOccurrenceModal,showDeleteMeetingModal) correctly distinguishes canceling a single occurrence from deleting the entire series and emitsmeetingDeletedin both success paths.Given the identical
meetingTypeBadgeswitch here and inMeetingJoinComponent, you might later want to extract a shared helper/type (e.g., in shared meeting constants) to avoid future divergence, but it’s fine as-is.Also applies to: 41-46, 56-58, 120-125, 360-422, 569-595
packages/shared/src/constants/tag.constants.ts (1)
4-58: Centralized tag configs are well‑structured and type‑safe enough
TagTypeConfigandTAG_TYPE_CONFIGSgive a clear, centralized place to manage tag severity/icon/rounding, which should simplify consistent styling across the app. UsingTagProps['severity']ties the config to the TagComponent API, so severity values will stay compatible.If you ever need stronger guarantees around keys (e.g., to drive autocomplete), you could replace
Record<string, TagTypeConfig>with a keyed union type, but what you have now is perfectly serviceable.apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts (1)
11-19: Meeting-join badge + registrants/tag wiring look consistent with meeting-card
- Swapping in
MeetingRegistrantsDisplayComponent,RsvpButtonGroupComponent, andTagComponentin the imports and template wiring keeps this view aligned with the new meetings UI architecture.- The
meetingTypeBadgesignal now includesseverityand uses the same mapping asMeetingCardComponent, so both screens will render meeting-type tags consistently.showRegistrantsandonRegistrantsToggleprovide a simple, clear toggle for the new registrants display component.As with
MeetingCardComponent, you might eventually want to share themeetingTypeBadgemapping between the two components to avoid duplication, but it’s fine for now.Also applies to: 22-25, 32-48, 76-82, 246-271
📜 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 (110)
README.md(2 hunks)apps/lfx-one/.env.example(1 hunks)apps/lfx-one/e2e/helpers/api-mock.helper.ts(1 hunks)apps/lfx-one/e2e/homepage-robust.spec.ts(0 hunks)apps/lfx-one/e2e/homepage.spec.ts(0 hunks)apps/lfx-one/e2e/project-dashboard-robust.spec.ts(0 hunks)apps/lfx-one/e2e/project-dashboard.spec.ts(0 hunks)apps/lfx-one/src/app/app.routes.ts(0 hunks)apps/lfx-one/src/app/layouts/main-layout/main-layout.component.html(1 hunks)apps/lfx-one/src/app/layouts/main-layout/main-layout.component.ts(1 hunks)apps/lfx-one/src/app/layouts/profile-layout/components/profile-stats/profile-stats.component.ts(1 hunks)apps/lfx-one/src/app/layouts/profile-layout/profile-layout.component.ts(1 hunks)apps/lfx-one/src/app/layouts/project-layout/project-layout.component.ts(1 hunks)apps/lfx-one/src/app/modules/committees/committee-dashboard/committee-dashboard.component.html(4 hunks)apps/lfx-one/src/app/modules/committees/committee-dashboard/committee-dashboard.component.ts(1 hunks)apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.html(2 hunks)apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.ts(4 hunks)apps/lfx-one/src/app/modules/committees/committees.routes.ts(1 hunks)apps/lfx-one/src/app/modules/committees/components/committee-form/committee-form.component.html(2 hunks)apps/lfx-one/src/app/modules/committees/components/committee-form/committee-form.component.ts(1 hunks)apps/lfx-one/src/app/modules/committees/components/committee-table/committee-table.component.html(1 hunks)apps/lfx-one/src/app/modules/committees/components/committee-table/committee-table.component.ts(3 hunks)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(1 hunks)apps/lfx-one/src/app/modules/dashboards/components/dashboard-meeting-card/dashboard-meeting-card.component.html(1 hunks)apps/lfx-one/src/app/modules/dashboards/components/dashboard-meeting-card/dashboard-meeting-card.component.ts(3 hunks)apps/lfx-one/src/app/modules/dashboards/components/foundation-health/foundation-health.component.html(1 hunks)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(1 hunks)apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.html(2 hunks)apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.ts(1 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/components/recent-progress/recent-progress.component.html(1 hunks)apps/lfx-one/src/app/modules/dashboards/components/recent-progress/recent-progress.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(1 hunks)apps/lfx-one/src/app/modules/dashboards/dashboard.component.ts(1 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(1 hunks)apps/lfx-one/src/app/modules/meetings/components/agenda-template-selector/agenda-template-selector.component.html(1 hunks)apps/lfx-one/src/app/modules/meetings/components/agenda-template-selector/agenda-template-selector.component.ts(1 hunks)apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html(3 hunks)apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.ts(7 hunks)apps/lfx-one/src/app/modules/meetings/components/meeting-delete-type-selection/meeting-delete-type-selection.component.ts(1 hunks)apps/lfx-one/src/app/modules/meetings/components/meeting-modal/meeting-modal.component.ts(1 hunks)apps/lfx-one/src/app/modules/meetings/components/meeting-platform-features/meeting-platform-features.component.html(1 hunks)apps/lfx-one/src/app/modules/meetings/components/meeting-registrants-display/meeting-registrants-display.component.ts(1 hunks)apps/lfx-one/src/app/modules/meetings/components/meeting-registrants-manager/meeting-registrants-manager.component.ts(2 hunks)apps/lfx-one/src/app/modules/meetings/components/meeting-resources-summary/meeting-resources-summary.component.html(1 hunks)apps/lfx-one/src/app/modules/meetings/components/meeting-rsvp-details/meeting-rsvp-details.component.ts(1 hunks)apps/lfx-one/src/app/modules/meetings/components/meeting-type-selection/meeting-type-selection.component.html(1 hunks)apps/lfx-one/src/app/modules/meetings/components/rsvp-button-group/rsvp-button-group.component.ts(1 hunks)apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.html(3 hunks)apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts(5 hunks)apps/lfx-one/src/app/modules/meetings/meeting-manage/meeting-manage.component.html(4 hunks)apps/lfx-one/src/app/modules/meetings/meeting-manage/meeting-manage.component.ts(2 hunks)apps/lfx-one/src/app/modules/meetings/meeting-not-found/meeting-not-found.component.html(1 hunks)apps/lfx-one/src/app/modules/meetings/meetings-dashboard/components/meetings-top-bar/meetings-top-bar.component.html(1 hunks)apps/lfx-one/src/app/modules/meetings/meetings-dashboard/components/meetings-top-bar/meetings-top-bar.component.ts(1 hunks)apps/lfx-one/src/app/modules/meetings/meetings-dashboard/meetings-dashboard.component.html(3 hunks)apps/lfx-one/src/app/modules/meetings/meetings-dashboard/meetings-dashboard.component.ts(1 hunks)apps/lfx-one/src/app/modules/meetings/meetings.routes.ts(1 hunks)apps/lfx-one/src/app/modules/pages/home/home.component.html(1 hunks)apps/lfx-one/src/app/modules/pages/home/home.component.ts(1 hunks)apps/lfx-one/src/app/modules/profile/developer/profile-developer.component.ts(1 hunks)apps/lfx-one/src/app/modules/profile/edit/profile-edit.component.ts(1 hunks)apps/lfx-one/src/app/modules/profile/email/profile-email.component.ts(1 hunks)apps/lfx-one/src/app/modules/profile/password/profile-password.component.ts(1 hunks)apps/lfx-one/src/app/modules/project/dashboard/project-dashboard/project.component.html(0 hunks)apps/lfx-one/src/app/modules/project/dashboard/project-dashboard/project.component.ts(0 hunks)apps/lfx-one/src/app/modules/project/mailing-lists/mailing-list-dashboard/mailing-list-dashboard.component.html(0 hunks)apps/lfx-one/src/app/modules/project/mailing-lists/mailing-list-dashboard/mailing-list-dashboard.component.ts(0 hunks)apps/lfx-one/src/app/modules/project/mailing-lists/mailing-lists.routes.ts(0 hunks)apps/lfx-one/src/app/modules/project/project.routes.ts(0 hunks)apps/lfx-one/src/app/modules/settings/components/permissions-matrix/permissions-matrix.component.html(1 hunks)apps/lfx-one/src/app/modules/settings/components/permissions-matrix/permissions-matrix.component.ts(3 hunks)apps/lfx-one/src/app/modules/settings/components/user-form/user-form.component.ts(1 hunks)apps/lfx-one/src/app/modules/settings/components/user-permissions-table/user-permissions-table.component.ts(1 hunks)apps/lfx-one/src/app/modules/settings/settings-dashboard/settings-dashboard.component.ts(1 hunks)apps/lfx-one/src/app/modules/settings/settings.routes.ts(1 hunks)apps/lfx-one/src/app/shared/components/header/header.component.ts(1 hunks)apps/lfx-one/src/app/shared/components/organization-search/organization-search.component.ts(1 hunks)apps/lfx-one/src/app/shared/components/persona-selector/persona-selector.component.ts(1 hunks)apps/lfx-one/src/app/shared/components/project-card/project-card.component.html(1 hunks)apps/lfx-one/src/app/shared/components/project-card/project-card.component.ts(2 hunks)apps/lfx-one/src/app/shared/components/project-selector/project-selector.component.html(1 hunks)apps/lfx-one/src/app/shared/components/project-selector/project-selector.component.ts(1 hunks)apps/lfx-one/src/app/shared/components/sidebar/sidebar.component.html(1 hunks)apps/lfx-one/src/app/shared/components/sidebar/sidebar.component.ts(1 hunks)apps/lfx-one/src/app/shared/components/tag/tag.component.html(1 hunks)apps/lfx-one/src/app/shared/components/tag/tag.component.ts(1 hunks)apps/lfx-one/src/app/shared/components/user-search/user-search.component.ts(1 hunks)apps/lfx-one/src/app/shared/interceptors/authentication.interceptor.ts(1 hunks)apps/lfx-one/src/app/shared/providers/feature-flag.provider.ts(1 hunks)apps/lfx-one/src/app/shared/services/activity.service.ts(0 hunks)apps/lfx-one/src/server/routes/projects.route.ts(1 hunks)apps/lfx-one/src/server/services/supabase.service.ts(1 hunks)apps/lfx-one/src/styles.scss(2 hunks)apps/lfx-one/tailwind.config.js(1 hunks)charts/lfx-v2-ui/README.md(1 hunks)docs/architecture.md(0 hunks)packages/shared/src/constants/index.ts(2 hunks)packages/shared/src/constants/meeting.constants.ts(1 hunks)packages/shared/src/constants/tag.constants.ts(1 hunks)packages/shared/src/constants/typography.constants.ts(1 hunks)packages/shared/src/interfaces/activity.interface.ts(0 hunks)packages/shared/src/interfaces/components.interface.ts(2 hunks)packages/shared/src/interfaces/index.ts(0 hunks)packages/shared/src/interfaces/permissions.interface.ts(1 hunks)
💤 Files with no reviewable changes (15)
- apps/lfx-one/src/app/app.routes.ts
- packages/shared/src/interfaces/activity.interface.ts
- packages/shared/src/interfaces/index.ts
- apps/lfx-one/src/app/modules/project/project.routes.ts
- apps/lfx-one/src/app/modules/project/dashboard/project-dashboard/project.component.html
- apps/lfx-one/src/app/shared/services/activity.service.ts
- apps/lfx-one/e2e/project-dashboard.spec.ts
- apps/lfx-one/e2e/homepage-robust.spec.ts
- apps/lfx-one/e2e/homepage.spec.ts
- apps/lfx-one/src/app/modules/project/dashboard/project-dashboard/project.component.ts
- apps/lfx-one/src/app/modules/project/mailing-lists/mailing-list-dashboard/mailing-list-dashboard.component.html
- docs/architecture.md
- apps/lfx-one/e2e/project-dashboard-robust.spec.ts
- apps/lfx-one/src/app/modules/project/mailing-lists/mailing-list-dashboard/mailing-list-dashboard.component.ts
- apps/lfx-one/src/app/modules/project/mailing-lists/mailing-lists.routes.ts
🧰 Additional context used
🧠 Learnings (2)
📚 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/maintainer/maintainer-dashboard.component.tsapps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.htmlapps/lfx-one/src/app/modules/meetings/components/meeting-type-selection/meeting-type-selection.component.htmlapps/lfx-one/src/app/modules/meetings/components/meeting-platform-features/meeting-platform-features.component.htmlapps/lfx-one/src/app/modules/meetings/components/meeting-resources-summary/meeting-resources-summary.component.htmlapps/lfx-one/src/app/modules/meetings/components/meeting-delete-type-selection/meeting-delete-type-selection.component.tsapps/lfx-one/src/app/modules/meetings/components/agenda-template-selector/agenda-template-selector.component.tsapps/lfx-one/src/app/modules/meetings/components/meeting-rsvp-details/meeting-rsvp-details.component.tsapps/lfx-one/src/app/modules/meetings/components/agenda-template-selector/agenda-template-selector.component.htmlapps/lfx-one/src/app/modules/meetings/components/meeting-registrants-display/meeting-registrants-display.component.tsapps/lfx-one/src/app/modules/dashboards/components/dashboard-meeting-card/dashboard-meeting-card.component.htmlapps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.tsapps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.tsapps/lfx-one/src/app/modules/meetings/meeting-manage/meeting-manage.component.tsapps/lfx-one/src/app/modules/dashboards/components/dashboard-meeting-card/dashboard-meeting-card.component.tsapps/lfx-one/src/app/modules/meetings/meetings-dashboard/meetings-dashboard.component.tsapps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.tsapps/lfx-one/src/app/modules/meetings/meeting-manage/meeting-manage.component.htmlapps/lfx-one/src/app/modules/meetings/meetings-dashboard/meetings-dashboard.component.htmlapps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.htmlapps/lfx-one/src/app/modules/meetings/meetings-dashboard/components/meetings-top-bar/meetings-top-bar.component.htmlapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.htmlapps/lfx-one/src/app/modules/meetings/components/meeting-modal/meeting-modal.component.tsapps/lfx-one/src/app/modules/meetings/meeting-not-found/meeting-not-found.component.htmlapps/lfx-one/src/app/modules/profile/edit/profile-edit.component.tsapps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.tsapps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.tsapps/lfx-one/src/app/modules/meetings/meetings-dashboard/components/meetings-top-bar/meetings-top-bar.component.ts
📚 Learning: 2025-10-31T14:39:34.343Z
Learnt from: mauriciozanettisalomao
Repo: linuxfoundation/lfx-v2-ui PR: 130
File: apps/lfx-one/src/server/controllers/profile.controller.ts:303-370
Timestamp: 2025-10-31T14:39:34.343Z
Learning: The synthetic timestamps (created_at, updated_at, verified_at) in the getUserEmails transformation for apps/lfx-one/src/server/controllers/profile.controller.ts are temporary placeholders. Real timestamps will be included in the NATS response once the Auth0 backend implementation is complete.
Applied to files:
apps/lfx-one/src/app/modules/profile/email/profile-email.component.tsapps/lfx-one/src/server/services/supabase.service.ts
🧬 Code graph analysis (8)
apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts (4)
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts (1)
Component(20-85)apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.ts (1)
Component(19-434)apps/lfx-one/src/app/modules/dashboards/core-developer/core-developer-dashboard.component.ts (1)
Component(13-25)apps/lfx-one/src/app/modules/dashboards/maintainer/maintainer-dashboard.component.ts (1)
Component(13-25)
apps/lfx-one/src/app/shared/components/project-selector/project-selector.component.ts (2)
apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.ts (1)
Component(19-434)apps/lfx-one/src/app/shared/components/sidebar/sidebar.component.ts (1)
Component(18-142)
packages/shared/src/constants/tag.constants.ts (1)
packages/shared/src/interfaces/components.interface.ts (1)
TagProps(54-65)
apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.ts (1)
packages/shared/src/constants/tag.constants.ts (1)
COMMITTEE_CATEGORY_SEVERITY(64-99)
apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.ts (5)
apps/lfx-one/src/app/modules/committees/committee-view/committee-view.component.ts (1)
Component(23-235)apps/lfx-one/src/app/modules/committees/components/committee-table/committee-table.component.ts (1)
Component(20-113)apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.ts (1)
Component(10-28)apps/lfx-one/src/app/modules/meetings/meeting-join/meeting-join.component.ts (1)
Component(34-439)apps/lfx-one/src/app/shared/components/project-selector/project-selector.component.ts (1)
Component(15-150)
apps/lfx-one/src/app/shared/components/tag/tag.component.ts (1)
packages/shared/src/interfaces/components.interface.ts (1)
TagProps(54-65)
apps/lfx-one/src/app/modules/committees/components/committee-table/committee-table.component.ts (1)
packages/shared/src/constants/tag.constants.ts (1)
COMMITTEE_CATEGORY_SEVERITY(64-99)
apps/lfx-one/src/app/modules/meetings/meetings-dashboard/components/meetings-top-bar/meetings-top-bar.component.ts (1)
apps/lfx-one/src/app/modules/meetings/meetings-dashboard/meetings-dashboard.component.ts (1)
Component(18-167)
Summary
Comprehensive refactoring effort that improves code organization, removes unused code, and enhances overall architecture.
Related JIRA Tickets
Changes
Component Architecture Refactoring (LFXV2-769)
shared/componentstomeetings/componentsModule Cleanup (LFXV2-770)
E2E Test Reorganization (LFXV2-771)
Service Layer Optimization (LFXV2-772)
Styling System Updates (LFXV2-773)
Impact
Validation