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

Navigation: Create nav menu on pattern insertion or when the block has uncontrolled inner blocks #36024

Merged
merged 4 commits into from
Nov 3, 2021

Conversation

talldan
Copy link
Contributor

@talldan talldan commented Oct 28, 2021

Description

Iteration on #35947

As discussed on that issue, the process of having the user manually create a menu was considered undesireable.

This PR automatically creates an untitled wp_navigation menu whenever:

  • A pattern with uncontrolled/unsaved inner blocks is inserted
  • A post/template has a navigation block with unsaved block in it already, and the editor is loaded.

An idea discussed on that issue was to automatically use the template part area to name a menu, but was pretty complicated. The template part block often doesn't store the 'area', so the code would have to get all parent template part blocks, get the entities, and then get the nearest area. Template part ids are also a weird combination of 'theme' + 'slug', which seems to be something codified in the block.

How has this been tested?

  1. Insert a pattern with a navigation block
  2. The navigation block should automatically create an unsaved entity

Screenshots

Screenshot 2021-10-28 at 1 59 23 pm

Types of changes

New feature (non-breaking change which adds functionality)

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR (please manually search all *.native.js files for terms that need renaming or removal).

@talldan talldan added [Type] Enhancement A suggestion for improvement. [Block] Navigation Affects the Navigation Block labels Oct 28, 2021
@talldan talldan self-assigned this Oct 28, 2021
@talldan
Copy link
Contributor Author

talldan commented Oct 28, 2021

A situation where there are lots of created menus is a little too easy to create IMO. Especially if the user is just trying out patterns.

I'm thinking we need a way to automatically clean up wp_navigation posts.

Maybe we can look into drafts or auto-drafts, and if the associated menu is still in draft status and the block is removed, it could be deleted? I'm thinking a draft menu also wouldn't be selectable from another instance of a nav block.

This system might be challenging though because the main entity saving flow in the editor would need to know to migrate the post status from 'draft' to 'published'.

@github-actions
Copy link

github-actions bot commented Oct 28, 2021

Size Change: +1.27 kB (0%)

Total Size: 1.08 MB

