8889841cPK½E[ëÑÑcCC block.jsonnu„[µü¤{ "name": "woocommerce/product-best-sellers", "title": "Best Selling Products", "category": "woocommerce", "keywords": [ "WooCommerce" ], "description": "Display a grid of your all-time best selling products.", "supports": { "align": [ "wide", "full" ], "html": false }, "attributes": { "columns": { "type": "number", "default": 3 }, "rows": { "type": "number", "default": 3 }, "alignButtons": { "type": "boolean", "default": false }, "contentVisibility": { "type": "object", "default": { "image": true, "title": true, "price": true, "rating": true, "button": true }, "properties": { "image": { "type": "boolean", "default": true }, "title": { "type": "boolean", "default": true }, "price": { "type": "boolean", "default": true }, "rating": { "type": "boolean", "default": true }, "button": { "type": "boolean", "default": true } } }, "categories": { "type": "array", "default": [] }, "catOperator": { "type": "string", "default": "any" }, "isPreview": { "type": "boolean", "default": false }, "stockStatus": { "type": "array" }, "editMode": { "type": "boolean", "default": true }, "orderby": { "type": "string", "enum": [ "date", "popularity", "price_asc", "price_desc", "rating", "title", "menu_order" ], "default": "popularity" } }, "textdomain": "woocommerce", "apiVersion": 2, "$schema": "https://schemas.wp.org/trunk/block.json" } PK½E[­ ͘˜edit.tsxnu„[µü¤/** * External dependencies */ import { useBlockProps } from '@wordpress/block-editor'; /** * Internal dependencies */ import { ProductBestSellersBlock } from './block'; import { Props } from './types'; export const Edit = ( props: unknown & Props ): JSX.Element => { const blockProps = useBlockProps(); return (
); }; PK½E[‹Ñ'ººtypes.tsnu„[µü¤interface Attributes { columns: number; rows: number; alignButtons: boolean; contentVisibility: { image: boolean; title: boolean; price: boolean; rating: boolean; button: boolean; }; categories: Array< number >; catOperator: string; isPreview: boolean; stockStatus: Array< string >; editMode: boolean; orderby: | 'date' | 'popularity' | 'price_asc' | 'price_desc' | 'rating' | 'title' | 'menu_order'; } export interface Props { /** * The attributes for this block */ attributes: Attributes; /** * The register block name. */ name: string; /** * A callback to update attributes */ setAttributes: ( attributes: Partial< Attributes > ) => void; } PK½E[ ‡°g**inspector-controls.tsxnu„[µü¤/** * External dependencies */ import { InspectorControls } from '@wordpress/block-editor'; import { PanelBody } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; import GridLayoutControl from '@woocommerce/editor-components/grid-layout-control'; import { getSetting } from '@woocommerce/settings'; import GridContentControl from '@woocommerce/editor-components/grid-content-control'; import ProductCategoryControl from '@woocommerce/editor-components/product-category-control'; /** * Internal dependencies */ import { Props } from './types'; export const ProductBestSellersInspectorControls = ( props: Props ): JSX.Element => { const { attributes, setAttributes } = props; const { categories, catOperator, columns, contentVisibility, rows, alignButtons, } = attributes; return ( setAttributes( { contentVisibility: value } ) } /> { const ids = value.map( ( { id } ) => id ); setAttributes( { categories: ids } ); } } operator={ catOperator } onOperatorChange={ ( value = 'any' ) => setAttributes( { catOperator: value } ) } /> ); }; PK½E[Hö‰ÿÿ index.tsxnu„[µü¤/** * External dependencies */ import { Icon, trendingUp } from '@wordpress/icons'; import { createBlock, registerBlockType } from '@wordpress/blocks'; /** * Internal dependencies */ import metadata from './block.json'; import { Edit } from './edit'; import sharedAttributes, { sharedAttributeBlockTypes, } from '../../utils/shared-attributes'; registerBlockType( metadata, { icon: { src: ( ), }, attributes: { ...sharedAttributes, ...metadata.attributes, }, transforms: { from: [ { type: 'block', blocks: sharedAttributeBlockTypes.filter( ( value ) => value !== 'woocommerce/product-best-sellers' ), transform: ( attributes ) => createBlock( 'woocommerce/product-best-sellers', attributes ), }, ], }, /** * Renders and manages the block. * * @param {Object} props Props to pass to block. */ edit: Edit, save: () => { return null; }, } ); PK½E[¹QÆõõ block.tsxnu„[µü¤/** * External dependencies */ import { Disabled } from '@wordpress/components'; import ServerSideRender from '@wordpress/server-side-render'; import { gridBlockPreview } from '@woocommerce/resource-previews'; /** * Internal dependencies */ import { Props } from './types'; import { ProductBestSellersInspectorControls } from './inspector-controls'; export const ProductBestSellersBlock = ( props: Props ): JSX.Element => { const { attributes, name } = props; if ( attributes.isPreview ) { return gridBlockPreview; } return (
); }; PK½E[ëÑÑcCC block.jsonnu„[µü¤PK½E[­ ͘˜}edit.tsxnu„[µü¤PK½E[‹Ñ'ººMtypes.tsnu„[µü¤PK½E[ ‡°g**? inspector-controls.tsxnu„[µü¤PK½E[Hö‰ÿÿ ¯index.tsxnu„[µü¤PK½E[¹QÆõõ çblock.tsxnu„[µü¤PKÂ