import PropTypes from 'prop-types'; import React from 'react'; import Link from 'Components/Link/Link'; import { inputTypes } from 'Helpers/Props'; import translate from 'Utilities/String/translate'; import AutoCompleteInput from './AutoCompleteInput'; import AvailabilitySelectInput from './AvailabilitySelectInput'; import CaptchaInputConnector from './CaptchaInputConnector'; import CheckInput from './CheckInput'; import DeviceInputConnector from './DeviceInputConnector'; import EnhancedSelectInput from './EnhancedSelectInput'; import EnhancedSelectInputConnector from './EnhancedSelectInputConnector'; import FormInputHelpText from './FormInputHelpText'; import IndexerFlagsSelectInputConnector from './IndexerFlagsSelectInputConnector'; import KeyValueListInput from './KeyValueListInput'; import LanguageSelectInputConnector from './LanguageSelectInputConnector'; import MovieMonitoredSelectInput from './MovieMonitoredSelectInput'; import NumberInput from './NumberInput'; import OAuthInputConnector from './OAuthInputConnector'; import PasswordInput from './PasswordInput'; import PathInputConnector from './PathInputConnector'; import QualityProfileSelectInputConnector from './QualityProfileSelectInputConnector'; import RootFolderSelectInputConnector from './RootFolderSelectInputConnector'; import TagInputConnector from './TagInputConnector'; import TagSelectInputConnector from './TagSelectInputConnector'; import TextArea from './TextArea'; import TextInput from './TextInput'; import TextTagInputConnector from './TextTagInputConnector'; import UMaskInput from './UMaskInput'; import styles from './FormInputGroup.css'; function getComponent(type) { switch (type) { case inputTypes.AUTO_COMPLETE: return AutoCompleteInput; case inputTypes.AVAILABILITY_SELECT: return AvailabilitySelectInput; case inputTypes.CAPTCHA: return CaptchaInputConnector; case inputTypes.CHECK: return CheckInput; case inputTypes.DEVICE: return DeviceInputConnector; case inputTypes.KEY_VALUE_LIST: return KeyValueListInput; 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.MOVIE_MONITORED_SELECT: return MovieMonitoredSelectInput; case inputTypes.ROOT_FOLDER_SELECT: return RootFolderSelectInputConnector; case inputTypes.INDEXER_FLAGS_SELECT: return IndexerFlagsSelectInputConnector; case inputTypes.LANGUAGE_SELECT: return LanguageSelectInputConnector; case inputTypes.SELECT: return EnhancedSelectInput; case inputTypes.DYNAMIC_SELECT: return EnhancedSelectInputConnector; case inputTypes.TAG: return TagInputConnector; case inputTypes.TEXT_AREA: return TextArea; case inputTypes.TEXT_TAG: return TextTagInputConnector; case inputTypes.TAG_SELECT: return TagSelectInputConnector; case inputTypes.UMASK: return UMaskInput; default: return TextInput; } } function FormInputGroup(props) { const { className, containerClassName, inputClassName, type, unit, 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 (
{ unit &&
{unit}
}
{ buttonsArray.map((button, index) => { return React.cloneElement( button, { isLastButton: index === lastButtonIndex } ); }) } {/*
{ pending && }
*/}
{ !checkInput && helpText && } { !checkInput && helpTexts &&
{ helpTexts.map((text, index) => { return ( ); }) }
} { (!checkInput || helpText) && helpTextWarning && } { helpLink && {translate('MoreInfo')} } { 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, unit: PropTypes.string, 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;