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

Fix auto Nav menu creation due to page list inner blocks #46223

Merged

Conversation

getdave
Copy link
Contributor

@getdave getdave commented Dec 1, 2022

What?

Fixes bug whereby the fallback Page List in the Navigation block was automatically creating a new Navigation Menu (post) on load.

Why?

This was happening because Page List has now been converted to use InnerBlocks. It is dynamic in the sense that the Page List Items are loaded from the REST API and thus the .innerBlocks property changes as the data is received.

  • initial render innerBlocks is []
  • once pages data is received innerBlocks is an array of blocks

The UncontrolledInnerBlocks component in the Nav block checks for changes to the uncontrolled inner blocks and if there are any changes it considers the blocks to have become "dirty" and triggers the creation of a Navigation Menu.

Unfortunately due to the dynamic population of inner blocks in the Page List block (as described above) this behaviour now caused the auto creation of a menu on insertion.

How?

The fix is currently achieved by adding a specific condition for Page List to ignore the inner blocks and only check for changes to the block's other properties (i.e.: we ignore changes to inner blocks of the Page List block).

This results in the dynamic changes to innerBlocks being ignored and thus the Nav Men is not auto created. However if you make other changes to the Nav block's inner blocks such as:

  • adding another block type
  • adjusting the parent of the Page List block

...the Nav Menu will be correctly auto created as before.

Testing Instructions

This needs careful testing.

Before all tests please clear your Nav Menus at http://localhost:8888/wp-admin/edit.php?post_type=wp_navigation.

Test Page List

  • Add Nav block
  • See Page List
  • Do not see Nav Menu auto-creation.
  • Select Page List
  • Click Edit
  • See Nav Menu auto created

Test Adding New Block

  • Add Nav block
  • See Page List
  • Do not see Nav Menu auto-creation.
  • Select Nav Block
  • Append new block within Nav block
  • See Nav Menu auto created

Existing Inner Blocks

  • Open code editor mode
  • Paste in the following (or your inner blocks of choice)
<!-- wp:navigation -->
<!-- wp:navigation-link {"label":"Menu Test","type":"post","id":669,"url":"http://localhost:8888/menu-test/","kind":"post-type","isTopLevelLink":true} /-->

<!-- wp:navigation-link {"label":"Laborum ducimus","type":"page","id":609,"url":"http://localhost:8888/laborum-ducimus-voluptatibus-officia-soluta-impedit/","kind":"post-type","isTopLevelLink":true} /-->

<!-- wp:site-logo {"shouldSyncIcon":true} /-->

<!-- wp:navigation-link {"label":"Quas facere est ","type":"post","id":593,"url":"http://localhost:8888/quas-facere-est-doloribus-vel-consequuntur/","kind":"post-type","isTopLevelLink":true} /-->

<!-- wp:navigation-link {"isTopLevelLink":true} /-->
<!-- /wp:navigation -->
  • Switch to visual mode
  • See Nav block
  • See uncontrolled inner blocks
  • Modify the inner blocks in any way
  • See Nav Menu auto created

Testing Instructions for Keyboard

Screenshots or screencast

Co-authored-by: Maggie <[email protected]>
Co-authored-by: Ben Dwyer <[email protected]>

@getdave getdave added [Type] Regression Related to a regression in the latest release [Block] Navigation Affects the Navigation Block labels Dec 1, 2022
@github-actions
Copy link

github-actions bot commented Dec 1, 2022

Size Change: +116 B (0%)

Total Size: 1.33 MB

Filename Size Change
build/block-library/index.min.js 196 kB +116 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 487 B
build/block-directory/index.min.js 7.16 kB
build/block-directory/style-rtl.css 1.03 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 2.71 kB
build/block-editor/content.css 2.71 kB
build/block-editor/default-editor-styles-rtl.css 401 B
build/block-editor/default-editor-styles.css 401 B
build/block-editor/index.min.js 181 kB
build/block-editor/style-rtl.css 14.5 kB
build/block-editor/style.css 14.5 kB
build/block-library/blocks/archives/editor-rtl.css 107 B
build/block-library/blocks/archives/editor.css 106 B
build/block-library/blocks/archives/style-rtl.css 129 B
build/block-library/blocks/archives/style.css 129 B
build/block-library/blocks/audio/editor-rtl.css 185 B
build/block-library/blocks/audio/editor.css 185 B
build/block-library/blocks/audio/style-rtl.css 158 B
build/block-library/blocks/audio/style.css 158 B
build/block-library/blocks/audio/theme-rtl.css 172 B
build/block-library/blocks/audio/theme.css 172 B
build/block-library/blocks/avatar/editor-rtl.css 154 B
build/block-library/blocks/avatar/editor.css 154 B
build/block-library/blocks/avatar/style-rtl.css 126 B
build/block-library/blocks/avatar/style.css 126 B
build/block-library/blocks/block/editor-rtl.css 338 B
build/block-library/blocks/block/editor.css 338 B
build/block-library/blocks/button/editor-rtl.css 517 B
build/block-library/blocks/button/editor.css 517 B
build/block-library/blocks/button/style-rtl.css 566 B
build/block-library/blocks/button/style.css 566 B
build/block-library/blocks/buttons/editor-rtl.css 373 B
build/block-library/blocks/buttons/editor.css 373 B
build/block-library/blocks/buttons/style-rtl.css 368 B
build/block-library/blocks/buttons/style.css 368 B
build/block-library/blocks/calendar/style-rtl.css 270 B
build/block-library/blocks/calendar/style.css 270 B
build/block-library/blocks/categories/editor-rtl.css 125 B
build/block-library/blocks/categories/editor.css 124 B
build/block-library/blocks/categories/style-rtl.css 138 B
build/block-library/blocks/categories/style.css 138 B
build/block-library/blocks/code/editor-rtl.css 102 B
build/block-library/blocks/code/editor.css 102 B
build/block-library/blocks/code/style-rtl.css 159 B
build/block-library/blocks/code/style.css 159 B
build/block-library/blocks/code/theme-rtl.css 160 B
build/block-library/blocks/code/theme.css 160 B
build/block-library/blocks/columns/editor-rtl.css 147 B
build/block-library/blocks/columns/editor.css 147 B
build/block-library/blocks/columns/style-rtl.css 442 B
build/block-library/blocks/columns/style.css 442 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 163 B
build/block-library/blocks/comment-author-avatar/editor.css 163 B
build/block-library/blocks/comment-content/style-rtl.css 134 B
build/block-library/blocks/comment-content/style.css 134 B
build/block-library/blocks/comment-template/style-rtl.css 237 B
build/block-library/blocks/comment-template/style.css 236 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 159 B
build/block-library/blocks/comments-pagination-numbers/editor.css 157 B
build/block-library/blocks/comments-pagination/editor-rtl.css 258 B
build/block-library/blocks/comments-pagination/editor.css 249 B
build/block-library/blocks/comments-pagination/style-rtl.css 272 B
build/block-library/blocks/comments-pagination/style.css 268 B
build/block-library/blocks/comments-title/editor-rtl.css 118 B
build/block-library/blocks/comments-title/editor.css 118 B
build/block-library/blocks/comments/editor-rtl.css 875 B
build/block-library/blocks/comments/editor.css 874 B
build/block-library/blocks/comments/style-rtl.css 672 B
build/block-library/blocks/comments/style.css 671 B
build/block-library/blocks/cover/editor-rtl.css 646 B
build/block-library/blocks/cover/editor.css 647 B
build/block-library/blocks/cover/style-rtl.css 1.61 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/embed/editor-rtl.css 327 B
build/block-library/blocks/embed/editor.css 327 B
build/block-library/blocks/embed/style-rtl.css 446 B
build/block-library/blocks/embed/style.css 446 B
build/block-library/blocks/embed/theme-rtl.css 172 B
build/block-library/blocks/embed/theme.css 172 B
build/block-library/blocks/file/editor-rtl.css 335 B
build/block-library/blocks/file/editor.css 335 B
build/block-library/blocks/file/style-rtl.css 288 B
build/block-library/blocks/file/style.css 288 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.47 kB
build/block-library/blocks/freeform/editor.css 2.47 kB
build/block-library/blocks/gallery/editor-rtl.css 1.01 kB
build/block-library/blocks/gallery/editor.css 1.02 kB
build/block-library/blocks/gallery/style-rtl.css 1.58 kB
build/block-library/blocks/gallery/style.css 1.58 kB
build/block-library/blocks/gallery/theme-rtl.css 157 B
build/block-library/blocks/gallery/theme.css 157 B
build/block-library/blocks/group/editor-rtl.css 687 B
build/block-library/blocks/group/editor.css 687 B
build/block-library/blocks/group/style-rtl.css 105 B
build/block-library/blocks/group/style.css 105 B
build/block-library/blocks/group/theme-rtl.css 125 B
build/block-library/blocks/group/theme.css 125 B
build/block-library/blocks/heading/style-rtl.css 128 B
build/block-library/blocks/heading/style.css 128 B
build/block-library/blocks/html/editor-rtl.css 365 B
build/block-library/blocks/html/editor.css 366 B
build/block-library/blocks/image/editor-rtl.css 861 B
build/block-library/blocks/image/editor.css 859 B
build/block-library/blocks/image/style-rtl.css 662 B
build/block-library/blocks/image/style.css 666 B
build/block-library/blocks/image/theme-rtl.css 172 B
build/block-library/blocks/image/theme.css 172 B
build/block-library/blocks/latest-comments/style-rtl.css 333 B
build/block-library/blocks/latest-comments/style.css 333 B
build/block-library/blocks/latest-posts/editor-rtl.css 250 B
build/block-library/blocks/latest-posts/editor.css 249 B
build/block-library/blocks/latest-posts/style-rtl.css 514 B
build/block-library/blocks/latest-posts/style.css 514 B
build/block-library/blocks/list/style-rtl.css 135 B
build/block-library/blocks/list/style.css 135 B
build/block-library/blocks/media-text/editor-rtl.css 300 B
build/block-library/blocks/media-text/editor.css 298 B
build/block-library/blocks/media-text/style-rtl.css 540 B
build/block-library/blocks/media-text/style.css 539 B
build/block-library/blocks/more/editor-rtl.css 465 B
build/block-library/blocks/more/editor.css 465 B
build/block-library/blocks/navigation-link/editor-rtl.css 746 B
build/block-library/blocks/navigation-link/editor.css 744 B
build/block-library/blocks/navigation-link/style-rtl.css 153 B
build/block-library/blocks/navigation-link/style.css 153 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 333 B
build/block-library/blocks/navigation-submenu/editor.css 333 B
build/block-library/blocks/navigation/editor-rtl.css 2.19 kB
build/block-library/blocks/navigation/editor.css 2.19 kB
build/block-library/blocks/navigation/style-rtl.css 2.26 kB
build/block-library/blocks/navigation/style.css 2.25 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 428 B
build/block-library/blocks/nextpage/editor.css 428 B
build/block-library/blocks/page-list/editor-rtl.css 397 B
build/block-library/blocks/page-list/editor.css 398 B
build/block-library/blocks/page-list/style-rtl.css 212 B
build/block-library/blocks/page-list/style.css 212 B
build/block-library/blocks/paragraph/editor-rtl.css 214 B
build/block-library/blocks/paragraph/editor.css 214 B
build/block-library/blocks/paragraph/style-rtl.css 321 B
build/block-library/blocks/paragraph/style.css 321 B
build/block-library/blocks/post-author/style-rtl.css 212 B
build/block-library/blocks/post-author/style.css 212 B
build/block-library/blocks/post-comments-form/editor-rtl.css 137 B
build/block-library/blocks/post-comments-form/editor.css 137 B
build/block-library/blocks/post-comments-form/style-rtl.css 536 B
build/block-library/blocks/post-comments-form/style.css 537 B
build/block-library/blocks/post-date/style-rtl.css 107 B
build/block-library/blocks/post-date/style.css 107 B
build/block-library/blocks/post-excerpt/editor-rtl.css 119 B
build/block-library/blocks/post-excerpt/editor.css 119 B
build/block-library/blocks/post-excerpt/style-rtl.css 116 B
build/block-library/blocks/post-excerpt/style.css 116 B
build/block-library/blocks/post-featured-image/editor-rtl.css 620 B
build/block-library/blocks/post-featured-image/editor.css 618 B
build/block-library/blocks/post-featured-image/style-rtl.css 349 B
build/block-library/blocks/post-featured-image/style.css 349 B
build/block-library/blocks/post-navigation-link/style-rtl.css 190 B
build/block-library/blocks/post-navigation-link/style.css 189 B
build/block-library/blocks/post-template/editor-rtl.css 140 B
build/block-library/blocks/post-template/editor.css 139 B
build/block-library/blocks/post-template/style-rtl.css 317 B
build/block-library/blocks/post-template/style.css 317 B
build/block-library/blocks/post-terms/style-rtl.css 136 B
build/block-library/blocks/post-terms/style.css 136 B
build/block-library/blocks/post-title/style-rtl.css 138 B
build/block-library/blocks/post-title/style.css 138 B
build/block-library/blocks/preformatted/style-rtl.css 139 B
build/block-library/blocks/preformatted/style.css 139 B
build/block-library/blocks/pullquote/editor-rtl.css 170 B
build/block-library/blocks/pullquote/editor.css 170 B
build/block-library/blocks/pullquote/style-rtl.css 357 B
build/block-library/blocks/pullquote/style.css 357 B
build/block-library/blocks/pullquote/theme-rtl.css 201 B
build/block-library/blocks/pullquote/theme.css 201 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 158 B
build/block-library/blocks/query-pagination-numbers/editor.css 156 B
build/block-library/blocks/query-pagination/editor-rtl.css 258 B
build/block-library/blocks/query-pagination/editor.css 247 B
build/block-library/blocks/query-pagination/style-rtl.css 326 B
build/block-library/blocks/query-pagination/style.css 322 B
build/block-library/blocks/query-title/style-rtl.css 108 B
build/block-library/blocks/query-title/style.css 108 B
build/block-library/blocks/query/editor-rtl.css 475 B
build/block-library/blocks/query/editor.css 477 B
build/block-library/blocks/quote/style-rtl.css 253 B
build/block-library/blocks/quote/style.css 253 B
build/block-library/blocks/quote/theme-rtl.css 255 B
build/block-library/blocks/quote/theme.css 259 B
build/block-library/blocks/read-more/style-rtl.css 168 B
build/block-library/blocks/read-more/style.css 168 B
build/block-library/blocks/rss/editor-rtl.css 239 B
build/block-library/blocks/rss/editor.css 240 B
build/block-library/blocks/rss/style-rtl.css 323 B
build/block-library/blocks/rss/style.css 323 B
build/block-library/blocks/search/editor-rtl.css 205 B
build/block-library/blocks/search/editor.css 205 B
build/block-library/blocks/search/style-rtl.css 441 B
build/block-library/blocks/search/style.css 439 B
build/block-library/blocks/search/theme-rtl.css 149 B
build/block-library/blocks/search/theme.css 149 B
build/block-library/blocks/separator/editor-rtl.css 184 B
build/block-library/blocks/separator/editor.css 184 B
build/block-library/blocks/separator/style-rtl.css 269 B
build/block-library/blocks/separator/style.css 269 B
build/block-library/blocks/separator/theme-rtl.css 229 B
build/block-library/blocks/separator/theme.css 229 B
build/block-library/blocks/shortcode/editor-rtl.css 508 B
build/block-library/blocks/shortcode/editor.css 508 B
build/block-library/blocks/site-logo/editor-rtl.css 522 B
build/block-library/blocks/site-logo/editor.css 522 B
build/block-library/blocks/site-logo/style-rtl.css 238 B
build/block-library/blocks/site-logo/style.css 238 B
build/block-library/blocks/site-tagline/editor-rtl.css 129 B
build/block-library/blocks/site-tagline/editor.css 129 B
build/block-library/blocks/site-title/editor-rtl.css 155 B
build/block-library/blocks/site-title/editor.css 155 B
build/block-library/blocks/site-title/style-rtl.css 101 B
build/block-library/blocks/site-title/style.css 101 B
build/block-library/blocks/social-link/editor-rtl.css 219 B
build/block-library/blocks/social-link/editor.css 219 B
build/block-library/blocks/social-links/editor-rtl.css 709 B
build/block-library/blocks/social-links/editor.css 708 B
build/block-library/blocks/social-links/style-rtl.css 1.43 kB
build/block-library/blocks/social-links/style.css 1.43 kB
build/block-library/blocks/spacer/editor-rtl.css 372 B
build/block-library/blocks/spacer/editor.css 372 B
build/block-library/blocks/spacer/style-rtl.css 96 B
build/block-library/blocks/spacer/style.css 96 B
build/block-library/blocks/table/editor-rtl.css 491 B
build/block-library/blocks/table/editor.css 491 B
build/block-library/blocks/table/style-rtl.css 670 B
build/block-library/blocks/table/style.css 669 B
build/block-library/blocks/table/theme-rtl.css 220 B
build/block-library/blocks/table/theme.css 220 B
build/block-library/blocks/tag-cloud/style-rtl.css 287 B
build/block-library/blocks/tag-cloud/style.css 288 B
build/block-library/blocks/template-part/editor-rtl.css 436 B
build/block-library/blocks/template-part/editor.css 436 B
build/block-library/blocks/template-part/theme-rtl.css 139 B
build/block-library/blocks/template-part/theme.css 139 B
build/block-library/blocks/text-columns/editor-rtl.css 135 B
build/block-library/blocks/text-columns/editor.css 135 B
build/block-library/blocks/text-columns/style-rtl.css 198 B
build/block-library/blocks/text-columns/style.css 198 B
build/block-library/blocks/verse/style-rtl.css 130 B
build/block-library/blocks/verse/style.css 130 B
build/block-library/blocks/video/editor-rtl.css 720 B
build/block-library/blocks/video/editor.css 723 B
build/block-library/blocks/video/style-rtl.css 218 B
build/block-library/blocks/video/style.css 218 B
build/block-library/blocks/video/theme-rtl.css 171 B
build/block-library/blocks/video/theme.css 171 B
build/block-library/classic-rtl.css 193 B
build/block-library/classic.css 193 B
build/block-library/common-rtl.css 1.05 kB
build/block-library/common.css 1.05 kB
build/block-library/editor-elements-rtl.css 126 B
build/block-library/editor-elements.css 126 B
build/block-library/editor-rtl.css 11.7 kB
build/block-library/editor.css 11.7 kB
build/block-library/elements-rtl.css 105 B
build/block-library/elements.css 105 B
build/block-library/reset-rtl.css 514 B
build/block-library/reset.css 514 B
build/block-library/style-rtl.css 12.4 kB
build/block-library/style.css 12.4 kB
build/block-library/theme-rtl.css 749 B
build/block-library/theme.css 753 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 50.4 kB
build/components/index.min.js 204 kB
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.3 kB
build/core-data/index.min.js 15.9 kB
build/customize-widgets/index.min.js 11.6 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.15 kB
build/date/index.min.js 32.1 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.74 kB
build/edit-navigation/index.min.js 16.2 kB
build/edit-navigation/style-rtl.css 4.12 kB
build/edit-navigation/style.css 4.13 kB
build/edit-post/classic-rtl.css 569 B
build/edit-post/classic.css 570 B
build/edit-post/index.min.js 34.5 kB
build/edit-post/style-rtl.css 7.45 kB
build/edit-post/style.css 7.44 kB
build/edit-site/index.min.js 62.6 kB
build/edit-site/style-rtl.css 8.74 kB
build/edit-site/style.css 8.74 kB
build/edit-widgets/index.min.js 16.7 kB
build/edit-widgets/style-rtl.css 4.48 kB
build/edit-widgets/style.css 4.48 kB
build/editor/index.min.js 44 kB
build/editor/style-rtl.css 3.69 kB
build/editor/style.css 3.68 kB
build/element/index.min.js 4.72 kB
build/escape-html/index.min.js 548 B
build/experiments/index.min.js 882 B
build/format-library/index.min.js 6.96 kB
build/format-library/style-rtl.css 596 B
build/format-library/style.css 596 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.86 kB
build/list-reusable-blocks/index.min.js 2.13 kB
build/list-reusable-blocks/style-rtl.css 858 B
build/list-reusable-blocks/style.css 857 B
build/media-utils/index.min.js 2.94 kB
build/notices/index.min.js 977 B
build/nux/index.min.js 2.07 kB
build/nux/style-rtl.css 772 B
build/nux/style.css 768 B
build/plugins/index.min.js 1.95 kB
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.59 kB
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 281 B
build/reusable-blocks/style.css 281 B
build/rich-text/index.min.js 10.7 kB
build/server-side-render/index.min.js 2.19 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.51 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.7 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.23 kB
build/widgets/style-rtl.css 1.21 kB
build/widgets/style.css 1.21 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@getdave getdave assigned getdave and unassigned getdave Dec 1, 2022
Comment on lines 88 to 91
innerBlocksAreDirty = ! isEqual(
originalPageListBlockWithoutInnerBlocks,
currentPageListBlockWithoutInnerBlocks
);
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Referential equality check is not possible here because we are creating two new objects using the de-structuring. Similarly we cannot mutate the original objects [to get only inner blocks] because that would invalidate future checks of originalBlocks.

@getdave
Copy link
Contributor Author

getdave commented Dec 1, 2022

Overall I'm not convinced this approach is robust enough. I can't put my finger on why yet but we need to be careful before we merge this one.

We could also consider a more generic solution that somehow makes use of

https://developer.wordpress.org/block-editor/reference-guides/data/data-core-block-editor/#areinnerblockscontrolled

@getdave getdave requested a review from talldan December 1, 2022 11:23
@getdave
Copy link
Contributor Author

getdave commented Dec 1, 2022

@talldan I wonder if we could consider using the areInnerBlocksControlled selector now to detect whether blocks are controlled?

@georgeh

This comment was marked as resolved.

@getdave
Copy link
Contributor Author

getdave commented Dec 2, 2022

@georgeh Thank you. This is interesting. Does the same happen for you on trunk?

@scruffian
Copy link
Contributor

@georgeh what theme are you testing with?

@getdave getdave requested a review from jameskoster December 2, 2022 12:27
@talldan
Copy link
Contributor

talldan commented Dec 5, 2022

@talldan I wonder if we could consider using the areInnerBlocksControlled selector now to detect whether blocks are controlled?

I think that selector was around when I originally wrote some of this code, and it didn't work or had some caveats.

Possibly the issue is that inner blocks need to render before areInnerBlocksControlled is set (it's set here as part of rendering), but for this use case you need to know before any rendering whether the blocks are controlled. The trouble is that if you accidentally render the nav block's inner blocks using a value then the blocks automatically become controlled and the uncontrolled blocks are replaced, so it's something to be careful about.

It's hard to say for sure though, as the code has changed a lot and what was once an issue may no longer be an issue.

@getdave getdave marked this pull request as ready for review December 5, 2022 10:38
@getdave
Copy link
Contributor Author

getdave commented Dec 5, 2022

Not sure how to proceed here. We need

  • a review that validates the approach works (ideally a few)
  • a consensus that this is the best approach

I'm not super happy with how "hacky" this code feels but it does improve the experience for the user from what we have now which is not great at all with those Menus being auto-created.

Copy link
Contributor

@scruffian scruffian left a comment

Choose a reason for hiding this comment

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

This works for me. As noted, there are still bugs if the block provides both Page List and other blocks. I think we should merge this can create a follow up issue to consider more cases, but this will cover most scenarios so I wouldn't want to block it on other edge cases.

Copy link
Contributor

@MaggieCabrera MaggieCabrera left a comment

Choose a reason for hiding this comment

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

This is testing correctly for me, all the testing instructions were working as expected

Copy link
Member

@mikachan mikachan left a comment

Choose a reason for hiding this comment

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

I'm seeing the same as @georgeh when I test this.

  • Testing with Twenty Twenty-Three
  • Deleted all the Navigation Menus

With this PR:

  • Inserting a Navigation Block creates an empty block:

image

  • Inserting a Page List creates a 'primary' Navigation Menu on save with all my pages (which I think is correct, just confirming)

On trunk:

  • Inserting a Navigation Block creates a 'Primary' Navigation Menu without needing to save the Site Editor or any other trigger. The default page list is my top level pages only.
  • Inserting a Page List inserts a list of all my pages, but doesn't create a new menu (maybe it's updating Primary?)
  • The nav block performance seems a lot worse on trunk compared to this PR

Copy link
Contributor

@draganescu draganescu left a comment

Choose a reason for hiding this comment

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

b0b9a42 this is a lot more elegant, and fixes potential future problems as well

Excellent work and persistence 👏🏻 🙇🏻

@jasmussen
Copy link
Contributor

Thanks for the work. It's good to have a more advanced page list. As far as I can tell, this appears to work as intended — random inner blocks are saved in the post, not in the separate menu CPT, right up until you click the menu at which point a snackbar pops up:

snackbar

This is probably okay as a bugfix to mitigate a bit of an edgecase.

In general, as soon as you change properties of a navigation block, that's when it becomes a custom menu. That's where this edgecase becomes a bit more tricky, because if you don't click the nav menu, those custom inner blocks are still saved inside the nav menu, as inner blocks. They persist, and can appear as if your menu is done, saved, complete. Yet it's not persisted:
innerblocks

To be fair, to me this feels also like an edgecase, not necessarily something to optimize for. But I still wonder if there isn't an opportunity here to improve things in the longer term.

I'm unaware of the new page list block is built, technically, so I will refer to you on the details. But I keep coming back to the multi entity saving flow — the white dot added to the Save/Publish button when other entities are edited — as being a good interface for this. I understand the main blocker in using this flow for the nav block is that this only works if the entity has first been created, and simply needs to be updated, and that we can't create this entity as part of the flow. Nevertheless, if it was possible to do this, instead of actually creating a menu when uncontrolled innerblocks are detected, we wouldn't have to resort to attaching this action to click instead. Something to think about.

@getdave getdave enabled auto-merge (squash) December 6, 2022 12:51
@getdave
Copy link
Contributor Author

getdave commented Dec 6, 2022

As a follow up let's explore using whether the block is "locked" as the factor to determine whether the block's innerBlocks should be considered for having "changed". This will distinguish between blocks changed by the user and blocks changed by syncing with entities.

@getdave getdave force-pushed the fix/nav-post-creation-due-to-page-list-inner-blocks-changes branch from e68865e to ec45184 Compare December 6, 2022 13:00
@getdave getdave merged commit e69073b into trunk Dec 6, 2022
@getdave getdave deleted the fix/nav-post-creation-due-to-page-list-inner-blocks-changes branch December 6, 2022 13:27
@github-actions github-actions bot added this to the Gutenberg 14.8 milestone Dec 6, 2022
@getdave
Copy link
Contributor Author

getdave commented Dec 6, 2022

@scruffian @draganescu I added some test coverage here #46329

@getdave
Copy link
Contributor Author

getdave commented Dec 6, 2022

As a follow up let's explore using whether the block is "locked" as the factor to determine whether the block's innerBlocks should be considered for having "changed". This will distinguish between blocks changed by the user and blocks changed by syncing with entities.

Follow up Issue

mpkelly pushed a commit to mpkelly/gutenberg that referenced this pull request Dec 7, 2022
…6223)

* Add exception for page list to ignore its inner blocks

* Explain what is going on

* Only consider the first block

* Remove debugging

* Be specific in the referential equality check comments

* Ditch Lodash for Fast Deep Equal

* Use customised conditional deep equality

* Remove unnecessary let

* Add comments for context

* Fix grammar

Co-authored-by: Andrei Draganescu <[email protected]>

* Target fix to Page List only

Co-authored-by: Andrei Draganescu <[email protected]>
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 [Type] Regression Related to a regression in the latest release
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants