Parcourir la source

fix(mobile): display scheduled lesson duration in course lists

彭峰 il y a 1 jour
Parent
commit
de9ba5b6af

+ 20 - 0
projects/xiaoshu-mobile/src/app/core/home-learning-modules.integration.spec.ts

@@ -321,6 +321,26 @@ describe('home learning modules', () => {
     });
   });
 
+  it('renders scheduled duration for new lessons without duplicating legacy duration labels', async () => {
+    user.set({ userId: 300, userName: 'coach', honeyName: '钱老师', groupId: 3 });
+    session.groupId.set(3);
+    const harness = await RouterTestingHarness.create('/pages/home/shop');
+    const center = harness.fixture.debugElement.query(By.directive(CourseCenterPageComponent)).componentInstance as CourseCenterPageComponent;
+    center.scheduleRange.set('all');
+    center.schedules.set([
+      { GeneralID: 1, Title: '可爱同学(单词课)', durationMinutes: 30, bxrq: '2026-10-19', sdsd: '15:00', dszt: 0 },
+      { GeneralID: 2, Title: '小黄(单词课)', durationMinutes: 60, bxrq: '2026-10-19', sdsd: '19:00', dszt: 0 },
+      { GeneralID: 3, Title: '熊小俊(60分钟练习)', durationMinutes: 60, bxrq: '2026-10-19', sdsd: '14:00', dszt: 0 },
+    ]);
+    harness.fixture.detectChanges();
+    const titles = Array.from(harness.routeNativeElement!.querySelectorAll('.schedule-copy strong')).map(element => element.textContent?.trim());
+    expect(titles).toEqual(['熊小俊(60分钟练习)', '可爱同学(单词课) · 30分钟', '小黄(单词课) · 60分钟']);
+    expect(center.scheduleTitle({ Title: '旧课(60分钟练习)', durationMinutes: 30 })).toBe('旧课(30分钟练习)');
+    for (const durationMinutes of [undefined, null, 0, -30, 'invalid']) {
+      expect(center.scheduleTitle({ Title: '旧课(60分钟练习)', durationMinutes })).toBe('旧课(60分钟练习)');
+    }
+  });
+
   it('keeps all today tasks cached across navigation and visibility', async () => {
     user.set({ userId: 300, userName: 'coach', honeyName: '张老师', groupId: 3 });
     session.groupId.set(3);

+ 10 - 1
projects/xiaoshu-mobile/src/app/features/course-center/course-center-page.component.ts

@@ -299,7 +299,16 @@ export class CourseCenterPageComponent implements OnInit, OnDestroy {
     return canStartTeacherLedLearning(this.session.groupId());
   }
 
-  scheduleTitle(item: Item): string { return String(item['Title'] ?? item['ctitle'] ?? '排课'); }
+  scheduleTitle(item: Item): string {
+    const title = String(item['Title'] ?? item['ctitle'] ?? '排课');
+    const minutes = Number(item['durationMinutes']);
+    if (!Number.isFinite(minutes) || minutes <= 0) return title;
+    // New appointments store duration separately; legacy titles already include it.
+    const duration = /\d+(?:\.\d+)?\s*分钟/;
+    return duration.test(title)
+      ? title.replace(duration, `${minutes}分钟`)
+      : `${title} · ${minutes}分钟`;
+  }
   scheduleTime(item: Item): string { return String(item['sdsd'] ?? item['yysj'] ?? '--'); }
   scheduleSubtitle(item: Item): string { return String(item['Subtitle'] ?? item['plxm'] ?? item['honeyname'] ?? ''); }
   scheduleId(item: Item): unknown { return item['GeneralID'] ?? item['ID'] ?? item['id']; }