Blocks: Introduce `format` in attribute definitions, use for Block Bindings
What?
Introduce a new format field for use in attribute definitions (e.g. in block.json), and use it to filter block bindings source items based on format compatibility with bound attribute.
Fixes https://github.com/WordPress/gutenberg/issues/72446. Reverts https://github.com/WordPress/gutenberg/pull/72712.
Why?
To remove incompatible source items from the block bindings UI for a given block bindings source.
For example, when we show the available items from the core/post-data list for the Date block's datetime attribute, we only want to show the date and modified source items, but not link (which is an url and thus incompatible with a datetime field).
How?
By introducing a format field in attribute definitions, and adding block bindings code to peruse it.
Testing Instructions
- In the editor, insert a Date block.
- In the block inspector, open the "Attributes" panel.
- Click on the
datetimeattribute to expand the dropdown menu. It should contain the "Post Data" source. - Verify that there are two items available from that source: Post Date and Modified Date.
Screenshots or screencast
| Before | After |
|---|---|
TODO
- [ ] Add unit test coverage (to
packages/editor/src/bindings/test/post-data.js(?)).
Discussion
I'd like to discuss if this could still be considered for WP 6.9. I realize that introducing an addition to block.json so late in the cycle could be controversial. However:
- "Format" is a fairly established concept, and one that we might've introduced sooner or later anyway for more granular "typing" of attributes. (Maybe there could be some connection to the new Fields API and components?)
- Special attention needs to be paid when choosing what kinds of formats to allow. However, some standardization exists for those; we can take inspiration from other places in WP -- e.g. this.
Size Change: +23 B (0%)
Total Size: 2.58 MB
| Filename | Size | Change |
|---|---|---|
build/scripts/block-editor/index.min.js |
314 kB | -11 B (0%) |
build/scripts/block-library/index.min.js |
278 kB | +17 B (+0.01%) |
build/scripts/editor/index.min.js |
284 kB | +17 B (+0.01%) |
ℹ️ View Unchanged
| Filename | Size |
|---|---|
build/modules/a11y/index.min.js |
355 B |
build/modules/abilities/index.min.js |
42.3 kB |
build/modules/block-editor/utils/fit-text-frontend.min.js |
549 B |
build/modules/block-library/accordion/view.min.js |
779 B |
build/modules/block-library/file/view.min.js |
346 B |
build/modules/block-library/form/view.min.js |
528 B |
build/modules/block-library/image/view.min.js |
1.95 kB |
build/modules/block-library/navigation/view.min.js |
1.03 kB |
build/modules/block-library/query/view.min.js |
518 B |
build/modules/block-library/search/view.min.js |
498 B |
build/modules/block-library/tabs/view.min.js |
859 B |
build/modules/boot/index.min.js |
103 kB |
build/modules/core-abilities/index.min.js |
890 B |
build/modules/edit-site-init/index.min.js |
2.14 kB |
build/modules/interactivity-router/full-page.min.js |
451 B |
build/modules/interactivity-router/index.min.js |
11.5 kB |
build/modules/interactivity/index.min.js |
14.9 kB |
build/modules/latex-to-mathml/index.min.js |
56.5 kB |
build/modules/latex-to-mathml/loader.min.js |
131 B |
build/modules/lazy-editor/index.min.js |
18.8 kB |
build/modules/route/index.min.js |
24.6 kB |
build/modules/workflow/index.min.js |
36.8 kB |
build/scripts/a11y/index.min.js |
1.06 kB |
build/scripts/annotations/index.min.js |
2.38 kB |
build/scripts/api-fetch/index.min.js |
2.83 kB |
build/scripts/autop/index.min.js |
2.18 kB |
build/scripts/blob/index.min.js |
631 B |
build/scripts/block-directory/index.min.js |
8.03 kB |
build/scripts/block-serialization-default-parser/index.min.js |
1.16 kB |
build/scripts/block-serialization-spec-parser/index.min.js |
3.08 kB |
build/scripts/blocks/index.min.js |
56.4 kB |
build/scripts/commands/index.min.js |
19.9 kB |
build/scripts/components/index.min.js |
273 kB |
build/scripts/compose/index.min.js |
13.9 kB |
build/scripts/core-commands/index.min.js |
4.13 kB |
build/scripts/core-data/index.min.js |
86.7 kB |
build/scripts/customize-widgets/index.min.js |
12.3 kB |
build/scripts/data-controls/index.min.js |
793 B |
build/scripts/data/index.min.js |
9.62 kB |
build/scripts/date/index.min.js |
23.6 kB |
build/scripts/deprecated/index.min.js |
752 B |
build/scripts/dom-ready/index.min.js |
476 B |
build/scripts/dom/index.min.js |
4.91 kB |
build/scripts/edit-post/index.min.js |
16.3 kB |
build/scripts/edit-site/index.min.js |
234 kB |
build/scripts/edit-widgets/index.min.js |
20 kB |
build/scripts/element/index.min.js |
5.19 kB |
build/scripts/escape-html/index.min.js |
586 B |
build/scripts/format-library/index.min.js |
10.8 kB |
build/scripts/hooks/index.min.js |
1.83 kB |
build/scripts/html-entities/index.min.js |
494 B |
build/scripts/i18n/index.min.js |
2.46 kB |
build/scripts/is-shallow-equal/index.min.js |
568 B |
build/scripts/keyboard-shortcuts/index.min.js |
1.57 kB |
build/scripts/keycodes/index.min.js |
1.53 kB |
build/scripts/list-reusable-blocks/index.min.js |
2.44 kB |
build/scripts/media-utils/index.min.js |
69.5 kB |
build/scripts/notices/index.min.js |
1.11 kB |
build/scripts/nux/index.min.js |
1.88 kB |
build/scripts/patterns/index.min.js |
7.87 kB |
build/scripts/plugins/index.min.js |
2.14 kB |
build/scripts/preferences-persistence/index.min.js |
2.15 kB |
build/scripts/preferences/index.min.js |
3.31 kB |
build/scripts/primitives/index.min.js |
1.01 kB |
build/scripts/priority-queue/index.min.js |
1.61 kB |
build/scripts/private-apis/index.min.js |
1.07 kB |
build/scripts/react-i18n/index.min.js |
832 B |
build/scripts/react-refresh-entry/index.min.js |
9.44 kB |
build/scripts/react-refresh-runtime/index.min.js |
3.59 kB |
build/scripts/redux-routine/index.min.js |
3.36 kB |
build/scripts/reusable-blocks/index.min.js |
2.93 kB |
build/scripts/rich-text/index.min.js |
12.9 kB |
build/scripts/router/index.min.js |
5.96 kB |
build/scripts/server-side-render/index.min.js |
1.91 kB |
build/scripts/shortcode/index.min.js |
1.58 kB |
build/scripts/style-engine/index.min.js |
2.33 kB |
build/scripts/theme/index.min.js |
20.8 kB |
build/scripts/token-list/index.min.js |
739 B |
build/scripts/undo-manager/index.min.js |
917 B |
build/scripts/url/index.min.js |
3.98 kB |
build/scripts/vendors/react-dom.min.js |
43 kB |
build/scripts/vendors/react-jsx-runtime.min.js |
691 B |
build/scripts/vendors/react.min.js |
4.27 kB |
build/scripts/viewport/index.min.js |
1.22 kB |
build/scripts/warning/index.min.js |
454 B |
build/scripts/widgets/index.min.js |
7.81 kB |
build/scripts/wordcount/index.min.js |
1.04 kB |
build/styles/block-directory/style-rtl.css |
1.05 kB |
build/styles/block-directory/style.css |
1.05 kB |
build/styles/block-editor/content-rtl.css |
4.8 kB |
build/styles/block-editor/content.css |
4.79 kB |
build/styles/block-editor/default-editor-styles-rtl.css |
224 B |
build/styles/block-editor/default-editor-styles.css |
224 B |
build/styles/block-editor/style-rtl.css |
16.4 kB |
build/styles/block-editor/style.css |
16.4 kB |
build/styles/block-library/accordion-heading/style-rtl.css |
325 B |
build/styles/block-library/accordion-heading/style.css |
325 B |
build/styles/block-library/accordion-item/style-rtl.css |
180 B |
build/styles/block-library/accordion-item/style.css |
180 B |
build/styles/block-library/accordion-panel/style-rtl.css |
99 B |
build/styles/block-library/accordion-panel/style.css |
99 B |
build/styles/block-library/accordion/style-rtl.css |
62 B |
build/styles/block-library/accordion/style.css |
62 B |
build/styles/block-library/archives/editor-rtl.css |
61 B |
build/styles/block-library/archives/editor.css |
61 B |
build/styles/block-library/archives/style-rtl.css |
90 B |
build/styles/block-library/archives/style.css |
90 B |
build/styles/block-library/audio/editor-rtl.css |
149 B |
build/styles/block-library/audio/editor.css |
151 B |
build/styles/block-library/audio/style-rtl.css |
132 B |
build/styles/block-library/audio/style.css |
132 B |
build/styles/block-library/audio/theme-rtl.css |
134 B |
build/styles/block-library/audio/theme.css |
134 B |
build/styles/block-library/avatar/editor-rtl.css |
115 B |
build/styles/block-library/avatar/editor.css |
115 B |
build/styles/block-library/avatar/style-rtl.css |
104 B |
build/styles/block-library/avatar/style.css |
104 B |
build/styles/block-library/breadcrumbs/style-rtl.css |
203 B |
build/styles/block-library/breadcrumbs/style.css |
203 B |
build/styles/block-library/button/editor-rtl.css |
265 B |
build/styles/block-library/button/editor.css |
265 B |
build/styles/block-library/button/style-rtl.css |
554 B |
build/styles/block-library/button/style.css |
554 B |
build/styles/block-library/buttons/editor-rtl.css |
291 B |
build/styles/block-library/buttons/editor.css |
291 B |
build/styles/block-library/buttons/style-rtl.css |
349 B |
build/styles/block-library/buttons/style.css |
349 B |
build/styles/block-library/calendar/style-rtl.css |
239 B |
build/styles/block-library/calendar/style.css |
239 B |
build/styles/block-library/categories/editor-rtl.css |
132 B |
build/styles/block-library/categories/editor.css |
131 B |
build/styles/block-library/categories/style-rtl.css |
152 B |
build/styles/block-library/categories/style.css |
152 B |
build/styles/block-library/classic-rtl.css |
321 B |
build/styles/block-library/classic.css |
321 B |
build/styles/block-library/code/editor-rtl.css |
53 B |
build/styles/block-library/code/editor.css |
53 B |
build/styles/block-library/code/style-rtl.css |
139 B |
build/styles/block-library/code/style.css |
139 B |
build/styles/block-library/code/theme-rtl.css |
122 B |
build/styles/block-library/code/theme.css |
122 B |
build/styles/block-library/columns/editor-rtl.css |
108 B |
build/styles/block-library/columns/editor.css |
108 B |
build/styles/block-library/columns/style-rtl.css |
421 B |
build/styles/block-library/columns/style.css |
421 B |
build/styles/block-library/comment-author-avatar/editor-rtl.css |
124 B |
build/styles/block-library/comment-author-avatar/editor.css |
124 B |
build/styles/block-library/comment-author-name/style-rtl.css |
72 B |
build/styles/block-library/comment-author-name/style.css |
72 B |
build/styles/block-library/comment-content/style-rtl.css |
120 B |
build/styles/block-library/comment-content/style.css |
120 B |
build/styles/block-library/comment-date/style-rtl.css |
65 B |
build/styles/block-library/comment-date/style.css |
65 B |
build/styles/block-library/comment-edit-link/style-rtl.css |
70 B |
build/styles/block-library/comment-edit-link/style.css |
70 B |
build/styles/block-library/comment-reply-link/style-rtl.css |
71 B |
build/styles/block-library/comment-reply-link/style.css |
71 B |
build/styles/block-library/comment-template/style-rtl.css |
191 B |
build/styles/block-library/comment-template/style.css |
191 B |
build/styles/block-library/comments-pagination-numbers/editor-rtl.css |
122 B |
build/styles/block-library/comments-pagination-numbers/editor.css |
121 B |
build/styles/block-library/comments-pagination/editor-rtl.css |
168 B |
build/styles/block-library/comments-pagination/editor.css |
168 B |
build/styles/block-library/comments-pagination/style-rtl.css |
201 B |
build/styles/block-library/comments-pagination/style.css |
201 B |
build/styles/block-library/comments-title/editor-rtl.css |
75 B |
build/styles/block-library/comments-title/editor.css |
75 B |
build/styles/block-library/comments/editor-rtl.css |
842 B |
build/styles/block-library/comments/editor.css |
842 B |
build/styles/block-library/comments/style-rtl.css |
637 B |
build/styles/block-library/comments/style.css |
637 B |
build/styles/block-library/common-rtl.css |
1.11 kB |
build/styles/block-library/common.css |
1.11 kB |
build/styles/block-library/cover/editor-rtl.css |
631 B |
build/styles/block-library/cover/editor.css |
631 B |
build/styles/block-library/cover/style-rtl.css |
1.82 kB |
build/styles/block-library/cover/style.css |
1.81 kB |
build/styles/block-library/details/editor-rtl.css |
65 B |
build/styles/block-library/details/editor.css |
65 B |
build/styles/block-library/details/style-rtl.css |
86 B |
build/styles/block-library/details/style.css |
86 B |
build/styles/block-library/editor-elements-rtl.css |
75 B |
build/styles/block-library/editor-elements.css |
75 B |
build/styles/block-library/editor-rtl.css |
11.8 kB |
build/styles/block-library/editor.css |
11.8 kB |
build/styles/block-library/elements-rtl.css |
54 B |
build/styles/block-library/elements.css |
54 B |
build/styles/block-library/embed/editor-rtl.css |
331 B |
build/styles/block-library/embed/editor.css |
331 B |
build/styles/block-library/embed/style-rtl.css |
448 B |
build/styles/block-library/embed/style.css |
448 B |
build/styles/block-library/embed/theme-rtl.css |
133 B |
build/styles/block-library/embed/theme.css |
133 B |
build/styles/block-library/file/editor-rtl.css |
324 B |
build/styles/block-library/file/editor.css |
324 B |
build/styles/block-library/file/style-rtl.css |
278 B |
build/styles/block-library/file/style.css |
278 B |
build/styles/block-library/footnotes/style-rtl.css |
198 B |
build/styles/block-library/footnotes/style.css |
197 B |
build/styles/block-library/form-input/editor-rtl.css |
229 B |
build/styles/block-library/form-input/editor.css |
229 B |
build/styles/block-library/form-input/style-rtl.css |
366 B |
build/styles/block-library/form-input/style.css |
366 B |
build/styles/block-library/form-submission-notification/editor-rtl.css |
344 B |
build/styles/block-library/form-submission-notification/editor.css |
341 B |
build/styles/block-library/form-submit-button/style-rtl.css |
69 B |
build/styles/block-library/form-submit-button/style.css |
69 B |
build/styles/block-library/freeform/editor-rtl.css |
2.59 kB |
build/styles/block-library/freeform/editor.css |
2.59 kB |
build/styles/block-library/gallery/editor-rtl.css |
615 B |
build/styles/block-library/gallery/editor.css |
616 B |
build/styles/block-library/gallery/style-rtl.css |
1.84 kB |
build/styles/block-library/gallery/style.css |
1.84 kB |
build/styles/block-library/gallery/theme-rtl.css |
108 B |
build/styles/block-library/gallery/theme.css |
108 B |
build/styles/block-library/group/editor-rtl.css |
335 B |
build/styles/block-library/group/editor.css |
335 B |
build/styles/block-library/group/style-rtl.css |
103 B |
build/styles/block-library/group/style.css |
103 B |
build/styles/block-library/group/theme-rtl.css |
79 B |
build/styles/block-library/group/theme.css |
79 B |
build/styles/block-library/heading/style-rtl.css |
205 B |
build/styles/block-library/heading/style.css |
205 B |
build/styles/block-library/html/editor-rtl.css |
419 B |
build/styles/block-library/html/editor.css |
419 B |
build/styles/block-library/image/editor-rtl.css |
763 B |
build/styles/block-library/image/editor.css |
763 B |
build/styles/block-library/image/style-rtl.css |
1.6 kB |
build/styles/block-library/image/style.css |
1.59 kB |
build/styles/block-library/image/theme-rtl.css |
137 B |
build/styles/block-library/image/theme.css |
137 B |
build/styles/block-library/latest-comments/style-rtl.css |
355 B |
build/styles/block-library/latest-comments/style.css |
354 B |
build/styles/block-library/latest-posts/editor-rtl.css |
139 B |
build/styles/block-library/latest-posts/editor.css |
138 B |
build/styles/block-library/latest-posts/style-rtl.css |
520 B |
build/styles/block-library/latest-posts/style.css |
520 B |
build/styles/block-library/list/style-rtl.css |
107 B |
build/styles/block-library/list/style.css |
107 B |
build/styles/block-library/loginout/style-rtl.css |
61 B |
build/styles/block-library/loginout/style.css |
61 B |
build/styles/block-library/math/editor-rtl.css |
105 B |
build/styles/block-library/math/editor.css |
105 B |
build/styles/block-library/math/style-rtl.css |
61 B |
build/styles/block-library/math/style.css |
61 B |
build/styles/block-library/media-text/editor-rtl.css |
321 B |
build/styles/block-library/media-text/editor.css |
320 B |
build/styles/block-library/media-text/style-rtl.css |
543 B |
build/styles/block-library/media-text/style.css |
542 B |
build/styles/block-library/more/editor-rtl.css |
393 B |
build/styles/block-library/more/editor.css |
393 B |
build/styles/block-library/navigation-link/editor-rtl.css |
645 B |
build/styles/block-library/navigation-link/editor.css |
647 B |
build/styles/block-library/navigation-link/style-rtl.css |
190 B |
build/styles/block-library/navigation-link/style.css |
188 B |
build/styles/block-library/navigation-submenu/editor-rtl.css |
295 B |
build/styles/block-library/navigation-submenu/editor.css |
294 B |
build/styles/block-library/navigation/editor-rtl.css |
2.25 kB |
build/styles/block-library/navigation/editor.css |
2.26 kB |
build/styles/block-library/navigation/style-rtl.css |
2.27 kB |
build/styles/block-library/navigation/style.css |
2.25 kB |
build/styles/block-library/nextpage/editor-rtl.css |
392 B |
build/styles/block-library/nextpage/editor.css |
392 B |
build/styles/block-library/page-list/editor-rtl.css |
356 B |
build/styles/block-library/page-list/editor.css |
356 B |
build/styles/block-library/page-list/style-rtl.css |
192 B |
build/styles/block-library/page-list/style.css |
192 B |
build/styles/block-library/paragraph/editor-rtl.css |
251 B |
build/styles/block-library/paragraph/editor.css |
251 B |
build/styles/block-library/paragraph/style-rtl.css |
341 B |
build/styles/block-library/paragraph/style.css |
340 B |
build/styles/block-library/post-author-biography/style-rtl.css |
74 B |
build/styles/block-library/post-author-biography/style.css |
74 B |
build/styles/block-library/post-author-name/style-rtl.css |
69 B |
build/styles/block-library/post-author-name/style.css |
69 B |
build/styles/block-library/post-author/style-rtl.css |
188 B |
build/styles/block-library/post-author/style.css |
189 B |
build/styles/block-library/post-comments-count/style-rtl.css |
72 B |
build/styles/block-library/post-comments-count/style.css |
72 B |
build/styles/block-library/post-comments-form/editor-rtl.css |
96 B |
build/styles/block-library/post-comments-form/editor.css |
96 B |
build/styles/block-library/post-comments-form/style-rtl.css |
525 B |
build/styles/block-library/post-comments-form/style.css |
525 B |
build/styles/block-library/post-comments-link/style-rtl.css |
71 B |
build/styles/block-library/post-comments-link/style.css |
71 B |
build/styles/block-library/post-content/style-rtl.css |
61 B |
build/styles/block-library/post-content/style.css |
61 B |
build/styles/block-library/post-date/style-rtl.css |
62 B |
build/styles/block-library/post-date/style.css |
62 B |
build/styles/block-library/post-excerpt/editor-rtl.css |
71 B |
build/styles/block-library/post-excerpt/editor.css |
71 B |
build/styles/block-library/post-excerpt/style-rtl.css |
155 B |
build/styles/block-library/post-excerpt/style.css |
155 B |
build/styles/block-library/post-featured-image/editor-rtl.css |
719 B |
build/styles/block-library/post-featured-image/editor.css |
717 B |
build/styles/block-library/post-featured-image/style-rtl.css |
347 B |
build/styles/block-library/post-featured-image/style.css |
347 B |
build/styles/block-library/post-navigation-link/style-rtl.css |
215 B |
build/styles/block-library/post-navigation-link/style.css |
214 B |
build/styles/block-library/post-template/style-rtl.css |
414 B |
build/styles/block-library/post-template/style.css |
414 B |
build/styles/block-library/post-terms/style-rtl.css |
96 B |
build/styles/block-library/post-terms/style.css |
96 B |
build/styles/block-library/post-time-to-read/style-rtl.css |
70 B |
build/styles/block-library/post-time-to-read/style.css |
70 B |
build/styles/block-library/post-title/style-rtl.css |
162 B |
build/styles/block-library/post-title/style.css |
162 B |
build/styles/block-library/preformatted/style-rtl.css |
125 B |
build/styles/block-library/preformatted/style.css |
125 B |
build/styles/block-library/pullquote/editor-rtl.css |
133 B |
build/styles/block-library/pullquote/editor.css |
133 B |
build/styles/block-library/pullquote/style-rtl.css |
365 B |
build/styles/block-library/pullquote/style.css |
365 B |
build/styles/block-library/pullquote/theme-rtl.css |
176 B |
build/styles/block-library/pullquote/theme.css |
176 B |
build/styles/block-library/query-pagination-numbers/editor-rtl.css |
121 B |
build/styles/block-library/query-pagination-numbers/editor.css |
118 B |
build/styles/block-library/query-pagination/editor-rtl.css |
154 B |
build/styles/block-library/query-pagination/editor.css |
154 B |
build/styles/block-library/query-pagination/style-rtl.css |
237 B |
build/styles/block-library/query-pagination/style.css |
237 B |
build/styles/block-library/query-title/style-rtl.css |
64 B |
build/styles/block-library/query-title/style.css |
64 B |
build/styles/block-library/query-total/style-rtl.css |
64 B |
build/styles/block-library/query-total/style.css |
64 B |
build/styles/block-library/query/editor-rtl.css |
438 B |
build/styles/block-library/query/editor.css |
438 B |
build/styles/block-library/quote/style-rtl.css |
238 B |
build/styles/block-library/quote/style.css |
238 B |
build/styles/block-library/quote/theme-rtl.css |
233 B |
build/styles/block-library/quote/theme.css |
236 B |
build/styles/block-library/read-more/style-rtl.css |
131 B |
build/styles/block-library/read-more/style.css |
131 B |
build/styles/block-library/reset-rtl.css |
472 B |
build/styles/block-library/reset.css |
472 B |
build/styles/block-library/rss/editor-rtl.css |
126 B |
build/styles/block-library/rss/editor.css |
126 B |
build/styles/block-library/rss/style-rtl.css |
284 B |
build/styles/block-library/rss/style.css |
283 B |
build/styles/block-library/search/editor-rtl.css |
199 B |
build/styles/block-library/search/editor.css |
199 B |
build/styles/block-library/search/style-rtl.css |
665 B |
build/styles/block-library/search/style.css |
666 B |
build/styles/block-library/search/theme-rtl.css |
113 B |
build/styles/block-library/search/theme.css |
113 B |
build/styles/block-library/separator/editor-rtl.css |
100 B |
build/styles/block-library/separator/editor.css |
100 B |
build/styles/block-library/separator/style-rtl.css |
248 B |
build/styles/block-library/separator/style.css |
248 B |
build/styles/block-library/separator/theme-rtl.css |
195 B |
build/styles/block-library/separator/theme.css |
195 B |
build/styles/block-library/shortcode/editor-rtl.css |
286 B |
build/styles/block-library/shortcode/editor.css |
286 B |
build/styles/block-library/site-logo/editor-rtl.css |
773 B |
build/styles/block-library/site-logo/editor.css |
770 B |
build/styles/block-library/site-logo/style-rtl.css |
218 B |
build/styles/block-library/site-logo/style.css |
218 B |
build/styles/block-library/site-tagline/editor-rtl.css |
87 B |
build/styles/block-library/site-tagline/editor.css |
87 B |
build/styles/block-library/site-tagline/style-rtl.css |
65 B |
build/styles/block-library/site-tagline/style.css |
65 B |
build/styles/block-library/site-title/editor-rtl.css |
85 B |
build/styles/block-library/site-title/editor.css |
85 B |
build/styles/block-library/site-title/style-rtl.css |
143 B |
build/styles/block-library/site-title/style.css |
143 B |
build/styles/block-library/social-link/editor-rtl.css |
314 B |
build/styles/block-library/social-link/editor.css |
314 B |
build/styles/block-library/social-links/editor-rtl.css |
339 B |
build/styles/block-library/social-links/editor.css |
338 B |
build/styles/block-library/social-links/style-rtl.css |
1.51 kB |
build/styles/block-library/social-links/style.css |
1.51 kB |
build/styles/block-library/spacer/editor-rtl.css |
346 B |
build/styles/block-library/spacer/editor.css |
346 B |
build/styles/block-library/spacer/style-rtl.css |
48 B |
build/styles/block-library/spacer/style.css |
48 B |
build/styles/block-library/style-rtl.css |
16.5 kB |
build/styles/block-library/style.css |
16.5 kB |
build/styles/block-library/tab/style-rtl.css |
202 B |
build/styles/block-library/tab/style.css |
202 B |
build/styles/block-library/table-of-contents/style-rtl.css |
83 B |
build/styles/block-library/table-of-contents/style.css |
83 B |
build/styles/block-library/table/editor-rtl.css |
394 B |
build/styles/block-library/table/editor.css |
394 B |
build/styles/block-library/table/style-rtl.css |
641 B |
build/styles/block-library/table/style.css |
640 B |
build/styles/block-library/table/theme-rtl.css |
152 B |
build/styles/block-library/table/theme.css |
152 B |
build/styles/block-library/tabs/editor-rtl.css |
236 B |
build/styles/block-library/tabs/editor.css |
236 B |
build/styles/block-library/tabs/style-rtl.css |
983 B |
build/styles/block-library/tabs/style.css |
983 B |
build/styles/block-library/tag-cloud/editor-rtl.css |
92 B |
build/styles/block-library/tag-cloud/editor.css |
92 B |
build/styles/block-library/tag-cloud/style-rtl.css |
248 B |
build/styles/block-library/tag-cloud/style.css |
248 B |
build/styles/block-library/template-part/editor-rtl.css |
368 B |
build/styles/block-library/template-part/editor.css |
368 B |
build/styles/block-library/template-part/theme-rtl.css |
113 B |
build/styles/block-library/template-part/theme.css |
113 B |
build/styles/block-library/term-count/style-rtl.css |
63 B |
build/styles/block-library/term-count/style.css |
63 B |
build/styles/block-library/term-description/style-rtl.css |
126 B |
build/styles/block-library/term-description/style.css |
126 B |
build/styles/block-library/term-name/style-rtl.css |
62 B |
build/styles/block-library/term-name/style.css |
62 B |
build/styles/block-library/term-template/editor-rtl.css |
225 B |
build/styles/block-library/term-template/editor.css |
225 B |
build/styles/block-library/term-template/style-rtl.css |
114 B |
build/styles/block-library/term-template/style.css |
114 B |
build/styles/block-library/text-columns/editor-rtl.css |
95 B |
build/styles/block-library/text-columns/editor.css |
95 B |
build/styles/block-library/text-columns/style-rtl.css |
165 B |
build/styles/block-library/text-columns/style.css |
165 B |
build/styles/block-library/theme-rtl.css |
715 B |
build/styles/block-library/theme.css |
719 B |
build/styles/block-library/verse/style-rtl.css |
123 B |
build/styles/block-library/verse/style.css |
123 B |
build/styles/block-library/video/editor-rtl.css |
415 B |
build/styles/block-library/video/editor.css |
416 B |
build/styles/block-library/video/style-rtl.css |
202 B |
build/styles/block-library/video/style.css |
202 B |
build/styles/block-library/video/theme-rtl.css |
134 B |
build/styles/block-library/video/theme.css |
134 B |
build/styles/commands/style-rtl.css |
1.72 kB |
build/styles/commands/style.css |
1.72 kB |
build/styles/components/style-rtl.css |
14 kB |
build/styles/components/style.css |
14 kB |
build/styles/customize-widgets/style-rtl.css |
1.44 kB |
build/styles/customize-widgets/style.css |
1.44 kB |
build/styles/edit-post/classic-rtl.css |
426 B |
build/styles/edit-post/classic.css |
427 B |
build/styles/edit-post/style-rtl.css |
3.38 kB |
build/styles/edit-post/style.css |
3.38 kB |
build/styles/edit-site/style-rtl.css |
15.9 kB |
build/styles/edit-site/style.css |
15.9 kB |
build/styles/edit-widgets/style-rtl.css |
4.62 kB |
build/styles/edit-widgets/style.css |
4.62 kB |
build/styles/editor/style-rtl.css |
18.6 kB |
build/styles/editor/style.css |
18.6 kB |
build/styles/format-library/style-rtl.css |
326 B |
build/styles/format-library/style.css |
326 B |
build/styles/list-reusable-blocks/style-rtl.css |
1.02 kB |
build/styles/list-reusable-blocks/style.css |
1.02 kB |
build/styles/media-utils/style-rtl.css |
400 B |
build/styles/media-utils/style.css |
400 B |
build/styles/nux/style-rtl.css |
622 B |
build/styles/nux/style.css |
618 B |
build/styles/patterns/style-rtl.css |
611 B |
build/styles/patterns/style.css |
611 B |
build/styles/preferences/style-rtl.css |
415 B |
build/styles/preferences/style.css |
415 B |
build/styles/reusable-blocks/style-rtl.css |
275 B |
build/styles/reusable-blocks/style.css |
275 B |
build/styles/widgets/style-rtl.css |
1.17 kB |
build/styles/widgets/style.css |
1.18 kB |
I see you found the reference docs for REST API schema. format is part of JSON schema spec, so there is no risk adopting the list that comes from v4 and WP REST API supports.
It’s exactly what I had envisioned and also aligns with what @chriszarate shared in his feedback.
I would love to see this exact bug fix included in WordPress 6.9 as it’s the most elegant fix possible and at the same time perfectly scalable solution for the future. Newer versions of JSON schema spec added more possible options, but even what we have in place covers the most important string values that have expected structure: date, email, url, color.
If necessary, in the future we could mix it with other concepts from the schema like patterns, and build validation in UI on top of it.
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: ockham <[email protected]>
Co-authored-by: gziolo <[email protected]>
Co-authored-by: youknowriad <[email protected]>
Co-authored-by: oandregal <[email protected]>
Co-authored-by: cbravobernal <[email protected]>
Co-authored-by: fabiankaegy <[email protected]>
Co-authored-by: t-hamano <[email protected]>
Co-authored-by: ntsekouras <[email protected]>
Co-authored-by: hanneslsm <[email protected]>
To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.
Thanks a lot @gziolo! Really appreciate your feedback ❤️
I'll open this PR for wider review, including by Editor Tech Leads for 6.9 and other interested parties.
Y'all -- would you be okay with getting this into 6.9? I realize it's late in the cycle, but see @gziolo's points:
formatis part of JSON schema spec, so there is no risk adopting the list that comes from v4 and WP REST API supports.It’s exactly what I had envisioned and also aligns with what @chriszarate shared in his feedback.
I would love to see this exact bug fix included in WordPress 6.9 as it’s the most elegant fix possible and at the same time perfectly scalable solution for the future. Newer versions of JSON schema spec added more possible options, but even what we have in place covers the most important string values that have expected structure: date, email, url, color.
Flaky tests detected in a11a96dcf150d9bef857f206010156c2dd31d6cc. 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/18868605397 📝 Reported issues:
- #57525 in
/test/e2e/specs/widgets/editing-widgets.spec.js
It's by far the cleanest way to solve incompatibilities when your attribute type is a string, but stills requires a format.
This way you can prevent to bind urls on datetimes, for example, same for email, phone number, and several other cases.
It's somewhat risky to edit block schema in a Beta, but is not the first time it happens, for the Interactivity API we did the same for block supports.
I like this a lot! Solves several similar headaches I've had before trying to infer the format of a string in block extensions.
The attributes are (or should be) the exact same things as the "fields" API in dataviews. I know we're also looking at introducing "format" for dataviews. So let's make sure this is the exact same API in both before moving forward. cc @oandregal
@youknowriad You mean these (or is there any better documentation)? Makes sense (although they don't seem to be entirely consistent with the REST API formats, e.g. datetime vs date-time or url vs uri).
If you can point me to the "canonical" list for the Fields API, I'm happy to update this PR accordingly :)
@youknowriad You mean these (or is there any better documentation)? Makes sense (although they don't seem to be entirely consistent with the REST API formats, e.g. datetime vs date-time or url vs uri).
You're linking to the "field types" which IMO map more to the "type" of attributes. But we are also thinking of adding "format" for each type.
@youknowriad
You mean these (or is there any better documentation)? Makes sense (although they don't seem to be entirely consistent with the REST API formats, e.g. datetime vs date-time or url vs uri).
You're linking to the "field types" which IMO map more to the "type" of attributes. But we are also thinking of adding "format" for each type.
I edited your answer instead of quoting and answering 🤦♂️ . I wanted to ask:
Those "field types" seem to be a mix between attribute types ( string, number, boolean, array...) and formats ( datetime, email, telephone, url, color, password ). Is that something we are considering with block attributes?
Yes, formats is something I want to tackle soon for the Fields in DataViews/DataForm. It's possible that introducing them modifies the current types, but we'll need to assess that when that happens. This doesn't need to happen today/in the beta cycle for dataviews/dataform as everything is working fine over there (opening the proper UI control, validation).
The Field types story enables users to play with some arguments of the field, to see how it works in different contexts (filters, edit, render, different dataform layouts, etc.). The full API for a field is documented in the handbook.
Those "field types" seem to be a mix between attribute types ( string, number, boolean, array...) and formats ( datetime, email, telephone, url, color, password ). Is that something we are considering with block attributes?
The list of "field types" is not entirely "fixed" yet, we can always change them but yes, IMO, these and attribute types should be the same thing.
I do think we still have a long road to ensure the field types in "dataviews" are good for consumption in more stable APIs like block registration, but we should be considering them conceptually as the same thing and work towards unifying.
For instance, we might want to reconsider all the current types to match exactly what JSON Schema does.
I explored it further, applying more aggressive refactoring:
diff --git a/packages/block-library/src/button/block.json b/packages/block-library/src/button/block.json
index 6fcb7aca4c5..2ab4164522e 100644
--- a/packages/block-library/src/button/block.json
+++ b/packages/block-library/src/button/block.json
@@ -23,6 +23,7 @@
},
"url": {
"type": "string",
+ "format": "uri",
"source": "attribute",
"selector": "a",
"attribute": "href",
diff --git a/packages/block-library/src/image/block.json b/packages/block-library/src/image/block.json
index 26835df9e85..9804953921a 100644
--- a/packages/block-library/src/image/block.json
+++ b/packages/block-library/src/image/block.json
@@ -22,6 +22,7 @@
},
"url": {
"type": "string",
+ "format": "uri",
"source": "attribute",
"selector": "img",
"attribute": "src",
@@ -56,6 +57,7 @@
},
"href": {
"type": "string",
+ "format": "uri",
"source": "attribute",
"selector": "figure > a",
"attribute": "href",
diff --git a/packages/e2e-tests/plugins/block-bindings.php b/packages/e2e-tests/plugins/block-bindings.php
index 944bfc332c4..9455a935706 100644
--- a/packages/e2e-tests/plugins/block-bindings.php
+++ b/packages/e2e-tests/plugins/block-bindings.php
@@ -24,9 +24,10 @@ function gutenberg_test_block_bindings_registration() {
'type' => 'string',
),
'url_field' => array(
- 'label' => 'URL Field Label',
- 'value' => $testing_url,
- 'type' => 'string',
+ 'label' => 'URL Field Label',
+ 'value' => $testing_url,
+ 'type' => 'string',
+ 'format' => 'uri',
),
'empty_field' => array(
'label' => 'Empty Field Label',
diff --git a/packages/e2e-tests/plugins/block-bindings/index.js b/packages/e2e-tests/plugins/block-bindings/index.js
index 5221cc805c9..ef70f8389d2 100644
--- a/packages/e2e-tests/plugins/block-bindings/index.js
+++ b/packages/e2e-tests/plugins/block-bindings/index.js
@@ -41,6 +41,7 @@ registerBlockBindingsSource( {
( [ key, field ] ) => ( {
label: field?.label || key,
type: field?.type || 'string',
+ format: field?.format,
args: {
key,
},
diff --git a/packages/editor/src/bindings/post-data.js b/packages/editor/src/bindings/post-data.js
index f7181886fb1..4bb9a090302 100644
--- a/packages/editor/src/bindings/post-data.js
+++ b/packages/editor/src/bindings/post-data.js
@@ -187,14 +187,6 @@ export default {
return getPostDataFields( select, context, clientId );
},
editorUI( { select, context } ) {
- const selectedBlock = select( blockEditorStore ).getSelectedBlock();
- if ( selectedBlock?.name !== 'core/post-date' ) {
- return {};
- }
- // Exit early for navigation blocks (read-only)
- if ( NAVIGATION_BLOCK_TYPES.includes( selectedBlock?.name ) ) {
- return {};
- }
const postDataFields = Object.entries(
getPostDataFields( select, context ) || {}
).map( ( [ key, field ] ) => ( {
diff --git a/packages/editor/src/bindings/post-meta.js b/packages/editor/src/bindings/post-meta.js
index 644ea36f06d..4796d38bc78 100644
--- a/packages/editor/src/bindings/post-meta.js
+++ b/packages/editor/src/bindings/post-meta.js
@@ -154,6 +154,7 @@ export default {
key,
},
type: field.type,
+ format: field.format,
} ) );
/*
* We need to define the data as [{ label: string, value: any, type: https://developer.wordpress.org/block-editor/reference-guides/block-api/block-attributes/#type-validation }]
diff --git a/packages/editor/src/bindings/term-data.js b/packages/editor/src/bindings/term-data.js
index 8dbf29d982f..b213b0dd822 100644
--- a/packages/editor/src/bindings/term-data.js
+++ b/packages/editor/src/bindings/term-data.js
@@ -39,6 +39,7 @@ function createDataFields( termDataValues, idValue ) {
label: __( 'Link' ),
value: termDataValues?.link,
type: 'string',
+ format: 'uri',
},
description: {
label: __( 'Description' ),
@@ -209,6 +210,7 @@ export default {
).map( ( [ key, field ] ) => ( {
label: field.label,
type: field.type,
+ format: field.format,
args: {
field: key,
},
The experience in the UI improves nicely:
https://github.com/user-attachments/assets/b7b05fc8-dd48-4d09-943a-52ade90d67a2
It still might need some special handling for the Navigation blocks, as there are other issues present when users interact with the Attributes panel. Although I would argue it's similar to everything else we see with blocks in the placeholder state, like Image block with no url, or Heading block with no text.
The list of "field types" is not entirely "fixed" yet, we can always change them but yes, IMO, these and attribute types should be the same thing.
For instance, we might want to reconsider all the current types to match exactly what JSON Schema does.
This is what WordPress REST API supports: https://developer.wordpress.org/rest-api/extending-the-rest-api/schema/#primitive-types
This is what block attributes support:
https://developer.wordpress.org/block-editor/reference-guides/block-api/block-attributes/#type-validation
Comparison:
| Type | Block API (Block Attributes) | REST API (Schema) | Notes |
|---|---|---|---|
null |
✅ Supported | ✅ Supported | Represents an explicit null value. |
boolean |
✅ Supported | ✅ Supported | true or false. |
string |
✅ Supported | ✅ Supported | A text value. |
number |
✅ Alias of integer |
✅ Supported | In REST API, can include decimals (float). |
integer |
✅ Supported | ✅ Supported | Whole numbers only. |
array |
✅ Supported | ✅ Supported | A list of values (numeric array). |
object |
✅ Supported | ✅ Supported | Key/value map (associative array). |
Both support also enum. For block attributes, there was added support for virtual rich-text type.
Leaving here what I commented on slack, too many places to discuss this :)
Looking at the links shared, I think we need more specific formats that the ones that exist in the REST API. At least, I haven't found how to:
- date format that is not a date-time (they have different UI controls, filters, etc.)
- how to provide the format of the date: iso 8601, or any other
- how to tell that a number should have only 1 decimal
These are the kind of questions we've heard from folks using the APIs.
Another question I have is how to work with nested data object. Example: user.profile.name. In a given DataForm, we may only want to expose the name, and so we have utils to work with that (see). The REST API/JSON Schema would require us to have two object fields (user + profile) and a string field (name). We'd need to look at this because DataViews/DataForm is used in a variety of scenarios (core + plugins), and some of them don't adhere as strongly as the core REST API to the JSON Schema format.
The validation aspect is something we are tracking here, and it's along the same lines as the REST API (FWIW, I reviewed JSON Schema + HTML Validation when preparing that).
Then, the Field API deals with more than data access that we also need to define for each field type (and the field author can override). Take a look at the Edit control: while there's a default edit control per field type (or format), consumers need the ability to tweak them (for example, to display more/less lines in a textarea, or to add prefix/suffix to input controls, etc.). Same for creating filters based on the field type. That's not something I've seen in JSON Schema. The Field API for DataViews/DataForm needs to accommodate data access requirements but also UI requirements.
So, whether formats make sense for block bindings: I can't comment on that, not deeply familiar with that API. I can say that, in the form they are described in the linked docs, they're insufficient for what we need to do in DataViews/DataForm.
@oandregal I think the main question to solve now is that for this PR this consider "uri" as a format, while right now it's a "type" in dataviews. JSON Schema also uses "format". So I'm thinking that we should update the DataViews Fields API to use format as well in these case, and ensure field types can use the "format" in their Edit functions (custom or not)
@oandregal The other thing for dataviews is whether required should move top level instead of being nested in isValid to match JSON Schemas.
@youknowriad If we introduce formats in the way they work for the REST API, it'll be a regression for the Field API in DataViews/DataForm (cannot support both date and datetime). It also doesn't offer a way to support the things we need to (number of decimals, date format, etc.). I'd rather address the these things first to make sure there's a converging path. Then, when the converging path is clearer, we move any other properties around.
If we introduce formats in the way they work for the REST API, it'll be a regression for the Field API in DataViews/DataForm (cannot support both date and datetime)
I don't understand? How so? it's just a different shape for the API no?
I'd rather address the these things first to make sure there's a converging path. Then, when the converging path is clearer, we move any other properties around.
I actually think there shouldn't be any conversion, it should be the same.
I don't understand? How so? it's just a different shape for the API no?
I mentioned here a few issues with using what the REST API uses. Things we already support would no longer be supported — the date type, for example. In slack, Greg mentioned newer version of the JSON Schema support more things.
I actually think there shouldn't be any conversion, it should be the same.
That's a direction worth pursuing. Note I said converging, not converting 🙂
I prefer if we worked this way: first, understand how to support the things we already support plus the needs we've already identified (some I shared above). Only when we're certain we can do it, we start moving properties around.
@ockham In case it wasn't clear from my comment above: the formats as it works in the REST API is more limiting than what we have already working in DataViews/DataForm.
With the caveat that I haven't looked at every detail: we may converge into JSON Schema for everything by upgrading to a newer JSON Schema version, as Greg suggested. I don't have the answer for that right now, but I guess the question to unblock this PR is: if we need migrating, how does that affect this PR? Would that be a backwards-compatible issue, or would it be okay?
Things we already support would no longer be supported — the date type, for example.
I'm still having some trouble following, In my mind the idea for date is to merge both in a single type but have "date-time" and "date" be formats that impact Edit, validation... (that would match JSON Schema).
What kind of regression this produces?
I'm still having some trouble following, In my mind the idea for date is to merge both in a single type but have "date-time" and "date" be formats that impact Edit, validation... (that would match JSON Schema).
What kind of regression this produces?
The only format available is date-time. There's no date format.
JSON Schema allows both of them and more. I think that's just a current limitation of the REST API.
What I'm saying is that we should update how we define the format and types in DataViews to match JSON Schema but I think supporting more formats that what the "standard" defines is actually a good thing. I'm more concerned about the API shape than the actual formats we support or not. I do think we should continue support all what's currently supported in dataviews.
This is how the REST API compares to the JSON Schema Draft 04 (2013) for formats. I understand this doesn't make the REST API not compliant with the schema because implementors can have custom extensions.
| JSON Schema Draft 04 | REST API (supported, documented) | Comment |
|---|---|---|
| date-time | ✅ | |
| ✅ | ||
| uri | ✅ | |
| hostname | ❌ | |
| ipv4 | ❌ | REST API uses generic ip. |
| ipv6 | ❌ | REST API uses generic ip. |
| ❌ | ip |
Custom extension. |
| ❌ | hex-color |
Custom extension. |
| ❌ | uuid |
Custom extension. Introduced in 2019-09 version. |
| ❌ | text-field |
Custom extension. |
| ❌ | textarea-field |
Custom extension. |
I've been looking a bit more how the JSON Schema is used in WordPress core and:
- The REST API and the Ability API use it to declare the shape of the data they work with.
- Both use the JSON Schema Draft 04 (published in 2013). This schema has several limitations, including not being able to declare
datevsdatetime. - I haven't done a full compliant analysis, but in a quick look I've detected core has gaps with respect to the schema (lacking
not,allOfvalidation keywords), some bugs, and there are a few liberties (e.g., formats) where the deviation is higher. - It seems difficult to change the schema for backward-compatible reasons (see), though I understand this is nuanced.
- Core implements their own functions to sanitize and validate input (e.g.,
rest_validate_value_from_schema,rest_sanitize_value_from_schema) and does not use any external library.
- Both use the JSON Schema Draft 04 (published in 2013). This schema has several limitations, including not being able to declare
- The
block.jsonand thetheme.jsonuse JSON Schema to declare the shape of those objects, but the objects themselves have nothing to do with JSON Schema. There are some coincidences (e.g., block types).
These are the major use cases I've found.
With the RC1 release scheduled for next week, I'd like to confirm whether this pull request is ready to be shipped. If not, are there any other temporary solutions available?
@t-hamano I have yet to catch up on the latest discussion on this PR, but unless there's been a big/unexpected new development, the suggested change was deemed to require some more deliberation and coordination -- so it wasn't going to be merged for 6.9.
Instead, we've merged https://github.com/WordPress/gutenberg/pull/72712 as a workaround.
I'll remove the "Backport to WP 6.9 Beta/RC" label.