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

Cover: Avoid adding a wrapper Group block when transforming to Group, where possible #40293

Merged
merged 11 commits into from
May 4, 2022

Conversation

andrewserong
Copy link
Contributor

@andrewserong andrewserong commented Apr 13, 2022

Depends on #40497 Check that a transform matches at the time of running the transform

What?

Following on from #40212, this PR seeks to fix / improve some of the behaviour when transforming from a Cover block to a Group block.

The changes are:

  • If the Cover block contains only a single Group block as a direct child, then remove the Cover block as the wrapper, and merge in the Cover block's attributes / overlay colors with the Group block's attributes, so that the background color is preserved.
  • If the Cover block contains any other mix of blocks as direct children, then convert the Cover block directly to a Group block, with the overlay colors transformed to the appropriate background color attributes on the Group block.
  • If the Cover block contained a url attribute (so, it had some form of media as a background), then retain the existing behaviour where we defer to the Group block's default transform that adds a Group block as a wrapper — this way the user doesn't unexpectedly lose content.

Why?

As noted in the review on that PR, when transforming from a Cover block to a Group block, the default transform in the Group block causes a Group block to be added as a wrapper. Repeatedly transforming between Group and Cover and back again results in repeatedly nesting the set of blocks in further levels of Group blocks. With this PR, in most cases, we should now be able to switch between Group -> Cover -> Group again without incurring additional nesting.

Note: this PR makes lots of assumptions about user intent — the hope is that the changes here get the behaviour closer to what users might expect when transforming from Cover to Group, but it is making assumptions, and the transform is still a destructive action, so it isn't perfect. Happy for feedback (or pushback) on the change if folks think there's a better way to go about this.

How?

  • Add a transform from Cover to Group to the Cover block
  • In the transform, transpose overlay values to the appropriate background values
  • Attempt to preserve values in the merged block in a way that's logical and reduces how destructive the transform is

Testing Instructions

  1. Create a post containing a mix of Cover blocks that contain various kinds of Group, Row, and Stack blocks as children (and other arbitrary blocks)
  2. Try variations where the inner Group block has background or gradient colors, and other settings
  3. Try transforming the Cover block to a Group block, and see if the result is what you expected
  4. Try creating a Group block with a gradient or background color, transform to Cover, then transform back to Group — the block should be in the same(ish) state as it was originally

Tests are also included, and can be run from a terminal via:

npm run test-unit -- --testPathPattern packages/block-library/src/cover/test/transforms.js

Screenshots or screencast

Group -> Cover -> Group Row -> Cover -> Row
2022-04-13 16 02 50 2022-04-13 16 09 01

@andrewserong andrewserong added [Type] Bug An existing feature does not function as intended [Block] Cover Affects the Cover Block - used to display content laid over a background image [Block] Group Affects the Group Block (and row, stack and grid variants) labels Apr 13, 2022
@andrewserong andrewserong requested a review from ajitbohra as a code owner April 13, 2022 06:11
@andrewserong andrewserong self-assigned this Apr 13, 2022
@andrewserong
Copy link
Contributor Author

Note: I'll be AFK for the next couple of weeks, so I likely won't see any replies on this PR. If anyone would like to take this over and / or merge it while I'm away, feel free to! 🙇

@github-actions
Copy link

github-actions bot commented Apr 13, 2022

Size Change: -237 B (0%)

Total Size: 1.23 MB

Filename Size Change
build/block-editor/index.min.js 151 kB -1 B (0%)
build/block-library/blocks/comments-query-loop/editor-rtl.css 0 B -95 B (removed) 🏆
build/block-library/blocks/comments-query-loop/editor.css 0 B -95 B (removed) 🏆
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB +133 B (+5%) 🔍
build/block-library/editor-rtl.css 10.2 kB -2 B (0%)
build/block-library/editor.css 10.3 kB -2 B (0%)
build/block-library/index.min.js 177 kB -320 B (0%)
build/components/index.min.js 222 kB +88 B (0%)
build/components/style-rtl.css 15 kB +41 B (0%)
build/components/style.css 15 kB +42 B (0%)
build/core-data/index.min.js 14.5 kB -44 B (0%)
build/edit-site/index.min.js 47.4 kB -14 B (0%)
build/editor/index.min.js 38.4 kB +32 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.93 kB
build/block-library/blocks/navigation/style.css 1.92 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/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/compose/index.min.js 11.3 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/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/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

@glendaviesnz
Copy link
Contributor

This tested well for me, but added an empty style: { color: {}} attribute if custom colors were not set, so have pushed an couple of updates to prevent this.

Copy link
Contributor

@aaronrobertshaw aaronrobertshaw left a comment

Choose a reason for hiding this comment

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

Thanks for addressing this one @andrewserong 👍

This tested well for me for transforming to and from Group blocks (including Row & Stack) with either flat color or gradient backgrounds.

If the Cover block contained a url attribute (so, it had some form of media as a background), then retain the existing behaviour where we defer to the Group block's default transform that adds a Group block as a wrapper.

Unfortunately, for me if I select a background image for the cover block and then attempt to transform to a Group block, I lose the image rather than the entire Cover block being wrapped in a new Group block.

Screen.Recording.2022-04-14.at.1.51.15.pm.mp4

It appears that the new transform is still used despite the isMatch correctly returning false. It might also pay for us to update the grouping related tests.

I'll dig into this in more detail next week.

@ramonjd
Copy link
Member

ramonjd commented Apr 21, 2022

Attempt to preserve values in the merged block in a way that's logical and reduces how destructive the transform is

Should custom background and gradient background colors be migrated as well? As far as I can tell they aren't, which is a regression from trunk I think.

With preset:

Screen Shot 2022-04-22 at 8 53 28 am

With custom:

Screen Shot 2022-04-22 at 8 53 37 am

@ndiego
Copy link
Member

ndiego commented Apr 25, 2022

Are we still aiming to get this into 6.0? If not, I will remove from the project board. Thanks!

@glendaviesnz
Copy link
Contributor

Are we still aiming to get this into 6.0? If not, I will remove from the project board. Thanks!

I don't think this is critical for 6.0, and because it also relies on another fix to work, I think we should defer to 6.1.

@aaronrobertshaw
Copy link
Contributor

I believe we'll also need to avoid unnecessary wrapping while transforming from the other direction i.e. from Group.

I've created #40602 to illustrate and fix this separately given I don't think it requires #40497 to land.

@andrewserong andrewserong force-pushed the fix/cover-block-transform-to-group-block branch from 4dad7b3 to 6a8b661 Compare May 2, 2022 05:27
…erve clearing out background / gradient in transform from the Group block
@andrewserong
Copy link
Contributor Author

but added an empty style: { color: {}} attribute if custom colors were not set, so have pushed an couple of updates to prevent this.

