Skip to content

Conversation

@cbravobernal
Copy link
Contributor

@cbravobernal cbravobernal commented Sep 8, 2025

What?

This PR introduces a Block Bindings EditorUI API that allows third-party developers to extend the block bindings UI with their own sources.

Why?

The existing block bindings system lacked for an extensible UI: No way for plugins to customize the bindings interface

How

Dropdown Mode:

registerBlockBindingsSource({
  name: 'my-plugin/custom-source',
  label: 'Custom Source',
  editorUI({ select, context }) {
    const data = [
      { key: 'post_title', label: 'Post Title', type: 'string', 'args': { 'key': 'post_title' } },
      { key: 'view_count', label: 'View Count', type: 'number', 'args': { 'key': 'post_title' } },
    ];

    return {
      mode: 'dropdown',
      data
    };
  },
});

Modal Mode:

const ModalNowDateButton = ( { attribute } ) => {
	const { updateBlockBindings } = useBlockBindingsUtils();

	return (
		<button
			style={ {
				padding: '8px 16px',
				backgroundColor: '#007cba',
				color: 'white',
				border: 'none',
				borderRadius: '4px',
				cursor: 'pointer',
			} }
			onClick={ () => {
				updateBlockBindings( {
					[ attribute ]: {
						source: 'bbe/now-date',
					},
				} );
			} }
		>
			Set now Date
		</button>
	);
};

registerBlockBindingsSource( {
	name: 'bbe/now-date',
	useContext: [ 'postId', 'postType' ],
	getValues: ( { bindings } ) => {
		return {
			content: getCurrentDate(),
		};
	},
	editorUI() {
		const currentDate = getCurrentDate();
		return {
			mode: 'modal',
			data: [
				{
					value: currentDate,
					label: __( 'Current date', 'text-domain' ),
					type: 'string',
				},
			],
			renderModalContent: ModalNowDateButton,
		};
	},
} );

The attributes validation is made following this docs: https://developer.wordpress.org/block-editor/reference-guides/block-api/block-attributes/#type-validation

String values can also contain : https://developer.wordpress.org/rest-api/extending-the-rest-api/schema/#format

⚠️ Some topics still needs discussion.

  • Should canUserEditValue return false for the modal version?
  • Should we make getFieldsList backwards compatible? (Already done)

For follow-up PRs:

  • Review the isChecked solution. Do not make it key dependant.
  • Disable editorUI inside the function. (add a disabled mode)
  • Add removeBlockBinding
  • Set aditional metadata on the block ? ( Test if can be done without passing an additional dispatch)
  • Provide data types.

Screenshot

testing.mp4

@cbravobernal cbravobernal self-assigned this Sep 8, 2025
@cbravobernal cbravobernal added the [Type] Experimental Experimental feature or API. label Sep 8, 2025
@github-actions
Copy link

github-actions bot commented Sep 8, 2025

Size Change: +737 B (+0.04%)

Total Size: 1.96 MB

