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: Open the stable editor APIs #65713

Merged
merged 10 commits into from
Oct 1, 2024

Conversation

SantosGuillamot
Copy link
Contributor

@SantosGuillamot SantosGuillamot commented Sep 28, 2024

This PR is built on top of #65710 because it shouldn't be merged until that one is done.

What?

In this pull request, I propose opening the block bindings editor APIs that I personally consider stable because they have been used privately for a whole release cycle now. This covers:

Block bindings utils

It exposes a useBlockBindingsUtils hook that returns the helpers to modify the metadata.bindings attribute. Right now, it includes:

  • updateBlockBindings: This works similarly to updateBlockAttributes. It can be used to create/remove specific connections.
  • removeAllBlockBindings: This is used to remove all connections existing in a block.

These utils are being used by the UI to connect to post meta and by pattern overrides. They can be helpful to let other sources build their own UI if wanted.

Registration API

It exposes the following functions:

  • registerBlockBindingsSource: to register a source in the client (more on this later).
  • unregisterBlockBindingsSource: to unregister an existing source.
  • getBlockBindingsSource: to get a specific registered source and its properties.
  • getBlockBindingsSources: to get all the registered sources in the client.

They are based on other registration APIs like block types, block variations, or block collections.

Source properties

Each registered source in the client can include the following properties:

  • name: The unique and machine-readable name.
  • label: Human-readable label.
  • usesContext: Array of context needed by the source only in the editor.
  • getValues: Function to get the values from the source. It receives select, context, and the block bindings created for that specific source. It must return an object with attribute: value. Similar to getBlockAttributes.
  • setValues: Function to update multiple values connected to the source. It receives select, dispatch, context, and the block bindings created for that specific source, including the new value. Similar to updateBlockAttributes.
  • canUserEditValue: Function to let the editor know if the block attribute connected should be editable or not. It receives select, context, and the source arguments.

They all include proper testing, and there are JSDocs, but they need to be documented better.

Apart from that, there is the getFieldsList property that remains private for 6.7 and only works for core/post-meta BUT it is open if Gutenberg is active. This one is not mature enough and this way, it will allow us to gather feedback and iterate on it safely.

Why?

Opening the editor APIs was a common demand for block bindings and it empowers what extenders can build with it. Additionally, I believe the APIs we are exposing should be safe.

How?

  • Export the functions as non-private APIs.
  • Remove all the unlock where these functions were called.
  • Add a check in the reducer to ensure getFieldsList can only be used for post meta or when Gutenberg plugin is active.

Testing Instructions

These APIs are covered in the block-bindings tests. So they should pass.

@SantosGuillamot SantosGuillamot added [Type] New API New API to be used by plugin developers or package users. [Feature] Block bindings labels Sep 28, 2024
@SantosGuillamot SantosGuillamot changed the title Block Bindings: Update the stable editor APIs Block Bindings: Open the stable editor APIs Sep 28, 2024
Comment on lines +396 to +402
// Only open this API in Gutenberg and for `core/post-meta` for the moment.
let getFieldsList;
if ( globalThis.IS_GUTENBERG_PLUGIN ) {
getFieldsList = action.getFieldsList;
} else if ( action.name === 'core/post-meta' ) {
getFieldsList = action.getFieldsList;
}
Copy link
Contributor Author

Choose a reason for hiding this comment

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

@gziolo Could you confirm this is the proper way to enable the API for Gutenberg but keep it private for WordPress 6.7?

PD: I had to split the conditional this way because the linter was complaining that globalThis.IS_GUTENBERG_PLUGIN can't be used among other checks.

Copy link
Member

Choose a reason for hiding this comment

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

Yes, that looks right. In effect, all custom sources can test getFieldsList with the Gutenberg plugin, but only core/post-meta is handled with WP core.

Copy link

github-actions bot commented Sep 28, 2024

Size Change: -85 B (0%)

Total Size: 1.77 MB

Filename Size Change
build/block-editor/index.min.js 256 kB -13 B (-0.01%)
build/block-library/index.min.js 219 kB -44 B (-0.02%)
build/blocks/index.min.js 52.5 kB -38 B (-0.07%)
build/components/index.min.js 226 kB +29 B (+0.01%)
build/editor/index.min.js 103 kB -17 B (-0.02%)
build/patterns/index.min.js 7.34 kB -2 B (-0.03%)
ℹ️ View Unchanged
Filename Size
build-module/a11y/index.min.js 482 B
build-module/block-library/file/view.min.js 447 B
build-module/block-library/image/view.min.js 1.78 kB
build-module/block-library/navigation/view.min.js 1.16 kB
build-module/block-library/query/view.min.js 743 B
build-module/block-library/search/view.min.js 616 B
build-module/interactivity-router/index.min.js 3 kB
build-module/interactivity/debug.min.js 16.7 kB
build-module/interactivity/index.min.js 13.4 kB
build/a11y/index.min.js 952 B
build/annotations/index.min.js 2.26 kB
build/api-fetch/index.min.js 2.32 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
build/block-directory/index.min.js 7.26 kB
build/block-directory/style-rtl.css 1.07 kB
build/block-directory/style.css 1.07 kB
build/block-editor/content-rtl.css 4.46 kB
build/block-editor/content.css 4.46 kB
build/block-editor/default-editor-styles-rtl.css 394 B
build/block-editor/default-editor-styles.css 394 B
build/block-editor/style-rtl.css 15.6 kB
build/block-editor/style.css 15.5 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 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 265 B
build/block-library/blocks/button/editor.css 265 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 291 B
build/block-library/blocks/buttons/editor.css 291 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-author-name/style-rtl.css 72 B
build/block-library/blocks/comment-author-name/style.css 72 B
build/block-library/blocks/comment-content/style-rtl.css 120 B
build/block-library/blocks/comment-content/style.css 120 B
build/block-library/blocks/comment-date/style-rtl.css 65 B
build/block-library/blocks/comment-date/style.css 65 B
build/block-library/blocks/comment-edit-link/style-rtl.css 70 B
build/block-library/blocks/comment-edit-link/style.css 70 B
build/block-library/blocks/comment-reply-link/style-rtl.css 71 B
build/block-library/blocks/comment-reply-link/style.css 71 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 228 B
build/block-library/blocks/comments-pagination/editor.css 217 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 641 B
build/block-library/blocks/cover/editor.css 642 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 331 B
build/block-library/blocks/embed/editor.css 331 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 357 B
build/block-library/blocks/form-input/style.css 357 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/editor-rtl.css 946 B
build/block-library/blocks/gallery/editor.css 951 B
build/block-library/blocks/gallery/style-rtl.css 1.83 kB
build/block-library/blocks/gallery/style.css 1.82 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 334 B
build/block-library/blocks/group/editor.css 334 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 785 B
build/block-library/blocks/image/editor.css 787 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/editor-rtl.css 179 B
build/block-library/blocks/latest-posts/editor.css 179 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/loginout/style-rtl.css 61 B
build/block-library/blocks/loginout/style.css 61 B
build/block-library/blocks/media-text/editor-rtl.css 321 B
build/block-library/blocks/media-text/editor.css 320 B
build/block-library/blocks/media-text/style-rtl.css 558 B
build/block-library/blocks/media-text/style.css 556 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 644 B
build/block-library/blocks/navigation-link/editor.css 645 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.19 kB
build/block-library/blocks/navigation/editor.css 2.2 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-biography/style-rtl.css 74 B
build/block-library/blocks/post-author-biography/style.css 74 B
build/block-library/blocks/post-author-name/style-rtl.css 69 B
build/block-library/blocks/post-author-name/style.css 69 B
build/block-library/blocks/post-author/editor-rtl.css 107 B
build/block-library/blocks/post-author/editor.css 107 B
build/block-library/blocks/post-author/style-rtl.css 188 B
build/block-library/blocks/post-author/style.css 189 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-content/style-rtl.css 79 B
build/block-library/blocks/post-content/style.css 79 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-excerpt/style-rtl.css 155 B
build/block-library/blocks/post-excerpt/style.css 155 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 347 B
build/block-library/blocks/post-featured-image/style.css 347 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 162 B
build/block-library/blocks/post-title/style.css 162 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 154 B
build/block-library/blocks/query-pagination/editor.css 154 B
build/block-library/blocks/query-pagination/style-rtl.css 237 B
build/block-library/blocks/query-pagination/style.css 237 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 233 B
build/block-library/blocks/quote/theme.css 236 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 199 B
build/block-library/blocks/search/editor.css 199 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-tagline/style-rtl.css 65 B
build/block-library/blocks/site-tagline/style.css 65 B
build/block-library/blocks/site-title/editor-rtl.css 85 B
build/block-library/blocks/site-title/editor.css 85 B
build/block-library/blocks/site-title/style-rtl.css 143 B
build/block-library/blocks/site-title/style.css 143 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 757 B
build/block-library/blocks/social-links/editor.css 756 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-of-contents/style-rtl.css 83 B
build/block-library/blocks/table-of-contents/style.css 83 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/editor-rtl.css 144 B
build/block-library/blocks/tag-cloud/editor.css 144 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 368 B
build/block-library/blocks/template-part/editor.css 368 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/editor-rtl.css 396 B
build/block-library/blocks/video/editor.css 397 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/editor-rtl.css 11.7 kB
build/block-library/editor.css 11.7 kB
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.9 kB
build/block-library/style.css 14.9 kB
build/block-library/theme-rtl.css 708 B
build/block-library/theme.css 712 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/components/style-rtl.css 12.3 kB
build/components/style.css 12.3 kB
build/compose/index.min.js 12.7 kB
build/core-commands/index.min.js 3.11 kB
build/core-data/index.min.js 73.4 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.66 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 580 B
build/edit-post/index.min.js 13.6 kB
build/edit-post/style-rtl.css 2.54 kB
build/edit-post/style.css 2.54 kB
build/edit-site/index.min.js 217 kB
build/edit-site/posts-rtl.css 7.31 kB
build/edit-site/posts.css 7.31 kB
build/edit-site/style-rtl.css 12.6 kB
build/edit-site/style.css 12.6 kB
build/edit-widgets/index.min.js 17.8 kB
build/edit-widgets/style-rtl.css 4.19 kB
build/edit-widgets/style.css 4.19 kB
build/editor/style-rtl.css 9.33 kB
build/editor/style.css 9.34 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.11 kB
build/format-library/style-rtl.css 476 B
build/format-library/style.css 476 B
build/hooks/index.min.js 1.65 kB
build/html-entities/index.min.js 445 B
build/i18n/index.min.js 3.58 kB
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.19 kB
build/list-reusable-blocks/style-rtl.css 852 B
build/list-reusable-blocks/style.css 852 B
build/media-utils/index.min.js 3.2 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.62 kB
build/nux/style-rtl.css 749 B
build/nux/style.css 745 B
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.55 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.04 kB
build/token-list/index.min.js 581 B
build/url/index.min.js 3.9 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.17 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

@SantosGuillamot SantosGuillamot added the Needs Dev Note Requires a developer note for a major WordPress release cycle label Sep 28, 2024
@SantosGuillamot SantosGuillamot marked this pull request as ready for review September 30, 2024 10:29
Copy link

github-actions bot commented Sep 30, 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.

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

Co-authored-by: cbravobernal <[email protected]>
Co-authored-by: SantosGuillamot <[email protected]>
Co-authored-by: gziolo <[email protected]>
Co-authored-by: noisysocks <[email protected]>

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

@SantosGuillamot SantosGuillamot added the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Sep 30, 2024
Base automatically changed from refactor/remove-registry-bindings to trunk September 30, 2024 10:59
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.

I have an impression that some lines were committed to trunk earlier today and this branch could use a rebase.

packages/block-editor/README.md Show resolved Hide resolved
Comment on lines +396 to +402
// Only open this API in Gutenberg and for `core/post-meta` for the moment.
let getFieldsList;
if ( globalThis.IS_GUTENBERG_PLUGIN ) {
getFieldsList = action.getFieldsList;
} else if ( action.name === 'core/post-meta' ) {
getFieldsList = action.getFieldsList;
}
Copy link
Member

Choose a reason for hiding this comment

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

Yes, that looks right. In effect, all custom sources can test getFieldsList with the Gutenberg plugin, but only core/post-meta is handled with WP core.

@@ -793,6 +843,22 @@ _Returns_

- `Array`: Updated Block list.

### unregisterBlockBindingsSource

Unregisters a block bindings source
Copy link
Member

Choose a reason for hiding this comment

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

Nit: this could provide more details.

Suggested change
Unregisters a block bindings source
Unregisters a block bindings source by providing its name.


_Parameters_

- _source_ `Object`: Properties of the source to be registered.
Copy link
Member

Choose a reason for hiding this comment

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

Are all of the properties mandatory?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

No, they are not. I wrapped the optional ones with [] because I thought that was the way to do it. Should I clarify it in the description anyway?

Copy link
Member

Choose a reason for hiding this comment

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

Ah, I missed that nuance. I would welcome the update to the description of the parameters to make it easier to discover that some params are optional.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Added in this commit: a5792ef

packages/blocks/README.md Outdated Show resolved Hide resolved
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.

Overall, the API is in a very good state, in my opinion. It's very late in the WP 6.7 cycle so I'm not sure whether landing it before WordPress 6.7 beta 1 is still doable. This would have to be confirmed and handled by @noisysocks and @kevin940726.

I left mostly comments about improvements to how the API is documented, which could use a more comprehensive check separately.

@SantosGuillamot SantosGuillamot force-pushed the update/open-stable-block-bindings-apis branch from 212b8c8 to 1fbfde4 Compare September 30, 2024 13:04
@noisysocks
Copy link
Member

Ignore the above, I've cherry-picked into wp/6.7.

@gziolo
Copy link
Member

gziolo commented Oct 1, 2024

Awesome, thank you so much @noisysocks. Great job @SantosGuillamot and @cbravobernal.

Is there a tracking issue for the new reference page for Block Bindings? It’s going to be important to highlight that the server API is available from WordPress 6.5, but the client counterparts need WordPress 6.7.

One more thought, for the sake of documentation, I’m wondering if @since WordPress 6.7 can be used in JSDoc comments to mark new API methods similar to how it is established in WordPress core.

@SantosGuillamot
Copy link
Contributor Author

Is there a tracking issue for the new reference page for Block Bindings? It’s going to be important to highlight that the server API is available from WordPress 6.5, but the client counterparts need WordPress 6.7.

Do you mean in the docs? Maybe @justintadlock can help here. In the short term, I want to post an update with these changes in the iteration issue and we have to work on the dev notes in the coming weeks.

I’m wondering if @SInCE WordPress 6.7 can be used in JSDoc comments to mark new API methods similar to how it is established in WordPress core.

It makes sense to me. At least for this particular case.

@gziolo
Copy link
Member

gziolo commented Oct 1, 2024

Do you mean in the docs? Maybe @justintadlock can help here. In the short term, I want to post an update with these changes in the iteration issue and we have to work on the dev notes in the coming weeks.

Yes, the documentation that explains how to use everything, some existing references:

Sure, @justintadlock can help. However, the implementers usually draft the initial version as they have all the necessary insights.

Edit: Filed an issue:

@SantosGuillamot
Copy link
Contributor Author

However, the implementers usually draft the initial version as they have all the necessary insights.

Totally. I just didn't know what was the best place to write down that information.

@SantosGuillamot
Copy link
Contributor Author

One more thought, for the sake of documentation, I’m wondering if @SInCE WordPress 6.7 can be used in JSDoc comments to mark new API methods similar to how it is established in WordPress core.

I've opened a pull request to discuss this possibility: #65796

getdave pushed a commit that referenced this pull request Oct 1, 2024
* Try use select and dispatch instead of registry

* Fix `setValues`

* Open `useBlockBindingsUtils`

* Open registration APIs

* Restrict `getFieldsList` API

* Update `useBlockBindingsUtils` docs

* Update register/unregister bindings docs

* Simplify API functions examples

Co-authored-by: Greg Ziółkowski <[email protected]>

* Update docs

* Update comments

---------

Co-authored-by: Carlos Bravo <[email protected]>
Co-authored-by: Greg Ziółkowski <[email protected]>

Co-authored-by: cbravobernal <[email protected]>
Co-authored-by: SantosGuillamot <[email protected]>
Co-authored-by: gziolo <[email protected]>
huubl pushed a commit to huubl/gutenberg that referenced this pull request Oct 2, 2024
* Try use select and dispatch instead of registry

* Fix `setValues`

* Open `useBlockBindingsUtils`

* Open registration APIs

* Restrict `getFieldsList` API

* Update `useBlockBindingsUtils` docs

* Update register/unregister bindings docs

* Simplify API functions examples

Co-authored-by: Greg Ziółkowski <[email protected]>

* Update docs

* Update comments

---------

Co-authored-by: Carlos Bravo <[email protected]>
Co-authored-by: Greg Ziółkowski <[email protected]>

Co-authored-by: cbravobernal <[email protected]>
Co-authored-by: SantosGuillamot <[email protected]>
Co-authored-by: gziolo <[email protected]>
huubl added a commit to huubl/gutenberg that referenced this pull request Oct 2, 2024
draganescu pushed a commit that referenced this pull request Oct 2, 2024
* Try use select and dispatch instead of registry

* Fix `setValues`

* Open `useBlockBindingsUtils`

* Open registration APIs

* Restrict `getFieldsList` API

* Update `useBlockBindingsUtils` docs

* Update register/unregister bindings docs

* Simplify API functions examples

Co-authored-by: Greg Ziółkowski <[email protected]>

* Update docs

* Update comments

---------

Co-authored-by: Carlos Bravo <[email protected]>
Co-authored-by: Greg Ziółkowski <[email protected]>

Co-authored-by: cbravobernal <[email protected]>
Co-authored-by: SantosGuillamot <[email protected]>
Co-authored-by: gziolo <[email protected]>
@colorful-tones
Copy link
Member

@SantosGuillamot I know I'm missing something here and I think I'm probably using the wrong hook to register my script, but I wanted to test the unregisterBlockBindingsSource, but I could not get it to work.

All of my code is here: https://github.com/colorful-tones/wp-testing-plugin

I'm registering a custom source here, which works fine: https://github.com/colorful-tones/wp-testing-plugin/blob/main/inc/block-bindings-6-7.php#L77-L83

Then, I'm using enqueue_block_editor_assets to enqueue my JavaScript file here: https://github.com/colorful-tones/wp-testing-plugin/blob/main/inc/block-bindings-6-7.php#L109-L116, which is passing the array( 'wp-blocks' ) as a dependency.

And here is the final JavaScript to unregister the source, which does not work: wp.blocks.unregisterBlockBindingsSource( 'demo/just-a-test' );

Any guidance you might have is appreciated. Thanks!

@SantosGuillamot
Copy link
Contributor Author

Your code looks good to me. Let me try to clarify what is happening:

  • You are registering your source only in the server.
  • It gets bootstrapped in the client at this point: edit-post & edit-site.
  • You unregister it through a script sent to the client.

The problem is that your script is running BEFORE the bootstrap, so the source doesn't exist in the client yet. If you run the exact same code in the console, it should work.

Having said that, I'm not sure what is the best way to fix that. I assume it could be solved by using something like useEffect to react to changes in the registered sources, but maybe it is something we need to address at a framework level somehow. @gziolo Any guidance on this?

@fabiankaegy
Copy link
Member

@SantosGuillamot @colorful-tones I think the only real way to get arround those timing issues is to ensure the scripts load in the correct oder.

So in this case here the JS file is enqueued with only the wp-blocks dependency.

Because of that it loads before the edit-site / edit-post dependency...

There are two ways to get around that.

  1. Add the wp-edit-site / wp-edit-post dependency to the script here: https://github.com/colorful-tones/wp-testing-plugin/blob/af2e36d9249ee800155a61c07219e7964e5072e0/inc/block-bindings-6-7.php#L113 (Need to ensure that it is either or depending on the context to avoid loading both...)
  2. Alternatively using the domReady function from the wp-dom-ready package should also do the trick. Because then the JS only executes when all scripts on the page have fully loaded.

@colorful-tones
Copy link
Member

Add the wp-edit-site / wp-edit-post dependency to the script...

This did the trick. Although, I'm not sure the JS warning in console is sufficient for an end user? Perhaps I'm misunderstanding the use case of these registration/unregistration functions? 🤔

Screenshot 2024-10-03 at 9 44 10 AM

@SantosGuillamot
Copy link
Contributor Author

Although, I'm not sure the JS warning in console is sufficient for an end user? Perhaps I'm misunderstanding the use case of these registration/unregistration functions?

I am not sure if it is a problem for the end user or for the developer. The end user doesn't get a warning because when the source is not unregistered, the source is actually valid. If a block is connected to an invalid source, it should show a warning in the Attributes panel.

Screenshot 2024-10-04 at 09 29 59

The warning is intended for the developer calling unregisterBlockBindingsSource to let them know they are trying to unregister a source that doesn't exist.

@colorful-tones
Copy link
Member

If a block is connected to an invalid source, it should show a warning in the Attributes panel.

Ok, this makes sense and answers my initial concern. 👍

The warning is intended for the developer calling unregisterBlockBindingsSource to let them know they are trying to unregister a source that doesn't exist.

Love this, and thanks for clarifying and I'm glad that warning is there for this purpose. 👍

@gziolo
Copy link
Member

gziolo commented Oct 7, 2024

I drafted a prototype #65921 that potentially could resolve the issue with unregistering sources, and offer a general way for running 3rd party code that might depend on what core, plugins and themes might register by replicating add_action( 'init', ...) and add_action( 'admin_init', ... ) that is widely used on the server. It won't be ready for WordPress 6.7, but it's time to get the discussion going. I will provide more details in the following days.

@SantosGuillamot, I noticed that the Block Bindings aren't integrated with other editor screens outside of the site and post editor: edit-widgets and customize-widgets.

@SantosGuillamot
Copy link
Contributor Author

I noticed that the Block Bindings aren't integrated with other editor screens outside of the site and post editor: edit-widgets and customize-widgets.

I've started this pull request to register sources in those screens. Although right now it is really difficult to create bindings there because the UI is not supported for custom sources, post meta fields are not available, and it seems I can't access the code editor. Anyway, it is good to have it there to ensure they are available once the UI is open for more sources.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Backported to WP Core Pull request that has been successfully merged into WP Core [Feature] Block bindings Needs Dev Note Requires a developer note for a major WordPress release cycle [Type] New API New API to be used by plugin developers or package users.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants