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

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

Merged
merged 5 commits into from
Apr 27, 2022

Conversation

glendaviesnz
Copy link
Contributor

@glendaviesnz glendaviesnz commented Apr 21, 2022

What?

Checks that a transform matches at the time of running the transform as well as when generating list of transforms for the block transform menu

Why?

If more than one transform matches in given circumstance the wrong one may get picked, eg. in #40293 a new Group to transform was being used in error even though its isMatch function returned false, and because to transforms are given priority it was used instead of the from Group transform that should be used.

How?

Checks that a transforms isMatch method returns true when deciding which transform should run.

Testing Instructions

Check out this PR in conjunction with #40293, and make sure that a Cover block with a background image is transformed to a Cover block wrapped in a Group when the Group transform is picked, but to a Group block with the Cover block background color copied to it if Cover has no background image.

Screenshots or screencast

The following are taken from #40293 with this PR applied

Before:

transform-before2.mp4

After:

transform-after.mp4

…as well as when generating list of transforms for menu
@github-actions
Copy link

github-actions bot commented Apr 21, 2022

Size Change: +643 B (0%)

Total Size: 1.23 MB

Filename Size Change
build/block-editor/index.min.js 151 kB +561 B (0%)
build/block-editor/style-rtl.css 15.1 kB +47 B (0%)
build/block-editor/style.css 15.1 kB +53 B (0%)
build/block-library/blocks/cover/style-rtl.css 1.53 kB -30 B (-2%)
build/block-library/blocks/cover/style.css 1.53 kB -30 B (-2%)
build/block-library/blocks/post-comments/style-rtl.css 511 B -10 B (-2%)
build/block-library/blocks/post-comments/style.css 511 B -10 B (-2%)
build/block-library/editor-rtl.css 10.3 kB +19 B (0%)
build/block-library/editor.css 10.3 kB +18 B (0%)
build/block-library/index.min.js 177 kB +971 B (+1%)
build/block-library/style-rtl.css 11.5 kB -49 B (0%)
build/block-library/style.css 11.5 kB -49 B (0%)
build/blocks/index.min.js 47 kB +20 B (0%)
build/components/index.min.js 222 kB -585 B (0%)
build/edit-navigation/style-rtl.css 4.05 kB +6 B (0%)
build/edit-navigation/style.css 4.05 kB +6 B (0%)
build/edit-post/style-rtl.css 7.11 kB -78 B (-1%)
build/edit-post/style.css 7.11 kB -79 B (-1%)
build/edit-site/style-rtl.css 7.95 kB -83 B (-1%)
build/edit-site/style.css 7.93 kB -85 B (-1%)
build/edit-widgets/style-rtl.css 4.41 kB +9 B (0%)
build/edit-widgets/style.css 4.4 kB +10 B (0%)
build/editor/index.min.js 38.5 kB +11 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-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-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-query-loop/editor-rtl.css 95 B
build/block-library/blocks/comments-query-loop/editor.css 95 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/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
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 447 B
build/block-library/blocks/latest-posts/style.css 446 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-modal.min.js 2.65 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-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/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/components/style-rtl.css 15 kB
build/components/style.css 15 kB
build/compose/index.min.js 11.2 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 8.65 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-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 30.1 kB
build/edit-site/index.min.js 47.5 kB
build/edit-widgets/index.min.js 16.3 kB
build/editor/style-rtl.css 3.71 kB
build/editor/style.css 3.71 kB
build/element/index.min.js 4.29 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.12 kB
build/nux/style-rtl.css 751 B
build/nux/style.css 749 B
build/plugins/index.min.js 1.98 kB
build/preferences/index.min.js 1.2 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 Author

@jorgefilipecosta, @youknowriad it was a long time ago that this transform code was added, but do you remember if there was a specific reason why it didn't check if a transform had a passing isMatch before running the transform, other than the fact that in theory it wouldn't appear on the menu if isMatch was false?

@ramonjd
Copy link
Member

ramonjd commented Apr 21, 2022

This works as advertised @glendaviesnz for cover blocks with images.

