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

[Block Library - Query Loop]: Add allowedControls in block variations for better extensibility #43632

Merged
merged 6 commits into from
Sep 13, 2022

Conversation

ntsekouras
Copy link
Contributor

@ntsekouras ntsekouras commented Aug 26, 2022

What?

Related: #40941

We need to find a good way to allow third party devs to extent Query Loop block easily and in a consistent way. I don't think(at least for now) that we should add a new general API for block variations. Instead, since Query Loop is a quite complicated block and is quite hard to implement everything that is possible(imagine post meta and their UI handling in a generic way) we could have explicit complex handling of this cases in the block itself.

In this PR I'm proposing and an allowedControls property in variations that should handle the hiding/showing of controls. While it's more verbose than a hideControls it will be more flexible for extenders if some new control is added to Query Loop block.

In general I think we would need(notes for follow up PRs):

  1. a namespace attribute to constrain any changes per variation
  2. a way to hide control that are not useful to each variation to make the UI lighter
    1. possibly augment the ToolsPanel for extenders to just add filters there(exploratory PR)
  3. allow a variation to tweak the query with their own logic(mostly for meta in my mind for now)
    1. Server side(Add a filter to build_query_vars_from_query_block #43590)
    2. Client side(Add applyFilters to the Query Block query. #34201) - not necessarily a filter.
  4. a way to update/filter the order/orderBy options

Testing Instructions

  1. Install WooCommerce
  2. In the editor insert a Products List block(added in this PR for testing purposes)

Example Products List variation

{
	name: 'products-list',
	title: __( 'Products List' ),
	description: __( 'Display a list of your products.' ),
	attributes: {
		query: {
			perPage: 4,
			pages: 1,
			offset: 0,
			postType: 'product',
			order: 'desc',
			orderBy: 'date',
			author: '',
			search: '',
			sticky: 'exclude',
			inherit: false,
		},
		namespace: 'wp/query/products',
	},
	allowControls: [ 'order', 'taxQuery', 'search' ],
	isActive: ( blockAttributes, variationAttributes ) =>
		blockAttributes?.namespace === variationAttributes.namespace,
	scope: [ 'inserter' ],
},

Alternatively test with your variations.

Notes

While exploring the client side preview issues, I realized that the REST API doesn't support meta_query. This is a problem of REST API and the way devs do it now, is by adding PHP filters which check for extra custom request params in order to update the query..

What is missing and not mentioned? 🤔

--cc @sunyatasattva @gigitux

@ntsekouras ntsekouras added [Type] Enhancement A suggestion for improvement. [Feature] Extensibility The ability to extend blocks or the editing experience [Package] Block library /packages/block-library [Block] Query Loop Affects the Query Loop Block labels Aug 26, 2022
@ntsekouras ntsekouras self-assigned this Aug 26, 2022
@github-actions
Copy link

github-actions bot commented Aug 26, 2022

Size Change: +796 B (0%)

Total Size: 1.25 MB

Filename Size Change
build/block-editor/index.min.js 162 kB +82 B (0%)
build/block-library/blocks/cover/style-rtl.css 1.57 kB +11 B (+1%)
build/block-library/blocks/separator/style-rtl.css 234 B +1 B (0%)
build/block-library/blocks/separator/style.css 234 B +1 B (0%)
build/block-library/index.min.js 188 kB +229 B (0%)
build/block-library/style-rtl.css 12 kB +17 B (0%)
build/block-library/style.css 12 kB +7 B (0%)
build/components/index.min.js 198 kB +70 B (0%)
build/edit-post/index.min.js 30.7 kB +31 B (0%)
build/edit-site/index.min.js 58.4 kB +182 B (0%)
build/edit-site/style-rtl.css 8.3 kB +63 B (+1%)
build/edit-site/style.css 8.28 kB +65 B (+1%)
build/editor/index.min.js 41.6 kB +37 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 982 B
build/annotations/index.min.js 2.76 kB
build/api-fetch/index.min.js 2.26 kB
build/autop/index.min.js 2.14 kB
build/blob/index.min.js 475 B
build/block-directory/index.min.js 7.05 kB
build/block-directory/style-rtl.css 990 B
build/block-directory/style.css 991 B
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.2 kB
build/block-editor/style.css 15.2 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 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 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 84 B
build/block-library/blocks/avatar/style.css 84 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 441 B
build/block-library/blocks/button/editor.css 441 B
build/block-library/blocks/button/style-rtl.css 505 B
build/block-library/blocks/button/style.css 505 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 100 B
build/block-library/blocks/categories/style.css 100 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 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 187 B
build/block-library/blocks/comment-template/style.css 185 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 834 B
build/block-library/blocks/comments/editor.css 832 B
build/block-library/blocks/comments/style-rtl.css 632 B
build/block-library/blocks/comments/style.css 630 B
build/block-library/blocks/cover/editor-rtl.css 605 B
build/block-library/blocks/cover/editor.css 607 B
build/block-library/blocks/cover/style.css 1.55 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 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 126 B
build/block-library/blocks/embed/theme.css 126 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 253 B
build/block-library/blocks/file/style.css 254 B
build/block-library/blocks/file/view.min.js 346 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 948 B
build/block-library/blocks/gallery/editor.css 950 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 337 B
build/block-library/blocks/group/editor.css 337 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 327 B
build/block-library/blocks/html/editor.css 329 B
build/block-library/blocks/image/editor-rtl.css 876 B
build/block-library/blocks/image/editor.css 873 B
build/block-library/blocks/image/style-rtl.css 627 B
build/block-library/blocks/image/style.css 630 B
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 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 213 B
build/block-library/blocks/latest-posts/editor.css 212 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 507 B
build/block-library/blocks/media-text/style.css 505 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 705 B
build/block-library/blocks/navigation-link/editor.css 703 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 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation-submenu/view.min.js 423 B
build/block-library/blocks/navigation/editor-rtl.css 1.99 kB
build/block-library/blocks/navigation/editor.css 2 kB
build/block-library/blocks/navigation/style-rtl.css 2.15 kB
build/block-library/blocks/navigation/style.css 2.14 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 443 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 174 B
build/block-library/blocks/paragraph/editor.css 174 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 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 493 B
build/block-library/blocks/post-comments-form/style.css 493 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 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 507 B
build/block-library/blocks/post-featured-image/editor.css 505 B
build/block-library/blocks/post-featured-image/style-rtl.css 166 B
build/block-library/blocks/post-featured-image/style.css 166 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 282 B
build/block-library/blocks/post-template/style.css 282 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 100 B
build/block-library/blocks/post-title/style.css 100 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 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 326 B
build/block-library/blocks/pullquote/style.css 325 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 282 B
build/block-library/blocks/query-pagination/style.css 278 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 439 B
build/block-library/blocks/query/editor.css 439 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 396 B
build/block-library/blocks/search/style.css 393 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 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 464 B
build/block-library/blocks/shortcode/editor.css 464 B
build/block-library/blocks/site-logo/editor-rtl.css 488 B
build/block-library/blocks/site-logo/editor.css 488 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 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 184 B
build/block-library/blocks/social-link/editor.css 184 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.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 322 B
build/block-library/blocks/spacer/editor.css 322 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 494 B
build/block-library/blocks/table/editor.css 494 B
build/block-library/blocks/table/style-rtl.css 611 B
build/block-library/blocks/table/style.css 609 B
build/block-library/blocks/table/theme-rtl.css 190 B
build/block-library/blocks/table/theme.css 190 B
build/block-library/blocks/tag-cloud/style-rtl.css 239 B
build/block-library/blocks/tag-cloud/style.css 239 B
build/block-library/blocks/template-part/editor-rtl.css 235 B
build/block-library/blocks/template-part/editor.css 235 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 561 B
build/block-library/blocks/video/editor.css 563 B
build/block-library/blocks/video/style-rtl.css 174 B
build/block-library/blocks/video/style.css 174 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/common-rtl.css 1.02 kB
build/block-library/common.css 1.02 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11 kB
build/block-library/editor.css 11 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 719 B
build/block-library/theme.css 722 B
build/block-serialization-default-parser/index.min.js 1.1 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 49.6 kB
build/components/style-rtl.css 11.5 kB
build/components/style.css 11.5 kB
build/compose/index.min.js 12 kB
build/core-data/index.min.js 15.5 kB
build/customize-widgets/index.min.js 11.3 kB
build/customize-widgets/style-rtl.css 1.38 kB
build/customize-widgets/style.css 1.38 kB
build/data-controls/index.min.js 653 B
build/data/index.min.js 8.06 kB
build/date/index.min.js 32.1 kB
build/deprecated/index.min.js 507 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.7 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 3.99 kB
build/edit-navigation/style.css 4 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/style-rtl.css 6.94 kB
build/edit-post/style.css 6.94 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.34 kB
build/edit-widgets/style.css 4.34 kB
build/editor/style-rtl.css 3.66 kB
build/editor/style.css 3.65 kB
build/element/index.min.js 4.68 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 6.75 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.64 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.77 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.78 kB
build/keycodes/index.min.js 1.81 kB
build/list-reusable-blocks/index.min.js 1.74 kB
build/list-reusable-blocks/style-rtl.css 835 B
build/list-reusable-blocks/style.css 835 B
build/media-utils/index.min.js 2.93 kB
build/notices/index.min.js 953 B
build/nux/index.min.js 2.05 kB
build/nux/style-rtl.css 732 B
build/nux/style.css 728 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.22 kB
build/preferences/index.min.js 1.3 kB
build/primitives/index.min.js 933 B
build/priority-queue/index.min.js 612 B
build/react-i18n/index.min.js 696 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.74 kB
build/reusable-blocks/index.min.js 2.21 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.4 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.53 kB
build/token-list/index.min.js 644 B
build/url/index.min.js 3.61 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.19 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.19 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@ntsekouras ntsekouras force-pushed the try/query-loop-variations-meta branch from 9783230 to 7f75edc Compare August 26, 2022 20:11
@ntsekouras ntsekouras changed the title [Block Library - Query Loop]: Try adding meta attribute for better extensibility [Block Library - Query Loop]: Explore better extensibility Aug 29, 2022
@ntsekouras ntsekouras force-pushed the try/query-loop-variations-meta branch from 7f75edc to 77dd0f0 Compare August 29, 2022 08:11
@ntsekouras ntsekouras changed the title [Block Library - Query Loop]: Explore better extensibility [Block Library - Query Loop]: Add allowedControls in block variations for better extensibility Aug 29, 2022
@ntsekouras ntsekouras marked this pull request as ready for review August 29, 2022 08:18
@gziolo
Copy link
Member

gziolo commented Aug 30, 2022

Nice exploration @ntsekouras. I think it's pretty close to how we could offer the control over which controls related to the query should be used by a given block variation. The bonus would be that every site owner could tweak which controls can be used by users.

I like how this PR shows how every Query block variation can go about ensuring it's the one currently applied. You presented how including an extra attribute namespece would give extra safety when resolving the active variation. It's probably something that shouldn't be in core by default, but plugins could use in case they are worried that attributes.query.postType isn't specific enough.

As for using allowControls: [ 'order', 'taxQuery', 'search' ], in the block variation. I would like to see whether we can mirror how other UI controls are controlled through supports and hasBlockSupport/getBlockSupports methods. Let's take the typography as an example (it still has a ton of experiments but let's assume it becomes stable soon):

{
	"supports": {
		"typography": {
			"fontSize": true,
			"lineHeight": true,
			"__experimentalFontFamily": true,
			"__experimentalFontStyle": true,
			"__experimentalFontWeight": true,
			"__experimentalLetterSpacing": true,
			"__experimentalTextTransform": true,
			"__experimentalDefaultControls": {
				"fontSize": true,
				"fontAppearance": true,
				"textTransform": true
			}
		}
	}
}

It would be nice to use a similar shape to enable controls and pick which controls are available and which are shown in the default view in the sidebar:

{
	"supports": {
		"query": {
			"order": true,
			"taxQuery": true,
			"search": true,
			"__experimentalDefaultControls": {
				"order": true
			}
		}
	}
}

It's very likely that to get use there we would have to figure out how to merge supports from the block with supports from the block variation, but I'm sure it's worth it as it would open space for very interesting customizations.

@nerrad
Copy link
Contributor

nerrad commented Aug 30, 2022

Really liking the flexibility this PR opens up @ntsekouras 👏🏻

I like how this PR shows how every Query block variation can go about ensuring it's the one currently applied. You presented how including an extra attribute namespece would give extra safety when resolving the active variation. It's probably something that shouldn't be in core by default, but plugins could use in case they are worried that attributes.query.postType isn't specific enough.

Another (potential?) advantage of the namespace is it allows for alternative variations for the same postType.

As for using allowControls: [ 'order', 'taxQuery', 'search' ], in the block variation. I would like to see whether we can mirror how other UI controls are controlled through supports and hasBlockSupport/getBlockSupports methods. Let's take the typography as an example (it still has a ton of experiments but let's assume it becomes stable soon):

