public/components/bulkReindexController.react.js (194 lines of code) (raw):
import React from 'react';
import BulkReindex from './bulkReindexes.react';
import ContentSourceService from '../services/contentSourceService';
import { Label, Row, Col, Panel, Input, Button, ButtonToolbar, Alert } from 'react-bootstrap';
export default class BulkReindexControllerComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
contentSources: [],
runningReindexes: [],
pendingReindexes: [],
completedReindexes: [],
editModeOn: false,
inBulkMode: false,
reindexLiveStack: false,
reindexPreviewStack: false,
reindexProd: false,
reindexCode: false,
alertStyle: 'success',
alertMessage: '',
alertVisibility: false
};
this.generateEnvironments = this.generateEnvironments.bind(this);
this.requestBulkStatus = this.requestBulkStatus.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.initiateBulkReindex = this.initiateBulkReindex.bind(this);
this.checkRunningReindexes = this.checkRunningReindexes.bind(this);
this.handleReindexLiveStack = this.handleReindexLiveStack.bind(this);
this.handleReindexPreviewStack = this.handleReindexPreviewStack.bind(this);
this.handleReindexCode = this.handleReindexCode.bind(this);
this.handleReindexProd = this.handleReindexProd.bind(this);
this.cancelReindex = this.cancelReindex.bind(this);
}
componentDidMount() {
this.checkRunningReindexes();
let intervalPeriod = 1000;
setInterval(this.checkRunningReindexes, intervalPeriod);
}
initiateBulkReindex(environments) {
if (environments.length > 0) {
ContentSourceService.initiateBulkReindexer(environments).then (response => {
this.checkRunningReindexes()
},
errors => {
this.setState({alertStyle: 'danger', alertMessage: 'Failed to trigger reindexes for '+ environments, alertVisibility: true});
});
} else {
console.log("Error: No content selected to be reindexed.")
}
}
requestBulkStatus() {
return ContentSourceService.requestBulkStatus();
}
generateEnvironments() {
const desiredEnvironments = [
this.state.reindexPreviewStack && this.state.reindexCode ? "draft-code" : "",
this.state.reindexPreviewStack && this.state.reindexProd ? "draft-prod" : "",
this.state.reindexLiveStack && this.state.reindexCode ? "live-code" : "",
this.state.reindexLiveStack && this.state.reindexProd ? "live-prod" : ""
].filter(Boolean);
return desiredEnvironments;
}
loadRunningReindexes(json) {
const r = (acc, v) => acc.concat(v);
const f = (s) => (o) => o[s];
const getPendingJobs = f('pendingJobs');
const getRunningJobs = f('runningJobs');
const getCompletedJobs = f('completedJobs');
let pendingReindexes = Object.values(json.data).map(getPendingJobs).reduce(r, []);
let runningReindexes = Object.values(json.data).map(getRunningJobs).reduce(r, []);
let completedReindexes = Object.values(json.data).map(getCompletedJobs).reduce(r, []);
this.setState({
runningReindexes: runningReindexes,
pendingReindexes: pendingReindexes,
completedReindexes: completedReindexes,
alertVisibility: false,
});
this.requestBulkStatus();
}
checkRunningReindexes() {
this.requestBulkStatus().then(response => {
let json = JSON.parse(response);
let reindexInProgress = json.IsReindexing;
if (!reindexInProgress) {
this.setState({
inBulkMode: false
});
} else {
this.loadRunningReindexes(json);
this.setState({
inBulkMode: true
});
}
});
}
cancelReindex(reindex, isReindexRunning) {
if (isReindexRunning) {
ContentSourceService.cancelReindex(reindex.id, reindex.env).then( response => {
this.setState({
runningReindexes: this.state.runningReindexes.filter(r => r !== reindex)
});
},
errors => {
this.setState({alertStyle: 'danger', alertMessage: 'Failed to cancel running reindex for '+ reindex.name, alertVisibility: true});
});
} else {
ContentSourceService.cancelPendingReindex(reindex.id, reindex.env).then( response => {
this.setState({
pendingReindexes: this.state.pendingReindexes.filter(r => r !== reindex)
});
},
errors => {
this.setState({alertStyle: 'danger', alertMessage: 'Failed to cancel pending reindex for ' + reindex.name, alertVisibility: true});
});
}
}
handleSubmit(e) {
e.preventDefault();
this.requestBulkStatus().then(response => {
var json = JSON.parse(response);
var reindexInProgress = json.IsReindexing;
if (!reindexInProgress) {
let environments = this.generateEnvironments();
this.setState({alertStyle: 'success', alertMessage: 'Bulk job submitted.', alertVisibility: true});
this.initiateBulkReindex(environments);
} else {
this.setState({alertStyle: 'danger', alertMessage: 'Bulk job in progress. Please wait till job has finished.', alertVisibility: true});
}
});
}
handleReindexLiveStack(e) {
this.setState({reindexLiveStack: e.target.checked});
}
handleReindexPreviewStack(e) {
this.setState({reindexPreviewStack: e.target.checked});
}
handleReindexProd(e) {
this.setState({reindexProd: e.target.checked});
}
handleReindexCode(e) {
this.setState({reindexCode: e.target.checked});
}
render () {
return (
<div id="page-wrapper">
<div className="container-fluid">
<div>
{ this.state.alertVisibility ? <Alert bsStyle={this.state.alertStyle}>{this.state.alertMessage}</Alert> : null }
<form className="form-horizontal" onSubmit={this.handleSubmit}>
<Row>
<Col xs={12} md={12}>
<h3><Label>Bulk Reindexer</Label></h3>
<Panel header="Start Reindex">
<Input label="Stack" labelClassName="col-xs-2" wrapperClassName="wrapper">
<Col xs={5}>
<Input type="checkbox" defaultChecked={this.state.reindexLiveStack} onChange={this.handleReindexLiveStack} label="Live" />
</Col>
<Col xs={5}>
<Input type="checkbox" defaultChecked={this.state.reindexPreviewStack} onChange={this.handleReindexPreviewStack} label="Preview" />
</Col>
</Input>
<Input label="Stage" labelClassName="col-xs-2" wrapperClassName="wrapper">
<Col xs={5}>
<Input type="checkbox" defaultChecked={this.state.reindexProd} onChange={this.handleReindexProd} label="PROD" />
</Col>
<Col xs={5}>
<Input type="checkbox" defaultChecked={this.state.reindexCode} onChange={this.handleReindexCode} label="CODE" />
</Col>
</Input>
<ButtonToolbar>
<Button bsStyle="success" className="pull-right" type="submit">Reindex</Button>
</ButtonToolbar>
</Panel>
</Col>
</Row>
</form>
</div>
<div>
<Row>
<Col xs={12} md={12}>
{ (!this.state.inBulkMode) ?
<p>There are no bulk reindexes currently in progress.</p>
:
<BulkReindex completedReindexes={this.state.completedReindexes}
runningReindexes={this.state.runningReindexes}
pendingReindexes={this.state.pendingReindexes}
onReloadRunningReindex={this.checkRunningReindexes}
onCancelReindex={this.cancelReindex}/>
}
</Col>
</Row>
</div>
</div>
</div>
);
}
}