blob: 772a86d2b3e6635ec9457f16378acddbd7a48eee [file] [log] [blame]
// 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.
define([
'app',
'api',
'react',
'addons/components/react-components.react',
'addons/permissions/stores',
'addons/permissions/actions'
],
function (app, FauxtonAPI, React, Components, Stores, Actions) {
var LoadLines = Components.LoadLines;
var permissionsStore = Stores.permissionsStore;
var getDocUrl = app.helpers.getDocUrl;
var PermissionsItem = React.createClass({
removeItem: function (e) {
this.props.removeItem({
value: this.props.item,
type: this.props.type,
section: this.props.section
});
},
render: function () {
return (
<li>
<span>{this.props.item}</span>
<button onClick={this.removeItem} type="button" className="pull-right close">×</button>
</li>
);
}
});
var PermissionsSection = React.createClass({
getInitialState: function () {
return {
newRole: '',
newName: ''
};
},
getHelp: function () {
if (this.props.section === 'admins') {
return 'Database members can access the database. If no members are defined, the database is public. ';
}
return 'Database members can access the database. If no members are defined, the database is public. ';
},
isEmptyValue: function (value, type) {
if (!_.isEmpty(value)) {
return false;
}
FauxtonAPI.addNotification({
msg: 'Cannot add an empty value for ' + type + '.',
type: 'warning'
});
return true;
},
addNames: function (e) {
e.preventDefault();
if (this.isEmptyValue(this.state.newName, 'names')) {
return;
}
this.props.addItem({
type: 'names',
section: this.props.section,
value: this.state.newName
});
this.setState({newName: ''});
},
addRoles: function (e) {
e.preventDefault();
if (this.isEmptyValue(this.state.newRole, 'roles')) {
return;
}
this.props.addItem({
type: 'roles',
section: this.props.section,
value: this.state.newRole
});
this.setState({newRole: ''});
},
getItems: function (items, type) {
return _.map(items, function (item, i) {
return <PermissionsItem key={i} item={item} section={this.props.section} type={type} removeItem={this.props.removeItem} />;
}, this);
},
getNames: function () {
return this.getItems(this.props.names, 'names');
},
getRoles: function () {
return this.getItems(this.props.roles, 'roles');
},
nameChange: function (e) {
this.setState({newName: e.target.value});
},
roleChange: function (e) {
this.setState({newRole: e.target.value});
},
render: function () {
return (
<div>
<header className="page-header">
<h3>{this.props.section}</h3>
<p className="help">
{this.getHelp()}
<a className="help-link" data-bypass="true" href={getDocUrl('DB_PERMISSION')} target="_blank">
<i className="icon-question-sign"></i>
</a>
</p>
</header>
<div className="row-fluid">
<div className="span6">
<header>
<h4>Users</h4>
<p>Specify users who will have {this.props.section} access to this database.</p>
</header>
<form onSubmit={this.addNames} className="permission-item-form form-inline">
<input onChange={this.nameChange} value={this.state.newName} type="text" className="item input-small" placeholder="Add Name" />
<button type="submit" className="btn btn-success"><i className="icon fonticon-plus-circled" /> Add Name</button>
</form>
<ul className="clearfix unstyled permission-items span10">
{this.getNames()}
</ul>
</div>
<div className="span6">
<header>
<h4>Roles</h4>
<p>Users with any of the following role(s) will have {this.props.section} access.</p>
</header>
<form onSubmit={this.addRoles} className="permission-item-form form-inline">
<input onChange={this.roleChange} value={this.state.newRole} type="text" className="item input-small" placeholder="Add Role" />
<button type="submit" className="btn btn-success"><i className="icon fonticon-plus-circled" /> Add Role</button>
</form>
<ul className="unstyled permission-items span10">
{this.getRoles()}
</ul>
</div>
</div>
</div>
);
}
});
var PermissionsController = React.createClass({
getStoreState: function () {
return {
isLoading: permissionsStore.isLoading(),
adminRoles: permissionsStore.getAdminRoles(),
adminNames: permissionsStore.getAdminNames(),
memberRoles: permissionsStore.getMemberRoles(),
memberNames: permissionsStore.getMemberNames(),
};
},
getInitialState: function () {
return this.getStoreState();
},
componentDidMount: function () {
permissionsStore.on('change', this.onChange, this);
},
componentWillUnmount: function () {
permissionsStore.off('change', this.onChange);
},
onChange: function () {
this.setState(this.getStoreState());
},
addItem: function (options) {
Actions.addItem(options);
},
removeItem: function (options) {
Actions.removeItem(options);
},
render: function () {
if (this.state.isLoading) {
return <LoadLines />;
}
return (
<div className="permissions-page flex-body">
<div id="sections">
<PermissionsSection roles={this.state.adminRoles}
names={this.state.adminNames}
addItem={this.addItem}
removeItem={this.removeItem}
section={'admins'} />
<PermissionsSection
roles={this.state.memberRoles}
names={this.state.memberNames}
addItem={this.addItem}
removeItem={this.removeItem}
section={'members'} />
</div>
</div>
);
}
});
return {
PermissionsController: PermissionsController,
PermissionsSection: PermissionsSection,
PermissionsItem: PermissionsItem
};
});