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

Block bindings: UI for connecting bindings #62880

Merged
merged 81 commits into from
Jul 30, 2024

Conversation

cbravobernal
Copy link
Contributor

@cbravobernal cbravobernal commented Jun 26, 2024

What?

Closes #62944

This PR adds the capability of connecting attributes with custom fields via block bindings. Previously, the only way to do it was by updating the post content via the code editor.

The PR uses the Tool Item component to show and enable different attributes per block, and Dropdown components to select the post meta that will be attached.

The block bindings code has been moved to the editor package, as it will fetch post meta data, that should not be a dependency in the block-editor library. While this feature is per block, it uses general information from the editor.

There is a list of follow ups to this work, but I don't want the PR to get bigger and harder to review:

  • Move getters and setters to an useFunction. It will need to use some hooks for accesing the block store, so moving to an utils folder is not enough.
  • Extract an API to add different sources. Still needs planning, but extenders needs to add their own sources to the list. ACF or Pods are good examples.
  • Avoid custom CSS as much as possible. Tool Item component may have a helper attribute so we avoid adding plain HTMl. Adding an option for items to remove their margins, without having to tweak borders. Pinging @WordPress/gutenberg-components for feedback about this.
  • Make this option work on templates (site editor). Right now is only working with real content. Creating layouts with custom fields is a great feature for block bindings.
  • Improve e2e testing. Adding happy paths for removing attributes and adding attributes in Button, Heading and Image blocks.
  • Prevent bindings panel from moving by creating a custom group/slot for it.
  • Review image URL attribute binding. It seems that is not removing correctly from the markup.
  • Change openDocumentSettingsSidebar to only open the settings sidebar, and create an openDocumentStylesSidebar option. I had to update some tests that were assuming that, if there are no settings for paragraph, the style editor should open by default.
  • Address design feedback.
  • Removing the width CSS to the minimum makes icons get smaller.

How to test

Register post meta sources.

register_meta(
		'post',
		'pokemon_image',
		array(
			'show_in_rest'      => true,
			'single'            => true,
			'type'              => 'string',
			'default'           => 'https://www.pokemon.com/static-assets/content-assets/cms2/img/pokedex/full/006.png',
		)
	);

Use the UI to link them to paragraphs, buttons, images and headings.

Screen.Recording.2024-07-18.at.16.22.20.mov

Screenshot

Screenshot 2024-07-18 at 16 22 11
Copy link

github-actions bot commented Jun 26, 2024

Size Change: +3.24 kB (+0.18%)

Total Size: 1.76 MB

Filename Size Change
build/block-editor/index.min.js 255 kB +780 B (+0.31%)
build/block-editor/style-rtl.css 16.3 kB +115 B (+0.71%)
build/block-editor/style.css 16.3 kB +115 B (+0.71%)
build/block-library/blocks/gallery/editor-rtl.css 955 B -3 B (-0.31%)
build/block-library/blocks/gallery/editor.css 958 B -4 B (-0.42%)
build/block-library/blocks/latest-posts/editor-rtl.css 186 B -18 B (-8.82%)
build/block-library/blocks/latest-posts/editor.css 183 B -21 B (-10.29%) 👏
build/block-library/blocks/post-excerpt/style-rtl.css 155 B +14 B (+9.93%) ⚠️
build/block-library/blocks/post-excerpt/style.css 155 B +14 B (+9.93%) ⚠️
build/block-library/blocks/site-title/style-rtl.css 90 B +19 B (+26.76%) 🚨
build/block-library/blocks/site-title/style.css 90 B +19 B (+26.76%) 🚨
build/block-library/blocks/video/editor-rtl.css 541 B -12 B (-2.17%)
build/block-library/blocks/video/editor.css 542 B -12 B (-2.17%)
build/block-library/editor-rtl.css 11.9 kB +13 B (+0.11%)
build/block-library/editor.css 11.9 kB +13 B (+0.11%)
build/block-library/index.min.js 217 kB +497 B (+0.23%)
build/block-library/style-rtl.css 14.7 kB +28 B (+0.19%)
build/block-library/style.css 14.7 kB +27 B (+0.18%)
build/blocks/index.min.js 52.3 kB +30 B (+0.06%)
build/components/index.min.js 222 kB +75 B (+0.03%)
build/components/style-rtl.css 12 kB +7 B (+0.06%)
build/components/style.css 12 kB +6 B (+0.05%)
build/core-data/index.min.js 73.1 kB +234 B (+0.32%)
build/edit-site/index.min.js 214 kB +581 B (+0.27%)
build/edit-site/posts-rtl.css 6.8 kB +18 B (+0.27%)
build/edit-site/posts.css 6.81 kB +14 B (+0.21%)
build/edit-site/style-rtl.css 12 kB +19 B (+0.16%)
build/edit-site/style.css 12 kB +17 B (+0.14%)
build/editor/index.min.js 99.7 kB +284 B (+0.29%)
build/editor/style-rtl.css 9.32 kB +5 B (+0.05%)
build/editor/style.css 9.32 kB +1 B (+0.01%)
build/format-library/index.min.js 8.07 kB +3 B (+0.04%)
build/format-library/style-rtl.css 477 B -29 B (-5.73%)
build/format-library/style.css 477 B -28 B (-5.54%)
build/interactivity/image.min.js 1.78 kB -1 B (-0.06%)
build/block-library/blocks/site-tagline/style-rtl.css 65 B +65 B (new file) 🆕
build/block-library/blocks/site-tagline/style.css 65 B +65 B (new file) 🆕
build/block-library/blocks/table-of-contents/style-rtl.css 83 B +83 B (new file) 🆕
build/block-library/blocks/table-of-contents/style.css 83 B +83 B (new file) 🆕
build/block-library/blocks/tag-cloud/editor-rtl.css 63 B +63 B (new file) 🆕
build/block-library/blocks/tag-cloud/editor.css 63 B +63 B (new file) 🆕
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 951 B
build/annotations/index.min.js 2.26 kB
build/api-fetch/index.min.js 2.31 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
build/block-directory/index.min.js 7.29 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/content-rtl.css 4.59 kB
build/block-editor/content.css 4.59 kB
build/block-editor/default-editor-styles-rtl.css 394 B
build/block-editor/default-editor-styles.css 394 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 149 B
build/block-library/blocks/audio/editor.css 151 B
build/block-library/blocks/audio/style-rtl.css 132 B
build/block-library/blocks/audio/style.css 132 B
build/block-library/blocks/audio/theme-rtl.css 134 B
build/block-library/blocks/audio/theme.css 134 B
build/block-library/blocks/avatar/editor-rtl.css 115 B
build/block-library/blocks/avatar/editor.css 115 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/button/editor-rtl.css 310 B
build/block-library/blocks/button/editor.css 310 B
build/block-library/blocks/button/style-rtl.css 538 B
build/block-library/blocks/button/style.css 538 B
build/block-library/blocks/buttons/editor-rtl.css 336 B
build/block-library/blocks/buttons/editor.css 336 B
build/block-library/blocks/buttons/style-rtl.css 328 B
build/block-library/blocks/buttons/style.css 328 B
build/block-library/blocks/calendar/style-rtl.css 240 B
build/block-library/blocks/calendar/style.css 240 B
build/block-library/blocks/categories/editor-rtl.css 132 B
build/block-library/blocks/categories/editor.css 131 B
build/block-library/blocks/categories/style-rtl.css 152 B
build/block-library/blocks/categories/style.css 152 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 122 B
build/block-library/blocks/code/theme.css 122 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 420 B
build/block-library/blocks/columns/style.css 420 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 124 B
build/block-library/blocks/comment-author-avatar/editor.css 124 B
build/block-library/blocks/comment-content/style-rtl.css 90 B
build/block-library/blocks/comment-content/style.css 90 B
build/block-library/blocks/comment-template/style-rtl.css 200 B
build/block-library/blocks/comment-template/style.css 199 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 221 B
build/block-library/blocks/comments-pagination/editor.css 211 B
build/block-library/blocks/comments-pagination/style-rtl.css 234 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 832 B
build/block-library/blocks/comments/editor.css 832 B
build/block-library/blocks/comments/style-rtl.css 632 B
build/block-library/blocks/comments/style.css 631 B
build/block-library/blocks/cover/editor-rtl.css 668 B
build/block-library/blocks/cover/editor.css 669 B
build/block-library/blocks/cover/style-rtl.css 1.62 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 86 B
build/block-library/blocks/details/style.css 86 B
build/block-library/blocks/embed/editor-rtl.css 314 B
build/block-library/blocks/embed/editor.css 314 B
build/block-library/blocks/embed/style-rtl.css 419 B
build/block-library/blocks/embed/style.css 419 B
build/block-library/blocks/embed/theme-rtl.css 133 B
build/block-library/blocks/embed/theme.css 133 B
build/block-library/blocks/file/editor-rtl.css 326 B
build/block-library/blocks/file/editor.css 326 B
build/block-library/blocks/file/style-rtl.css 278 B
build/block-library/blocks/file/style.css 279 B
build/block-library/blocks/file/view.min.js 324 B
build/block-library/blocks/footnotes/style-rtl.css 198 B
build/block-library/blocks/footnotes/style.css 197 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 229 B
build/block-library/blocks/form-input/style-rtl.css 342 B
build/block-library/blocks/form-input/style.css 342 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 344 B
build/block-library/blocks/form-submission-notification/editor.css 341 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/form/view.min.js 470 B
build/block-library/blocks/freeform/editor-rtl.css 2.6 kB
build/block-library/blocks/freeform/editor.css 2.6 kB
build/block-library/blocks/gallery/style-rtl.css 1.71 kB
build/block-library/blocks/gallery/style.css 1.71 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 402 B
build/block-library/blocks/group/editor.css 402 B
build/block-library/blocks/group/style-rtl.css 103 B
build/block-library/blocks/group/style.css 103 B
build/block-library/blocks/group/theme-rtl.css 79 B
build/block-library/blocks/group/theme.css 79 B
build/block-library/blocks/heading/style-rtl.css 188 B
build/block-library/blocks/heading/style.css 188 B
build/block-library/blocks/html/editor-rtl.css 346 B
build/block-library/blocks/html/editor.css 347 B
build/block-library/blocks/image/editor-rtl.css 862 B
build/block-library/blocks/image/editor.css 861 B
build/block-library/blocks/image/style-rtl.css 1.59 kB
build/block-library/blocks/image/style.css 1.59 kB
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/image/view.min.js 1.65 kB
build/block-library/blocks/latest-comments/style-rtl.css 355 B
build/block-library/blocks/latest-comments/style.css 354 B
build/block-library/blocks/latest-posts/style-rtl.css 509 B
build/block-library/blocks/latest-posts/style.css 510 B
build/block-library/blocks/list/style-rtl.css 107 B
build/block-library/blocks/list/style.css 107 B
build/block-library/blocks/media-text/editor-rtl.css 304 B
build/block-library/blocks/media-text/editor.css 303 B
build/block-library/blocks/media-text/style-rtl.css 516 B
build/block-library/blocks/media-text/style.css 515 B
build/block-library/blocks/more/editor-rtl.css 427 B
build/block-library/blocks/more/editor.css 427 B
build/block-library/blocks/navigation-link/editor-rtl.css 663 B
build/block-library/blocks/navigation-link/editor.css 664 B
build/block-library/blocks/navigation-link/style-rtl.css 192 B
build/block-library/blocks/navigation-link/style.css 191 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 295 B
build/block-library/blocks/navigation-submenu/editor.css 294 B
build/block-library/blocks/navigation/editor-rtl.css 2.2 kB
build/block-library/blocks/navigation/editor.css 2.21 kB
build/block-library/blocks/navigation/style-rtl.css 2.25 kB
build/block-library/blocks/navigation/style.css 2.23 kB
build/block-library/blocks/navigation/view.min.js 1.03 kB
build/block-library/blocks/nextpage/editor-rtl.css 392 B
build/block-library/blocks/nextpage/editor.css 392 B
build/block-library/blocks/page-list/editor-rtl.css 378 B
build/block-library/blocks/page-list/editor.css 378 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 236 B
build/block-library/blocks/paragraph/editor.css 236 B
build/block-library/blocks/paragraph/style-rtl.css 341 B
build/block-library/blocks/paragraph/style.css 340 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 527 B
build/block-library/blocks/post-comments-form/style.css 528 B
build/block-library/blocks/post-content/editor-rtl.css 74 B
build/block-library/blocks/post-content/editor.css 74 B
build/block-library/blocks/post-date/style-rtl.css 62 B
build/block-library/blocks/post-date/style.css 62 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-featured-image/editor-rtl.css 729 B
build/block-library/blocks/post-featured-image/editor.css 726 B
build/block-library/blocks/post-featured-image/style-rtl.css 341 B
build/block-library/blocks/post-featured-image/style.css 341 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 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 399 B
build/block-library/blocks/post-template/style.css 398 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 70 B
build/block-library/blocks/post-time-to-read/style.css 70 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 134 B
build/block-library/blocks/pullquote/editor.css 134 B
build/block-library/blocks/pullquote/style-rtl.css 342 B
build/block-library/blocks/pullquote/style.css 342 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 121 B
build/block-library/blocks/query-pagination-numbers/editor.css 118 B
build/block-library/blocks/query-pagination/editor-rtl.css 220 B
build/block-library/blocks/query-pagination/editor.css 208 B
build/block-library/blocks/query-pagination/style-rtl.css 287 B
build/block-library/blocks/query-pagination/style.css 283 B
build/block-library/blocks/query-title/style-rtl.css 64 B
build/block-library/blocks/query-title/style.css 64 B
build/block-library/blocks/query/editor-rtl.css 452 B
build/block-library/blocks/query/editor.css 451 B
build/block-library/blocks/query/view.min.js 958 B
build/block-library/blocks/quote/style-rtl.css 238 B
build/block-library/blocks/quote/style.css 238 B
build/block-library/blocks/quote/theme-rtl.css 221 B
build/block-library/blocks/quote/theme.css 225 B
build/block-library/blocks/read-more/style-rtl.css 138 B
build/block-library/blocks/read-more/style.css 138 B
build/block-library/blocks/rss/editor-rtl.css 101 B
build/block-library/blocks/rss/editor.css 101 B
build/block-library/blocks/rss/style-rtl.css 288 B
build/block-library/blocks/rss/style.css 287 B
build/block-library/blocks/search/editor-rtl.css 193 B
build/block-library/blocks/search/editor.css 193 B
build/block-library/blocks/search/style-rtl.css 672 B
build/block-library/blocks/search/style.css 671 B
build/block-library/blocks/search/theme-rtl.css 113 B
build/block-library/blocks/search/theme.css 113 B
build/block-library/blocks/search/view.min.js 475 B
build/block-library/blocks/separator/editor-rtl.css 100 B
build/block-library/blocks/separator/editor.css 100 B
build/block-library/blocks/separator/style-rtl.css 248 B
build/block-library/blocks/separator/style.css 248 B
build/block-library/blocks/separator/theme-rtl.css 195 B
build/block-library/blocks/separator/theme.css 195 B
build/block-library/blocks/shortcode/editor-rtl.css 286 B
build/block-library/blocks/shortcode/editor.css 286 B
build/block-library/blocks/site-logo/editor-rtl.css 806 B
build/block-library/blocks/site-logo/editor.css 803 B
build/block-library/blocks/site-logo/style-rtl.css 218 B
build/block-library/blocks/site-logo/style.css 218 B
build/block-library/blocks/site-tagline/editor-rtl.css 87 B
build/block-library/blocks/site-tagline/editor.css 87 B
build/block-library/blocks/site-title/editor-rtl.css 123 B
build/block-library/blocks/site-title/editor.css 123 B
build/block-library/blocks/social-link/editor-rtl.css 338 B
build/block-library/blocks/social-link/editor.css 338 B
build/block-library/blocks/social-links/editor-rtl.css 676 B
build/block-library/blocks/social-links/editor.css 675 B
build/block-library/blocks/social-links/style-rtl.css 1.51 kB
build/block-library/blocks/social-links/style.css 1.5 kB
build/block-library/blocks/spacer/editor-rtl.css 346 B
build/block-library/blocks/spacer/editor.css 346 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 394 B
build/block-library/blocks/table/editor.css 394 B
build/block-library/blocks/table/style-rtl.css 640 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 152 B
build/block-library/blocks/table/theme.css 152 B
build/block-library/blocks/tag-cloud/style-rtl.css 266 B
build/block-library/blocks/tag-cloud/style.css 265 B
build/block-library/blocks/template-part/editor-rtl.css 393 B
build/block-library/blocks/template-part/editor.css 393 B
build/block-library/blocks/template-part/theme-rtl.css 113 B
build/block-library/blocks/template-part/theme.css 113 B
build/block-library/blocks/term-description/style-rtl.css 126 B
build/block-library/blocks/term-description/style.css 126 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 165 B
build/block-library/blocks/text-columns/style.css 165 B
build/block-library/blocks/verse/style-rtl.css 98 B
build/block-library/blocks/verse/style.css 98 B
build/block-library/blocks/video/style-rtl.css 192 B
build/block-library/blocks/video/style.css 192 B
build/block-library/blocks/video/theme-rtl.css 134 B
build/block-library/blocks/video/theme.css 134 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/theme-rtl.css 702 B
build/block-library/theme.css 707 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/commands/index.min.js 16.1 kB
build/commands/style-rtl.css 955 B
build/commands/style.css 952 B
build/compose/index.min.js 12.9 kB
build/core-commands/index.min.js 2.81 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.35 kB
build/customize-widgets/style.css 1.35 kB
build/data-controls/index.min.js 641 B
build/data/index.min.js 8.98 kB
build/date/index.min.js 18 kB
build/deprecated/index.min.js 458 B
build/dom-ready/index.min.js 325 B
build/dom/index.min.js 4.65 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 580 B
build/edit-post/index.min.js 12.6 kB
build/edit-post/style-rtl.css 2.31 kB
build/edit-post/style.css 2.31 kB
build/edit-widgets/index.min.js 17.6 kB
build/edit-widgets/style-rtl.css 4.2 kB
build/edit-widgets/style.css 4.2 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/hooks/index.min.js 1.54 kB
build/html-entities/index.min.js 445 B
build/i18n/index.min.js 3.58 kB
build/interactivity/debug.min.js 16.5 kB
build/interactivity/file.min.js 447 B
build/interactivity/index.min.js 13.4 kB
build/interactivity/navigation.min.js 1.16 kB
build/interactivity/query.min.js 742 B
build/interactivity/router.min.js 2.8 kB
build/interactivity/search.min.js 615 B
build/is-shallow-equal/index.min.js 526 B
build/keyboard-shortcuts/index.min.js 1.31 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.16 kB
build/list-reusable-blocks/style-rtl.css 846 B
build/list-reusable-blocks/style.css 846 B
build/media-utils/index.min.js 2.92 kB
build/modules/importmap-polyfill.min.js 12.3 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.59 kB
build/nux/style-rtl.css 749 B
build/nux/style.css 745 B
build/patterns/index.min.js 7.36 kB
build/patterns/style-rtl.css 687 B
build/patterns/style.css 685 B
build/plugins/index.min.js 1.81 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/index.min.js 2.9 kB
build/preferences/style-rtl.css 554 B
build/preferences/style.css 554 B
build/primitives/index.min.js 829 B
build/priority-queue/index.min.js 1.54 kB
build/private-apis/index.min.js 1.01 kB
build/react-i18n/index.min.js 630 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.76 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.54 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.1 kB
build/router/index.min.js 1.96 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 2.03 kB
build/token-list/index.min.js 581 B
build/url/index.min.js 3.85 kB
build/vendors/react-dom.min.js 41.7 kB
build/vendors/react-jsx-runtime.min.js 560 B
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 965 B
build/warning/index.min.js 250 B
build/widgets/index.min.js 7.19 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

@sc0ttkclark
Copy link

I'm worried about long custom field names which can be typical with many people who have large sites with many custom fields. How might those display and how flexible would the UI be for that?

@sc0ttkclark
Copy link

Oh also is the plan for this UI to eventually accept other registered custom sources where "Custom Fields" is an example of the heading of the source? If so, I think this would work well for other sources in general.

@cbravobernal
Copy link
Contributor Author

I'm worried about long custom field names which can be typical with many people who have large sites with many custom fields. How might those display and how flexible would the UI be for that?

I'm truncating the content, but happy to try / discover different approaches. I've seen the option of two rows, being the value below the title and with a different color.

Captura de pantalla 2024-07-15 a las 9 16 39 Captura de pantalla 2024-07-15 a las 9 16 27
@cbravobernal
Copy link
Contributor Author

Oh also is the plan for this UI to eventually accept other registered custom sources where "Custom Fields" is an example of the heading of the source? If so, I think this would work well for other sources in general.

We didn't think yet about how to group different sources, but the idea is to eventually accept other registered custom sources as you mention. Would this UI be enough for them (with a search field)?

@gziolo gziolo added the Needs Design Feedback Needs general design feedback. label Jul 15, 2024
@gziolo
Copy link
Member

gziolo commented Jul 15, 2024

@jarekmorawski, @jasmussen, what do you think about the progress on the UI? It's looking close to what you shared in #39831 (comment). In particular:

bindings_panel.mp4
@jasmussen
Copy link
Contributor

I'm heading AFK for some summer AFK soon, so won't be able to follow this that closely. If Jarek has the bandwidth to follow this work, I trust him to have to have good instincts, I know he has WooCommerce experience too.

One quick glance:

Screenshot 2024-07-15 at 11 02 47

If a menu opens from the block toolbar, it should have the dark border and not the shadow menu style, just like all other block toolbar dropdowns. I thought this was automatic (CC: @WordPress/gutenberg-components), but otherwise I think it might involve an isAlternate prop. I also personally preferred the plugged connection icon to the lightning bolt, though think this UI could survive without an icon at all, since the text is so verbose and there are so many other icons.

That's a general thought too, start with as little as possible, get a feel for it, then add on top of this only when those things become necessary.

@jarekmorawski
Copy link

Thanks, folks! I'll do a few more iterations sometime this week and keep you updated on the progress.

@tyxla
Copy link
Member

tyxla commented Jul 15, 2024

If a menu opens from the block toolbar, it should have the dark border and not the shadow menu style, just like all other block toolbar dropdowns. I thought this was automatic (CC: @WordPress/gutenberg-components), but otherwise I think it might involve an isAlternate prop.

This is true AFAIK, the only thing I'd add is that isAlternate is deprecated nowadays - you should use variant="toolbar" instead.

Copy link

github-actions bot commented Jul 15, 2024

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

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

@cbravobernal cbravobernal changed the title Block bindings: Experiments on UI for connecting bindings Jul 15, 2024
@cbravobernal cbravobernal marked this pull request as ready for review July 15, 2024 16:16
Copy link

github-actions bot commented Jul 15, 2024

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

Unlinked Accounts

The following contributors have not linked their GitHub and WordPress.org accounts: @jarekmorawski.

Contributors, please read how to link your accounts to ensure your work is properly credited in WordPress releases.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Unlinked contributors: jarekmorawski.

Co-authored-by: cbravobernal <cbravobernal@git.wordpress.org>
Co-authored-by: SantosGuillamot <santosguillamot@git.wordpress.org>
Co-authored-by: artemiomorales <artemiosans@git.wordpress.org>
Co-authored-by: ciampo <mciampini@git.wordpress.org>
Co-authored-by: jameskoster <jameskoster@git.wordpress.org>
Co-authored-by: gziolo <gziolo@git.wordpress.org>
Co-authored-by: tyxla <tyxla@git.wordpress.org>
Co-authored-by: sc0ttkclark <sc0ttkclark@git.wordpress.org>
Co-authored-by: jasmussen <joen@git.wordpress.org>
Co-authored-by: aaronrobertshaw <aaronrobertshaw@git.wordpress.org>
Co-authored-by: richtabor <richtabor@git.wordpress.org>
Co-authored-by: paaljoachim <paaljoachim@git.wordpress.org>
Co-authored-by: afercia <afercia@git.wordpress.org>
Co-authored-by: seifeldinio <seifradwane@git.wordpress.org>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@cbravobernal cbravobernal requested a review from ciampo July 15, 2024 16:31
Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

Avoid custom CSS as much as possible. Tool Item component may have a helper attribute so we avoid adding plain HTML. Adding an option for items to remove their margins, without having to tweak borders. Pinging @WordPress/gutenberg-components for feedback about this.

I'd personally need to look more into it to understand fully the request. Pinging also @aaronrobertshaw who originally authored the component.

</DropdownMenuRadioItem>
) ) }
</DropdownMenuGroup>
{ i !== Object.keys( fieldsList ).length - 1 && (
Copy link
Member

@gziolo gziolo Jul 25, 2024

Choose a reason for hiding this comment

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

This separator always was problematic as it rarely should be rendered after the last element. I dream of the future when there is a prop on the menu to automatically injects the separator when there are groups defined 😄

@cbravobernal
Copy link
Contributor Author

@cbravobernal I wasn't able to reproduce the following points. Could you confirm if they have been solved after the latest changes or they need a follow-up?
Prevent bindings panel from moving by creating a custom group/slot for it.
Review image URL attribute binding. It seems that it is not removed correctly from the markup.

  • Prevent bindings panel from moving by creating a custom group/slot for it.

This one is fixed by keeping the hooks inside block-editor package function.

  • Review image URL attribute binding. It seems that it is not removed correctly from the markup.

This one keeps failing. The steps are, upload an image, set a custom field for url, then replace with a different image from the library. Happy to review with you in a sync call.

Screen.Recording.2024-07-25.at.15.45.27.mov
@SantosGuillamot
Copy link
Contributor

This one keeps failing. The steps are, upload an image, set a custom field for url, then replace with a different image from the library. Happy to review with you in a sync call.

Thanks a lot for the video 🙂 I am not able to reproduce it in my local environment. Maybe it is related to some image properties? Could you test if it also happens in trunk or if it is related to this PR?

Test.image.issue.mp4
@artemiomorales
Copy link
Contributor

Thanks a lot for the video 🙂 I am not able to reproduce it in my local environment. Maybe it is related to some image properties? Could you test if it also happens in trunk or if it is related to this PR?

I was able to reproduce Carlos's issue just once. After that, it started working as expected.

I've tried many different combinations of going back and forth between custom fields, changing images, etc., but I'm unable to reproduce it again.

Copy link
Contributor

@artemiomorales artemiomorales left a comment

Choose a reason for hiding this comment

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

I think this PR is in a good state for a first iteration — I'll go ahead and approve. We can continue discussing and keeping in sync with the components as they evolve and block bindings development progresses.

I haven't been able to reproduce Carlos's issue with the image again. Let's keep an eye out for it as we continue iterating.

@gziolo
Copy link
Member

gziolo commented Jul 26, 2024

I wanted to test keyboard navigation to ensure that the flow for connecting sources is accessible. I pinned a Playground instance with the Gutenberg plugin installed, and I ran into an edge case where I had no sources exposed which essentially impacts every new WP instance:

No.post.meta.registered.mov

When I move focus to a different block, the content with no connection is no longer listed. This edge case needs to be better secured before landing this PR.

By the way, keyboard navigation works correctly in this limited scenario. Let's make sure to test how keyboard navigation works with multiple attributes connected and multiple Post Meta options registered. At the moment, it only shows Post Meta options even when some custom bindin sources are registered, right?

@paaljoachim
Copy link
Contributor

paaljoachim commented Jul 27, 2024

I hope it is alright that I ask some basic questions.

I thought Attributes would be an advanced feature so that it might reside inside the Advanced panel. Or perhaps a new Connection/Attributes panel just above the Advanced panel. Placing it directly into a panel that can be opened which also gives more space for additional controls/options that will be needed.
As it seems a lot more complex compared to anything that exists today and is something that only the intermediate to advanced users would likely be using.

Is there a connection/attributes kind of Group block or another option in the Group block that would be the parent of inner blocks that it will impact? Or is this just meant for some blocks?
I do likely also have other basic questions that probably is answered some place. If these take up too much space in this PR then someone can instead just DM me on slack. Thanks.

@cbravobernal
Copy link
Contributor Author

I hope it is alright that I ask some basic questions.

Of course is alright, maybe it would better to have them in a discussion rather than in a Pull Request that will be eventually merged. But no question is basic, no question is not important.

I thought Attributes would be an advanced feature so that it might reside inside the Advanced panel. Or perhaps a new Connection/Attributes panel just above the Advanced panel. Placing it directly into a panel that can be opened which also gives more space for additional controls/options that will be needed. As it seems a lot more complex compared to anything that exists today and is something that only the intermediate to advanced users would likely be using.

My opinion is that it should have its own panel. As in a future, it can be a tool to create entire web layouts. I agree is an advanced feature. Ping @jarekmorawski for opinion. I think we can move the panel without issues after some feedback.

Is there a connection/attributes kind of Group block or another option in the Group block that would be the parent of inner blocks that it will impact? Or is this just meant for some blocks?

Attributes available for connections are listed here:

/**
* Given a binding of block attributes, returns a higher order component that
* overrides its `attributes` and `setAttributes` props to sync any changes needed.
*
* @return {WPHigherOrderComponent} Higher-order component.
*/
const BLOCK_BINDINGS_ALLOWED_BLOCKS = {
'core/paragraph': [ 'content' ],
'core/heading': [ 'content' ],
'core/image': [ 'id', 'url', 'title', 'alt' ],
'core/button': [ 'url', 'text', 'linkTarget', 'rel' ],
};

const BLOCK_BINDINGS_ALLOWED_BLOCKS = {
	'core/paragraph': [ 'content' ],
	'core/heading': [ 'content' ],
	'core/image': [ 'id', 'url', 'title', 'alt' ],
	'core/button': [ 'url', 'text', 'linkTarget', 'rel' ],
};

We need to create documentation to share them, and also an API to add your own block-attributes relation. More attribute/blocks compatibility will be added in a future. There are a few PRs to enable them.

I do likely also have other basic questions that probably is answered some place. If these take up too much space in this PR then someone can instead just DM me on slack. Thanks.

As mentioned before, we can create a GitHub discussion. And I'll try to answer all of them. Then we can use that information for documentation. Let's avoid private discussions.

@SantosGuillamot
Copy link
Contributor

SantosGuillamot commented Jul 29, 2024

I ran into an edge case where I had no sources exposed which essentially impacts every new WP instance

I believe the issue you are facing is not because there are no sources (by default core/post-meta is registered) but because you have no meta fields. The first case should be handled by the existing code, and I just pushed a fix that should make it work when no meta fields are registered: link.

When I move focus to a different block, the content with no connection is no longer listed. This edge case needs to be better secured before landing this PR.

I am not sure if this is the expected behavior of ToolsPanel. It seems to be the case for other styles using it. For example, if I go to paragraph styles and I click on the three dots of Color or Typography, I add an option, and I move to a different block, it is not there anymore. I understand it like this: "You started creating a connection, you didn't finish it, so it is not created. It doesn't show until you create it again".

Having said that, I don't have a strong opinion on what should be the behavior, but I believe it is not specific to this pull request.

Let's make sure to test how keyboard navigation works with multiple attributes connected and multiple Post Meta options registered.

It seems the keyboard navigation of the dropdown is not working as expected. Although I believe it is related to the DropDownMenu component we are using, because it doesn't seem to work in the docs examples either.

Steps to reproduce: Go to the component docs -> Navigate to the "Open Menu" button with the keyboard -> Press "Enter" -> Try to navigate through the items.

@ciampo Is this a known issue? Should I submit one, or do you have any clue how to solve it?

EDIT: Maybe this is expected and users can just navigate with the arrows? 🤔 It seems to be the case in Ariakit Menu component.

At the moment, it only shows Post Meta options even when some custom binding sources are registered, right?

Yes. The idea is to explore how to support other sources in follow-up pull requests.

@SantosGuillamot
Copy link
Contributor

It seems the last remaining decision here is:

Should we move the UI to the Advanced panel?

This was suggested in this comment and in this WordPress Slack conversation.

Basically, the suggestion comes from the fact that it seems an advanced feature.

Apart from that, moving it to the advanced panel wouldn't change the default tab of blocks like paragraphs and headings. As explained as part of this comment, with the current implementation, when you create a new paragraph it shows the "Settings" tab instead of the "Styles" tab because we are adding the "Attributes" panel.

Whatever we decide, the position of the panel can always be changed later. It seems moving it to the Advanced section would be "safer" and would give us time to decide how to handle the edge cases.

On the other hand, I believe there is no precedent for using the ToolsPanel inside the Advanced section, which could need some modifications.

How it looks outside the Advanced panel (current implementation)

Screenshot 2024-07-29 at 09 38 53

How it looks inside the Advanced panel by default

Screenshot 2024-07-29 at 09 38 19

How it looks inside the Advanced panel with custom CSS
Screenshot 2024-07-29 at 09 37 57

Any thoughts?

@jarekmorawski
Copy link

I'm not sure it's a good idea. If we want to minimize the footprint of this section, we can remove the help text and rename it to Connections (Attributes feels like a technical term; in the future bindings may support more than just attributes). Users who know what Connections are will know it's there; everyone else won't mind.

image

My argument against putting it in Advanced is that it may become difficult to find even for more savvy users.

The section is collapsed by default and contains features that are rarely needed for daily use. It's also quite consistent across different blocks so if people aren't used to looking there while editing bindings-enabled blocks, they may never discover the feature.

Lastly, the Advanced section is always placed at the bottom of the settings panel, which may cause information hierarchy issues. Applied connections will affect the fields and data above which may feel odd and backfire at some point.

For instance, a user wanting to insert the post title in the Image block's alt text may start looking for such a setting in the Settings section which would be placed high above Connections tucked away under Advanced. Going all the way down there only to be forced to scroll back up to see the result may throw people off.

@tyxla
Copy link
Member

tyxla commented Jul 29, 2024

It seems the keyboard navigation of the dropdown is not working as expected. Although I believe it is related to the DropDownMenu component we are using, because it doesn't seem to work in the docs examples either.

Steps to reproduce: Go to the component docs -> Navigate to the "Open Menu" button with the keyboard -> Press "Enter" -> Try to navigate through the items.

@ciampo Is this a known issue? Should I submit one, or do you have any clue how to solve it?

EDIT: Maybe this is expected and users can just navigate with the arrows? 🤔 It seems to be the case in Ariakit Menu component.

Can you please elaborate on what doesn't work as expected? In my testing, keyboard navigation works as expected.

@gziolo
Copy link
Member

gziolo commented Jul 29, 2024

Can you please elaborate on what doesn't work as expected? In my testing, keyboard navigation works as expected

It looks like it would help to see the steps used on both ends to cross-check the expected behavior.

@gziolo
Copy link
Member

gziolo commented Jul 29, 2024

When I move focus to a different block, the content with no connection is no longer listed. This edge case needs to be better secured before landing this PR.

I am not sure if this is the expected behavior of ToolsPanel. It seems to be the case for other styles using it. For example, if I go to paragraph styles and I click on the three dots of Color or Typography, I add an option, and I move to a different block, it is not there anymore. I understand it like this: "You started creating a connection, you didn't finish it, so it is not created. It doesn't show until you create it again".

Having said that, I don't have a strong opinion on what should be the behavior, but I believe it is not specific to this pull request.

I can confirm in my testing that it's working in a similar fashion to other panels. One thing that is important to highlight here is that it's at least two-step process for creating the connection so we should iterate over it later to make the feedback loop better. For example in the following state:

Screenshot 2024-07-29 at 14 57 55

We could provide a visual indicator (warning icon with a hint on hover) and accessible label on the button explaining that the attribute isn't fully connected. An alternative could be some sort of confirmation dialog that asks the user if they want to stop connecting the source with this attribute, assuming the focus management isn't too complex to achieve that. I'm just throwing some ideas to spark the discussion.

I'm not sure it's a good idea. If we want to minimize the footprint of this section, we can remove the help text and rename it to Connections (Attributes feels like a technical term; in the future bindings may support more than just attributes). Users who know what Connections are will know it's there; everyone else won't mind.

That could be enough to start with. It probably should also conditionally check if there are any custom post meta fields (anything to connect) and conditionally show the panel. In the future, that would need to scan all sources to check if there is anything to connect with.

Overall, I think we are close to landing this work based on the type of feedback we are currently discussing 🎉 Let's clarify whether the UX is accessible from the start, too. Otherwise, we can go through a round of enhancements in smaller targeted PRs so everyone can share feedback freely without being afraid to add further noise as I start to feel with my feedback now 😅

Copy link
Member

@gziolo gziolo left a comment

Choose a reason for hiding this comment

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

50f6f1e](50f6f1e) - with that it’s behind the experiment. Let’s land it and decide separately when to expose it to the users. In my opinion, it’s going to be really soon, even before the next Gutenberg RC1 planned for next week. However, if this is the confidence necessary then I’m happy with it. It could be that e2e tests will need some updating to account for the experiment UI.

@SantosGuillamot
Copy link
Contributor

Can you please elaborate on what doesn't work as expected? In my testing, keyboard navigation works as expected.

@tyxla I was trying to navigate the menu items with "SHIFT" and it seems I need to use the arrows instead. As said in the edit, maybe this is expected because it is how Ariakit Menu component works.

One thing that is important to highlight here is that it's at least two-step process for creating the connection so we should iterate over it later to make the feedback loop better.

I agree this could be improved. I suggested something similar in this comment: "Should we add a prompt or helper message when an attribute is not connected?".

It probably should also conditionally check if there are any custom post meta fields (anything to connect) and conditionally show the panel. In the future, that would need to scan all sources to check if there is anything to connect with.

That should already happen in this logic. When there are no custom fields to connect to, it will show only the panel when there are bindings created.

Overall, I think we are close to landing this work based on the type of feedback we are currently discussing 🎉

As it seems there are some concerns, I moved the UI under an experimental flag. I feel landing the prototype will help moving forward the follow-up discussions, fixes, and pull requests.

@tyxla
Copy link
Member

tyxla commented Jul 30, 2024

Can you please elaborate on what doesn't work as expected? In my testing, keyboard navigation works as expected.

@tyxla I was trying to navigate the menu items with "SHIFT" and it seems I need to use the arrows instead. As said in the edit, maybe this is expected because it is how Ariakit Menu component works.

Thanks for confirming, this is exactly how it's supposed to work - with arrows, and you can also use SPACE and ENTER for selection and navigating between levels (in the nested version).

@ciampo
Copy link
Contributor

ciampo commented Jul 30, 2024

it is how Ariakit Menu component works.

To add to what Marin said, that is how menu widgets should work (regardless of the underlying implementation), as per the WAI ARIA spec

@SantosGuillamot SantosGuillamot merged commit 78a3e71 into trunk Jul 30, 2024
61 checks passed
@SantosGuillamot SantosGuillamot deleted the experiment/connect_binding_ui branch July 30, 2024 12:48
@github-actions github-actions bot added this to the Gutenberg 19.0 milestone Jul 30, 2024
@SantosGuillamot
Copy link
Contributor

As it is now wrapped under an experimental flag, I went ahead and merged the pull request. I'll add the follow-ups to the tracking issue and we can discuss items separately. Thanks everyone for all the feedback and the great work 👏

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Block bindings Needs Design Feedback Needs general design feedback. [Type] Experimental Experimental feature or API.