Filename Size Change
build/block-editor/index.min.js 270 kB +403 B (+0.15%)
build/blocks/index.min.js 52.9 kB +233 B (+0.44%)
build/editor/index.min.js 137 kB +101 B (+0.07%)
ℹ️ View Unchanged
Filename Size
build-module/a11y/index.min.js 482 B
build-module/block-library/accordion/view.min.js 656 B
build-module/block-library/file/view.min.js 466 B
build-module/block-library/form/view.min.js 533 B
build-module/block-library/image/view.min.js 1.78 kB
build-module/block-library/navigation/view.min.js 1.19 kB
build-module/block-library/query/view.min.js 767 B
build-module/block-library/search/view.min.js 639 B
build-module/interactivity-router/full-page.min.js 565 B
build-module/interactivity-router/index.min.js 11.6 kB
build-module/interactivity/debug.min.js 17.7 kB
build-module/interactivity/index.min.js 14.1 kB
build/a11y/index.min.js 925 B
build/annotations/index.min.js 2.13 kB
build/api-fetch/index.min.js 2.41 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
build/block-directory/index.min.js 7.18 kB
build/block-directory/style-rtl.css 1.05 kB
build/block-directory/style.css 1.05 kB
build/block-editor/content-rtl.css 4.52 kB
build/block-editor/content.css 4.51 kB
build/block-editor/default-editor-styles-rtl.css 418 B
build/block-editor/default-editor-styles.css 418 B
build/block-editor/style-rtl.css 16 kB
build/block-editor/style.css 16 kB
build/block-library/blocks/accordion-heading/style-rtl.css 340 B
build/block-library/blocks/accordion-heading/style.css 340 B
build/block-library/blocks/accordion-item/style-rtl.css 213 B
build/block-library/blocks/accordion-item/style.css 213 B
build/block-library/blocks/accordion-panel/style-rtl.css 99 B
build/block-library/blocks/accordion-panel/style.css 99 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 61 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/breadcrumbs/style-rtl.css 203 B
build/block-library/blocks/breadcrumbs/style.css 203 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 554 B
build/block-library/blocks/button/style.css 554 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 349 B
build/block-library/blocks/buttons/style.css 349 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 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 139 B
build/block-library/blocks/code/style.css 139 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 191 B
build/block-library/blocks/comment-template/style.css 191 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 168 B
build/block-library/blocks/comments-pagination/editor.css 168 B
build/block-library/blocks/comments-pagination/style-rtl.css 201 B
build/block-library/blocks/comments-pagination/style.css 201 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 842 B
build/block-library/blocks/comments/editor.css 842 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 637 B
build/block-library/blocks/cover/editor-rtl.css 631 B
build/block-library/blocks/cover/editor.css 631 B
build/block-library/blocks/cover/style-rtl.css 1.7 kB
build/block-library/blocks/cover/style.css 1.69 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 278 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 366 B
build/block-library/blocks/form-input/style.css 366 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/freeform/editor-rtl.css 2.59 kB
build/block-library/blocks/freeform/editor.css 2.59 kB
build/block-library/blocks/gallery/editor-rtl.css 615 B
build/block-library/blocks/gallery/editor.css 616 B
build/block-library/blocks/gallery/style-rtl.css 1.83 kB
build/block-library/blocks/gallery/style.css 1.83 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 353 B
build/block-library/blocks/html/editor.css 354 B
build/block-library/blocks/image/editor-rtl.css 763 B
build/block-library/blocks/image/editor.css 763 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 137 B
build/block-library/blocks/image/theme.css 137 B
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 139 B
build/block-library/blocks/latest-posts/editor.css 138 B
build/block-library/blocks/latest-posts/style-rtl.css 520 B
build/block-library/blocks/latest-posts/style.css 520 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 543 B
build/block-library/blocks/media-text/style.css 542 B
build/block-library/blocks/more/editor-rtl.css 393 B
build/block-library/blocks/more/editor.css 393 B
build/block-library/blocks/navigation-link/editor-rtl.css 625 B
build/block-library/blocks/navigation-link/editor.css 628 B
build/block-library/blocks/navigation-link/style-rtl.css 190 B
build/block-library/blocks/navigation-link/style.css 188 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.23 kB
build/block-library/blocks/navigation/editor.css 2.24 kB
build/block-library/blocks/navigation/style-rtl.css 2.27 kB
build/block-library/blocks/navigation/style.css 2.26 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 356 B
build/block-library/blocks/page-list/editor.css 356 B
build/block-library/blocks/page-list/style-rtl.css 192 B
build/block-library/blocks/page-list/style.css 192 B
build/block-library/blocks/paragraph/editor-rtl.css 251 B
build/block-library/blocks/paragraph/editor.css 251 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/style-rtl.css 188 B
build/block-library/blocks/post-author/style.css 189 B
build/block-library/blocks/post-comments-count/style-rtl.css 72 B
build/block-library/blocks/post-comments-count/style.css 72 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 525 B
build/block-library/blocks/post-comments-form/style.css 525 B
build/block-library/blocks/post-comments-link/style-rtl.css 71 B
build/block-library/blocks/post-comments-link/style.css 71 B
build/block-library/blocks/post-content/style-rtl.css 61 B
build/block-library/blocks/post-content/style.css 61 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 715 B
build/block-library/blocks/post-featured-image/editor.css 712 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/style-rtl.css 414 B
build/block-library/blocks/post-template/style.css 414 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 133 B
build/block-library/blocks/pullquote/editor.css 133 B
build/block-library/blocks/pullquote/style-rtl.css 365 B
build/block-library/blocks/pullquote/style.css 365 B
build/block-library/blocks/pullquote/theme-rtl.css 176 B
build/block-library/blocks/pullquote/theme.css 176 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-total/style-rtl.css 64 B
build/block-library/blocks/query-total/style.css 64 B
build/block-library/blocks/query/editor-rtl.css 432 B
build/block-library/blocks/query/editor.css 432 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 131 B
build/block-library/blocks/read-more/style.css 131 B
build/block-library/blocks/rss/editor-rtl.css 126 B
build/block-library/blocks/rss/editor.css 126 B
build/block-library/blocks/rss/style-rtl.css 284 B
build/block-library/blocks/rss/style.css 283 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 665 B
build/block-library/blocks/search/style.css 666 B
build/block-library/blocks/search/theme-rtl.css 113 B
build/block-library/blocks/search/theme.css 113 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 773 B
build/block-library/blocks/site-logo/editor.css 770 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 314 B
build/block-library/blocks/social-link/editor.css 314 B
build/block-library/blocks/social-links/editor-rtl.css 339 B
build/block-library/blocks/social-links/editor.css 338 B
build/block-library/blocks/social-links/style-rtl.css 1.51 kB
build/block-library/blocks/social-links/style.css 1.51 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 92 B
build/block-library/blocks/tag-cloud/editor.css 92 B
build/block-library/blocks/tag-cloud/style-rtl.css 248 B
build/block-library/blocks/tag-cloud/style.css 248 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/term-template/editor-rtl.css 225 B
build/block-library/blocks/term-template/editor.css 225 B
build/block-library/blocks/term-template/style-rtl.css 135 B
build/block-library/blocks/term-template/style.css 135 B
build/block-library/blocks/terms-query/style-rtl.css 70 B
build/block-library/blocks/terms-query/style.css 70 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 413 B
build/block-library/blocks/video/editor.css 414 B
build/block-library/blocks/video/style-rtl.css 202 B
build/block-library/blocks/video/style.css 202 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.5 kB
build/block-library/editor.css 11.5 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 239 kB
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 15.5 kB
build/block-library/style.css 15.4 kB
build/block-library/theme-rtl.css 715 B
build/block-library/theme.css 719 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.3 kB
build/commands/style-rtl.css 980 B
build/commands/style.css 977 B
build/components/index.min.js 252 kB
build/components/style-rtl.css 13.7 kB
build/components/style.css 13.7 kB
build/compose/index.min.js 12.8 kB
build/core-commands/index.min.js 3.58 kB
build/core-data/index.min.js 75.4 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.45 kB
build/customize-widgets/style.css 1.45 kB
build/data-controls/index.min.js 641 B
build/data/index.min.js 8.7 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.68 kB
build/edit-post/classic-rtl.css 597 B
build/edit-post/classic.css 599 B
build/edit-post/index.min.js 13.9 kB
build/edit-post/style-rtl.css 2.8 kB
build/edit-post/style.css 2.81 kB
build/edit-site/index.min.js 242 kB
build/edit-site/posts-rtl.css 9.41 kB
build/edit-site/posts.css 9.41 kB
build/edit-site/style-rtl.css 15.5 kB
build/edit-site/style.css 15.5 kB
build/edit-widgets/index.min.js 17.8 kB
build/edit-widgets/style-rtl.css 4.07 kB
build/edit-widgets/style.css 4.08 kB
build/editor/style-rtl.css 9.6 kB
build/editor/style.css 9.61 kB
build/element/index.min.js 4.86 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.23 kB
build/format-library/style-rtl.css 497 B
build/format-library/style.css 497 B
build/hooks/index.min.js 1.65 kB
build/html-entities/index.min.js 467 B
build/i18n/index.min.js 2.23 kB
build/is-shallow-equal/index.min.js 526 B
build/keyboard-shortcuts/index.min.js 1.32 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.13 kB
build/list-reusable-blocks/style-rtl.css 875 B
build/list-reusable-blocks/style.css 876 B
build/media-utils/index.min.js 3.69 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.62 kB
build/nux/style-rtl.css 791 B
build/nux/style.css 787 B
build/patterns/index.min.js 7.55 kB
build/patterns/style-rtl.css 711 B
build/patterns/style.css 710 B
build/plugins/index.min.js 1.87 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/index.min.js 2.9 kB
build/preferences/style-rtl.css 590 B
build/preferences/style.css 589 B
build/primitives/index.min.js 829 B
build/priority-queue/index.min.js 1.54 kB
build/private-apis/index.min.js 978 B
build/react-i18n/index.min.js 640 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.7 kB
build/reusable-blocks/index.min.js 2.53 kB
build/reusable-blocks/style-rtl.css 281 B
build/reusable-blocks/style.css 281 B
build/rich-text/index.min.js 12.2 kB
build/router/index.min.js 5.47 kB
build/server-side-render/index.min.js 1.6 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.97 kB
build/vendors/react-dom.min.js 41.7 kB
build/vendors/react-jsx-runtime.min.js 556 B
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 965 B
build/vips/index.min.js 36.2 kB
build/warning/index.min.js 250 B
build/widgets/index.min.js 7.17 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@github-actions
Copy link

