rc-adminlte
Version:
AdminLTE template ported to React
100 lines (92 loc) • 3.53 kB
JSX
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import Label from './Label';
import { Sizes } from '../../PropTypes';
import { splitIcon } from '../../Utilities';
class InputWrapper extends Component {
state = {}
render() {
const {
iconLeft, iconRight, addonLeft, addonRight, size,
checkboxLeft, checkboxRight, radioLeft, radioRight, buttonLeft, buttonRight,
children, checkboxLeftProps, checkboxRightProps, radioLeftProps, radioRightProps,
width, help, ...props
} = this.props;
const groupClasses = [
'input-group',
size ? `input-group-${size}` : null,
].filter(p => p).join(' ');
if (iconLeft || iconRight || addonLeft || addonRight
|| checkboxLeft || checkboxRight || radioLeft || radioRight
|| buttonLeft || buttonRight) {
const iconLeftClass = splitIcon(iconLeft);
const iconRightClass = splitIcon(iconRight);
return (
<Label {...props}>
<div className={groupClasses} style={{ width }}>
{addonLeft && <span className="input-group-addon">{addonLeft}</span>}
{iconLeft && <span className="input-group-addon"><FontAwesomeIcon icon={iconLeftClass} /></span>}
{checkboxLeft && <span className="input-group-addon"><input type="checkbox" {...checkboxLeftProps} /></span>}
{radioLeft && <span className="input-group-addon"><input type="radio" {...radioLeftProps} /></span>}
{buttonLeft && <div className="input-group-btn">{buttonLeft}</div>}
{children}
{addonRight && <span className="input-group-addon">{addonRight}</span>}
{iconRight && <span className="input-group-addon"><FontAwesomeIcon icon={iconRightClass} /></span>}
{checkboxRight && <span className="input-group-addon"><input type="checkbox" {...checkboxRightProps} /></span>}
{radioRight && <span className="input-group-addon"><input type="radio" {...radioRightProps} /></span>}
{buttonRight && <div className="input-group-btn">{buttonRight}</div>}
</div>
</Label>
);
}
return (
<Label {...this.props}>
<div className={groupClasses} style={{ width }}>
{children}
</div>
{help && <p className="help-block">{help}</p>}
</Label>
);
}
}
InputWrapper.propTypes = {
iconLeft: PropTypes.string,
iconRight: PropTypes.string,
addonLeft: PropTypes.oneOf([PropTypes.string, PropTypes.node]),
addonRight: PropTypes.oneOf([PropTypes.string, PropTypes.node]),
size: PropTypes.oneOf(Sizes),
checkboxLeft: PropTypes.bool,
checkboxLeftProps: PropTypes.shape({}),
checkboxRight: PropTypes.bool,
checkboxRightProps: PropTypes.shape({}),
radioLeft: PropTypes.bool,
radioLeftProps: PropTypes.shape({}),
radioRight: PropTypes.bool,
radioRightProps: PropTypes.shape({}),
buttonLeft: PropTypes.node,
buttonRight: PropTypes.node,
children: PropTypes.node.isRequired,
width: PropTypes.string,
help: PropTypes.string,
};
InputWrapper.defaultProps = {
iconLeft: null,
iconRight: null,
addonLeft: null,
addonRight: null,
size: null,
checkboxLeft: false,
checkboxLeftProps: null,
checkboxRight: false,
checkboxRightProps: null,
radioLeft: false,
radioLeftProps: null,
radioRight: false,
radioRightProps: null,
buttonLeft: null,
buttonRight: null,
width: '100%',
help: null,
};
export default InputWrapper;