One thing I noticed, and I'm currently checking to see if it's an existing issue with trunk or #40293, is that custom colors are not transferred to the group block wrapper for cover blocks with background colors and no images.

Before transform

<!-- wp:cover {"dimRatio":50,"customOverlayColor":"#d7a06c","isDark":false} -->
<div class="wp-block-cover is-light"><span aria-hidden="true" class="wp-block-cover__background has-background-dim" style="background-color:#d7a06c"></span><div class="wp-block-cover__inner-container"><!-- wp:paragraph {"align":"center","placeholder":"Write title…","fontSize":"large"} -->
<p class="has-text-align-center has-large-font-size">Group</p>
<!-- /wp:paragraph --></div></div>
<!-- /wp:cover -->

After transform

<!-- wp:group -->
<div class="wp-block-group"><!-- wp:paragraph {"align":"center","placeholder":"Write title…","fontSize":"large"} -->
<p class="has-text-align-center has-large-font-size">Group</p>
<!-- /wp:paragraph --></div>
<!-- /wp:group -->

Edit:

I'm currently checking to see if it's an existing issue with trunk or #40293,

So far it's only happening in #40293

@youknowriad
Copy link
Contributor

other than the fact that in theory it wouldn't appear on the menu if isMatch was false?

I guess that's the only reason. Is this not true, I mean it's not clear to me by reading the PR description why a transform would be isMatch "true" when showing the list but "false" when running it?

@glendaviesnz
Copy link
Contributor Author

I guess that's the only reason. Is this not true, I mean it's not clear to me by reading the PR description why a transform would be isMatch "true" when showing the list but "false" when running it?

Sorry @youknowriad, my description was not very clear. The isMatch in the Cover block to Group block transform instance over at #40293 returns false both when getting the transformation menu list, and when running the actual transformation. The issue is that currently isMatch is not checked when the transformation is actual run, and because to transformations are prioritised the Cover block to Group block one runs, even though isMatch is false, instead of the Group block from Cover block one which should run.

Let me know if that doesn't clarify it enough.

@youknowriad
Copy link
Contributor

Oh, makes sense thank you :)