I'm not sure about this. supports infers not just enabling controls but that the block also supports them. In the case of query block variation, I'm assuming any variations would technically still support the control but just want to limit what the user is able to modify via UI? In that case, would supports be semantically correct?

@nerrad
Copy link
Contributor

nerrad commented Aug 30, 2022

I'm not sure about this. supports infers not just enabling controls but that the block also supports them. In the case of query block variation, I'm assuming any variations would technically still support the control but just want to limit what the user is able to modify via UI? In that case, would supports be semantically correct?

Another thought here is the potential for more granular permission based availability. allowControls would be more semantic fit in that case?

@sunyatasattva
Copy link
Contributor

Great work on this PR as well! Should I close my PR in favor of this one? I mean, I'm still a bit partial to some of my implementation details (also because I spent a lot of time on that 😬), of course, but nothing I hold too strongly and couldn't throw away in favor of something y'all feel it would be a better overall direction for the project.

I like the idea of using the supports API, as it would be consistent and also easily discoverable. Probably it could also be an easier way for such a thing to be accepted in other blocks and to work towards making customizing controls a standard feature. I share @nerrad's concern about semantics, though it's sometimes unclear. It is true that sometimes the variation would “technically“ support the control, and just want to disable it; but there are also other cases in which the variation would outright not support the control, as it would break it.

