/** * Internal dependencies */ import { extractResourceNameFromRoute, getRouteIds, simplifyRouteWithId, } from '../utils'; describe( 'extractResourceNameFromRoute', () => { it.each` namespace | route | expected ${ 'wc/blocks' } | ${ 'wc/blocks/products' } | ${ 'products' } ${ 'wc/other' } | ${ 'wc/blocks/product' } | ${ 'wc/blocks/product' } ${ 'wc/blocks' } | ${ 'wc/blocks/products/attributes/(?P[\\d]+)' } | ${ 'products/attributes' } ${ 'wc/blocks' } | ${ 'wc/blocks/products/attributes/(?P[\\d]+)/terms' } | ${ 'products/attributes/terms' } ${ 'wc/blocks' } | ${ 'wc/blocks/products/attributes/(?P[\\d]+)/terms/(?P[d]+)' } | ${ 'products/attributes/terms' } `( 'returns "$expected" when namespace is "$namespace" and route is "$route"', ( { namespace, route, expected } ) => { expect( extractResourceNameFromRoute( namespace, route ) ).toBe( expected ); } ); } ); describe( 'getRouteIds', () => { it.each` route | expected ${ 'wc/blocks/products' } | ${ [] } ${ 'wc/blocks/products/(?P[\\d]+)' } | ${ [ 'id' ] } ${ 'wc/blocks/products/attributes/(?P[\\d]+)/terms/(?P[\\d]+)' } | ${ [ 'attribute_id', 'id' ] } `( 'returns "$expected" when route is "$route"', ( { route, expected } ) => { expect( getRouteIds( route ) ).toEqual( expected ); } ); } ); describe( 'simplifyRouteWithId', () => { it.each` route | matchIds | expected ${ 'wc/blocks/products' } | ${ [] } | ${ 'wc/blocks/products' } ${ 'wc/blocks/products/attributes/(?P[\\d]+)' } | ${ [ 'attribute_id' ] } | ${ 'wc/blocks/products/attributes/{attribute_id}' } ${ 'wc/blocks/products/attributes/(?P[\\d]+)/terms' } | ${ [ 'attribute_id' ] } | ${ 'wc/blocks/products/attributes/{attribute_id}/terms' } ${ 'wc/blocks/products/attributes/(?P[\\d]+)/terms/(?P[\\d]+)' } | ${ [ 'attribute_id', 'id' ] } | ${ 'wc/blocks/products/attributes/{attribute_id}/terms/{id}' } ${ 'wc/blocks/products/attributes/(?P[\\d]+)/terms/(?P[\\d]+)' } | ${ [ 'id', 'attribute_id' ] } | ${ 'wc/blocks/products/attributes/{attribute_id}/terms/{id}' } `( 'returns "$expected" when route is "$route" and matchIds is "$matchIds"', ( { route, matchIds, expected } ) => { expect( simplifyRouteWithId( route, matchIds ) ).toBe( expected ); } ); } ); /** * External dependencies */ import { has } from 'lodash'; /** * Utility for returning whether the given path exists in the state. * * @param {Object} state The state being checked * @param {Array} path The path to check * * @return {boolean} True means this exists in the state. */ export default function hasInState( state, path ) { return has( state, path ); } export { default as hasInState } from './has-in-state'; export { default as updateState } from './update-state'; /** * External dependencies */ import { setWith, clone } from 'lodash'; /** * Utility for updating state and only cloning objects in the path that changed. * * @param {Object} state The state being updated * @param {Array} path The path being updated * @param {*} value The value to update for the path * * @return {Object} The new state */ export default function updateState( state, path, value ) { return setWith( clone( state ), path, value, clone ); } // Ensure textarea bg color is transparent for block titles. // Some themes (e.g. Twenty Twenty) set a non-white background for the editor, and Gutenberg sets white background for text inputs, creating this issue. // https://github.com/woocommerce/woocommerce-gutenberg-products-block/issues/1204 .wc-block-editor-components-title { background-color: transparent; } /** * External dependencies */ import PropTypes from 'prop-types'; import { PlainText } from '@wordpress/block-editor'; import classnames from 'classnames'; import { withInstanceId } from '@wordpress/compose'; import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ import './editor.scss'; const BlockTitle = ( { className, headingLevel, onChange, heading, instanceId, } ) => { const TagName = `h${ headingLevel }`; return ( </TagName> ); }; BlockTitle.propTypes = { /** * Classname to add to title in addition to the defaults. */ className: PropTypes.string, /** * The value of the heading. */ value: PropTypes.string, /** * Callback to update the attribute when text is changed. */ onChange: PropTypes.func, /** * Level of the heading tag (1, 2, 3... will render <h1>, <h2>, <h3>... elements). */ headingLevel: PropTypes.number, }; export default withInstanceId( BlockTitle ); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������