window.sonarqube.appStarted.then(options => {
requestPermissionTemplates().done(r => {
var el = document.querySelector(options.el);
- ReactDOM.render(<Main permissionTemplates={r.permissionTemplates} componentId={window.sonarqube.componentId}/>, el);
+ ReactDOM.render(<Main permissionTemplates={r.permissionTemplates}
+ componentId={window.sonarqube.componentId}
+ rootQualifiers={options.rootQualifiers}/>, el);
});
});
import $ from 'jquery';
import _ from 'underscore';
import React from 'react';
+
import Permissions from './permissions';
import PermissionsFooter from './permissions-footer';
import Search from './search';
import ApplyTemplateView from './apply-template-view';
+
const PERMISSIONS_ORDER = ['user', 'codeviewer', 'issueadmin', 'admin'];
+
export default React.createClass({
propTypes: {
permissionTemplates: React.PropTypes.arrayOf(React.PropTypes.object).isRequired
},
getInitialState() {
- return { ready: false, permissions: [], projects: [], total: 0 };
+ return { ready: false, permissions: [], projects: [], total: 0, filter: '__ALL__' };
},
componentDidMount() {
});
},
- requestPermissions(page = 1, query = '') {
+ requestPermissions(page = 1, query = '', filter = this.state.filter) {
let url = `${window.baseUrl}/api/permissions/search_project_permissions`;
let data = { p: page, q: query };
+ if (filter !== '__ALL__') {
+ data.qualifier = filter;
+ }
if (this.props.componentId) {
data = { projectId: this.props.componentId };
}
permissions: permissions,
total: r.paging.total,
page: r.paging.pageIndex,
- query: query
+ query: query,
+ filter: filter
});
});
});
this.requestPermissions(1, query);
},
+ handleFilter(filter) {
+ this.requestPermissions(1, this.state.query, filter);
+ },
+
refresh() {
this.requestPermissions(1, this.state.query);
},
</header>
<Search {...this.props}
- search={this.search}/>
+ filter={this.state.filter}
+ search={this.search}
+ onFilter={this.handleFilter}/>
<Permissions
ready={this.state.ready}
--- /dev/null
+import React from 'react';
+
+import RadioToggle from '../../components/shared/radio-toggle';
+
+
+const rootQualifiersToOptions = (qualifiers) => {
+ return qualifiers.map(q => {
+ return {
+ value: q,
+ label: window.t('qualifiers', q)
+ }
+ });
+};
+
+
+export const QualifierFilter = ({ rootQualifiers, filter, onFilter }) => {
+ const options = [{ value: '__ALL__', label: 'All' }, ...rootQualifiersToOptions(rootQualifiers)];
+
+ return (
+ <div className="display-inline-block text-top nowrap big-spacer-right">
+ <RadioToggle value={filter}
+ options={options}
+ name="qualifier"
+ onCheck={onFilter}/>
+ </div>
+ );
+};
import _ from 'underscore';
import React from 'react';
+import { QualifierFilter } from './qualifier-filter';
+
+
export default React.createClass({
propTypes: {
search: React.PropTypes.func.isRequired
}
return (
<div className="panel panel-vertical bordered-bottom spacer-bottom">
- <form onSubmit={this.onSubmit} className="search-box">
+
+ {this.props.rootQualifiers.length > 1 && <QualifierFilter filter={this.props.filter}
+ rootQualifiers={this.props.rootQualifiers}
+ onFilter={this.props.onFilter}/>}
+
+ <form onSubmit={this.onSubmit} className="search-box display-inline-block text-top">
<button className="search-box-submit button-clean">
<i className="icon-search"></i>
</button>