woocommerce/plugins/woocommerce-admin/client/components/segmented-selection/index.js

87 lines
2.3 KiB
JavaScript
Raw Normal View History

2018-05-17 04:44:58 +00:00
/** @format */
/**
* External dependencies
*/
import { Component } from '@wordpress/element';
2018-05-17 04:44:58 +00:00
import classnames from 'classnames';
import PropTypes from 'prop-types';
import { partial, uniqueId } from 'lodash';
/**
* Internal dependencies
*/
import './style.scss';
/**
* Create a panel of styled selectable options rendering stylized checkboxes and labels
*/
2018-05-17 04:44:58 +00:00
class SegmentedSelection extends Component {
render() {
const { className, options, selected, onSelect, name, legend } = this.props;
return (
2018-05-28 10:55:19 +00:00
<fieldset className="woocommerce-segmented-selection">
2018-05-17 04:44:58 +00:00
<legend className="screen-reader-text">{ legend }</legend>
2018-05-28 10:55:19 +00:00
<div className={ classnames( className, 'woocommerce-segmented-selection__container' ) }>
2018-05-17 04:44:58 +00:00
{ options.map( ( { value, label } ) => {
if ( ! value || ! label ) {
return null;
}
const id = uniqueId( `${ value }_` );
return (
<div className="woocommerce-segmented-selection__item" key={ value }>
{ /* eslint-disable jsx-a11y/label-has-for */ }
2018-05-17 04:44:58 +00:00
<input
className="woocommerce-segmented-selection__input"
2018-05-17 04:44:58 +00:00
type="radio"
name={ name }
id={ id }
checked={ selected === value }
2018-05-28 10:55:19 +00:00
onChange={ partial( onSelect, { [ name ]: value } ) }
2018-05-17 04:44:58 +00:00
/>
<label htmlFor={ id }>
<span className="woocommerce-segmented-selection__label">{ label }</span>
2018-05-17 04:44:58 +00:00
</label>
{ /* eslint-enable jsx-a11y/label-has-for */ }
</div>
2018-05-17 04:44:58 +00:00
);
} ) }
</div>
</fieldset>
);
}
}
SegmentedSelection.propTypes = {
/**
* Additional CSS classes.
*/
2018-05-17 04:44:58 +00:00
className: PropTypes.string,
/**
* An Array of options to render. The array needs to be composed of objects with properties `label` and `value`.
*/
2018-05-17 04:44:58 +00:00
options: PropTypes.arrayOf(
PropTypes.shape( {
value: PropTypes.string.isRequired,
label: PropTypes.string.isRequired,
} )
).isRequired,
/**
* Value of selected item.
*/
2018-05-17 04:44:58 +00:00
selected: PropTypes.string,
/**
* Callback to be executed after selection
*/
2018-05-17 04:44:58 +00:00
onSelect: PropTypes.func.isRequired,
/**
* This will be the key in the key and value arguments supplied to `onSelect`.
*/
2018-05-17 04:44:58 +00:00
name: PropTypes.string.isRequired,
/**
* Create a legend visible to screen readers.
*/
2018-05-17 04:44:58 +00:00
legend: PropTypes.string.isRequired,
};
export default SegmentedSelection;