Filename Size Change
build/api-fetch/index.min.js 2.14 kB -67 B (-3%)
build/block-editor/index.min.js 136 kB +150 B (0%)
build/block-editor/style-rtl.css 14.1 kB +36 B (0%)
build/block-editor/style.css 14.1 kB +37 B (0%)
build/block-library/blocks/navigation/editor-rtl.css 1.92 kB +92 B (+5%) 🔍
build/block-library/blocks/navigation/editor.css 1.93 kB +93 B (+5%) 🔍
build/block-library/blocks/navigation/style-rtl.css 1.72 kB +3 B (0%)
build/block-library/blocks/navigation/style.css 1.7 kB +2 B (0%)
build/block-library/editor-rtl.css 9.88 kB +86 B (+1%)
build/block-library/editor.css 9.88 kB +89 B (+1%)
build/block-library/index.min.js 157 kB +582 B (0%)
build/block-library/style-rtl.css 10.5 kB +3 B (0%)
build/block-library/style.css 10.6 kB +1 B (0%)
build/components/index.min.js 212 kB -19 B (0%)
build/edit-navigation/index.min.js 15.9 kB +60 B (0%)
build/editor/index.min.js 37.8 kB +46 B (0%)
build/url/index.min.js 1.82 kB +79 B (+5%) 🔍
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 931 B
build/admin-manifest/index.min.js 1.09 kB
build/annotations/index.min.js 2.7 kB
build/autop/index.min.js 2.08 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.2 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 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 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 470 B
build/block-library/blocks/button/editor.css 470 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 309 B
build/block-library/blocks/buttons/editor.css 309 B
build/block-library/blocks/buttons/style-rtl.css 317 B
build/block-library/blocks/buttons/style.css 317 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 497 B
build/block-library/blocks/columns/style.css 496 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.17 kB
build/block-library/blocks/cover/style.css 1.17 kB
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 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 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 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 977 B
build/block-library/blocks/gallery/editor.css 982 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.59 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 159 B
build/block-library/blocks/group/editor.css 159 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 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 502 B
build/block-library/blocks/image/style.css 505 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 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 493 B
build/block-library/blocks/media-text/style.css 490 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 642 B
build/block-library/blocks/navigation-link/editor.css 642 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 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-submenu/style-rtl.css 195 B
build/block-library/blocks/navigation-submenu/style.css 195 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/view.min.js 2.74 kB
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 377 B
build/block-library/blocks/page-list/editor.css 377 B
build/block-library/blocks/page-list/style-rtl.css 198 B
build/block-library/blocks/page-list/style.css 198 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 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/style-rtl.css 347 B
build/block-library/blocks/post-comments-form/style.css 347 B
build/block-library/blocks/post-comments/style-rtl.css 492 B
build/block-library/blocks/post-comments/style.css 493 B
build/block-library/blocks/post-content/style-rtl.css 56 B
build/block-library/blocks/post-content/style.css 56 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 396 B
build/block-library/blocks/post-featured-image/editor.css 397 B
build/block-library/blocks/post-featured-image/style-rtl.css 156 B
build/block-library/blocks/post-featured-image/style.css 156 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 391 B
build/block-library/blocks/post-template/style.css 392 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 60 B
build/block-library/blocks/post-title/style.css 60 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 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 378 B
build/block-library/blocks/pullquote/style.css 378 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 262 B
build/block-library/blocks/query-pagination/editor.css 255 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 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 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 250 B
build/block-library/blocks/separator/style.css 250 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 770 B
build/block-library/blocks/site-logo/editor.css 770 B
build/block-library/blocks/site-logo/style-rtl.css 165 B
build/block-library/blocks/site-logo/style.css 165 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 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 824 B
build/block-library/blocks/social-links/editor.css 823 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB
build/block-library/blocks/social-links/style.css 1.32 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 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 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 560 B
build/block-library/blocks/template-part/editor.css 559 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 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 815 B
build/block-library/common.css 812 B
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/theme-rtl.css 668 B
build/block-library/theme.css 673 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 46 kB
build/components/style-rtl.css 15.4 kB
build/components/style.css 15.4 kB
build/compose/index.min.js 10.9 kB
build/core-data/index.min.js 12.6 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 614 B
build/data/index.min.js 7.1 kB
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 428 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.44 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29.4 kB
build/edit-post/style-rtl.css 7.12 kB
build/edit-post/style.css 7.12 kB
build/edit-site/index.min.js 30.7 kB
build/edit-site/style-rtl.css 5.79 kB
build/edit-site/style.css 5.78 kB
build/edit-widgets/index.min.js 16.4 kB
build/edit-widgets/style-rtl.css 4.17 kB
build/edit-widgets/style.css 4.18 kB
build/editor/style-rtl.css 3.78 kB
build/editor/style.css 3.77 kB
build/element/index.min.js 3.21 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 6.34 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.6 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.72 kB
build/keycodes/index.min.js 1.3 kB
build/list-reusable-blocks/index.min.js 1.85 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 845 B
build/nux/index.min.js 2.03 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.83 kB
build/primitives/index.min.js 921 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.63 kB
build/reusable-blocks/index.min.js 2.19 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.7 kB
build/server-side-render/index.min.js 1.52 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.11 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@talldan
Copy link
Contributor Author

talldan commented Oct 28, 2021

Another option could be to explore the entity having an unsaved in-memory state. Saving this via the main entity flow would publish it. It might be a longer-term solution though.

@jasmussen
Copy link
Contributor

Thanks for this. Just user experience wise, this vastly improves the experience of inserting patterns, and the fact that I can click one of the menus from the pattern and swap it out with one of my existing menus, that just shows the sheer power of what this can be:

this

That's the amazing potency of persisted menus: insert a pattern, wire it up, and you're done! And it will sync.

The downside is all the saved menus created as I'm just paging through patterns. I imagine that to be made worse as you initially set up your theme and flip through patterns using the template part pagination. Can we hold off on saving until you're actually ready to save?

@jasmussen
Copy link
Contributor

Inspired by this one, I created mockups in #35947 (comment) which all force you to save the menu in order to save the post/page.

@talldan
Copy link
Contributor Author

talldan commented Oct 28, 2021

That's the amazing potency of persisted menus: insert a pattern, wire it up, and you're done! And it will sync.

I think it could be even better if the menu were wired up from the start, which is what we could do after #36002. Patterns that are for headers could specify the 'header' area, and automatically pull in the menu the user has assigned to the header. If there's no menu assigned, the fallback would be specifying the inner blocks as we are now.

I imagine that to be made worse as you initially set up your theme and flip through patterns using the template part pagination.

If this UI uses a block preview (which I think it does), it won't create a menu until inserted.

Can we hold off on saving until you're actually ready to save?

I think possibly we can try a few things:

@talldan talldan force-pushed the try/creating-nav-menu-on-pattern-insertion branch from 54eeed2 to 868ae0a Compare October 29, 2021 11:23
@talldan
Copy link
Contributor Author

talldan commented Oct 29, 2021

Have iterated further on this with the following changes:

  • An inserted pattern now won't immediately create a wp_navigation entity, but only does so when the block is selected. This should hopefully help mitigate the huge amount of menus we were previously seeing
  • When selecting the block, the wp_navigation entity is created with a status of 'draft'. These won't show up in the 'Select menu' dropdown on other navigation blocks. We can consider it an intermediate state where this particular wp_navigation isn't fully ready.
  • When the wp_navigation is a draft, there's a save button the user can click to name the menu on the block toolbar and saving this way will 'publish' the wp_navigation post.
  • If the user bypasses that, but still saves via the main editor save button, that will also migrate the wp_navigation from draft status to published if the user has edited the menu. This bit could be open to debate. Is it needed?

There's one glitchy bit that I'd still like to fix, and that's after inserting the pattern, selecting the block causes it to momentarily disappear and reappear. That's because it's being saved asynchronously and the inner blocks are being switched from uncontrolled to controlled.

But I think this is open to more feedback, if you can just ignore that bit for now 😄

@jasmussen
Copy link
Contributor

Took it for a quick spin, this is what I see:
save as

This vastly improves the experience of using patterns, nice work.

Can we do the same for from-scratch navigation menus? Instead of having to save the menu before adding blocks to it, can it happen after the fact?
from scratch

That would be along the lines of this mockup, which adds the multi entity saving dot as soon as you click "Start empty". And so long as the dot is there, you can't leave the page until you've saved the menu.

@draganescu
Copy link
Contributor

draganescu commented Oct 29, 2021

