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;