Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update AdvancedFilters to use createInterpolateElement instead of interpolateComponents #37967

Merged
merged 29 commits into from Apr 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
1c81f32
DateFilter: switch to createInterpolateElement
mattsherman Apr 21, 2023
6de388a
Update DateFilter story
mattsherman Apr 21, 2023
e17358a
SearchFilter: switch to createInterpolateElement
mattsherman Apr 21, 2023
b36ae32
UpdateSearchFilter story
mattsherman Apr 21, 2023
7d90e49
Update DateFilter test
mattsherman Apr 21, 2023
a4e1888
Update SearchFilter test
mattsherman Apr 21, 2023
6111eaf
Update DateFilter usage
mattsherman Apr 21, 2023
af59332
Update SearchFilter usage
mattsherman Apr 21, 2023
2018cae
NumberFilter: switch to createInterpolateElement
mattsherman Apr 24, 2023
422e5d1
Update NumberFilter story
mattsherman Apr 24, 2023
6f29574
Update NumberFilter test
mattsherman Apr 24, 2023
6dc2444
Fix ReportFilters story
mattsherman Apr 24, 2023
711e14a
Fix NumberFilter.getBetweenString
mattsherman Apr 24, 2023
ed1e6ff
Update NumberFilter usage
mattsherman Apr 24, 2023
317f18a
SelectFilter: switch to createInterpolateElement
mattsherman Apr 24, 2023
f0fb919
Fix SelectFilter story
mattsherman Apr 24, 2023
2aedbee
Update SelectFilter test
mattsherman Apr 24, 2023
7447f5d
Fix ReportFilters story
mattsherman Apr 24, 2023
68c8273
Update SelectFilter usage
mattsherman Apr 24, 2023
8fa141a
Fix ReportFilters story - advanced search, products
mattsherman Apr 24, 2023
6530005
AttributeFilter: switch to createInterpolateElement
mattsherman Apr 24, 2023
6c4c79c
AdvancedFilters: switch to createInterpolateElement
mattsherman Apr 24, 2023
2c41d43
Fix AdvancedFilters test
mattsherman Apr 24, 2023
c66c19a
Fix AdvancedFilters and ReportFilters stories
mattsherman Apr 24, 2023
e6de41c
Update AdvancedFilters usage
mattsherman Apr 24, 2023
f6758aa
Update AdvancedFilters README
mattsherman Apr 24, 2023
0533514
Changelog
mattsherman Apr 24, 2023
f818b60
Changelog
mattsherman Apr 24, 2023
6efa264
Update AttributeFilter usage
mattsherman Apr 25, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -0,0 +1,4 @@
Significance: major
Type: update

Updated AdvancedFilter to use createInterpolateElement instead of interpolateComponents.
9 changes: 3 additions & 6 deletions packages/js/components/src/advanced-filters/README.md
Expand Up @@ -4,14 +4,14 @@ Displays a configurable set of filters which can modify query parameters. Displa

## Usage

