/** * Internal dependencies */ import getParentBlock from '../../../gutenberg/utils/get-parent-block'; /** * WordPress dependencies */ const { __ } = wp.i18n; const { Component, Fragment, } = wp.element; const { addFilter, } = wp.hooks; const { Notice, Button, } = wp.components; const { createHigherOrderComponent, compose, } = wp.compose; const { withSelect, } = wp.data; /** * Hide Query Settings if Group block override it. * * @param {JSX} sectionFields - section fields. * @param {Object} props - block props. * * @returns {JSX} - section fields. */ function hidePostsQuery( sectionFields, { sectionName, props } ) { const { blockProps, } = props; if ( ! blockProps || ! blockProps.name || 'canvas/posts' !== blockProps.name || sectionName !== 'query' ) { return sectionFields; } const { getBlockHierarchyRootClientId, getBlockParents, getBlock, } = wp.data.select('core/block-editor'); const { selectBlock, } = wp.data.dispatch('core/block-editor'); const rootBlock = getBlock( getBlockHierarchyRootClientId( blockProps.clientId ) ); const parentBlocks = getBlockParents(blockProps.clientId); let groupQueryBlock = false; // Trying to find parent Posts Group block. if ( rootBlock && (undefined === typeof rootBlock.attributes.ref || ! rootBlock.attributes.ref) && parentBlocks ) { parentBlocks.forEach((parentID) => { let parentBlock = getBlock( parentID ); if ( ! groupQueryBlock ) { groupQueryBlock = 'core/group' === parentBlock.name && parentBlock.attributes.canvasPostsQuery ? parentBlock : false; } }); } if ( groupQueryBlock ) { return ( { __( 'This post block is located inside the "Group" block with enabled global Query settings. Please, change these settings in the parent "Group" block.', 'canvas' ) } ); } return sectionFields; } /** * Control the `group_query` attribute in Posts blocks. * * @param {function|Component} BlockEdit Original component. * * @return {string} Wrapped component. */ const withGroupAttribute = createHigherOrderComponent( ( OriginalComponent ) => { class CanvasPostsQueryGroupController extends Component { constructor() { super( ...arguments ); this.update = this.update.bind( this ); } componentDidMount() { this.update(); } componentDidUpdate() { this.update(); } update() { const { name, groupQueryBlock, attributes, setAttributes, } = this.props; if ( 'canvas/posts' !== name ) { return; } if ( groupQueryBlock ) { if ( groupQueryBlock.attributes.canvasClassName && groupQueryBlock.attributes.canvasClassName !== attributes.queryGroup ) { setAttributes( { queryGroup: groupQueryBlock.attributes.canvasClassName, } ); } } else if ( attributes.queryGroup ) { setAttributes( { queryGroup: '', } ); } } render() { return ; } } return compose( withSelect((select, ownProps) => { if ( 'canvas/posts' !== ownProps.name ) { return {}; } const { getBlockHierarchyRootClientId, getBlockParents, getBlock, } = select('core/block-editor'); const rootBlock = getBlock( getBlockHierarchyRootClientId( ownProps.clientId ) ); const parentBlocks = getBlockParents(ownProps.clientId); let groupQueryBlock = false; // Trying to find parent Posts Group block. if ( rootBlock && (undefined === typeof rootBlock.attributes.ref || ! rootBlock.attributes.ref) && parentBlocks ) { parentBlocks.forEach((parentID) => { let parentBlock = getBlock( parentID ); if ( ! groupQueryBlock ) { groupQueryBlock = 'core/group' === parentBlock.name && parentBlock.attributes.canvasPostsQuery ? parentBlock : false; } }); } return { groupQueryBlock, }; }) )(CanvasPostsQueryGroupController); }, 'withGroupAttribute' ); addFilter( 'canvas.component.fieldsRender', 'canvas/group-block-posts-query/hide-posts-query', hidePostsQuery ); addFilter( 'editor.BlockEdit', 'canvas/group-block-posts-query/additional-attributes', withGroupAttribute );