From 9fa1d5f202c219fd9a350506ffb33ab188a0ce4e Mon Sep 17 00:00:00 2001 From: Jeff Stieler Date: Tue, 18 Dec 2018 10:33:31 -0700 Subject: [PATCH] Render descriptive screen reader text for SearchFilter and SelectFilter components. --- .../src/filters/advanced/number-filter.js | 6 +++- .../src/filters/advanced/search-filter.js | 28 +++++++++++---- .../src/filters/advanced/select-filter.js | 34 +++++++++++++++---- 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/packages/components/src/filters/advanced/number-filter.js b/packages/components/src/filters/advanced/number-filter.js index 89b69e43dee..28e8e6fd6ac 100644 --- a/packages/components/src/filters/advanced/number-filter.js +++ b/packages/components/src/filters/advanced/number-filter.js @@ -13,9 +13,13 @@ import { sprintf, __, _x } from '@wordpress/i18n'; * Internal dependencies */ import TextControlWithAffixes from '../../text-control-with-affixes'; -import { formatCurrency } from '@woocommerce/currency'; import { textContent } from './utils'; +/** + * WooCommerce dependencies + */ +import { formatCurrency } from '@woocommerce/currency'; + class NumberFilter extends Component { getBetweenString() { return _x( diff --git a/packages/components/src/filters/advanced/search-filter.js b/packages/components/src/filters/advanced/search-filter.js index ee848be86e1..80e83906c98 100644 --- a/packages/components/src/filters/advanced/search-filter.js +++ b/packages/components/src/filters/advanced/search-filter.js @@ -2,7 +2,7 @@ /** * External dependencies */ -import { Component } from '@wordpress/element'; +import { Component, Fragment } from '@wordpress/element'; import { SelectControl } from '@wordpress/components'; import { find, partial } from 'lodash'; import PropTypes from 'prop-types'; @@ -13,6 +13,7 @@ import classnames from 'classnames'; * Internal dependencies */ import Search from '../../search'; +import { textContent } from './utils'; class SearchFilter extends Component { constructor( { filter, config, query } ) { @@ -42,18 +43,23 @@ class SearchFilter extends Component { onFilterChange( filter.key, 'value', idList ); } - getLegend( filter, config ) { + getScreenReaderText( filter, config ) { const { selected } = this.state; + + if ( 0 === selected.length ) { + return ''; + } + const rule = find( config.rules, { value: filter.rule } ) || {}; const filterStr = selected.map( item => item.label ).join( ', ' ); - return interpolateComponents( { + return textContent( interpolateComponents( { mixedString: config.labels.title, components: { - filter: { filterStr }, - rule: { rule.label }, + filter: { filterStr }, + rule: { rule.label }, }, - } ); + } ) ); } render() { @@ -86,11 +92,14 @@ class SearchFilter extends Component { ), }, } ); + + const screenReaderText = this.getScreenReaderText( filter, config ); + /*eslint-disable jsx-a11y/no-noninteractive-tabindex*/ return (
- { this.getLegend( filter, config, selected ) } + { labels.add || '' }
{ children }
+ { screenReaderText && ( + + { screenReaderText } + + ) }
); /*eslint-enable jsx-a11y/no-noninteractive-tabindex*/ diff --git a/packages/components/src/filters/advanced/select-filter.js b/packages/components/src/filters/advanced/select-filter.js index 9fd68cdc9d3..b967e6daf97 100644 --- a/packages/components/src/filters/advanced/select-filter.js +++ b/packages/components/src/filters/advanced/select-filter.js @@ -2,13 +2,18 @@ /** * External dependencies */ -import { Component } from '@wordpress/element'; +import { Component, Fragment } from '@wordpress/element'; import { SelectControl, Spinner } from '@wordpress/components'; import { find, partial } from 'lodash'; import PropTypes from 'prop-types'; import interpolateComponents from 'interpolate-components'; import classnames from 'classnames'; +/** + * Internal dependencies + */ +import { textContent } from './utils'; + /** * WooCommerce dependencies */ @@ -41,16 +46,21 @@ class SelectFilter extends Component { return options; } - getLegend( filter, config ) { + getScreenReaderText( filter, config ) { + if ( '' === filter.value ) { + return ''; + } + const rule = find( config.rules, { value: filter.rule } ) || {}; const value = find( config.input.options, { value: filter.value } ) || {}; - return interpolateComponents( { + + return textContent( interpolateComponents( { mixedString: config.labels.title, components: { - filter: { value.label }, - rule: { rule.label }, + filter: { value.label }, + rule: { rule.label }, }, - } ); + } ) ); } render() { @@ -83,10 +93,15 @@ class SelectFilter extends Component { ), }, } ); + + const screenReaderText = this.getScreenReaderText( filter, config ); + /*eslint-disable jsx-a11y/no-noninteractive-tabindex*/ return (
- { this.getLegend( filter, config ) } + + { labels.add || '' } +
{ children }
+ { screenReaderText && ( + + { screenReaderText } + + ) }
); /*eslint-enable jsx-a11y/no-noninteractive-tabindex*/