From 8080ff5e9f8c8913dc899d28648f743dbbf706aa Mon Sep 17 00:00:00 2001 From: Andrei Draganescu Date: Tue, 11 Jul 2023 16:25:20 +0300 Subject: [PATCH 01/11] inital attempt to bring block commands and transforms --- packages/block-editor/package.json | 1 + .../src/components/block-list/index.js | 2 + .../components/use-block-commands/index.js | 289 ++++++++++++++++++ 3 files changed, 292 insertions(+) create mode 100644 packages/block-editor/src/components/use-block-commands/index.js diff --git a/packages/block-editor/package.json b/packages/block-editor/package.json index 0f982a3119da6..69dcb602dad1c 100644 --- a/packages/block-editor/package.json +++ b/packages/block-editor/package.json @@ -39,6 +39,7 @@ "@wordpress/api-fetch": "file:../api-fetch", "@wordpress/blob": "file:../blob", "@wordpress/blocks": "file:../blocks", + "@wordpress/commands": "file:../commands", "@wordpress/components": "file:../components", "@wordpress/compose": "file:../compose", "@wordpress/data": "file:../data", diff --git a/packages/block-editor/src/components/block-list/index.js b/packages/block-editor/src/components/block-list/index.js index 04b767d9568b7..47961fa698c84 100644 --- a/packages/block-editor/src/components/block-list/index.js +++ b/packages/block-editor/src/components/block-list/index.js @@ -39,6 +39,7 @@ import { BlockEditContextProvider, DEFAULT_BLOCK_EDIT_CONTEXT, } from '../block-edit/context'; +import { useBlockCommands } from '../use-block-commands'; const elementContext = createContext(); @@ -46,6 +47,7 @@ export const IntersectionObserver = createContext(); const pendingBlockVisibilityUpdatesPerRegistry = new WeakMap(); function Root( { className, ...settings } ) { + useBlockCommands(); const [ element, setElement ] = useState(); const isLargeViewport = useViewportMatch( 'medium' ); const { isOutlineMode, isFocusMode, editorMode } = useSelect( diff --git a/packages/block-editor/src/components/use-block-commands/index.js b/packages/block-editor/src/components/use-block-commands/index.js new file mode 100644 index 0000000000000..80c40277c6b2f --- /dev/null +++ b/packages/block-editor/src/components/use-block-commands/index.js @@ -0,0 +1,289 @@ +/** + * WordPress dependencies + */ +import { __, sprintf } from '@wordpress/i18n'; +import { + hasBlockSupport, + store as blocksStore, + switchToBlockType, + isTemplatePart, +} from '@wordpress/blocks'; +import { useSelect, useDispatch } from '@wordpress/data'; +import { useCommandLoader } from '@wordpress/commands'; +import { copy } from '@wordpress/icons'; + +/** + * Internal dependencies + */ +import { store as blockEditorStore } from '../../store'; +import { useNotifyCopy } from '../copy-handler'; +import usePasteStyles from '../use-paste-styles'; + +export const useTransformCommands = () => { + const { clientIds } = useSelect( ( select ) => { + const { getSelectedBlockClientIds } = select( blockEditorStore ); + const selectedBlockClientIds = getSelectedBlockClientIds(); + + return { + clientIds: selectedBlockClientIds, + }; + }, [] ); + const blocks = useSelect( + ( select ) => + select( blockEditorStore ).getBlocksByClientId( clientIds ), + [ clientIds ] + ); + const { replaceBlocks, multiSelect } = useDispatch( blockEditorStore ); + const { possibleBlockTransformations, canRemove } = useSelect( + ( select ) => { + const { + getBlockRootClientId, + getBlockTransformItems, + __experimentalGetPatternTransformItems, + canRemoveBlocks, + } = select( blockEditorStore ); + const rootClientId = getBlockRootClientId( + Array.isArray( clientIds ) ? clientIds[ 0 ] : clientIds + ); + return { + possibleBlockTransformations: getBlockTransformItems( + blocks, + rootClientId + ), + canRemove: canRemoveBlocks( clientIds, rootClientId ), + patterns: __experimentalGetPatternTransformItems( + blocks, + rootClientId + ), + }; + }, + [ clientIds, blocks ] + ); + + const isTemplate = blocks.length === 1 && isTemplatePart( blocks[ 0 ] ); + + function selectForMultipleBlocks( insertedBlocks ) { + if ( insertedBlocks.length > 1 ) { + multiSelect( + insertedBlocks[ 0 ].clientId, + insertedBlocks[ insertedBlocks.length - 1 ].clientId + ); + } + } + + // Simple block tranformation based on the `Block Transforms` API. + function onBlockTransform( name ) { + const newBlocks = switchToBlockType( blocks, name ); + replaceBlocks( clientIds, newBlocks ); + selectForMultipleBlocks( newBlocks ); + } + + /** + * The `isTemplate` check is a stopgap solution here. + * Ideally, the Transforms API should handle this + * by allowing to exclude blocks from wildcard transformations. + */ + const hasPossibleBlockTransformations = + !! possibleBlockTransformations.length && canRemove && ! isTemplate; + + if ( ! hasPossibleBlockTransformations ) { + return { isLoading: false, commands: [] }; + } + + const commands = possibleBlockTransformations.map( ( transformation ) => { + const { name, title, icon } = transformation; + return { + name: 'core/block-editor/transform-to-' + name, + // translators: %s: block title/name. + label: sprintf( __( 'Transform to %s' ), title ), + icon: icon.src, + callback: ( { close } ) => { + onBlockTransform( name ); + close(); + }, + }; + } ); + + return { isLoading: false, commands }; +}; + +const useActionsCommands = () => { + const { clientIds } = useSelect( ( select ) => { + const { getSelectedBlockClientIds } = select( blockEditorStore ); + const selectedBlockClientIds = getSelectedBlockClientIds(); + + return { + clientIds: selectedBlockClientIds, + }; + }, [] ); + const { + canInsertBlockType, + getBlockRootClientId, + getBlocksByClientId, + canMoveBlocks, + canRemoveBlocks, + } = useSelect( blockEditorStore ); + const { getDefaultBlockName, getGroupingBlockName } = + useSelect( blocksStore ); + + const blocks = getBlocksByClientId( clientIds ); + const rootClientId = getBlockRootClientId( clientIds[ 0 ] ); + + const canCopyStyles = blocks.every( ( block ) => { + return ( + !! block && + ( hasBlockSupport( block.name, 'color' ) || + hasBlockSupport( block.name, 'typography' ) ) + ); + } ); + + const canDuplicate = blocks.every( ( block ) => { + return ( + !! block && + hasBlockSupport( block.name, 'multiple', true ) && + canInsertBlockType( block.name, rootClientId ) + ); + } ); + + const canInsertDefaultBlock = canInsertBlockType( + getDefaultBlockName(), + rootClientId + ); + + const canMove = canMoveBlocks( clientIds, rootClientId ); + const canRemove = canRemoveBlocks( clientIds, rootClientId ); + + const { + removeBlocks, + replaceBlocks, + duplicateBlocks, + insertAfterBlock, + insertBeforeBlock, + flashBlock, + setBlockMovingClientId, + setNavigationMode, + selectBlock, + } = useDispatch( blockEditorStore ); + + const notifyCopy = useNotifyCopy(); + const pasteStyles = usePasteStyles(); + + const onDuplicate = () => { + if ( ! canDuplicate ) { + return; + } + return duplicateBlocks( clientIds, true ); + }; + const onRemove = () => { + if ( ! canRemove ) { + return; + } + return removeBlocks( clientIds, true ); + }; + const onInsertBefore = () => { + if ( ! canInsertDefaultBlock ) { + return; + } + const clientId = Array.isArray( clientIds ) ? clientIds[ 0 ] : clientId; + insertBeforeBlock( clientId ); + }; + const onInsertAfter = () => { + if ( ! canInsertDefaultBlock ) { + return; + } + const clientId = Array.isArray( clientIds ) + ? clientIds[ clientIds.length - 1 ] + : clientId; + insertAfterBlock( clientId ); + }; + const onMoveTo = () => { + if ( ! canMove ) { + return; + } + setNavigationMode( true ); + selectBlock( clientIds[ 0 ] ); + setBlockMovingClientId( clientIds[ 0 ] ); + }; + const onGroup = () => { + if ( ! blocks.length ) { + return; + } + + const groupingBlockName = getGroupingBlockName(); + + // Activate the `transform` on `core/group` which does the conversion. + const newBlocks = switchToBlockType( blocks, groupingBlockName ); + + if ( ! newBlocks ) { + return; + } + replaceBlocks( clientIds, newBlocks ); + }; + const onUngroup = () => { + if ( ! blocks.length ) { + return; + } + + const innerBlocks = blocks[ 0 ].innerBlocks; + + if ( ! innerBlocks.length ) { + return; + } + + replaceBlocks( clientIds, innerBlocks ); + }; + const onCopy = () => { + const selectedBlockClientIds = blocks.map( + ( { clientId } ) => clientId + ); + if ( blocks.length === 1 ) { + flashBlock( selectedBlockClientIds[ 0 ] ); + } + notifyCopy( 'copy', selectedBlockClientIds ); + }; + const onPasteStyles = async () => { + if ( ! canCopyStyles ) { + return; + } + await pasteStyles( blocks ); + }; + + const commands = [ + onPasteStyles, + onCopy, + onUngroup, + onGroup, + onMoveTo, + onInsertAfter, + onInsertBefore, + onRemove, + onDuplicate, + ].map( ( callback ) => { + const action = callback.name + .replace( 'on', '' ) + .replace( /([a-z])([A-Z])/g, '$1 $2' ); + return { + name: 'core/block-edotpr/action-' + callback.name, + // translators: %s: block title/name. + label: `${ action } block`, + icon: copy, + callback: ( { close } ) => { + callback(); + close(); + }, + }; + } ); + + return { isLoading: false, commands }; +}; + +export const useBlockCommands = () => { + useCommandLoader( { + name: 'core/block-editor/blockTransforms', + hook: useTransformCommands, + } ); + useCommandLoader( { + name: 'core/block-editor/blockActions', + hook: useActionsCommands, + } ); +}; From 5b9feb094fcc70f103c50f573e6f68fe9e92c936 Mon Sep 17 00:00:00 2001 From: Andrei Draganescu Date: Tue, 11 Jul 2023 17:03:15 +0300 Subject: [PATCH 02/11] don't register commands if no blocks are selected --- .../src/components/use-block-commands/index.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/block-editor/src/components/use-block-commands/index.js b/packages/block-editor/src/components/use-block-commands/index.js index 80c40277c6b2f..c7ddf9597df80 100644 --- a/packages/block-editor/src/components/use-block-commands/index.js +++ b/packages/block-editor/src/components/use-block-commands/index.js @@ -86,7 +86,11 @@ export const useTransformCommands = () => { const hasPossibleBlockTransformations = !! possibleBlockTransformations.length && canRemove && ! isTemplate; - if ( ! hasPossibleBlockTransformations ) { + if ( + ! clientIds || + clientIds.length < 1 || + ! hasPossibleBlockTransformations + ) { return { isLoading: false, commands: [] }; } @@ -248,6 +252,10 @@ const useActionsCommands = () => { await pasteStyles( blocks ); }; + if ( ! clientIds || clientIds.length < 1 ) { + return { isLoading: false, commands: [] }; + } + const commands = [ onPasteStyles, onCopy, From 58dcc5e84f5d10e0eaf7b19f1e641210782eed51 Mon Sep 17 00:00:00 2001 From: Andrei Draganescu Date: Wed, 12 Jul 2023 12:15:51 +0300 Subject: [PATCH 03/11] move to top level editor components --- packages/block-editor/README.md | 4 ++++ packages/block-editor/src/components/block-list/index.js | 2 -- packages/block-editor/src/components/index.js | 6 ++++++ packages/edit-post/src/components/layout/index.js | 2 ++ packages/edit-site/src/components/layout/index.js | 6 +++++- 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/block-editor/README.md b/packages/block-editor/README.md index 30e0cc9f422e3..37ac43512bc38 100644 --- a/packages/block-editor/README.md +++ b/packages/block-editor/README.md @@ -789,6 +789,10 @@ _Related_ - +### useBlockCommands + +Undocumented declaration. + ### useBlockDisplayInformation Hook used to try to find a matching block variation and return the appropriate information for display reasons. In order to to try to find a match we need to things: 1. Block's client id to extract it's current attributes. 2. A block variation should have set `isActive` prop to a proper function. diff --git a/packages/block-editor/src/components/block-list/index.js b/packages/block-editor/src/components/block-list/index.js index 47961fa698c84..04b767d9568b7 100644 --- a/packages/block-editor/src/components/block-list/index.js +++ b/packages/block-editor/src/components/block-list/index.js @@ -39,7 +39,6 @@ import { BlockEditContextProvider, DEFAULT_BLOCK_EDIT_CONTEXT, } from '../block-edit/context'; -import { useBlockCommands } from '../use-block-commands'; const elementContext = createContext(); @@ -47,7 +46,6 @@ export const IntersectionObserver = createContext(); const pendingBlockVisibilityUpdatesPerRegistry = new WeakMap(); function Root( { className, ...settings } ) { - useBlockCommands(); const [ element, setElement ] = useState(); const isLargeViewport = useViewportMatch( 'medium' ); const { isOutlineMode, isFocusMode, editorMode } = useSelect( diff --git a/packages/block-editor/src/components/index.js b/packages/block-editor/src/components/index.js index 6a4b5d8b98088..7e46698e2b61b 100644 --- a/packages/block-editor/src/components/index.js +++ b/packages/block-editor/src/components/index.js @@ -166,3 +166,9 @@ export { useBlockEditingMode } from './block-editing-mode'; export { default as BlockEditorProvider } from './provider'; export { default as useSetting } from './use-setting'; +export { useBlockCommands } from './use-block-commands'; + +/* + * The following rename hint component can be removed in 6.4. + */ +export { default as ReusableBlocksRenameHint } from './inserter/reusable-block-rename-hint'; diff --git a/packages/edit-post/src/components/layout/index.js b/packages/edit-post/src/components/layout/index.js index e3000ae77b863..eb7a245d96a79 100644 --- a/packages/edit-post/src/components/layout/index.js +++ b/packages/edit-post/src/components/layout/index.js @@ -19,6 +19,7 @@ import { } from '@wordpress/editor'; import { useSelect, useDispatch } from '@wordpress/data'; import { + useBlockCommands, BlockBreadcrumb, privateApis as blockEditorPrivateApis, } from '@wordpress/block-editor'; @@ -72,6 +73,7 @@ const interfaceLabels = { }; function Layout() { + useBlockCommands(); const isMobileViewport = useViewportMatch( 'medium', '<' ); const isHugeViewport = useViewportMatch( 'huge', '>=' ); const isLargeViewport = useViewportMatch( 'large' ); diff --git a/packages/edit-site/src/components/layout/index.js b/packages/edit-site/src/components/layout/index.js index 54ac50a02165a..80950d130a0a1 100644 --- a/packages/edit-site/src/components/layout/index.js +++ b/packages/edit-site/src/components/layout/index.js @@ -26,7 +26,10 @@ import { privateApis as commandsPrivateApis, } from '@wordpress/commands'; import { store as preferencesStore } from '@wordpress/preferences'; -import { privateApis as blockEditorPrivateApis } from '@wordpress/block-editor'; +import { + privateApis as blockEditorPrivateApis, + useBlockCommands, +} from '@wordpress/block-editor'; import { privateApis as routerPrivateApis } from '@wordpress/router'; import { privateApis as coreCommandsPrivateApis } from '@wordpress/core-commands'; @@ -66,6 +69,7 @@ export default function Layout() { useCommands(); useEditModeCommands(); useCommonCommands(); + useBlockCommands(); const hubRef = useRef(); const { params } = useLocation(); From 6f1659fac72bbbdc9753d04b0a30b568aae2e670 Mon Sep 17 00:00:00 2001 From: Andrei Draganescu Date: Wed, 12 Jul 2023 14:15:40 +0300 Subject: [PATCH 04/11] cleanup copy pasta from the block editor components --- .../src/components/use-block-commands/index.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/packages/block-editor/src/components/use-block-commands/index.js b/packages/block-editor/src/components/use-block-commands/index.js index c7ddf9597df80..8deb4e56439fd 100644 --- a/packages/block-editor/src/components/use-block-commands/index.js +++ b/packages/block-editor/src/components/use-block-commands/index.js @@ -39,7 +39,6 @@ export const useTransformCommands = () => { const { getBlockRootClientId, getBlockTransformItems, - __experimentalGetPatternTransformItems, canRemoveBlocks, } = select( blockEditorStore ); const rootClientId = getBlockRootClientId( @@ -51,10 +50,6 @@ export const useTransformCommands = () => { rootClientId ), canRemove: canRemoveBlocks( clientIds, rootClientId ), - patterns: __experimentalGetPatternTransformItems( - blocks, - rootClientId - ), }; }, [ clientIds, blocks ] @@ -97,7 +92,7 @@ export const useTransformCommands = () => { const commands = possibleBlockTransformations.map( ( transformation ) => { const { name, title, icon } = transformation; return { - name: 'core/block-editor/transform-to-' + name, + name: 'core/block-editor/transform-to-' + name.replace( '/', '-' ), // translators: %s: block title/name. label: sprintf( __( 'Transform to %s' ), title ), icon: icon.src, @@ -271,9 +266,9 @@ const useActionsCommands = () => { .replace( 'on', '' ) .replace( /([a-z])([A-Z])/g, '$1 $2' ); return { - name: 'core/block-edotpr/action-' + callback.name, - // translators: %s: block title/name. - label: `${ action } block`, + name: 'core/block-editor/action-' + callback.name, + // translators: %s: type of the command. + label: sprintf( __( `%s block` ), action ), icon: copy, callback: ( { close } ) => { callback(); From f0608ce4466d0e9e44d762ef1118144ccdfb2109 Mon Sep 17 00:00:00 2001 From: Andrei Draganescu Date: Thu, 13 Jul 2023 16:54:25 +0300 Subject: [PATCH 05/11] fix rebase artefact --- packages/edit-post/src/components/layout/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/edit-post/src/components/layout/index.js b/packages/edit-post/src/components/layout/index.js index eb7a245d96a79..cded0553fca92 100644 --- a/packages/edit-post/src/components/layout/index.js +++ b/packages/edit-post/src/components/layout/index.js @@ -18,11 +18,15 @@ import { store as editorStore, } from '@wordpress/editor'; import { useSelect, useDispatch } from '@wordpress/data'; +<<<<<<< HEAD import { useBlockCommands, BlockBreadcrumb, privateApis as blockEditorPrivateApis, } from '@wordpress/block-editor'; +======= +import { useBlockCommands, BlockBreadcrumb } from '@wordpress/block-editor'; +>>>>>>> 710181758b (fix rebase artefact) import { Button, ScrollLock, Popover } from '@wordpress/components'; import { useViewportMatch } from '@wordpress/compose'; import { PluginArea } from '@wordpress/plugins'; From df3a0f1d311fb4754ac651916aedce988d3aa1c7 Mon Sep 17 00:00:00 2001 From: Andrei Draganescu Date: Tue, 8 Aug 2023 06:43:24 +0300 Subject: [PATCH 06/11] update icons to match the action, remove 'block' suffix for command names, use add instead of insert --- packages/block-editor/README.md | 4 ++ .../components/use-block-commands/index.js | 39 +++++++++++++++---- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/packages/block-editor/README.md b/packages/block-editor/README.md index 37ac43512bc38..e4653791f999a 100644 --- a/packages/block-editor/README.md +++ b/packages/block-editor/README.md @@ -680,6 +680,10 @@ _Related_ Private @wordpress/block-editor APIs. +### ReusableBlocksRenameHint + +Undocumented declaration. + ### RichText _Related_ diff --git a/packages/block-editor/src/components/use-block-commands/index.js b/packages/block-editor/src/components/use-block-commands/index.js index 8deb4e56439fd..949f1527e3fb3 100644 --- a/packages/block-editor/src/components/use-block-commands/index.js +++ b/packages/block-editor/src/components/use-block-commands/index.js @@ -10,7 +10,14 @@ import { } from '@wordpress/blocks'; import { useSelect, useDispatch } from '@wordpress/data'; import { useCommandLoader } from '@wordpress/commands'; -import { copy } from '@wordpress/icons'; +import { + copy, + edit as remove, + create as add, + group, + ungroup, + moveTo as move, +} from '@wordpress/icons'; /** * Internal dependencies @@ -179,14 +186,14 @@ const useActionsCommands = () => { } return removeBlocks( clientIds, true ); }; - const onInsertBefore = () => { + const onAddBefore = () => { if ( ! canInsertDefaultBlock ) { return; } const clientId = Array.isArray( clientIds ) ? clientIds[ 0 ] : clientId; insertBeforeBlock( clientId ); }; - const onInsertAfter = () => { + const onAddAfter = () => { if ( ! canInsertDefaultBlock ) { return; } @@ -251,25 +258,43 @@ const useActionsCommands = () => { return { isLoading: false, commands: [] }; } + const icons = { + paste: copy, + copy, + ungroup, + group, + move, + add, + remove, + duplicate: copy, + }; + const commands = [ onPasteStyles, onCopy, onUngroup, onGroup, onMoveTo, - onInsertAfter, - onInsertBefore, + onAddAfter, + onAddBefore, onRemove, onDuplicate, ].map( ( callback ) => { const action = callback.name .replace( 'on', '' ) .replace( /([a-z])([A-Z])/g, '$1 $2' ); + return { name: 'core/block-editor/action-' + callback.name, // translators: %s: type of the command. - label: sprintf( __( `%s block` ), action ), - icon: copy, + label: action, + icon: icons[ + callback.name + .replace( 'on', '' ) + .match( /[A-Z]{1}[a-z]*/ ) + .toString() + .toLowerCase() + ], callback: ( { close } ) => { callback(); close(); From 093f9e484629ff52fd482eba57aaeeb2ec6ebcec Mon Sep 17 00:00:00 2001 From: Andrei Draganescu Date: Tue, 8 Aug 2023 07:07:07 +0300 Subject: [PATCH 07/11] remove conflict marker --- packages/edit-post/src/components/layout/index.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/edit-post/src/components/layout/index.js b/packages/edit-post/src/components/layout/index.js index cded0553fca92..eb7a245d96a79 100644 --- a/packages/edit-post/src/components/layout/index.js +++ b/packages/edit-post/src/components/layout/index.js @@ -18,15 +18,11 @@ import { store as editorStore, } from '@wordpress/editor'; import { useSelect, useDispatch } from '@wordpress/data'; -<<<<<<< HEAD import { useBlockCommands, BlockBreadcrumb, privateApis as blockEditorPrivateApis, } from '@wordpress/block-editor'; -======= -import { useBlockCommands, BlockBreadcrumb } from '@wordpress/block-editor'; ->>>>>>> 710181758b (fix rebase artefact) import { Button, ScrollLock, Popover } from '@wordpress/components'; import { useViewportMatch } from '@wordpress/compose'; import { PluginArea } from '@wordpress/plugins'; From 568502b470f73be25a02fb8231c49321f12483f8 Mon Sep 17 00:00:00 2001 From: Andrei Draganescu Date: Fri, 11 Aug 2023 14:15:23 +0300 Subject: [PATCH 08/11] packages update --- package-lock.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package-lock.json b/package-lock.json index 11a42c2e047a3..32b6636a8ec71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54532,6 +54532,7 @@ "@wordpress/api-fetch": "file:../api-fetch", "@wordpress/blob": "file:../blob", "@wordpress/blocks": "file:../blocks", + "@wordpress/commands": "file:../commands", "@wordpress/components": "file:../components", "@wordpress/compose": "file:../compose", "@wordpress/data": "file:../data", @@ -67221,6 +67222,7 @@ "@wordpress/api-fetch": "file:../api-fetch", "@wordpress/blob": "file:../blob", "@wordpress/blocks": "file:../blocks", + "@wordpress/commands": "file:../commands", "@wordpress/components": "file:../components", "@wordpress/compose": "file:../compose", "@wordpress/data": "file:../data", From 6662c28b7d0dd313bce60576d5eb5844363e5cc9 Mon Sep 17 00:00:00 2001 From: scruffian Date: Fri, 11 Aug 2023 16:13:54 +0100 Subject: [PATCH 09/11] fix copy command --- package-lock.json | 18 ++++++++++-------- packages/block-editor/package.json | 1 + .../src/components/use-block-commands/index.js | 7 +++++++ packages/compose/package.json | 2 +- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 32b6636a8ec71..e05699d5ce92a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24704,9 +24704,9 @@ "dev": true }, "node_modules/clipboard": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", - "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", "dependencies": { "good-listener": "^1.2.2", "select": "^1.1.2", @@ -54560,6 +54560,7 @@ "@wordpress/wordcount": "file:../wordcount", "change-case": "^4.1.2", "classnames": "^2.3.1", + "clipboard": "2.0.11", "colord": "^2.7.0", "deepmerge": "^4.3.0", "diff": "^4.0.2", @@ -54824,7 +54825,7 @@ "@wordpress/keycodes": "file:../keycodes", "@wordpress/priority-queue": "file:../priority-queue", "change-case": "^4.1.2", - "clipboard": "^2.0.8", + "clipboard": "^2.0.11", "mousetrap": "^1.6.5", "use-memo-one": "^1.1.1" }, @@ -67250,6 +67251,7 @@ "@wordpress/wordcount": "file:../wordcount", "change-case": "^4.1.2", "classnames": "^2.3.1", + "clipboard": "2.0.11", "colord": "^2.7.0", "deepmerge": "^4.3.0", "diff": "^4.0.2", @@ -67454,7 +67456,7 @@ "@wordpress/keycodes": "file:../keycodes", "@wordpress/priority-queue": "file:../priority-queue", "change-case": "^4.1.2", - "clipboard": "^2.0.8", + "clipboard": "^2.0.11", "mousetrap": "^1.6.5", "use-memo-one": "^1.1.1" } @@ -77342,9 +77344,9 @@ "dev": true }, "clipboard": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", - "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", "requires": { "good-listener": "^1.2.2", "select": "^1.1.2", diff --git a/packages/block-editor/package.json b/packages/block-editor/package.json index 69dcb602dad1c..6bc6baf1c3a62 100644 --- a/packages/block-editor/package.json +++ b/packages/block-editor/package.json @@ -67,6 +67,7 @@ "@wordpress/wordcount": "file:../wordcount", "change-case": "^4.1.2", "classnames": "^2.3.1", + "clipboard": "2.0.11", "colord": "^2.7.0", "deepmerge": "^4.3.0", "diff": "^4.0.2", diff --git a/packages/block-editor/src/components/use-block-commands/index.js b/packages/block-editor/src/components/use-block-commands/index.js index 949f1527e3fb3..8e70ea572ff7e 100644 --- a/packages/block-editor/src/components/use-block-commands/index.js +++ b/packages/block-editor/src/components/use-block-commands/index.js @@ -1,3 +1,8 @@ +/** + * External dependencies + */ +import Clipboard from 'clipboard'; + /** * WordPress dependencies */ @@ -5,6 +10,7 @@ import { __, sprintf } from '@wordpress/i18n'; import { hasBlockSupport, store as blocksStore, + serialize, switchToBlockType, isTemplatePart, } from '@wordpress/blocks'; @@ -239,6 +245,7 @@ const useActionsCommands = () => { replaceBlocks( clientIds, innerBlocks ); }; const onCopy = () => { + Clipboard.copy( serialize( blocks ) ); const selectedBlockClientIds = blocks.map( ( { clientId } ) => clientId ); diff --git a/packages/compose/package.json b/packages/compose/package.json index 625afc1ecb9fc..162c7a9533975 100644 --- a/packages/compose/package.json +++ b/packages/compose/package.json @@ -38,7 +38,7 @@ "@wordpress/keycodes": "file:../keycodes", "@wordpress/priority-queue": "file:../priority-queue", "change-case": "^4.1.2", - "clipboard": "^2.0.8", + "clipboard": "^2.0.11", "mousetrap": "^1.6.5", "use-memo-one": "^1.1.1" }, From f924b9d1ae34c5155759a0bedfc896e99a4b985a Mon Sep 17 00:00:00 2001 From: Andrei Draganescu Date: Mon, 14 Aug 2023 15:05:56 +0300 Subject: [PATCH 10/11] Revert "fix copy command" This reverts commit e6d70b232ac4fda45133cf50ae8ee6d0996cef44. --- package-lock.json | 18 ++++++++---------- packages/block-editor/package.json | 1 - .../src/components/use-block-commands/index.js | 7 ------- packages/compose/package.json | 2 +- 4 files changed, 9 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index e05699d5ce92a..32b6636a8ec71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24704,9 +24704,9 @@ "dev": true }, "node_modules/clipboard": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", - "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", + "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", "dependencies": { "good-listener": "^1.2.2", "select": "^1.1.2", @@ -54560,7 +54560,6 @@ "@wordpress/wordcount": "file:../wordcount", "change-case": "^4.1.2", "classnames": "^2.3.1", - "clipboard": "2.0.11", "colord": "^2.7.0", "deepmerge": "^4.3.0", "diff": "^4.0.2", @@ -54825,7 +54824,7 @@ "@wordpress/keycodes": "file:../keycodes", "@wordpress/priority-queue": "file:../priority-queue", "change-case": "^4.1.2", - "clipboard": "^2.0.11", + "clipboard": "^2.0.8", "mousetrap": "^1.6.5", "use-memo-one": "^1.1.1" }, @@ -67251,7 +67250,6 @@ "@wordpress/wordcount": "file:../wordcount", "change-case": "^4.1.2", "classnames": "^2.3.1", - "clipboard": "2.0.11", "colord": "^2.7.0", "deepmerge": "^4.3.0", "diff": "^4.0.2", @@ -67456,7 +67454,7 @@ "@wordpress/keycodes": "file:../keycodes", "@wordpress/priority-queue": "file:../priority-queue", "change-case": "^4.1.2", - "clipboard": "^2.0.11", + "clipboard": "^2.0.8", "mousetrap": "^1.6.5", "use-memo-one": "^1.1.1" } @@ -77344,9 +77342,9 @@ "dev": true }, "clipboard": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", - "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", + "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", "requires": { "good-listener": "^1.2.2", "select": "^1.1.2", diff --git a/packages/block-editor/package.json b/packages/block-editor/package.json index 6bc6baf1c3a62..69dcb602dad1c 100644 --- a/packages/block-editor/package.json +++ b/packages/block-editor/package.json @@ -67,7 +67,6 @@ "@wordpress/wordcount": "file:../wordcount", "change-case": "^4.1.2", "classnames": "^2.3.1", - "clipboard": "2.0.11", "colord": "^2.7.0", "deepmerge": "^4.3.0", "diff": "^4.0.2", diff --git a/packages/block-editor/src/components/use-block-commands/index.js b/packages/block-editor/src/components/use-block-commands/index.js index 8e70ea572ff7e..949f1527e3fb3 100644 --- a/packages/block-editor/src/components/use-block-commands/index.js +++ b/packages/block-editor/src/components/use-block-commands/index.js @@ -1,8 +1,3 @@ -/** - * External dependencies - */ -import Clipboard from 'clipboard'; - /** * WordPress dependencies */ @@ -10,7 +5,6 @@ import { __, sprintf } from '@wordpress/i18n'; import { hasBlockSupport, store as blocksStore, - serialize, switchToBlockType, isTemplatePart, } from '@wordpress/blocks'; @@ -245,7 +239,6 @@ const useActionsCommands = () => { replaceBlocks( clientIds, innerBlocks ); }; const onCopy = () => { - Clipboard.copy( serialize( blocks ) ); const selectedBlockClientIds = blocks.map( ( { clientId } ) => clientId ); diff --git a/packages/compose/package.json b/packages/compose/package.json index 162c7a9533975..625afc1ecb9fc 100644 --- a/packages/compose/package.json +++ b/packages/compose/package.json @@ -38,7 +38,7 @@ "@wordpress/keycodes": "file:../keycodes", "@wordpress/priority-queue": "file:../priority-queue", "change-case": "^4.1.2", - "clipboard": "^2.0.11", + "clipboard": "^2.0.8", "mousetrap": "^1.6.5", "use-memo-one": "^1.1.1" }, From 7a2ad93d3ebf31031fff99b34f3f717bed838084 Mon Sep 17 00:00:00 2001 From: Andrei Draganescu Date: Mon, 14 Aug 2023 15:11:23 +0300 Subject: [PATCH 11/11] remove copy and paste styles actions --- .../components/use-block-commands/index.js | 33 ------------------- 1 file changed, 33 deletions(-) diff --git a/packages/block-editor/src/components/use-block-commands/index.js b/packages/block-editor/src/components/use-block-commands/index.js index 949f1527e3fb3..bb7b7d97c3190 100644 --- a/packages/block-editor/src/components/use-block-commands/index.js +++ b/packages/block-editor/src/components/use-block-commands/index.js @@ -23,8 +23,6 @@ import { * Internal dependencies */ import { store as blockEditorStore } from '../../store'; -import { useNotifyCopy } from '../copy-handler'; -import usePasteStyles from '../use-paste-styles'; export const useTransformCommands = () => { const { clientIds } = useSelect( ( select ) => { @@ -135,14 +133,6 @@ const useActionsCommands = () => { const blocks = getBlocksByClientId( clientIds ); const rootClientId = getBlockRootClientId( clientIds[ 0 ] ); - const canCopyStyles = blocks.every( ( block ) => { - return ( - !! block && - ( hasBlockSupport( block.name, 'color' ) || - hasBlockSupport( block.name, 'typography' ) ) - ); - } ); - const canDuplicate = blocks.every( ( block ) => { return ( !! block && @@ -165,15 +155,11 @@ const useActionsCommands = () => { duplicateBlocks, insertAfterBlock, insertBeforeBlock, - flashBlock, setBlockMovingClientId, setNavigationMode, selectBlock, } = useDispatch( blockEditorStore ); - const notifyCopy = useNotifyCopy(); - const pasteStyles = usePasteStyles(); - const onDuplicate = () => { if ( ! canDuplicate ) { return; @@ -238,29 +224,12 @@ const useActionsCommands = () => { replaceBlocks( clientIds, innerBlocks ); }; - const onCopy = () => { - const selectedBlockClientIds = blocks.map( - ( { clientId } ) => clientId - ); - if ( blocks.length === 1 ) { - flashBlock( selectedBlockClientIds[ 0 ] ); - } - notifyCopy( 'copy', selectedBlockClientIds ); - }; - const onPasteStyles = async () => { - if ( ! canCopyStyles ) { - return; - } - await pasteStyles( blocks ); - }; if ( ! clientIds || clientIds.length < 1 ) { return { isLoading: false, commands: [] }; } const icons = { - paste: copy, - copy, ungroup, group, move, @@ -270,8 +239,6 @@ const useActionsCommands = () => { }; const commands = [ - onPasteStyles, - onCopy, onUngroup, onGroup, onMoveTo,