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', () => {