Pressing "u" acts like a back button on change view page
Previously, pressing the "u'" button always took a user back to "/"
whether or not that was the page they were on before. Now, when
a user clicks "u" from the change view page, it will go back to the
last dashboard view or change list view the user was on. If they
did not come from one of those before ending up on a change
view, they will default to go back to "/" still.
Bug: Issue 4579
Change-Id: Ia143fc0da88af0009722831e22f6e8679989efb3
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
index 9f90800..560a5de 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
@@ -42,6 +42,7 @@
notify: true,
value: function() { return {}; },
},
+ backPage: String,
serverConfig: Object,
keyEventTarget: {
type: Object,
@@ -573,11 +574,17 @@
break;
case 85: // 'u'
e.preventDefault();
- page.show('/');
+ this._determinePageBack();
break;
}
},
+ _determinePageBack: function() {
+ // Default backPage to '/' if user came to change view page
+ // via an email link, etc.
+ page.show(this.backPage || '/');
+ },
+
_labelsChanged: function(changeRecord) {
if (!changeRecord) { return; }
this.$.jsAPI.handleEvent(this.$.jsAPI.EventType.LABEL_CHANGE, {
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
index b819837..190954c 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
@@ -45,13 +45,21 @@
});
suite('keyboard shortcuts', function() {
- test('U should navigate to /', function() {
+ test('U should navigate to / if no backPage set', function() {
var showStub = sinon.stub(page, 'show');
MockInteractions.pressAndReleaseKeyOn(element, 85); // 'U'
assert(showStub.lastCall.calledWithExactly('/'));
showStub.restore();
});
+ test('U should navigate to backPage if set', function() {
+ element.backPage = '/dashboard/self';
+ var showStub = sinon.stub(page, 'show');
+ MockInteractions.pressAndReleaseKeyOn(element, 85); // 'U'
+ assert(showStub.lastCall.calledWithExactly('/dashboard/self'));
+ showStub.restore();
+ });
+
test('A should toggle overlay', function() {
MockInteractions.pressAndReleaseKeyOn(element, 65); // 'A'
var overlayEl = element.$.replyOverlay;
diff --git a/polygerrit-ui/app/elements/gr-app.html b/polygerrit-ui/app/elements/gr-app.html
index 9382f3a..633e8f2 100644
--- a/polygerrit-ui/app/elements/gr-app.html
+++ b/polygerrit-ui/app/elements/gr-app.html
@@ -104,7 +104,8 @@
<gr-change-view
params="[[params]]"
server-config="[[_serverConfig]]"
- view-state="{{_viewState.changeView}}"></gr-change-view>
+ view-state="{{_viewState.changeView}}"
+ back-page="[[_lastSearchPage]]"></gr-change-view>
</template>
<template is="dom-if" if="[[_showDiffView]]" restamp="true">
<gr-diff-view
diff --git a/polygerrit-ui/app/elements/gr-app.js b/polygerrit-ui/app/elements/gr-app.js
index 2c7a999..03d0f95 100644
--- a/polygerrit-ui/app/elements/gr-app.js
+++ b/polygerrit-ui/app/elements/gr-app.js
@@ -43,6 +43,7 @@
_showSettingsView: Boolean,
_viewState: Object,
_lastError: Object,
+ _lastSearchPage: String,
_path: String,
},
@@ -167,6 +168,14 @@
pathname += '@' + hash;
}
this.set('_path', pathname);
+ this._handleSearchPageChange();
+ },
+
+ _handleSearchPageChange: function() {
+ var viewsToCheck = ['gr-change-list-view', 'gr-dashboard-view'];
+ if (viewsToCheck.indexOf(this.params.view) !== -1) {
+ this.set('_lastSearchPage', location.pathname);
+ }
},
_handleTitleChange: function(e) {
diff --git a/polygerrit-ui/app/elements/gr-app_test.html b/polygerrit-ui/app/elements/gr-app_test.html
index c5c68ea..0255c2b 100644
--- a/polygerrit-ui/app/elements/gr-app_test.html
+++ b/polygerrit-ui/app/elements/gr-app_test.html
@@ -74,6 +74,9 @@
var event = {detail: curLocation};
var gwtLink = element.$$('#gwtLink');
+
+ sinon.stub(element, '_handleSearchPageChange');
+
element._handleLocationChange(event);
assert.equal(gwtLink.href,
'http://' + location.host + '/?polygerrit=0#/c/1/1/testfile.txt@2');