github-actions bot commented Sep 11, 2025

Flaky tests detected in bf9f93c.
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/18276654962
📝 Reported issues:

@gziolo
Copy link
Member

gziolo commented Sep 12, 2025

Nice progress on this PR 🔥

@cbravobernal
Copy link
Contributor Author

cbravobernal commented Sep 12, 2025

Nice progress on this PR 🔥

It is almost ready to review. I only need to update the PR description.

Edit: and fix the registration that broke everything 😆

@cbravobernal cbravobernal marked this pull request as ready for review September 15, 2025 07:40
@github-actions
Copy link

github-actions bot commented Sep 15, 2025

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: ockham <[email protected]>
Co-authored-by: gziolo <[email protected]>
Co-authored-by: chriszarate <[email protected]>
Co-authored-by: sirreal <[email protected]>

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

@gziolo
Copy link
Member

gziolo commented Sep 15, 2025

Can you provide a more detailed explanation of the API proposed? In, particular value in some places looks unclear to me. Taking the example included:

registerBlockBindingsSource({
    name: 'my-plugin/custom-source',
    label: 'Custom Source',
    editorUI: {
        mode: 'dropdown',
        data: [
            {
                label: 'Post Title',
                value: 'post_title',
                type: 'string'
            },
            {
                label: 'View Count', 
                value: 42,
                type: 'number'
            }
        ],
        onSelect( { value, updateBlockBindings, attribute } ) {
		updateBlockBindings( {
		    [ attribute ]: {
		       source: 'core/post-meta',
		         args: {
			  key: value,
		         },
		       },
		} );
	},
    }
});

What value represents in onSelect callback? I see in other places value set to an arbitrary number 42, which is unlikely to be a post meta key necessary. It would help to clarify how the post meta key gets passed from the list of options in the dropdown. The value might be confusing to me because it seems to be signaling that it holds the current value for the linked field, which isn't something we want to serialize in the block's saved metadata.

@cbravobernal
Copy link
Contributor Author

cbravobernal commented Sep 15, 2025

Can you provide a more detailed explanation of the API proposed? In, particular value in some places looks unclear to me. Taking the example included:

registerBlockBindingsSource({
    name: 'my-plugin/custom-source',
    label: 'Custom Source',
    editorUI: {
        mode: 'dropdown',
        data: [
            {
                label: 'Post Title',
                value: 'post_title',
                type: 'string'
            },
            {
                label: 'View Count', 
                value: 42,
                type: 'number'
            }
        ],
        onSelect( { value, updateBlockBindings, attribute } ) {
		updateBlockBindings( {
		    [ attribute ]: {
		       source: 'core/post-meta',
		         args: {
			  key: value,
		         },
		       },
		} );
	},
    }
});

What value represents in onSelect callback? I see in other places value set to an arbitrary number 42, which is unlikely to be a post meta key necessary. It would help to clarify how the post meta key gets passed from the list of options in the dropdown. The value might be confusing to me because it seems to be signaling that it holds the current value for the linked field, which isn't something we want to serialize in the block's saved metadata.

We should also pass the attribute to the modal by the way.

The value is the 'value' from the 'value' key provided in the data, when the source data is selected. I agree that is not the best way to call it, as it may cause some confusions. I'll change it.

Should we pass the entire data element?

@cbravobernal cbravobernal force-pushed the try/add-second-level-sources branch from 04ee9c5 to 4e818c9 Compare September 15, 2025 11:06
@cbravobernal
Copy link
Contributor Author

@gziolo I updated the code to use 'item' instead of 'value'. item is now contains the entire data object value selected on click.

@gziolo
Copy link
Member

gziolo commented Sep 15, 2025

@gziolo I updated the code to use 'item' instead of 'value'. item is now contains the entire data object value selected on click.

I see the updated core sources now use item.key. The developer has access to other elements for the item, which should be helpful. They will be able to pass and consume as many arguments as they need. In the description, a tiny update in editorUI.data is necessary as key is missing there.

chriszarate added a commit to Automattic/remote-data-blocks that referenced this pull request Sep 15, 2025
@cbravobernal
Copy link
Contributor Author

Ping to @chriszarate. Who did a review on a remote branch that I will address. That way we won't miss him on the props commit.

@ockham
Copy link
Contributor

ockham commented Oct 2, 2025

I noticed that we were still showing the empty many if there were no compatible sources for a given bindable attribute:

Screenshot 2025-10-02 at 14 28 22

Since this is the first thing anyone who wants to try this out will see -- e.g. on the Paragraph block (unless they have any custom sources defined) -- I wanted to fix it. I've pushed some commits to do so.

Code-wise, I've found some more duplication that we should eventually get rid of, and we should also review how we use and nest ToolsPanel, ItemGroup, ToolsPanelItem, and Item (plus Menu and Menu.TriggerButton, in case of the EditableBlockBindingsPanelItem), but that's for a follow-up 😅

@ockham
Copy link
Contributor

ockham commented Oct 2, 2025

e2e tests are failing. I think I can repro locally: When selecting a Modal source (e.g. the one from the "Gutenberg Test Block Bindings" plugin used by e2e tests) and clicking one of the buttons in the modal, it doesn't disappear. I think that's a bug I must have introduced in one of my recent commits. Shouldn't be too hard to fix hopefully.

@ockham
Copy link
Contributor

ockham commented Oct 3, 2025

e2e tests are failing. I think I can repro locally: When selecting a Modal source (e.g. the one from the "Gutenberg Test Block Bindings" plugin used by e2e tests) and clicking one of the buttons in the modal, it doesn't disappear. I think that's a bug I must have introduced in one of my recent commits. Shouldn't be too hard to fix hopefully.

TBH I'm not quite sure why/how it worked in the first place 🤔 (before my changes broke it).

Anyway, here's one possible way of fixing this -- by passing a closeModal function as prop to the modal.

Patch
diff --git a/packages/block-editor/src/hooks/block-bindings.js b/packages/block-editor/src/hooks/block-bindings.js
index f0f0f625ab..a9f907df31 100644
--- a/packages/block-editor/src/hooks/block-bindings.js
+++ b/packages/block-editor/src/hooks/block-bindings.js
@@ -508,6 +508,7 @@ export const BlockBindingsPanel = ( { name: blockName, metadata } ) => {
 						return (
 							<RenderModalContent
 								attribute={ modalState.attribute }
+								closeModal={ handleCloseModal }
 							/>
 						);
 					} )() }
diff --git a/packages/e2e-tests/plugins/block-bindings/index.js b/packages/e2e-tests/plugins/block-bindings/index.js
index 2c25936633..8a116fc8fc 100644
--- a/packages/e2e-tests/plugins/block-bindings/index.js
+++ b/packages/e2e-tests/plugins/block-bindings/index.js
@@ -43,7 +43,7 @@ registerBlockBindingsSource( {
 	},
 } );
 
-const ModalButton = ( { fieldKey, fieldLabel, attribute } ) => {
+const ModalButton = ( { fieldKey, fieldLabel, attribute, closeModal } ) => {
 	const { updateBlockBindings } = wp.blockEditor.useBlockBindingsUtils();
 
 	return el(
@@ -56,6 +56,7 @@ const ModalButton = ( { fieldKey, fieldLabel, attribute } ) => {
 						args: { key: fieldKey },
 					},
 				} );
+				closeModal();
 			},
 			style: {
 				display: 'block',
@@ -86,7 +87,7 @@ registerBlockBindingsSource( {
 					},
 				} )
 			),
-			renderModalContent( { attribute } ) {
+			renderModalContent( { attribute, closeModal } ) {
 				return el(
 					'div',
 					{ style: { padding: '20px' } },
@@ -103,6 +104,7 @@ registerBlockBindingsSource( {
 								fieldKey: key,
 								fieldLabel: field?.label || key,
 								attribute,
+								closeModal,
 							} )
 					)
 				);

@ockham
Copy link
Contributor

ockham commented Oct 3, 2025

TBH I'm not quite sure why/how it worked in the first place 🤔 (before my changes broke it).

I re-tested the behavior at 9e1455b (prior to my changes). It looks like the modal closed when first selecting a source value; but when subsequently re-opened, and selecting a different value, it stayed open:

modal-before

That was probably unintentional, so I guess it's good to make it more consistent 🤔

Edit: e2e tests didn't detect this, since they only cover setting the binding via the modal once.

@ockham
Copy link
Contributor

ockham commented Oct 3, 2025

Here's another -- unrelated issue I just found while testing. If I try to edit the value in the "Bindings" panel in the block inspector, it doesn't work. Instead, I'm getting a console error:

bindings-panel

@cbravobernal
Copy link
Contributor Author

cbravobernal commented Oct 3, 2025

Here's another -- unrelated issue I just found while testing. If I try to edit the value in the "Bindings" panel in the block inspector, it doesn't work. Instead, I'm getting a console error:

It is indeed e2e code only.

https://github.com/WordPress/gutenberg/blob/3bf3abec3fa79788df7d76c478edf3063b220a80/packages/e2e-tests/plugins/block-bindings/index.js#L55-L94

The code is trying to edit "hardcoded" the post id 1 and type post. Let's get it from the context and fix it.

Edit: Fixed in 7095be1

@ockham
Copy link
Contributor

ockham commented Oct 6, 2025

Here's another -- unrelated issue I just found while testing. If I try to edit the value in the "Bindings" panel in the block inspector, it doesn't work. Instead, I'm getting a console error:

It is indeed e2e code only.
[...]
The code is trying to edit "hardcoded" the post id 1 and type post. Let's get it from the context and fix it.

Edit: Fixed in 7095be1

I'm still getting an error, although the message is different now:

image

I'll look into a fix.

@ockham
Copy link
Contributor

ockham commented Oct 6, 2025

I'm still getting an error, although the message is different now: [...]

Context wasn't being exposed to the source. I've pushed a fix: 372c976

This removes the error. It's still not working for the "Modal Source" and "Complete Source" -- editing the text in the field in the "Bindings" panel doesn't show any effect. But at least the error is gone 😬

(Wondering a bit what's the purpose of that text field in the first place, and if it's used/required by e2e tests if it's not working 🤔)

@cbravobernal
Copy link
Contributor Author

(Wondering a bit what's the purpose of that text field in the first place, and if it's used/required by e2e tests if it's not working 🤔)

If you remove it, tests break, so yes, seems to be necessary 😆

@ockham
Copy link
Contributor

ockham commented Oct 6, 2025

I'm still getting an error, although the message is different now: [...]

Context wasn't being exposed to the source. I've pushed a fix: 372c976

This removes the error. It's still not working for the "Modal Source" and "Complete Source" -- editing the text in the field in the "Bindings" panel doesn't show any effect. But at least the error is gone 😬

(Wondering a bit what's the purpose of that text field in the first place, and if it's used/required by e2e tests if it's not working 🤔)

Looks like the error I initially saw is also present on trunk. I'll try removing the "Bindings" panel in a follow-up to this PR.

@cbravobernal cbravobernal merged commit 2a9598c into trunk Oct 6, 2025
70 checks passed
@cbravobernal cbravobernal deleted the try/add-second-level-sources branch October 6, 2025 10:18
@github-actions github-actions bot added this to the Gutenberg 21.9 milestone Oct 6, 2025
@priethor priethor mentioned this pull request Oct 16, 2025
19 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Feature] Block bindings Needs Dev Note Requires a developer note for a major WordPress release cycle [Type] Experimental Experimental feature or API.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants