Merge changes from topic "admin-nav-to-util"
* changes: Convert admin-nav-behaviors to admin-nav-util Rename gr-admin-nav-behavior to admin-nav-util to preserve history
This commit is contained in:
@@ -1,210 +0,0 @@
|
|||||||
import {GerritNav} from '../../elements/core/gr-navigation/gr-navigation.js';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const ADMIN_LINKS = [{
|
|
||||||
name: 'Repositories',
|
|
||||||
noBaseUrl: true,
|
|
||||||
url: '/admin/repos',
|
|
||||||
view: 'gr-repo-list',
|
|
||||||
viewableToAll: true,
|
|
||||||
}, {
|
|
||||||
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',
|
|
||||||
}];
|
|
||||||
|
|
||||||
window.Gerrit = window.Gerrit || {};
|
|
||||||
|
|
||||||
/** @polymerBehavior Gerrit.AdminNavBehavior */
|
|
||||||
export const AdminNavBehavior = {
|
|
||||||
/**
|
|
||||||
* @param {!Object} account
|
|
||||||
* @param {!Function} getAccountCapabilities
|
|
||||||
* @param {!Function} getAdminMenuLinks
|
|
||||||
* Possible aguments in options:
|
|
||||||
* repoName?: string
|
|
||||||
* groupId?: string,
|
|
||||||
* groupName?: string,
|
|
||||||
* groupIsInternal?: boolean,
|
|
||||||
* isAdmin?: boolean,
|
|
||||||
* groupOwner?: boolean,
|
|
||||||
* @param {!Object=} opt_options
|
|
||||||
* @return {Promise<!Object>}
|
|
||||||
*/
|
|
||||||
getAdminLinks(account, getAccountCapabilities, getAdminMenuLinks,
|
|
||||||
opt_options) {
|
|
||||||
if (!account) {
|
|
||||||
return Promise.resolve(this._filterLinks(link => link.viewableToAll,
|
|
||||||
getAdminMenuLinks, opt_options));
|
|
||||||
}
|
|
||||||
return getAccountCapabilities()
|
|
||||||
.then(capabilities => this._filterLinks(
|
|
||||||
link => !link.capability
|
|
||||||
|| capabilities.hasOwnProperty(link.capability),
|
|
||||||
getAdminMenuLinks,
|
|
||||||
opt_options));
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {!Function} filterFn
|
|
||||||
* @param {!Function} getAdminMenuLinks
|
|
||||||
* Possible aguments in options:
|
|
||||||
* repoName?: string
|
|
||||||
* groupId?: string,
|
|
||||||
* groupName?: string,
|
|
||||||
* groupIsInternal?: boolean,
|
|
||||||
* isAdmin?: boolean,
|
|
||||||
* groupOwner?: boolean,
|
|
||||||
* @param {!Object|undefined} opt_options
|
|
||||||
* @return {Promise<!Object>}
|
|
||||||
*/
|
|
||||||
_filterLinks(filterFn, getAdminMenuLinks, opt_options) {
|
|
||||||
let links = ADMIN_LINKS.slice(0);
|
|
||||||
let expandedSection;
|
|
||||||
|
|
||||||
const isExternalLink = link => link.url[0] !== '/';
|
|
||||||
|
|
||||||
// Append top-level links that are defined by plugins.
|
|
||||||
links.push(...getAdminMenuLinks().map(link => {
|
|
||||||
return {
|
|
||||||
url: link.url,
|
|
||||||
name: link.text,
|
|
||||||
capability: link.capability || null,
|
|
||||||
noBaseUrl: !isExternalLink(link),
|
|
||||||
view: null,
|
|
||||||
viewableToAll: !link.capability,
|
|
||||||
target: isExternalLink(link) ? '_blank' : null,
|
|
||||||
};
|
|
||||||
}));
|
|
||||||
|
|
||||||
links = links.filter(filterFn);
|
|
||||||
|
|
||||||
const filteredLinks = [];
|
|
||||||
const repoName = opt_options && opt_options.repoName;
|
|
||||||
const groupId = opt_options && opt_options.groupId;
|
|
||||||
const groupName = opt_options && opt_options.groupName;
|
|
||||||
const groupIsInternal = opt_options && opt_options.groupIsInternal;
|
|
||||||
const isAdmin = opt_options && opt_options.isAdmin;
|
|
||||||
const groupOwner = opt_options && opt_options.groupOwner;
|
|
||||||
|
|
||||||
// Don't bother to get sub-navigation items if only the top level links
|
|
||||||
// are needed. This is used by the main header dropdown.
|
|
||||||
if (!repoName && !groupId) { return {links, expandedSection}; }
|
|
||||||
|
|
||||||
// Otherwise determine the full set of links and return both the full
|
|
||||||
// set in addition to the subsection that should be displayed if it
|
|
||||||
// exists.
|
|
||||||
for (const link of links) {
|
|
||||||
const linkCopy = Object.assign({}, link);
|
|
||||||
if (linkCopy.name === 'Repositories' && repoName) {
|
|
||||||
linkCopy.subsection = this.getRepoSubsections(repoName);
|
|
||||||
expandedSection = linkCopy.subsection;
|
|
||||||
} else if (linkCopy.name === 'Groups' && groupId && groupName) {
|
|
||||||
linkCopy.subsection = this.getGroupSubsections(groupId, groupName,
|
|
||||||
groupIsInternal, isAdmin, groupOwner);
|
|
||||||
expandedSection = linkCopy.subsection;
|
|
||||||
}
|
|
||||||
filteredLinks.push(linkCopy);
|
|
||||||
}
|
|
||||||
return {links: filteredLinks, expandedSection};
|
|
||||||
},
|
|
||||||
|
|
||||||
getGroupSubsections(groupId, groupName, groupIsInternal, isAdmin,
|
|
||||||
groupOwner) {
|
|
||||||
const subsection = {
|
|
||||||
name: groupName,
|
|
||||||
view: GerritNav.View.GROUP,
|
|
||||||
url: GerritNav.getUrlForGroup(groupId),
|
|
||||||
children: [],
|
|
||||||
};
|
|
||||||
if (groupIsInternal) {
|
|
||||||
subsection.children.push({
|
|
||||||
name: 'Members',
|
|
||||||
detailType: GerritNav.GroupDetailView.MEMBERS,
|
|
||||||
view: GerritNav.View.GROUP,
|
|
||||||
url: GerritNav.getUrlForGroupMembers(groupId),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (groupIsInternal && (isAdmin || groupOwner)) {
|
|
||||||
subsection.children.push(
|
|
||||||
{
|
|
||||||
name: 'Audit Log',
|
|
||||||
detailType: GerritNav.GroupDetailView.LOG,
|
|
||||||
view: GerritNav.View.GROUP,
|
|
||||||
url: GerritNav.getUrlForGroupLog(groupId),
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return subsection;
|
|
||||||
},
|
|
||||||
|
|
||||||
getRepoSubsections(repoName) {
|
|
||||||
return {
|
|
||||||
name: repoName,
|
|
||||||
view: GerritNav.View.REPO,
|
|
||||||
url: GerritNav.getUrlForRepo(repoName),
|
|
||||||
children: [{
|
|
||||||
name: 'Access',
|
|
||||||
view: GerritNav.View.REPO,
|
|
||||||
detailType: GerritNav.RepoDetailView.ACCESS,
|
|
||||||
url: GerritNav.getUrlForRepoAccess(repoName),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Commands',
|
|
||||||
view: GerritNav.View.REPO,
|
|
||||||
detailType: GerritNav.RepoDetailView.COMMANDS,
|
|
||||||
url: GerritNav.getUrlForRepoCommands(repoName),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Branches',
|
|
||||||
view: GerritNav.View.REPO,
|
|
||||||
detailType: GerritNav.RepoDetailView.BRANCHES,
|
|
||||||
url: GerritNav.getUrlForRepoBranches(repoName),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Tags',
|
|
||||||
view: GerritNav.View.REPO,
|
|
||||||
detailType: GerritNav.RepoDetailView.TAGS,
|
|
||||||
url: GerritNav.getUrlForRepoTags(repoName),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Dashboards',
|
|
||||||
view: GerritNav.View.REPO,
|
|
||||||
detailType: GerritNav.RepoDetailView.DASHBOARDS,
|
|
||||||
url: GerritNav.getUrlForRepoDashboards(repoName),
|
|
||||||
}],
|
|
||||||
};
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
// TODO(dmfilippov) Remove the following lines with assignments
|
|
||||||
// Plugins can use the behavior because it was accessible with
|
|
||||||
// the global Gerrit... variable. To avoid breaking changes in plugins
|
|
||||||
// temporary assign global variables.
|
|
||||||
window.Gerrit = window.Gerrit || {};
|
|
||||||
window.Gerrit.AdminNavBehavior = AdminNavBehavior;
|
|
||||||
@@ -33,26 +33,23 @@ import '../gr-repo-commands/gr-repo-commands.js';
|
|||||||
import '../gr-repo-dashboards/gr-repo-dashboards.js';
|
import '../gr-repo-dashboards/gr-repo-dashboards.js';
|
||||||
import '../gr-repo-detail-list/gr-repo-detail-list.js';
|
import '../gr-repo-detail-list/gr-repo-detail-list.js';
|
||||||
import '../gr-repo-list/gr-repo-list.js';
|
import '../gr-repo-list/gr-repo-list.js';
|
||||||
import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js';
|
|
||||||
import {GestureEventListeners} from '@polymer/polymer/lib/mixins/gesture-event-listeners.js';
|
import {GestureEventListeners} from '@polymer/polymer/lib/mixins/gesture-event-listeners.js';
|
||||||
import {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin.js';
|
import {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin.js';
|
||||||
import {PolymerElement} from '@polymer/polymer/polymer-element.js';
|
import {PolymerElement} from '@polymer/polymer/polymer-element.js';
|
||||||
import {htmlTemplate} from './gr-admin-view_html.js';
|
import {htmlTemplate} from './gr-admin-view_html.js';
|
||||||
import {getBaseUrl} from '../../../utils/url-util.js';
|
import {getBaseUrl} from '../../../utils/url-util.js';
|
||||||
import {AdminNavBehavior} from '../../../behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior.js';
|
|
||||||
import {GerritNav} from '../../core/gr-navigation/gr-navigation.js';
|
import {GerritNav} from '../../core/gr-navigation/gr-navigation.js';
|
||||||
import {pluginLoader} from '../../shared/gr-js-api-interface/gr-plugin-loader.js';
|
import {pluginLoader} from '../../shared/gr-js-api-interface/gr-plugin-loader.js';
|
||||||
|
import {getAdminLinks} from '../../../utils/admin-nav-util.js';
|
||||||
|
|
||||||
const INTERNAL_GROUP_REGEX = /^[\da-f]{40}$/;
|
const INTERNAL_GROUP_REGEX = /^[\da-f]{40}$/;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @extends PolymerElement
|
* @extends PolymerElement
|
||||||
*/
|
*/
|
||||||
class GrAdminView extends mixinBehaviors( [
|
class GrAdminView extends GestureEventListeners(
|
||||||
AdminNavBehavior,
|
|
||||||
], GestureEventListeners(
|
|
||||||
LegacyElementMixin(
|
LegacyElementMixin(
|
||||||
PolymerElement))) {
|
PolymerElement)) {
|
||||||
static get template() { return htmlTemplate; }
|
static get template() { return htmlTemplate; }
|
||||||
|
|
||||||
static get is() { return 'gr-admin-view'; }
|
static get is() { return 'gr-admin-view'; }
|
||||||
@@ -132,7 +129,7 @@ class GrAdminView extends mixinBehaviors( [
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.getAdminLinks(this._account,
|
return getAdminLinks(this._account,
|
||||||
this.$.restAPI.getAccountCapabilities.bind(this.$.restAPI),
|
this.$.restAPI.getAccountCapabilities.bind(this.$.restAPI),
|
||||||
this.$.jsAPI.getAdminMenuLinks.bind(this.$.jsAPI),
|
this.$.jsAPI.getAdminMenuLinks.bind(this.$.jsAPI),
|
||||||
options)
|
options)
|
||||||
|
|||||||
@@ -21,14 +21,13 @@ import '../../shared/gr-js-api-interface/gr-js-api-interface.js';
|
|||||||
import '../../shared/gr-rest-api-interface/gr-rest-api-interface.js';
|
import '../../shared/gr-rest-api-interface/gr-rest-api-interface.js';
|
||||||
import '../gr-account-dropdown/gr-account-dropdown.js';
|
import '../gr-account-dropdown/gr-account-dropdown.js';
|
||||||
import '../gr-smart-search/gr-smart-search.js';
|
import '../gr-smart-search/gr-smart-search.js';
|
||||||
import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js';
|
|
||||||
import {GestureEventListeners} from '@polymer/polymer/lib/mixins/gesture-event-listeners.js';
|
import {GestureEventListeners} from '@polymer/polymer/lib/mixins/gesture-event-listeners.js';
|
||||||
import {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin.js';
|
import {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin.js';
|
||||||
import {PolymerElement} from '@polymer/polymer/polymer-element.js';
|
import {PolymerElement} from '@polymer/polymer/polymer-element.js';
|
||||||
import {htmlTemplate} from './gr-main-header_html.js';
|
import {htmlTemplate} from './gr-main-header_html.js';
|
||||||
import {getBaseUrl, getDocsBaseUrl} from '../../../utils/url-util.js';
|
import {getBaseUrl, getDocsBaseUrl} from '../../../utils/url-util.js';
|
||||||
import {AdminNavBehavior} from '../../../behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior.js';
|
|
||||||
import {pluginLoader} from '../../shared/gr-js-api-interface/gr-plugin-loader.js';
|
import {pluginLoader} from '../../shared/gr-js-api-interface/gr-plugin-loader.js';
|
||||||
|
import {getAdminLinks} from '../../../utils/admin-nav-util.js';
|
||||||
|
|
||||||
const DEFAULT_LINKS = [{
|
const DEFAULT_LINKS = [{
|
||||||
title: 'Changes',
|
title: 'Changes',
|
||||||
@@ -85,11 +84,9 @@ const AUTH_TYPES_WITH_REGISTER_URL = new Set([
|
|||||||
/**
|
/**
|
||||||
* @extends PolymerElement
|
* @extends PolymerElement
|
||||||
*/
|
*/
|
||||||
class GrMainHeader extends mixinBehaviors( [
|
class GrMainHeader extends GestureEventListeners(
|
||||||
AdminNavBehavior,
|
|
||||||
], GestureEventListeners(
|
|
||||||
LegacyElementMixin(
|
LegacyElementMixin(
|
||||||
PolymerElement))) {
|
PolymerElement)) {
|
||||||
static get template() { return htmlTemplate; }
|
static get template() { return htmlTemplate; }
|
||||||
|
|
||||||
static get is() { return 'gr-main-header'; }
|
static get is() { return 'gr-main-header'; }
|
||||||
@@ -272,7 +269,7 @@ class GrMainHeader extends mixinBehaviors( [
|
|||||||
this.loading = false;
|
this.loading = false;
|
||||||
this._topMenus = result[1];
|
this._topMenus = result[1];
|
||||||
|
|
||||||
return this.getAdminLinks(account,
|
return getAdminLinks(account,
|
||||||
this.$.restAPI.getAccountCapabilities.bind(this.$.restAPI),
|
this.$.restAPI.getAccountCapabilities.bind(this.$.restAPI),
|
||||||
this.$.jsAPI.getAdminMenuLinks.bind(this.$.jsAPI))
|
this.$.jsAPI.getAdminMenuLinks.bind(this.$.jsAPI))
|
||||||
.then(res => {
|
.then(res => {
|
||||||
|
|||||||
197
polygerrit-ui/app/utils/admin-nav-util.js
Normal file
197
polygerrit-ui/app/utils/admin-nav-util.js
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright (C) 2018 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import {GerritNav} from '../elements/core/gr-navigation/gr-navigation.js';
|
||||||
|
|
||||||
|
const ADMIN_LINKS = [{
|
||||||
|
name: 'Repositories',
|
||||||
|
noBaseUrl: true,
|
||||||
|
url: '/admin/repos',
|
||||||
|
view: 'gr-repo-list',
|
||||||
|
viewableToAll: true,
|
||||||
|
}, {
|
||||||
|
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',
|
||||||
|
}];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {!Object} account
|
||||||
|
* @param {!Function} getAccountCapabilities
|
||||||
|
* @param {!Function} getAdminMenuLinks
|
||||||
|
* Possible aguments in options:
|
||||||
|
* repoName?: string
|
||||||
|
* groupId?: string,
|
||||||
|
* groupName?: string,
|
||||||
|
* groupIsInternal?: boolean,
|
||||||
|
* isAdmin?: boolean,
|
||||||
|
* groupOwner?: boolean,
|
||||||
|
* @param {!Object=} opt_options
|
||||||
|
* @return {Promise<!Object>}
|
||||||
|
*/
|
||||||
|
export function getAdminLinks(account, getAccountCapabilities,
|
||||||
|
getAdminMenuLinks, opt_options) {
|
||||||
|
if (!account) {
|
||||||
|
return Promise.resolve(_filterLinks(link => link.viewableToAll,
|
||||||
|
getAdminMenuLinks, opt_options));
|
||||||
|
}
|
||||||
|
return getAccountCapabilities()
|
||||||
|
.then(capabilities => _filterLinks(
|
||||||
|
link => !link.capability
|
||||||
|
|| capabilities.hasOwnProperty(link.capability),
|
||||||
|
getAdminMenuLinks,
|
||||||
|
opt_options));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {!Function} filterFn
|
||||||
|
* @param {!Function} getAdminMenuLinks
|
||||||
|
* Possible aguments in options:
|
||||||
|
* repoName?: string
|
||||||
|
* groupId?: string,
|
||||||
|
* groupName?: string,
|
||||||
|
* groupIsInternal?: boolean,
|
||||||
|
* isAdmin?: boolean,
|
||||||
|
* groupOwner?: boolean,
|
||||||
|
* @param {!Object|undefined} opt_options
|
||||||
|
* @return {Promise<!Object>}
|
||||||
|
*/
|
||||||
|
function _filterLinks(filterFn, getAdminMenuLinks, opt_options) {
|
||||||
|
let links = ADMIN_LINKS.slice(0);
|
||||||
|
let expandedSection;
|
||||||
|
|
||||||
|
const isExternalLink = link => link.url[0] !== '/';
|
||||||
|
|
||||||
|
// Append top-level links that are defined by plugins.
|
||||||
|
links.push(...getAdminMenuLinks().map(link => {
|
||||||
|
return {
|
||||||
|
url: link.url,
|
||||||
|
name: link.text,
|
||||||
|
capability: link.capability || null,
|
||||||
|
noBaseUrl: !isExternalLink(link),
|
||||||
|
view: null,
|
||||||
|
viewableToAll: !link.capability,
|
||||||
|
target: isExternalLink(link) ? '_blank' : null,
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
|
||||||
|
links = links.filter(filterFn);
|
||||||
|
|
||||||
|
const filteredLinks = [];
|
||||||
|
const repoName = opt_options && opt_options.repoName;
|
||||||
|
const groupId = opt_options && opt_options.groupId;
|
||||||
|
const groupName = opt_options && opt_options.groupName;
|
||||||
|
const groupIsInternal = opt_options && opt_options.groupIsInternal;
|
||||||
|
const isAdmin = opt_options && opt_options.isAdmin;
|
||||||
|
const groupOwner = opt_options && opt_options.groupOwner;
|
||||||
|
|
||||||
|
// Don't bother to get sub-navigation items if only the top level links
|
||||||
|
// are needed. This is used by the main header dropdown.
|
||||||
|
if (!repoName && !groupId) { return {links, expandedSection}; }
|
||||||
|
|
||||||
|
// Otherwise determine the full set of links and return both the full
|
||||||
|
// set in addition to the subsection that should be displayed if it
|
||||||
|
// exists.
|
||||||
|
for (const link of links) {
|
||||||
|
const linkCopy = Object.assign({}, link);
|
||||||
|
if (linkCopy.name === 'Repositories' && repoName) {
|
||||||
|
linkCopy.subsection = getRepoSubsections(repoName);
|
||||||
|
expandedSection = linkCopy.subsection;
|
||||||
|
} else if (linkCopy.name === 'Groups' && groupId && groupName) {
|
||||||
|
linkCopy.subsection = getGroupSubsections(groupId, groupName,
|
||||||
|
groupIsInternal, isAdmin, groupOwner);
|
||||||
|
expandedSection = linkCopy.subsection;
|
||||||
|
}
|
||||||
|
filteredLinks.push(linkCopy);
|
||||||
|
}
|
||||||
|
return {links: filteredLinks, expandedSection};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getGroupSubsections(groupId, groupName, groupIsInternal,
|
||||||
|
isAdmin, groupOwner) {
|
||||||
|
const subsection = {
|
||||||
|
name: groupName,
|
||||||
|
view: GerritNav.View.GROUP,
|
||||||
|
url: GerritNav.getUrlForGroup(groupId),
|
||||||
|
children: [],
|
||||||
|
};
|
||||||
|
if (groupIsInternal) {
|
||||||
|
subsection.children.push({
|
||||||
|
name: 'Members',
|
||||||
|
detailType: GerritNav.GroupDetailView.MEMBERS,
|
||||||
|
view: GerritNav.View.GROUP,
|
||||||
|
url: GerritNav.getUrlForGroupMembers(groupId),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (groupIsInternal && (isAdmin || groupOwner)) {
|
||||||
|
subsection.children.push(
|
||||||
|
{
|
||||||
|
name: 'Audit Log',
|
||||||
|
detailType: GerritNav.GroupDetailView.LOG,
|
||||||
|
view: GerritNav.View.GROUP,
|
||||||
|
url: GerritNav.getUrlForGroupLog(groupId),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return subsection;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getRepoSubsections(repoName) {
|
||||||
|
return {
|
||||||
|
name: repoName,
|
||||||
|
view: GerritNav.View.REPO,
|
||||||
|
url: GerritNav.getUrlForRepo(repoName),
|
||||||
|
children: [{
|
||||||
|
name: 'Access',
|
||||||
|
view: GerritNav.View.REPO,
|
||||||
|
detailType: GerritNav.RepoDetailView.ACCESS,
|
||||||
|
url: GerritNav.getUrlForRepoAccess(repoName),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Commands',
|
||||||
|
view: GerritNav.View.REPO,
|
||||||
|
detailType: GerritNav.RepoDetailView.COMMANDS,
|
||||||
|
url: GerritNav.getUrlForRepoCommands(repoName),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Branches',
|
||||||
|
view: GerritNav.View.REPO,
|
||||||
|
detailType: GerritNav.RepoDetailView.BRANCHES,
|
||||||
|
url: GerritNav.getUrlForRepoBranches(repoName),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Tags',
|
||||||
|
view: GerritNav.View.REPO,
|
||||||
|
detailType: GerritNav.RepoDetailView.TAGS,
|
||||||
|
url: GerritNav.getUrlForRepoTags(repoName),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Dashboards',
|
||||||
|
view: GerritNav.View.REPO,
|
||||||
|
detailType: GerritNav.RepoDetailView.DASHBOARDS,
|
||||||
|
url: GerritNav.getUrlForRepoDashboards(repoName),
|
||||||
|
}],
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -15,35 +15,20 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import '../../test/common-test-setup-karma.js';
|
import '../test/common-test-setup-karma.js';
|
||||||
import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn.js';
|
import {getAdminLinks} from './admin-nav-util.js';
|
||||||
import {AdminNavBehavior} from './gr-admin-nav-behavior.js';
|
|
||||||
|
|
||||||
const basicFixture = fixtureFromElement('gr-admin-nav-behavior-test-element');
|
|
||||||
|
|
||||||
suite('gr-admin-nav-behavior tests', () => {
|
suite('gr-admin-nav-behavior tests', () => {
|
||||||
let element;
|
|
||||||
let capabilityStub;
|
let capabilityStub;
|
||||||
let menuLinkStub;
|
let menuLinkStub;
|
||||||
|
|
||||||
suiteSetup(() => {
|
|
||||||
// Define a Polymer element that uses this behavior.
|
|
||||||
Polymer({
|
|
||||||
is: 'gr-admin-nav-behavior-test-element',
|
|
||||||
behaviors: [
|
|
||||||
AdminNavBehavior,
|
|
||||||
],
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
setup(() => {
|
setup(() => {
|
||||||
element = basicFixture.instantiate();
|
|
||||||
capabilityStub = sinon.stub();
|
capabilityStub = sinon.stub();
|
||||||
menuLinkStub = sinon.stub().returns([]);
|
menuLinkStub = sinon.stub().returns([]);
|
||||||
});
|
});
|
||||||
|
|
||||||
const testAdminLinks = (account, options, expected, done) => {
|
const testAdminLinks = (account, options, expected, done) => {
|
||||||
element.getAdminLinks(account,
|
getAdminLinks(account,
|
||||||
capabilityStub,
|
capabilityStub,
|
||||||
menuLinkStub,
|
menuLinkStub,
|
||||||
options)
|
options)
|
||||||
Reference in New Issue
Block a user