import React, { Component } from "react"; import PropTypes from "prop-types"; import classnames from "classnames"; import { noop, pick } from "lodash"; import Select from "react-select"; import dropdownOptionInterface from "interfaces/dropdownOption"; import FormField from "components/forms/FormField"; import Icon from "components/Icon"; const baseClass = "dropdown"; class Dropdown extends Component { static propTypes = { className: PropTypes.string, clearable: PropTypes.bool, searchable: PropTypes.bool, disabled: PropTypes.bool, error: PropTypes.string, label: PropTypes.oneOfType([PropTypes.array, PropTypes.string]), labelClassName: PropTypes.string, multi: PropTypes.bool, name: PropTypes.string, onChange: PropTypes.func, onOpen: PropTypes.func, onClose: PropTypes.func, options: PropTypes.arrayOf(dropdownOptionInterface).isRequired, placeholder: PropTypes.oneOfType([PropTypes.array, PropTypes.string]), value: PropTypes.oneOfType([ PropTypes.array, PropTypes.string, PropTypes.number, ]), wrapperClassName: PropTypes.string, parseTarget: PropTypes.bool, tooltip: PropTypes.string, autoFocus: PropTypes.bool, /** Includes styled filter icon */ tableFilterDropdown: PropTypes.bool, }; static defaultProps = { onChange: noop, onOpen: noop, onClose: noop, clearable: false, searchable: true, disabled: false, multi: false, name: "targets", placeholder: "Select one...", // if value undefined parseTarget: false, tooltip: "", autoFocus: false, tableFilterDropdown: false, }; onMenuOpen = () => { const { onOpen } = this.props; onOpen(); }; onMenuClose = () => { const { onClose } = this.props; onClose(); }; handleChange = (selected) => { const { multi, onChange, clearable, name, parseTarget } = this.props; if (parseTarget) { // Returns both name and value return onChange({ value: selected.value, name }); } if (clearable && selected === null) { return onChange(null); } if (multi) { return onChange(selected.map((obj) => obj.value).join(",")); } return onChange(selected.value); }; renderLabel = () => { const { error, label, labelClassName, name } = this.props; const labelWrapperClasses = classnames( `${baseClass}__label`, labelClassName, { [`${baseClass}__label--error`]: error } ); if (!label) { return false; } return ( ); }; renderOption = (option) => { return (