Overall, I think the semantic ambiguity is a price we can pay for the advantages we gain.

So, let me know if there is something we should salvage from my PR, or we should outright close it, or how I can help with this implementation.

@gziolo
Copy link
Member

gziolo commented Aug 30, 2022

I'm not sure about this. supports infers not just enabling controls but that the block also supports them. In the case of query block variation, I'm assuming any variations would technically still support the control but just want to limit what the user is able to modify via UI? In that case, would supports be semantically correct?

@nerrad, it's a gray area with block variations. If you look at that historically, we had individual blocks that shared most of the characteristics, e.g. Embeds, Social Links. We went and combined them under one block type and introduced variation so we could still offer the same customizations. I would say that conceptually those are different blocks, but grouped together to optimize for code reuse and to offer additional UI behaviors that for some blocks offer easier switching between different variations.

I agree that supports is overloaded and it's often difficult to reason about, but at the same time it has well-defined API that we could adjust to our needs. I have one main concern with using the allowControls: [ 'order', 'taxQuery', 'search' ], inside the block variation. This is a new API that applies only to block variations, so it doesn't offer a way to disable/enable controls by the developer on the default version of the block, it would be great to keep block variations as close as possible to what Block API for the type offers.

The one more thing to think about is that names used here like search or order are pretty common, so no matter how we approach that, it still would be worth using some form of namespacing when we group the same controls in the UI. Maybe there could be some pattern borrowed from typography, spacing, that live in block.json.

Great work on this PR as well! Should I close #43675 in favor of this one? I mean, I'm still a bit partial to some of my implementation details (also because I spent a lot of time on that 😬), of course, but nothing I hold too strongly and couldn't throw away in favor of something y'all feel it would be a better overall direction for the project.

No need to close your PR for now. It's great to have a few ideas floating around so we pick the best approach later in the process. The work you started is a great way to verify also the ideas in practice.

@ntsekouras
Copy link
Contributor Author

Thanks for the feedback all!

including an extra attribute namespece would give extra safety when resolving the active variation. It's probably something that shouldn't be in core by default, but plugins could use in case they are worried that attributes.query.postType isn't specific enough.

In this PR the namespace will not be used in core, but I think it will be in #40941 with dynamic created variations by core. My thought here is that it would be good to add it in core, so we can have a consistent way of extension by third party devs. It would probably help with block transformation to other variations(that's the plan for the above linked issue), until we revisit and land an API with the experimentalRole: internal or whatever to not serialize all attributes.

As for using allowControls: [ 'order', 'taxQuery', 'search' ], in the block variation. I would like to see whether we can mirror how other UI controls are controlled through supports

I agree with @nerrad and I wouldn't prefer them to be in block supports. Technically the block does support all of them and we just want to control visibility. In my PR the property is in block variations, but doesn't really affect the block API - it's an implementation detail similar to embed block variations' pattern attribute.

