terra-form
Version:
Components for building forms
81 lines (71 loc) • 1.9 kB
JSX
/* eslint-disable react/jsx-boolean-value, jsx-a11y/label-has-for */
import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames/bind';
import 'terra-base/lib/baseStyles';
import styles from './Field.scss';
const cx = classNames.bind(styles);
const propTypes = {
/**
* Children the Field contains.
*/
children: PropTypes.node,
/**
* Error message for when the input is invalid.
*/
error: PropTypes.node,
/**
* Help element to display with the input.
*/
help: PropTypes.node,
/**
* Determines whether the fieldset is an inline fieldset.
*/
isInline: PropTypes.bool,
/**
* Legend for the input group.
*/
legend: PropTypes.string,
/**
* Attributes to attach to the legend.
*/
legendAttrs: PropTypes.object,
/**
* Determines whether the fieldset is required.
*/
required: PropTypes.bool,
};
const defaultProps = {
children: null,
error: null,
help: null,
isInline: false,
legend: null,
legendAttrs: {},
required: false,
};
const Fieldset = ({ children, error, help, isInline, legend, legendAttrs, required, ...customProps }) => {
const fieldsetClasses = cx([
'fieldset',
{ 'fieldset-inline': isInline },
{ 'fieldset-required': required },
customProps.className,
]);
const legendClasses = cx([
'legend',
legendAttrs.className,
]);
return (
<fieldset {...customProps} className={fieldsetClasses}>
{legend && <legend {...legendAttrs} className={legendClasses}>{legend}</legend>}
{help && <small className={cx('help-text')} tabIndex="-1">{help}</small>}
{error && <small className={cx('error')} tabIndex="-1">{error}</small>}
<div className={cx('fieldset-children')}>
{children}
</div>
</fieldset>
);
};
Fieldset.propTypes = propTypes;
Fieldset.defaultProps = defaultProps;
export default Fieldset;