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

Allow insertion of elements before and after a block, when the default block is not supported in the parent container #29490

Closed
wants to merge 1 commit into from

Conversation

gwwar
Copy link
Contributor

@gwwar gwwar commented Mar 2, 2021

Fixes #23603 where we'd like to insert additional links in navigation links before and after items.

In trunk, "insert before"/"insert after" is only allowed when a parent block supports insertion of the default block (typically this is a paragraph block).

Proposed changes here add a __experimentalDefaultBlock option to block list settings. If this is set, we can choose a different default block in allowedBlocks for that parent container.

Changes also includes adding defaults for:

  • Buttons
  • Social Links
  • Navigation

If folks like this approach, I can add an e2e test in a follow up. See #29543

Before After
Screen Shot 2021-03-03 at 6 35 48 PM Screen Shot 2021-03-03 at 6 36 43 PM
defaultinsert.mp4

Testing Instructions

  • Checkout this branch on a local instance of your choice. Leave a comment if folks need more detailed instructions
  • Add a navigation block
  • Add a navigation item
  • Click on the three dots
  • Click on insert before
  • A new link should be inserted before the selected block
  • Click on insert after
  • A new link should be inserted after the selected block
  • No regressions when using "insert before" or "insert after" in other containers.

@github-actions
Copy link

github-actions bot commented Mar 2, 2021

Size Change: +148 B (0%)

Total Size: 1.06 MB

Filename Size Change
build/block-editor/index.min.js 134 kB +111 B (0%)
build/block-library/index.min.js 147 kB +37 B (0%)
ℹ️ 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/api-fetch/index.min.js 2.19 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-editor/style-rtl.css 13.9 kB
build/block-editor/style.css 13.8 kB
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 474 B
build/block-library/blocks/button/editor.css 474 B
build/block-library/blocks/button/style-rtl.css 600 B
build/block-library/blocks/button/style.css 600 B
build/block-library/blocks/buttons/editor-rtl.css 315 B
build/block-library/blocks/buttons/editor.css 315 B
build/block-library/blocks/buttons/style-rtl.css 370 B
build/block-library/blocks/buttons/style.css 370 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 666 B
build/block-library/blocks/cover/editor.css 670 B
build/block-library/blocks/cover/style-rtl.css 1.23 kB
build/block-library/blocks/cover/style.css 1.23 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 983 B
build/block-library/blocks/gallery/editor.css 988 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 728 B
build/block-library/blocks/image/editor.css 728 B
build/block-library/blocks/image/style-rtl.css 482 B
build/block-library/blocks/image/style.css 487 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 488 B
build/block-library/blocks/media-text/style.css 485 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 568 B
build/block-library/blocks/navigation-link/editor.css 570 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 300 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/editor-rtl.css 1.72 kB
build/block-library/blocks/navigation/editor.css 1.72 kB
build/block-library/blocks/navigation/style-rtl.css 1.5 kB
build/block-library/blocks/navigation/style.css 1.49 kB
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 202 B
build/block-library/blocks/page-list/style.css 202 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/editor-rtl.css 210 B
build/block-library/blocks/post-author/editor.css 210 B
build/block-library/blocks/post-author/style-rtl.css 182 B
build/block-library/blocks/post-author/style.css 181 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B
build/block-library/blocks/post-comments-form/style.css 140 B
build/block-library/blocks/post-comments/style-rtl.css 360 B
build/block-library/blocks/post-comments/style.css 359 B
build/block-library/blocks/post-content/editor-rtl.css 138 B
build/block-library/blocks/post-content/editor.css 138 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 398 B
build/block-library/blocks/post-featured-image/editor.css 398 B
build/block-library/blocks/post-featured-image/style-rtl.css 143 B
build/block-library/blocks/post-featured-image/style.css 143 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 378 B
build/block-library/blocks/post-template/style.css 379 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-title/editor-rtl.css 85 B
build/block-library/blocks/query-title/editor.css 85 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 220 B
build/block-library/blocks/quote/theme.css 222 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 374 B
build/block-library/blocks/search/style.css 375 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 462 B
build/block-library/blocks/site-logo/editor.css 464 B
build/block-library/blocks/site-logo/style-rtl.css 153 B
build/block-library/blocks/site-logo/style.css 153 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 165 B
build/block-library/blocks/social-link/editor.css 165 B
build/block-library/blocks/social-links/editor-rtl.css 812 B
build/block-library/blocks/social-links/editor.css 811 B
build/block-library/blocks/social-links/style-rtl.css 1.3 kB
build/block-library/blocks/social-links/style.css 1.3 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 636 B
build/block-library/blocks/template-part/editor.css 635 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/term-description/editor-rtl.css 90 B
build/block-library/blocks/term-description/editor.css 90 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 853 B
build/block-library/common.css 849 B
build/block-library/editor-rtl.css 9.76 kB
build/block-library/editor.css 9.75 kB
build/block-library/reset-rtl.css 527 B
build/block-library/reset.css 527 B
build/block-library/style-rtl.css 10.3 kB
build/block-library/style.css 10.3 kB
build/block-library/theme-rtl.css 665 B
build/block-library/theme.css 669 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 47 kB
build/components/index.min.js 210 kB
build/components/style-rtl.css 15.9 kB
build/components/style.css 15.9 kB
build/compose/index.min.js 10.3 kB
build/core-data/index.min.js 12.3 kB
build/customize-widgets/index.min.js 11.1 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.45 kB
build/edit-navigation/index.min.js 15 kB
build/edit-navigation/style-rtl.css 3.69 kB
build/edit-navigation/style.css 3.69 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 28.9 kB
build/edit-post/style-rtl.css 7.18 kB
build/edit-post/style.css 7.17 kB
build/edit-site/index.min.js 27.4 kB
build/edit-site/style-rtl.css 5.21 kB
build/edit-site/style.css 5.21 kB
build/edit-widgets/index.min.js 16.1 kB
build/edit-widgets/style-rtl.css 4.09 kB
build/edit-widgets/style.css 4.09 kB
build/editor/index.min.js 37.7 kB
build/editor/style-rtl.css 3.76 kB
build/editor/style.css 3.75 kB
build/element/index.min.js 3.17 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 5.34 kB
build/format-library/style-rtl.css 668 B
build/format-library/style.css 670 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.88 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.28 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.6 kB
build/server-side-render/index.min.js 1.42 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/url/index.min.js 1.74 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.27 kB
build/widgets/style-rtl.css 1.17 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@gwwar gwwar force-pushed the add/navigation-insert-before-after branch from db1b5ab to fd6bb5f Compare March 3, 2021 18:31
@gwwar gwwar marked this pull request as ready for review March 4, 2021 02:40
@talldan talldan added [Feature] Blocks Overall functionality of blocks [Type] Enhancement A suggestion for improvement. labels Mar 4, 2021
Copy link
Contributor