It's not only about semantics though for me. I believe that we can constraint this really specific functionality for this complex block without adding more complexity with props for each control etc... Also even if we did it in supports, it's not something we can have some benefits for other usages, as other supports are for any block that implement a new behavior(color, typography, etc..).

allowedControls can be quite easy to use by third party devs and the search, author etc.. are mapped to the query properties, so they are easily discoverable.

This is a new API that applies only to block variations, so it doesn't offer a way to disable/enable controls by the developer on the default version of the block

This is the drawback from this approach, but I think we don't really need it(at least for now). Query Loop exists for a while now and most issues are about adding more filters/options to it and refinements to 'lighten' the UI are happening(ToolsPanel) and are going to happen.

@sunyatasattva
Copy link
Contributor

While it's more verbose than a hideControls it will be more flexible for extenders if some new control is added to Query Loop block.

Just a little note on this. I used the negative approach in my PR (in the form of disabledInspectorControls) also to provide backwards compatibility. We need to make sure that the default is all controls when this attribute is not specified.

@ntsekouras
Copy link
Contributor Author

I used the negative approach in my PR (in the form of disabledInspectorControls) also to provide backwards compatibility. We need to make sure that the default is all controls when this attribute is not specified.

This is handled here.

@ntsekouras
Copy link
Contributor Author

Do you think there would be a world in which we would consider having allowedControls as an API for blocks customization in general (even if it would be far away in the future), or is that completely out of the table?

I'm not sure we'll need one, but 🤷 . The other cases usually mentioned(like the width) do affect layout and probably should be handled with a new supports flag.

You can extend the tooling so it's discoverable by developers.

@gziolo what did you have in mind with the above? Something in GB?

@gziolo
Copy link
Member

gziolo commented Sep 9, 2022

Do you think there would be a world in which we would consider having allowedControls as an API for blocks customization in general (even if it would be far away in the future), or is that completely out of the table?

I'm not sure we'll need one, but 🤷 . The other cases usually mentioned(like the width) do affect layout and probably should be handled with a new supports flag.

