From a0281e9f1b14d8f776c0fbbb038b9ca6e699b467 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Juh=C3=A9=20Lluveras?= Date: Fri, 23 Aug 2019 18:35:34 +0200 Subject: [PATCH] Create OrderSelect and Label components (#905) * Create Label and OrderSelect components * Update review list item so it uses 'classnames' * Split review order select styles from generic component * Update snapshots * Refactor Label so we don't need to check Symbol * Add description to Label and OrderSelect components * Use prop-types instead of prop-types-elementtype * Simplify Label propTypes * Update package-lock --- assets/js/base/components/label/index.js | 63 ++++++++++++++ .../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 | 63 ++++++++++++++ .../base/components/order-select/style.scss | 9 ++ .../base/components/review-list-item/index.js | 17 ++-- .../components/review-order-select/index.js | 47 ++++------ .../components/review-order-select/style.scss | 7 -- package-lock.json | 11 +-- 10 files changed, 315 insertions(+), 67 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 create mode 100644 assets/js/base/components/order-select/style.scss diff --git a/assets/js/base/components/label/index.js b/assets/js/base/components/label/index.js new file mode 100644 index 00000000000..9079b225a91 --- /dev/null +++ b/assets/js/base/components/label/index.js @@ -0,0 +1,63 @@ +/** + * External dependencies + */ +import PropTypes from 'prop-types'; +import { Fragment } from 'react'; +import classNames from 'classnames'; + +/** + * Component used to render an accessible text given a label and/or a + * screenReaderLabel. The wrapper element and wrapper props can also be + * specified via props. + */ +const Label = ( { label, screenReaderLabel, wrapperElement, wrapperProps } ) => { + let Wrapper; + + if ( ! label && screenReaderLabel ) { + Wrapper = wrapperElement || 'span'; + wrapperProps = { + ...wrapperProps, + className: classNames( wrapperProps.className, 'screen-reader-text' ), + }; + + return ( + + { screenReaderLabel } + + ); + } + + Wrapper = wrapperElement || Fragment; + + if ( label && screenReaderLabel && label !== screenReaderLabel ) { + return ( + + + { label } + + + { screenReaderLabel } + + + ); + } + + return ( + + { label } + + ); +}; + +Label.propTypes = { + label: PropTypes.string, + screenReaderLabel: PropTypes.string, + wrapperElement: PropTypes.elementType, + wrapperProps: PropTypes.object, +}; + +Label.defaultProps = { + 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..980093315ad --- /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 screen 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 screen 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( +