diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/resume-translate.service.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/resume-translate.service.spec.ts index b6328996cc8..9fec4101af5 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/resume-translate.service.spec.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/resume-translate.service.spec.ts @@ -2,7 +2,7 @@ import { fakeAsync, flush, TestBed, tick } from '@angular/core/testing'; import { ActivatedRouteSnapshot, NavigationEnd, Params, Router } from '@angular/router'; import { OtJson0Op } from 'ot-json0'; import { Json0OpBuilder } from 'realtime-server/lib/esm/common/utils/json0-op-builder'; -import { SFProject, SFProjectProfile } from 'realtime-server/lib/esm/scriptureforge/models/sf-project'; +import { SFProject } from 'realtime-server/lib/esm/scriptureforge/models/sf-project'; import { SFProjectUserConfig } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-user-config'; import { Chapter, TextInfo } from 'realtime-server/lib/esm/scriptureforge/models/text-info'; import { BehaviorSubject, Observable, of } from 'rxjs'; @@ -17,7 +17,6 @@ import { SFProjectUserConfigDoc } from '../../core/models/sf-project-user-config import { PermissionsService } from '../../core/permissions.service'; import { SFProjectService } from '../../core/sf-project.service'; import { ResumeTranslateService } from './resume-translate.service'; - describe('ResumeTranslateService', () => { const mockRouter = mock(Router); const mockUserService = mock(UserService); @@ -64,19 +63,19 @@ describe('ResumeTranslateService', () => { service = TestBed.inject(ResumeTranslateService); - when(mockedProjectDoc.data).thenReturn({ - texts: [{ bookNum: 40, chapters: [{ number: 1 } as Chapter, { number: 2 } as Chapter] } as TextInfo] - } as SFProject); + const testSFProject = { + texts: [ + { bookNum: 41, chapters: [{ number: 1 } as Chapter, { number: 2 } as Chapter] } as TextInfo, + { bookNum: 40, chapters: [{ number: 1 } as Chapter, { number: 2 } as Chapter] } as TextInfo + ] + } as SFProject; + + when(mockedProjectDoc.data).thenReturn(testSFProject); when(mockProjectService.getUserConfig(anything(), anything())).thenResolve({ changes$: of([]) as Observable, data: { selectedTask: 'checking', selectedBookNum: 40, selectedChapterNum: 2 } as SFProjectUserConfig } as SFProjectUserConfigDoc); - activatedProjectChange$.next({ - data: { - texts: [{ bookNum: 40, chapters: [{ number: 1 } as Chapter, { number: 2 } as Chapter] } as TextInfo] - } as SFProjectProfile - } as SFProjectProfileDoc); - + activatedProjectChange$.next({ data: testSFProject } as unknown as SFProjectProfileDoc); await service['updateProjectUserConfig']('project01'); }); diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/resume-translate.service.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/resume-translate.service.ts index eb13b71ae9e..6d52c3c4508 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/resume-translate.service.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/resume-translate.service.ts @@ -40,18 +40,23 @@ export class ResumeTranslateService extends ResumeBaseService { filter(([projectDoc, projectUserConfigDoc]) => projectDoc !== undefined && projectUserConfigDoc !== undefined), map(([projectDoc, projectUserConfigDoc]) => { const project = projectDoc?.data; - const config = projectUserConfigDoc?.data; - const doesLastBookExist = - projectDoc?.data?.texts.find(t => t.bookNum === config?.selectedBookNum) !== undefined; + const selectedBookNum: number | undefined = projectUserConfigDoc?.data?.selectedBookNum; + const selectedChapterNum: number | undefined = projectUserConfigDoc?.data?.selectedChapterNum; + const doesLastSelectedBookExist = + selectedBookNum != null && project?.texts.find(t => t.bookNum === selectedBookNum) !== undefined; let bookNum: number; let chapterNum: number; - if (doesLastBookExist) { - bookNum = config!.selectedBookNum ?? project?.texts[0]?.bookNum ?? Canon.firstBook; - chapterNum = config?.selectedChapterNum ?? project?.texts[bookNum]?.chapters[0].number ?? 1; + if (doesLastSelectedBookExist) { + bookNum = selectedBookNum; + const selectedBookInfo = project?.texts.find(t => t.bookNum === selectedBookNum); + const selectedChapterExists = + selectedChapterNum != null && selectedBookInfo?.chapters.find(c => c.number === selectedChapterNum) != null; + chapterNum = selectedChapterExists ? selectedChapterNum : (selectedBookInfo?.chapters[0]?.number ?? 1); } else { - bookNum = project?.texts[0]?.bookNum ?? Canon.firstBook; - chapterNum = project?.texts[bookNum]?.chapters[0].number ?? 1; + const bookInfo = project?.texts.slice().sort((a, b) => a.bookNum - b.bookNum)[0]; + bookNum = bookInfo?.bookNum ?? Canon.firstBook; + chapterNum = bookInfo?.chapters[0]?.number ?? 1; } const bookId = Canon.bookNumberToId(bookNum); diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/project/project.component.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/project/project.component.spec.ts index 037ecaa99fd..0476b2e99d2 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/project/project.component.spec.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/project/project.component.spec.ts @@ -245,13 +245,13 @@ class TestEnvironment { args.hasTexts == null || args.hasTexts ? [ { - bookNum: 40, + bookNum: 41, chapters: [], hasSource: false, permissions: {} }, { - bookNum: 41, + bookNum: 40, chapters: [], hasSource: false, permissions: {} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/project/project.component.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/project/project.component.ts index e85b17a476b..cef486ee5d1 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/project/project.component.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/project/project.component.ts @@ -115,16 +115,17 @@ export class ProjectComponent extends DataLoadingComponent implements OnInit { const routePath = ['projects', projectId, task]; let bookNum: number | undefined = projectUserConfig.selectedBookNum; if (bookNum == null || !project.texts.some(t => t.bookNum === bookNum)) { - bookNum = project.texts[0]?.bookNum; + bookNum = project.texts.slice().sort((a, b) => a.bookNum - b.bookNum)[0]?.bookNum; } if (bookNum != null) { routePath.push(Canon.bookNumberToId(bookNum)); - const chapterNum: number | undefined = - projectUserConfig.selectedChapterNum ?? project.texts[bookNum]?.chapters[0]?.number; + const bookInfo = project.texts.find(t => t.bookNum === bookNum); + const chapterNum: number | undefined = projectUserConfig.selectedChapterNum ?? bookInfo?.chapters[0]?.number; + const chapterExists = chapterNum != null && bookInfo?.chapters.some(c => c.number === chapterNum); - if (chapterNum != null) { + if (chapterNum != null && chapterExists) { routePath.push(chapterNum.toString()); } }