This is one of the most requested features that is still missing in the block editor to be able to disable all or individual UI controls in the block toolbar and inspector controls. It's now possible to UI controls related to Styles, but it's missing to block-specific controls as it's far more difficult to integrate.

You can extend the tooling so it's discoverable by developers.

@gziolo what did you have in mind with the above? Something in GB?

I meant that you could in theory extend block.json schema and TypeScript types with those custom undocumented fields.

@ntsekouras
Copy link
Contributor Author

This is one of the most requested features that is still missing in the block editor to be able to disable all or individual UI controls in the block toolbar and inspector controls.

Wow, I wasn't aware of that..

@gziolo
Copy link
Member

gziolo commented Sep 12, 2022

This is one of the most requested features that is still missing in the block editor to be able to disable all or individual UI controls in the block toolbar and inspector controls.

Wow, I wasn't aware of that..

Here is the most recent lightning talk "Customizing Core Blocks" by Alex Ball from WordCamp US that should give you an idea about people's use cases: https://youtu.be/-hWtGDLc_Nk?t=15539.

@roseg43
Copy link
Contributor

roseg43 commented Sep 12, 2022

I'm not sure we'll need one, but 🤷 . The other cases usually mentioned(like the width) do affect layout and probably should be handled with a new supports flag.

@ntsekouras If you check out the conversation in #42079, opinions surrounding using new supports flags for feature implementations that are unique to a block are quite polarized; having a dedicated API that allows editors to define the visibility of nonessential block controls would likely be much more agreeable.

For some folks, the ability to customize these controls is the difference between using a core block and making a custom one; I'd love to see more tooling become available to reduce the need for custom blocks that closely resemble core ones. The work you're doing here looks like it could really fill this need were the scope expanded a bit. 🙂

@ntsekouras
Copy link
Contributor Author

I'm not sure we'll need one, but 🤷 . The other cases usually mentioned(like the width) do affect layout and probably should be handled with a new supports flag.

@ntsekouras If you check out the conversation in #42079, opinions surrounding using new supports flags for feature implementations that are unique to a block are quite polarized;

I agree. What I meant was making the width support available for other blocks and not add supports for specific blocks, something like Aaron's old PR. Anyway, this is a different conversation..

@nerrad
Copy link
Contributor

nerrad commented Sep 12, 2022

To summarize it looks like in general we have some consensus that the work here is good with the following observations:

  1. It would be great to expand this beyond variations and allow for more external control of allowed controls across blocks.
  2. This is missing type definitions for allowControls (but also the pre-existing patterns key on the embed variation as well).

For 1 above, I suggest we use the limited scope of this PR to see how this works with the Query Loop block variations and move the larger conversation around expanding this to all block controls to a separate issue. This allows surfacing this narrower scope that meets some important use-cases in WP 6.1 (with the deadline looming near).

For 2 since the typing issue already exists for the embed:patterns property. Could both typing issues be dealt with in a separate PR for now?

@sunyatasattva
Copy link
Contributor

I'm adding my ✅ to this. This fits our use-case. I still have some concerns about the white-listing of controls vs. the black-listing approach offered in my alternative PR. Having to specifically white-list allowed controls, means that if the Core Query block is updated with new cool controls, people will have to specifically opt-in. And they might not know about them, as knowing whether a block has been updated with new control (especially if it's something global) might be hard.

I think opting out of control is a better approach, that allows sensible defaults without having to think too much. Then devs can really decide if they don't want something and disable it.

As for the rest of the comments and concerns, I agree they can be addressed in future PRs.

Copy link
Contributor

@nerrad nerrad left a comment

Choose a reason for hiding this comment

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

This looks good to merge with considerations outlined here.

I think opting out of control is a better approach, that allows sensible defaults without having to think too much. Then devs can really decide if they don't want something and disable it.

