Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Consolidate Navigation fallbacks logic between Editor and Front of Site via REST API #48698

Merged
merged 110 commits into from
Apr 21, 2023

Conversation

getdave
Copy link
Contributor

@getdave getdave commented Mar 2, 2023

What?

Centralises all logic around finding / creating an appropriate fallback menu for the Navigation block onto the PHP side. Briefly this involves:

  • extending the Navigation REST endpoint with a /fallbacks endpoint. adding a new block editor specific endpoint for retrieving the fallback.
  • adding utility classes to encapsulate domain logic around fallbacks (and also classic menu conversion).
  • removing lots of unused JavaScript code.
  • adding tests (some of which cover existing behaviour).

Why?

An empty Navigation block (one without a ref to an existing Nav Menu) should display a fallback Navigation Menu. The behaviour should be:

  • Use most recently created Navigation Menu (if exists).
  • Convert a Classic Menu into a Navigation Menu and use that (if exists).
  • Create a default Navigation Menu and use that.

The current approach in trunk has several flaws. At a high level these are:

  • logic is duplicated between JavaScript and PHP code.
  • number of network requests required to determine fallback in the Editor is
    • time consuming
    • prone to error
    • provides a poor user experience

This PR aims to solve that by centralising all the logic around the creation/retrieval of fallback Navigation Menus onto the PHP side. This has the benefit of a single implementation of the logic which can be shared between client (via the REST API) and server (via direct access to the controlling class).

👀 Please also see Common Questions below.

How?

Adds dedicated class to encapsulate all the domain knowledge and logic around the creation of Navigation Menu fallbacks.

Code previously in the Navigation block index.php is migrated to the class and all public functions are deprecated and proxied to the appropriate class methods.

Nav block render_callback now calls the class to retrieve the fallback - this means code for the behaviour of "empty" Navigation blocks on the front of the site is using the central source of truth.

A custom REST API endpoint for Navigation is created which exposes a new fallbacks endpoint which can be called to create/retrieve a fallback Navigation Menu. This endpoint is accessed from the Navigation block code in the editor - this means code for the behaviour of "empty" Navigation blocks in the editor is using the central source of truth.

⚠️ This PR does not update client side code. However, if this PR lands, then it will be possible to drastically simplify the block implementation. It was decided this PR would make more sense if we included the changes to the editor code.

Common Questions

Why not modify the existing get endpoint (wp/navigation/{recordKey}) to create a menu if it doesn't exist?

That endpoint is designed to retrieve a specific post by ID. It should not have a side effect of creating a post.

Moreover, an empty Navigation block is not going to request a post by ID. Rather it needs to know which post it should display. Therefore a dedicated endpoint seems logical.

Why not use filters to modify the response from the existing endpoint to create a menu if one doesn't exist

Same reason as above. Filtering the API to do a CREATE action when fetching from an endpoint which is part of an established WP REST API design pattern (e.g. Posts_Controller) would be an anti-pattern and provide poor DX.

We should try to avoid modifying existing endpoints for something as custom as this.

Moreover, using this method would not allow the feature to be extended in future to accommodate new requirements such as the ability to find the most suitable fallback by template part slug (see below).

We should not extend the WP REST API just for the Gutenberg Plugin

This depends on whether you view Gutenberg as part of WP Core. The Gutenberg Plugin is a feature plugin, but much of its code ends up as part of Core. There are numerous examples of API endpoints starting in the Plugin ending up as Core REST endpoints (Theme JSON for example).

The Gutenberg Plugin should try to avoid modifying existing Core endpoints to conform to Gutenberg specific requirements. For example, a GET endpoint for READ on a single post should not be extending to have additional side effects. However, it seems reasonable to allow the Plugin to extend existing controllers with additional endpoints as is done in this PR. This ensures we retain backwards compatibility, don't break existing REST design patterns whilst still facilitating the end goal.

Ultimately the editor is part of Core so REST should open for modification to facilitate the optimal UX for the editor.

What other approaches have you tried/considered?

We have two options that have been explored:

Neither seems ideal. The former has several disadvantages including:

  • not performant - requires several network requests in the editor
  • provides poor UX - multiple network requests to resolve to a fallback leads to unavoidable long load times.
  • duplication of code between JS and PHP - having different implementations of the same logic in JS and PHP for the editor and front of site respectively is a minefield which is open for bugs and maintenance overhead.

The later option is an improvement but has downsides including creating posts when the user may not need/want them (for example if they are happy with their existing Classic Menu).

As a result of these concerns, exploring the approach in this PR seemed like a good option.

What other benefits do you see in this new endpoint?

Currently the fallback mechanic is pretty primitive relying on date ordering to determine which Navigation Menu to show as a fallback. In the future however, it should be possible to pass a "hint" to this endpoint to provide it with guidance on selecting the most appropriate fallback.

The mechanics for "most appropriate" may change over time (imagine the possibiities for AI here) but in the short term I see Gutenberg utilising this by passing the slug of the closest containing template part and the editor using that to determine which is the best menu to display.

Say for example I pass the slug twentytwentythree//header - the endpoint should have a basic heuristic to determine that the most suitable menu is likely to be one that has some properties that indicate it is a "header" menu. At a basic level this would be checking for Navigation Menus containing the word header in the post_title or slug (post_name). The same is true for footer/sidebar .etc.

Testing Instructions

Run the endpoint tests:

npm run test:unit:php -- --filter WP_REST_Navigation_Fallback_Controller_Test --order-by=random

...and the domain class tests:

npm run test:unit:php -- --filter WP_Navigation_Fallback_Gutenberg --order-by=random

Manual testing

⚠️ All testing steps assume you are using a Theme which has an empty Nav block (i.e. one without a ref) in the Header of the site.

Default fallbacks

  1. Delete all Nav Menus at http://localhost:8888/wp-admin/edit.php?post_type=wp_navigation
  2. Open the front of your site.
  3. See the default fallback menu.
  4. Go back to http://localhost:8888/wp-admin/edit.php?post_type=wp_navigation.
  5. Check a single Navigation Menu fallback was created.

Classic fallbacks

  • Create Classic Menu using a Classic Theme or
npm run wp-env run cli 'menu create "Existing Classic Menu"'
npm run wp-env run cli 'menu item add-custom existing-classic-menu "From Classic" http://wp.org'

Most recent Navigation menu fallback

  • On a block Theme create a few Navigation menus however you want to (in the editor?).
  • Now make sure the Navigation block in your Theme has no ref attribute. You can do this by simply resetting the Template Part where you block resides.
  • Go to the front of your site.
  • See the Nav block display the most recently created Navigation Menu.

Multiple Navigation blocks

<!-- wp:navigation /-->
<!-- wp:navigation /-->
<!-- wp:navigation /-->
<!-- wp:navigation /-->
<!-- wp:navigation /-->
<!-- wp:navigation /-->
<!-- wp:navigation /-->
<!-- wp:navigation /-->
<!-- wp:navigation /-->

Testing Instructions for Keyboard

Screenshots or screencast

Followups

  • Extract deprecated functions from Nav block server side render index.php into a separate file called deprecated.php and require that from the main index.php. This will reduce bloat in that file and discourage further modification.
  • Extract a helper method for retrieving the fallback and remove the inline apiFetch usage in the Nav block editor code.
  • Add a link to the the REST response for the fallbacks controller which indicates how to retrieve the full wp_navigation Post object. Test that include the _embed on the request will embed ("inline") the full post object in the response.
  • Add test coverage for WP_Classic_To_Block_Menu_Converter

Closes #47058

@github-actions
Copy link

github-actions bot commented Mar 2, 2023

Flaky tests detected in db39cdb.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/4763249844
📝 Reported issues:

@github-actions
Copy link

github-actions bot commented Mar 23, 2023

Size Change: -301 B (0%)

Total Size: 1.37 MB

