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: Disable editing of bound block attributes in editor UI #58085

Merged
merged 27 commits into from
Jan 24, 2024

Conversation

SantosGuillamot
Copy link
Contributor

@SantosGuillamot SantosGuillamot commented Jan 22, 2024

What?

As discussed in this Slack thread, I'm splitting this other pull request to handle first just the use case where the editor understands the bindings attribute and adapt the UI accordingly.

As part of that, in this PR I'm doing:

  • Provide an action to register a new source in the editor: link.
  • Provide some selectors to get all the registered sources or a specific one: link.
  • Add filter to the BlockEdit to modify attributes and setAttributes and make it understand the bindings: link.
  • Use addFilter to add the needed context to all the allowed blocks: link.
  • Adapt the paragraph, heading, button, and image blocks UI to identify when bindings exist.
  • Register the post meta source using these mechanisms: link.

Why?

Splitting the original pull request should make it easier to review and it could help us land something sooner that covers understanding the bindings from the editor, although it doesn't include any UI to create/modify the bindings.

Testing Instructions

For all the testing, we have to go to Gutenberg-Experiments and enable the Test Block Bindings option.

  1. Register a new custom field however you prefer. You can use a snippet similar to this:
register_meta(
	'post',
	'text_custom_field',
	array(
		'show_in_rest' => true,
		'single'       => true,
		'type'         => 'string',
		'default'	   => 'This is the content of the text custom field',
	)
);
register_meta(
	'post',
	'url_custom_field',
	array(
		'show_in_rest' => true,
		'single'       => true,
		'type'         => 'string',
		'default'	   => 'https://wpmovies.dev/wp-content/uploads/2023/04/goncharov-poster-original-1-682x1024.jpeg',
	)
);

In a page

Test paragraph

  1. Add a paragraph with the content connected to a custom field:
<!-- wp:paragraph {"metadata":{"bindings":{"content":{"source":{"name":"post_meta","attributes":{"value":"text_custom_field"}}}}}} -->
<p>Content of the PAGE text custom field</p>
<!-- /wp:paragraph -->
  1. Add a paragraph without any bindings.
  2. Check that the paragraph with the bindings became non-editable.
  3. Checkthat the paragraph shows the content of the custom field.
  4. Check that the normal paragraph works as expected.
  5. Go to the frontend and check that it works as well there.

Test heading

Repeat the paragraph test but using a heading.

Test button

  1. Add a button with the text connected to a custom field.
  2. Add another button with the URL connected to a custom field.
  3. Add a button with the text and the URL connected to custom fields.
<!-- wp:buttons -->
<div class="wp-block-buttons"><!-- wp:button {"metadata":{"bindings":{"text":{"source":{"name":"post_meta","attributes":{"value":"text_custom_field"}}}}}} -->
<div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://wordpress.org">ANY TEXT</a></div>
<!-- /wp:button -->

<!-- wp:button {"metadata":{"bindings":{"url":{"source":{"name":"post_meta","attributes":{"value":"url_custom_field"}}}}}} -->
<div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://wordpress.org">URL</a></div>
<!-- /wp:button -->

<!-- wp:button {"metadata":{"bindings":{"text":{"source":{"name":"post_meta","attributes":{"value":"text_custom_field"}}},"url":{"source":{"name":"post_meta","attributes":{"value":"url_custom_field"}}}}}} -->
<div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://wordpress.org">BOTH</a></div>
<!-- /wp:button --></div>
<!-- /wp:buttons -->
  1. Check that for the buttons with the text connected, they are not editable and they show the content of the custom field.
  2. Check that for the buttons with the URL connected, the buttons to change the URL disappear from the UI.
  3. Check that everything works in the frontend.

Test image

  1. Add an image with the URL connected to a custom field.
  2. Add an image with the alt attribute connected to a custom field.
  3. Add an image with the title attribute connected to a custom field.
  4. Add an image with more than one connection.
<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Image url and alt connected</h3>
<!-- /wp:heading -->

<!-- wp:image {"id":135,"sizeSlug":"large","linkDestination":"none","metadata":{"bindings":{"url":{"source":{"name":"post_meta","attributes":{"value":"url_custom_field"}}},"alt":{"source":{"name":"post_meta","attributes":{"value":"text_custom_field"}}}}}} -->
<figure class="wp-block-image size-large"><img src="https://wpmovies.dev/wp-content/uploads/2023/03/3bhkrj58Vtu7enYsRolD1fZdja1-683x1024.jpg" alt="Content of the PAGE text custom field" class="wp-image-135" title="Image title"/></figure>
<!-- /wp:image -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Alt connected</h3>
<!-- /wp:heading -->

<!-- wp:image {"id":133,"sizeSlug":"large","linkDestination":"none","metadata":{"bindings":{"alt":{"source":{"name":"post_meta","attributes":{"value":"text_custom_field"}}}}}} -->
<figure class="wp-block-image size-large"><img src="http://custom-fields.local/wp-content/uploads/2023/11/1-1024x1024.jpg" alt="Content of the PAGE text custom field" class="wp-image-133" title="Image title"/></figure>
<!-- /wp:image -->
  1. For the images with the URL connected, check that the related buttons to link an image have disappeared and the image shows the URL from the custom field.
  2. For the images with the alt/title connected, check that, in the right sidebar, they are disabled. Showing the value of the custom field instead and a message saying it is connected to custom fields.

In a template

Go to a page template, for example, and repeat the process. In this case, the blocks can't show the value of the custom fields because it depends on each page. They should show a placeholder instead.

Remaining issues

I'll try to gather here the remaining issues related to this pull request. So far I'd like to work on:

  • Fix the query loop not showing the content properly.
  • Review the whole UX.

Screenshots or screencast

Understanding.Bindings.in.the.Editor.mp4

@SantosGuillamot SantosGuillamot added [Type] Feature New feature to highlight in changelogs. [Feature] Custom Fields Anything related to the custom fields project - connecting block attributes and dynamic values labels Jan 22, 2024
Copy link

github-actions bot commented Jan 22, 2024

Size Change: +1.34 kB (0%)

Total Size: 1.69 MB

Filename Size Change
build/block-editor/content-rtl.css 4.38 kB +1 B (0%)
build/block-editor/content.css 4.38 kB +2 B (0%)
build/block-editor/index.min.js 249 kB +665 B (0%)
build/block-library/blocks/image/editor-rtl.css 863 B +29 B (+3%)
build/block-library/blocks/image/editor.css 862 B +29 B (+3%)
build/block-library/editor-rtl.css 12.3 kB +22 B (0%)
build/block-library/editor.css 12.3 kB +24 B (0%)
build/block-library/index.min.js 215 kB +480 B (0%)
build/editor/index.min.js 61.5 kB +84 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.69 kB
build/api-fetch/index.min.js 2.32 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 578 B
build/block-directory/index.min.js 7.22 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/style-rtl.css 15.3 kB
build/block-editor/style.css 15.3 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 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 415 B
build/block-library/blocks/button/editor.css 414 B
build/block-library/blocks/button/style-rtl.css 627 B
build/block-library/blocks/button/style.css 626 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 421 B
build/block-library/blocks/columns/style.css 421 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.69 kB
build/block-library/blocks/cover/style.css 1.68 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 98 B
build/block-library/blocks/details/style.css 98 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 280 B
build/block-library/blocks/file/style.css 281 B
build/block-library/blocks/file/view.min.js 316 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/form-input/editor-rtl.css 227 B
build/block-library/blocks/form-input/editor.css 227 B
build/block-library/blocks/form-input/style-rtl.css 343 B
build/block-library/blocks/form-input/style.css 343 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 340 B
build/block-library/blocks/form-submission-notification/editor.css 340 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 452 B
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.72 kB
build/block-library/blocks/gallery/style.css 1.72 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 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 189 B
build/block-library/blocks/heading/style.css 189 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/style-rtl.css 1.6 kB
build/block-library/blocks/image/style.css 1.59 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/image/view.min.js 2.01 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 505 B
build/block-library/blocks/media-text/style.css 503 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 668 B
build/block-library/blocks/navigation-link/editor.css 669 B
build/block-library/blocks/navigation-link/style-rtl.css 103 B
build/block-library/blocks/navigation-link/style.css 103 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.25 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.24 kB
build/block-library/blocks/navigation/style.css 2.23 kB
build/block-library/blocks/navigation/view.min.js 1.1 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 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 235 B
build/block-library/blocks/paragraph/editor.css 235 B
build/block-library/blocks/paragraph/style-rtl.css 335 B
build/block-library/blocks/paragraph/style.css 335 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 508 B
build/block-library/blocks/post-comments-form/style.css 508 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 666 B
build/block-library/blocks/post-featured-image/editor.css 662 B
build/block-library/blocks/post-featured-image/style-rtl.css 342 B
build/block-library/blocks/post-featured-image/style.css 342 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 409 B
build/block-library/blocks/post-template/style.css 408 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 354 B
build/block-library/blocks/pullquote/style.css 354 B
build/block-library/blocks/pullquote/theme-rtl.css 168 B
build/block-library/blocks/pullquote/theme.css 168 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 486 B
build/block-library/blocks/query/editor.css 486 B
build/block-library/blocks/query/style-rtl.css 312 B
build/block-library/blocks/query/style.css 308 B
build/block-library/blocks/query/view.min.js 642 B
build/block-library/blocks/quote/style-rtl.css 237 B
build/block-library/blocks/quote/style.css 237 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 140 B
build/block-library/blocks/read-more/style.css 140 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 184 B
build/block-library/blocks/search/editor.css 184 B
build/block-library/blocks/search/style-rtl.css 614 B
build/block-library/blocks/search/style.css 614 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 471 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 204 B
build/block-library/blocks/site-logo/style.css 204 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 682 B
build/block-library/blocks/social-links/editor.css 681 B
build/block-library/blocks/social-links/style-rtl.css 1.49 kB
build/block-library/blocks/social-links/style.css 1.49 kB
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 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 395 B
build/block-library/blocks/table/editor.css 395 B
build/block-library/blocks/table/style-rtl.css 639 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 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/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 185 B
build/block-library/blocks/video/style.css 185 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 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/style-rtl.css 14.7 kB
build/block-library/style.css 14.7 kB
build/block-library/theme-rtl.css 688 B
build/block-library/theme.css 693 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51.4 kB
build/commands/index.min.js 15.5 kB
build/commands/style-rtl.css 921 B
build/commands/style.css 918 B
build/components/index.min.js 235 kB
build/components/style-rtl.css 12 kB
build/components/style.css 12.1 kB
build/compose/index.min.js 12.6 kB
build/core-commands/index.min.js 2.71 kB
build/core-data/index.min.js 72.7 kB
build/customize-widgets/index.min.js 12.1 kB
build/customize-widgets/style-rtl.css 1.34 kB
build/customize-widgets/style.css 1.33 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.92 kB
build/date/index.min.js 17.8 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.65 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 24.8 kB
build/edit-post/style-rtl.css 5.62 kB
build/edit-post/style.css 5.61 kB
build/edit-site/index.min.js 195 kB
build/edit-site/style-rtl.css 15.2 kB
build/edit-site/style.css 15.2 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.39 kB
build/edit-widgets/style.css 4.39 kB
build/editor/style-rtl.css 5.43 kB
build/editor/style.css 5.43 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.93 kB
build/format-library/style-rtl.css 478 B
build/format-library/style.css 477 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/file.min.js 440 B
build/interactivity/image.min.js 2.15 kB
build/interactivity/index.min.js 13.3 kB
build/interactivity/navigation.min.js 1.23 kB
build/interactivity/query.min.js 789 B
build/interactivity/search.min.js 610 B
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.74 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.11 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 kB
build/modules/importmap-polyfill.min.js 12.2 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 2 kB
build/nux/style-rtl.css 735 B
build/nux/style.css 732 B
build/patterns/index.min.js 5.45 kB
build/patterns/style-rtl.css 540 B
build/patterns/style.css 539 B
build/plugins/index.min.js 1.8 kB
build/preferences-persistence/index.min.js 2.07 kB
build/preferences/index.min.js 2.81 kB
build/preferences/style-rtl.css 698 B
build/preferences/style.css 700 B
build/primitives/index.min.js 975 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 1 kB
build/react-i18n/index.min.js 623 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.78 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.72 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 10.4 kB
build/router/index.min.js 1.79 kB
build/server-side-render/index.min.js 1.95 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 2.05 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.72 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 957 B
build/warning/index.min.js 249 B
build/widgets/index.min.js 7.21 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

Copy link

github-actions bot commented Jan 22, 2024

Flaky tests detected in 1f34e08.
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/7639951981
📝 Reported issues:

@artemiomorales artemiomorales changed the title Block Bindings: Understand the block bindings from the editor and adapt blocks UI Block Bindings: Disable editing of bound block attributes in editor UI Jan 22, 2024
@artemiomorales artemiomorales added [Type] New API New API to be used by plugin developers or package users. and removed [Type] New API New API to be used by plugin developers or package users. labels Jan 22, 2024
artemiomorales

This comment was marked as resolved.

@SaxonF
Copy link
Contributor

SaxonF commented Jan 23, 2024

Looking good, thanks @SantosGuillamot !

A couple suggestions:

  • When in a template, for paragraph and heading fields connected to a field, let's not dim the cololur at all. It should be accurate to whatever styling is applied to the block
  • When in a template, for images, we could still show the alternative text field except it would be disabled and with the default value of the field inserted.

I don't see any design blockers for 6.5 here. During beta testing we might pick up the need to better highlight blocks that are connected to a field in some way.

@gziolo
Copy link
Member

gziolo commented Jan 23, 2024

There are e2e test failures logged for Pattern Overrides so it needs to be investigated. I suspect, it’s no longer possible to edit content for the blocks that have overrides enabled in the pattern.

gziolo
gziolo previously requested changes Jan 23, 2024
@@ -376,7 +376,7 @@ export function RichTextWrapper(
useFirefoxCompat(),
anchorRef,
] ) }
contentEditable={ true }
contentEditable={ props.isContentBound ? false : true }
Copy link
Member

Choose a reason for hiding this comment

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

@ellatrix, what alternatives are there to put RichText in read-only mode that don't require introducing a new prop?

I'm also wondering what should happen for all these users using assistive technology. It feels like we should ensure it still possible to move focus when tabbing to the HTML element as in some cases RichText is the block wrapper so it could make it harder navigating to blocks like Paragraph or Heading.

Copy link
Member

Choose a reason for hiding this comment

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

Noting also that this new prop fails one of the unit tests:

Screenshot 2024-01-23 at 10 03 46

Copy link
Contributor Author

@SantosGuillamot SantosGuillamot Jan 23, 2024

Choose a reason for hiding this comment

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

I believe we can get directly the block attributes from the RichText component and read the metadata.bindings there. I'll give it a try.

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 made this commit to reflect what I was referring to. It seems cleaner to me, but I am not familiar enough with RichText to say if that's the right approach.

Copy link
Contributor

Choose a reason for hiding this comment

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

I also notice that selecting the Paragraph block that is connected to a source requires a double click in the "edit" mode. In the "select" mode it seems that it works just fine.

output_56e741.mp4

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 agree it's not the best UX. I think that's the way the RichText works, right now when the editing is locked, so I am not sure if that's on purpose or we should look for a different approach.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

This should be fixed with this commit.

@@ -296,7 +298,7 @@ function ButtonEdit( props ) {
onClick={ startEditing }
/>
) }
{ isURLSet && isLinkTag && (
{ isURLSet && isLinkTag && ! metadata?.bindings?.url && (
Copy link
Member

Choose a reason for hiding this comment

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

What if someone would like to unlink the button? In general, should it be possible to remove the binding in the UI?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

In general, should it be possible to remove the binding in the UI?

I wasn't sure about that one. My reasoning was that, as right now bindings can only be added through the code editor, it shouldn't be a blocker if they can only be removed through the code editor as well. When we improve the UI and add the possibility to create bindings, we should provide mechanisms to remove them as well.

Anyway, I don't know which is the correct approach. Any thoughts?


// Prettify the name until the label is available in the REST API endpoint.
const keyToLabel = ( key ) => {
return key
Copy link
Member

Choose a reason for hiding this comment

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

It isn’t the most user friendly to show in the UI machine readable key that can’t be localized. Maybe it’s fine for someone technical creating the site, but far from perfect for someone editing the content.

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 agree. I saw that as a workaround. The issue is that we don't have labels in the meta fields yet. Do you think it would be better to just pass the label? text_custom_field for example.

Copy link
Member

Choose a reason for hiding this comment

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

Maybe that would be more appropriate as it would be clear it’s a code name. At least until we support labels. @SaxonF, what do you think?

Copy link
Contributor Author

@SantosGuillamot SantosGuillamot Jan 23, 2024

Choose a reason for hiding this comment

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

I was considering using something like "Connected to { meta_key } from { source }". Which would translate into "Connected to my_custom_field from Post Meta". Maybe it is too long for some cases like a button text.

packages/editor/src/bindings/post-meta.js Outdated Show resolved Hide resolved
packages/editor/src/bindings/post-meta.js Outdated Show resolved Hide resolved
packages/editor/src/bindings/post-meta.js Outdated Show resolved Hide resolved
packages/editor/src/bindings/post-meta.js Show resolved Hide resolved
@SantosGuillamot
Copy link
Contributor Author

I've taken an initial look and it appears that it works well in the Post Editor, but in the Site Editor I've defined the following layout, including a bound image and some buttons. However, the image and two of the buttons disappear when viewing the site.

Could you share the serialized block to test it? Maybe you are connecting to a custom field that doesn't exist in the context of the homepage, and that's why the blocks are not rendering properly. Anyway, if that's an issue, I believe it should be related to the PHP logic.

When in a template, for paragraph and heading fields connected to a field, let's not dim the cololur at all. It should be accurate to whatever styling is applied to the block

Makes sense. I was using the placeholder attribute, but I belive I can directly change the content. I'll give that a try.

When in a template, for images, we could still show the alternative text field except it would be disabled and with the default value of the field inserted.

I wanted to explore that option as well. There is a challenge because the options in the sidebar don't appear until an image has been uploaded. But we need to figure out how to solve that.

I don't see any design blockers for 6.5 here. During beta testing we might pick up the need to better highlight blocks that are connected to a field in some way.

I agree 🙂 I believe it would be nice to land a simpler UI first to have some testing but we can iterate over it during the upcoming weeks.

There are e2e test failures logged for Pattern Overrides so it needs to be investigated. I suspect, it’s no longer possible to edit content for the blocks that have overrides enabled in the pattern.

Yep, I still have to take a deeper look at how it integrates with patterns because it might break things. Maybe we can check if the source === 'pattern' and skip any changes in that case.

@SantosGuillamot
Copy link
Contributor Author

SantosGuillamot commented Jan 24, 2024

I think I’ve addressed most of the feedback, especially the blockers. There are some missing decisions/improvements, but I believe most of them can be done in other pull requests. These are the things I identified:

  • Accessibility improvements: link. Artemio made great points about things that can be improved regarding accessibility. It seems it is not only related to this pull request, but to other parts of the editor as well. For example, I tested the Post Date block, which has a similar behavior. I can work on a new PR and reach the accessibility team to see how we should manage it.
  • Can we use use the new block-editor hooks API instead of changing settings.edit: link? If possible, we may change the filters used. Anyway, I thing that can be done later as it only affects the internal code and (maybe) the performance.
  • Improve the way we are handling rich-text attributes to make it work with blocks that accept multiple rich texts: link. Right now it isn’t a blocker because the list of blocks that can use bindings is restricted.
  • Should we have metaValue and setMetaValue instead of useSource: [ metaValue, setMetaValue ]link? Whatever we decide can be changed later because the API will remain private.
  • Should we add some UI to remove the bindings in this initial version:  link? In my opinion, this can be added as an improvement later if we consider it necessary.
  • Should the placeholders show the value of the key or should they show something different: link? Again, I believe this is a small change that can be done in other pull request.
  • Fix Query loop showing the first instance data.
  • Add tests.

Would you consider any of those a blocker? Is there anything else I’m missing?

Once this pull request is merged, I can start working on the points in this list.

@michalczaplinski
Copy link
Contributor

I see an issue: The content of the block is not updated when you edit the metadata in the block. You have to make some other edits in order for the content to be updated on the frontend. In the editor, the value is updated correctly.

output_3b7505.mp4

@michalczaplinski
Copy link
Contributor

I see an issue: The content of the block is not updated when you edit the metadata in the block. You have to make some other edits in order for the content to be updated on the frontend. In the editor, the value is updated correctly.

I can reproduce the same issue with the Image block.

@SantosGuillamot
Copy link
Contributor Author

I've been trying to reproduce it following the exact same process, but I haven't been lucky. I'll keep trying to be able to identify the issue better.

@artemiomorales
Copy link
Contributor

I see an issue: The content of the block is not updated when you edit the metadata in the block. You have to make some other edits in order for the content to be updated on the frontend. In the editor, the value is updated correctly.

Hmm, am unable to reproduce this one following the same steps 🤔

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'm approving this PR on the grounds that removing the experimental flag has already been merged and the premise of this PR, which is to disable editing of bound fields and improve the UX, is working as intended as far as I can see.

I think we can continue addressing the improvements Mario outlined as well as fix any outstanding issues as feedback comes in.

'core/paragraph': [ 'content' ],
'core/heading': [ 'content' ],
'core/image': [ 'url', 'title', 'alt' ],
'core/button': [ 'url', 'text' ],
Copy link
Contributor

Choose a reason for hiding this comment

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

Should we also add the linkTarget here?

Copy link
Member

Choose a reason for hiding this comment

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

There were some issues with linkTarget. Let's keep it out of the scope for now.

@michalczaplinski michalczaplinski self-requested a review January 24, 2024 18:46
Copy link
Contributor

@michalczaplinski michalczaplinski left a comment

Choose a reason for hiding this comment

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

It looks good to me, awesome work, Mario! 👍

We can address any issues in follow-up PRs.

@gziolo gziolo merged commit fd46752 into trunk Jan 24, 2024
57 checks passed
@gziolo gziolo deleted the add/block-bindings-support-in-the-editor branch January 24, 2024 19:01
@github-actions github-actions bot added this to the Gutenberg 17.6 milestone Jan 24, 2024
@michalczaplinski
Copy link
Contributor

I see an issue: The content of the block is not updated when you edit the metadata in the block. You have to make some other edits in order for the content to be updated on the frontend. In the editor, the value is updated correctly.

This was caused by the recent changes in trunk where the GB experiment was removed (#58089). This PR was branched off before that, so it required the experiment to be enabled.

In summary, the issue should not be present in trunk anymore after the merge.

const {
placeholder,
useValue: [ metaValue = null ] = [],
} = source.useSource(
Copy link
Member

Choose a reason for hiding this comment

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

Is this a hook? You cannot use hooks inside conditions and loops

Copy link
Contributor Author

Choose a reason for hiding this comment

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

In the case of post meta source, it uses useSelect and useEntityProp: link. Although each source could do whatever they want.

If that's a problem, do you have any ideas on how that should be handled? We need to iterate through the different bindings and get the value from each of the sources.

Copy link
Member

Choose a reason for hiding this comment

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

The only solution is to probably mount sub components, get the result, and set some state in this component, similar to how it is done here:

useBlockProps={ useBlockProps }

But I'd love to hear other people's thoughts

Copy link
Contributor

Choose a reason for hiding this comment

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

Good catch @ellatrix! Yup, we'll have to change it because it is a hook.

);

if ( source ) {
// Second argument (`updateMetaValue`) will be used to update the value in the future.
Copy link
Contributor

Choose a reason for hiding this comment

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

Any idea or advance of how it's going to implement the updateMetaValue usage?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The technical implementation is almost there. However, there are many things to take into account, and it was decided not to rush things for the upcoming 6.5 to ensure that whatever we land is stable enough.

// Second argument (`updateMetaValue`) will be used to update the value in the future.
const {
placeholder,
useValue: [ metaValue = null ] = [],
Copy link
Contributor

Choose a reason for hiding this comment

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

Is it metaValue a proper name here? In theory, the source can be arbitrary meaning it could belong to metadata, but also to very different origins.
Could we consider using something like sourceValue, and setSourceValue?

Copy link
Member

Choose a reason for hiding this comment

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

Good feedback. On the server, there is get_value_callback registered for every block bindings source.

Comment on lines +93 to +97
setAttributes={ ( newAttributes, blockId ) =>
registry.batch( () =>
updateBlockAttributes( blockId, newAttributes )
)
}
Copy link
Member

@Mamaduka Mamaduka Feb 8, 2024

Choose a reason for hiding this comment

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

  • The blocks expect setAttributes to have a stable reference between rerenders. This override breaks that.
  • What's the reason for batching the single action? Technically, it shouldn't make a difference.

P.S. There is no need to wrap the returned BlockEdit in the fragment.

Copy link
Member

Choose a reason for hiding this comment

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

@Mamaduka, I think the issue at the moment is that users will only change the attribute when it is not bound. When the value is sourced from the block binding then the attribute becomes readonly. In effect, the batching isn't really necessary and even there should be no override set until it's possible to edit the external source in UI.

By the way, feel free to refactor the code here if you have some ideas how to optimize it.

Copy link
Member

Choose a reason for hiding this comment

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

I think the issue at the moment is that users will only change the attribute when it is not bound. When the value is sourced from the block binding then the attribute becomes readonly.

Is that handled somewhere else? Because I don't see that logic here. If the block calls the setAttribute override, it will update the attribute, bound or not.

Sorry, I'm not super familiar with the internals of Block Binding API. I just came across this code while looking for something else.

Copy link
Member

Choose a reason for hiding this comment

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

it will update the attribute, bound or not

There is no way to trigger the update from UI at the moment for supported blocks and their selected attributes. Direct changes to the store don't matter because the value will get replaced on the frontend anyway.

You are totally right that batching is not needed at the moment and most likely the override for setAttributes is premature.

Copy link
Member

Choose a reason for hiding this comment

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

Thanks for confirming. I can push refactoring PR later today.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Custom Fields Anything related to the custom fields project - connecting block attributes and dynamic values [Type] Feature New feature to highlight in changelogs.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants