1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-10-18 20:09:08 +02:00
unleash.unleash/public/js/components/Unleash.jsx

135 lines
3.7 KiB
React
Raw Normal View History

2014-10-30 18:25:38 +01:00
var React = require('react');
var Timer = require('../utils/Timer');
var Menu = require('./Menu');
var ErrorMessages = require('./ErrorMessages');
var FeatureList = require('./FeatureList');
2014-10-31 12:25:18 +01:00
var FeatureStore = require('../stores/FeatureStore');
2014-10-30 18:25:38 +01:00
var Unleash = React.createClass({
getInitialState: function() {
return {
savedFeatures: [],
unsavedFeatures: [],
errors: [],
2014-10-31 12:25:18 +01:00
featurePoller: new Timer(this.loadFeaturesFromServer, this.props.pollInterval),
featureStore: new FeatureStore()
2014-10-30 18:25:38 +01:00
};
},
componentDidMount: function () {
this.loadFeaturesFromServer();
2014-10-31 12:25:18 +01:00
this.startFeaturePoller();
2014-10-30 18:25:38 +01:00
},
componentWillUnmount: function () {
2014-10-31 12:25:18 +01:00
this.stopFeaturePoller();
2014-10-30 18:25:38 +01:00
},
loadFeaturesFromServer: function () {
2014-10-31 12:25:18 +01:00
this.state.featureStore.getFeatures().then(this.setFeatures).catch(this.handleError);
2014-10-30 18:25:38 +01:00
},
setFeatures: function (data) {
this.setState({savedFeatures: data.features});
},
handleError: function (error) {
this.state.errors.push(error);
2014-10-31 12:25:18 +01:00
this.forceUpdate();
2014-10-30 18:25:38 +01:00
},
updateFeature: function (changeRequest) {
var newFeatures = this.state.savedFeatures;
newFeatures.forEach(function(f){
if(f.name === changeRequest.name) {
f[changeRequest.field] = changeRequest.value;
}
});
this.setState({features: newFeatures});
2014-10-31 12:25:18 +01:00
this.stopFeaturePoller();
this.state.featureStore.updateFeature(changeRequest)
.then(this.startFeaturePoller)
.catch(this.handleError);
},
startFeaturePoller: function () {
this.state.featurePoller.start();
},
stopFeaturePoller: function () {
if (this.state.featurePoller != null) {
this.state.featurePoller.stop();
}
2014-10-30 18:25:38 +01:00
},
createFeature: function (feature) {
2014-11-01 12:03:50 +01:00
var created = function() {
var unsaved = [], state = this.state;
this.state.unsavedFeatures.forEach(function(f) {
// TODO: make sure we don't overwrite an existing feature
if (f.name === feature.name) {
state.savedFeatures.unshift(f);
} else {
unsaved.push(f);
}
});
this.setState({unsavedFeatures: unsaved});
}.bind(this);
2014-10-30 18:25:38 +01:00
2014-10-31 12:25:18 +01:00
this.state.featureStore.createFeature(feature)
2014-11-01 12:03:50 +01:00
.then(created)
2014-10-31 12:25:18 +01:00
.catch(this.handleError);
2014-10-30 18:25:38 +01:00
},
newFeature: function() {
var blankFeature = {
name: '',
enabled: false,
strategy: 'default',
parameters: {}
};
this.state.unsavedFeatures.push(blankFeature);
this.forceUpdate();
},
cancelNewFeature: function (feature) {
var unsaved = [];
this.state.unsavedFeatures.forEach(function (f) {
if (f.name !== feature.name) {
unsaved.push(f);
}
});
this.setState({unsavedFeatures: unsaved});
},
2014-10-31 10:30:23 +01:00
clearErrors: function() {
this.setState({errors: []});
},
2014-10-30 18:25:38 +01:00
render: function() {
return (
<div>
<Menu />
2014-10-31 10:30:23 +01:00
<ErrorMessages
errors={this.state.errors}
onClearErrors={this.clearErrors} />
2014-10-30 18:25:38 +01:00
<FeatureList
unsavedFeatures={this.state.unsavedFeatures}
savedFeatures={this.state.savedFeatures}
onFeatureChanged={this.updateFeature}
onFeatureSubmit={this.createFeature}
onFeatureCancel={this.cancelNewFeature}
onNewFeature={this.newFeature} />
</div>
);
}
});
module.exports = Unleash;