public/js/components/FormFields/FormFieldMultiSelect.js (69 lines of code) (raw):
import React from 'react';
import {PropTypes} from 'prop-types';
import ShowErrors from '../Utilities/ShowErrors';
import { errorPropType } from '../../constants/errorPropType';
export default class FormFieldMultiSelect extends React.Component {
static propTypes = {
fieldLabel: PropTypes.string,
fieldName: PropTypes.string,
fieldValue: PropTypes.array,
selectValues: PropTypes.array.isRequired,
fieldErrors: PropTypes.arrayOf(errorPropType),
formRowClass: PropTypes.string,
onUpdateField: PropTypes.func
};
state = {
showOptions: false
};
showOptions = () => {
this.setState({showOptions: true});
};
hideOptions = () => {
this.setState({showOptions: false});
};
isSelected = (selectValue) => {
return this.props.fieldValue.indexOf(selectValue) !== -1;
};
renderValue = (fieldName, i) => {
const removeFn = () => {
let newFieldValue = this.props.fieldValue.filter((oldFieldName) => {
return fieldName !== oldFieldName;
});
this.props.onUpdateField(newFieldValue);
};
return (
<span className="form__field--multiselect__value" key={`${fieldName}-${i}`} onClick={removeFn}>{fieldName} </span>
);
};
renderOption(fieldName, i) {
if(this.isSelected(fieldName)) {
return false;
}
const addFn = () => {
let newFieldValue = this.props.fieldValue.concat([fieldName]);
this.props.onUpdateField(newFieldValue);
this.setState({showOptions: false});
};
return (
<div className="form__field--multiselect__option" key={`${this.props.fieldName}-${i}`} onClick={addFn}>
{fieldName}
</div>
);
}
render() {
return (
<div className={this.props.formRowClass || "form__row"}>
{this.props.fieldLabel && <label htmlFor={this.props.fieldName} className="form__label">{this.props.fieldLabel}</label>}
<div className="form__container">
<div className="form__field form__field--multiselect">
{this.props.fieldValue.length ? this.props.fieldValue.map((fieldName, i) => this.renderValue(fieldName, i)) : 'No items selected'}
<button type="button" className="form__field--multiselect__btn" onClick={this.showOptions}>Add</button>
</div>
{this.state.showOptions ?
<div className="form__field--multiselect__options">
{this.props.selectValues.map((fieldName, i) => this.renderOption(fieldName, i))}
</div>
: false}
</div>
<ShowErrors errors={this.props.fieldErrors}/>
</div>
);
}
}