1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-04-15 01:16:22 +02:00
unleash.unleash/frontend/src/component/feature/form/form-add-feature-container.jsx
Ivar Conradi Østhus 19443c651f Feat: clone feature toggle configuration (#201)
Create a new feature toggle by cloning the config of an
existing feature toggle.

This feature alos moves away from the input store for the
"create feature toggle form".
2020-01-09 22:51:05 +01:00

123 lines
3.8 KiB
JavaScript

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import arrayMove from 'array-move';
import { createFeatureToggles, validateName } from './../../../store/feature-actions';
import AddFeatureComponent from './form-add-feature-component';
const defaultStrategy = { name: 'default' };
class WrapperComponent extends Component {
constructor() {
super();
this.state = {
featureToggle: { strategies: [], enabled: true },
errors: {},
dirty: false,
};
}
setValue = (field, value) => {
const { featureToggle } = this.state;
featureToggle[field] = value;
this.setState({ featureToggle, dirty: true });
};
validateName = async featureToggleName => {
const { errors } = this.state;
try {
await validateName(featureToggleName);
errors.name = undefined;
} catch (err) {
errors.name = err.message;
}
this.setState({ errors });
};
addStrategy = strat => {
strat.id = Math.round(Math.random() * 10000000);
const { featureToggle } = this.state;
const strategies = featureToggle.strategies.concat(strat);
featureToggle.strategies = strategies;
this.setState({ featureToggle, dirty: true });
};
moveStrategy = (index, toIndex) => {
const { featureToggle } = this.state;
const strategies = arrayMove(featureToggle.strategies, index, toIndex);
featureToggle.strategies = strategies;
this.setState({ featureToggle, dirty: true });
};
removeStrategy = index => {
const { featureToggle } = this.state;
const strategies = featureToggle.strategies.filter((_, i) => i !== index);
featureToggle.strategies = strategies;
this.setState({ featureToggle, dirty: true });
};
updateStrategy = (index, strat) => {
const { featureToggle } = this.state;
const strategies = featureToggle.strategies.concat();
strategies[index] = strat;
featureToggle.strategies = strategies;
this.setState({ featureToggle, dirty: true });
};
onSubmit = evt => {
evt.preventDefault();
const { createFeatureToggles, history } = this.props;
const { featureToggle } = this.state;
featureToggle.createdAt = new Date();
if (Array.isArray(featureToggle.strategies)) {
featureToggle.strategies.forEach(s => {
delete s.id;
});
} else {
featureToggle.strategies = [defaultStrategy];
}
createFeatureToggles(featureToggle).then(() => history.push(`/features/strategies/${featureToggle.name}`));
};
onCancel = evt => {
evt.preventDefault();
this.props.history.push('/features');
};
render() {
return (
<AddFeatureComponent
onSubmit={this.onSubmit}
onCancel={this.onCancel}
addStrategy={this.addStrategy}
updateStrategy={this.updateStrategy}
removeStrategy={this.removeStrategy}
moveStrategy={this.moveStrategy}
validateName={this.validateName}
setValue={this.setValue}
input={this.state.featureToggle}
errors={this.state.errors}
/>
);
}
}
WrapperComponent.propTypes = {
history: PropTypes.object.isRequired,
createFeatureToggles: PropTypes.func.isRequired,
};
const mapDispatchToProps = dispatch => ({
validateName: name => validateName(name)(dispatch),
createFeatureToggles: featureToggle => createFeatureToggles(featureToggle)(dispatch),
});
const FormAddContainer = connect(
() => {},
mapDispatchToProps
)(WrapperComponent);
export default FormAddContainer;