@talldan talldan left a comment

Choose a reason for hiding this comment

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

It's cool to see this working! Buttons and Social Links would also benefit from the feature, that might be something to consider adding to the PR.

packages/block-editor/src/store/actions.js Outdated Show resolved Hide resolved
packages/block-editor/src/store/selectors.js Outdated Show resolved Hide resolved
@gwwar gwwar force-pushed the add/navigation-insert-before-after branch from dc9cbc6 to 5274a89 Compare March 5, 2021 16:46
@gwwar
Copy link
Contributor Author

gwwar commented Mar 5, 2021

Thanks for the great review @talldan! The summary has been updated with new behavior changes. I tried applying new block defaults to buttons and social links too. Buttons works well, but I noticed that social links in trunk doesn't allow for a variation transform.

I played around with social links variation transforms in 7e7c82a but it feels a little awkward. I think we might want to leave enabling this for social icons in a follow up PR.

social-link-variations.mp4

cc @jasmussen not urgent, but if you wanted to 🤔 about the many variations case.

@ZebulanStanphill
Copy link
Member

ZebulanStanphill commented Mar 5, 2021

With regard to the many-variations-issue, maybe clicking the menu items should open the same block library pop-up that the sibling inserter uses?

@talldan
Copy link
Contributor

talldan commented Mar 8, 2021

Good point about Social Icons, I didn't think about that.

Definitely not a blocker, this PR can ship without the social icons changes since it's a really good improvement for Buttons and Navigation.

The social icons part could be moved to a separate issue/PR.

@jasmussen
Copy link
Contributor

cc @jasmussen not urgent, but if you wanted to 🤔 about the many variations case.

Nice work. This is what I see:

nav

Yep, the variations issue is a challenge. As you can see in this GIF I start by inserting 2 page links, i.e. this:

Screenshot 2021-03-08 at 08 19 49

but the before/after controls only allow the insertion of "links", i.e. this:

Screenshot 2021-03-08 at 08 19 53

I know the difference is subtle, and the latter allows linking to the former type. But given it's a challenge we need to tackle for the social links block, it might be worth tackling here.

Zebulan mentions it. Perhaps we need to show the quick inserter when choosing the before/after options (when there are more than 1 options to insert). It seems like we might be able to leverage the vertical sibling inserter pattern for this:

buttons

