public/components/contentSourceCreate.react.js (202 lines of code) (raw):
import React from 'react';
import update from 'react-addons-update';
import { Input, Button, ButtonToolbar, Alert, Col, Glyphicon, Row } from 'react-bootstrap';
import ContentSourceService from '../services/contentSourceService';
import {headerListToHeaderMap, HeadersForm} from "./headersForm";
export default class ContentSourceForm extends React.Component {
constructor(props) {
super(props);
this.render = this.render.bind(this);
this.state = {
appName: '',
description: '',
supportsToFromParams: true,
supportsCancelReindex: true,
environments: [],
alertStyle: 'success',
alertMessage: '',
alertVisibility: false,
environmentCount: 1
};
this.resetFormFields = this.resetFormFields.bind(this);
this.resetEnvironments = this.resetEnvironments.bind(this);
this.addEnvironmentItem = this.addEnvironmentItem.bind(this);
this.handleFormSubmit = this.handleFormSubmit.bind(this);
}
componentDidMount() {
this.addEnvironmentItem();
}
addEnvironmentItem() {
const newItem = {
reindexEndpoint: '',
environment: '',
authType: ''
};
this.setState({
environments: this.state.environments.concat([newItem])
});
}
deleteEnvironmentItem(id, e) {
if (this.state.environmentCount === 1) {
this.setState({alertStyle: 'danger', alertMessage: 'You need at least one environment to submit the content source.', alertVisibility: true});
}
else {
const newState = update(this.state,
{
environments: {$splice: [[id, 1]]}
}
);
this.setState(newState);
this.setState({environmentCount: this.state.environmentCount - 1});
}
}
handleFormSubmit(form) {
ContentSourceService.createContentSource(form).then(response => {
this.resetFormFields();
this.setState({alertVisibility: false});
});
}
resetFormFields() {
this.setState({appName: '', description: '', reindexEndpoint: '', environment: '', authType: '', supportsToFromParams: true, supportsCancelReindex: true});
}
resetEnvironments() {
this.setState({environments: [], environmentCount: 1}, function(){
this.addEnvironmentItem();
});
}
handleAppNameChange(e) {
this.setState({appName: e.target.value});
}
handleDescriptionChange(e) {
this.setState({description: e.target.value});
}
handleEnvironmentsChangeEvent = (id, field, e) => {
this.handleEnvironmentsChange(id, field, e.target.value)
}
handleEnvironmentsChange(id, field, value) {
const newState = update(this.state, {
environments: {
[id]: {
[field]: { $set: value },
},
},
});
this.setState(newState);
}
handleSupportsToFromParams(e) {
this.setState({supportsToFromParams: e.target.checked});
}
handleSupportsCancelReindex(e) {
this.setState({supportsCancelReindex: e.target.checked});
}
handleSubmit(e) {
e.preventDefault();
var appName = this.state.appName.trim();
var description = this.state.description.trim();
var environments = this.state.environments;
var supportsToFromParams = this.state.supportsToFromParams;
var supportsCancelReindex = this.state.supportsCancelReindex;
if (appName && description && environments) {
const toAdd = environments.map( function(obj, id){
return {
appName: appName,
description: description,
reindexEndpoint: obj.reindexEndpoint,
environment: obj.environment,
authType: obj.authType,
contentSourceSettings: {
supportsToFromParams: supportsToFromParams,
supportsCancelReindex: supportsCancelReindex
},
...(obj.headers ? { headers: headerListToHeaderMap(obj.headers) } : {})
};
}, this);
this.handleFormSubmit(toAdd);
this.resetEnvironments();
} else {
this.setState({alertStyle: 'danger', alertMessage: 'Invalid form. Correct the fields and try again.', alertVisibility: true});
}
}
handleAddEnvironmentClick(e) {
this.addEnvironmentItem();
this.setState({environmentCount: this.state.environmentCount + 1})
}
render () {
return (
<div>
{ this.state.alertVisibility ? <Alert bsStyle={this.state.alertStyle}>{this.state.alertMessage}</Alert> : null }
<form className="form-horizontal" onSubmit={this.handleSubmit.bind(this)}>
<Input type="text" label="Application Name*" labelClassName="col-xs-2" wrapperClassName="col-xs-10" value={this.state.appName} onChange={this.handleAppNameChange.bind(this)} />
<Input type="text" label="Description*" labelClassName="col-xs-2" wrapperClassName="col-xs-10" value={this.state.description} onChange={this.handleDescriptionChange.bind(this)} />
{this.state.environments.map(function(e, id){
return (
<Row key={id}>
<label className="control-label col-xs-2">Environment*</label>
<Col xs={10}>
<div className="margin-bottom-10 panel panel-default">
<div className="panel-body">
<Row>
<Col xs={12}>
<Input label="Endpoint*" labelClassName="col-xs-2" wrapperClassName="wrapper">
<Col xs={4}>
<Input type="select" onChange={this.handleEnvironmentsChangeEvent.bind(this, id, "environment")} labelClassName="col-xs-2" wrapperClassName="col-xs-10" select value={e.environment}>
<option value="" disabled>Select stage ... </option>
<option value="live-code">Code [live]</option>
<option value="draft-code">Code [draft]</option>
<option value="live-prod">Prod [live]</option>
<option value="draft-prod">Prod [draft]</option>
</Input>
</Col>
<Col xs={6}>
<input type="text" value={e.reindexEndpoint} onChange={this.handleEnvironmentsChangeEvent.bind(this, id, "reindexEndpoint")} placeholder="URL for reindex (include api key parameter if required) ..." wrapperClassName="col-xs-4" className="form-control" />
</Col>
</Input>
</Col>
</Row>
<Row>
<Col xs={12}>
<Input label="Authentication*" labelClassName="col-xs-2" wrapperClassName="wrapper">
<Col xs={4} className="no-margin-bottom">
<Input type="select" onChange={this.handleEnvironmentsChangeEvent.bind(this, id, "authType")} labelClassName="col-xs-2" wrapperClassName="col-xs-10" select value={e.authType}>
<option value="" disabled>Select authentication type ... </option>
<option value="api-key">Api key</option>
<option value="vpc-peered">VPC peered</option>
</Input>
</Col>
<Col xs={6}>
<Button className="remove-btn pull-right btn btn-link btn-sm" onClick={this.deleteEnvironmentItem.bind(this, id)}><Glyphicon glyph="glyphicon glyphicon-minus" /> Remove</Button>
</Col>
</Input>
</Col>
</Row>
<Row>
<Col xs={12}>
<HeadersForm
headers={e.headers}
onChange={(headers) => this.handleEnvironmentsChange(id, "headers", headers)}
/>
</Col>
</Row>
</div>
</div>
</Col>
</Row>
);
}, this)}
{ this.state.environmentCount < 4
? <Row><Col xs={10} xsOffset={2}><Button type="button" className="btn-link" onClick={this.handleAddEnvironmentClick.bind(this)}><Glyphicon glyph="glyphicon glyphicon-plus" /> Add another environment</Button></Col></Row>
: null
}
<Input label="Settings" labelClassName="col-xs-2" wrapperClassName="wrapper">
<Col xs={4}>
<Input type="checkbox" defaultChecked={this.state.supportsToFromParams} onChange={this.handleSupportsToFromParams.bind(this)} label="Supports to/from reindex parameters" />
</Col>
<Col xs={4}>
<Input type="checkbox" defaultChecked={this.state.supportsCancelReindex} onChange={this.handleSupportsCancelReindex.bind(this)} label="Supports cancelling of a reindex" />
</Col>
</Input>
<ButtonToolbar>
<Button bsStyle="success" className="pull-right" type="submit">Submit</Button>
</ButtonToolbar>
</form>
</div>
);
}
}