1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-08-23 13:46:45 +02:00

When user chooses to use a custom strategy

she should get an input field for each
strategy parameter.

closes #53
This commit is contained in:
ivaosthu 2014-11-29 13:37:06 +01:00 committed by Ivar Conradi Østhus
parent e81b88ad7d
commit 0a0515e139
5 changed files with 75 additions and 19 deletions

View File

@ -43,8 +43,8 @@ var TabView = React.createClass({
</ul> </ul>
<div className="tab-content"> <div className="tab-content">
<div className="active"> <div className="active">
<div className="mod shadow mrn prn"> <div className="mod shadow mrn pan">
<div className="inner"> <div className="inner pan">
<div className="bd"> <div className="bd">
{this.state.activeTab.content} {this.state.activeTab.content}
</div> </div>

View File

@ -4,7 +4,11 @@ var strategyStore = require('../../stores/StrategyStore');
var FeatureForm = React.createClass({ var FeatureForm = React.createClass({
getInitialState: function() { getInitialState: function() {
return {strategyOptions: []}; return {
strategyOptions: [],
requiredParams: [],
currentStrategy: this.props.feature ? this.props.feature.strategy : "default"
};
}, },
componentWillMount: function() { componentWillMount: function() {
@ -12,8 +16,40 @@ var FeatureForm = React.createClass({
}, },
handleStrategyResponse: function(response) { handleStrategyResponse: function(response) {
var strategyNames = response.strategies.map(function(s) { return s.name; }); this.setState({strategyOptions: response.strategies});
this.setState({strategyOptions: strategyNames}); if(this.props.feature) {
this.setSelectedStrategy(this.props.feature.strategy);
}
},
onStrategyChange: function(e) {
this.setSelectedStrategy(e.target.value);
this.setState({currentStrategy: e.target.value});
},
getParameterValue: function(name) {
if(this.props.feature && this.props.feature.parameters) {
return this.props.feature.parameters[name];
} else {
return "";
}
},
setSelectedStrategy: function(name) {
var selected = this.state.strategyOptions.filter(function(strategy) {
return strategy.name === name;
});
var requiredParams = [];
var key;
if(selected[0] && selected[0].parametersTemplate) {
for(key in selected[0].parametersTemplate) {
requiredParams.push({name: key, value: this.getParameterValue(key)});
}
}
this.setState({requiredParams: requiredParams});
}, },
render: function() { render: function() {
@ -49,8 +85,8 @@ var FeatureForm = React.createClass({
<div className="formelement"> <div className="formelement">
<label htmlFor="strategy">Strategy</label> <label htmlFor="strategy">Strategy</label>
<div class="input select"> <div className="input select">
<select id="strategy" ref="strategy" defaultValue={feature.strategy}> <select id="strategy" ref="strategy" value={this.state.currentStrategy} onChange={this.onStrategyChange}>
{this.renderStrategyOptions()} {this.renderStrategyOptions()}
</select> </select>
</div> </div>
@ -66,6 +102,9 @@ var FeatureForm = React.createClass({
</ul> </ul>
</div> </div>
</div> </div>
{this.renderStrategyProperties()}
</fieldset> </fieldset>
<div className="actions"> <div className="actions">
@ -78,14 +117,24 @@ var FeatureForm = React.createClass({
}, },
renderStrategyOptions: function() { renderStrategyOptions: function() {
var currentStrategy = this.props.feature ? this.props.feature.strategy : "default"; return this.state.strategyOptions.map(function(strategy) {
return this.state.strategyOptions.map(function(name) {
return ( return (
<option key={name} value={name} selected={name === currentStrategy}> <option key={strategy.name} value={strategy.name}>
{name} {strategy.name}
</option> </option>
); );
}.bind(this));
},
renderStrategyProperties: function() {
return this.state.requiredParams.map(function(param) {
return <TextInput
id={"param-" + param.name}
key={"param-" + param.name}
name={param.name}
label={param.name}
ref={param.name}
value={param.value} />
}); });
}, },
@ -95,8 +144,9 @@ var FeatureForm = React.createClass({
var feature = { var feature = {
name: this.refs.name.getValue(), name: this.refs.name.getValue(),
description: this.refs.description.getValue(), description: this.refs.description.getValue(),
strategy: this.refs.strategy.getDOMNode().value, strategy: this.state.currentStrategy,
enabled: this.refs.enabled.getDOMNode().checked enabled: this.refs.enabled.getDOMNode().checked,
parameters: this.getParameters()
}; };
this.props.onSubmit(feature); this.props.onSubmit(feature);
@ -105,6 +155,14 @@ var FeatureForm = React.createClass({
cancelFeature: function(e) { cancelFeature: function(e) {
e.preventDefault(); e.preventDefault();
this.props.onCancel(); this.props.onCancel();
},
getParameters: function() {
var parameters = {};
this.state.requiredParams.forEach(function(param) {
parameters[param.name] = this.refs[param.name].getValue();
}.bind(this));
return parameters;
} }
}); });

View File

@ -13,8 +13,8 @@ var FeatureList = React.createClass({
}.bind(this)); }.bind(this));
return ( return (
<div className='r-margin'> <div className=''>
<table className='outerborder'> <table className='outerborder man'>
<thead> <thead>
<tr> <tr>
<th></th> <th></th>

View File

@ -113,8 +113,6 @@ var FeatureTogglesComponent = React.createClass({
{this.state.createView ? this.renderCreateView() : this.renderCreateButton()} {this.state.createView ? this.renderCreateView() : this.renderCreateButton()}
<hr />
<FeatureList <FeatureList
features={this.state.features} features={this.state.features}
onFeatureChanged={this.updateFeature} onFeatureChanged={this.updateFeature}

View File

@ -11,7 +11,7 @@ var LogEntryList = React.createClass({
return <LogEntry event={event} key={event.name} />; return <LogEntry event={event} key={event.name} />;
}); });
return ( return (
<div className='r-margin'> <div className='r-pam'>
<table className='condensed outerborder zebra-striped'> <table className='condensed outerborder zebra-striped'>
<thead> <thead>
<tr> <tr>