From aa1c300197603778d7a78b1ff84529ec59a04c71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Juh=C3=A9=20Lluveras?= Date: Fri, 23 Aug 2019 14:59:48 +0200 Subject: [PATCH 1/9] Create Label and OrderSelect components --- assets/js/base/components/label/index.js | 61 +++++++++++++ .../label/test/__snapshots__/index.js.snap | 62 ++++++++++++++ assets/js/base/components/label/test/index.js | 85 +++++++++++++++++++ .../base/components/load-more-button/index.js | 18 ++-- .../js/base/components/order-select/index.js | 58 +++++++++++++ .../style.scss | 4 +- .../components/review-order-select/index.js | 47 ++++------ package.json | 1 + 8 files changed, 290 insertions(+), 46 deletions(-) create mode 100644 assets/js/base/components/label/index.js create mode 100644 assets/js/base/components/label/test/__snapshots__/index.js.snap create mode 100644 assets/js/base/components/label/test/index.js create mode 100644 assets/js/base/components/order-select/index.js rename assets/js/base/components/{review-order-select => order-select}/style.scss (63%) diff --git a/assets/js/base/components/label/index.js b/assets/js/base/components/label/index.js new file mode 100644 index 00000000000..dcf6ad69d68 --- /dev/null +++ b/assets/js/base/components/label/index.js @@ -0,0 +1,61 @@ +/** + * External dependencies + */ +import PropTypes from 'prop-types'; +import elementType from 'prop-types-elementtype'; +import { Fragment } from 'react'; +import classNames from 'classnames'; + +const Label = ( { label, screenReaderLabel, wrapperElement: Wrapper, wrapperProps } ) => { + if ( label && screenReaderLabel && label !== screenReaderLabel ) { + return ( + + + { label } + + + { screenReaderLabel } + + + ); + } + + if ( ! label && screenReaderLabel ) { + if ( typeof Wrapper === 'symbol' && Symbol.keyFor( Wrapper ) === 'react.fragment' ) { + Wrapper = 'span'; + } + wrapperProps = { + ...wrapperProps, + className: classNames( wrapperProps.className, 'screen-reader-text' ), + }; + + return ( + + { screenReaderLabel } + + ); + } + + return ( + + { label } + + ); +}; + +Label.propTypes = { + label: PropTypes.string, + screenReaderLabel: PropTypes.string, + wrapperElement: PropTypes.oneOfType( [ + PropTypes.string, + elementType, + ] ), + wrapperProps: PropTypes.object, +}; + +Label.defaultProps = { + wrapperElement: Fragment, + wrapperProps: {}, +}; + +export default Label; diff --git a/assets/js/base/components/label/test/__snapshots__/index.js.snap b/assets/js/base/components/label/test/__snapshots__/index.js.snap new file mode 100644 index 00000000000..30bdb1fe5da --- /dev/null +++ b/assets/js/base/components/label/test/__snapshots__/index.js.snap @@ -0,0 +1,62 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Label with wrapperElement should render both label and screen reader label 1`] = ` + +`; + +exports[`Label with wrapperElement should render only the label 1`] = ` + +`; + +exports[`Label with wrapperElement should render only the scree reader label 1`] = ` + +`; + +exports[`Label without wrapperElement should render both label and screen reader label 1`] = ` +Array [ + + Lorem + , + + Ipsum + , +] +`; + +exports[`Label without wrapperElement should render only the label 1`] = `"Lorem"`; + +exports[`Label without wrapperElement should render only the scree reader label 1`] = ` + + Ipsum + +`; diff --git a/assets/js/base/components/label/test/index.js b/assets/js/base/components/label/test/index.js new file mode 100644 index 00000000000..bd573d051d8 --- /dev/null +++ b/assets/js/base/components/label/test/index.js @@ -0,0 +1,85 @@ +/** + * External dependencies + */ +import TestRenderer from 'react-test-renderer'; + +/** + * Internal dependencies + */ +import Label from '../'; + +describe( 'Label', () => { + describe( 'without wrapperElement', () => { + test( 'should render both label and screen reader label', () => { + const component = TestRenderer.create( +