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

Query block setup with block patterns integration #28891

Merged
merged 14 commits into from
Feb 25, 2021

Conversation

ntsekouras
Copy link
Contributor

@ntsekouras ntsekouras commented Feb 9, 2021

Description

Resolves: #27031
Related: #27575

This PR will enhance the initialisation of Query block, by setting up some attributes and selecting a starting layout either by using block variations or block patterns (some blocks to insert in the Query Loop).

For now we can select some basic attributes, which for now is the most important one inherit global query, and set accordingly the post type of the Query block.

Block patterns integration

Since there are plans to integrate block patterns in different contexts (examples are setup context like the this PR, or transform context in Block Switcher later) we need to make sure it's clear for theme/block pattern authors how to make their block patterns available in each context/view.

The proposed API

There are many similarities here to block variations, so I introduced in block patterns API a new property called scope.
This property will be an object with the available scopes as keys, like inserter, block(for Placeholder) etc..

inserter will be boolean and the other scopes arrays with the block names as values. This way patterns could be filtered in a rather generic way, with the new selector __experimentalGetScopedBlockPatterns.

example in a pattern:

'scope'      => array(
	'inserter' => false,
	'block'    => array( 'core/query' ),
),

If a block pattern has not set a scope, it will be handled as having inserter set to true for backwards compatibility.

I understand that patterns can have many blocks, but this will make it explicit where to show what and it's going to be more performant.

Let's look at this with an example.

We have a pattern that includes blocks: Columns, Image, Buttons, Quote , Paragraph.
Without an explicit API, we will have to parse patterns to try to find matching blocks (performance).
The above pattern even though it might contain 5 blocks, it might be focused on the Columns and/or Image and we don't want to show it in the Quote block's related actions. This could be the exact opposite of course by focusing only in Quote for something like testimonials.

I'm not sure though how we will handle transforms eventually as it's a different operation than an initialization.

Showcase

Before

queryBefore

After

this

Notes

  1. Preview differs between page and FSE context like index template. This should be handled with examples probably like the Post Title.

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR.

@ntsekouras ntsekouras added Needs Design Needs design efforts. [Feature] Full Site Editing [Feature] Patterns A collection of blocks that can be synced (previously reusable blocks) or unsynced [Block] Query Loop Affects the Query Loop Block labels Feb 9, 2021
@ntsekouras ntsekouras requested a review from a team February 9, 2021 17:14
@ntsekouras ntsekouras self-assigned this Feb 9, 2021
@github-actions
Copy link

github-actions bot commented Feb 9, 2021

Size Change: +3 kB (0%)

Total Size: 1.38 MB

Filename Size Change
build/a11y/index.js 1.14 kB -1 B (0%)
build/annotations/index.js 3.78 kB +3 B (0%)
build/block-editor/index.js 124 kB +138 B (0%)
build/block-library/blocks/button/style-rtl.css 460 B -5 B (-1%)
build/block-library/blocks/button/style.css 460 B -4 B (-1%)
build/block-library/blocks/query/editor-rtl.css 814 B +655 B (+412%) 🆘
build/block-library/blocks/query/editor.css 812 B +652 B (+408%) 🆘
build/block-library/editor-rtl.css 9.41 kB +353 B (+4%)
build/block-library/editor.css 9.39 kB +350 B (+4%)
build/block-library/index.js 146 kB +834 B (+1%)
build/block-library/style-rtl.css 8.81 kB -4 B (0%)
build/block-library/style.css 8.82 kB -2 B (0%)
build/blocks/index.js 48.3 kB +1 B (0%)
build/components/index.js 272 kB -12 B (0%)
build/compose/index.js 11.1 kB -1 B (0%)
build/core-data/index.js 16.7 kB -1 B (0%)
build/edit-navigation/index.js 11 kB +3 B (0%)
build/edit-post/index.js 307 kB +1 B (0%)
build/edit-site/index.js 26.1 kB -99 B (0%)
build/edit-widgets/index.js 20 kB +3 B (0%)
build/editor/index.js 42.1 kB +135 B (0%)
build/format-library/index.js 6.77 kB +1 B (0%)
build/nux/index.js 3.41 kB -2 B (0%)
build/rich-text/index.js 13.4 kB +1 B (0%)
build/server-side-render/index.js 2.77 kB +2 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/api-fetch/index.js 3.4 kB 0 B
build/autop/index.js 2.84 kB 0 B
build/blob/index.js 665 B 0 B
build/block-directory/index.js 9.1 kB 0 B
build/block-directory/style-rtl.css 1.01 kB 0 B
build/block-directory/style.css 1.01 kB 0 B
build/block-editor/style-rtl.css 12.1 kB 0 B
build/block-editor/style.css 12.1 kB 0 B
build/block-library/blocks/archives/editor-rtl.css 61 B 0 B
build/block-library/blocks/archives/editor.css 60 B 0 B
build/block-library/blocks/audio/editor-rtl.css 58 B 0 B
build/block-library/blocks/audio/editor.css 58 B 0 B
build/block-library/blocks/audio/style-rtl.css 103 B 0 B
build/block-library/blocks/audio/style.css 103 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 233 B 0 B
build/block-library/blocks/buttons/editor.css 233 B 0 B
build/block-library/blocks/buttons/style-rtl.css 303 B 0 B
build/block-library/blocks/buttons/style.css 303 B 0 B
build/block-library/blocks/calendar/style-rtl.css 208 B 0 B
build/block-library/blocks/calendar/style.css 208 B 0 B
build/block-library/blocks/categories/editor-rtl.css 84 B 0 B
build/block-library/blocks/categories/editor.css 83 B 0 B
build/block-library/blocks/categories/style-rtl.css 79 B 0 B
build/block-library/blocks/categories/style.css 79 B 0 B
build/block-library/blocks/code/style-rtl.css 90 B 0 B
build/block-library/blocks/code/style.css 90 B 0 B
build/block-library/blocks/columns/editor-rtl.css 190 B 0 B
build/block-library/blocks/columns/editor.css 190 B 0 B
build/block-library/blocks/columns/style-rtl.css 421 B 0 B
build/block-library/blocks/columns/style.css 421 B 0 B
build/block-library/blocks/cover/editor-rtl.css 390 B 0 B
build/block-library/blocks/cover/editor.css 389 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.25 kB 0 B
build/block-library/blocks/cover/style.css 1.25 kB 0 B
build/block-library/blocks/embed/editor-rtl.css 486 B 0 B
build/block-library/blocks/embed/editor.css 486 B 0 B
build/block-library/blocks/embed/style-rtl.css 396 B 0 B
build/block-library/blocks/embed/style.css 395 B 0 B
build/block-library/blocks/file/editor-rtl.css 199 B 0 B
build/block-library/blocks/file/editor.css 198 B 0 B
build/block-library/blocks/file/style-rtl.css 248 B 0 B
build/block-library/blocks/file/style.css 248 B 0 B
build/block-library/blocks/freeform/editor-rtl.css 2.45 kB 0 B
build/block-library/blocks/freeform/editor.css 2.45 kB 0 B
build/block-library/blocks/gallery/editor-rtl.css 689 B 0 B
build/block-library/blocks/gallery/editor.css 690 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.07 kB 0 B
build/block-library/blocks/gallery/style.css 1.06 kB 0 B
build/block-library/blocks/group/editor-rtl.css 318 B 0 B
build/block-library/blocks/group/editor.css 317 B 0 B
build/block-library/blocks/group/style-rtl.css 57 B 0 B
build/block-library/blocks/group/style.css 57 B 0 B
build/block-library/blocks/heading/editor-rtl.css 129 B 0 B
build/block-library/blocks/heading/editor.css 129 B 0 B
build/block-library/blocks/heading/style-rtl.css 76 B 0 B
build/block-library/blocks/heading/style.css 76 B 0 B
build/block-library/blocks/html/editor-rtl.css 281 B 0 B
build/block-library/blocks/html/editor.css 281 B 0 B
build/block-library/blocks/image/editor-rtl.css 717 B 0 B
build/block-library/blocks/image/editor.css 716 B 0 B
build/block-library/blocks/image/style-rtl.css 477 B 0 B
build/block-library/blocks/image/style.css 478 B 0 B
build/block-library/blocks/latest-comments/editor-rtl.css 159 B 0 B
build/block-library/blocks/latest-comments/editor.css 158 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 269 B 0 B
build/block-library/blocks/latest-comments/style.css 269 B 0 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B 0 B
build/block-library/blocks/latest-posts/editor.css 137 B 0 B
build/block-library/blocks/latest-posts/style-rtl.css 523 B 0 B
build/block-library/blocks/latest-posts/style.css 522 B 0 B
build/block-library/blocks/list/editor-rtl.css 65 B 0 B
build/block-library/blocks/list/editor.css 65 B 0 B
build/block-library/blocks/list/style-rtl.css 63 B 0 B
build/block-library/blocks/list/style.css 63 B 0 B
build/block-library/blocks/media-text/editor-rtl.css 191 B 0 B
build/block-library/blocks/media-text/editor.css 191 B 0 B
build/block-library/blocks/media-text/style-rtl.css 535 B 0 B
build/block-library/blocks/media-text/style.css 532 B 0 B
build/block-library/blocks/more/editor-rtl.css 434 B 0 B
build/block-library/blocks/more/editor.css 434 B 0 B
build/block-library/blocks/navigation-link/editor-rtl.css 395 B 0 B
build/block-library/blocks/navigation-link/editor.css 397 B 0 B
build/block-library/blocks/navigation-link/style-rtl.css 704 B 0 B
build/block-library/blocks/navigation-link/style.css 702 B 0 B
build/block-library/blocks/navigation/editor-rtl.css 1.34 kB 0 B
build/block-library/blocks/navigation/editor.css 1.34 kB 0 B
build/block-library/blocks/navigation/style-rtl.css 195 B 0 B
build/block-library/blocks/navigation/style.css 195 B 0 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B 0 B
build/block-library/blocks/nextpage/editor.css 395 B 0 B
build/block-library/blocks/page-list/editor-rtl.css 214 B 0 B
build/block-library/blocks/page-list/editor.css 214 B 0 B
build/block-library/blocks/page-list/style-rtl.css 527 B 0 B
build/block-library/blocks/page-list/style.css 526 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 109 B 0 B
build/block-library/blocks/paragraph/editor.css 109 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 273 B 0 B
build/block-library/blocks/paragraph/style.css 273 B 0 B
build/block-library/blocks/post-author/editor-rtl.css 209 B 0 B
build/block-library/blocks/post-author/editor.css 209 B 0 B
build/block-library/blocks/post-author/style-rtl.css 183 B 0 B
build/block-library/blocks/post-author/style.css 184 B 0 B
build/block-library/blocks/post-comments-form/style-rtl.css 250 B 0 B
build/block-library/blocks/post-comments-form/style.css 250 B 0 B
build/block-library/blocks/post-content/editor-rtl.css 139 B 0 B
build/block-library/blocks/post-content/editor.css 139 B 0 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B 0 B
build/block-library/blocks/post-excerpt/editor.css 73 B 0 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B 0 B
build/block-library/blocks/post-featured-image/editor.css 338 B 0 B
build/block-library/blocks/post-featured-image/style-rtl.css 100 B 0 B
build/block-library/blocks/post-featured-image/style.css 100 B 0 B
build/block-library/blocks/preformatted/style-rtl.css 63 B 0 B
build/block-library/blocks/preformatted/style.css 63 B 0 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B 0 B
build/block-library/blocks/pullquote/editor.css 183 B 0 B
build/block-library/blocks/pullquote/style-rtl.css 316 B 0 B
build/block-library/blocks/pullquote/style.css 316 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 90 B 0 B
build/block-library/blocks/query-loop/editor.css 89 B 0 B
build/block-library/blocks/query-loop/style-rtl.css 315 B 0 B
build/block-library/blocks/query-loop/style.css 317 B 0 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B 0 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B 0 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B 0 B
build/block-library/blocks/query-pagination/editor.css 262 B 0 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B 0 B
build/block-library/blocks/query-pagination/style.css 168 B 0 B
build/block-library/blocks/quote/editor-rtl.css 61 B 0 B
build/block-library/blocks/quote/editor.css 61 B 0 B
build/block-library/blocks/quote/style-rtl.css 169 B 0 B
build/block-library/blocks/quote/style.css 169 B 0 B
build/block-library/blocks/rss/editor-rtl.css 201 B 0 B
build/block-library/blocks/rss/editor.css 202 B 0 B
build/block-library/blocks/rss/style-rtl.css 290 B 0 B
build/block-library/blocks/rss/style.css 290 B 0 B
build/block-library/blocks/search/editor-rtl.css 165 B 0 B
build/block-library/blocks/search/editor.css 165 B 0 B
build/block-library/blocks/search/style-rtl.css 342 B 0 B
build/block-library/blocks/search/style.css 344 B 0 B
build/block-library/blocks/separator/editor-rtl.css 99 B 0 B
build/block-library/blocks/separator/editor.css 99 B 0 B
build/block-library/blocks/separator/style-rtl.css 236 B 0 B
build/block-library/blocks/separator/style.css 236 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 504 B 0 B
build/block-library/blocks/shortcode/editor.css 504 B 0 B
build/block-library/blocks/site-logo/editor-rtl.css 201 B 0 B
build/block-library/blocks/site-logo/editor.css 201 B 0 B
build/block-library/blocks/site-logo/style-rtl.css 117 B 0 B
build/block-library/blocks/site-logo/style.css 117 B 0 B
build/block-library/blocks/social-link/editor-rtl.css 164 B 0 B
build/block-library/blocks/social-link/editor.css 165 B 0 B
build/block-library/blocks/social-links/editor-rtl.css 696 B 0 B
build/block-library/blocks/social-links/editor.css 696 B 0 B
build/block-library/blocks/social-links/style-rtl.css 1.36 kB 0 B
build/block-library/blocks/social-links/style.css 1.36 kB 0 B
build/block-library/blocks/spacer/editor-rtl.css 302 B 0 B
build/block-library/blocks/spacer/editor.css 302 B 0 B
build/block-library/blocks/spacer/style-rtl.css 48 B 0 B
build/block-library/blocks/spacer/style.css 48 B 0 B
build/block-library/blocks/subhead/editor-rtl.css 99 B 0 B
build/block-library/blocks/subhead/editor.css 99 B 0 B
build/block-library/blocks/subhead/style-rtl.css 80 B 0 B
build/block-library/blocks/subhead/style.css 80 B 0 B
build/block-library/blocks/table/editor-rtl.css 489 B 0 B
build/block-library/blocks/table/editor.css 489 B 0 B
build/block-library/blocks/table/style-rtl.css 386 B 0 B
build/block-library/blocks/table/style.css 386 B 0 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B 0 B
build/block-library/blocks/tag-cloud/editor.css 118 B 0 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B 0 B
build/block-library/blocks/tag-cloud/style.css 94 B 0 B
build/block-library/blocks/template-part/editor-rtl.css 557 B 0 B
build/block-library/blocks/template-part/editor.css 556 B 0 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B 0 B
build/block-library/blocks/text-columns/editor.css 95 B 0 B
build/block-library/blocks/text-columns/style-rtl.css 166 B 0 B
build/block-library/blocks/text-columns/style.css 166 B 0 B
build/block-library/blocks/verse/editor-rtl.css 62 B 0 B
build/block-library/blocks/verse/editor.css 62 B 0 B
build/block-library/blocks/verse/style-rtl.css 87 B 0 B
build/block-library/blocks/verse/style.css 87 B 0 B
build/block-library/blocks/video/editor-rtl.css 504 B 0 B
build/block-library/blocks/video/editor.css 503 B 0 B
build/block-library/blocks/video/style-rtl.css 193 B 0 B
build/block-library/blocks/video/style.css 193 B 0 B
build/block-library/common-rtl.css 1.08 kB 0 B
build/block-library/common.css 1.08 kB 0 B
build/block-library/theme-rtl.css 748 B 0 B
build/block-library/theme.css 748 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/components/style-rtl.css 15.5 kB 0 B
build/components/style.css 15.5 kB 0 B
build/customize-widgets/index.js 4.08 kB 0 B
build/customize-widgets/style-rtl.css 168 B 0 B
build/customize-widgets/style.css 168 B 0 B
build/data-controls/index.js 830 B 0 B
build/data/index.js 8.86 kB 0 B
build/date/index.js 31.8 kB 0 B
build/deprecated/index.js 768 B 0 B
build/dom-ready/index.js 576 B 0 B
build/dom/index.js 4.94 kB 0 B
build/edit-navigation/style-rtl.css 1.26 kB 0 B
build/edit-navigation/style.css 1.25 kB 0 B
build/edit-post/style-rtl.css 6.81 kB 0 B
build/edit-post/style.css 6.8 kB 0 B
build/edit-site/style-rtl.css 4.41 kB 0 B
build/edit-site/style.css 4.41 kB 0 B
build/edit-widgets/style-rtl.css 3.2 kB 0 B
build/edit-widgets/style.css 3.2 kB 0 B
build/editor/editor-styles-rtl.css 543 B 0 B
build/editor/editor-styles.css 545 B 0 B
build/editor/style-rtl.css 3.89 kB 0 B
build/editor/style.css 3.89 kB 0 B
build/element/index.js 4.61 kB 0 B
build/escape-html/index.js 735 B 0 B
build/format-library/style-rtl.css 637 B 0 B
build/format-library/style.css 639 B 0 B
build/hooks/index.js 2.28 kB 0 B
build/html-entities/index.js 622 B 0 B
build/i18n/index.js 4.01 kB 0 B
build/is-shallow-equal/index.js 698 B 0 B
build/keyboard-shortcuts/index.js 2.54 kB 0 B
build/keycodes/index.js 1.95 kB 0 B
build/list-reusable-blocks/index.js 3.14 kB 0 B
build/list-reusable-blocks/style-rtl.css 629 B 0 B
build/list-reusable-blocks/style.css 628 B 0 B
build/media-utils/index.js 5.35 kB 0 B
build/notices/index.js 1.85 kB 0 B
build/nux/style-rtl.css 731 B 0 B
build/nux/style.css 727 B 0 B
build/plugins/index.js 2.55 kB 0 B
build/primitives/index.js 1.42 kB 0 B
build/priority-queue/index.js 790 B 0 B
build/react-i18n/index.js 1.45 kB 0 B
build/redux-routine/index.js 2.83 kB 0 B
build/reusable-blocks/index.js 3.77 kB 0 B
build/reusable-blocks/style-rtl.css 225 B 0 B
build/reusable-blocks/style.css 225 B 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.27 kB 0 B
build/url/index.js 3.01 kB 0 B
build/viewport/index.js 1.85 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.22 kB 0 B

compressed-size-action

@mtias
Copy link
Member

mtias commented Feb 10, 2021

@jameskoster we might need to prioritize this one #28735

I think what we have in this PR is a great starting point, but I was thinking it'd make sense to have "Patterns + Blank" and when you pick Blank you see the "variations".

@mtias
Copy link
Member

mtias commented Feb 10, 2021

This is an excellent start, thanks for integrating patterns!

@@ -22,6 +22,9 @@ export const settings = {
edit,
save,
variations,
isMatchingBlockPattern: ( pattern ) => {
return pattern.categories?.includes( 'core/query' );
Copy link
Member

Choose a reason for hiding this comment

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

Is this something we should make implicit? cc @youknowriad

In the original issue I suggested patterns: [ ...patternCategories ]

Copy link
Contributor Author

Choose a reason for hiding this comment

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

By having a matching function will help us fine-tune the behaviour for different use cases. One thing that I'm almost certain will be needed for different contexts (ex. transforms with patterns) will be to also pass the block's attributes.

In addition, if we proceed with this approach and usage of patterns for initializing blocks, we should probably make a convention about the pattern's category name or even consider to augment the block patterns API to have some more properties. Maybe include the block's name somehow? 🤔

It must be clear for theme/block pattern authors how to make their block patterns shown in this view (block setup)

Copy link
Member

@gziolo gziolo Feb 12, 2021

Choose a reason for hiding this comment

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

For blocks, we have this parent field that allows the author of the block to tell where this block can be inserted. If the idea is similar here, we should try the same approach first. For patterns, it might context or target or something like that. It all depends on how we want to treat this type of pattern that might not make much sense outside of the given block.

One thing that I'm almost certain will be needed for different contexts (ex. transforms with patterns) will be to also pass the block's attributes.

We can always add such a function in the future, for now, it feels like a simple match between the pattern and block should be enough.

One idea to consider in the future, similar to how it works with block variations. We could always register patterns together with a block but with PHP:

register_block_type_from_metadata( __DIR__, array(
    'patterns' => array(
        $my_pattern, // and so on
    ),
) );

Copy link
Contributor Author

Choose a reason for hiding this comment

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

We can always add such a function in the future, for now, it feels like a simple match between the pattern and block should be enough.

I agree 100% :)

For blocks, we have this parent field that allows the author of the block to tell where this block can be inserted. If the idea is similar here, we should try the same approach first. For patterns, it might context or target or something like that.

For now, without having it explored in depth yet, the augmentation of Patterns API with a new prop makes more sense to me too. One thing that I have in mind is that we will have block patterns that will be used only on block setup, others on transforms etc..

I mention that because there are discussions about transforming a single block to a block pattern which might contain other blocks as well. I think the result would be to replace selected block in pattern and keep the others with their demo content.

This makes it similar with block variations about their scope attribute too. I think we could create a new property in patterns to include block name and such context. An example would be:

[ 'core/query-setup', 'core/buttons-setup', 'core/buttons-transforms'

I'll explore this a lot better after the designs.

lib/load.php Outdated
// Demo query patterns.
register_block_pattern_category(
'core/query',
array( 'label' => __( 'Core Query block', 'gutenberg' ) )
Copy link
Member

Choose a reason for hiding this comment

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

I think the patterns should be called "Post List" or something to that effect

Copy link
Contributor Author

Choose a reason for hiding this comment

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

These are just demo patterns that will not be included in the final code.

@mtias
Copy link
Member

mtias commented Feb 10, 2021

@tellyworth this one is good to keep an eye on for the pattern directory integration into blocks.

lib/load.php Outdated Show resolved Hide resolved
@ntsekouras
Copy link
Contributor Author

I think what we have in this PR is a great starting point, but I was thinking it'd make sense to have "Patterns + Blank" and when you pick Blank you see the "variations".

We could use some design about this and also have in mind how it could be reused by other blocks.

@jasmussen
Copy link
Contributor

This is what I see:

this

Powerful! It's also a big placeholder.

I'm going to take a quick stab at both a near term and longer term visual for this. Hopefully the near term mockup I can help push some CSS for directly. I'll be back.

@jasmussen
Copy link
Contributor

Here's a quick exercise. Based on your feedback I will adjust, and when we're happy, I can help push some CSS and we can get a V1 out.

Initial setup

Query step 1

  • A basic title, 2 buttons, and the "Inherit" toggle.
  • The "Inherit" toggle, when untoggled, expands just as it does today. It shows conditional help text when untoggled, but not in its toggled state.

"Start empty" state

You click "Start empty" in the first step, and you get this screen which you may recognize:

Query step 2a

"Start with a pattern" state

If you had clicked the primary "Start with a pattern" button, we show patterns right in the placeholder:

Query step 2b

The argument for a carousel is that it literally makes them bigger, literally bringing them closer to you. Instead of feeling like you pick a pattern, by being a carouse it feels like you've already chosen a pattern, now you're just paging through options before you confirm.

Click the arrow keys to page between the available patterns.

Query step 2b 2

Or click the pattern itself to insert it.

Questions

  • Is this flow roughly a good way to start?
  • Do we want a "Back" button in both the variation and pattern screens?

I think there's a lot more we can do to make this flow more intuitive. For example I'd love to potentially start with the pattern browser directly — it helps the placeholder pass the "squint test". But for a V1, and per @mtias thoughts on the flow, keeping it two-step might be a good starting point?

@ntsekouras
Copy link
Contributor Author

Do we want a "Back" button in both the variation and pattern screens?

Yes because the main thing here is the block setup, which can set up block attributes as well.

Also we need to have in mind that this could be used eventually in other blocks as well, like columns.

I'm a bit concerned about the carousel approach for a couple of reasons:

  1. feels strange with the rest of the block interactions and current display of block patterns in other places (not necessarily a bad thing though 🤔 )
  2. a user has to browse all the patterns one by one and will have to remember which one they liked etc.. - harder for visual comparison

@mtias
Copy link
Member

mtias commented Feb 11, 2021

I think the carousel is something we need to discuss further on #28735 etc.

@jasmussen
Copy link
Contributor

Great thoughts. Here's a quick iteration based on feedback. It all still starts here:

Query step 1

The "Start empty" state is the same, but now has a back button:

Query step 2a

The "Patterns" state has a back button, and now shows 3 patterns side by side, click one to use it:

Query step 2b

I know that this branch features a scrollbar to afford more patterns. But I have a feeling that if we start with about 6 patterns at most, we can probably avoid it, give or take some responsive considerations. But I think this is best tackled directly in implementation.

Depending on additional feedback, I imagine next steps could be that I start helping out with some CSS here?

@mtias
Copy link
Member

mtias commented Feb 11, 2021

The "start with a pattern" and "start empty" feels a bit redundant as a step. I think I'd prefer to just show patterns and have blank be a choice among them? We'd need to handle narrow spaces, of course. (Maybe in those cases collapse into a button and show the inserter popup with patterns?)

@ntsekouras
Copy link
Contributor Author

Thanks for exploring the design for this 💯

Just keep in mind that we will definitely need helper information about the specific inherit attribute and that there might be more controls for attributes set up. In this case we also have the conditionally shown post type.

If we keep patterns/attributes in one step, we should show the attributes always then. Also the attributes seem to me more important than layout, so it makes more sense to me to be on the top at such an approach.

@jasmussen
Copy link
Contributor

Here's an iteration based on this feedback:

The "start with a pattern" and "start empty" feels a bit redundant as a step. I think I'd prefer to just show patterns and have blank be a choice among them?

Query_ Initial State

Start empty still takes you here:

Query_ Start Empty

We'd need to handle narrow spaces, of course. (Maybe in those cases collapse into a button and show the inserter popup with patterns?)

Yep we have is-small,is-medium and is-large CSS classes we can use to show hide items here.

@jasmussen
Copy link
Contributor

jasmussen commented Feb 12, 2021

After conversing with Nik, here are some tweaks. He noted that we need the help text for the "Inherit URL query" toggle, which currently has a rather verbose help text:

query with patterns

I can appreciate that, but I think there's an opportunity for a much more contextual and brief, but still descriptive help text. Such as:

toggle on

toggle off

I may be missing some nuance in the above verbiage, so feel free to suggest. But having the helptext be conditional to the toggle state, that alone will help make it less overwhelming.


Nik noted that there are cases where no patterns exist, or they weren't loaded. In that case, could we go directly to the variations screen?

start empty b

The alternative becomes rather bare:

query without patterns


Nik also noted that some of the "back button" changes to the placeholder are non trivial to implement. Specifically referring to this screen you get to if you press "Start empty" on the first screen:

start empty a

An alternative has a non-integrated back button:

alternate start empty


Here's what the setup state could look like on mobile, or in narrow contexts (such as inside a column):

narrow

@draganescu
Copy link
Contributor

cc @shaunandrews @tellthemachines
Does this kind of block setup also work for navigation? It would allow us to circumvent a lot of the problems with building complex menus, by adding such a step for selecting, say, header menu patterns or sidebar menu patterns.

@jasmussen
Copy link
Contributor

Does this kind of block setup also work for navigation? I

To an extent, we have it with this:

Screenshot 2021-02-12 at 14 16 45

The tricky challenge is that we can't use a giant white sheet for the navigation block, because it's almost never that big itself. Or to put it differently, the setup state should ideally never be bigger than the configured state.

I think there's an opportunity to revisit navigation with patterns directly inline, which would potentially be able to resize the setup state based on the size of the pattern you pick. @jameskoster just mocked up such a pattern carousel for the Query block, but presumably it could scale down to the navigation block also.

@jameskoster
Copy link
Contributor

presumably it could scale down to the navigation block also

I think it could work! But I also think we need to do some dedicated exploration around how the patterns paradigm translates to navigation in general.

@jasmussen
Copy link
Contributor

Given the complexity of everything going on and how much it requires extra space, perhaps it's worth having all this happen in a modal?

We will probably need a modal at some point anyway, for the narrow viewports or contexts.

@ntsekouras
Copy link
Contributor Author

The "start empty" should have more of an empty look and should be placed at the end?

I placed it at the end.

@ntsekouras ntsekouras marked this pull request as ready for review February 22, 2021 12:50
@ntsekouras ntsekouras requested a review from a team February 22, 2021 12:50
@jasmussen
Copy link
Contributor

I pushed a fix to put the titles outside of the box:

Screenshot 2021-02-22 at 14 37 10

To address this one:

The "start empty" should have more of an empty look

@ntsekouras can we do this?

Screenshot 2021-02-22 at 14 36 39

@jasmussen
Copy link
Contributor

Alright I pushed some polish:

placeholder

There are so many opportunities to polish this further — the icons aren't all that great, and the two-step layout maybe isn't ideal. But I think it's in a place no where it can be shipped, and be useful for a couple of releases, until we revisit this.

@mtias
Copy link
Member

mtias commented Feb 22, 2021

Agreed on getting a baseline in place

@ntsekouras ntsekouras removed the Needs Design Needs design efforts. label Feb 24, 2021
Copy link
Member

@mtias mtias left a comment

Choose a reason for hiding this comment

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

Let's get this in, we have a lot of follow ups to do still but we should do that with more focused attention on separate issues

@ockham
Copy link
Contributor

ockham commented Mar 17, 2021

cc/ @simison -- The new block patterns API that this PR introduces might make sense for migrating some Gutenboarding (and/or WP.com block patterns) functionality to it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Query Loop Affects the Query Loop 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.

Enhance the initialisation of Query with a second step for setting attributes
10 participants