summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Rohlfs <brohlfs@google.com>2022-09-29 12:52:01 +0200
committerBen Rohlfs <brohlfs@google.com>2022-09-30 12:54:05 +0200
commit7b22a298b4add1f8205da3c1a37a7df7c7dd335a (patch)
treee8dee921c2622cad95d77ea185fa98653ef6fe2c
parente87cab04ad28f2dbdaab97b841a5d902cc341e5a (diff)
Move `attempt` and `filter` into URL parameters
Release-Notes: skip Google-Bug-Id: b/235185477 Change-Id: I12b90af3c4b373801723764a17dc9a81aad03715
-rw-r--r--polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts2
-rw-r--r--polygerrit-ui/app/elements/checks/gr-checks-tab.ts15
-rw-r--r--polygerrit-ui/app/elements/core/gr-router/gr-router.ts100
-rw-r--r--polygerrit-ui/app/models/checks/checks-model.ts26
-rw-r--r--polygerrit-ui/app/models/checks/checks-model_test.ts2
-rw-r--r--polygerrit-ui/app/models/views/change.ts22
-rw-r--r--polygerrit-ui/app/services/app-context-init.ts1
-rw-r--r--polygerrit-ui/app/services/router/router-model.ts1
-rw-r--r--polygerrit-ui/app/test/test-app-context-init.ts1
-rw-r--r--polygerrit-ui/app/types/events.ts5
-rw-r--r--polygerrit-ui/app/utils/page-wrapper-utils.ts1
11 files changed, 119 insertions, 57 deletions
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
index f2977dc3ea..8293daa39e 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
@@ -2252,8 +2252,6 @@ export class GrChangeView extends LitElement {
if (tab === Tab.CHECKS) {
const state: ChecksTabState = {};
detail.tabState = {checksTab: state};
- if (this.viewState?.filter) state.filter = this.viewState.filter;
- if (this.viewState?.attempt) state.attempt = this.viewState.attempt;
}
this.setActiveTab(
diff --git a/polygerrit-ui/app/elements/checks/gr-checks-tab.ts b/polygerrit-ui/app/elements/checks/gr-checks-tab.ts
index c72bccb8a8..82893bca42 100644
--- a/polygerrit-ui/app/elements/checks/gr-checks-tab.ts
+++ b/polygerrit-ui/app/elements/checks/gr-checks-tab.ts
@@ -3,7 +3,7 @@
* Copyright 2020 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
-import {LitElement, css, html, PropertyValues} from 'lit';
+import {LitElement, css, html} from 'lit';
import {customElement, property, query, state} from 'lit/decorators.js';
import {
CheckResult,
@@ -22,7 +22,6 @@ import {Deduping} from '../../api/reporting';
import {Interaction} from '../../constants/reporting';
import {resolve} from '../../models/dependency';
import {GrChecksRuns} from './gr-checks-runs';
-import {LATEST_ATTEMPT} from '../../models/checks/checks-util';
/**
* The "Checks" tab on the Gerrit change page. Gets its data from plugins that
@@ -147,18 +146,6 @@ export class GrChecksTab extends LitElement {
`;
}
- protected override updated(changedProperties: PropertyValues) {
- super.updated(changedProperties);
- if (changedProperties.has('tabState')) this.tabStateUpdated();
- }
-
- private tabStateUpdated() {
- if (!this.tabState?.checksTab) return;
- const {attempt, filter} = this.tabState.checksTab;
- this.getChecksModel().updateStateSetAttempt(attempt ?? LATEST_ATTEMPT);
- this.getChecksModel().updateStateSetRunFilter(filter ?? '');
- }
-
handleRunSelected(e: RunSelectedEvent) {
this.reporting.reportInteraction(Interaction.CHECKS_RUN_SELECTED, {
checkName: e.detail.checkName,
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 762f6b70ce..10c2f58277 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router.ts
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router.ts
@@ -59,7 +59,11 @@ import {
GroupViewState,
} from '../../../models/views/group';
import {DiffViewModel, DiffViewState} from '../../../models/views/diff';
-import {ChangeViewModel, ChangeViewState} from '../../../models/views/change';
+import {
+ ChangeViewModel,
+ ChangeViewState,
+ createChangeUrl,
+} from '../../../models/views/change';
import {EditViewModel, EditViewState} from '../../../models/views/edit';
import {
DashboardViewModel,
@@ -80,6 +84,7 @@ import {
import {PluginViewModel, PluginViewState} from '../../../models/views/plugin';
import {SearchViewModel, SearchViewState} from '../../../models/views/search';
import {DashboardSection} from '../../../utils/dashboard-util';
+import {Subscription} from 'rxjs';
const RoutePattern = {
ROOT: '/',
@@ -279,6 +284,10 @@ export class GrRouter implements Finalizable, NavigationService {
// and for first navigation in app after loaded from server (true).
_isInitialLoad = true;
+ private subscriptions: Subscription[] = [];
+
+ private view?: GerritView;
+
constructor(
private readonly reporting: ReportingService,
private readonly routerModel: RouterModel,
@@ -295,9 +304,36 @@ export class GrRouter implements Finalizable, NavigationService {
private readonly repoViewModel: RepoViewModel,
private readonly searchViewModel: SearchViewModel,
private readonly settingsViewModel: SettingsViewModel
- ) {}
+ ) {
+ this.subscriptions = [
+ // TODO: Do the same for other view models.
+ // We want to make sure that the current view model state is always
+ // reflected back into the URL bar.
+ this.changeViewModel.state$.subscribe(state => {
+ if (!state) return;
+ // Note that router model view must be updated before view model state.
+ // So this check is slightly fragile, but should work.
+ if (this.view !== GerritView.CHANGE) return;
+ const browserUrl = window.location.toString();
+ const stateUrl = new URL(createChangeUrl(state), browserUrl).toString();
+ if (browserUrl !== stateUrl) {
+ page.replace(
+ stateUrl,
+ null,
+ /* init: */ false,
+ /* dispatch: */ false
+ );
+ }
+ }),
+ this.routerModel.routerView$.subscribe(view => (this.view = view)),
+ ];
+ }
- finalize(): void {}
+ finalize(): void {
+ for (const subscription of this.subscriptions) {
+ subscription.unsubscribe();
+ }
+ }
start() {
if (!this._app) {
@@ -940,6 +976,7 @@ export class GrRouter implements Finalizable, NavigationService {
view: GerritView.DASHBOARD,
user: ctx.params[0],
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.dashboardViewModel.setState(state);
}
@@ -976,6 +1013,7 @@ export class GrRouter implements Finalizable, NavigationService {
sections,
title,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.dashboardViewModel.setState(state);
return Promise.resolve();
@@ -988,6 +1026,7 @@ export class GrRouter implements Finalizable, NavigationService {
project,
dashboard: decodeURIComponent(ctx.params[1]) as DashboardId,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.dashboardViewModel.setState(state);
this.reporting.setRepoName(project);
@@ -1010,6 +1049,7 @@ export class GrRouter implements Finalizable, NavigationService {
view: GerritView.GROUP,
groupId: ctx.params[0] as GroupId,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.groupViewModel.setState(state);
}
@@ -1020,6 +1060,7 @@ export class GrRouter implements Finalizable, NavigationService {
detail: GroupDetailView.LOG,
groupId: ctx.params[0] as GroupId,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.groupViewModel.setState(state);
}
@@ -1030,6 +1071,7 @@ export class GrRouter implements Finalizable, NavigationService {
detail: GroupDetailView.MEMBERS,
groupId: ctx.params[0] as GroupId,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.groupViewModel.setState(state);
}
@@ -1042,6 +1084,7 @@ export class GrRouter implements Finalizable, NavigationService {
filter: null,
openCreateModal: ctx.hash === 'create',
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.adminViewModel.setState(state);
}
@@ -1053,6 +1096,7 @@ export class GrRouter implements Finalizable, NavigationService {
offset: ctx.params['offset'],
filter: ctx.params['filter'],
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.adminViewModel.setState(state);
}
@@ -1063,6 +1107,7 @@ export class GrRouter implements Finalizable, NavigationService {
adminView: AdminChildView.GROUPS,
filter: ctx.params['filter'] || null,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.adminViewModel.setState(state);
}
@@ -1086,6 +1131,7 @@ export class GrRouter implements Finalizable, NavigationService {
detail: RepoDetailView.COMMANDS,
repo,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.repoViewModel.setState(state);
this.reporting.setRepoName(repo);
@@ -1098,6 +1144,7 @@ export class GrRouter implements Finalizable, NavigationService {
detail: RepoDetailView.GENERAL,
repo,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.repoViewModel.setState(state);
this.reporting.setRepoName(repo);
@@ -1110,6 +1157,7 @@ export class GrRouter implements Finalizable, NavigationService {
detail: RepoDetailView.ACCESS,
repo,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.repoViewModel.setState(state);
this.reporting.setRepoName(repo);
@@ -1122,6 +1170,7 @@ export class GrRouter implements Finalizable, NavigationService {
detail: RepoDetailView.DASHBOARDS,
repo,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.repoViewModel.setState(state);
this.reporting.setRepoName(repo);
@@ -1135,6 +1184,7 @@ export class GrRouter implements Finalizable, NavigationService {
offset: ctx.params[2] || 0,
filter: null,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.repoViewModel.setState(state);
}
@@ -1147,6 +1197,7 @@ export class GrRouter implements Finalizable, NavigationService {
offset: ctx.params['offset'],
filter: ctx.params['filter'],
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.repoViewModel.setState(state);
}
@@ -1158,6 +1209,7 @@ export class GrRouter implements Finalizable, NavigationService {
repo: ctx.params['repo'] as RepoName,
filter: ctx.params['filter'] || null,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.repoViewModel.setState(state);
}
@@ -1170,6 +1222,7 @@ export class GrRouter implements Finalizable, NavigationService {
offset: ctx.params[2] || 0,
filter: null,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.repoViewModel.setState(state);
}
@@ -1182,6 +1235,7 @@ export class GrRouter implements Finalizable, NavigationService {
offset: ctx.params['offset'],
filter: ctx.params['filter'],
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.repoViewModel.setState(state);
}
@@ -1193,6 +1247,7 @@ export class GrRouter implements Finalizable, NavigationService {
repo: ctx.params['repo'] as RepoName,
filter: ctx.params['filter'] || null,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.repoViewModel.setState(state);
}
@@ -1205,6 +1260,7 @@ export class GrRouter implements Finalizable, NavigationService {
filter: null,
openCreateModal: ctx.hash === 'create',
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.adminViewModel.setState(state);
}
@@ -1216,6 +1272,7 @@ export class GrRouter implements Finalizable, NavigationService {
offset: ctx.params['offset'],
filter: ctx.params['filter'],
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.adminViewModel.setState(state);
}
@@ -1226,6 +1283,7 @@ export class GrRouter implements Finalizable, NavigationService {
adminView: AdminChildView.REPOS,
filter: ctx.params['filter'] || null,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.adminViewModel.setState(state);
}
@@ -1253,6 +1311,7 @@ export class GrRouter implements Finalizable, NavigationService {
offset: ctx.params[1] || 0,
filter: null,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.adminViewModel.setState(state);
}
@@ -1264,6 +1323,7 @@ export class GrRouter implements Finalizable, NavigationService {
offset: ctx.params['offset'],
filter: ctx.params['filter'],
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.adminViewModel.setState(state);
}
@@ -1274,6 +1334,7 @@ export class GrRouter implements Finalizable, NavigationService {
adminView: AdminChildView.PLUGINS,
filter: ctx.params['filter'] || null,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.adminViewModel.setState(state);
}
@@ -1283,6 +1344,7 @@ export class GrRouter implements Finalizable, NavigationService {
view: GerritView.ADMIN,
adminView: AdminChildView.PLUGINS,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.adminViewModel.setState(state);
}
@@ -1293,6 +1355,7 @@ export class GrRouter implements Finalizable, NavigationService {
query: ctx.params[0],
offset: ctx.params[2],
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.searchViewModel.setState(state);
}
@@ -1305,6 +1368,7 @@ export class GrRouter implements Finalizable, NavigationService {
view: GerritView.SEARCH,
query: ctx.params[0],
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.searchViewModel.setState(state);
}
@@ -1329,23 +1393,8 @@ export class GrRouter implements Finalizable, NavigationService {
};
const queryMap = new URLSearchParams(ctx.querystring);
- if (queryMap.has('forceReload')) {
- state.forceReload = true;
- history.replaceState(
- null,
- '',
- location.href.replace(/[?&]forceReload=true/, '')
- );
- }
-
- if (queryMap.has('openReplyDialog')) {
- state.openReplyDialog = true;
- history.replaceState(
- null,
- '',
- location.href.replace(/[?&]openReplyDialog=true/, '')
- );
- }
+ if (queryMap.has('forceReload')) state.forceReload = true;
+ if (queryMap.has('openReplyDialog')) state.openReplyDialog = true;
const tab = queryMap.get('tab');
if (tab) state.tab = tab;
@@ -1358,6 +1407,7 @@ export class GrRouter implements Finalizable, NavigationService {
this.reporting.setRepoName(state.project);
this.reporting.setChangeId(changeNum);
this.normalizePatchRangeParams(state);
+ // Note that router model view must be updated before view models.
this.setState(state);
this.changeViewModel.setState(state);
}
@@ -1374,6 +1424,7 @@ export class GrRouter implements Finalizable, NavigationService {
this.reporting.setRepoName(state.project ?? '');
this.reporting.setChangeId(changeNum);
this.normalizePatchRangeParams(state);
+ // Note that router model view must be updated before view models.
this.setState(state);
this.diffViewModel.setState(state);
}
@@ -1390,6 +1441,7 @@ export class GrRouter implements Finalizable, NavigationService {
this.reporting.setRepoName(state.project);
this.reporting.setChangeId(changeNum);
this.normalizePatchRangeParams(state);
+ // Note that router model view must be updated before view models.
this.setState(state);
this.changeViewModel.setState(state);
}
@@ -1413,6 +1465,7 @@ export class GrRouter implements Finalizable, NavigationService {
this.reporting.setRepoName(state.project ?? '');
this.reporting.setChangeId(changeNum);
this.normalizePatchRangeParams(state);
+ // Note that router model view must be updated before view models.
this.setState(state);
this.diffViewModel.setState(state);
}
@@ -1452,6 +1505,7 @@ export class GrRouter implements Finalizable, NavigationService {
view: GerritView.EDIT,
};
this.normalizePatchRangeParams(state);
+ // Note that router model view must be updated before view models.
this.setState(state);
this.editViewModel.setState(state);
this.reporting.setRepoName(project);
@@ -1480,6 +1534,7 @@ export class GrRouter implements Finalizable, NavigationService {
);
}
this.normalizePatchRangeParams(state);
+ // Note that router model view must be updated before view models.
this.setState(state);
this.changeViewModel.setState(state);
this.reporting.setRepoName(project);
@@ -1494,6 +1549,7 @@ export class GrRouter implements Finalizable, NavigationService {
const state: AgreementViewState = {
view: GerritView.AGREEMENTS,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.agreementViewModel.setState(state);
}
@@ -1507,12 +1563,14 @@ export class GrRouter implements Finalizable, NavigationService {
view: GerritView.SETTINGS,
emailToken: token,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.settingsViewModel.setState(state);
}
handleSettingsRoute(_: PageContext) {
const state: SettingsViewState = {view: GerritView.SETTINGS};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.settingsViewModel.setState(state);
}
@@ -1558,6 +1616,7 @@ export class GrRouter implements Finalizable, NavigationService {
plugin: ctx.params[0],
screen: ctx.params[1],
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.pluginViewModel.setState(state);
}
@@ -1567,6 +1626,7 @@ export class GrRouter implements Finalizable, NavigationService {
view: GerritView.DOCUMENTATION_SEARCH,
filter: ctx.params['filter'] || null,
};
+ // Note that router model view must be updated before view models.
this.setState(state);
this.documentationViewModel.setState(state);
}
diff --git a/polygerrit-ui/app/models/checks/checks-model.ts b/polygerrit-ui/app/models/checks/checks-model.ts
index 8e058aa14f..385aec3bb3 100644
--- a/polygerrit-ui/app/models/checks/checks-model.ts
+++ b/polygerrit-ui/app/models/checks/checks-model.ts
@@ -62,6 +62,7 @@ import {
ChecksUpdate,
PluginsModel,
} from '../plugins/plugins-model';
+import {ChangeViewModel} from '../views/change';
/**
* The checks model maintains the state of checks for two patchsets: the latest
@@ -142,15 +143,6 @@ interface ChecksState {
* can be picked up from the change model.
*/
patchsetNumberSelected?: PatchSetNumber;
- /**
- * This is the attempt number selected by the user. If this is `undefined`
- * (default), then for each run the latest attempt is displayed.
- */
- attemptNumberSelected: AttemptChoice;
- /**
- * Current filter set by the user in the runs panel or via URL.
- */
- runFilterRegexp: string;
/** Checks data for the latest patchset. */
pluginStateLatest: {
[name: string]: ChecksProviderState;
@@ -216,11 +208,14 @@ export class ChecksModel extends Model<ChecksState> implements Finalizable {
);
public checksSelectedAttemptNumber$ = select(
- this.state$,
- state => state.attemptNumberSelected
+ this.changeViewModel.attempt$,
+ attempt => attempt ?? LATEST_ATTEMPT
);
- public runFilterRegexp$ = select(this.state$, state => state.runFilterRegexp);
+ public runFilterRegexp$ = select(
+ this.changeViewModel.filter$,
+ filter => filter ?? ''
+ );
public checksLatest$ = select(this.state$, state => state.pluginStateLatest);
@@ -379,14 +374,13 @@ export class ChecksModel extends Model<ChecksState> implements Finalizable {
constructor(
readonly routerModel: RouterModel,
+ readonly changeViewModel: ChangeViewModel,
readonly changeModel: ChangeModel,
readonly reporting: ReportingService,
readonly pluginsModel: PluginsModel
) {
super({
patchsetNumberSelected: undefined,
- attemptNumberSelected: LATEST_ATTEMPT,
- runFilterRegexp: '',
pluginStateLatest: {},
pluginStateSelected: {},
});
@@ -660,11 +654,11 @@ export class ChecksModel extends Model<ChecksState> implements Finalizable {
}
updateStateSetAttempt(attemptNumberSelected: AttemptChoice) {
- this.updateState({attemptNumberSelected});
+ this.changeViewModel.updateState({attempt: attemptNumberSelected});
}
updateStateSetRunFilter(runFilterRegexp: string) {
- this.updateState({runFilterRegexp});
+ this.changeViewModel.updateState({filter: runFilterRegexp});
}
setPatchset(num?: PatchSetNumber) {
diff --git a/polygerrit-ui/app/models/checks/checks-model_test.ts b/polygerrit-ui/app/models/checks/checks-model_test.ts
index 88fbebc736..83ed4640a6 100644
--- a/polygerrit-ui/app/models/checks/checks-model_test.ts
+++ b/polygerrit-ui/app/models/checks/checks-model_test.ts
@@ -21,6 +21,7 @@ import {ParsedChangeInfo} from '../../types/types';
import {changeModelToken} from '../change/change-model';
import {assert} from '@open-wc/testing';
import {testResolver} from '../../test/common-test-setup';
+import {changeViewModelToken} from '../views/change';
const PLUGIN_NAME = 'test-plugin';
@@ -63,6 +64,7 @@ suite('checks-model tests', () => {
setup(() => {
model = new ChecksModel(
getAppContext().routerModel,
+ testResolver(changeViewModelToken),
testResolver(changeModelToken),
getAppContext().reportingService,
getAppContext().pluginsModel
diff --git a/polygerrit-ui/app/models/views/change.ts b/polygerrit-ui/app/models/views/change.ts
index b8451a0d75..4c97f605d9 100644
--- a/polygerrit-ui/app/models/views/change.ts
+++ b/polygerrit-ui/app/models/views/change.ts
@@ -12,6 +12,7 @@ import {
} from '../../api/rest-api';
import {GerritView} from '../../services/router/router-model';
import {UrlEncodedCommentId} from '../../types/common';
+import {select} from '../../utils/observable-util';
import {
encodeURL,
getBaseUrl,
@@ -84,6 +85,12 @@ export function createChangeUrl(
}
let suffix = `${range}`;
const queries = [];
+ if (state.attempt) {
+ if (state.attempt !== 'latest') queries.push(`attempt=${state.attempt}`);
+ }
+ if (state.filter) {
+ queries.push(`filter=${state.filter}`);
+ }
if (state.forceReload) {
queries.push('forceReload=true');
}
@@ -117,7 +124,22 @@ export const changeViewModelToken =
define<ChangeViewModel>('change-view-model');
export class ChangeViewModel extends Model<ChangeViewState | undefined> {
+ public readonly tab$ = select(this.state$, state => state?.tab);
+
+ public readonly attempt$ = select(this.state$, state => state?.attempt);
+
+ public readonly filter$ = select(this.state$, state => state?.filter);
+
constructor() {
super(undefined);
+ this.state$.subscribe(s => {
+ if (s?.usp || s?.forceReload || s?.openReplyDialog) {
+ this.updateState({
+ usp: undefined,
+ forceReload: undefined,
+ openReplyDialog: undefined,
+ });
+ }
+ });
}
}
diff --git a/polygerrit-ui/app/services/app-context-init.ts b/polygerrit-ui/app/services/app-context-init.ts
index 9f7a0c09bf..2e1b817201 100644
--- a/polygerrit-ui/app/services/app-context-init.ts
+++ b/polygerrit-ui/app/services/app-context-init.ts
@@ -186,6 +186,7 @@ export function createAppDependencies(
const checksModel = new ChecksModel(
appContext.routerModel,
+ changeViewModel,
changeModel,
appContext.reportingService,
appContext.pluginsModel
diff --git a/polygerrit-ui/app/services/router/router-model.ts b/polygerrit-ui/app/services/router/router-model.ts
index 0699554292..99b9870e1c 100644
--- a/polygerrit-ui/app/services/router/router-model.ts
+++ b/polygerrit-ui/app/services/router/router-model.ts
@@ -29,6 +29,7 @@ export enum GerritView {
}
export interface RouterState {
+ // Note that this router model view must be updated before view model state.
view?: GerritView;
changeNum?: NumericChangeId;
patchNum?: RevisionPatchSetNum;
diff --git a/polygerrit-ui/app/test/test-app-context-init.ts b/polygerrit-ui/app/test/test-app-context-init.ts
index e34773eb38..2cdd4a5408 100644
--- a/polygerrit-ui/app/test/test-app-context-init.ts
+++ b/polygerrit-ui/app/test/test-app-context-init.ts
@@ -207,6 +207,7 @@ export function createTestDependencies(
const checksModelCreator = () =>
new ChecksModel(
appContext.routerModel,
+ resolver(changeViewModelToken),
resolver(changeModelToken),
appContext.reportingService,
appContext.pluginsModel
diff --git a/polygerrit-ui/app/types/events.ts b/polygerrit-ui/app/types/events.ts
index 23acff4492..597bb6ff96 100644
--- a/polygerrit-ui/app/types/events.ts
+++ b/polygerrit-ui/app/types/events.ts
@@ -8,7 +8,6 @@ import {ChangeMessage} from '../utils/comment-util';
import {FetchRequest} from './types';
import {LineNumberEventDetail, MovedLinkClickedEventDetail} from '../api/diff';
import {Category, RunStatus} from '../api/checks';
-import {AttemptChoice} from '../models/checks/checks-util';
export enum EventType {
BIND_VALUE_CHANGED = 'bind-value-changed',
@@ -231,10 +230,6 @@ export enum CommentTabState {
export interface ChecksTabState {
statusOrCategory?: RunStatus | Category;
checkName?: string;
- /** regular expression for filtering runs */
- filter?: string;
- /** selected attempt for selected runs */
- attempt?: AttemptChoice;
}
export type SwitchTabEvent = CustomEvent<SwitchTabEventDetail>;
diff --git a/polygerrit-ui/app/utils/page-wrapper-utils.ts b/polygerrit-ui/app/utils/page-wrapper-utils.ts
index 7096423665..78e78edce2 100644
--- a/polygerrit-ui/app/utils/page-wrapper-utils.ts
+++ b/polygerrit-ui/app/utils/page-wrapper-utils.ts
@@ -14,6 +14,7 @@ export interface Page {
(pageCallback: PageCallback): void;
show(url: string): void;
redirect(url: string): void;
+ replace(path: string, state: null, init: boolean, dispatch: boolean): void;
base(url: string): void;
start(): void;
exit(pattern: string | RegExp, ...pageCallback: PageCallback[]): void;