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

Try: Add metadata attribute to blocks allowing section naming and future semantic meta information #40393

Closed
wants to merge 1 commit into from

Conversation

jorgefilipecosta
Copy link
Member

@jorgefilipecosta jorgefilipecosta commented Apr 15, 2022

Fixes: #40317

This PR adds an experimental support mechanism "__experimentalSection" __experimentalMetadata that any block can use to mark that a block supports being a section.

It enables "__experimentalSection" __experimentalMetadata on the group block.

When a block supports being a section two attributes are automatically added, isSection defaulting to false and sectionName. When isSection attribute is true it means that the given block instance is a section. sectionName contains a description of the section e.g."404 Section" to show on the UI and can also be used to show similar patterns (e.g: patterns containing sections with the same name).

The isSection attribute is a marker to know the sections we have. We should update #40314 and or #40376 to use this marker.

By default, we don't have any UI to control these attributes. But a block can have a UI e.g: A text field or select control to select the name of the section. A block may also register variations that are sections etc.

We are also updating the UI to show the section name has the block title as we do for reusable blocks and template parts.

image
image

Testing Instructions

I added the following block to the block editor:

<!-- wp:group {"style":{"color":{"background":"#ff0000"}},"metadata":{"name":"404 Section"}} -->
<div id="hgjghjghj" class="wp-block-group has-background" style="background-color:#ff0000"><!-- wp:spacer {"height":"80px"} -->
<div style="height:80px" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->

<!-- wp:heading {"textAlign":"center","style":{"typography":{"fontSize":"200px"}},"textColor":"background"} -->
<h2 class="has-text-align-center has-background-color has-text-color" style="font-size:200px">404</h2>
<!-- /wp:heading -->

<!-- wp:spacer {"height":"75px"} -->
<div style="height:75px" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->

