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

Global Styles: Filter out color and typography variations #60220

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { __ } from '@wordpress/i18n';
*/
import PreviewStyles from './preview-styles';
import Variation from './variations/variation';
import { isVariationWithSingleProperty } from '../../hooks/use-theme-style-variations/use-theme-style-variations-by-property';

export default function StyleVariationsContainer( { gap = 2 } ) {
const variations = useSelect( ( select ) => {
Expand All @@ -20,20 +21,28 @@ export default function StyleVariationsContainer( { gap = 2 } ) {
).__experimentalGetCurrentThemeGlobalStylesVariations();
}, [] );

// Filter out variations that are of single property type, i.e. color or typography variations.
const multiplePropertyVariations = variations?.filter( ( variation ) => {
return (
! isVariationWithSingleProperty( variation, 'color' ) &&
! isVariationWithSingleProperty( variation, 'typography' )
);
} );

const withEmptyVariation = useMemo( () => {
return [
{
title: __( 'Default' ),
settings: {},
styles: {},
},
...( variations ?? [] ).map( ( variation ) => ( {
...( multiplePropertyVariations ?? [] ).map( ( variation ) => ( {
...variation,
settings: variation.settings ?? {},
styles: variation.styles ?? {},
} ) ),
];
}, [ variations ] );
}, [ multiplePropertyVariations ] );

return (
<Grid
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,22 +153,53 @@ export default function useThemeStyleVariationsByProperty( {
? cloneDeep( baseVariation )
: null;

let processedStyleVariations = variations.map( ( variation ) => {
let result = {
...filterObjectByProperty( cloneDeep( variation ), property ),
title: variation?.title,
description: variation?.description,
};

if ( clonedBaseVariation ) {
/*
* Overwrites all baseVariation object `styleProperty` properties
* with the theme variation `styleProperty` properties.
*/
result = mergeBaseAndUserConfigs( clonedBaseVariation, result );
}
return result;
} );
let processedStyleVariations = variations.reduce(
( accumulator, variation ) => {
const variationFilteredByProperty = filterObjectByProperty(
cloneDeep( variation ),
property
);
// Remove variations that are empty once the property is filtered out.
if ( Object.keys( variationFilteredByProperty ).length === 0 ) {
return accumulator;
}

let result = {
...variationFilteredByProperty,
title: variation?.title,
description: variation?.description,
};

if ( clonedBaseVariation ) {
/*
* Overwrites all baseVariation object `styleProperty` properties
* with the theme variation `styleProperty` properties.
*/
result = mergeBaseAndUserConfigs(
clonedBaseVariation,
result
);
}

// Detect if this is a duplicate variation.
const isDuplicate = accumulator.some( ( item ) => {
return (
JSON.stringify( item.styles ) ===
JSON.stringify( result?.styles ) &&
JSON.stringify( item.settings ) ===
JSON.stringify( result?.settings )
);
} );
if ( isDuplicate ) {
return accumulator;
}

// If the variation is not a duplicate, add it to the accumulator.
accumulator.push( result );
return accumulator;
},
[] // Initial accumulator value.
);

if ( 'function' === typeof filter ) {
processedStyleVariations =
Expand All @@ -178,3 +209,25 @@ export default function useThemeStyleVariationsByProperty( {
return processedStyleVariations;
}, [ variations, property, baseVariation, filter ] );
}

/**
* Compares a style variation to the same variation filtered by a single property.
* Returns true if the variation contains only the property specified.
*
* @param {Object} variation The variation to compare.
* @param {string} property The property to compare.
* @return {boolean} Whether the variation contains only a single property.
*/
export function isVariationWithSingleProperty( variation, property ) {
const variationWithProperty = filterObjectByProperty(
scruffian marked this conversation as resolved.
Show resolved Hide resolved
cloneDeep( variation ),
property
);

return (
JSON.stringify( variationWithProperty?.styles ) ===
JSON.stringify( variation?.styles ) &&
JSON.stringify( variationWithProperty?.settings ) ===
JSON.stringify( variation?.settings )
);
}
Loading