kibana-with-account
Version:
kibana-with-account is develop based kibana project
214 lines (182 loc) • 6.1 kB
JSX
var React = require('react/addons');
var ControlGroup = require('../../../../components/form/ControlGroup');
var Button = require('../../../../components/form/Button');
var Spinner = require('../../../../components/form/Spinner');
var Actions = require('../../actions/Admin');
var Component = React.createClass({
mixins: [React.addons.LinkedStateMixin],
getInitialState: function () {
return {};
},
componentWillReceiveProps: function (nextProps) {
if (!this.state.hydrated) {
this.setState({
hydrated: nextProps.details.hydrated,
permissions: nextProps.details.permissions
});
}
},
handleNewPermission: function (event) {
var newPermission = this.refs.newPermission.getDOMNode().value.trim();
if (!newPermission) {
return;
}
var nextPermissions = this.state.permissions || {};
if (nextPermissions.hasOwnProperty(newPermission)) {
this.setState({error: 'That permission already exists.'});
setTimeout(function () {
this.setState({error: undefined});
}.bind(this), 2500);
}
else {
nextPermissions[newPermission] = true;
this.setState({permissions: nextPermissions});
}
this.setState({newPermission: ''});
},
onEnterNewPermission: function (event) {
if (event.which === 13) {
event.preventDefault();
event.stopPropagation();
this.handleNewPermission(event);
}
},
handleTogglePermission: function (key, event) {
var nextPermissions = this.state.permissions;
nextPermissions[key] = !nextPermissions[key];
this.setState({permissions: nextPermissions});
},
handleDeletePermission: function (key, event) {
var nextPermissions = this.state.permissions;
delete nextPermissions[key];
this.setState({permissions: nextPermissions});
},
handleSubmit: function (event) {
event.preventDefault();
event.stopPropagation();
Actions.savePermissions({
id: this.props.details._id,
permissions: this.state.permissions
});
},
render: function () {
var alerts = [];
var error = this.props.data.error || this.state.error;
if (this.props.data.success) {
alerts.push(<div key="success" className="alert alert-success">
Success. Changes have been saved.
</div>);
}
else if (error) {
alerts.push(<div key="danger" className="alert alert-danger">
{error}
</div>);
}
var notice;
if (!this.props.details.hydrated) {
notice = <div className="alert alert-info">
Loading data...
</div>;
}
var formElements;
if (this.props.details.hydrated) {
var permissions = this.state.permissions || {};
var permissionKeys = Object.keys(permissions).sort(function (a, b) {
return a.toLowerCase().localeCompare(b.toLowerCase());
});
var permissionsUi = permissionKeys.map(function (key) {
var deleteHandler = this.handleDeletePermission.bind(this, key);
var toggleHandler = this.handleTogglePermission.bind(this, key);
var toggleIcon;
if (permissions[key]) {
toggleIcon = <i className="fa fa-toggle-on"></i>;
}
else {
toggleIcon = <i className="fa fa-toggle-off"></i>;
}
return (
<div
key={key}
className="input-group">
<input
type="text"
name="newPermission"
className="form-control"
disabled={true}
value={key}
/>
<span className="input-group-btn">
<button
type="button"
className="btn btn-default"
onClick={toggleHandler}>
{toggleIcon}
</button>
<button
type="button"
className="btn btn-warning"
onClick={deleteHandler}>
Remove
</button>
</span>
</div>
);
}.bind(this));
if (permissionKeys.length === 0) {
permissionsUi = <div>
<span className="label label-default">
empty list
</span>
</div>;
}
formElements = <fieldset>
<legend>Permissions</legend>
{alerts}
<ControlGroup label="Add permission" hideHelp={true}>
<div className="input-group">
<input
ref="newPermission"
type="text"
name="newPermission"
className="form-control"
placeholder=""
onKeyDown={this.onEnterNewPermission}
valueLink={this.linkState('newPermission')}
/>
<span className="input-group-btn">
<button
ref="newPermissionButton"
type="button"
className="btn btn-default"
onClick={this.handleNewPermission}>
Add
</button>
</span>
</div>
</ControlGroup>
<ControlGroup
ref="permissionContainer"
label="Existing permissions"
hideHelp={true}>
{permissionsUi}
</ControlGroup>
<ControlGroup hideLabel={true} hideHelp={true}>
<Button
type="submit"
inputClasses={{'btn-primary': true}}
disabled={this.props.data.loading}>
Save changes
<Spinner space="left" show={this.props.data.loading}/>
</Button>
</ControlGroup>
</fieldset>;
}
return (
<form onSubmit={this.handleSubmit}>
{notice}
{formElements}
</form>
);
}
});
module.exports = Component;