From 7f8b520ccdaa6e1549077ead18094926647c2667 Mon Sep 17 00:00:00 2001 From: Noah Allen Date: Fri, 25 Oct 2019 13:47:07 -0700 Subject: [PATCH 1/2] Add 'removal' to block supports --- .../developers/block-api/block-registration.md | 8 ++++++++ .../src/components/block-actions/index.js | 11 ++++++++++- .../block-editor/src/components/block-list/block.js | 5 ++++- .../src/components/block-settings-menu/index.js | 2 ++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/docs/designers-developers/developers/block-api/block-registration.md b/docs/designers-developers/developers/block-api/block-registration.md index 6cc028ab8c94f..a67f6abb88386 100644 --- a/docs/designers-developers/developers/block-api/block-registration.md +++ b/docs/designers-developers/developers/block-api/block-registration.md @@ -631,6 +631,14 @@ multiple: false, - `reusable` (default `true`): A block may want to disable the ability of being converted into a reusable block. By default all blocks can be converted to a reusable block. If supports reusable is set to false, the option to convert the block into a reusable block will not appear. +```js +// Use the block just once per post +removal: false, +``` + +- `removal` (default `true`): You may want to disable the user's ability to remove a block. +By default, all blocks can be removed. If supports removal is set to false, UI for removing the block will not appear. + ```js // Don't allow the block to be converted into a reusable block. reusable: false, diff --git a/packages/block-editor/src/components/block-actions/index.js b/packages/block-editor/src/components/block-actions/index.js index 82f12e6e25604..a108cddbe40b9 100644 --- a/packages/block-editor/src/components/block-actions/index.js +++ b/packages/block-editor/src/components/block-actions/index.js @@ -55,6 +55,13 @@ export default compose( [ ); } ); + const canRemove = every( blocks, ( block ) => { + return ( + !! block && + hasBlockSupport( block.name, 'removal', true ) + ); + } ); + const canInsertDefaultBlock = canInsertBlockType( getDefaultBlockName(), rootClientId @@ -63,6 +70,7 @@ export default compose( [ return { blocks, canDuplicate, + canRemove, canInsertDefaultBlock, extraProps: props, isLocked: !! getTemplateLock( rootClientId ), @@ -76,6 +84,7 @@ export default compose( [ blocks, isLocked, canDuplicate, + canRemove, } = props; const { @@ -108,7 +117,7 @@ export default compose( [ } }, onRemove() { - if ( ! isLocked ) { + if ( ! isLocked && canRemove ) { removeBlocks( clientIds ); } }, diff --git a/packages/block-editor/src/components/block-list/block.js b/packages/block-editor/src/components/block-list/block.js index 777cb54933a80..f0649d450be61 100644 --- a/packages/block-editor/src/components/block-list/block.js +++ b/packages/block-editor/src/components/block-list/block.js @@ -18,6 +18,7 @@ import { BACKSPACE, DELETE, ENTER, ESCAPE } from '@wordpress/keycodes'; import { getBlockType, getSaveElement, + hasBlockSupport, isReusableBlock, isUnmodifiedDefaultBlock, getUnregisteredTypeHandlerName, @@ -718,7 +719,9 @@ const applyWithDispatch = withDispatch( ( dispatch, ownProps, { select } ) => { insertBlocks( blocks, index + 1, rootClientId ); }, onRemove( clientId ) { - removeBlock( clientId ); + if ( hasBlockSupport( clientId, 'removal', true ) ) { + removeBlock( clientId ); + } }, onMerge( forward ) { const { clientId } = ownProps; diff --git a/packages/block-editor/src/components/block-settings-menu/index.js b/packages/block-editor/src/components/block-settings-menu/index.js index e4f7219d1a380..021039735cf72 100644 --- a/packages/block-editor/src/components/block-settings-menu/index.js +++ b/packages/block-editor/src/components/block-settings-menu/index.js @@ -45,6 +45,7 @@ export function BlockSettingsMenu( { clientIds } ) { onInsertAfter, onInsertBefore, onRemove, + canRemove, } ) => ( { ! isLocked && ( Date: Fri, 25 Oct 2019 14:40:26 -0700 Subject: [PATCH 2/2] Disable remove button if block does not support removal --- packages/block-editor/src/components/block-actions/index.js | 2 ++ packages/block-editor/src/components/block-list/block.js | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/block-editor/src/components/block-actions/index.js b/packages/block-editor/src/components/block-actions/index.js index a108cddbe40b9..4fad5d14a8bf8 100644 --- a/packages/block-editor/src/components/block-actions/index.js +++ b/packages/block-editor/src/components/block-actions/index.js @@ -13,6 +13,7 @@ import { cloneBlock, hasBlockSupport, switchToBlockType } from '@wordpress/block function BlockActions( { canDuplicate, canInsertDefaultBlock, + canRemove, children, isLocked, onDuplicate, @@ -25,6 +26,7 @@ function BlockActions( { return children( { canDuplicate, canInsertDefaultBlock, + canRemove, isLocked, onDuplicate, onGroup, diff --git a/packages/block-editor/src/components/block-list/block.js b/packages/block-editor/src/components/block-list/block.js index f0649d450be61..dc95b1dc63018 100644 --- a/packages/block-editor/src/components/block-list/block.js +++ b/packages/block-editor/src/components/block-list/block.js @@ -676,6 +676,7 @@ const applyWithSelect = withSelect( ); const applyWithDispatch = withDispatch( ( dispatch, ownProps, { select } ) => { + const { name: blockName } = ownProps; const { updateBlockAttributes, selectBlock, @@ -719,7 +720,7 @@ const applyWithDispatch = withDispatch( ( dispatch, ownProps, { select } ) => { insertBlocks( blocks, index + 1, rootClientId ); }, onRemove( clientId ) { - if ( hasBlockSupport( clientId, 'removal', true ) ) { + if ( hasBlockSupport( blockName, 'removal', true ) ) { removeBlock( clientId ); } },