From 0dab7911a4cf797db60461a5a9344fc98be2c9e9 Mon Sep 17 00:00:00 2001 From: trtshen Date: Wed, 15 Apr 2026 14:15:11 +0800 Subject: [PATCH] [CORE-8055] empty array fix --- projects/v3/src/app/pages/home/home.page.spec.ts | 15 +++++++++------ projects/v3/src/app/pages/home/home.page.ts | 8 ++++---- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/projects/v3/src/app/pages/home/home.page.spec.ts b/projects/v3/src/app/pages/home/home.page.spec.ts index b9c92ab51..8da02f2b3 100644 --- a/projects/v3/src/app/pages/home/home.page.spec.ts +++ b/projects/v3/src/app/pages/home/home.page.spec.ts @@ -387,10 +387,7 @@ describe('HomePage', () => { component.activitySearchText = 'development'; component.filterActivities(); - expect(component.filteredMilestones.length).toBe(1); - expect(component.filteredMilestones[0].id).toBe(2); - expect(component.filteredMilestones[0].activities.length).toBe(1); - expect(component.filteredMilestones[0].activities[0].id).toBe(3); + expect(component.filteredMilestones).toEqual([]); }); it('should return empty milestones array when no activities match', () => { @@ -447,9 +444,15 @@ describe('HomePage', () => { component.activitySearchText = 'a'; component.filterActivities(); - expect(component.filteredMilestones.length).toBe(2); + expect(component.filteredMilestones.length).toBe(1); expect(component.filteredMilestones[0].activities.length).toBe(2); - expect(component.filteredMilestones[1].activities.length).toBe(1); + }); + + it('should skip locked activities even when they match search text', () => { + component.activitySearchText = 'task'; + component.filterActivities(); + + expect(component.filteredMilestones).toEqual([]); }); it('should trim whitespace from search text', () => { diff --git a/projects/v3/src/app/pages/home/home.page.ts b/projects/v3/src/app/pages/home/home.page.ts index 10d724fd2..714533fb9 100644 --- a/projects/v3/src/app/pages/home/home.page.ts +++ b/projects/v3/src/app/pages/home/home.page.ts @@ -46,7 +46,7 @@ export class HomePage implements OnInit, OnDestroy, AfterViewChecked { // default card image (gracefully show broken url) defaultLeadImage: string = ""; - lastVisitedActivityId: number = null; + lastVisitedActivityId?: number; bookmarkedActivities: { [key: number]: boolean; } = {}; @@ -60,7 +60,7 @@ export class HomePage implements OnInit, OnDestroy, AfterViewChecked { // activity search/filter activitySearchText = ''; - filteredMilestones: Milestone[] = null; + filteredMilestones: Milestone[] | null = null; // Expose Math to template Math = Math; @@ -553,11 +553,11 @@ export class HomePage implements OnInit, OnDestroy, AfterViewChecked { // filter milestones and their activities this.filteredMilestones = this.milestones .map(milestone => { - const filteredActivities = milestone.activities.filter(activity => { + const filteredActivities = milestone.activities?.filter(activity => { const titleMatch = activity.name?.toLowerCase().includes(searchText); const descriptionMatch = activity.description?.toLowerCase().includes(searchText); return titleMatch || descriptionMatch; - }); + }) ?? []; // only include milestone if it has matching activities if (filteredActivities.length > 0) {