In some cases I think that may be true, but in the context of the Query Loop block and variations I think it's more likely the surprising appearance of additional controls could be undesirable. By opting into using the allowedControls API, this is a signal for curated control UIs exposed to the user. It's rather trivial for plugins to register additional allowedControls and then, release. End users would update to get that additional functionality. However, the opposite could be problematic if the additional functionality is undesirable as that would surface to the end user sooner.

@gziolo
Copy link
Member

gziolo commented Sep 12, 2022

I echo what @nerrad shared in the last comment. There are pros and cons to both approaches, but having a list of allowed controls prevents accidental exposure of unwanted UI options.

@sunyatasattva
Copy link
Contributor

Alright! I stand with your decision here, just wanted to voice my thoughts.

@ntsekouras
Copy link
Contributor Author

Thanks all for the reviews and the feedback! This PR definitely surfaced some interesting issues we need to explore/address in the future.

@ntsekouras ntsekouras merged commit bc16c8d into trunk Sep 13, 2022
@ntsekouras ntsekouras deleted the try/query-loop-variations-meta branch September 13, 2022 07:38
@github-actions github-actions bot added this to the Gutenberg 14.1 milestone Sep 13, 2022
sunyatasattva added a commit to sunyatasattva/gutenberg that referenced this pull request Sep 13, 2022
Detail and explain how to make best use of the changes introduced in
the following PRs: WordPress#43590, WordPress#43632 and WordPress#44093
@bph bph mentioned this pull request Sep 14, 2022
89 tasks
sunyatasattva added a commit to woocommerce/woocommerce-blocks that referenced this pull request Sep 23, 2022
* Refactor Product Query to use the latest Gutenberg APIs

As we worked with Gutenberg folks in WordPress/gutenberg#43590,
WordPress/gutenberg#43632 and WordPress/gutenberg#44093 we have
created a standard API that could be used for our use-case. This
PR refactors our WIP experimental work to use that standardized API.
ntsekouras added a commit that referenced this pull request Sep 29, 2022
* Add docs for extending the Query Loop block via variations

Detail and explain how to make best use of the changes introduced in
the following PRs: #43590, #43632 and #44093

* Fix typo

Change enhables to enables

Co-authored-by: Sören Wrede <soerenwrede@gmail.com>

* Address code review feedback

Specifically:

* Added the complete code at the beginning
* Change `isActive` from array to function
* Reworded a few things
* Added information about custom logic and other hints

* Update docs/how-to-guides/block-tutorial/extending-the-query-loop-block.md

* Change wording of opening paragraph for the example

* Add section about innerBlocks and `scope` shortcomings

* rename to `allowedControls`

Co-authored-by: Sören Wrede <soerenwrede@gmail.com>
Co-authored-by: Ryan Welcher <me@ryanwelcher.com>
Co-authored-by: Nik Tsekouras <ntsekouras@outlook.com>
tarhi-saad pushed a commit to tarhi-saad/woocommerce-gutenberg-products-block that referenced this pull request Oct 31, 2022
* Refactor Product Query to use the latest Gutenberg APIs

As we worked with Gutenberg folks in WordPress/gutenberg#43590,
WordPress/gutenberg#43632 and WordPress/gutenberg#44093 we have
created a standard API that could be used for our use-case. This
PR refactors our WIP experimental work to use that standardized API.
senadir pushed a commit to senadir/woocommerce-blocks that referenced this pull request Nov 12, 2022
…7169)

* Refactor Product Query to use the latest Gutenberg APIs

As we worked with Gutenberg folks in WordPress/gutenberg#43590,
WordPress/gutenberg#43632 and WordPress/gutenberg#44093 we have
created a standard API that could be used for our use-case. This
PR refactors our WIP experimental work to use that standardized API.
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] Extensibility The ability to extend blocks or the editing experience Needs Dev Note Requires a developer note for a major WordPress release cycle [Package] Block library /packages/block-library [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants