From eb77e48d27d16f6f82925fe4d06a76b62f33f572 Mon Sep 17 00:00:00 2001 From: Ella <4710635+ellatrix@users.noreply.github.com> Date: Mon, 9 Oct 2023 20:27:09 +0300 Subject: [PATCH] Writing flow: preserve block when merging into empty paragraph (#55134) --- .../src/components/block-list/block.js | 2 ++ .../src/components/rich-text/use-delete.js | 2 +- packages/block-editor/src/store/actions.js | 33 ++++++++++++++----- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/packages/block-editor/src/components/block-list/block.js b/packages/block-editor/src/components/block-list/block.js index 4bf9bb634dbf6..a95075c6f9b42 100644 --- a/packages/block-editor/src/components/block-list/block.js +++ b/packages/block-editor/src/components/block-list/block.js @@ -494,6 +494,8 @@ const applyWithDispatch = withDispatch( ( dispatch, ownProps, registry ) => { } moveFirstItemUp( rootClientId ); + } else { + removeBlock( clientId ); } } }, diff --git a/packages/block-editor/src/components/rich-text/use-delete.js b/packages/block-editor/src/components/rich-text/use-delete.js index f09a15265bd2b..fbf025a5d4ea4 100644 --- a/packages/block-editor/src/components/rich-text/use-delete.js +++ b/packages/block-editor/src/components/rich-text/use-delete.js @@ -43,7 +43,7 @@ export function useDelete( props ) { // an intentional user interaction distinguishing between Backspace and // Delete to remove the empty field, but also to avoid merge & remove // causing destruction of two fields (merge, then removed merged). - if ( onRemove && isEmpty( value ) && isReverse ) { + else if ( onRemove && isEmpty( value ) && isReverse ) { onRemove( ! isReverse ); } diff --git a/packages/block-editor/src/store/actions.js b/packages/block-editor/src/store/actions.js index ae4b64a645d3e..2975a41dbb9d9 100644 --- a/packages/block-editor/src/store/actions.js +++ b/packages/block-editor/src/store/actions.js @@ -13,6 +13,7 @@ import { switchToBlockType, synchronizeBlocksWithTemplate, getBlockSupport, + isUnmodifiedDefaultBlock, } from '@wordpress/blocks'; import { speak } from '@wordpress/a11y'; import { __, _n, sprintf } from '@wordpress/i18n'; @@ -1013,17 +1014,12 @@ export const mergeBlocks = if ( ! blockAType ) return; + const blockB = select.getBlock( clientIdB ); + if ( ! blockAType.merge && - ! getBlockSupport( blockA.name, '__experimentalOnMerge' ) + getBlockSupport( blockA.name, '__experimentalOnMerge' ) ) { - dispatch.selectBlock( blockA.clientId ); - return; - } - - const blockB = select.getBlock( clientIdB ); - - if ( ! blockAType.merge ) { // If there's no merge function defined, attempt merging inner // blocks. const blocksWithTheSameType = switchToBlockType( @@ -1090,6 +1086,27 @@ export const mergeBlocks = return; } + if ( isUnmodifiedDefaultBlock( blockA ) ) { + dispatch.removeBlock( + clientIdA, + select.isBlockSelected( clientIdA ) + ); + return; + } + + if ( isUnmodifiedDefaultBlock( blockB ) ) { + dispatch.removeBlock( + clientIdB, + select.isBlockSelected( clientIdB ) + ); + return; + } + + if ( ! blockAType.merge ) { + dispatch.selectBlock( blockA.clientId ); + return; + } + const blockBType = getBlockType( blockB.name ); const { clientId, attributeKey, offset } = select.getSelectionStart(); const selectedBlockType =