Add "grid" and "list" view switch for Product Collection (https://github.com/woocommerce/woocommerce-blocks/pull/10145)

* Add Display Layout controls to Product Collection

* Adjust the layout type name

* Add explicit display layout types

* Change the function name to setDisplayLayout so it's more explicit

* Pass only the necessary props to nested inspector controls

---------

Co-authored-by: Manish Menaria <the.manish.menaria@gmail.com>
This commit is contained in:
Karol Manijak 2023-07-10 13:39:09 +02:00 committed by GitHub
parent 708ed47a85
commit fd378be6eb
3 changed files with 56 additions and 2 deletions

View File

@ -0,0 +1,47 @@
/**
* External dependencies
*/
import { __ } from '@wordpress/i18n';
import { ToolbarGroup } from '@wordpress/components';
import { list, grid } from '@wordpress/icons';
/**
* Internal dependencies
*/
import { ProductCollectionDisplayLayout } from '../types';
type DisplayLayoutObject = {
displayLayout: ProductCollectionDisplayLayout;
};
type DisplayLayoutControlProps = DisplayLayoutObject & {
setAttributes: ( attrs: DisplayLayoutObject ) => void;
};
const DisplayLayoutControl = ( props: DisplayLayoutControlProps ) => {
const { type, columns } = props.displayLayout;
const setDisplayLayout = (
displayLayout: ProductCollectionDisplayLayout
) => {
props.setAttributes( { displayLayout } );
};
const displayLayoutControls = [
{
icon: list,
title: __( 'List view', 'woo-gutenberg-products-block' ),
onClick: () => setDisplayLayout( { type: 'list', columns } ),
isActive: type === 'list',
},
{
icon: grid,
title: __( 'Grid view', 'woo-gutenberg-products-block' ),
onClick: () => setDisplayLayout( { type: 'flex', columns } ),
isActive: type === 'flex',
},
];
return <ToolbarGroup controls={ displayLayoutControls } />;
};
export default DisplayLayoutControl;

View File

@ -2,7 +2,7 @@
* External dependencies * External dependencies
*/ */
import type { BlockEditProps } from '@wordpress/blocks'; import type { BlockEditProps } from '@wordpress/blocks';
import { InspectorControls } from '@wordpress/block-editor'; import { InspectorControls, BlockControls } from '@wordpress/block-editor';
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { useMemo } from '@wordpress/element'; import { useMemo } from '@wordpress/element';
import { ProductCollectionFeedbackPrompt } from '@woocommerce/editor-components/feedback-prompt'; import { ProductCollectionFeedbackPrompt } from '@woocommerce/editor-components/feedback-prompt';
@ -28,6 +28,7 @@ import AttributesControl from './attributes-control';
import TaxonomyControls from './taxonomy-controls'; import TaxonomyControls from './taxonomy-controls';
import HandPickedProductsControl from './hand-picked-products-control'; import HandPickedProductsControl from './hand-picked-products-control';
import AuthorControl from './author-control'; import AuthorControl from './author-control';
import DisplayLayoutControl from './display-layout-control';
const ProductCollectionInspectorControls = ( const ProductCollectionInspectorControls = (
props: BlockEditProps< ProductCollectionAttributes > props: BlockEditProps< ProductCollectionAttributes >
@ -43,6 +44,12 @@ const ProductCollectionInspectorControls = (
return ( return (
<InspectorControls> <InspectorControls>
<BlockControls>
<DisplayLayoutControl
displayLayout={ props.attributes.displayLayout }
setAttributes={ props.setAttributes }
/>
</BlockControls>
<ToolsPanel <ToolsPanel
label={ __( 'Settings', 'woo-gutenberg-products-block' ) } label={ __( 'Settings', 'woo-gutenberg-products-block' ) }
resetAll={ () => { resetAll={ () => {

View File

@ -17,7 +17,7 @@ export interface ProductCollectionAttributes {
} }
export interface ProductCollectionDisplayLayout { export interface ProductCollectionDisplayLayout {
type: string; type: 'flex' | 'list';
columns: number; columns: number;
} }