public/js/components/FormFields/FormFieldSelectBox.js (67 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 FormFieldSelectBox extends React.Component { static propTypes = { fieldLabel: PropTypes.string, fieldName: PropTypes.string, fieldValue: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), fieldErrors: PropTypes.arrayOf(errorPropType), selectValues: PropTypes.array, formRowClass: PropTypes.string, onUpdateField: PropTypes.func, optionsAsObject: PropTypes.bool, displayEmptyOption: PropTypes.bool }; renderOption(option) { if (option.id) { return ( <option key={option.id} value={option.id}>{option.name}</option> ); } if (option.name) { return ( <option key={option.name} value={option.value}>{option.name}</option> ); } return ( <option key={option} value={option}>{option}</option> ); } onUpdate = (e) => { if (this.props.optionsAsObject) { const id = parseInt(e.target.value); const newValue = this.props.selectValues.find(value => { return value.id === id; }); this.props.onUpdateField(newValue); } else { this.props.onUpdateField(e.target.value); } }; renderDefaultOption() { if (this.props.displayEmptyOption && !this.props.fieldValue) { return ( <option value={null}> Please select... </option> ); } } renderOptions() { return this.props.selectValues.map(this.renderOption); } render() { return ( <div className={this.props.formRowClass || "form__row"}> {this.props.fieldLabel ? <label htmlFor={this.props.fieldName} className="form__label">{this.props.fieldLabel}</label> : false} <select className="form__field form__field--select" value={this.props.optionsAsObject ? this.props.fieldValue.id : this.props.fieldValue} onChange={this.onUpdate}> {this.renderDefaultOption()} {this.renderOptions()} </select> <ShowErrors errors={this.props.fieldErrors}/> </div> ); } }