* Get list of permission templates
* @returns {Promise}
*/
-export function getPermissionTemplates () {
+export function getPermissionTemplates (organization) {
const url = '/api/permissions/search_templates';
- return getJSON(url);
+ return organization ? getJSON(url, { organization }) : getJSON(url);
}
export const createPermissionTemplate = data => (
/**
* Set default permission template for a given qualifier
- * @param {string} templateName
+ * @param {string} templateId
* @param {string} qualifier
* @returns {Promise}
*/
-export function setDefaultPermissionTemplate (templateName, qualifier) {
+export function setDefaultPermissionTemplate (templateId, qualifier) {
const url = '/api/permissions/set_default_template';
- const data = { templateName, qualifier };
+ const data = { templateId, qualifier };
return post(url, data);
}
return post(url, data);
}
-export function grantTemplatePermissionToUser (templateName, login, permission) {
+export function grantTemplatePermissionToUser (templateId, login, permission) {
const url = '/api/permissions/add_user_to_template';
- const data = { templateName, login, permission };
+ const data = { templateId, login, permission };
return post(url, data);
}
-export function revokeTemplatePermissionFromUser (templateName, login, permission) {
+export function revokeTemplatePermissionFromUser (templateId, login, permission) {
const url = '/api/permissions/remove_user_from_template';
- const data = { templateName, login, permission };
+ const data = { templateId, login, permission };
return post(url, data);
}
-export function grantTemplatePermissionToGroup (templateName, groupName, permission) {
+export function grantTemplatePermissionToGroup (data) {
const url = '/api/permissions/add_group_to_template';
- const data = { templateName, groupName, permission };
return post(url, data);
}
-export function revokeTemplatePermissionFromGroup (templateName, groupName, permission) {
+export function revokeTemplatePermissionFromGroup (data) {
const url = '/api/permissions/remove_group_from_template';
- const data = { templateName, groupName, permission };
return post(url, data);
}
-export function addProjectCreatorToTemplate (templateName, permission) {
+export function addProjectCreatorToTemplate (templateId, permission) {
const url = '/api/permissions/add_project_creator_to_template';
- const data = { templateName, permission };
+ const data = { templateId, permission };
return post(url, data);
}
-export function removeProjectCreatorFromTemplate (templateName, permission) {
+export function removeProjectCreatorFromTemplate (templateId, permission) {
const url = '/api/permissions/remove_project_creator_from_template';
- const data = { templateName, permission };
+ const data = { templateId, permission };
return post(url, data);
}
return getJSON(url, data).then(r => r.groups);
}
-export function getPermissionTemplateUsers (templateId, query = '', permission = null) {
+export function getPermissionTemplateUsers (templateId, query = '', permission = null, organization = null) {
const url = '/api/permissions/template_users';
const data = { templateId, ps: PAGE_SIZE };
if (query) {
if (permission) {
data.permission = permission;
}
+ if (organization) {
+ Object.assign(data, { organization });
+ }
return getJSON(url, data).then(r => r.users);
}
-export function getPermissionTemplateGroups (templateId, query = '', permission = null) {
+export function getPermissionTemplateGroups (templateId, query = '', permission = null, organization = null) {
const url = '/api/permissions/template_groups';
const data = { templateId, ps: PAGE_SIZE };
if (query) {
if (permission) {
data.permission = permission;
}
+ if (organization) {
+ Object.assign(data, { organization });
+ }
return getJSON(url, data).then(r => r.groups);
}
<div className="container">
<ul className="nav navbar-nav nav-crumbs">
<li>
- <IndexLink to="/settings">
- {translate('layout.settings')}
- </IndexLink>
+ <IndexLink to="/settings">
+ {translate('layout.settings')}
+ </IndexLink>
</li>
</ul>
{translate('global_permissions.page')}
</IndexLink>
</li>
- <li>
- <IndexLink to="/permission_templates" activeClassName="active">
- {translate('permission_templates')}
- </IndexLink>
- </li>
+ {!this.props.customOrganizations && (
+ <li>
+ <IndexLink to="/permission_templates" activeClassName="active">
+ {translate('permission_templates')}
+ </IndexLink>
+ </li>
+ )}
</ul>
</li>
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+// @flow
+import React from 'react';
+import { connect } from 'react-redux';
+import AppContainer from '../../permission-templates/components/AppContainer';
+import { getOrganizationByKey } from '../../../store/rootReducer';
+import type { Organization } from '../../../store/organizations/duck';
+
+class OrganizationPermissionTemplates extends React.Component {
+ props: {
+ location: {},
+ organization: Organization
+ };
+
+ render () {
+ return (
+ <AppContainer
+ location={this.props.location}
+ organization={this.props.organization}/>
+ );
+ }
+}
+
+const mapStateToProps = (state, ownProps) => ({
+ organization: getOrganizationByKey(state, ownProps.params.organizationKey)
+});
+
+export default connect(mapStateToProps)(OrganizationPermissionTemplates);
const ADMIN_PATHS = [
'edit',
'groups',
- 'delete'
+ 'delete',
+ 'permission_templates'
];
export default class OrganizationNavigation extends React.Component {
{translate('user_groups.page')}
</Link>
</li>
+ <li>
+ <Link to={`/organizations/${organization.key}/permission_templates`} activeClassName="active">
+ {translate('permission_templates')}
+ </Link>
+ </li>
<li>
<Link to={`/organizations/${organization.key}/edit`} activeClassName="active">
{translate('edit')}
user_groups.page
</Link>
</li>
+ <li>
+ <Link
+ activeClassName="active"
+ onlyActiveOnIndex={false}
+ style={Object {}}
+ to="/organizations/foo/permission_templates">
+ permission_templates
+ </Link>
+ </li>
<li>
<Link
activeClassName="active"
import OrganizationAdmin from './components/OrganizationAdmin';
import OrganizationEdit from './components/OrganizationEdit';
import OrganizationGroups from './components/OrganizationGroups';
+import OrganizationPermissionTemplates from './components/OrganizationPermissionTemplates';
import OrganizationDelete from './components/OrganizationDelete';
export default (
<Route path="delete" component={OrganizationDelete}/>
<Route path="edit" component={OrganizationEdit}/>
<Route path="groups" component={OrganizationGroups}/>
+ <Route path="permission_templates" component={OrganizationPermissionTemplates}/>
</Route>
</Route>
);
export default class ActionsCell extends React.Component {
static propTypes = {
+ organization: React.PropTypes.object,
permissionTemplate: PermissionTemplateType.isRequired,
topQualifiers: React.PropTypes.array.isRequired,
refresh: CallbackType,
new DeleteView({
model: new Backbone.Model(this.props.permissionTemplate)
}).on('done', () => {
- this.context.router.replace('/permission_templates');
+ const pathname = this.props.organization ?
+ `/organizations/${this.props.organization.key}/permission_templates` :
+ '/permission_templates';
+ this.context.router.replace(pathname);
this.props.refresh();
}).render();
}
setDefault (qualifier, e) {
e.preventDefault();
setDefaultPermissionTemplate(
- this.props.permissionTemplate.name,
+ this.props.permissionTemplate.id,
qualifier
).then(this.props.refresh);
}
}
render () {
- const { permissionTemplate: t } = this.props;
+ const { permissionTemplate: t, organization } = this.props;
+
+ const pathname = organization ?
+ `/organizations/${organization.key}/permission_templates` :
+ '/permission_templates';
return (
<div className="dropdown">
{this.renderSetDefaultsControl()}
{!this.props.fromDetails && (
- <li>
- <Link to={{ pathname: '/permission_templates', query: { id: t.id } }}>
- {this.renderDropdownIcon(<i className="icon-edit"/>)}
- Edit Permissions
- </Link>
- </li>
+ <li>
+ <Link to={{ pathname, query: { id: t.id } }}>
+ {this.renderDropdownIcon(<i className="icon-edit"/>)}
+ Edit Permissions
+ </Link>
+ </li>
)}
<li>
export default class App extends React.Component {
static propTypes = {
+ location: React.PropTypes.object.isRequired,
+ organization: React.PropTypes.object,
topQualifiers: React.PropTypes.array.isRequired
};
}
requestPermissions () {
- return getPermissionTemplates().then(r => {
+ const { organization } = this.props;
+ const request = organization ? getPermissionTemplates(organization.key) : getPermissionTemplates();
+ return request.then(r => {
if (this.mounted) {
const permissions = sortPermissions(r.permissions);
const permissionTemplates = mergeDefaultsToTemplates(
const template = this.state.permissionTemplates.find(t => t.id === id);
return (
<Template
+ organization={this.props.organization}
template={template}
refresh={this.requestPermissions}
topQualifiers={this.props.topQualifiers}/>
return (
<Home
+ organization={this.props.organization}
topQualifiers={this.props.topQualifiers}
permissions={this.state.permissions}
permissionTemplates={this.state.permissionTemplates}
export default class Header extends React.Component {
static propTypes = {
+ organization: React.PropTypes.object,
ready: React.PropTypes.bool.isRequired,
refresh: CallbackType
};
handleCreateClick (e) {
e.preventDefault();
+ const { organization } = this.props;
- new CreateView().on('done', r => {
+ new CreateView({ organization }).on('done', r => {
this.props.refresh().then(() => {
+ const pathname = organization ?
+ `/organizations/${organization.key}/permission_templates` :
+ '/permission_templates';
this.context.router.push({
- pathname: '/permission_templates',
+ pathname,
query: { id: r.permissionTemplate.id }
});
});
export default class Home extends React.Component {
static propTypes = {
+ organization: React.PropTypes.object,
topQualifiers: React.PropTypes.array.isRequired,
permissions: React.PropTypes.array.isRequired,
permissionTemplates: React.PropTypes.array.isRequired,
titleTemplate="SonarQube - %s"/>
<Header
+ organization={this.props.organization}
ready={this.props.ready}
refresh={this.props.refresh}/>
<TooltipsContainer>
<List
+ organization={this.props.organization}
permissionTemplates={this.props.permissionTemplates}
permissions={this.props.permissions}
topQualifiers={this.props.topQualifiers}
export default class List extends React.Component {
static propTypes = {
+ organization: React.PropTypes.object,
permissionTemplates: React.PropTypes.arrayOf(
PermissionTemplateType).isRequired,
permissions: React.PropTypes.array.isRequired,
const permissionTemplates = this.props.permissionTemplates.map(p => (
<ListItem
key={p.id}
+ organization={this.props.organization}
permissionTemplate={p}
topQualifiers={this.props.topQualifiers}
refresh={this.props.refresh}/>
));
return (
- <table id="permission-templates"
- className="data zebra permissions-table">
+ <table id="permission-templates" className="data zebra permissions-table">
<ListHeader permissions={this.props.permissions}/>
<tbody>{permissionTemplates}</tbody>
</table>
export default class ListItem extends React.Component {
static propTypes = {
+ organization: React.PropTypes.object,
permissionTemplate: PermissionTemplateType.isRequired,
topQualifiers: React.PropTypes.array.isRequired,
refresh: CallbackType
data-id={this.props.permissionTemplate.id}
data-name={this.props.permissionTemplate.name}>
<NameCell
+ organization={this.props.organization}
permissionTemplate={this.props.permissionTemplate}
topQualifiers={this.props.topQualifiers}/>
<td className="nowrap thin text-right">
<ActionsCell
+ organization={this.props.organization}
permissionTemplate={this.props.permissionTemplate}
topQualifiers={this.props.topQualifiers}
refresh={this.props.refresh}/>
export default class NameCell extends React.Component {
static propTypes = {
+ organization: React.PropTypes.object,
permissionTemplate: PermissionTemplateType.isRequired
};
render () {
- const { permissionTemplate: t } = this.props;
+ const { permissionTemplate: t, organization } = this.props;
+
+ const pathname = organization ?
+ `/organizations/${organization.key}/permission_templates` :
+ '/permission_templates';
return (
<td>
- <Link to={{ pathname: '/permission_templates', query: { id: t.id } }}>
+ <Link to={{ pathname, query: { id: t.id } }}>
<strong className="js-name">{t.name}</strong>
</Link>
class Template extends React.Component {
static propTypes = {
+ organization: React.PropTypes.object,
template: React.PropTypes.object.isRequired,
refresh: React.PropTypes.func.isRequired,
topQualifiers: React.PropTypes.array.isRequired
const hasPermission = user.permissions.includes(permission);
const request = hasPermission ?
api.revokeTemplatePermissionFromUser(
- template.name, user.login, permission) :
+ template.id, user.login, permission) :
api.grantTemplatePermissionToUser(
- template.name, user.login, permission);
+ template.id, user.login, permission);
request.then(() => this.requestHolders()).then(this.props.refresh);
}
const { template } = this.props;
const hasPermission = user.permissions.includes(permission);
const request = hasPermission ?
- api.removeProjectCreatorFromTemplate(template.name, permission) :
- api.addProjectCreatorToTemplate(template.name, permission);
+ api.removeProjectCreatorFromTemplate(template.id, permission) :
+ api.addProjectCreatorToTemplate(template.id, permission);
request.then(() => this.requestHolders()).then(this.props.refresh);
}
handleToggleGroup (group, permission) {
- const { template } = this.props;
+ const { template, organization } = this.props;
const hasPermission = group.permissions.includes(permission);
+ const data = {
+ templateId: template.id,
+ groupName: group.name,
+ permission
+ };
+ if (organization) {
+ Object.assign(data, { organization: organization.key });
+ }
const request = hasPermission ?
- api.revokeTemplatePermissionFromGroup(
- template.name, group.name, permission) :
- api.grantTemplatePermissionToGroup(
- template.name, group.name, permission);
+ api.revokeTemplatePermissionFromGroup(data) :
+ api.grantTemplatePermissionToGroup(data);
request.then(() => this.requestHolders()).then(this.props.refresh);
}
titleTemplate="SonarQube - %s"/>
<TemplateHeader
+ organization={this.props.organization}
template={this.props.template}
loading={store.loading}
refresh={this.props.refresh}
export default class TemplateHeader extends React.Component {
static propTypes = {
+ organization: React.PropTypes.object,
template: React.PropTypes.object.isRequired,
loading: React.PropTypes.bool.isRequired,
refresh: React.PropTypes.func.isRequired,
};
render () {
- const { template } = this.props;
+ const { template, organization } = this.props;
+
+ const pathname = organization ?
+ `/organizations/${organization.key}/permission_templates` :
+ '/permission_templates';
return (
<header id="project-permissions-header" className="page-header">
<div className="note spacer-bottom">
- <Link to="/permission_templates" className="text-muted">
+ <Link to={pathname} className="text-muted">
{translate('permission_templates.page')}
</Link>
</div>
<div className="pull-right">
<ActionsCell
+ organization={this.props.organization}
permissionTemplate={this.props.template}
topQualifiers={this.props.topQualifiers}
refresh={this.props.refresh}
export default FormView.extend({
sendRequest () {
this.disableForm();
- createPermissionTemplate({
+ const data = {
name: this.$('#permission-template-name').val(),
description: this.$('#permission-template-description').val(),
projectKeyPattern: this.$('#permission-template-project-key-pattern').val()
- }).then(
+ };
+ if (this.options.organization) {
+ Object.assign(data, { organization: this.options.organization.key });
+ }
+ createPermissionTemplate(data).then(
r => {
this.trigger('done', r);
this.destroy();