diff --git a/frontend/src/component/common/input-list-field.jsx b/frontend/src/component/common/input-list-field.jsx
new file mode 100644
index 0000000000..a426ac6c9d
--- /dev/null
+++ b/frontend/src/component/common/input-list-field.jsx
@@ -0,0 +1,49 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { Textfield } from 'react-mdl';
+
+function InputListField({ label, values = [], error, name, updateValues, placeholder = '', onBlur = () => {} }) {
+ const handleChange = evt => {
+ const values = evt.target.value.split(/,\s?/);
+ const trimmedValues = values.map(v => v.trim());
+ updateValues(trimmedValues);
+ };
+
+ const handleKeyDown = evt => {
+ if (evt.key === 'Backspace') {
+ const currentValue = evt.target.value;
+ if (currentValue.endsWith(', ')) {
+ evt.preventDefault();
+ const value = currentValue.slice(0, -2);
+ updateValues(value.split(/,\s*/));
+ }
+ }
+ };
+
+ return (
+
+ );
+}
+
+InputListField.propTypes = {
+ label: PropTypes.string.isRequired,
+ values: PropTypes.array,
+ error: PropTypes.string,
+ placeholder: PropTypes.string,
+ name: PropTypes.string.isRequired,
+ updateValues: PropTypes.func.isRequired,
+ onBlur: PropTypes.func,
+};
+
+export default InputListField;
diff --git a/frontend/src/component/feature/form/select.jsx b/frontend/src/component/common/select.jsx
similarity index 100%
rename from frontend/src/component/feature/form/select.jsx
rename to frontend/src/component/common/select.jsx
diff --git a/frontend/src/component/feature/form/flexible-rollout-strategy-input.jsx b/frontend/src/component/feature/form/flexible-rollout-strategy-input.jsx
index 92ac748834..87f6da5f47 100644
--- a/frontend/src/component/feature/form/flexible-rollout-strategy-input.jsx
+++ b/frontend/src/component/feature/form/flexible-rollout-strategy-input.jsx
@@ -1,7 +1,7 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Textfield } from 'react-mdl';
-import Select from './select';
+import Select from '../../common/select';
import StrategyInputPercentage from './strategy-input-percentage';
diff --git a/frontend/src/component/feature/variant/add-variant.jsx b/frontend/src/component/feature/variant/add-variant.jsx
index 21da1973da..61653e2d7a 100644
--- a/frontend/src/component/feature/variant/add-variant.jsx
+++ b/frontend/src/component/feature/variant/add-variant.jsx
@@ -12,7 +12,7 @@ import {
Tooltip,
Icon,
} from 'react-mdl';
-import MySelect from '../form/select';
+import MySelect from '../../common/select';
import { trim } from '../form/util';
import styles from './variant.scss';
import OverrideConfig from './override-config';
@@ -38,9 +38,7 @@ function AddVariant({ showDialog, closeDialog, save, validateName, editVariant,
setPayload(editVariant.payload);
}
if (editVariant.overrides) {
- setOverrides(
- editVariant.overrides.map(o => ({ contextName: o.contextName, values: o.values.join(', ') }))
- );
+ setOverrides(editVariant.overrides);
} else {
setOverrides([]);
}
@@ -80,10 +78,7 @@ function AddVariant({ showDialog, closeDialog, save, validateName, editVariant,
overrides: overrides
.map(o => ({
contextName: o.contextName,
- values: o.values
- .split(',')
- .map(v => v.trim())
- .filter(v => v),
+ values: o.values,
}))
.filter(o => o.values && o.values.length > 0),
};
@@ -110,7 +105,7 @@ function AddVariant({ showDialog, closeDialog, save, validateName, editVariant,
closeDialog();
};
- const updateOverrideOption = index => e => {
+ const updateOverrideType = index => e => {
e.preventDefault();
setOverrides(
overrides.map((o, i) => {
@@ -122,14 +117,25 @@ function AddVariant({ showDialog, closeDialog, save, validateName, editVariant,
);
};
- const removeOverrideOption = index => e => {
+ const updateOverrideValues = (index, values) => {
+ setOverrides(
+ overrides.map((o, i) => {
+ if (i === index) {
+ o.values = values;
+ }
+ return o;
+ })
+ );
+ };
+
+ const removeOverride = index => e => {
e.preventDefault();
setOverrides(overrides.filter((o, i) => i !== index));
};
const onAddOverride = e => {
e.preventDefault();
- setOverrides([...overrides, ...[{ contextName: 'userId', values: '' }]]);
+ setOverrides([...overrides, ...[{ contextName: 'userId', values: [] }]]);
};
return (
@@ -210,8 +216,10 @@ function AddVariant({ showDialog, closeDialog, save, validateName, editVariant,
Add override
diff --git a/frontend/src/component/feature/variant/override-config.jsx b/frontend/src/component/feature/variant/override-config.jsx
index 91d45c9c8a..a775f10cf3 100644
--- a/frontend/src/component/feature/variant/override-config.jsx
+++ b/frontend/src/component/feature/variant/override-config.jsx
@@ -1,14 +1,19 @@
import React from 'react';
import PropTypes from 'prop-types';
-import { Textfield, Grid, Cell, IconButton } from 'react-mdl';
-import MySelect from '../form/select';
+import { Grid, Cell, IconButton } from 'react-mdl';
+import MySelect from '../../common/select';
+import InputListField from '../../common/input-list-field';
const overrideOptions = [
{ key: 'userId', label: 'userId' },
{ key: 'appName', label: 'appName' },
];
-function OverrideConfig({ overrides, updateOverrideOption, removeOverrideOption }) {
+function OverrideConfig({ overrides, updateOverrideType, updateOverrideValues, removeOverride }) {
+ const updateValues = i => values => {
+ updateOverrideValues(i, values);
+ };
+
return overrides.map((o, i) => (
@@ -17,22 +22,21 @@ function OverrideConfig({ overrides, updateOverrideOption, removeOverrideOption
label="Context Field"
value={o.contextName}
options={overrideOptions}
- onChange={updateOverrideOption(i)}
+ onChange={updateOverrideType(i)}
/>
|
-
|
-
+
|
));
@@ -40,8 +44,9 @@ function OverrideConfig({ overrides, updateOverrideOption, removeOverrideOption
OverrideConfig.propTypes = {
overrides: PropTypes.array.isRequired,
- updateOverrideOption: PropTypes.func.isRequired,
- removeOverrideOption: PropTypes.func.isRequired,
+ updateOverrideType: PropTypes.func.isRequired,
+ updateOverrideValues: PropTypes.func.isRequired,
+ removeOverride: PropTypes.func.isRequired,
};
export default OverrideConfig;