Thanks for adding in the fixes @glendaviesnz (and the related #40497) and for resolving the unnecessary wrapping when transformed from Group block @aaronrobertshaw! I've just given this a rebase and re-tested.

@glendaviesnz it looks like in 796ca68 the background and gradient styles are now added in to the attributesWithoutBackgroundColors object. Was that intentional? My thinking at the time was that we'd strip the background and gradient colors from the Group block when transforming from Group, since we're moving those colors to the parent.

I've pushed an update in 508711d that moves the check down to style.color instead of the root style (so that we still preserve other style properties, like padding in the transform), and I've updated it to the preserve the removal of the background / gradient of the Group block:

Before After
image image

I've also added in calls to cleanEmptyObject, so I think this still avoids the issue of serializing the empty style: { color: {}} object, but please let me know if I missed anything / added in a regression to your fixes! 🙇

Copy link
Contributor

@glendaviesnz glendaviesnz left a comment

Choose a reason for hiding this comment

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

This tested well for me now.

✅ Transformed range of Cover blocks with preset and custom colors and gradient to Group and back and no extra wrappers added
✅ Transformed Cover with background image and it went to a Group with nested Cover block

I wonder if it is worth adding some tests for this? packages/blocks/src/api/test/factory.js has some examples of how to test transformations - maybe it would be good to start adding some block specific ones to the block folders as we modify transformations to prevent regressions - I haven't looked closely at how easy/feasible it is to mock a specific transformation though, and not a blocker for this PR, could be a follow up if you think it is feasible.

@andrewserong
Copy link
Contributor Author

Thanks for re-testing @glendaviesnz!

I wonder if it is worth adding some tests for this?

That's a great point, I'll do a little digging to see how feasible it is, but it'd be good to add some in, given that we have a bit of subtle logic going on here that'd be easy to accidentally break. I'll see how I go!

@andrewserong
Copy link
Contributor Author

packages/blocks/src/api/test/factory.js has some examples

Thanks again @glendaviesnz, that worked a treat, after a little digging, it wound up being fairly straightforward to add in tests for the transformations without having to do any mocking, I could just register the Cover and Group blocks via their metadata and then call switchToBlockType 👍

I also added in a test to cover the behaviour @aaronrobertshaw added in #40602.

Do you mind giving this another look when you get a chance, to confidence check the testing approach? Thanks!

Copy link
Contributor

@aaronrobertshaw aaronrobertshaw left a comment

Choose a reason for hiding this comment

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

Thanks for adding the tests, especially those covering #40602 🙇

I've given this another test run:

✅ Transforming Cover to Group works well
✅ Transforming Cover blocks with image or video backgrounds work
✅ Transforming Group to Cover works well
✅ Transforming Group block variations work e.g. Row / Stack
✅ Custom & named colors/gradients are moved appropriately between transformed blocks
✅ Unnecessary wrapping and empty attributes are avoided
✅ Unit tests are all passing

❓ I may have run into an issue when testing transforms of a Cover block with a single Group block as its child. I expected the Group block's colors to be applied to the result. When the original Cover block has a gradient background, the Group block's background color is lost. When the Cover has a flat background color, the Group's background color is honored. So I feel like this is a bit inconsistent. What do you think?

Screen.Recording.2022-05-03.at.5.58.46.pm.mp4

I also have one tiny suggestion to perhaps make the test names read a fraction easier but I'll leave that to you as it is completely optional.

packages/block-library/src/cover/test/transforms.js Outdated Show resolved Hide resolved
@glendaviesnz
Copy link
Contributor

Nice to see how easily the transform tests can be done - a good example to apply to other blocks as they are refactored.

Agree with Aaron's note about the slight clarification of wording. Happy to retest once you have looked at the other potential issue he identified.

@andrewserong
Copy link
Contributor Author

andrewserong commented May 4, 2022

Thanks for the feedback Aaron and Glen! I've done the following:

  • Renamed transform to transfer in the test descriptions
  • Added an if statement in 2279b98 to bail out of merging Cover background colors and gradient to the Group block, if the Group block has any kind of background or gradient color — I think this gets us to a better consistency where the Group block's styling is preserved if it has any. I've added another test to try to cover this, too (or at least the happy path for it). In the editor it looks like this:

image

Please let me know if you can see any issues with that approach!

Copy link
Contributor

@aaronrobertshaw aaronrobertshaw left a comment

Choose a reason for hiding this comment

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

Thanks for the speedy updates @andrewserong 🚀

Everything looks to be working well. The new test is another welcome addition and the test wording reads much better to me now.

I think this is good to go 🚢

@glendaviesnz
Copy link
Contributor

Change tested well for me :shipit:

I wonder if the transform tests would be worthy of a blog post?

@andrewserong
Copy link
Contributor Author

I wonder if the transform tests would be worthy of a blog post?

Oh, nice idea. I might write something up!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Cover Affects the Cover Block - used to display content laid over a background image [Block] Group Affects the Group Block (and row, stack and grid variants) [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants