UNPKG

@wordpress/block-library

Version:
8 lines (7 loc) 10.9 kB
{ "version": 3, "sources": ["../../../src/navigation/edit/leaf-more-menu.js"], "sourcesContent": ["import {\n\tcreateBlock,\n\thasBlockSupport,\n\tstore as blocksStore,\n} from '@wordpress/blocks';\nimport {\n\taddSubmenu,\n\tchevronUp,\n\tchevronDown,\n\tmoreVertical,\n} from '@wordpress/icons';\nimport { DropdownMenu, MenuItem, MenuGroup } from '@wordpress/components';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { BlockTitle, store as blockEditorStore } from '@wordpress/block-editor';\nimport { DEFAULT_BLOCK } from '../constants';\n\nconst POPOVER_PROPS = {\n\tclassName: 'block-editor-block-settings-menu__popover',\n\tplacement: 'bottom-start',\n};\n\nconst BLOCKS_THAT_CAN_BE_CONVERTED_TO_SUBMENU = [\n\t'core/navigation-link',\n\t'core/navigation-submenu',\n];\n\nfunction AddSubmenuItem( {\n\tclientId,\n\tonClose,\n\tisDisabled,\n\tupdateExpansion,\n\tsetInsertedBlockClientId,\n} ) {\n\tconst { insertBlock, replaceBlock, replaceInnerBlocks } =\n\t\tuseDispatch( blockEditorStore );\n\tconst { getBlock } = useSelect( blockEditorStore );\n\n\treturn (\n\t\t<MenuItem\n\t\t\ticon={ addSubmenu }\n\t\t\tdisabled={ isDisabled }\n\t\t\tonClick={ () => {\n\t\t\t\tconst updateSelectionOnInsert = false;\n\t\t\t\tconst newLink = createBlock(\n\t\t\t\t\tDEFAULT_BLOCK.name,\n\t\t\t\t\tDEFAULT_BLOCK.attributes\n\t\t\t\t);\n\t\t\t\tconst block = getBlock( clientId );\n\n\t\t\t\tif ( block.name === 'core/navigation-submenu' ) {\n\t\t\t\t\tinsertBlock(\n\t\t\t\t\t\tnewLink,\n\t\t\t\t\t\tblock.innerBlocks.length,\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\tupdateSelectionOnInsert\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t// Convert to a submenu if the block currently isn't one.\n\t\t\t\t\tconst newSubmenu = createBlock(\n\t\t\t\t\t\t'core/navigation-submenu',\n\t\t\t\t\t\tblock.attributes,\n\t\t\t\t\t\tblock.innerBlocks\n\t\t\t\t\t);\n\n\t\t\t\t\t// The following must happen as two independent actions.\n\t\t\t\t\t// Why? Because the offcanvas editor relies on the getLastInsertedBlocksClientIds\n\t\t\t\t\t// selector to determine which block is \"active\". As the UX needs the newLink to be\n\t\t\t\t\t// the \"active\" block it must be the last block to be inserted.\n\t\t\t\t\t// Therefore the Submenu is first created and **then** the newLink is inserted\n\t\t\t\t\t// thus ensuring it is the last inserted block.\n\t\t\t\t\treplaceBlock( clientId, newSubmenu );\n\n\t\t\t\t\treplaceInnerBlocks(\n\t\t\t\t\t\tnewSubmenu.clientId,\n\t\t\t\t\t\t[ newLink ],\n\t\t\t\t\t\tupdateSelectionOnInsert\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// This call sets the local List View state for the \"last inserted block\".\n\t\t\t\t// This is required for the Nav Block to determine whether or not to display\n\t\t\t\t// the Link UI for this new block.\n\t\t\t\tsetInsertedBlockClientId( newLink.clientId );\n\t\t\t\tupdateExpansion( { type: 'expand', clientIds: [ clientId ] } );\n\t\t\t\tonClose();\n\t\t\t} }\n\t\t>\n\t\t\t{ __( 'Add submenu link' ) }\n\t\t</MenuItem>\n\t);\n}\n\nexport default function LeafMoreMenu( {\n\tclientId,\n\tupdateExpansion,\n\tsetInsertedBlockClientId,\n\t...props\n} ) {\n\tconst {\n\t\tmoveBlocksDown,\n\t\tmoveBlocksUp,\n\t\tremoveBlocks,\n\t\tduplicateBlocks,\n\t\tinsertBeforeBlock,\n\t\tinsertAfterBlock,\n\t} = useDispatch( blockEditorStore );\n\n\tconst removeLabel = sprintf(\n\t\t/* translators: %s: block name */\n\t\t__( 'Remove %s' ),\n\t\tBlockTitle( { clientId, maximumLength: 25 } )\n\t);\n\n\tconst {\n\t\tblockName,\n\t\trootClientId,\n\t\tcanDuplicate,\n\t\tcanInsertBlock,\n\t\tisFirst,\n\t\tisLast,\n\t} = useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tgetBlockRootClientId,\n\t\t\t\tgetBlockName,\n\t\t\t\tcanInsertBlockType,\n\t\t\t\tgetDirectInsertBlock,\n\t\t\t\tgetBlockIndex,\n\t\t\t\tgetBlockCount,\n\t\t\t} = select( blockEditorStore );\n\t\t\tconst { getDefaultBlockName } = select( blocksStore );\n\n\t\t\tconst _rootClientId = getBlockRootClientId( clientId );\n\t\t\tconst _blockName = getBlockName( clientId );\n\t\t\tconst canInsertDefaultBlock = canInsertBlockType(\n\t\t\t\tgetDefaultBlockName(),\n\t\t\t\t_rootClientId\n\t\t\t);\n\t\t\tconst directInsertBlock = _rootClientId\n\t\t\t\t? getDirectInsertBlock( _rootClientId )\n\t\t\t\t: null;\n\n\t\t\treturn {\n\t\t\t\tblockName: _blockName,\n\t\t\t\trootClientId: _rootClientId,\n\t\t\t\tcanDuplicate:\n\t\t\t\t\t!! _blockName &&\n\t\t\t\t\thasBlockSupport( _blockName, 'multiple', true ) &&\n\t\t\t\t\tcanInsertBlockType( _blockName, _rootClientId ),\n\t\t\t\tcanInsertBlock:\n\t\t\t\t\t( canInsertDefaultBlock || !! directInsertBlock ) &&\n\t\t\t\t\t!! _blockName &&\n\t\t\t\t\tcanInsertBlockType( _blockName, _rootClientId ),\n\t\t\t\tisFirst: getBlockIndex( clientId ) === 0,\n\t\t\t\tisLast:\n\t\t\t\t\tgetBlockIndex( clientId ) ===\n\t\t\t\t\tgetBlockCount( _rootClientId ) - 1,\n\t\t\t};\n\t\t},\n\t\t[ clientId ]\n\t);\n\n\tconst isSubmenuDisabled =\n\t\t! BLOCKS_THAT_CAN_BE_CONVERTED_TO_SUBMENU.includes( blockName );\n\n\treturn (\n\t\t<DropdownMenu\n\t\t\ticon={ moreVertical }\n\t\t\tlabel={ __( 'Options' ) }\n\t\t\tclassName=\"block-editor-block-settings-menu\"\n\t\t\tpopoverProps={ POPOVER_PROPS }\n\t\t\tnoIcons\n\t\t\t{ ...props }\n\t\t>\n\t\t\t{ ( { onClose } ) => (\n\t\t\t\t<>\n\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\ticon={ chevronUp }\n\t\t\t\t\t\t\tdisabled={ isFirst }\n\t\t\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\t\tmoveBlocksUp( [ clientId ], rootClientId );\n\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Move up' ) }\n\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\ticon={ chevronDown }\n\t\t\t\t\t\t\tdisabled={ isLast }\n\t\t\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\t\tmoveBlocksDown( [ clientId ], rootClientId );\n\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Move down' ) }\n\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t<AddSubmenuItem\n\t\t\t\t\t\t\tclientId={ clientId }\n\t\t\t\t\t\t\tonClose={ onClose }\n\t\t\t\t\t\t\tisDisabled={ isSubmenuDisabled }\n\t\t\t\t\t\t\tupdateExpansion={ updateExpansion }\n\t\t\t\t\t\t\tsetInsertedBlockClientId={\n\t\t\t\t\t\t\t\tsetInsertedBlockClientId\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{ canDuplicate && (\n\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\t\t\tduplicateBlocks( [ clientId ] );\n\t\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ __( 'Duplicate' ) }\n\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t) }\n\t\t\t\t\t\t{ canInsertBlock && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\t\t\t\tinsertBeforeBlock( clientId );\n\t\t\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ __( 'Add before' ) }\n\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\t\t\t\tinsertAfterBlock( clientId );\n\t\t\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ __( 'Add after' ) }\n\t\t\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t<MenuGroup>\n\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\t\tremoveBlocks( [ clientId ], false );\n\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ removeLabel }\n\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t</MenuGroup>\n\t\t\t\t</>\n\t\t\t) }\n\t\t</DropdownMenu>\n\t);\n}\n"], "mappings": "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", "names": ["blockEditorStore", "blocksStore"] }