<!-- wp:paragraph {"align":"center","textColor":"background"} -->
<p class="has-text-align-center has-background-color has-text-color">This page could not be found :(</p>
<!-- /wp:paragraph --></div>
<!-- /wp:group -->

I verified the UI showed the section name as the screenshots above show.

@jorgefilipecosta jorgefilipecosta added [Block] Group Affects the Group Block [Feature] Patterns A collection of blocks that can be synced (previously reusable blocks) or unsynced labels Apr 15, 2022
@github-actions
Copy link

github-actions bot commented Apr 15, 2022

Size Change: +145 B (0%)

Total Size: 1.23 MB

Filename Size Change
build/block-editor/index.min.js 151 kB +131 B (0%)
build/block-library/index.min.js 177 kB +14 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.51 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/style-rtl.css 15 kB
build/block-editor/style.css 15 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 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 59 B
build/block-library/blocks/avatar/style.css 59 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 445 B
build/block-library/blocks/button/editor.css 445 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 95 B
build/block-library/blocks/comments/editor.css 95 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.53 kB
build/block-library/blocks/cover/style.css 1.53 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 961 B
build/block-library/blocks/gallery/editor.css 964 B
build/block-library/blocks/gallery/style-rtl.css 1.51 kB
build/block-library/blocks/gallery/style.css 1.51 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 333 B
build/block-library/blocks/group/editor.css 333 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 529 B
build/block-library/blocks/image/style.css 535 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 463 B
build/block-library/blocks/latest-posts/style.css 462 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 708 B
build/block-library/blocks/navigation-link/editor.css 706 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/style-rtl.css 1.95 kB
build/block-library/blocks/navigation/style.css 1.94 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 395 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 363 B
build/block-library/blocks/page-list/editor.css 363 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 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 69 B
build/block-library/blocks/post-comments-form/editor.css 69 B
build/block-library/blocks/post-comments-form/style-rtl.css 521 B
build/block-library/blocks/post-comments-form/style.css 521 B
build/block-library/blocks/post-comments/editor-rtl.css 77 B
build/block-library/blocks/post-comments/editor.css 77 B
build/block-library/blocks/post-comments/style-rtl.css 527 B
build/block-library/blocks/post-comments/style.css 527 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 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 323 B
build/block-library/blocks/post-template/style.css 323 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 370 B
build/block-library/blocks/pullquote/style.css 370 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 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 369 B
build/block-library/blocks/query/editor.css 369 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 140 B
build/block-library/blocks/separator/editor.css 140 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 759 B
build/block-library/blocks/site-logo/editor.css 759 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 504 B
build/block-library/blocks/table/editor.css 504 B
build/block-library/blocks/table/style-rtl.css 625 B
build/block-library/blocks/table/style.css 625 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 149 B
build/block-library/blocks/template-part/editor.css 149 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 993 B
build/block-library/common.css 990 B
build/block-library/editor-rtl.css 10.2 kB
build/block-library/editor.css 10.3 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 11.5 kB
build/block-library/style.css 11.5 kB
build/block-library/theme-rtl.css 689 B
build/block-library/theme.css 694 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 47 kB
build/components/index.min.js 227 kB
build/components/style-rtl.css 15 kB
build/components/style.css 15 kB
build/compose/index.min.js 11.3 kB
build/core-data/index.min.js 14.5 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.39 kB
build/customize-widgets/style.css 1.39 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 7.66 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.58 kB
build/edit-navigation/index.min.js 15.8 kB
build/edit-navigation/style-rtl.css 4.05 kB
build/edit-navigation/style.css 4.05 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 30.1 kB
build/edit-post/style-rtl.css 7.02 kB
build/edit-post/style.css 7.02 kB
build/edit-site/index.min.js 47.4 kB
build/edit-site/style-rtl.css 7.95 kB
build/edit-site/style.css 7.93 kB
build/edit-widgets/index.min.js 16.3 kB
build/edit-widgets/style-rtl.css 4.41 kB
build/edit-widgets/style.css 4.4 kB
build/editor/index.min.js 38.4 kB
build/editor/style-rtl.css 3.67 kB
build/editor/style.css 3.67 kB
build/element/index.min.js 4.3 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.94 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.1 kB
build/nux/style-rtl.css 751 B
build/nux/style.css 749 B
build/plugins/index.min.js 1.98 kB
build/preferences-persistence/index.min.js 2.16 kB
build/preferences/index.min.js 1.32 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 628 B
build/react-i18n/index.min.js 704 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.2 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.99 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.21 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

@jorgefilipecosta
Copy link
Member Author

I added a unit test to this PR.

@youknowriad
Copy link
Contributor

When a block supports being a section two attributes are automatically added, isSection defaulting to false and sectionName.

I wonder if this should be a unique attribute metadata or section that is an object that could potentially include multiple things (if sections embrace new things later: keywords, semantic identifier...). Also the presence of the attribute itself can indicate that it's a "section". Also one advantage is that it clearly separates these "metadata" from the regular block attributes.

@jorgefilipecosta
Copy link
Member Author

When a block supports being a section two attributes are automatically added, isSection defaulting to false and sectionName.

I wonder if this should be a unique attribute metadata or section that is an object that could potentially include multiple things (if sections embrace new things later: keywords, semantic identifier...). Also the presence of the attribute itself can indicate that it's a "section". Also one advantage is that it clearly separates these "metadata" from the regular block attributes.

I had the same doubt I can go for the section object attribute approach. In that case, should we force sections to have a name? If we assume there can exist sections without a name one would define a section with an empty object?

@jorgefilipecosta
Copy link
Member Author

Hi @youknowriad,
I updated this PR to use the object as you suggested.

if sections embrace new things later: keywords, semantic identified

I'm worried about another important topic the section title needs to be translatable. If the pattern is defined in PHP we can use the normal PHP i18n mechanisms but for the patterns on the pattern, the directory is this may be an issue. I'm not sure how are the sections in the pattern directory going to be translatable. Should we have a special mechanism to extract strings from these attributes in order to make them translatable?

@youknowriad
Copy link
Contributor

A thought cross my mind while reading this comment

#39281 (comment)

and specifically, the fact that we could also support "naming" any block and not just section. Maybe what we need is not a "section" attribute but a "metadata" attribute where we could set things like "name", "description"... for any blocks potentially (surface only for sections at first) and the same metadata attribute could contain an "isSection" flag. It's still unclear to me if the "isSection" flag is actually needed or if it's just a temporary thing while we implement other meaningful metadata like keyboard: "about" or something like that.

I'm worried about another important topic the section title needs to be translatable. If the pattern is defined in PHP we can use the normal PHP i18n mechanisms but for the patterns on the pattern, the directory is this may be an issue. I'm not sure how are the sections in the pattern directory going to be translatable. Should we have a special mechanism to extract strings from these attributes in order to make them translatable?

I think it's the same issue we have for content inside patterns as well. I don't really think we need a special i18n mechanism. But I may be missing something?

@jorgefilipecosta
Copy link
Member Author

Hi @youknowriad, I followed your suggestion, now we have a metadata attribute with "name" and a isSection attribute. For now, everything is restricted to sections and blocks that declare support for sections.

Regarding i18n yes we can follow what happens for pattern content. But the issue of internationalization of patterns even for content is not solved. e.g: on the pattern directory all the patterns are in English and I can not get patterns in another language. But I guess that's a separate discussion.

This PR seems ready.

* @return {Object} Filtered block settings.
*/
export function addAttribute( settings ) {
if ( hasBlockSupport( settings, '__experimentalSection', false ) ) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Feels to me that we should have the "metadata" attribute for all blocks, not just sections but I guess that's a fine start.

export function addAttribute( settings ) {
if ( hasBlockSupport( settings, '__experimentalSection', false ) ) {
// Allow blocks to specify their own metadata attribute definition with default value if needed.
if ( ! has( settings.attributes, [ 'metadata' ] ) ) {
Copy link
Contributor

Choose a reason for hiding this comment

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

It would be cool to do a dev note to let people know that this might become a "reserved" attribute. We should also document that "metadata", "style", "settings" and "lock" are all reserved attributes.

Writing this makes me thing that "lock" could actually be a child of "metadata" instead of being its own attribute.

Copy link
Member Author

Choose a reason for hiding this comment

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

Are we still on time to make lock a child of metadata? I think it is also fine to have lock as a standalone attribute.

Copy link
Contributor

Choose a reason for hiding this comment

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

Probably too late unless we migrate later (so nothing to do now)

const label = reusableBlockTitle || blockLabel;
const sectionTitle =
hasBlockSupport( name, '__experimentalSection', false ) &&
attributes.metadata?.isSection &&
Copy link
Contributor

Choose a reason for hiding this comment

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

Do we really need to check isSection here :) Why not just allow any blocks to have a name?

firstBlockName,
'__experimentalSection',
false
) && !! getBlockAttributes( clientId ).metadata?.isSection,
Copy link
Contributor

Choose a reason for hiding this comment

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

Should this check be more something like hasName: getBlockAttributes( clientId ).metadata?.name.

Copy link
Contributor

@youknowriad youknowriad left a comment

Choose a reason for hiding this comment

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

This PR looks very close to me. I'm missing two things:

  • A bit of documentation maybe
  • Some thoughts from more folks about whether to introduce explicitly the "isSection" flag here or if it's more about just adding a "name" to any block and a "metadata" attribute (that can absorb more things later)

I'm thinking the latter is better than introducing yet another potentially confusing concept. We'd be able to achieve the same thing but instead of thinking: these are section blocks, we'd be more thinking these are blocks with more capabilities (name, semantics...)

cc @gziolo @mcsf @mtias @jameskoster

@jameskoster
Copy link
Contributor

The latter makes more sense to me as well. "Section" just feels like an abstract description for any root level block. In that sense, everything is a section depending on context.

@gziolo
Copy link
Member

gziolo commented Apr 29, 2022

I'm thinking the latter is better than introducing yet another potentially confusing concept. We'd be able to achieve the same thing but instead of thinking: these are section blocks, we'd be more thinking these are blocks with more capabilities (name, semantics...)

@youknowriad and @jorgefilipecosta , I'm missing a full context here. This is what I understood so far. There is this concept to mark some blocks to use the new UI feature of sections. You can use the new flag supports. __experimentalSection to do that. You only need to add a new attribute metadata which is an object and allows you to provide the name of the section with the name attribute. What's the difference between name and metadata.name? There is also isSection that enables the whole experience when set to true in conjunction with supports. __experimentalSection set to true.

Does it mean that for now it mostly allows setting a different name for the block title in the List View, the block toolbar, and probably a few other places? It reminds me a bit title used with Reusable Blocks and Template Parts. For example for the custom handling in useBlockDisplayTitle we have:

reusableBlockTitle:
isReusable &&
__experimentalGetReusableBlockTitle(
getBlockAttributes( clientId ).ref
),
};

@youknowriad
Copy link
Contributor

Yes, that's a good summary.

What's the difference between name and metadata.name?
Does it mean that for now it mostly allows setting a different name for the block title in the List View, the block toolbar, and probably a few other places? It reminds me a bit title used with Reusable Blocks and Template Parts. For example for the custom handling in useBlockDisplayTitle we have

metadata.name is exactly like that, a way to give a "name" to any block (regardless if it's reusable or not). There are probably some relationships to be made with both "template parts" and "reusable blocks" names. For instance when transforming from a regular block to reusable, pre-populate the reusable block's name...

There is also isSection that enables the whole experience when set to true in conjunction with supports. __experimentalSection set to true.

Yes, I'm thinking that we should remove the isSection for now personally.

@jorgefilipecosta
Copy link
Member Author

Thank you @youknowriad, @jameskoster, and @gziolo for the insights. I applied all the feedback and added some documentation.

if ( ! has( settings.attributes, [ 'metadata' ] ) ) {
settings.attributes = {
...settings.attributes,
metadata: {
Copy link
Member

Choose a reason for hiding this comment

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

What would be the difference with the new settings attribute added in #40547 and the meta attribute proposed here?

Copy link
Member Author

Choose a reason for hiding this comment

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

The settings attribute is a global styles settings object like the presets of a block, and other settings you can define using theme.json. It is equivalent to the styles object. The metadata is for information specific to a block instance that is not part of global styles/theme.json like the name of a specific section.

Copy link
Contributor

Choose a reason for hiding this comment

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

It is though a good question (whether these could merge or not). I'm not sure I have any preference right now. They do seem to have different purposes.

Copy link
Member

Choose a reason for hiding this comment

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

I'm really worried that we overuse settings and metadata which already exist in Block API but play a different role.

We use the block metadata phrase when talking about everything that block.json can represent:
https://github.com/WordPress/gutenberg/blob/trunk/docs/reference-guides/block-api/block-metadata.md

For settings the best way to show the challenge is by showing the implementation:

if ( ! settings?.attributes?.settings ) {
settings.attributes = {
...settings.attributes,
settings: {
type: 'object',
},
};
}

In effect, settings is an attribute in the block settings' object during registration.

There are also existing blocks that contain similar types of attributes that don't represent the content or visual aspects of the block and are included as regular attributes:

I agree that it doesn't have too much difference from the implementation perspective and it's perfectly fine to proceed as is with settings and metdata attributes. However, it might be challenging to document all the subtle differences knowing about all the ambiguity introduced.

Copy link
Contributor

Choose a reason for hiding this comment

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

It is though a good question (whether these could merge or not). I'm not sure I have any preference right now. They do seem to have different purposes.

Just wanted to say that this has been on my mind since yesterday as well. And not only is metadata an overloaded term (block type metadata, post meta, Redux action meta, etc.), it's also a potential magnet for any random data. @jorgefilipecosta and @youknowriad: besides name, what do we contemplate storing in it?

In effect, settings is an attribute in the block settings' object during registration.

I agree, @gziolo, that settings is also a bit overloaded, but it's also a first-class name in theme.json, and attributes.settings is symmetric with attributes.style, so IMO we could keep it. Maybe we could make the code clearer with more specific naming — for instance:

-       if ( ! settings?.attributes?.settings ) {
-               settings.attributes = {
-                       ...settings.attributes,
+       if ( ! blockTypeSettings?.attributes?.settings ) {
+               blockTypeSettings.attributes = {
+                       ...blockTypeSettings.attributes,
                        settings: {
                                type: 'object',
                        },

Copy link
Contributor

Choose a reason for hiding this comment

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

@jorgefilipecosta and @youknowriad: besides name, what do we contemplate storing in it?

The two certain things is "name" and somekind of "tag" or "area" or "keyword" or something like that to add "semantics" to the given section/block. (better surface related patterns...). I think "locking" could be moved in that same object.

Potentially other things can come later. This comment is relevant here #34352 (comment)

Copy link
Contributor

@ntsekouras ntsekouras May 4, 2022

Choose a reason for hiding this comment

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

It's true that having all the existing block settings and the new settings and metadata can be confusing about what goes where. IMO the new settings attribute is targeted for the theme.json mechanism so we could rename that one to something more indicative about its purpose/contents?

Other than that the metadata seems just fine to me and we can always look to migrate some other props there in the future properly..

Copy link
Member Author

Choose a reason for hiding this comment

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

settings attribute is targeted for the theme.json mechanism so we could rename that one to something more indicative about its purpose/contents?

Theme.json has styles and settings it seems natural that blocks also have styles and settings attributes. We don't have any other attribute for settings.

Copy link
Member Author

Choose a reason for hiding this comment

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

We should follow @mcsf and use blockTypeSettings as a name to make things clearer. This PR already does that, I will update the settings hook.

@jorgefilipecosta jorgefilipecosta force-pushed the add/section-concept branch 2 times, most recently from eab5108 to fd5ff69 Compare May 3, 2022 22:38
@jorgefilipecosta
Copy link
Member Author

Following a suggestion by @mcsf this PR is now using __experimentalMetadata instead of __experimentalSection.

@jorgefilipecosta jorgefilipecosta changed the title Try: Implement the concept of sections Try: Add metadata attribute to blocks allowing section naming and future semantic meta information May 5, 2022
Squashed commits:
[c1bd86cd5d] Use section object
[7667d1715e] Add unit test
[e7d647eb76] Add: Section concept
Comment on lines +34 to +35
case 'name-with-section':
return { title: 'Block With Section Support' };
Copy link
Contributor

Choose a reason for hiding this comment

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

With the change of intent in this PR (moving away from referring to "section"), should this also be reflected in the phrasing/naming in tests? I think leaving as is could be confusing for those reading tests to understand expected behaviour.

@getdave
Copy link
Contributor

getdave commented Aug 1, 2022

I've been heading in a similar direction over at #42605. I'd like to reconcile with what's happening here.

@getdave
Copy link
Contributor

getdave commented Aug 1, 2022

@jorgefilipecosta and I spoke away from Github and we agreed I would borrow items from this PR for #42605 with a view that this one may end up being closed.

@jorgefilipecosta
Copy link
Member Author

Closing this PR as #42605 is continuing this work.

@Mamaduka Mamaduka deleted the add/section-concept branch March 28, 2024 14:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Group Affects the Group Block [Feature] Patterns A collection of blocks that can be synced (previously reusable blocks) or unsynced
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Implement the concept of sections
8 participants