mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			181 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var React = require('react');
 | |
| var TextInput = require('../form/TextInput');
 | |
| var strategyStore = require('../../stores/StrategyStore');
 | |
| 
 | |
| var FeatureForm = React.createClass({
 | |
|     getInitialState: function() {
 | |
|       return {
 | |
|           strategyOptions: [],
 | |
|           requiredParams: [],
 | |
|           currentStrategy: this.props.feature ? this.props.feature.strategy : "default"
 | |
|       };
 | |
|     },
 | |
| 
 | |
|     componentWillMount: function() {
 | |
|       strategyStore.getStrategies().then(this.handleStrategyResponse);
 | |
|     },
 | |
| 
 | |
|     handleStrategyResponse: function(response) {
 | |
|         this.setState({strategyOptions: response.strategies});
 | |
|         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 selectedStrategy = this.state.strategyOptions.filter(function(strategy) {
 | |
|             return strategy.name ===  name;
 | |
|         })[0];
 | |
| 
 | |
|         if(selectedStrategy) {
 | |
|             if(selectedStrategy.parametersTemplate) {
 | |
|                 this.setStrategyParams(selectedStrategy);
 | |
|             }
 | |
|         } else {
 | |
|             var updatedStrategyName = name + " (deleted)";
 | |
|             this.setState({
 | |
|                 currentStrategy: updatedStrategyName,
 | |
|                 strategyOptions: this.state.strategyOptions.concat([{name: updatedStrategyName}])
 | |
|             });
 | |
|         }
 | |
|     },
 | |
| 
 | |
|     setStrategyParams: function(strategy) {
 | |
|         var requiredParams = [];
 | |
|         var key;
 | |
|         for(key in strategy.parametersTemplate) {
 | |
|             requiredParams.push({name: key, value: this.getParameterValue(key)});
 | |
|         }
 | |
|         this.setState({requiredParams: requiredParams});
 | |
|     },
 | |
| 
 | |
|     render: function() {
 | |
|         var feature = this.props.feature || {
 | |
|           name: '',
 | |
|           strategy: 'default',
 | |
|           enabled: false
 | |
|         };
 | |
| 
 | |
|         var idPrefix = this.props.feature ? this.props.feature.name : 'new';
 | |
| 
 | |
|         return (
 | |
|             <div className="bg-lilac-xlt r-pam">
 | |
|                 <form ref="form" className="r-size1of2">
 | |
| 
 | |
|                     <fieldset>
 | |
|                         {this.props.feature ? "" : <legend>Create new toggle</legend>}
 | |
| 
 | |
|                         <TextInput
 | |
|                             id={idPrefix + "-name"}
 | |
|                             name="name"
 | |
|                             label="Name"
 | |
|                             value={feature.name}
 | |
|                             disabled={feature.name.length}
 | |
|                             ref="name"
 | |
|                             placeholder="Toggle name" />
 | |
| 
 | |
|                         <TextInput
 | |
|                             id={idPrefix + "-description"}
 | |
|                             name="description"
 | |
|                             label="Description"
 | |
|                             value={feature.description}
 | |
|                             ref="description"
 | |
|                             placeholder="Enter description" />
 | |
| 
 | |
|                         <div className="formelement">
 | |
|                             <label htmlFor={idPrefix + "-strategy"}>Strategy</label>
 | |
|                             <div className="input select">
 | |
|                                 <select id={idPrefix + "-strategy"} ref="strategy" value={this.state.currentStrategy} onChange={this.onStrategyChange}>
 | |
|                                     {this.renderStrategyOptions()}
 | |
|                                 </select>
 | |
|                             </div>
 | |
|                         </div>
 | |
| 
 | |
|                         <div className="formelement">
 | |
|                             <div className="input">
 | |
|                                 <ul className="inputs-list">
 | |
|                                     <li>
 | |
|                                         <input id={idPrefix + "-active"} ref="enabled" type="checkbox" defaultChecked={feature.enabled} />
 | |
|                                         <label htmlFor={idPrefix + "-active"}>Active</label>
 | |
|                                     </li>
 | |
|                                 </ul>
 | |
|                             </div>
 | |
|                         </div>
 | |
| 
 | |
|                         {this.renderStrategyProperties()}
 | |
| 
 | |
|                     </fieldset>
 | |
| 
 | |
|                     <div className="actions">
 | |
|                         <button className="primary mrs" onClick={this.saveFeature}>Save</button>
 | |
|                         <button className="" onClick={this.cancelFeature}>Cancel</button>
 | |
|                     </div>
 | |
|                 </form>
 | |
|             </div>
 | |
|         );
 | |
|     },
 | |
| 
 | |
|     renderStrategyOptions: function() {
 | |
|         return this.state.strategyOptions.map(function(strategy) {
 | |
|             return (
 | |
|               <option key={strategy.name} value={strategy.name}>
 | |
|                 {strategy.name}
 | |
|               </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} />
 | |
|         });
 | |
|     },
 | |
| 
 | |
|     saveFeature: function(e) {
 | |
|         e.preventDefault();
 | |
| 
 | |
|         var feature = {
 | |
|             name: this.refs.name.getValue(),
 | |
|             description: this.refs.description.getValue(),
 | |
|             strategy: this.state.currentStrategy,
 | |
|             enabled: this.refs.enabled.getDOMNode().checked,
 | |
|             parameters: this.getParameters()
 | |
|         };
 | |
| 
 | |
|         this.props.onSubmit(feature);
 | |
|     },
 | |
| 
 | |
|     cancelFeature: function(e) {
 | |
|         e.preventDefault();
 | |
|         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;
 | |
|     }
 | |
| });
 | |
| 
 | |
| module.exports = FeatureForm; |