diff --git a/apps/lfx-one/e2e/homepage.spec.ts b/apps/lfx-one/e2e/homepage.spec.ts index 50dc5336..54901943 100644 --- a/apps/lfx-one/e2e/homepage.spec.ts +++ b/apps/lfx-one/e2e/homepage.spec.ts @@ -113,7 +113,6 @@ test.describe('Homepage', () => { // Check for metrics in project cards using data-testids await expect(firstCard.getByTestId('metric-label').filter({ hasText: 'Meetings' })).toBeVisible(); await expect(firstCard.getByTestId('metric-label').filter({ hasText: 'Committees' })).toBeVisible(); - await expect(firstCard.getByTestId('metric-label').filter({ hasText: 'Mailing Lists' })).toBeVisible(); }); test('should filter projects when searching', async ({ page }) => { diff --git a/apps/lfx-one/e2e/project-dashboard.spec.ts b/apps/lfx-one/e2e/project-dashboard.spec.ts index 59b48533..9f7bd307 100644 --- a/apps/lfx-one/e2e/project-dashboard.spec.ts +++ b/apps/lfx-one/e2e/project-dashboard.spec.ts @@ -81,8 +81,8 @@ test.describe('Project Dashboard', () => { await expect(page.getByTestId('menu-item').filter({ hasText: 'Dashboard' })).toBeVisible(); await expect(page.getByTestId('menu-item').filter({ hasText: 'Meetings' })).toBeVisible(); await expect(page.getByTestId('menu-item').filter({ hasText: 'Committees' })).toBeVisible(); - await expect(page.getByTestId('menu-item').filter({ hasText: 'Mailing Lists' })).toBeVisible(); - await expect(page.getByTestId('menu-item').filter({ hasText: 'Settings' })).toBeVisible(); + // await expect(page.getByTestId('menu-item').filter({ hasText: 'Mailing Lists' })).toBeVisible(); + // await expect(page.getByTestId('menu-item').filter({ hasText: 'Settings' })).toBeVisible(); }); }); @@ -423,10 +423,10 @@ test.describe('Without Write Permissions', () => { await expect(page.getByTestId('menu-item').filter({ hasText: 'Dashboard' })).toBeVisible(); await expect(page.getByTestId('menu-item').filter({ hasText: 'Meetings' })).toBeVisible(); await expect(page.getByTestId('menu-item').filter({ hasText: 'Committees' })).toBeVisible(); - await expect(page.getByTestId('menu-item').filter({ hasText: 'Mailing Lists' })).toBeVisible(); + // await expect(page.getByTestId('menu-item').filter({ hasText: 'Mailing Lists' })).toBeVisible(); // Settings tab should also be accessible (though it may have limited functionality) - await expect(page.getByTestId('menu-item').filter({ hasText: 'Settings' })).toBeVisible(); + // await expect(page.getByTestId('menu-item').filter({ hasText: 'Settings' })).toBeVisible(); }); }); diff --git a/apps/lfx-one/src/app/layouts/project-layout/project-layout.component.html b/apps/lfx-one/src/app/layouts/project-layout/project-layout.component.html index 6524fde2..015c1823 100644 --- a/apps/lfx-one/src/app/layouts/project-layout/project-layout.component.html +++ b/apps/lfx-one/src/app/layouts/project-layout/project-layout.component.html @@ -68,6 +68,7 @@

+ diff --git a/apps/lfx-one/src/app/layouts/project-layout/project-layout.component.ts b/apps/lfx-one/src/app/layouts/project-layout/project-layout.component.ts index a751a06d..3f745309 100644 --- a/apps/lfx-one/src/app/layouts/project-layout/project-layout.component.ts +++ b/apps/lfx-one/src/app/layouts/project-layout/project-layout.component.ts @@ -71,12 +71,6 @@ export class ProjectLayoutComponent { routerLink: `/project/${this.projectSlug()}/committees`, routerLinkActiveOptions: { exact: false }, }, - { - label: 'Mailing Lists', - icon: 'fa-light fa-envelope text-amber-500', - routerLink: `/project/${this.projectSlug()}/mailing-lists`, - routerLinkActiveOptions: { exact: false }, - }, ]); public readonly metrics = computed(() => [ diff --git a/apps/lfx-one/src/app/modules/pages/home/home.component.html b/apps/lfx-one/src/app/modules/pages/home/home.component.html index c5814aa8..109858a1 100644 --- a/apps/lfx-one/src/app/modules/pages/home/home.component.html +++ b/apps/lfx-one/src/app/modules/pages/home/home.component.html @@ -40,7 +40,7 @@

@if (projects().length > 0) { -
+
@for (project of filteredProjects(); track project.uid; let i = $index) {
+ [metrics]="project.metrics" + class="h-full">
}
diff --git a/apps/lfx-one/src/app/modules/pages/home/home.component.ts b/apps/lfx-one/src/app/modules/pages/home/home.component.ts index 1461b3e9..ecc83900 100644 --- a/apps/lfx-one/src/app/modules/pages/home/home.component.ts +++ b/apps/lfx-one/src/app/modules/pages/home/home.component.ts @@ -53,11 +53,6 @@ export class HomeComponent { value: project.committees_count, icon: 'fa-light fa-people-group text-green-500', }, - { - label: 'Mailing Lists', - value: project.mailing_list_count, - icon: 'fa-light fa-envelope text-amber-500', - }, ]; return { diff --git a/apps/lfx-one/src/app/modules/project/dashboard/project-dashboard/project.component.html b/apps/lfx-one/src/app/modules/project/dashboard/project-dashboard/project.component.html index a86f2d84..e8b4b656 100644 --- a/apps/lfx-one/src/app/modules/project/dashboard/project-dashboard/project.component.html +++ b/apps/lfx-one/src/app/modules/project/dashboard/project-dashboard/project.component.html @@ -156,7 +156,7 @@ -
+
@if (meetingsLoading()) {
@@ -267,39 +267,6 @@

No Committees

}
-
- -
-

Recently Joined Mailing Lists

- - - - - Mailing List - - -
- Last Updated -
- - -
- - - - {{ row.title }} - - -
- {{ row.date | date: 'MMM d, yyyy @ h:mm a' }} -
- - -
-
-
-
-
diff --git a/apps/lfx-one/src/app/shared/components/project-card/project-card.component.html b/apps/lfx-one/src/app/shared/components/project-card/project-card.component.html index 5d888a01..b448081a 100644 --- a/apps/lfx-one/src/app/shared/components/project-card/project-card.component.html +++ b/apps/lfx-one/src/app/shared/components/project-card/project-card.component.html @@ -5,60 +5,58 @@ class="bg-white rounded-lg border border-gray-200 shadow-sm hover:shadow-md transition-shadow cursor-pointer h-full" [routerLink]="['/project', url()]" data-testid="project-card-container"> -
+
-
+
- -
- - -
-

- {{ name() }} -

-

- {{ description() }} -

+
+ +
+

+ {{ name() }} +

+
+

+ {{ description() }} +

- - @if (metrics().length > 0) { -
- @for (metric of metrics(); track metric.label) { -
-
- - {{ metric.label }} -
-
- @if (metric.badge) { - - {{ metric.badge.label }} - - } @else { - {{ metric.value || 0 }} - } -
+ + @if (metrics().length > 0) { +
+ @for (metric of metrics(); track metric.label) { +
+
+ + {{ metric.label }} +
+
+ @if (metric.badge) { + + {{ metric.badge.label }} + + } @else { + {{ metric.value || 0 }} + } +
+
+ }
}
- } +
diff --git a/apps/lfx-one/src/server/controllers/project.controller.ts b/apps/lfx-one/src/server/controllers/project.controller.ts index f64457c4..cf05cf5b 100644 --- a/apps/lfx-one/src/server/controllers/project.controller.ts +++ b/apps/lfx-one/src/server/controllers/project.controller.ts @@ -5,6 +5,8 @@ import { NextFunction, Request, Response } from 'express'; import { ServiceValidationError } from '../errors'; import { Logger } from '../helpers/logger'; +import { CommitteeService } from '../services/committee.service'; +import { MeetingService } from '../services/meeting.service'; import { ProjectService } from '../services/project.service'; /** @@ -12,6 +14,8 @@ import { ProjectService } from '../services/project.service'; */ export class ProjectController { private projectService: ProjectService = new ProjectService(); + private meetingService: MeetingService = new MeetingService(); + private committeeService: CommitteeService = new CommitteeService(); /** * GET /projects @@ -25,6 +29,15 @@ export class ProjectController { // Get the projects const projects = await this.projectService.getProjects(req, req.query as Record); + // Add metrics to all projects + // TODO: Remove this once we have a way to get the metrics from the microservice + await Promise.all( + projects.map(async (project) => { + project.meetings_count = (await this.meetingService.getMeetings(req, { tags: `project_uid:${project.uid}` }).catch(() => [])).length; + project.committees_count = (await this.committeeService.getCommittees(req, { tags: `project_uid:${project.uid}` }).catch(() => [])).length; + }) + ); + Logger.success(req, 'get_projects', startTime, { project_count: projects.length, }); @@ -68,6 +81,15 @@ export class ProjectController { // Search for the projects const results = await this.projectService.searchProjects(req, q); + // Add metrics to all projects + // TODO: Remove this once we have a way to get the metrics from the microservice + await Promise.all( + results.map(async (project) => { + project.meetings_count = (await this.meetingService.getMeetings(req, { tags: `project_uid:${project.uid}` }).catch(() => [])).length; + project.committees_count = (await this.committeeService.getCommittees(req, { tags: `project_uid:${project.uid}` }).catch(() => [])).length; + }) + ); + // Log the success Logger.success(req, 'search_projects', startTime, { result_count: results.length,