From c57a1b56f2251e8fd32b4ca9a3f6102d45818ce0 Mon Sep 17 00:00:00 2001 From: blobfysh <47480729+blobfysh@users.noreply.github.com> Date: Sun, 20 Dec 2020 11:22:28 -0500 Subject: [PATCH 1/2] add support for multiselect dropdowns added isMulti prop to Dropdown component to enable multiselect dropdown --- src/components/Dropdown/index.js | 31 ++++++++++++++++++++++++------- src/components/Form/index.js | 17 +++++++++++++++++ 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/components/Dropdown/index.js b/src/components/Dropdown/index.js index 587ad6a..567b1be 100644 --- a/src/components/Dropdown/index.js +++ b/src/components/Dropdown/index.js @@ -3,10 +3,21 @@ import PropTypes from 'prop-types' import mainStyles from '../../styles.module.css' -const Dropdown = ({ value, label, field, data, placeholder, onChange }) => { +const Dropdown = ({ value, label, field, data, placeholder, onChange, isMulti }) => { const handleChange = (event) => { - const { value } = event.target - onChange(value, field) + if (isMulti) { + const { options } = event.target + const value = [] + + for (let i = 0; i < options.length; i++) { + if (options[i].selected) value.push(options[i].value) + } + + onChange(value, field) + } else { + const { value } = event.target + onChange(value, field) + } } return ( @@ -16,8 +27,12 @@ const Dropdown = ({ value, label, field, data, placeholder, onChange }) => { value={value} className={mainStyles.formControl} onChange={handleChange} + multiple={isMulti} > - {placeholder ? placeholder : 'Select a value'} + { + !isMulti && + {placeholder ? placeholder : 'Select a value'} + } {data.map((item, key) => ( {item.label} @@ -29,12 +44,13 @@ const Dropdown = ({ value, label, field, data, placeholder, onChange }) => { } Dropdown.propTypes = { - value: PropTypes.string, + value: PropTypes.oneOfType([PropTypes.string, PropTypes.array]), placeholder: PropTypes.string, data: PropTypes.array, label: PropTypes.string, field: PropTypes.string, - onChange: PropTypes.func.isRequired + onChange: PropTypes.func.isRequired, + isMulti: PropTypes.bool } Dropdown.defaultProps = { @@ -42,7 +58,8 @@ Dropdown.defaultProps = { placeholder: '', label: '', field: '', - data: [] + data: [], + isMulti: false } export default Dropdown diff --git a/src/components/Form/index.js b/src/components/Form/index.js index 9c5c284..486f896 100644 --- a/src/components/Form/index.js +++ b/src/components/Form/index.js @@ -35,6 +35,8 @@ export default class Form extends Component { model.forEach((item) => { if (item.type === 'checkbox') { formData[item.field] = values[item.field] ? values[item.field] : false + } else if (item.type === 'multi-dropdown') { + formData[item.field] = values[item.field] ? values[item.field] : [] } else { formData[item.field] = values[item.field] ? values[item.field] : '' } @@ -130,6 +132,21 @@ export default class Form extends Component { ) break + case 'multi-dropdown': + domArray.push( + + + + ) + break case 'checkbox': domArray.push( From dd1d1462373e97803c154ee161ff4de3ea3f91fd Mon Sep 17 00:00:00 2001 From: blobfysh <47480729+blobfysh@users.noreply.github.com> Date: Sun, 20 Dec 2020 11:23:45 -0500 Subject: [PATCH 2/2] add multiselect dropdown example --- example/src/App.js | 10 +++++++++- example/src/config.js | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/example/src/App.js b/example/src/App.js index 02a4451..fecf903 100644 --- a/example/src/App.js +++ b/example/src/App.js @@ -13,6 +13,14 @@ const budgetData = [ { value: 50000, label: '$50000' } ] +const animalData = [ + { value: 'Bear', label: 'Bear' }, + { value: 'Fox', label: 'Fox' }, + { value: 'Cat', label: 'Cat' }, + { value: 'Dog', label: 'Dog' }, + { value: 'Mouse', label: 'Mouse' } +] + export default class App extends Component { formRef = createRef() @@ -30,7 +38,7 @@ export default class App extends Component { Save diff --git a/example/src/config.js b/example/src/config.js index bf55ab5..34e2ff8 100644 --- a/example/src/config.js +++ b/example/src/config.js @@ -24,6 +24,14 @@ export const formConstants = [ title: 'Your Budget', styleClass: 'col-sm-6' }, + { + field: 'animals', + type: 'multi-dropdown', + validators: [], + required: false, + title: 'Pick your favorite animals', + styleClass: 'col-sm-12' + }, { field: 'message', type: 'textarea',