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 (
+
+ );
+ } ) }
+
+ ) }
+ { showClassicMenus && hasClassicMenus && (
+
+ { classicMenus.map( ( menu ) => {
+ const label = decodeEntities( menu.name );
+ return (
+
+ );
+ } ) }
+
+ ) }
+ >
+ );
+};
+
+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 (
-
- );
- } ) }
-
- ) }
-
-
-
-
- >
+
+
+
+
) }
>
);
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 (
-
- );
- } ) }
-
- ) }
- { showClassicMenus && hasClassicMenus && (
-
- { menus.map( ( menu ) => {
- return (
-
- );
- } ) }
-
- ) }
- >
- ) }
-
- );
-};
+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 && (