Filename Size Change
build/block-editor/content-rtl.css 4.17 kB +66 B (+2%)
build/block-editor/content.css 4.17 kB +66 B (+2%)
build/block-editor/index.min.js 201 kB -1.96 kB (-1%)
build/block-editor/style-rtl.css 15.1 kB +516 B (+4%)
build/block-editor/style.css 15.1 kB +507 B (+3%)
build/block-library/blocks/cover/editor-rtl.css 647 B -2 B (0%)
build/block-library/blocks/cover/editor.css 650 B -1 B (0%)
build/block-library/blocks/cover/style-rtl.css 1.6 kB -15 B (-1%)
build/block-library/blocks/cover/style.css 1.59 kB -15 B (-1%)
build/block-library/blocks/image/editor-rtl.css 834 B +4 B (0%)
build/block-library/blocks/image/editor.css 833 B +4 B (0%)
build/block-library/blocks/query/editor-rtl.css 450 B -13 B (-3%)
build/block-library/blocks/query/editor.css 449 B -14 B (-3%)
build/block-library/blocks/template-part/editor-rtl.css 403 B -1 B (0%)
build/block-library/blocks/template-part/editor.css 403 B -1 B (0%)
build/block-library/editor-rtl.css 11.6 kB +1 B (0%)
build/block-library/editor.css 11.6 kB -1 B (0%)
build/block-library/index.min.js 204 kB -219 B (0%)
build/block-library/style-rtl.css 12.8 kB -5 B (0%)
build/block-library/style.css 12.8 kB -6 B (0%)
build/commands/index.min.js 14.8 kB +64 B (0%)
build/commands/style-rtl.css 789 B -309 B (-28%) 🎉
build/commands/style.css 786 B -306 B (-28%) 🎉
build/components/index.min.js 209 kB +839 B (0%)
build/components/style-rtl.css 11.7 kB +22 B (0%)
build/components/style.css 11.8 kB +23 B (0%)
build/compose/index.min.js 12.4 kB +5 B (0%)
build/edit-post/index.min.js 35.2 kB +163 B (0%)
build/edit-post/style-rtl.css 7.6 kB +5 B (0%)
build/edit-post/style.css 7.59 kB +5 B (0%)
build/edit-site/index.min.js 64.6 kB +298 B (0%)
build/edit-site/style-rtl.css 10.1 kB -9 B (0%)
build/edit-site/style.css 10.1 kB -8 B (0%)
build/editor/index.min.js 45.9 kB -6 B (0%)
build/plugins/index.min.js 1.94 kB +2 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 409 B
build/block-library/blocks/columns/style.css 409 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/details-summary/editor-rtl.css 65 B
build/block-library/blocks/details-summary/editor.css 65 B
build/block-library/blocks/details-summary/style-rtl.css 61 B
build/block-library/blocks/details-summary/style.css 61 B
build/block-library/blocks/details/style-rtl.css 54 B
build/block-library/blocks/details/style.css 54 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 340 B
build/block-library/blocks/html/editor.css 341 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 716 B
build/block-library/blocks/navigation-link/editor.css 715 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.21 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 501 B
build/block-library/blocks/post-comments-form/style.css 501 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 322 B
build/block-library/blocks/post-featured-image/style.css 322 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 281 B
build/block-library/blocks/post-template/style.css 281 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 408 B
build/block-library/blocks/search/style.css 406 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 329 B
build/block-library/blocks/shortcode/editor.css 329 B
build/block-library/blocks/site-logo/editor-rtl.css 489 B
build/block-library/blocks/site-logo/editor.css 489 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 359 B
build/block-library/blocks/spacer/editor.css 359 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.12 kB
build/block-library/common.css 1.12 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 51.1 kB
build/core-data/index.min.js 16.3 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 718 B
build/data/index.min.js 8.68 kB
build/date/index.min.js 40.4 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.76 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.56 kB
build/edit-widgets/style.css 4.56 kB
build/editor/style-rtl.css 3.49 kB
build/editor/style.css 3.48 kB
build/element/index.min.js 4.95 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.26 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.94 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 942 B
build/react-i18n/index.min.js 702 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.55 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.74 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.3 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

draganescu

This comment was marked as resolved.

@getdave
Copy link
Contributor Author

getdave commented Mar 23, 2023

  • most of the methods of this object do not need to be public

I would love for them not to be public but we are deprecating a load of functions out of index.php and if we don't make their new versions in the class public then how would one utilise them? Honest question...

@getdave

This comment was marked as resolved.

@getdave getdave self-assigned this Mar 24, 2023
@getdave getdave added REST API Interaction Related to REST API [Block] Navigation Affects the Navigation Block labels Mar 24, 2023
@hellofromtonya
Copy link
Contributor

hellofromtonya commented Apr 21, 2023

This PR has a great discussion on architectural design patterns, benefits of each for Core, and when/why to use procedural, OOP, or static class wrapper designs. Thank you @spacedmonkey for starting it.

IMO this architectural design should not block this PR and should be a more broad, project-level discussion than just this one PR.

Why?
Core uses all of these programming paradigms. Any decisions made here in this PR set precedence for ALL of Gutenberg and Core, i.e. the whole project.

👉 Next Steps Suggestion:

I suggest the following:

  • Removing the architectural design patterns discussion from this PR to unblock it as there is enough committer support for it to move forward.
  • Moving the discussion to a broader open medium such as Make/Core, Trac, a GH discussion, and/or GH issue, i.e. for a project-level discussion.
  • When there's consensus and if changes are needed, then refactor this code and all others in Gutenberg and Core classes to comply with the project's newly adopted architectural code design.

What do you all think? Is this a good way forward?

@getdave
Copy link
Contributor Author

getdave commented Apr 21, 2023

@hellofromtonya This seems like a pragmatic way of moving forward whilst acknowledging the various viewpoints expressed in this PR.

I would happily commit to refactoring the code in this PR based on the outcome of any future discussion (as outlined by @hellofromtonya above).

Copy link
Member

@spacedmonkey spacedmonkey left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks good to me. The static method discussion should not block this PR.

@spacedmonkey
Copy link
Member

@hellofromtonya @azaozz Let's not drag this PR down with code design conversion. Let's move this conversion ( which is important ) elsewhere.

@scruffian scruffian merged commit 1e9cbb4 into trunk Apr 21, 2023
@scruffian scruffian deleted the try/use-dedicated-rest-to-get-nav-fallbacks branch April 21, 2023 17:40
@github-actions github-actions bot added this to the Gutenberg 15.7 milestone Apr 21, 2023
@TimothyBJacobs
Copy link
Member

Sorry, if it's not too much trouble can we change the REST API route from navigation-fallbacks to navigation-fallback in a follow-up PR? I keep reading the endpoint as returning a collection, when it's in fact an item endpoint.

@getdave
Copy link
Contributor Author

getdave commented Apr 21, 2023

Sorry, if it's not too much trouble can we change the REST API route from navigation-fallbacks to navigation-fallback in a follow-up PR? I keep reading the endpoint as returning a collection, when it's in fact an item endpoint.

Yup no problem - I'll raise a follow up. Funny how we did all that renaming and no one noticed the name of the actual endpoint 🤦

@getdave
Copy link
Contributor Author

getdave commented Apr 21, 2023

Thanks to everyone who contributed and/or reviewed this PR. It's great to see it merged.

Also thanks to Core committers here for the pragmatic approach to moving the discussion around code architectural to a higher level and thus unblocking this PR. Our users will thank you for it!

I've raised a series of follow ups in #49999. I will start addressing those soon.

@getdave
Copy link
Contributor Author

getdave commented Apr 24, 2023

Sorry, if it's not too much trouble can we change the REST API route from navigation-fallbacks to navigation-fallback in a follow-up PR? I keep reading the endpoint as returning a collection, when it's in fact an item endpoint.

@TimothyBJacobs Follow up ready in #50044

@getdave
Copy link
Contributor Author

getdave commented Jun 22, 2023

Note to documentation team: this PR changes behaviour so that in almost every scenario a Navigation block will have a menu assigned to it. It's now quite difficult to have an empty Navigation block.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Navigation Affects the Navigation Block REST API Interaction Related to REST API [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Navigation: Create first menu seamlessly