make-shift-brew-ui
Version:
Common User Interface for the Brewfactory projects, modified for MakeShift Aleworks
341 lines (293 loc) • 8.98 kB
JSX
/* jshint ignore:start */
var React = require('react/addons');
var moment = require('moment');
var createBrewAction = require('../../actions/brew/createBrew');
var navigateAction = require('flux-router-component').navigateAction;
var routes = require('../../config/routes');
var Designer = React.createClass({
/*
* Get initial state
*
* @method getInitialState
* @return {Object} state
*/
getInitialState: function () {
this.store = this.props.context.getStore('BrewStore');
return {
name: null,
startTime: new Date(),
phases: []
};
},
/*
* On clone actual btn click
*
* @method onCloneActualBtnClick
*/
onCloneActualBtnClick: function () {
var state = this.store.getState();
this.setState({
name: state.brew.name,
startTime: new Date(),
phases: state.brew.phases.map(function (phase) {
return {
min: phase.min,
temp: phase.temp,
gallons: phase.gallons,
type: phase.type
}
})
});
},
/*
* On reset btn click
*
* @method onResetBtnClick
*/
onResetBtnClick: function () {
this.setState(this.getInitialState());
},
/*
* On phase add btn click
*
* @method onPhaseAddBtnClick
*/
onPhaseAddBtnClick: function (isDown) {
var state = this.state;
var phase = {
min: null,
temp: null,
type: "brew"
};
if (isDown) {
state.phases.push(phase);
} else {
state.phases.unshift(phase);
}
this.setState(state);
console.log(state);
},
/*
* On phase add btn click
*
* @method onPhaseAddBtnClick
*/
onWaterAddBtnClick: function () {
var phase = {
gallons: null,
type: "water"
};
state.phases.unshift(phase);
this.setState(state);
console.log(state);
},
/*
* On phase remove btn click
*
* @method onPhaseRemoveBtnClick
*/
onPhaseRemoveBtnClick: function (phase) {
var state = this.state;
var idx = state.phases.indexOf(phase);
state.phases.splice(idx, 1);
this.setState(state);
},
/*
* On synchronise button clicked
*
* @method onSyncBtnClicked
*/
onSyncBtnClicked: function () {
this.props.context.executeAction(createBrewAction, {
name: this.state.name,
startTime: this.state.startTime,
phases: this.state.phases
});
// Go to the dashboard
this.props.context.executeAction(navigateAction, {
path: routes.dashboard.path
});
},
/*
* On name input has changed
*
* @method onNameChanged
* @param {Event} event
*/
onNameChanged: function(event) {
this.setState({
name: event.target.value
});
},
/*
* On startTime input has changed
*
* @method onStartTimeChanged
* @param {Event} event
*/
onStartTimeChanged: function(event) {
this.setState({
startTime: moment(event.target.value).toDate()
});
},
/*
* On phase duration changed
*
* @method onPhaseDurationChanged
* @param {Event} event
* @param {Number} phaseKey
*/
onPhaseDurationChanged: function (phaseKey, event) {
var phases = this.state.phases;
phases[phaseKey].min = Number(event.target.value);
this.setState({
phases: phases
});
},
/*
* On phase temp changed
*
* @method onPhaseDurationChanged
* @param {Event} event
* @param {Number} phaseKey
*/
onPhaseTempChanged: function (phaseKey, event) {
var phases = this.state.phases;
phases[phaseKey].temp = Number(event.target.value);
this.setState({
phases: phases
});
},
onPhaseWaterChanged: function (phaseKey, event) {
var phases = this.state.phases;
phases[phaseKey].gallons = Number(event.target.value);
this.setState({
phases: phases
});
},
/*
* Render
*
* @method render
*/
render: function () {
var _this = this;
var state = _this.state;
var startTimeFormatted = moment(state.startTime).format('YYYY-MM-DDThh:mm');
var phasesComponent;
if (state.phases.length) {
phasesComponent =
<table className="table" ng-show="brew.phases.length">
<thead>
<tr>
<th>Gallons</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{state.phases.map(function (phase, key) {
if (phase.type == "water") {
return <tr key={key}>
<td colspan="2">
<div className="input-group">
<input onChange={_this.onPhaseWaterChanged.bind(_this, key)} value={phase.gallons}
className="form-control" type="number" min="0" placeholder="0.00" required/>
<span className="input-group-addon">Gal</span>
</div>
</td>
<td>
<button onClick={_this.onPhaseRemoveBtnClick.bind(_this, phase)}
className="btn btn-mini btn-danger" type="button" title="Remove">
Remove
</button>
</td>
</tr>
}
})}
</tbody>
<thead>
<tr>
<th>Min</th>
<th>Temp</th>
<th></th>
</tr>
</thead>
<tbody>
{state.phases.map(function (phase, key) {
if (phase.type == "brew") {
return <tr key={key}>
<td>
<div className="input-group">
<input onChange={_this.onPhaseDurationChanged.bind(_this, key)} value={phase.min}
className="form-control" type="number" min="0" placeholder="Min"/>
<span className="input-group-addon">Min</span>
</div>
</td>
<td>
<div className="input-group">
<input onChange={_this.onPhaseTempChanged.bind(_this, key)} value={phase.temp}
className="form-control" type="number" min="0" placeholder="F°"/>
<span className="input-group-addon">F°</span>
</div>
</td>
<td>
<button onClick={_this.onPhaseRemoveBtnClick.bind(_this, phase)}
className="btn btn-mini btn-danger" type="button" title="Remove">
Remove
</button>
</td>
</tr>
}
})}
</tbody>
</table>;
}
return (
<section className="row designer">
<div className="col-md-12">
<p>
<button onClick={_this.onCloneActualBtnClick} type="button" className="btn btn-success">Clone actual</button>
<button onClick={_this.onResetBtnClick} type="button" className="btn btn-default">Reset</button>
</p>
<form name="brewForm">
<div className="form-group">
<label htmlFor="name">
<strong>Name</strong>
</label>
<input onChange={_this.onNameChanged} value={state.name} id="name" type="text" placeholder="name" min="0"
required className="form-control" />
</div>
<div className="form-group">
<label htmlFor="startTime" className="control-label">Start time</label>
<input onChange={_this.onStartTimeChanged} value={startTimeFormatted} id="startTime" type="datetime-local"
className="form-control" size="8" name="time" placeholder="start time" />
</div>
</form>
<section className="panel panel-info phases">
<div className="panel-heading">Phases</div>
<div className="panel-body">
{state.phases.length ? phasesComponent : <i>Add new phase first.</i> }
</div>
<div className="panel-footer">
<button onClick={_this.onWaterAddBtnClick.bind(_this)}
type="button" className="btn btn-default">Add Water</button>
<button onClick={_this.onPhaseAddBtnClick.bind(_this, true)}
type="button" className="btn btn-default">Add phase down</button>
<button onClick={_this.onPhaseAddBtnClick.bind(_this, false)}
type="button" className="btn btn-default">Add phase top</button>
</div>
</section>
<p>
<button onClick={_this.onSyncBtnClicked} type="button" className="btn btn-primary btn-lg">Synchronise</button>
</p>
</div>
</section>
);
}
});
module.exports = Designer;