diff --git a/polygerrit-ui/app/behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior.html b/polygerrit-ui/app/behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior.html
index ac6889607f..db11937b73 100644
--- a/polygerrit-ui/app/behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior.html
+++ b/polygerrit-ui/app/behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior.html
@@ -91,13 +91,16 @@ limitations under the License.
let links = ADMIN_LINKS.slice(0);
let expandedSection;
+ const isExernalLink = link => link.url[0] !== '/';
+
// Append top-level links that are defined by plugins.
links.push(...getAdminMenuLinks().map(link => ({
url: link.url,
name: link.text,
- noBaseUrl: link.url[0] === '/',
+ noBaseUrl: !isExernalLink(link),
view: null,
viewableToAll: true,
+ target: isExernalLink(link) ? '_blank' : null,
})));
links = links.filter(filterFn);
diff --git a/polygerrit-ui/app/behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior_test.html b/polygerrit-ui/app/behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior_test.html
index 3e1b868f58..a1902cda5f 100644
--- a/polygerrit-ui/app/behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior_test.html
+++ b/polygerrit-ui/app/behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior_test.html
@@ -93,9 +93,17 @@ limitations under the License.
if (expected.pluginGeneratedLinks) {
for (const link of expected.pluginGeneratedLinks) {
- assert.isTrue(!!res.links.find(l => {
+ const linkMatch = res.links.find(l => {
return (l.url === link.url && l.name === link.text);
- }));
+ });
+ assert.isTrue(!!linkMatch);
+
+ // External links should open in new tab.
+ if (link.url[0] !== '/') {
+ assert.equal(linkMatch.target, '_blank');
+ } else {
+ assert.isNotOk(linkMatch.target);
+ }
}
}
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.html b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.html
index 9148da15d4..facfad5fbd 100644
--- a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.html
@@ -162,6 +162,7 @@ limitations under the License.
noBaseUrl: true,
view: null,
viewableToAll: true,
+ target: null,
});
assert.deepEqual(element._filteredLinks[2], {
url: 'http://external/link/url',
@@ -169,6 +170,7 @@ limitations under the License.
noBaseUrl: false,
view: null,
viewableToAll: true,
+ target: '_blank',
});
});
});
diff --git a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html
index 306b3fc0a2..fa0fe520a3 100644
--- a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html
+++ b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html
@@ -18,8 +18,10 @@ limitations under the License.
+
+
@@ -170,12 +172,6 @@ limitations under the License.
-
-
- Browse
-
+
diff --git a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.js b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.js
index 3ef61269b5..42c744fc9f 100644
--- a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.js
+++ b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.js
@@ -93,7 +93,8 @@
},
_links: {
type: Array,
- computed: '_computeLinks(_defaultLinks, _userLinks, _docBaseUrl)',
+ computed: '_computeLinks(_defaultLinks, _userLinks, _adminLinks, ' +
+ '_docBaseUrl)',
},
_loginURL: {
type: String,
@@ -106,6 +107,7 @@
},
behaviors: [
+ Gerrit.AdminNavBehavior,
Gerrit.BaseUrlBehavior,
Gerrit.DocsUrlBehavior,
],
@@ -149,7 +151,7 @@
return '//' + window.location.host + this.getBaseUrl() + path;
},
- _computeLinks(defaultLinks, userLinks, docBaseUrl) {
+ _computeLinks(defaultLinks, userLinks, adminLinks, docBaseUrl) {
const links = defaultLinks.slice();
if (userLinks && userLinks.length > 0) {
links.push({
@@ -165,6 +167,10 @@
class: 'hideOnMobile',
});
}
+ links.push({
+ title: 'Browse',
+ links: adminLinks,
+ });
return links;
},
@@ -186,10 +192,23 @@
},
_loadAccount() {
- return this.$.restAPI.getAccount().then(account => {
+ const promises = [
+ this.$.restAPI.getAccount(),
+ Gerrit.awaitPluginsLoaded(),
+ ];
+
+ return Promise.all(promises).then(result => {
+ const account = result[0];
this._account = account;
this.$.accountContainer.classList.toggle('loggedIn', account != null);
this.$.accountContainer.classList.toggle('loggedOut', account == null);
+
+ return this.getAdminLinks(account,
+ this.$.restAPI.getAccountCapabilities.bind(this.$.restAPI),
+ this.$.jsAPI.getAdminMenuLinks.bind(this.$.jsAPI))
+ .then(res => {
+ this._adminLinks = res.links;
+ });
});
},
diff --git a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.html b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.html
index 1fd0402ce6..5d5154689e 100644
--- a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.html
+++ b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.html
@@ -87,15 +87,28 @@ limitations under the License.
name: 'Facebook',
url: 'https://facebook.com',
}];
+ const adminLinks = [{
+ name: 'Repos',
+ url: '/repos',
+ }];
// When no admin links are passed, it should use the default.
- assert.deepEqual(element._computeLinks(defaultLinks, []), defaultLinks);
- assert.deepEqual(
- element._computeLinks(defaultLinks, userLinks),
+ assert.deepEqual(element._computeLinks(defaultLinks, [], adminLinks),
defaultLinks.concat({
- title: 'Your',
- links: userLinks,
+ title: 'Browse',
+ links: adminLinks,
}));
+ assert.deepEqual(
+ element._computeLinks(defaultLinks, userLinks, adminLinks),
+ defaultLinks.concat([
+ {
+ title: 'Your',
+ links: userLinks,
+ },
+ {
+ title: 'Browse',
+ links: adminLinks,
+ }]));
});
test('documentation links', () => {