That is, not necessarily use the same component, but the blue line that shows up in the margin between horizontal blocks, it could show up as an anchorpoint for the block library. As in: when you click the "insert before" menu item, it will be as if you clicked the sibling inserter between the two items. Does that make sense?

Note, the vertical sibling inserter doesn't work in the navigation menu item quite yet, that's a separate issue (#28833).

@gwwar gwwar force-pushed the add/navigation-insert-before-after branch from 7e7c82a to 3e97524 Compare March 8, 2021 17:01
@gwwar
Copy link
Contributor Author

gwwar commented Mar 8, 2021

The vertical inserter looks pretty promising @jasmussen @ZebulanStanphill.

How would folks feel about me enabling this for just buttons and navigation, and I can immediately follow up on the variations+vertical inserter case. I'm a fan of having multiple ways of doing something, so I think this is still a good improvement. cc @talldan

@jasmussen
Copy link
Contributor

How would folks feel about me enabling this for just buttons and navigation

The current behavior where it only inserts a single variation? Could probably be a fine start, but I'd default to "Page Link" rather than "Link" as it does now, if you can.

@gwwar
Copy link
Contributor Author

gwwar commented Mar 8, 2021

Could probably be a fine start, but I'd default to "Page Link" rather than "Link" as it does now, if you can.

🤔 This one is a little interesting since a page link is a block variation of the navigation link, rather than a block.

So instead of passing a string we might send an array, similar to block-templates:

__experimentalDefaultBlock: [ 'core/navigation-link', { type: 'page' } ],

Currently insertAfterBlock and insertBeforeBlock do not pass through any block attributes, so I'll need to also update the function signatures.

export function* insertAfterBlock( clientId ) {

Happy to explore passing through block attributes too, if folks think we'll use this.

@jasmussen
Copy link
Contributor

Happy to explore passing through block attributes too, if folks think we'll use this.

The inserter has a heuristic where if only a single block is available to insert, such as inside Buttons, it skips the popover menu and just inserts that one allowed block directly. It makes perfect sense to pair this "insert before" with Buttons for that reason: it's totally obvious what you're inserting, because it can only be a Button.

In the case of the Navigation block, it's not obvious. It could be one of the menu item blocks, it could be "Page List", it could be social links, or search. And you can't really transform one into the other after the fact.

So it seems we probably need that block library to open in that before-slot, as if you'd clicked the vertical sibling inserter. Though it seems fine to keep the PR small and default to our "best guess" for what you want to insert (probably a page link), but we'd want to follow up on that, I'd think.

@gwwar gwwar force-pushed the add/navigation-insert-before-after branch 5 times, most recently from 4e5f6e4 to f9c6287 Compare March 16, 2021 18:47
@gwwar
Copy link
Contributor Author

gwwar commented Mar 16, 2021

cc @jasmussen @talldan @ZebulanStanphill

Do folks have preferences on which approach to explore further? I think adding __experimentalDefaultBlock, is pretty promising in either case. So we might want to try landing this, before spinning up a follow up PR. Do folks have any concerns about __experimentalDefaultBlock that I should iterate on?

Besides that, the main feedback I'm looking for is if something like adding an editor only block, like core/placeholder is worth it for this case, or if I should try and keep state in the editor.

Update __experimentalDefaultBlock to pass through block attributes

In f9c6287 I updated __experimentalDefaultBlock to also allow passing through of block attributes:

This lets us do things like insert a page link vs a generic link.

navigationpageinsert.mp4

Experiment with hijacking insertion place inserter

Basic idea on this approach is to force the insertion point inserter to open the QuickInserter on "insertBefore/insertAfter"

I didn't explore this too far. I could maybe get this working, but it felt really buggy. Some issues

  • Since the user didn't click on a +, there's no context on where this will appear.
  • We recalculate the insertion point on hover of the block list.
  • Focus issues (since we're clicking on block options)

Experiment with leaving a placeholder

I also did a very rough experiment in 4e5f6e4 that lets us add a placeholder block to retain space, and pick a block to replace itself at a later time. (This doesn't render anything on the published view).

The inserter code is pretty tangled together, so I opted to just punch a hole through to see how this feels. Everything on that commit is throw away. 🙈

Some problems that stand out from this:

  • All appenders usually belong to the InnerBlocks list, rendered after the block list.
  • If we like this idea, the 'core/placeholder' block would ideally provide markup for the Dropdown component in renderToggle.
  • To start we also probably want to be able to insert this placeholder block via commands, but not see it in the inserter.
  • Insertion Point Inserter logic is really meshed together with the Quick Inserter and Search Results. If we really like this I could decouple this from the quick inserter and let it render something itself, kind of how we do with the RichText autocompleter for the / inserter.
PoC.mp4

@gwwar
Copy link
Contributor Author

gwwar commented Mar 16, 2021

🤔 I can also explore setting some internal state on the block list for showing an inserter.

@gwwar
Copy link
Contributor Author

gwwar commented Mar 16, 2021

Just pushed up a half example of the "show more" case. The inline quick inserter part is a bit trickier, but I'll maybe try this approach again. There's a good amount of component nesting for the inserter, so the smallest solution here will likely involve adding block-editor store actions.

more.mp4

@jasmussen
Copy link
Contributor

This is cool work, thanks for the hard work. I think both the proof of concept in #29490 (comment) and the smaller solution in #29490 (comment) can work, the latter perhaps more as an interim.

That said, it seems like this is a complicated and difficult task, which while something we need to address, is perhaps not as high a priority as the others on the tracking issue (#27593), so I've lowered the priority there. So in case this keeps being a headache, I'd personally think think it'd be fine to shelve it for a bit and grab other tasks.

@talldan
Copy link
Contributor

talldan commented Mar 17, 2021

The different experiments are really great to see in action.

For __experimentalDefaultBlock it seems mostly useful on Buttons where there's only one type of block allowed. Which leads me to think that this setting is probably not needed. The only allowed block could be inserted, as is the case when clicking the normal appender button. That might be a quicker first step to implement, sorry that it's a bit of a u-turn on the original direction!

For the other cases (navigation and social) where there might be multiple blocks/variations I also like the idea of showing the inserter menu (whether the full menu or the quick inserter), though from what you say, seems like a longer term option.

@talldan
Copy link
Contributor

talldan commented Mar 17, 2021

Something else I just spotted. The 'Insert Submenu' button for the Nav Link block suffers from a similar issue. It just inserts the default Link block as a child.

@gwwar
Copy link
Contributor Author

gwwar commented Mar 17, 2021

it seems like this is a complicated and difficult task, which while something we need to address, is perhaps not as high a priority as the others on the tracking issue

@jasmussen agreed!

For __experimentalDefaultBlock ... Which leads me to think that this setting is probably not needed.

Thanks @talldan I'm starting to come around to this idea too, especially if we choose not to go with a placeholder block approach. The scope of the inserter approach is a bit bigger to explore, so I'll return to this one after we close out a few of the more urgent Navigation issues.

This has been a fun exploration, I have certainly learned a lot more about the block list and inserter!

Setting this one back to draft, but other folks are welcome to take this on earlier in the meantime.

@gwwar
Copy link
Contributor Author

gwwar commented Jul 9, 2021

closing this for now

@gwwar gwwar closed this Jul 9, 2021
@gwwar gwwar deleted the add/navigation-insert-before-after branch September 20, 2021 16:20
@gwwar gwwar restored the add/navigation-insert-before-after branch September 21, 2021 20:59
@gwwar gwwar reopened this Sep 21, 2021
…w insertion of elements before and after a block, when the default block is not supported in the parent container.
@gwwar gwwar force-pushed the add/navigation-insert-before-after branch from 4628bb5 to d283507 Compare September 21, 2021 22:04
@tellthemachines
Copy link
Contributor

In working through #34899 I tried default inserting a Page Link block in the Navigation. The problem is that Page Link limits the links we can insert to pages, which, while it might be the majority of cases, will be very frustrating if we're looking for something else. Whereas if we insert a default Link block, the search brings up everything: pages, posts, categories, and also allows us to insert a custom link.

I think we have the same situation here, and given that in #35056 we're also looking at reducing the exposure of different link variations, and in #34899 we're looking at simplifying the flow for inserting Nav links, it makes sense to insert a default Nav link here instead of going for the quick inserter. We could possibly tweak the suggestions in the link control to prioritise pages, but being able to search for any entity makes it much more flexible.

The Social Icons problem is a bit different from Navigation, because there we don't expose a default icon type that allows us to search for any social link; we only show the different link variations. This makes sense, because unlike nav links where any old URL and label combination is valid, social networks are a limited set of items; we can't make one up. So if we were to enable insert before/after for Social Icons, it would probably be best to pop up the quick inserter in place instead of inserting a link directly.

Imo, the benefit of doing this for Social icons might not be worth the extra work, because it's super easy to just append an icon to the end of the block and then use the move buttons to place it elsewhere. In any case, we can leave them for later 🙂

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Blocks Overall functionality of blocks [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Make the 'Insert Before' / 'Insert After' options work for block lists that don't allow the default block type
5 participants