diff --git a/packages/block-library/src/form/index.js b/packages/block-library/src/form/index.js index b700e0ade6ca7f..7c9d1ea7e27f84 100644 --- a/packages/block-library/src/form/index.js +++ b/packages/block-library/src/form/index.js @@ -7,6 +7,11 @@ import metadata from './block.json'; import save from './save'; import variations from './variations'; +/** + * WordPress dependencies + */ +import { addFilter } from '@wordpress/hooks'; + const { name } = metadata; export { metadata, name }; @@ -18,3 +23,31 @@ export const settings = { }; export const init = () => initBlock( { name, metadata, settings } ); + +// Prevent adding forms inside forms. +const DISALLOWED_PARENTS = [ 'core/form' ]; +addFilter( + 'blockEditor.__unstableCanInsertBlockType', + 'removeTemplatePartsFromPostTemplates', + ( + canInsert, + blockType, + rootClientId, + { getBlock, getBlockParentsByBlockName } + ) => { + if ( blockType.name !== 'core/form' ) { + return canInsert; + } + + for ( const disallowedParentType of DISALLOWED_PARENTS ) { + const hasDisallowedParent = + getBlock( rootClientId )?.name === disallowedParentType || + getBlockParentsByBlockName( rootClientId, disallowedParentType ) + .length; + if ( hasDisallowedParent ) { + return false; + } + } + return true; + } +);