For now, until we find a better way to auto-name (maybe once we're more clear about navigation area names?) I am in support of the naming modal. The crux is that by making naming obvious you actually empower the menu switching feature, because the user has pause to pick a name.

Automattic naming is easy on creation but impossible later, which menu is "Untitled menu 2"? I have seen enough GDrives filled with "Untitled document", enough to fear this pattern.

If there is no nudge to name menus, people will work with the defaults. People always work with the defaults. The result will be in effect we're making menus unusable instead of reusable. Auto-naming or naming on save, all good, but for now this is a good stepping stone IMO until the better options have good solutions.

@talldan talldan force-pushed the try/creating-nav-menu-on-pattern-insertion branch from 868ae0a to 37448a9 Compare November 1, 2021 08:09
@talldan
Copy link
Contributor Author

talldan commented Nov 1, 2021

There's one glitchy bit that I'd still like to fix, and that's after inserting the pattern, selecting the block causes it to momentarily disappear and reappear. That's because it's being saved asynchronously and the inner blocks are being switched from uncontrolled to controlled.

This part should be resolved now.

Comment on lines +114 to +122
if (
hasSavedUnsavedInnerBlocks ||
isDisabled ||
isSaving ||
savingLock.current ||
! hasResolvedDraftNavigationMenus ||
! hasResolvedNavigationMenus ||
! hasSelection
) {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

I find the amount that's going on here a bit bonkers, but I don't have another solution. There's some extreme care needed to ensure the menus are only created once.

Fix issues with multiple menu creation

Lift limit on loading of menus

Remove attempt to use template part area to generate a name

Remove unused client id prop

Try creating as auto-draft and publishing on save

Only save when selecting menu

Show a draft save button on the block toolbar

Show loading state when navigation block first loads

Remove flicker when selecting block with unsaved inner blocks

Polish switch to controlled inner blocks

Take drafts into account when naming menus

Fix repeated line
@talldan talldan force-pushed the try/creating-nav-menu-on-pattern-insertion branch from 4b06da7 to 86d3e43 Compare November 1, 2021 09:35
Copy link
Contributor

@tellthemachines tellthemachines 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 working well!

Looks like packages/block-library/src/navigation/edit/use-unsaved-inner-blocks.js should be removed as it's empty.

packages/block-library/src/navigation/editor.scss Outdated Show resolved Hide resolved
@draganescu
Copy link
Contributor

This works very well in my testing. The one part that I found weird was that the auto saved menu was a "draft" but it was rendered on the front end anyway. As @talldan explained this is due to the fact that it's invisible to the user from the UI that the navigation is a draft, so a user would expect to see it renderd on the front end.

The question then becomes if "draft" is a good status? Maybe a custom status would do better, as draft should be unpublished.

@talldan
Copy link
Contributor Author

talldan commented Nov 2, 2021

The question then becomes if "draft" is a good status? Maybe a custom status would do better, as draft should be unpublished.

Not sure what the options are here, but it seems there's no other post status that represents public, but not published.

It seems like this would entail a new built-in WordPress post status, something like 'auto-generated' 😬

Or potentially we could use a different mechanism other than status.

@tellthemachines
Copy link
Contributor

One thing I'm noticing is there always seem to be unsaved changes in the Site Editor in this branch. Not sure if it's due to these changes, or some other issue that has since been fixed on trunk.

@talldan
Copy link
Contributor Author

talldan commented Nov 3, 2021

One thing I'm noticing is there always seem to be unsaved changes in the Site Editor in this branch. Not sure if it's due to these changes, or some other issue that has since been fixed on trunk.

@tellthemachines What are the steps to reproduce?

@tellthemachines
Copy link
Contributor

Testing more methodically I now realise the unsaved changes only happen if an unsaved nav block is selected. So steps are:

  1. Open the site editor on a template with an unsaved nav block (I used one of the Twenty Twenty Two headers)
  2. Click on the nav block to select it, but don't do anything further with it
  3. Verify the "Save" button is now enabled

The above behaviour is specific to this branch - probably because the nav is being saved as a draft behind the scenes?

But I'm seeing another save-related issue on trunk:

  1. Make any change to a template in the Site Editor and save it
  2. Save button is still enabled after changes have been saved
  3. Refresh page; changes are lost

@talldan
Copy link
Contributor Author

talldan commented Nov 3, 2021

Testing more methodically I now realise the unsaved changes only happen if an unsaved nav block is selected. So steps are:

  1. Open the site editor on a template with an unsaved nav block (I used one of the Twenty Twenty Two headers)
  2. Click on the nav block to select it, but don't do anything further with it
  3. Verify the "Save" button is now enabled

That is to be expected, since clicking into the nav block creates a wp_navigation post and updates the navigationMenuId attribute of the navigation block to that post's id. It's the consequence of this approach of automatically creating menus.

An improvement might be to create the post when the user makes an edit, but I'm yet to find a good way to do that. I can look into it some more, but I don't think it should be a blocker.

Copy link
Contributor

@tellthemachines tellthemachines left a comment

Choose a reason for hiding this comment

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

Approving as it's working well and improves the experience. I think it's worth getting this in and then iterating further.

@draganescu draganescu merged commit 92f75c1 into trunk Nov 3, 2021
@draganescu draganescu deleted the try/creating-nav-menu-on-pattern-insertion branch November 3, 2021 07:32
@github-actions github-actions bot added this to the Gutenberg 11.9 milestone Nov 3, 2021
@andrewserong andrewserong changed the title Try creating nav menu on pattern insertion or when the block has uncontrolled inner blocks Navigation: Create nav menu on pattern insertion or when the block has uncontrolled inner blocks Nov 5, 2021
hasSelection={ isSelected || isInnerBlockSelected }
hasSavedUnsavedInnerBlocks={ hasSavedUnsavedInnerBlocks }
onSave={ ( post ) => {
setHasSavedUnsavedInnerBlocks( true );
Copy link
Contributor

Choose a reason for hiding this comment

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

Where do we reset the value of this flag? Aren't we supposed to reset it somewhere to "false"?

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] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants