Add subsection dropdown to gr-admin-view
Bug: Issue 8671 Change-Id: I9f84e6d11477f3a18ea966dd6ded3ca79f9e10ac
This commit is contained in:
@@ -24,6 +24,8 @@ limitations under the License.
|
||||
<link rel="import" href="../../../styles/gr-page-nav-styles.html">
|
||||
<link rel="import" href="../../../styles/shared-styles.html">
|
||||
<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
|
||||
<link rel="import" href="../../shared/gr-dropdown-list/gr-dropdown-list.html">
|
||||
<link rel="import" href="../../shared/gr-icons/gr-icons.html">
|
||||
<link rel="import" href="../../shared/gr-js-api-interface/gr-js-api-interface.html">
|
||||
<link rel="import" href="../../shared/gr-page-nav/gr-page-nav.html">
|
||||
<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
|
||||
@@ -43,7 +45,38 @@ limitations under the License.
|
||||
<template>
|
||||
<style include="shared-styles"></style>
|
||||
<style include="gr-menu-page-styles"></style>
|
||||
<style include="gr-page-nav-styles"></style>
|
||||
<style include="gr-page-nav-styles">
|
||||
gr-dropdown-list {
|
||||
--trigger-style: {
|
||||
text-transform: none;
|
||||
}
|
||||
}
|
||||
.breadcrumbText {
|
||||
/* Same as dropdown trigger so chevron spacing is consistent. */
|
||||
padding: 5px 4px;
|
||||
}
|
||||
iron-icon {
|
||||
margin: 0 .2em;
|
||||
}
|
||||
.breadcrumb {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
}
|
||||
.mainHeader {
|
||||
align-items: baseline;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
display: flex;
|
||||
}
|
||||
.selectText {
|
||||
display: none;
|
||||
}
|
||||
.selectText.show {
|
||||
display: inline-block;
|
||||
}
|
||||
main.breadcrumbs:not(.table) {
|
||||
margin-top: 1em;
|
||||
}
|
||||
</style>
|
||||
<gr-page-nav class="navStyles">
|
||||
<ul class="sectionContent">
|
||||
<template id="adminNav" is="dom-repeat" items="[[_filteredLinks]]">
|
||||
@@ -75,29 +108,26 @@ limitations under the License.
|
||||
</template>
|
||||
</ul>
|
||||
</gr-page-nav>
|
||||
<template is="dom-if" if="[[_subsectionLinks.length]]">
|
||||
<section class="mainHeader">
|
||||
<span class="breadcrumb">
|
||||
<span class="breadcrumbText">[[_breadcrumbParentName]]</span>
|
||||
<iron-icon icon="gr-icons:chevron-right"></iron-icon>
|
||||
</span>
|
||||
<gr-dropdown-list
|
||||
lowercase
|
||||
id="pageSelect"
|
||||
value="[[_computeSelectValue(params)]]"
|
||||
items="[[_subsectionLinks]]"
|
||||
on-value-change="_handleSubsectionChange">
|
||||
</gr-dropdown-list>
|
||||
</section>
|
||||
</template>
|
||||
<template is="dom-if" if="[[_showRepoList]]" restamp="true">
|
||||
<main class="table">
|
||||
<gr-repo-list class="table" params="[[params]]"></gr-repo-list>
|
||||
</main>
|
||||
</template>
|
||||
<template is="dom-if" if="[[_showRepoMain]]" restamp="true">
|
||||
<main>
|
||||
<gr-repo repo="[[params.repo]]"></gr-repo>
|
||||
</main>
|
||||
</template>
|
||||
<template is="dom-if" if="[[_showGroup]]" restamp="true">
|
||||
<main>
|
||||
<gr-group
|
||||
group-id="[[params.groupId]]"
|
||||
on-name-changed="_updateGroupName"></gr-group>
|
||||
</main>
|
||||
</template>
|
||||
<template is="dom-if" if="[[_showGroupMembers]]" restamp="true">
|
||||
<main>
|
||||
<gr-group-members
|
||||
group-id="[[params.groupId]]"></gr-group-members>
|
||||
</main>
|
||||
</template>
|
||||
<template is="dom-if" if="[[_showGroupList]]" restamp="true">
|
||||
<main class="table">
|
||||
<gr-admin-group-list class="table" params="[[params]]">
|
||||
@@ -109,35 +139,53 @@ limitations under the License.
|
||||
<gr-plugin-list class="table" params="[[params]]"></gr-plugin-list>
|
||||
</main>
|
||||
</template>
|
||||
<template is="dom-if" if="[[_showRepoMain]]" restamp="true">
|
||||
<main class="breadcrumbs">
|
||||
<gr-repo repo="[[params.repo]]"></gr-repo>
|
||||
</main>
|
||||
</template>
|
||||
<template is="dom-if" if="[[_showGroup]]" restamp="true">
|
||||
<main class="breadcrumbs">
|
||||
<gr-group
|
||||
group-id="[[params.groupId]]"
|
||||
on-name-changed="_updateGroupName"></gr-group>
|
||||
</main>
|
||||
</template>
|
||||
<template is="dom-if" if="[[_showGroupMembers]]" restamp="true">
|
||||
<main class="breadcrumbs">
|
||||
<gr-group-members
|
||||
group-id="[[params.groupId]]"></gr-group-members>
|
||||
</main>
|
||||
</template>
|
||||
<template is="dom-if" if="[[_showRepoDetailList]]" restamp="true">
|
||||
<main class="table">
|
||||
<main class="table breadcrumbs">
|
||||
<gr-repo-detail-list
|
||||
params="[[params]]"
|
||||
class="table"></gr-repo-detail-list>
|
||||
</main>
|
||||
</template>
|
||||
<template is="dom-if" if="[[_showGroupAuditLog]]" restamp="true">
|
||||
<main class="table">
|
||||
<main class="table breadcrumbs">
|
||||
<gr-group-audit-log
|
||||
group-id="[[params.groupId]]"
|
||||
class="table"></gr-group-audit-log>
|
||||
</main>
|
||||
</template>
|
||||
<template is="dom-if" if="[[_showRepoCommands]]" restamp="true">
|
||||
<main>
|
||||
<main class="breadcrumbs">
|
||||
<gr-repo-commands
|
||||
repo="[[params.repo]]"></gr-repo-commands>
|
||||
</main>
|
||||
</template>
|
||||
<template is="dom-if" if="[[_showRepoAccess]]" restamp="true">
|
||||
<main class="table">
|
||||
<main class="breadcrumbs">
|
||||
<gr-repo-access
|
||||
path="[[path]]"
|
||||
repo="[[params.repo]]"></gr-repo-access>
|
||||
</main>
|
||||
</template>
|
||||
<template is="dom-if" if="[[_showRepoDashboards]]" restamp="true">
|
||||
<main class="table">
|
||||
<main class="table breadcrumbs">
|
||||
<gr-repo-dashboards repo="[[params.repo]]"></gr-repo-dashboards>
|
||||
</main>
|
||||
</template>
|
||||
|
@@ -29,6 +29,7 @@
|
||||
path: String,
|
||||
adminView: String,
|
||||
|
||||
_breadcrumbParentName: String,
|
||||
_repoName: String,
|
||||
_groupId: {
|
||||
type: Number,
|
||||
@@ -103,6 +104,8 @@
|
||||
options)
|
||||
.then(res => {
|
||||
this._filteredLinks = res.links;
|
||||
this._breadcrumbParentName = res.expandedSection ?
|
||||
res.expandedSection.name : '';
|
||||
|
||||
if (!res.expandedSection) {
|
||||
this._subsectionLinks = [];
|
||||
@@ -112,7 +115,7 @@
|
||||
.concat(res.expandedSection.children).map(section => {
|
||||
return {
|
||||
text: !section.detailType ? 'Home' : section.name,
|
||||
value: section.view + section.detailType,
|
||||
value: section.view + (section.detailType || ''),
|
||||
view: section.view,
|
||||
url: section.url,
|
||||
detailType: section.detailType,
|
||||
@@ -123,6 +126,17 @@
|
||||
});
|
||||
},
|
||||
|
||||
_computeSelectValue(params) {
|
||||
if (!params || !params.view) { return; }
|
||||
return params.view + (params.detail || '');
|
||||
},
|
||||
|
||||
_selectedIsCurrentPage(selected) {
|
||||
return (selected.parent === (this._repoName || this._groupId) &&
|
||||
selected.view === this.params.view &&
|
||||
selected.detailType === this.params.detail);
|
||||
},
|
||||
|
||||
_handleSubsectionChange(e) {
|
||||
const selected = this._subsectionLinks
|
||||
.find(section => section.value === e.detail.value);
|
||||
@@ -165,16 +179,22 @@
|
||||
this.set('_showPluginList', isAdminView &&
|
||||
params.adminView === 'gr-plugin-list');
|
||||
|
||||
let needsReload = false;
|
||||
if (params.repo !== this._repoName) {
|
||||
this._repoName = params.repo || '';
|
||||
// Reloads the admin menu.
|
||||
this.reload();
|
||||
needsReload = true;
|
||||
}
|
||||
if (params.groupId !== this._groupId) {
|
||||
this._groupId = params.groupId || '';
|
||||
// Reloads the admin menu.
|
||||
this.reload();
|
||||
needsReload = true;
|
||||
}
|
||||
if (this._breadcrumbParentName && !params.groupId && !params.repo) {
|
||||
needsReload = true;
|
||||
}
|
||||
if (!needsReload) { return; }
|
||||
this.reload();
|
||||
},
|
||||
|
||||
_computeSelectedTitle(params) {
|
||||
|
@@ -79,7 +79,6 @@ limitations under the License.
|
||||
name: 'Repositories',
|
||||
url: '/admin/repos',
|
||||
view: 'gr-repo-list',
|
||||
children: [],
|
||||
}];
|
||||
|
||||
element.params = {
|
||||
@@ -189,17 +188,10 @@ limitations under the License.
|
||||
});
|
||||
element.reload().then(() => {
|
||||
flushAsynchronousOperations();
|
||||
assert.equal(element._filteredLinks.length, 3);
|
||||
|
||||
// Repos
|
||||
assert.equal(element._filteredLinks[0].subsection.children.length, 5);
|
||||
assert.equal(element._filteredLinks[0].subsection.name, 'Test Repo');
|
||||
|
||||
// Groups
|
||||
assert.isNotOk(element._filteredLinks[1].subsection);
|
||||
|
||||
// Plugins
|
||||
assert.isNotOk(element._filteredLinks[2].subsection);
|
||||
assert.equal(Polymer.dom(element.root)
|
||||
.querySelectorAll('.sectionTitle').length, 3);
|
||||
assert.equal(element.$$('.breadcrumbText').innerText, 'Test Repo');
|
||||
assert.equal(element.$$('#pageSelect').items.length, 6);
|
||||
done();
|
||||
});
|
||||
});
|
||||
@@ -287,6 +279,188 @@ limitations under the License.
|
||||
element.$$('gr-group').fire('name-changed', {name: newName});
|
||||
});
|
||||
|
||||
test('dropdown displays if there is a subsection', () => {
|
||||
assert.isNotOk(element.$$('.mainHeader'));
|
||||
element._subsectionLinks = [
|
||||
{
|
||||
text: 'Home',
|
||||
value: 'repo',
|
||||
view: 'repo',
|
||||
url: '',
|
||||
parent: 'my-repo',
|
||||
detailType: undefined,
|
||||
},
|
||||
];
|
||||
flushAsynchronousOperations();
|
||||
assert.isOk(element.$$('.mainHeader'));
|
||||
element._subsectionLinks = undefined;
|
||||
flushAsynchronousOperations();
|
||||
assert.equal(getComputedStyle(element.$$('.mainHeader')).display, 'none');
|
||||
});
|
||||
|
||||
test('Dropdown only triggers navigation on explicit select', done => {
|
||||
element._repoName = 'my-repo';
|
||||
element.params = {
|
||||
repo: 'my-repo',
|
||||
view: Gerrit.Nav.View.REPO,
|
||||
detail: Gerrit.Nav.RepoDetailView.ACCESS,
|
||||
};
|
||||
sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => {
|
||||
return Promise.resolve({
|
||||
createGroup: true,
|
||||
createProject: true,
|
||||
viewPlugins: true,
|
||||
});
|
||||
});
|
||||
sandbox.stub(element.$.restAPI, 'getAccount', () => {
|
||||
return Promise.resolve({_id: 1});
|
||||
});
|
||||
flushAsynchronousOperations();
|
||||
const expectedFilteredLinks = [
|
||||
{
|
||||
name: 'Repositories',
|
||||
noBaseUrl: true,
|
||||
url: '/admin/repos',
|
||||
view: 'gr-repo-list',
|
||||
viewableToAll: true,
|
||||
subsection: {
|
||||
name: 'my-repo',
|
||||
view: 'repo',
|
||||
url: '',
|
||||
children: [
|
||||
{
|
||||
name: 'Access',
|
||||
view: 'repo',
|
||||
detailType: 'access',
|
||||
url: '',
|
||||
},
|
||||
{
|
||||
name: 'Commands',
|
||||
view: 'repo',
|
||||
detailType: 'commands',
|
||||
url: '',
|
||||
},
|
||||
{
|
||||
name: 'Branches',
|
||||
view: 'repo',
|
||||
detailType: 'branches',
|
||||
url: '',
|
||||
},
|
||||
{
|
||||
name: 'Tags',
|
||||
view: 'repo',
|
||||
detailType: 'tags',
|
||||
url: '',
|
||||
},
|
||||
{
|
||||
name: 'Dashboards',
|
||||
view: 'repo',
|
||||
detailType: 'dashboards',
|
||||
url: '',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'Groups',
|
||||
section: 'Groups',
|
||||
noBaseUrl: true,
|
||||
url: '/admin/groups',
|
||||
view: 'gr-admin-group-list',
|
||||
},
|
||||
{
|
||||
name: 'Plugins',
|
||||
capability: 'viewPlugins',
|
||||
section: 'Plugins',
|
||||
noBaseUrl: true,
|
||||
url: '/admin/plugins',
|
||||
view: 'gr-plugin-list',
|
||||
},
|
||||
];
|
||||
const expectedSubsectionLinks = [
|
||||
{
|
||||
text: 'Home',
|
||||
value: 'repo',
|
||||
view: 'repo',
|
||||
url: '',
|
||||
parent: 'my-repo',
|
||||
detailType: undefined,
|
||||
},
|
||||
{
|
||||
text: 'Access',
|
||||
value: 'repoaccess',
|
||||
view: 'repo',
|
||||
url: '',
|
||||
detailType: 'access',
|
||||
parent: 'my-repo',
|
||||
},
|
||||
{
|
||||
text: 'Commands',
|
||||
value: 'repocommands',
|
||||
view: 'repo',
|
||||
url: '',
|
||||
detailType: 'commands',
|
||||
parent: 'my-repo',
|
||||
},
|
||||
{
|
||||
text: 'Branches',
|
||||
value: 'repobranches',
|
||||
view: 'repo',
|
||||
url: '',
|
||||
detailType: 'branches',
|
||||
parent: 'my-repo',
|
||||
},
|
||||
{
|
||||
text: 'Tags',
|
||||
value: 'repotags',
|
||||
view: 'repo',
|
||||
url: '',
|
||||
detailType: 'tags',
|
||||
parent: 'my-repo',
|
||||
},
|
||||
{
|
||||
text: 'Dashboards',
|
||||
value: 'repodashboards',
|
||||
view: 'repo',
|
||||
url: '',
|
||||
detailType: 'dashboards',
|
||||
parent: 'my-repo',
|
||||
},
|
||||
];
|
||||
sandbox.stub(Gerrit.Nav, 'navigateToRelativeUrl');
|
||||
sandbox.spy(element, '_selectedIsCurrentPage');
|
||||
sandbox.spy(element, '_handleSubsectionChange');
|
||||
element.reload().then(() => {
|
||||
assert.deepEqual(element._filteredLinks, expectedFilteredLinks);
|
||||
assert.deepEqual(element._subsectionLinks, expectedSubsectionLinks);
|
||||
assert.equal(element.$$('#pageSelect').value, 'repoaccess');
|
||||
assert.isTrue(element._selectedIsCurrentPage.calledOnce);
|
||||
// Doesn't trigger navigation from the page select menu.
|
||||
assert.isFalse(Gerrit.Nav.navigateToRelativeUrl.called);
|
||||
|
||||
// When explicitly changed, navigation is called
|
||||
element.$$('#pageSelect').value = 'repo';
|
||||
assert.isTrue(element._selectedIsCurrentPage.calledTwice);
|
||||
assert.isTrue(Gerrit.Nav.navigateToRelativeUrl.calledOnce);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
test('_selectedIsCurrentPage', () => {
|
||||
element._repoName = 'my-repo';
|
||||
element.params = {view: 'repo', repo: 'my-repo'};
|
||||
const selected = {
|
||||
view: 'repo',
|
||||
detailType: undefined,
|
||||
parent: 'my-repo',
|
||||
};
|
||||
assert.isTrue(element._selectedIsCurrentPage(selected));
|
||||
selected.parent = 'my-second-repo';
|
||||
assert.isFalse(element._selectedIsCurrentPage(selected));
|
||||
selected.detailType = 'detailType';
|
||||
assert.isFalse(element._selectedIsCurrentPage(selected));
|
||||
});
|
||||
|
||||
suite('_computeSelectedClass', () => {
|
||||
setup(() => {
|
||||
sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => {
|
||||
|
@@ -25,7 +25,12 @@ limitations under the License.
|
||||
margin: 2em auto;
|
||||
max-width: 50em;
|
||||
}
|
||||
main.table {
|
||||
.mainHeader {
|
||||
margin-left: 14em;
|
||||
padding: 1em 0 1em 2em;
|
||||
}
|
||||
main.table,
|
||||
.mainHeader {
|
||||
margin-top: 0;
|
||||
margin-right: 0;
|
||||
margin-left: 14em;
|
||||
@@ -57,6 +62,10 @@ limitations under the License.
|
||||
main.table {
|
||||
margin: 0;
|
||||
}
|
||||
.mainHeader {
|
||||
margin-left: 0;
|
||||
padding: .5em 0 .5em 1em;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</template>
|
||||
|
Reference in New Issue
Block a user