*
* @return {boolean} True if given blocks are a match for given tranform.
*/
function checkTransformIsMatch( transform, blocks, sourceBlock ) {
Copy link
Contributor

@youknowriad youknowriad Apr 22, 2022

Choose a reason for hiding this comment

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

Seems like blocks or sourceBlock is the same thing right (source block or blocks)?, can't we just use a single argument for this?

Copy link
Member

Choose a reason for hiding this comment

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

Exactly source block is just the first block in blocks const sourceBlock = first( blocks );, we can have a single parameter.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

thanks @youknowriad & @jorgefilipecosta, good point about the unnecessary argument, I have tidied this up.

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 putting this one together @glendaviesnz 👍

This tested well for me including following the testing instructions for #40293

✅ Unit tests pass
✅ Cover block with background image is transformed to Group with inner Cover block
✅ Cover with background color or gradient is transformed to Group with correct background with no inner Cover block


While testing a Cover block with a background image, it successfully transforms to Group block that wraps the current Cover block to prevent losing the image. When transforming the Group that now wraps the Cover block, back into a Cover block we end up with a Cover > Group > Cover block.

This isn't specific to this PR. I believe a simple check in the Cover block from core/group transform could clean this up. I've created a separate PR to address this: #40602.


This is completely optional but we might be able to simplify some of the conditional checks for whether the transform's isMatch is a function by moving that to the new checkTransformIsMatch function.

Example moving `isMatch` function check into `checkTransformIsMatch`
diff --git a/packages/blocks/src/api/factory.js b/packages/blocks/src/api/factory.js
index b5a39c1640..6cdf56464e 100644
--- a/packages/blocks/src/api/factory.js
+++ b/packages/blocks/src/api/factory.js
@@ -220,10 +220,7 @@ const isPossibleTransformForSource = ( transform, direction, blocks ) => {
 	}
 
 	// If the transform has a `isMatch` function specified, check that it returns true.
-	if (
-		isFunction( transform.isMatch ) &&
-		! checkTransformIsMatch( transform, blocks )
-	) {
+	if ( ! checkTransformIsMatch( transform, blocks ) ) {
 		return false;
 	}
 
@@ -463,13 +460,17 @@ export function getBlockTransforms( direction, blockTypeOrName ) {
  * @return {boolean} True if given blocks are a match for given tranform.
  */
 function checkTransformIsMatch( transform, blocks ) {
-	const sourceBlock = first( blocks );
-	const attributes = transform.isMultiBlock
-		? blocks.map( ( block ) => block.attributes )
-		: sourceBlock.attributes;
-	const block = transform.isMultiBlock ? blocks : sourceBlock;
+	if ( typeof transform.isMatch !== 'function' ) {
+		return true;
+	}
 
-	return transform.isMatch( attributes, block );
+	if ( transform.isMultiBlock ) {
+		const attributes = blocks.map( ( block ) => block.attributes );
+		return transform.isMatch( attributes, blocks );
+	}
+
+	const sourceBlock = first( blocks );
+	return transform.isMatch( sourceBlock.attributes, sourceBlock );
 }
 
 /**
@@ -499,8 +500,7 @@ export function switchToBlockType( blocks, name ) {
 				( isWildcardBlockTransform( t ) ||
 					t.blocks.indexOf( name ) !== -1 ) &&
 				( ! isMultiBlock || t.isMultiBlock ) &&
-				( ! isFunction( t.isMatch ) ||
-					checkTransformIsMatch( t, blocksArray ) )
+				checkTransformIsMatch( t, blocksArray )
 		) ||
 		findTransform(
 			transformationsFrom,
@@ -509,8 +509,7 @@ export function switchToBlockType( blocks, name ) {
 				( isWildcardBlockTransform( t ) ||
 					t.blocks.indexOf( sourceName ) !== -1 ) &&
 				( ! isMultiBlock || t.isMultiBlock ) &&
-				( ! isFunction( t.isMatch ) ||
-					checkTransformIsMatch( t, blocksArray ) )
+				checkTransformIsMatch( t, blocksArray )
 		);
 
 	// Stop if there is no valid transformation.

I also left one small suggestion below to fix a typo.

packages/blocks/src/api/factory.js Outdated Show resolved Hide resolved
Co-authored-by: Aaron Robertshaw <60436221+aaronrobertshaw@users.noreply.github.com>
@glendaviesnz
Copy link
Contributor Author

glendaviesnz commented Apr 26, 2022

This is completely optional but we might be able to simplify some of the conditional checks for whether the transform's isMatch is a function by moving that to the new checkTransformIsMatch function.

@aaronrobertshaw I did think about this, but decided it was slightly confusing to have checkTransformIsMatch return true when there was in fact no transform to match. I don't have a strong opinion on it though. Is there another name for the method that would better indicate that it would return true if there is no isMatch method to run? What about checkSkipOrRunIsMatch?

@aaronrobertshaw
Copy link
Contributor

but decided it was slightly confusing to have checkTransformIsMatch

That's fair enough. I guess I was thinking you are still checking the transform's isMatch function.

Is there another name for the method that would better indicate that it would return true if there is no isMatch method to run?

If the current name isn't clear enough maybe, MaybeCheckTransformIsMatch?

We can of course leave it as it is but there is a lot going on in some of those other checks so I leaned towards reducing that if we could. I don't feel strongly about it.

@glendaviesnz
Copy link
Contributor Author

@aaronrobertshaw I have pulled the function check into a renamed maybeCheckTransformIsMatch method

@aaronrobertshaw
Copy link
Contributor

@glendaviesnz this is still testing well for me. 🚀

✅ Unit tests are still passing
✅ Latest changes LGTM
✅ Still tests as advertised in conjunction with #40293

@glendaviesnz glendaviesnz merged commit 7111958 into trunk Apr 27, 2022
@glendaviesnz glendaviesnz deleted the add/is-match-check-to-actual-transform branch April 27, 2022 01:39
@github-actions github-actions bot added this to the Gutenberg 13.2 milestone Apr 27, 2022
@georgeh georgeh added the [Type] Bug An existing feature does not function as intended label May 11, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Block API API that allows to express the block paradigm. [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants