Inject router and view models Release-Notes: skip Google-Bug-Id: b/244279450 Change-Id: I9968afcbd1c535670e369b6bb0f9b6923957fcd9
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts index 7485a6d..6fde9ca 100644 --- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts +++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts
@@ -54,7 +54,6 @@ import {ParsedChangeInfo} from '../../../types/types'; import {GrLinkedChip} from '../../shared/gr-linked-chip/gr-linked-chip'; import {GrButton} from '../../shared/gr-button/gr-button'; -import {GrRouter} from '../../core/gr-router/gr-router'; import {nothing} from 'lit'; import {fixture, html, assert} from '@open-wc/testing'; import {EventType} from '../../../types/events'; @@ -296,10 +295,9 @@ }); test('weblinks are visible when other weblinks', async () => { - const router = new GrRouter(); sinon .stub(GerritNav, '_generateWeblinks') - .callsFake(router.generateWeblinks.bind(router)); + .callsFake(() => [{name: 'test-name'}]); element.commitInfo = { ...createCommitInfoWithRequiredCommit(), @@ -309,22 +307,12 @@ const webLinks = element.webLinks!; assert.isFalse(webLinks.hasAttribute('hidden')); assert.equal(element.computeWebLinks().length, 1); - // With two non-gitiles weblinks, there are two returned. - element.commitInfo = { - ...createCommitInfoWithRequiredCommit(), - web_links: [ - {...createWebLinkInfo(), name: 'test', url: '#'}, - {...createWebLinkInfo(), name: 'test2', url: '#'}, - ], - }; - assert.equal(element.computeWebLinks().length, 2); }); test('weblinks are visible when gitiles and other weblinks', async () => { - const router = new GrRouter(); sinon .stub(GerritNav, '_generateWeblinks') - .callsFake(router.generateWeblinks.bind(router)); + .callsFake(() => [{name: 'test-name'}]); element.commitInfo = { ...createCommitInfoWithRequiredCommit(),
diff --git a/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info_test.ts b/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info_test.ts index ea4b202..92fc2bb 100644 --- a/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info_test.ts +++ b/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info_test.ts
@@ -13,7 +13,6 @@ createServerInfo, } from '../../../test/test-data-generators'; import {CommitId, RepoName} from '../../../types/common'; -import {GrRouter} from '../../core/gr-router/gr-router'; import {fixture, html, assert} from '@open-wc/testing'; import {waitEventLoop} from '../../../test/test-utils'; @@ -61,10 +60,9 @@ }); test('use web link when available', () => { - const router = new GrRouter(); - sinon - .stub(GerritNav, '_generateWeblinks') - .callsFake(router.generateWeblinks.bind(router)); + sinon.stub(GerritNav, 'getPatchSetWeblink').callsFake(() => { + return {name: 'test-name', url: 'test-url'}; + }); element.change = {...createChange(), labels: {}, project: '' as RepoName}; element.commitInfo = { @@ -75,65 +73,6 @@ element.serverConfig = createServerInfo(); assert.isOk(element._showWebLink); - assert.equal(element._webLink, 'link-url'); - }); - - test('does not relativize web links that begin with scheme', () => { - const router = new GrRouter(); - sinon - .stub(GerritNav, '_generateWeblinks') - .callsFake(router.generateWeblinks.bind(router)); - - element.change = {...createChange(), labels: {}, project: '' as RepoName}; - element.commitInfo = { - ...createCommit(), - commit: 'commitsha' as CommitId, - web_links: [{name: 'gitweb', url: 'https://link-url'}], - }; - element.serverConfig = createServerInfo(); - - assert.isOk(element._showWebLink); - assert.equal(element._webLink, 'https://link-url'); - }); - - test('ignore web links that are neither gitweb nor gitiles', () => { - const router = new GrRouter(); - sinon - .stub(GerritNav, '_generateWeblinks') - .callsFake(router.generateWeblinks.bind(router)); - - element.change = {...createChange(), project: 'project-name' as RepoName}; - element.commitInfo = { - ...createCommit(), - commit: 'commit-sha' as CommitId, - web_links: [ - { - name: 'ignore', - url: 'ignore', - }, - { - name: 'gitiles', - url: 'https://link-url', - }, - ], - }; - element.serverConfig = createServerInfo(); - - assert.isOk(element._showWebLink); - assert.equal(element._webLink, 'https://link-url'); - - // Remove gitiles link. - element.commitInfo = { - ...createCommit(), - commit: 'commit-sha' as CommitId, - web_links: [ - { - name: 'ignore', - url: 'ignore', - }, - ], - }; - assert.isNotOk(element._showWebLink); - assert.isNotOk(element._webLink); + assert.equal(element._webLink, 'test-url'); }); });
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router.ts b/polygerrit-ui/app/elements/core/gr-router/gr-router.ts index bac054f..8e46786 100644 --- a/polygerrit-ui/app/elements/core/gr-router/gr-router.ts +++ b/polygerrit-ui/app/elements/core/gr-router/gr-router.ts
@@ -35,7 +35,7 @@ } from '../../../types/common'; import {AppElement, AppElementParams} from '../../gr-app-types'; import {LocationChangeEventDetail} from '../../../types/events'; -import {GerritView} from '../../../services/router/router-model'; +import {GerritView, RouterModel} from '../../../services/router/router-model'; import {firePageError} from '../../../utils/event-util'; import {windowLocationReload} from '../../../utils/dom-util'; import { @@ -50,13 +50,46 @@ LATEST_ATTEMPT, stringToAttemptChoice, } from '../../../models/checks/checks-util'; -import {AdminChildView} from '../../../models/views/admin'; -import {AgreementViewState} from '../../../models/views/agreement'; -import {RepoDetailView} from '../../../models/views/repo'; -import {GroupDetailView} from '../../../models/views/group'; -import {DiffViewState} from '../../../models/views/diff'; -import {ChangeViewState} from '../../../models/views/change'; -import {EditViewState} from '../../../models/views/edit'; +import { + AdminChildView, + AdminViewModel, + AdminViewState, +} from '../../../models/views/admin'; +import { + AgreementViewModel, + AgreementViewState, +} from '../../../models/views/agreement'; +import { + RepoDetailView, + RepoViewModel, + RepoViewState, +} from '../../../models/views/repo'; +import { + GroupDetailView, + GroupViewModel, + GroupViewState, +} from '../../../models/views/group'; +import {DiffViewModel, DiffViewState} from '../../../models/views/diff'; +import {ChangeViewModel, ChangeViewState} from '../../../models/views/change'; +import {EditViewModel, EditViewState} from '../../../models/views/edit'; +import { + DashboardViewModel, + DashboardViewState, +} from '../../../models/views/dashboard'; +import { + SettingsViewModel, + SettingsViewState, +} from '../../../models/views/settings'; +import {define} from '../../../models/dependency'; +import {Finalizable} from '../../../services/registry'; +import {ReportingService} from '../../../services/gr-reporting/gr-reporting'; +import {RestApiService} from '../../../services/gr-rest-api/gr-rest-api'; +import { + DocumentationViewModel, + DocumentationViewState, +} from '../../../models/views/documentation'; +import {PluginViewModel, PluginViewState} from '../../../models/views/plugin'; +import {SearchViewModel, SearchViewState} from '../../../models/views/search'; const RoutePattern = { ROOT: '/', @@ -261,7 +294,9 @@ type QueryStringItem = [string, string]; // [key, value] -export class GrRouter { +export const routerToken = define<GrRouter>('router'); + +export class GrRouter implements Finalizable { readonly _app = app; _isRedirecting?: boolean; @@ -270,11 +305,25 @@ // and for first navigation in app after loaded from server (true). _isInitialLoad = true; - private readonly reporting = getAppContext().reportingService; + constructor( + private readonly reporting: ReportingService, + private readonly routerModel: RouterModel, + private readonly restApiService: RestApiService, + private readonly adminViewModel: AdminViewModel, + private readonly agreementViewModel: AgreementViewModel, + private readonly changeViewModel: ChangeViewModel, + private readonly dashboardViewModel: DashboardViewModel, + private readonly diffViewModel: DiffViewModel, + private readonly documentationViewModel: DocumentationViewModel, + private readonly editViewModel: EditViewModel, + private readonly groupViewModel: GroupViewModel, + private readonly pluginViewModel: PluginViewModel, + private readonly repoViewModel: RepoViewModel, + private readonly searchViewModel: SearchViewModel, + private readonly settingsViewModel: SettingsViewModel + ) {} - private readonly routerModel = getAppContext().routerModel; - - private readonly restApiService = getAppContext().restApiService; + finalize(): void {} start() { if (!this._app) { @@ -283,15 +332,15 @@ this.startRouter(); } - setParams(params: AppElementParams) { + setState(state: AppElementParams) { this.routerModel.updateState({ - view: params.view, - changeNum: 'changeNum' in params ? params.changeNum : undefined, - patchNum: 'patchNum' in params ? params.patchNum ?? undefined : undefined, + view: state.view, + changeNum: 'changeNum' in state ? state.changeNum : undefined, + patchNum: 'patchNum' in state ? state.patchNum ?? undefined : undefined, basePatchNum: - 'basePatchNum' in params ? params.basePatchNum ?? undefined : undefined, + 'basePatchNum' in state ? state.basePatchNum ?? undefined : undefined, }); - this.appElement().params = params; + this.appElement().params = state; } private appElement(): AppElement { @@ -905,7 +954,7 @@ this.mapRoute( RoutePattern.NEW_AGREEMENTS, 'handleNewAgreementsRoute', - ctx => this.handleNewAgreementsRoute(ctx), + () => this.handleNewAgreementsRoute(), true ); @@ -1067,10 +1116,12 @@ this.redirect('/q/owner:' + encodeURIComponent(data.params[0])); } } else { - this.setParams({ + const state: DashboardViewState = { view: GerritView.DASHBOARD, user: data.params[0], - }); + }; + this.setState(state); + this.dashboardViewModel.updateState(state); } }); } @@ -1118,13 +1169,14 @@ }); if (sections.length > 0) { - // Custom dashboard view. - this.setParams({ + const state: DashboardViewState = { view: GerritView.DASHBOARD, user: 'self', sections, title, - }); + }; + this.setState(state); + this.dashboardViewModel.updateState(state); return Promise.resolve(); } @@ -1135,11 +1187,13 @@ handleProjectDashboardRoute(data: PageContextWithQueryMap) { const project = data.params[0] as RepoName; - this.setParams({ + const state: DashboardViewState = { view: GerritView.DASHBOARD, project, dashboard: decodeURIComponent(data.params[1]) as DashboardId, - }); + }; + this.setState(state); + this.dashboardViewModel.updateState(state); this.reporting.setRepoName(project); } @@ -1156,53 +1210,65 @@ } handleGroupRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: GroupViewState = { view: GerritView.GROUP, groupId: data.params[0] as GroupId, - }); + }; + this.setState(state); + this.groupViewModel.updateState(state); } handleGroupAuditLogRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: GroupViewState = { view: GerritView.GROUP, detail: GroupDetailView.LOG, groupId: data.params[0] as GroupId, - }); + }; + this.setState(state); + this.groupViewModel.updateState(state); } handleGroupMembersRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: GroupViewState = { view: GerritView.GROUP, detail: GroupDetailView.MEMBERS, groupId: data.params[0] as GroupId, - }); + }; + this.setState(state); + this.groupViewModel.updateState(state); } handleGroupListOffsetRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: AdminViewState = { view: GerritView.ADMIN, adminView: AdminChildView.GROUPS, offset: data.params[1] || 0, filter: null, openCreateModal: data.hash === 'create', - }); + }; + this.setState(state); + this.adminViewModel.updateState(state); } handleGroupListFilterOffsetRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: AdminViewState = { view: GerritView.ADMIN, adminView: AdminChildView.GROUPS, offset: data.params['offset'], filter: data.params['filter'], - }); + }; + this.setState(state); + this.adminViewModel.updateState(state); } handleGroupListFilterRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: AdminViewState = { view: GerritView.ADMIN, adminView: AdminChildView.GROUPS, filter: data.params['filter'] || null, - }); + }; + this.setState(state); + this.adminViewModel.updateState(state); } handleProjectsOldRoute(data: PageContextWithQueryMap) { @@ -1219,127 +1285,153 @@ handleRepoCommandsRoute(data: PageContextWithQueryMap) { const repo = data.params[0] as RepoName; - this.setParams({ + const state: RepoViewState = { view: GerritView.REPO, detail: RepoDetailView.COMMANDS, repo, - }); + }; + this.setState(state); + this.repoViewModel.updateState(state); this.reporting.setRepoName(repo); } handleRepoGeneralRoute(data: PageContextWithQueryMap) { const repo = data.params[0] as RepoName; - this.setParams({ + const state: RepoViewState = { view: GerritView.REPO, detail: RepoDetailView.GENERAL, repo, - }); + }; + this.setState(state); + this.repoViewModel.updateState(state); this.reporting.setRepoName(repo); } handleRepoAccessRoute(data: PageContextWithQueryMap) { const repo = data.params[0] as RepoName; - this.setParams({ + const state: RepoViewState = { view: GerritView.REPO, detail: RepoDetailView.ACCESS, repo, - }); + }; + this.setState(state); + this.repoViewModel.updateState(state); this.reporting.setRepoName(repo); } handleRepoDashboardsRoute(data: PageContextWithQueryMap) { const repo = data.params[0] as RepoName; - this.setParams({ + const state: RepoViewState = { view: GerritView.REPO, detail: RepoDetailView.DASHBOARDS, repo, - }); + }; + this.setState(state); + this.repoViewModel.updateState(state); this.reporting.setRepoName(repo); } handleBranchListOffsetRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: RepoViewState = { view: GerritView.REPO, detail: RepoDetailView.BRANCHES, repo: data.params[0] as RepoName, offset: data.params[2] || 0, filter: null, - }); + }; + this.setState(state); + this.repoViewModel.updateState(state); } handleBranchListFilterOffsetRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: RepoViewState = { view: GerritView.REPO, detail: RepoDetailView.BRANCHES, repo: data.params['repo'] as RepoName, offset: data.params['offset'], filter: data.params['filter'], - }); + }; + this.setState(state); + this.repoViewModel.updateState(state); } handleBranchListFilterRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: RepoViewState = { view: GerritView.REPO, detail: RepoDetailView.BRANCHES, repo: data.params['repo'] as RepoName, filter: data.params['filter'] || null, - }); + }; + this.setState(state); + this.repoViewModel.updateState(state); } handleTagListOffsetRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: RepoViewState = { view: GerritView.REPO, detail: RepoDetailView.TAGS, repo: data.params[0] as RepoName, offset: data.params[2] || 0, filter: null, - }); + }; + this.setState(state); + this.repoViewModel.updateState(state); } handleTagListFilterOffsetRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: RepoViewState = { view: GerritView.REPO, detail: RepoDetailView.TAGS, repo: data.params['repo'] as RepoName, offset: data.params['offset'], filter: data.params['filter'], - }); + }; + this.setState(state); + this.repoViewModel.updateState(state); } handleTagListFilterRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: RepoViewState = { view: GerritView.REPO, detail: RepoDetailView.TAGS, repo: data.params['repo'] as RepoName, filter: data.params['filter'] || null, - }); + }; + this.setState(state); + this.repoViewModel.updateState(state); } handleRepoListOffsetRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: AdminViewState = { view: GerritView.ADMIN, adminView: AdminChildView.REPOS, offset: data.params[1] || 0, filter: null, openCreateModal: data.hash === 'create', - }); + }; + this.setState(state); + this.adminViewModel.updateState(state); } handleRepoListFilterOffsetRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: AdminViewState = { view: GerritView.ADMIN, adminView: AdminChildView.REPOS, offset: data.params['offset'], filter: data.params['filter'], - }); + }; + this.setState(state); + this.adminViewModel.updateState(state); } handleRepoListFilterRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: AdminViewState = { view: GerritView.ADMIN, adminView: AdminChildView.REPOS, filter: data.params['filter'] || null, - }); + }; + this.setState(state); + this.adminViewModel.updateState(state); } handleCreateProjectRoute(_: PageContextWithQueryMap) { @@ -1359,54 +1451,66 @@ } handlePluginListOffsetRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: AdminViewState = { view: GerritView.ADMIN, adminView: AdminChildView.PLUGINS, offset: data.params[1] || 0, filter: null, - }); + }; + this.setState(state); + this.adminViewModel.updateState(state); } handlePluginListFilterOffsetRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: AdminViewState = { view: GerritView.ADMIN, adminView: AdminChildView.PLUGINS, offset: data.params['offset'], filter: data.params['filter'], - }); + }; + this.setState(state); + this.adminViewModel.updateState(state); } handlePluginListFilterRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: AdminViewState = { view: GerritView.ADMIN, adminView: AdminChildView.PLUGINS, filter: data.params['filter'] || null, - }); + }; + this.setState(state); + this.adminViewModel.updateState(state); } handlePluginListRoute(_: PageContextWithQueryMap) { - this.setParams({ + const state: AdminViewState = { view: GerritView.ADMIN, adminView: AdminChildView.PLUGINS, - }); + }; + this.setState(state); + this.adminViewModel.updateState(state); } handleQueryRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: SearchViewState = { view: GerritView.SEARCH, query: data.params[0], offset: data.params[2], - }); + }; + this.setState(state); + this.searchViewModel.updateState(state); } handleChangeIdQueryRoute(data: PageContextWithQueryMap) { // TODO(pcc): This will need to indicate that this was a change ID query if // standard queries gain the ability to search places like commit messages // for change IDs. - this.setParams({ + const state: SearchViewState = { view: GerritView.SEARCH, query: data.params[0], - }); + }; + this.setState(state); + this.searchViewModel.updateState(state); } handleQueryLegacySuffixRoute(ctx: PageContextWithQueryMap) { @@ -1420,7 +1524,7 @@ handleChangeRoute(ctx: PageContextWithQueryMap) { // Parameter order is based on the regex group number matched. const changeNum = Number(ctx.params[1]) as NumericChangeId; - const params: ChangeViewState = { + const state: ChangeViewState = { project: ctx.params[0] as RepoName, changeNum, basePatchNum: convertToPatchSetNum(ctx.params[4]) as BasePatchSetNum, @@ -1429,7 +1533,7 @@ }; if (ctx.queryMap.has('forceReload')) { - params.forceReload = true; + state.forceReload = true; history.replaceState( null, '', @@ -1438,7 +1542,7 @@ } if (ctx.queryMap.has('openReplyDialog')) { - params.openReplyDialog = true; + state.openReplyDialog = true; history.replaceState( null, '', @@ -1447,53 +1551,56 @@ } const tab = ctx.queryMap.get('tab'); - if (tab) params.tab = tab; + if (tab) state.tab = tab; const filter = ctx.queryMap.get('filter'); - if (filter) params.filter = filter; + if (filter) state.filter = filter; const attempt = stringToAttemptChoice(ctx.queryMap.get('attempt')); - if (attempt && attempt !== LATEST_ATTEMPT) params.attempt = attempt; + if (attempt && attempt !== LATEST_ATTEMPT) state.attempt = attempt; - assertIsDefined(params.project, 'project'); - this.reporting.setRepoName(params.project); + assertIsDefined(state.project, 'project'); + this.reporting.setRepoName(state.project); this.reporting.setChangeId(changeNum); - this.normalizePatchRangeParams(params); - this.setParams(params); + this.normalizePatchRangeParams(state); + this.setState(state); + this.changeViewModel.updateState(state); } handleCommentRoute(ctx: PageContextWithQueryMap) { const changeNum = Number(ctx.params[1]) as NumericChangeId; - const params: DiffViewState = { + const state: DiffViewState = { project: ctx.params[0] as RepoName, changeNum, commentId: ctx.params[2] as UrlEncodedCommentId, view: GerritView.DIFF, commentLink: true, }; - this.reporting.setRepoName(params.project ?? ''); + this.reporting.setRepoName(state.project ?? ''); this.reporting.setChangeId(changeNum); - this.normalizePatchRangeParams(params); - this.setParams(params); + this.normalizePatchRangeParams(state); + this.setState(state); + this.diffViewModel.updateState(state); } handleCommentsRoute(ctx: PageContextWithQueryMap) { const changeNum = Number(ctx.params[1]) as NumericChangeId; - const params: ChangeViewState = { + const state: ChangeViewState = { project: ctx.params[0] as RepoName, changeNum, commentId: ctx.params[2] as UrlEncodedCommentId, view: GerritView.CHANGE, }; - assertIsDefined(params.project); - this.reporting.setRepoName(params.project); + assertIsDefined(state.project); + this.reporting.setRepoName(state.project); this.reporting.setChangeId(changeNum); - this.normalizePatchRangeParams(params); - this.setParams(params); + this.normalizePatchRangeParams(state); + this.setState(state); + this.changeViewModel.updateState(state); } handleDiffRoute(ctx: PageContextWithQueryMap) { const changeNum = Number(ctx.params[1]) as NumericChangeId; // Parameter order is based on the regex group number matched. - const params: DiffViewState = { + const state: DiffViewState = { project: ctx.params[0] as RepoName, changeNum, basePatchNum: convertToPatchSetNum(ctx.params[4]) as BasePatchSetNum, @@ -1503,13 +1610,14 @@ }; const address = this.parseLineAddress(ctx.hash); if (address) { - params.leftSide = address.leftSide; - params.lineNum = address.lineNum; + state.leftSide = address.leftSide; + state.lineNum = address.lineNum; } - this.reporting.setRepoName(params.project ?? ''); + this.reporting.setRepoName(state.project ?? ''); this.reporting.setChangeId(changeNum); - this.normalizePatchRangeParams(params); - this.setParams(params); + this.normalizePatchRangeParams(state); + this.setState(state); + this.diffViewModel.updateState(state); } handleChangeLegacyRoute(ctx: PageContextWithQueryMap) { @@ -1537,7 +1645,7 @@ // Parameter order is based on the regex group number matched. const project = ctx.params[0] as RepoName; const changeNum = Number(ctx.params[1]) as NumericChangeId; - const params: EditViewState = { + const state: EditViewState = { project, changeNum, // for edit view params, patchNum cannot be undefined @@ -1546,8 +1654,9 @@ lineNum: Number(ctx.hash), view: GerritView.EDIT, }; - this.normalizePatchRangeParams(params); - this.setParams(params); + this.normalizePatchRangeParams(state); + this.setState(state); + this.editViewModel.updateState(state); this.reporting.setRepoName(project); this.reporting.setChangeId(changeNum); } @@ -1556,7 +1665,7 @@ // Parameter order is based on the regex group number matched. const project = ctx.params[0] as RepoName; const changeNum = Number(ctx.params[1]) as NumericChangeId; - const params: ChangeViewState = { + const state: ChangeViewState = { project, changeNum, patchNum: convertToPatchSetNum(ctx.params[3]) as RevisionPatchSetNum, @@ -1565,16 +1674,16 @@ tab: ctx.queryMap.get('tab') ?? '', }; if (ctx.queryMap.has('forceReload')) { - params.forceReload = true; + state.forceReload = true; history.replaceState( null, '', location.href.replace(/[?&]forceReload=true/, '') ); } - this.normalizePatchRangeParams(params); - this.setParams(params); - + this.normalizePatchRangeParams(state); + this.setState(state); + this.changeViewModel.updateState(state); this.reporting.setRepoName(project); this.reporting.setChangeId(changeNum); } @@ -1583,10 +1692,12 @@ this.redirect('/settings/#Agreements'); } - handleNewAgreementsRoute(data: PageContextWithQueryMap) { - data.params['view'] = GerritView.AGREEMENTS; - // TODO(TS): create valid object - this.setParams(data.params as unknown as AgreementViewState); + handleNewAgreementsRoute() { + const state: AgreementViewState = { + view: GerritView.AGREEMENTS, + }; + this.setState(state); + this.agreementViewModel.updateState(state); } handleSettingsLegacyRoute(data: PageContextWithQueryMap) { @@ -1594,18 +1705,22 @@ // The parameter parsing replaces all '+' with a space, // undo that to have valid tokens. const token = data.params[0].replace(/ /g, '+'); - this.setParams({ + const state: SettingsViewState = { view: GerritView.SETTINGS, emailToken: token, - }); + }; + this.setState(state); + this.settingsViewModel.updateState(state); } handleSettingsRoute(_: PageContextWithQueryMap) { - this.setParams({view: GerritView.SETTINGS}); + const state: SettingsViewState = {view: GerritView.SETTINGS}; + this.setState(state); + this.settingsViewModel.updateState(state); } handleRegisterRoute(ctx: PageContextWithQueryMap) { - this.setParams({justRegistered: true}); + this.setState({justRegistered: true}); let path = ctx.params[0] || '/'; // Prevent redirect looping. @@ -1640,17 +1755,22 @@ } handlePluginScreen(ctx: PageContextWithQueryMap) { - const view = GerritView.PLUGIN_SCREEN; - const plugin = ctx.params[0]; - const screen = ctx.params[1]; - this.setParams({view, plugin, screen}); + const state: PluginViewState = { + view: GerritView.PLUGIN_SCREEN, + plugin: ctx.params[0], + screen: ctx.params[1], + }; + this.setState(state); + this.pluginViewModel.updateState(state); } handleDocumentationSearchRoute(data: PageContextWithQueryMap) { - this.setParams({ + const state: DocumentationViewState = { view: GerritView.DOCUMENTATION_SEARCH, filter: data.params['filter'] || null, - }); + }; + this.setState(state); + this.documentationViewModel.updateState(state); } handleDocumentationSearchRedirectRoute(data: PageContextWithQueryMap) {
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.ts b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.ts index da57994..42659ca 100644 --- a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.ts +++ b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.ts
@@ -16,6 +16,7 @@ import { GrRouter, PageContextWithQueryMap, + routerToken, _testOnly_RoutePattern, } from './gr-router'; import {GerritView} from '../../../services/router/router-model'; @@ -42,12 +43,15 @@ import {EditViewState} from '../../../models/views/edit'; import {ChangeViewState} from '../../../models/views/change'; import {PatchRangeParams} from '../../../utils/url-util'; +import {DependencyRequestEvent} from '../../../models/dependency'; suite('gr-router tests', () => { let router: GrRouter; setup(() => { - router = new GrRouter(); + document.dispatchEvent( + new DependencyRequestEvent(routerToken, x => (router = x)) + ); }); test('firstCodeBrowserWeblink', () => { @@ -343,7 +347,7 @@ suite('route handlers', () => { let redirectStub: sinon.SinonStub; - let setParamsStub: sinon.SinonStub; + let setStateStub: sinon.SinonStub; let handlePassThroughRoute: sinon.SinonStub; // Simple route handlers are direct mappings from parsed route data to a @@ -355,7 +359,7 @@ params: AppElementParams ) { (router as any)[methodName](data); - assert.deepEqual(setParamsStub.lastCall.args[0], params); + assert.deepEqual(setStateStub.lastCall.args[0], params); } function createPageContext(): PageContextWithQueryMap { @@ -376,7 +380,7 @@ setup(() => { redirectStub = sinon.stub(router, 'redirect'); - setParamsStub = sinon.stub(router, 'setParams'); + setStateStub = sinon.stub(router, 'setState'); handlePassThroughRoute = sinon.stub(router, 'handlePassThroughRoute'); }); @@ -400,10 +404,9 @@ }); test('handleNewAgreementsRoute', () => { - const params = createPageContext(); - router.handleNewAgreementsRoute(params); - assert.isTrue(setParamsStub.calledOnce); - assert.equal(setParamsStub.lastCall.args[0].view, GerritView.AGREEMENTS); + router.handleNewAgreementsRoute(); + assert.isTrue(setStateStub.calledOnce); + assert.equal(setStateStub.lastCall.args[0].view, GerritView.AGREEMENTS); }); test('handleSettingsLegacyRoute', () => { @@ -518,24 +521,24 @@ const ctx = {...createPageContext(), params: {0: '/foo/bar'}}; router.handleRegisterRoute(ctx); assert.isTrue(redirectStub.calledWithExactly('/foo/bar')); - assert.isTrue(setParamsStub.calledOnce); - assert.isTrue(setParamsStub.lastCall.args[0].justRegistered); + assert.isTrue(setStateStub.calledOnce); + assert.isTrue(setStateStub.lastCall.args[0].justRegistered); }); test('no param', () => { const ctx = createPageContext(); router.handleRegisterRoute(ctx); assert.isTrue(redirectStub.calledWithExactly('/')); - assert.isTrue(setParamsStub.calledOnce); - assert.isTrue(setParamsStub.lastCall.args[0].justRegistered); + assert.isTrue(setStateStub.calledOnce); + assert.isTrue(setStateStub.lastCall.args[0].justRegistered); }); test('prevent redirect', () => { const ctx = {...createPageContext(), params: {0: '/register'}}; router.handleRegisterRoute(ctx); assert.isTrue(redirectStub.calledWithExactly('/')); - assert.isTrue(setParamsStub.calledOnce); - assert.isTrue(setParamsStub.lastCall.args[0].justRegistered); + assert.isTrue(setStateStub.calledOnce); + assert.isTrue(setStateStub.lastCall.args[0].justRegistered); }); }); @@ -663,7 +666,7 @@ return router.handleDashboardRoute(data).then(() => { assert.isTrue(redirectToLoginStub.calledOnce); assert.isFalse(redirectStub.called); - assert.isFalse(setParamsStub.called); + assert.isFalse(setStateStub.called); }); }); @@ -676,7 +679,7 @@ }; return router.handleDashboardRoute(data).then(() => { assert.isFalse(redirectToLoginStub.called); - assert.isFalse(setParamsStub.called); + assert.isFalse(setStateStub.called); assert.isTrue(redirectStub.calledOnce); assert.equal(redirectStub.lastCall.args[0], '/q/owner:foo'); }); @@ -691,8 +694,8 @@ return router.handleDashboardRoute(data).then(() => { assert.isFalse(redirectToLoginStub.called); assert.isFalse(redirectStub.called); - assert.isTrue(setParamsStub.calledOnce); - assert.deepEqual(setParamsStub.lastCall.args[0], { + assert.isTrue(setStateStub.calledOnce); + assert.deepEqual(setStateStub.lastCall.args[0], { view: GerritView.DASHBOARD, user: 'foo', }); @@ -714,7 +717,7 @@ params: {0: ''}, }; return router.handleCustomDashboardRoute(data, '').then(() => { - assert.isFalse(setParamsStub.called); + assert.isFalse(setStateStub.called); assert.isTrue(redirectStub.called); assert.equal(redirectStub.lastCall.args[0], '/dashboard/self'); }); @@ -730,8 +733,8 @@ .handleCustomDashboardRoute(data, '?a=b&c&d=e') .then(() => { assert.isFalse(redirectStub.called); - assert.isTrue(setParamsStub.calledOnce); - assert.deepEqual(setParamsStub.lastCall.args[0], { + assert.isTrue(setStateStub.calledOnce); + assert.deepEqual(setStateStub.lastCall.args[0], { view: GerritView.DASHBOARD, user: 'self', sections: [ @@ -754,8 +757,8 @@ .then(() => { assert.isFalse(redirectToLoginStub.called); assert.isFalse(redirectStub.called); - assert.isTrue(setParamsStub.calledOnce); - assert.deepEqual(setParamsStub.lastCall.args[0], { + assert.isTrue(setStateStub.calledOnce); + assert.deepEqual(setStateStub.lastCall.args[0], { view: GerritView.DASHBOARD, user: 'self', sections: [{name: 'a', query: 'b'}], @@ -775,8 +778,8 @@ .then(() => { assert.isFalse(redirectToLoginStub.called); assert.isFalse(redirectStub.called); - assert.isTrue(setParamsStub.calledOnce); - assert.deepEqual(setParamsStub.lastCall.args[0], { + assert.isTrue(setStateStub.calledOnce); + assert.deepEqual(setStateStub.lastCall.args[0], { view: GerritView.DASHBOARD, user: 'self', sections: [{name: 'a', query: 'is:open b'}], @@ -1353,7 +1356,7 @@ router.handleDiffEditRoute(ctx); assert.isFalse(redirectStub.called); - assert.deepEqual(setParamsStub.lastCall.args[0], appParams); + assert.deepEqual(setStateStub.lastCall.args[0], appParams); }); test('handleDiffEditRoute with lineNum', () => { @@ -1379,7 +1382,7 @@ router.handleDiffEditRoute(ctx); assert.isFalse(redirectStub.called); - assert.deepEqual(setParamsStub.lastCall.args[0], appParams); + assert.deepEqual(setStateStub.lastCall.args[0], appParams); }); test('handleChangeEditRoute', () => { @@ -1404,7 +1407,7 @@ router.handleChangeEditRoute(ctx); assert.isFalse(redirectStub.called); - assert.deepEqual(setParamsStub.lastCall.args[0], appParams); + assert.deepEqual(setStateStub.lastCall.args[0], appParams); }); });
diff --git a/polygerrit-ui/app/elements/gr-app-element.ts b/polygerrit-ui/app/elements/gr-app-element.ts index 52ff3db..96d2504 100644 --- a/polygerrit-ui/app/elements/gr-app-element.ts +++ b/polygerrit-ui/app/elements/gr-app-element.ts
@@ -31,7 +31,7 @@ import {getBaseUrl} from '../utils/url-util'; import {GerritNav} from './core/gr-navigation/gr-navigation'; import {getAppContext} from '../services/app-context'; -import {GrRouter} from './core/gr-router/gr-router'; +import {routerToken} from './core/gr-router/gr-router'; import {AccountDetailInfo} from '../types/common'; import { constructServerErrorMsg, @@ -167,7 +167,7 @@ @state() private themeEndpoint = 'app-theme-light'; - readonly router = new GrRouter(); + readonly getRouter = resolve(this, routerToken); private reporting = getAppContext().reportingService; @@ -183,6 +183,7 @@ constructor() { super(); + document.addEventListener(EventType.PAGE_ERROR, e => { this.handlePageError(e); }); @@ -244,7 +245,7 @@ this.updateLoginUrl(); this.reporting.appStarted(); - this.router.start(); + this.getRouter().start(); this.restApiService.getAccount().then(account => { this.account = account;
diff --git a/polygerrit-ui/app/models/views/admin.ts b/polygerrit-ui/app/models/views/admin.ts index 856d947..ecb2289 100644 --- a/polygerrit-ui/app/models/views/admin.ts +++ b/polygerrit-ui/app/models/views/admin.ts
@@ -4,6 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ import {GerritView} from '../../services/router/router-model'; +import {define} from '../dependency'; import {Model} from '../model'; import {ViewState} from './base'; @@ -25,8 +26,12 @@ adminView: AdminChildView.REPOS, }; +export const adminViewModelToken = define<AdminViewModel>('admin-view-model'); + export class AdminViewModel extends Model<AdminViewState> { constructor() { super(DEFAULT_STATE); } + + finalize() {} }
diff --git a/polygerrit-ui/app/models/views/agreement.ts b/polygerrit-ui/app/models/views/agreement.ts index 4f1763d..9f5a84e 100644 --- a/polygerrit-ui/app/models/views/agreement.ts +++ b/polygerrit-ui/app/models/views/agreement.ts
@@ -4,6 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ import {GerritView} from '../../services/router/router-model'; +import {define} from '../dependency'; import {Model} from '../model'; import {ViewState} from './base'; @@ -13,8 +14,14 @@ const DEFAULT_STATE: AgreementViewState = {view: GerritView.AGREEMENTS}; +export const agreementViewModelToken = define<AgreementViewModel>( + 'agreement-view-model' +); + export class AgreementViewModel extends Model<AgreementViewState> { constructor() { super(DEFAULT_STATE); } + + finalize() {} }
diff --git a/polygerrit-ui/app/models/views/change.ts b/polygerrit-ui/app/models/views/change.ts index 94d465e6..71262b7 100644 --- a/polygerrit-ui/app/models/views/change.ts +++ b/polygerrit-ui/app/models/views/change.ts
@@ -17,6 +17,7 @@ getPatchRangeExpression, } from '../../utils/url-util'; import {AttemptChoice} from '../checks/checks-util'; +import {define} from '../dependency'; import {Model} from '../model'; import {ViewState} from './base'; @@ -80,8 +81,13 @@ } } +export const changeViewModelToken = + define<ChangeViewModel>('change-view-model'); + export class ChangeViewModel extends Model<ChangeViewState> { constructor() { super(DEFAULT_STATE); } + + finalize() {} }
diff --git a/polygerrit-ui/app/models/views/dashboard.ts b/polygerrit-ui/app/models/views/dashboard.ts index dec53d1..0de6bf8 100644 --- a/polygerrit-ui/app/models/views/dashboard.ts +++ b/polygerrit-ui/app/models/views/dashboard.ts
@@ -7,6 +7,7 @@ import {GerritView} from '../../services/router/router-model'; import {DashboardId} from '../../types/common'; import {encodeURL} from '../../utils/url-util'; +import {define} from '../dependency'; import {Model} from '../model'; import {ViewState} from './base'; @@ -68,8 +69,14 @@ } } +export const dashboardViewModelToken = define<DashboardViewModel>( + 'dashboard-view-model' +); + export class DashboardViewModel extends Model<DashboardViewState> { constructor() { super(DEFAULT_STATE); } + + finalize() {} }
diff --git a/polygerrit-ui/app/models/views/diff.ts b/polygerrit-ui/app/models/views/diff.ts index 68f416f..ce6760e 100644 --- a/polygerrit-ui/app/models/views/diff.ts +++ b/polygerrit-ui/app/models/views/diff.ts
@@ -12,6 +12,7 @@ import {GerritView} from '../../services/router/router-model'; import {UrlEncodedCommentId} from '../../types/common'; import {encodeURL, getPatchRangeExpression} from '../../utils/url-util'; +import {define} from '../dependency'; import {Model} from '../model'; import {ViewState} from './base'; @@ -58,8 +59,12 @@ } } +export const diffViewModelToken = define<DiffViewModel>('diff-view-model'); + export class DiffViewModel extends Model<DiffViewState> { constructor() { super(DEFAULT_STATE); } + + finalize() {} }
diff --git a/polygerrit-ui/app/models/views/documentation.ts b/polygerrit-ui/app/models/views/documentation.ts index 4273b13..4f33c6dd 100644 --- a/polygerrit-ui/app/models/views/documentation.ts +++ b/polygerrit-ui/app/models/views/documentation.ts
@@ -4,6 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ import {GerritView} from '../../services/router/router-model'; +import {define} from '../dependency'; import {Model} from '../model'; import {ViewState} from './base'; @@ -16,8 +17,14 @@ view: GerritView.DOCUMENTATION_SEARCH, }; +export const documentationViewModelToken = define<DocumentationViewModel>( + 'documentation-view-model' +); + export class DocumentationViewModel extends Model<DocumentationViewState> { constructor() { super(DEFAULT_STATE); } + + finalize() {} }
diff --git a/polygerrit-ui/app/models/views/edit.ts b/polygerrit-ui/app/models/views/edit.ts index 102a7e0..7079630 100644 --- a/polygerrit-ui/app/models/views/edit.ts +++ b/polygerrit-ui/app/models/views/edit.ts
@@ -11,6 +11,7 @@ } from '../../api/rest-api'; import {GerritView} from '../../services/router/router-model'; import {encodeURL, getPatchRangeExpression} from '../../utils/url-util'; +import {define} from '../dependency'; import {Model} from '../model'; import {ViewState} from './base'; @@ -50,8 +51,12 @@ } } +export const editViewModelToken = define<EditViewModel>('edit-view-model'); + export class EditViewModel extends Model<EditViewState> { constructor() { super(DEFAULT_STATE); } + + finalize() {} }
diff --git a/polygerrit-ui/app/models/views/group.ts b/polygerrit-ui/app/models/views/group.ts index bac8eb5..3bce89d 100644 --- a/polygerrit-ui/app/models/views/group.ts +++ b/polygerrit-ui/app/models/views/group.ts
@@ -6,6 +6,7 @@ import {GerritView} from '../../services/router/router-model'; import {GroupId} from '../../types/common'; import {encodeURL, getBaseUrl} from '../../utils/url-util'; +import {define} from '../dependency'; import {Model} from '../model'; import {ViewState} from './base'; @@ -30,8 +31,12 @@ return getBaseUrl() + url; } +export const groupViewModelToken = define<GroupViewModel>('group-view-model'); + export class GroupViewModel extends Model<GroupViewState | undefined> { constructor() { super(undefined); } + + finalize() {} }
diff --git a/polygerrit-ui/app/models/views/plugin.ts b/polygerrit-ui/app/models/views/plugin.ts index 5b0e701..c122b19 100644 --- a/polygerrit-ui/app/models/views/plugin.ts +++ b/polygerrit-ui/app/models/views/plugin.ts
@@ -4,6 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ import {GerritView} from '../../services/router/router-model'; +import {define} from '../dependency'; import {Model} from '../model'; import {ViewState} from './base'; @@ -15,8 +16,13 @@ const DEFAULT_STATE: PluginViewState = {view: GerritView.PLUGIN_SCREEN}; +export const pluginViewModelToken = + define<PluginViewModel>('plugin-view-model'); + export class PluginViewModel extends Model<PluginViewState> { constructor() { super(DEFAULT_STATE); } + + finalize() {} }
diff --git a/polygerrit-ui/app/models/views/repo.ts b/polygerrit-ui/app/models/views/repo.ts index d7e7a73..55d9438 100644 --- a/polygerrit-ui/app/models/views/repo.ts +++ b/polygerrit-ui/app/models/views/repo.ts
@@ -6,6 +6,7 @@ import {GerritView} from '../../services/router/router-model'; import {RepoName} from '../../types/common'; import {encodeURL, getBaseUrl} from '../../utils/url-util'; +import {define} from '../dependency'; import {Model} from '../model'; import {ViewState} from './base'; @@ -48,8 +49,12 @@ return getBaseUrl() + url; } +export const repoViewModelToken = define<RepoViewModel>('repo-view-model'); + export class RepoViewModel extends Model<RepoViewState> { constructor() { super(DEFAULT_STATE); } + + finalize() {} }
diff --git a/polygerrit-ui/app/models/views/search.ts b/polygerrit-ui/app/models/views/search.ts index d932b39..7c3d4c4 100644 --- a/polygerrit-ui/app/models/views/search.ts +++ b/polygerrit-ui/app/models/views/search.ts
@@ -7,6 +7,7 @@ import {GerritView} from '../../services/router/router-model'; import {addQuotesWhen} from '../../utils/string-util'; import {encodeURL} from '../../utils/url-util'; +import {define} from '../dependency'; import {Model} from '../model'; import {ViewState} from './base'; @@ -86,8 +87,13 @@ view: GerritView.SEARCH, }; +export const searchViewModelToken = + define<SearchViewModel>('search-view-model'); + export class SearchViewModel extends Model<SearchViewState> { constructor() { super(DEFAULT_STATE); } + + finalize() {} }
diff --git a/polygerrit-ui/app/models/views/settings.ts b/polygerrit-ui/app/models/views/settings.ts index f2e67a4..6bbf4f3 100644 --- a/polygerrit-ui/app/models/views/settings.ts +++ b/polygerrit-ui/app/models/views/settings.ts
@@ -5,6 +5,7 @@ */ import {GerritView} from '../../services/router/router-model'; import {getBaseUrl} from '../../utils/url-util'; +import {define} from '../dependency'; import {Model} from '../model'; import {ViewState} from './base'; @@ -19,8 +20,14 @@ return getBaseUrl() + '/settings'; } +export const settingsViewModelToken = define<SettingsViewModel>( + 'settings-view-model' +); + export class SettingsViewModel extends Model<SettingsViewState> { constructor() { super(DEFAULT_STATE); } + + finalize() {} }
diff --git a/polygerrit-ui/app/services/app-context-init.ts b/polygerrit-ui/app/services/app-context-init.ts index 2dca9a9..3a0079f 100644 --- a/polygerrit-ui/app/services/app-context-init.ts +++ b/polygerrit-ui/app/services/app-context-init.ts
@@ -32,6 +32,31 @@ import {PluginsModel} from '../models/plugins/plugins-model'; import {HighlightService} from './highlight/highlight-service'; import {AccountsModel} from '../models/accounts-model/accounts-model'; +import { + DashboardViewModel, + dashboardViewModelToken, +} from '../models/views/dashboard'; +import { + SettingsViewModel, + settingsViewModelToken, +} from '../models/views/settings'; +import {GrRouter, routerToken} from '../elements/core/gr-router/gr-router'; +import {AdminViewModel, adminViewModelToken} from '../models/views/admin'; +import { + AgreementViewModel, + agreementViewModelToken, +} from '../models/views/agreement'; +import {ChangeViewModel, changeViewModelToken} from '../models/views/change'; +import {DiffViewModel, diffViewModelToken} from '../models/views/diff'; +import { + DocumentationViewModel, + documentationViewModelToken, +} from '../models/views/documentation'; +import {EditViewModel, editViewModelToken} from '../models/views/edit'; +import {GroupViewModel, groupViewModelToken} from '../models/views/group'; +import {PluginViewModel, pluginViewModelToken} from '../models/views/plugin'; +import {RepoViewModel, repoViewModelToken} from '../models/views/repo'; +import {SearchViewModel, searchViewModelToken} from '../models/views/search'; /** * The AppContext lazy initializator for all services @@ -85,6 +110,50 @@ const browserModel = new BrowserModel(appContext.userModel); dependencies.set(browserModelToken, browserModel); + const adminViewModel = new AdminViewModel(); + dependencies.set(adminViewModelToken, adminViewModel); + const agreementViewModel = new AgreementViewModel(); + dependencies.set(agreementViewModelToken, agreementViewModel); + const changeViewModel = new ChangeViewModel(); + dependencies.set(changeViewModelToken, changeViewModel); + const dashboardViewModel = new DashboardViewModel(); + dependencies.set(dashboardViewModelToken, dashboardViewModel); + const diffViewModel = new DiffViewModel(); + dependencies.set(diffViewModelToken, diffViewModel); + const documentationViewModel = new DocumentationViewModel(); + dependencies.set(documentationViewModelToken, documentationViewModel); + const editViewModel = new EditViewModel(); + dependencies.set(editViewModelToken, editViewModel); + const groupViewModel = new GroupViewModel(); + dependencies.set(groupViewModelToken, groupViewModel); + const pluginViewModel = new PluginViewModel(); + dependencies.set(pluginViewModelToken, pluginViewModel); + const repoViewModel = new RepoViewModel(); + dependencies.set(repoViewModelToken, repoViewModel); + const searchViewModel = new SearchViewModel(); + dependencies.set(searchViewModelToken, searchViewModel); + const settingsViewModel = new SettingsViewModel(); + dependencies.set(settingsViewModelToken, settingsViewModel); + + const router = new GrRouter( + appContext.reportingService, + appContext.routerModel, + appContext.restApiService, + adminViewModel, + agreementViewModel, + changeViewModel, + dashboardViewModel, + diffViewModel, + documentationViewModel, + editViewModel, + groupViewModel, + pluginViewModel, + repoViewModel, + searchViewModel, + settingsViewModel + ); + dependencies.set(routerToken, router); + const changeModel = new ChangeModel( appContext.routerModel, appContext.restApiService,
diff --git a/polygerrit-ui/app/test/test-app-context-init.ts b/polygerrit-ui/app/test/test-app-context-init.ts index 15857c8..eda4e58 100644 --- a/polygerrit-ui/app/test/test-app-context-init.ts +++ b/polygerrit-ui/app/test/test-app-context-init.ts
@@ -37,6 +37,31 @@ AccountsModel, accountsModelToken, } from '../models/accounts-model/accounts-model'; +import { + DashboardViewModel, + dashboardViewModelToken, +} from '../models/views/dashboard'; +import { + SettingsViewModel, + settingsViewModelToken, +} from '../models/views/settings'; +import {GrRouter, routerToken} from '../elements/core/gr-router/gr-router'; +import {AdminViewModel, adminViewModelToken} from '../models/views/admin'; +import { + AgreementViewModel, + agreementViewModelToken, +} from '../models/views/agreement'; +import {ChangeViewModel, changeViewModelToken} from '../models/views/change'; +import {DiffViewModel, diffViewModelToken} from '../models/views/diff'; +import { + DocumentationViewModel, + documentationViewModelToken, +} from '../models/views/documentation'; +import {EditViewModel, editViewModelToken} from '../models/views/edit'; +import {GroupViewModel, groupViewModelToken} from '../models/views/group'; +import {PluginViewModel, pluginViewModelToken} from '../models/views/plugin'; +import {RepoViewModel, repoViewModelToken} from '../models/views/repo'; +import {SearchViewModel, searchViewModelToken} from '../models/views/search'; export function createTestAppContext(): AppContext & Finalizable { const appRegistry: Registry<AppContext> = { @@ -92,6 +117,51 @@ const browserModel = () => new BrowserModel(appContext.userModel); dependencies.set(browserModelToken, browserModel); + const adminViewModelCreator = () => new AdminViewModel(); + dependencies.set(adminViewModelToken, adminViewModelCreator); + const agreementViewModelCreator = () => new AgreementViewModel(); + dependencies.set(agreementViewModelToken, agreementViewModelCreator); + const changeViewModelCreator = () => new ChangeViewModel(); + dependencies.set(changeViewModelToken, changeViewModelCreator); + const dashboardViewModelCreator = () => new DashboardViewModel(); + dependencies.set(dashboardViewModelToken, dashboardViewModelCreator); + const diffViewModelCreator = () => new DiffViewModel(); + dependencies.set(diffViewModelToken, diffViewModelCreator); + const documentationViewModelCreator = () => new DocumentationViewModel(); + dependencies.set(documentationViewModelToken, documentationViewModelCreator); + const editViewModelCreator = () => new EditViewModel(); + dependencies.set(editViewModelToken, editViewModelCreator); + const groupViewModelCreator = () => new GroupViewModel(); + dependencies.set(groupViewModelToken, groupViewModelCreator); + const pluginViewModelCreator = () => new PluginViewModel(); + dependencies.set(pluginViewModelToken, pluginViewModelCreator); + const repoViewModelCreator = () => new RepoViewModel(); + dependencies.set(repoViewModelToken, repoViewModelCreator); + const searchViewModelCreator = () => new SearchViewModel(); + dependencies.set(searchViewModelToken, searchViewModelCreator); + const settingsViewModelCreator = () => new SettingsViewModel(); + dependencies.set(settingsViewModelToken, settingsViewModelCreator); + + const routerCreator = () => + new GrRouter( + appContext.reportingService, + appContext.routerModel, + appContext.restApiService, + resolver(adminViewModelToken), + resolver(agreementViewModelToken), + resolver(changeViewModelToken), + resolver(dashboardViewModelToken), + resolver(diffViewModelToken), + resolver(documentationViewModelToken), + resolver(editViewModelToken), + resolver(groupViewModelToken), + resolver(pluginViewModelToken), + resolver(repoViewModelToken), + resolver(searchViewModelToken), + resolver(settingsViewModelToken) + ); + dependencies.set(routerToken, routerCreator); + const changeModelCreator = () => new ChangeModel( appContext.routerModel,