diff --git a/packages/block-library/src/navigation/edit/existing-menus-options.js b/packages/block-library/src/navigation/edit/existing-menus-options.js new file mode 100644 index 00000000000000..a47ae613489bf0 --- /dev/null +++ b/packages/block-library/src/navigation/edit/existing-menus-options.js @@ -0,0 +1,70 @@ +/** + * WordPress dependencies + */ +import { MenuGroup, MenuItem } from '@wordpress/components'; +import { __, sprintf } from '@wordpress/i18n'; +import { decodeEntities } from '@wordpress/html-entities'; + +const ExistingMenusOptions = ( { + showNavigationMenus, + showClassicMenus = false, + navigationMenus, + classicMenus, + onSelectNavigationMenu, + onSelectClassicMenu, + actionLabel, +} ) => { + const hasNavigationMenus = !! navigationMenus?.length; + const hasClassicMenus = !! classicMenus?.length; + + /* translators: %s: The name of a menu. */ + const createActionLabel = __( "Create from '%s'" ); + + actionLabel = actionLabel || createActionLabel; + + return ( + <> + { showNavigationMenus && hasNavigationMenus && ( + + { navigationMenus.map( ( menu ) => { + const label = decodeEntities( menu.title.rendered ); + return ( + { + onSelectNavigationMenu( menu ); + } } + key={ menu.id } + aria-label={ sprintf( actionLabel, label ) } + > + { label } + + ); + } ) } + + ) } + { showClassicMenus && hasClassicMenus && ( + + { classicMenus.map( ( menu ) => { + const label = decodeEntities( menu.name ); + return ( + { + onSelectClassicMenu( menu ); + } } + key={ menu.id } + aria-label={ sprintf( + createActionLabel, + label + ) } + > + { label } + + ); + } ) } + + ) } + + ); +}; + +export default ExistingMenusOptions; diff --git a/packages/block-library/src/navigation/edit/index.js b/packages/block-library/src/navigation/edit/index.js index 158ea26055023d..705a46845c1057 100644 --- a/packages/block-library/src/navigation/edit/index.js +++ b/packages/block-library/src/navigation/edit/index.js @@ -499,6 +499,9 @@ function Navigation( { canUserCreateNavigation={ canUserCreateNavigation } + canUserSwitchNavigation={ + canSwitchNavigationMenu + } /> ) } diff --git a/packages/block-library/src/navigation/edit/navigation-menu-selector.js b/packages/block-library/src/navigation/edit/navigation-menu-selector.js index 7ba8c5bffe8840..168ef06caade90 100644 --- a/packages/block-library/src/navigation/edit/navigation-menu-selector.js +++ b/packages/block-library/src/navigation/edit/navigation-menu-selector.js @@ -1,10 +1,9 @@ /** * WordPress dependencies */ -import { MenuGroup, MenuItem, MenuItemsChoice } from '@wordpress/components'; -import { useEntityId } from '@wordpress/core-data'; -import { __, sprintf } from '@wordpress/i18n'; -import { decodeEntities } from '@wordpress/html-entities'; +import { MenuGroup, MenuItem } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + import { addQueryArgs } from '@wordpress/url'; /** @@ -14,19 +13,20 @@ import useNavigationMenu from '../use-navigation-menu'; import useNavigationEntities from '../use-navigation-entities'; import useConvertClassicMenu from '../use-convert-classic-menu'; import useCreateNavigationMenu from './use-create-navigation-menu'; +import ExistingMenusOptions from './existing-menus-options'; export default function NavigationMenuSelector( { clientId, onSelect, onCreateNew, canUserCreateNavigation = false, + canUserSwitchNavigation = false, } ) { const { menus: classicMenus, hasMenus: hasClassicMenus, } = useNavigationEntities(); const { navigationMenus } = useNavigationMenu(); - const ref = useEntityId( 'postType', 'wp_navigation' ); const createNavigationMenu = useCreateNavigationMenu( clientId ); @@ -49,66 +49,42 @@ export default function NavigationMenuSelector( { onFinishMenuCreation ); + const showSelectMenus = + ( canUserSwitchNavigation || canUserCreateNavigation ) && + ( navigationMenus?.length || hasClassicMenus ); + + if ( ! showSelectMenus ) { + return null; + } + return ( <> - - - onSelect( - navigationMenus.find( - ( post ) => post.id === selectedId - ) - ) - } - choices={ navigationMenus.map( ( { id, title } ) => { - const label = decodeEntities( title.rendered ); - return { - value: id, - label, - 'aria-label': sprintf( - /* translators: %s: The name of a menu. */ - __( "Switch to '%s'" ), - label - ), - }; - } ) } - /> - + + convertClassicMenuToBlocks( id, name ) + } + /* translators: %s: The name of a menu. */ + actionLabel={ __( "Switch to '%s'" ) } + /> + { canUserCreateNavigation && ( - <> - { hasClassicMenus && ( - - { classicMenus.map( ( menu ) => { - return ( - { - convertClassicMenuToBlocks( - menu.id, - menu.name - ); - } } - key={ menu.id } - > - { decodeEntities( menu.name ) } - - ); - } ) } - - ) } - - - { __( 'Create new menu' ) } - - - { __( 'Manage menus' ) } - - - + + + { __( 'Create new menu' ) } + + + { __( 'Manage menus' ) } + + ) } ); diff --git a/packages/block-library/src/navigation/edit/placeholder/index.js b/packages/block-library/src/navigation/edit/placeholder/index.js index 5bf13823d93902..2ccac4e6e86178 100644 --- a/packages/block-library/src/navigation/edit/placeholder/index.js +++ b/packages/block-library/src/navigation/edit/placeholder/index.js @@ -1,16 +1,9 @@ /** * WordPress dependencies */ -import { - Placeholder, - Button, - DropdownMenu, - MenuGroup, - MenuItem, -} from '@wordpress/components'; +import { Placeholder, Button, DropdownMenu } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; import { navigation, Icon } from '@wordpress/icons'; -import { decodeEntities } from '@wordpress/html-entities'; /** * Internal dependencies @@ -21,77 +14,7 @@ import PlaceholderPreview from './placeholder-preview'; import useNavigationMenu from '../../use-navigation-menu'; import useCreateNavigationMenu from '../use-create-navigation-menu'; import useConvertClassicMenu from '../../use-convert-classic-menu'; - -const ExistingMenusDropdown = ( { - showNavigationMenus, - navigationMenus, - onFinish, - menus, - onCreateFromMenu, - showClassicMenus = false, -} ) => { - const toggleProps = { - variant: 'tertiary', - iconPosition: 'right', - className: 'wp-block-navigation-placeholder__actions__dropdown', - }; - - const hasNavigationMenus = !! navigationMenus?.length; - const hasClassicMenus = !! menus?.length; - - return ( - - { ( { onClose } ) => ( - <> - { showNavigationMenus && hasNavigationMenus && ( - - { navigationMenus.map( ( menu ) => { - return ( - { - onFinish( menu ); - } } - onClose={ onClose } - key={ menu.id } - > - { decodeEntities( - menu.title.rendered - ) } - - ); - } ) } - - ) } - { showClassicMenus && hasClassicMenus && ( - - { menus.map( ( menu ) => { - return ( - { - onCreateFromMenu( - menu.id, - menu.name - ); - } } - onClose={ onClose } - key={ menu.id } - > - { decodeEntities( menu.name ) } - - ); - } ) } - - ) } - - ) } - - ); -}; +import ExistingMenusOptions from '../existing-menus-options'; export default function NavigationPlaceholder( { clientId, @@ -159,21 +82,48 @@ export default function NavigationPlaceholder( { { showSelectMenus ? ( <> - + + { () => ( + + convertClassicMenu( + id, + name + ) + } + showClassicMenus={ + canUserCreateNavigation + } + /> + ) } +
) : undefined } + { canUserCreateNavigation && (