import { createRef, Component, ReactElement, RefObject, ChangeEvent, ReactNode, } from 'react'; import { observer } from 'mobx-react'; import classnames from 'classnames'; import { Field } from '../../@types/mobx-form.types'; interface IProps { field: Field; className?: string; showLabel?: boolean; disabled?: boolean; multiple?: boolean; } // TODO: Can this file be merged into the './select/index.tsx' file? @observer class Select extends Component { private element: RefObject = createRef(); multipleChange(e: ChangeEvent): void { e.preventDefault(); if (!this.element.current) { return; } const result: string[] = []; const { options } = this.element.current; for (const option of options) { if (option.selected && (option.value || option.text)) { result.push(option.value || option.text); } } const { field } = this.props; field.value = result; } render(): ReactElement { const { field, className = null, showLabel = true, disabled = false, multiple = false, } = this.props; let selected = field.value; if (multiple) { if (typeof field.value === 'string' && field.value.startsWith('[')) { // Value is JSON encoded selected = JSON.parse(field.value); } else if (typeof field.value === 'object') { selected = field.value; } else { selected = [field.value]; } } return (
{field.label && showLabel && ( )} {field.error && (
{field.error as ReactNode}
)}
); } } export default Select;