Below is a config example complete with translation strings. Advanced filters makes use of [interpolateComponents](https://github.com/Automattic/interpolate-components#readme) to organize sentence structure, resulting in a filter visually represented as a sentence fragment in any language.
Below is a config example complete with translation strings. Advanced filters makes use of [createInterpolateElement](https://developer.wordpress.org/block-editor/reference-guides/packages/packages-element/#createinterpolateelement) to organize sentence structure, resulting in a filter visually represented as a sentence fragment in any language.

```js
const config = {
title: __(
// A sentence describing filters for Orders
// See screen shot for context: https://cloudup.com/cSsUY9VeCVJ
'Orders Match {{select /}} Filters',
'Orders Match <select/> Filters',
'woocommerce'
),
filters: {
Expand All @@ -25,10 +25,7 @@ const config = {
),
// A sentence describing an Order Status filter
// See screen shot for context: https://cloudup.com/cSsUY9VeCVJ
title: __(
'Order Status {{rule /}} {{filter /}}',
'woocommerce'
),
title: __( 'Order Status <rule/> <filter/>', 'woocommerce' ),
filter: __( 'Select an order status', 'woocommerce' ),
},
rules: [
Expand Down
233 changes: 111 additions & 122 deletions packages/js/components/src/advanced-filters/attribute-filter.js
Expand Up @@ -3,10 +3,10 @@
*/
import PropTypes from 'prop-types';
import { SelectControl as Select, Spinner } from '@wordpress/components';
import interpolateComponents from '@automattic/interpolate-components';
import classnames from 'classnames';
import {
createElement,
createInterpolateElement,
Fragment,
useEffect,
useState,
Expand Down Expand Up @@ -54,28 +54,22 @@ const getScreenReaderText = ( {
return '';
}

const filterStr = interpolateComponents( {
const filterStr = createInterpolateElement(
/* eslint-disable-next-line max-len */
/* translators: Sentence fragment describing a product attribute match. Example: "Color Is Not Blue" - attribute = Color, equals = Is Not, value = Blue */
mixedString: __(
'{{attribute /}} {{equals /}} {{value /}}',
'woocommerce'
),
components: {
__( '<attribute/> <equals/> <value/>', 'woocommerce' ),
{
attribute: <Fragment>{ attributeName }</Fragment>,
equals: <Fragment>{ rule.label }</Fragment>,
value: <Fragment>{ attributeTerm }</Fragment>,
},
} );
}
);

return textContent(
interpolateComponents( {
mixedString: config.labels.title,
components: {
filter: <Fragment>{ filterStr }</Fragment>,
rule: <Fragment />,
title: <Fragment />,
},
createInterpolateElement( config.labels.title, {
filter: <Fragment>{ filterStr }</Fragment>,
rule: <Fragment />,
title: <Fragment />,
} )
);
};
Expand Down Expand Up @@ -154,114 +148,109 @@ const AttributeFilter = ( props ) => {
}
) }
>
{ interpolateComponents( {
mixedString: labels.title,
components: {
title: <span className={ className } />,
rule: (
<Select
className={ classnames(
className,
'woocommerce-filters-advanced__rule'
) }
options={ rules }
value={ rule }
onChange={ ( selectedValue ) =>
onFilterChange( {
property: 'rule',
value: selectedValue,
} )
}
aria-label={ labels.rule }
/>
),
filter: (
<div
className={ classnames(
className,
'woocommerce-filters-advanced__attribute-fieldset'
) }
>
{ ! Array.isArray( value ) ||
! value.length ||
selectedAttribute.length ? (
<Search
className="woocommerce-filters-advanced__input woocommerce-search"
onChange={ ( [ attr ] ) => {
setSelectedAttribute(
attr ? [ attr ] : []
);
setSelectedAttributeTerm( '' );
onFilterChange( {
property: 'value',
value: [
attr && attr.key,
].filter( Boolean ),
} );
} }
type="attributes"
placeholder={ __(
'Attribute name',
'woocommerce'
) }
multiple={ false }
selected={ selectedAttribute }
inlineTags
aria-label={ __(
'Attribute name',
'woocommerce'
) }
/>
{ createInterpolateElement( labels.title, {
title: <span className={ className } />,
rule: (
<Select
className={ classnames(
className,
'woocommerce-filters-advanced__rule'
) }
options={ rules }
value={ rule }
onChange={ ( selectedValue ) =>
onFilterChange( {
property: 'rule',
value: selectedValue,
} )
}
aria-label={ labels.rule }
/>
),
filter: (
<div
className={ classnames(
className,
'woocommerce-filters-advanced__attribute-fieldset'
) }
>
{ ! Array.isArray( value ) ||
! value.length ||
selectedAttribute.length ? (
<Search
className="woocommerce-filters-advanced__input woocommerce-search"
onChange={ ( [ attr ] ) => {
setSelectedAttribute(
attr ? [ attr ] : []
);
setSelectedAttributeTerm( '' );
onFilterChange( {
property: 'value',
value: [ attr && attr.key ].filter(
Boolean
),
} );
} }
type="attributes"
placeholder={ __(
'Attribute name',
'woocommerce'
) }
multiple={ false }
selected={ selectedAttribute }
inlineTags
aria-label={ __(
'Attribute name',
'woocommerce'
) }
/>
) : (
<Spinner />
) }
{ selectedAttribute.length > 0 &&
( attributeTerms.length ? (
<Fragment>
<span className="woocommerce-filters-advanced__attribute-field-separator">
=
</span>
<SelectControl
className="woocommerce-filters-advanced__input woocommerce-search"
placeholder={ __(
'Attribute value',
'woocommerce'
) }
inlineTags
isSearchable
multiple={ false }
showAllOnFocus
options={ attributeTerms }
selected={ selectedAttributeTerm }
onChange={ ( term ) => {
// Clearing the input using delete/backspace causes an empty array to be passed here.
if (
typeof term !== 'string'
) {
term = '';
}
setSelectedAttributeTerm(
term
);
onFilterChange( {
property: 'value',
value: [
selectedAttribute[ 0 ]
.key,
term,
].filter( Boolean ),
} );
} }
/>
</Fragment>
) : (
<Spinner />
) }
{ selectedAttribute.length > 0 &&
( attributeTerms.length ? (
<Fragment>
<span className="woocommerce-filters-advanced__attribute-field-separator">
=
</span>
<SelectControl
className="woocommerce-filters-advanced__input woocommerce-search"
placeholder={ __(
'Attribute value',
'woocommerce'
) }
inlineTags
isSearchable
multiple={ false }
showAllOnFocus
options={ attributeTerms }
selected={
selectedAttributeTerm
}
onChange={ ( term ) => {
// Clearing the input using delete/backspace causes an empty array to be passed here.
if (
typeof term !== 'string'
) {
term = '';
}
setSelectedAttributeTerm(
term
);
onFilterChange( {
property: 'value',
value: [
selectedAttribute[ 0 ]
.key,
term,
].filter( Boolean ),
} );
} }
/>
</Fragment>
) : (
<Spinner />
) ) }
</div>
),
},
) ) }
</div>
),
} ) }
</div>
{ screenReaderText && (
Expand Down