import PropTypes from 'prop-types'; import React from 'react'; import { inputTypes } from 'Helpers/Props'; import Link from 'Components/Link/Link'; import CaptchaInputConnector from './CaptchaInputConnector'; import CheckInput from './CheckInput'; import MonitorAlbumsSelectInput from './MonitorAlbumsSelectInput'; import NumberInput from './NumberInput'; import OAuthInputConnector from './OAuthInputConnector'; import PasswordInput from './PasswordInput'; import PathInputConnector from './PathInputConnector'; import QualityProfileSelectInputConnector from './QualityProfileSelectInputConnector'; import LanguageProfileSelectInputConnector from './LanguageProfileSelectInputConnector'; import RootFolderSelectInputConnector from './RootFolderSelectInputConnector'; import SeriesTypeSelectInput from './SeriesTypeSelectInput'; import SelectInput from './SelectInput'; import TagInputConnector from './TagInputConnector'; import TextTagInputConnector from './TextTagInputConnector'; import TextInput from './TextInput'; import FormInputHelpText from './FormInputHelpText'; import styles from './FormInputGroup.css'; function getComponent(type) { switch (type) { case inputTypes.CAPTCHA: return CaptchaInputConnector; case inputTypes.CHECK: return CheckInput; case inputTypes.MONITOR_ALBUMS_SELECT: return MonitorAlbumsSelectInput; case inputTypes.NUMBER: return NumberInput; case inputTypes.OAUTH: return OAuthInputConnector; case inputTypes.PASSWORD: return PasswordInput; case inputTypes.PATH: return PathInputConnector; case inputTypes.QUALITY_PROFILE_SELECT: return QualityProfileSelectInputConnector; case inputTypes.LANGUAGE_PROFILE_SELECT: return LanguageProfileSelectInputConnector; case inputTypes.ROOT_FOLDER_SELECT: return RootFolderSelectInputConnector; case inputTypes.SELECT: return SelectInput; case inputTypes.SERIES_TYPE_SELECT: return SeriesTypeSelectInput; case inputTypes.TAG: return TagInputConnector; case inputTypes.TEXT_TAG: return TextTagInputConnector; default: return TextInput; } } function FormInputGroup(props) { const { className, containerClassName, inputClassName, type, buttons, helpText, helpTexts, helpTextWarning, helpLink, pending, errors, warnings, ...otherProps } = props; const InputComponent = getComponent(type); const checkInput = type === inputTypes.CHECK; const hasError = !!errors.length; const hasWarning = !hasError && !!warnings.length; const buttonsArray = React.Children.toArray(buttons); const lastButtonIndex = buttonsArray.length - 1; const hasButton = !!buttonsArray.length; return (
{ buttonsArray.map((button, index) => { return React.cloneElement( button, { isLastButton: index === lastButtonIndex } ); }) } {/*
{ pending && }
*/}
{ !checkInput && helpText && } { !checkInput && helpTexts &&
{ helpTexts.map((text, index) => { return ( ); }) }
} { !checkInput && helpTextWarning && } { helpLink && More Info } { errors.map((error, index) => { return ( ); }) } { warnings.map((warning, index) => { return ( ); }) }
); } FormInputGroup.propTypes = { className: PropTypes.string.isRequired, containerClassName: PropTypes.string.isRequired, inputClassName: PropTypes.string, type: PropTypes.string.isRequired, buttons: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]), helpText: PropTypes.string, helpTexts: PropTypes.arrayOf(PropTypes.string), helpTextWarning: PropTypes.string, helpLink: PropTypes.string, pending: PropTypes.bool, errors: PropTypes.arrayOf(PropTypes.object), warnings: PropTypes.arrayOf(PropTypes.object) }; FormInputGroup.defaultProps = { className: styles.inputGroup, containerClassName: styles.inputGroupContainer, type: inputTypes.TEXT, buttons: [], helpTexts: [], errors: [], warnings: [] }; export default FormInputGroup;