Skip to content

Commit

Permalink
Revert: Navigation: Always create a fallback menu (#48602)
Browse files Browse the repository at this point in the history
* Revert: Navigation: Always create a fallback menu

* Fix lint issues

---------

Co-authored-by: Dave Smith <getdavemail@gmail.com>
  • Loading branch information
scruffian and getdave authored Mar 7, 2023
1 parent 0771b0a commit cbd4fbb
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 121 deletions.
113 changes: 39 additions & 74 deletions packages/block-library/src/navigation/edit/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ import {
} from '@wordpress/components';
import { __, sprintf } from '@wordpress/i18n';
import { speak } from '@wordpress/a11y';
import { createBlock, getBlockType } from '@wordpress/blocks';
import { createBlock } from '@wordpress/blocks';
import { close, Icon } from '@wordpress/icons';

/**
Expand Down Expand Up @@ -225,44 +225,6 @@ function Navigation( {
[ selectBlock, clientId, setRef ]
);

// This useEffect adds snackbar and speak status notices when menus are created.
// If there are no fallback navigation menus then we don't show these messages,
// because this means that we are creating the first, fallback navigation menu.
useEffect( () => {
hideNavigationMenuStatusNotice();

if ( fallbackNavigationMenus && isCreatingNavigationMenu ) {
speak( __( `Creating Navigation Menu.` ) );
}

if ( createNavigationMenuIsSuccess ) {
handleUpdateMenu( createNavigationMenuPost?.id, {
focusNavigationBlock: true,
} );

if ( fallbackNavigationMenus ) {
showNavigationMenuStatusNotice(
__( `Navigation Menu successfully created.` )
);
}
}

if ( createNavigationMenuIsError ) {
showNavigationMenuStatusNotice(
__( 'Failed to create Navigation Menu.' )
);
}
}, [
createNavigationMenuIsError,
createNavigationMenuIsSuccess,
handleUpdateMenu,
hideNavigationMenuStatusNotice,
isCreatingNavigationMenu,
showNavigationMenuStatusNotice,
createNavigationMenuPost?.id,
fallbackNavigationMenus,
] );

// Attempt to retrieve and prioritize any existing navigation menu unless:
// - the are uncontrolled inner blocks already present in the block.
// - the user is creating a new menu.
Expand Down Expand Up @@ -316,7 +278,8 @@ function Navigation( {
! hasResolvedNavigationMenus ||
isConvertingClassicMenu ||
fallbackNavigationMenus?.length > 0 ||
hasUnsavedBlocks
hasUnsavedBlocks ||
! classicMenus?.length
) {
return;
}
Expand All @@ -325,42 +288,25 @@ function Navigation( {
// a classic menu with a `primary` location or slug,
// then create a new navigation menu based on it.
// Otherwise, use the most recently created classic menu.
if ( classicMenus?.length ) {
const primaryMenus = classicMenus.filter(
( classicMenu ) =>
classicMenu.locations.includes( 'primary' ) ||
classicMenu.slug === 'primary'
);
const primaryMenus = classicMenus.filter(
( classicMenu ) =>
classicMenu.locations.includes( 'primary' ) ||
classicMenu.slug === 'primary'
);

if ( primaryMenus.length ) {
convertClassicMenu(
primaryMenus[ 0 ].id,
primaryMenus[ 0 ].name,
'publish'
);
} else {
classicMenus.sort( ( a, b ) => {
return b.id - a.id;
} );
convertClassicMenu(
classicMenus[ 0 ].id,
classicMenus[ 0 ].name,
'publish'
);
}
if ( primaryMenus.length ) {
convertClassicMenu(
primaryMenus[ 0 ].id,
primaryMenus[ 0 ].name,
'publish'
);
} else {
// If there are no fallback navigation menus and no classic menus,
// then create a new navigation menu.

// Check that we have a page-list block type.
let defaultBlocks = [];
if ( getBlockType( 'core/page-list' ) ) {
defaultBlocks = [ createBlock( 'core/page-list' ) ];
}

createNavigationMenu(
'Navigation', // TODO - use the template slug in future
defaultBlocks,
classicMenus.sort( ( a, b ) => {
return b.id - a.id;
} );
convertClassicMenu(
classicMenus[ 0 ].id,
classicMenus[ 0 ].name,
'publish'
);
}
Expand Down Expand Up @@ -394,6 +340,25 @@ function Navigation( {
classicMenus?.length === 0 &&
! hasUncontrolledInnerBlocks;

useEffect( () => {
if ( isPlaceholder ) {
/**
* this fallback only displays (both in editor and on front)
* the list of pages block if no menu is available as a fallback.
* We don't want the fallback to request a save,
* nor to be undoable, hence we mark it non persistent.
*/
__unstableMarkNextChangeAsNotPersistent();
replaceInnerBlocks( clientId, [ createBlock( 'core/page-list' ) ] );
}
}, [
clientId,
isPlaceholder,
ref,
__unstableMarkNextChangeAsNotPersistent,
replaceInnerBlocks,
] );

// "loading" state:
// - there is a menu creation process in progress.
// - there is a classic menu conversion process in progress.
Expand Down
55 changes: 17 additions & 38 deletions packages/block-library/src/navigation/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -431,37 +431,6 @@ function block_core_navigation_block_contains_core_navigation( $inner_blocks ) {
return false;
}

/**
* Create and returns a navigation menu containing a page-list as a fallback.
*
* @return array the newly created navigation menu.
*/
function block_core_navigation_get_default_pages_fallback() {
$registry = WP_Block_Type_Registry::get_instance();

// If `core/page-list` is not registered then use empty blocks.
$default_blocks = $registry->is_registered( 'core/page-list' ) ? '<!-- wp:page-list /-->' : '';

// Create a new navigation menu from the fallback blocks.
$wp_insert_post_result = wp_insert_post(
array(
'post_content' => $default_blocks,
'post_title' => _x( 'Navigation', 'Title of a Navigation menu' ),
'post_name' => 'navigation',
'post_status' => 'publish',
'post_type' => 'wp_navigation',
),
true // So that we can check whether the result is an error.
);

if ( is_wp_error( $wp_insert_post_result ) ) {
return;
}

// Fetch the most recently published navigation which will be the default one created above.
return block_core_navigation_get_most_recently_published_navigation();
}

/**
* Retrieves the appropriate fallback to be used on the front of the
* site when there is no menu assigned to the Nav block.
Expand All @@ -472,7 +441,18 @@ function block_core_navigation_get_default_pages_fallback() {
* @return array the array of blocks to be used as a fallback.
*/
function block_core_navigation_get_fallback_blocks() {
// Get the most recently published Navigation post.
$page_list_fallback = array(
array(
'blockName' => 'core/page-list',
),
);

$registry = WP_Block_Type_Registry::get_instance();

// If `core/page-list` is not registered then return empty blocks.
$fallback_blocks = $registry->is_registered( 'core/page-list' ) ? $page_list_fallback : array();

// Default to a list of Pages.
$navigation_post = block_core_navigation_get_most_recently_published_navigation();

// If there are no navigation posts then try to find a classic menu
Expand All @@ -481,15 +461,14 @@ function block_core_navigation_get_fallback_blocks() {
$navigation_post = block_core_navigation_maybe_use_classic_menu_fallback();
}

// If there are no navigation posts then default to a list of Pages.
if ( ! $navigation_post ) {
$navigation_post = block_core_navigation_get_default_pages_fallback();
}

// Use the first non-empty Navigation as fallback, there should always be one.
// Use the first non-empty Navigation as fallback if available.
if ( $navigation_post ) {
$parsed_blocks = parse_blocks( $navigation_post->post_content );
$maybe_fallback = block_core_navigation_filter_out_empty_blocks( $parsed_blocks );

// Normalizing blocks may result in an empty array of blocks if they were all `null` blocks.
// In this case default to the (Page List) fallback.
$fallback_blocks = ! empty( $maybe_fallback ) ? $maybe_fallback : $fallback_blocks;
}

// Normalizing blocks may result in an empty array of blocks if they were all `null` blocks.
Expand Down
15 changes: 6 additions & 9 deletions test/e2e/specs/editor/blocks/navigation.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ test.describe(
test( 'default to a list of pages if there are no menus', async ( {
admin,
editor,
requestUtils,
} ) => {
await admin.createNewPost();
await editor.insertBlock( { name: 'core/navigation' } );
Expand All @@ -48,14 +47,12 @@ test.describe(

// Check the markup of the block is correct.
await editor.publishPost();
const navigationMenus = await requestUtils.getNavigationMenus();
const latestNavigationMenu = navigationMenus[ 0 ];
await expect.poll( editor.getBlocks ).toMatchObject( [
{
name: 'core/navigation',
attributes: { ref: latestNavigationMenu.id },
},
] );
const content = await editor.getEditedPostContent();
expect( content ).toBe(
`<!-- wp:navigation -->
<!-- wp:page-list /-->
<!-- /wp:navigation -->`
);
} );

test( 'default to my only existing menu', async ( {
Expand Down

0 comments on commit cbd4fbb

Please sign in to comment.