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

DataViews: Bootstrap Actions Extensibility API #62052

Merged
merged 2 commits into from
Jun 11, 2024

Conversation

youknowriad
Copy link
Contributor

@youknowriad youknowriad commented May 28, 2024

What?

This PR bootstraps an API to allow third-party developers to register and unregister post type actions.
Right now post type actions appear in two places:

  • Site editor dataviews.
  • Sidebar of the post editor (or site editor)

Actions allow users to interact with the selected, active or bulk selected entity/post/record. The API will be initially only available in the Gutenberg plugin for some time (until we get testing, feedback, iterations...)

As mentioned on the issue, initially I'm adding this API to the editor package but I think a dedicated package is probably going to be needed quickly.

you can test the API by opening the editor (or dataviews) and calling the function like so:

wp.editor.registerEntityAction( 'postType', 'page', {
	id: 'myplugin/test-action',
	label: 'Test Action',
	isPrimary: true,
	icon: 'admin-site',
	supportsBulk: false,
	callback( posts ) {
		alert( 'Test Action: ' + ( posts[0]?.title?.rendered ?? posts[0]?.title ) );
	},
} );

The action will appear in the actions dropdown.

Note

  • Default actions have not been refactored to use the API, which means you can't unregister them yet.
  • We'll probably have to support "*" as a "kind" or "name" in order to register an action for multiple post types or entities.

@youknowriad youknowriad added [Feature] Extensibility The ability to extend blocks or the editing experience [Feature] DataViews Work surrounding upgrading and evolving views in the site editor and beyond labels May 28, 2024
@youknowriad youknowriad self-assigned this May 28, 2024
@youknowriad youknowriad added the [Type] New API New API to be used by plugin developers or package users. label May 28, 2024
@youknowriad youknowriad force-pushed the add/dataviews-actions-extensibility branch from 14db3d4 to 73fd8f1 Compare May 28, 2024 09:45
@youknowriad youknowriad marked this pull request as ready for review May 28, 2024 10:06
@youknowriad youknowriad requested a review from ntsekouras May 28, 2024 10:06
Copy link

github-actions bot commented May 28, 2024

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: youknowriad <youknowriad@git.wordpress.org>
Co-authored-by: ntsekouras <ntsekouras@git.wordpress.org>
Co-authored-by: mcsf <mcsf@git.wordpress.org>
Co-authored-by: fabiankaegy <fabiankaegy@git.wordpress.org>
Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

Copy link

github-actions bot commented May 28, 2024

Size Change: +307 B (+0.02%)

Total Size: 1.75 MB

Filename Size Change
build/editor/index.min.js 97.9 kB +307 B (+0.31%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 951 B
build/annotations/index.min.js 2.26 kB
build/api-fetch/index.min.js 2.31 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
build/block-directory/index.min.js 7.31 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.57 kB
build/block-editor/content.css 4.57 kB
build/block-editor/default-editor-styles-rtl.css 394 B
build/block-editor/default-editor-styles.css 394 B
build/block-editor/index.min.js 263 kB
build/block-editor/style-rtl.css 15.6 kB
build/block-editor/style.css 15.6 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 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 149 B
build/block-library/blocks/audio/editor.css 151 B
build/block-library/blocks/audio/style-rtl.css 125 B
build/block-library/blocks/audio/style.css 125 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 115 B
build/block-library/blocks/avatar/editor.css 115 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/button/editor-rtl.css 310 B
build/block-library/blocks/button/editor.css 310 B
build/block-library/blocks/button/style-rtl.css 538 B
build/block-library/blocks/button/style.css 538 B
build/block-library/blocks/buttons/editor-rtl.css 336 B
build/block-library/blocks/buttons/editor.css 336 B
build/block-library/blocks/buttons/style-rtl.css 328 B
build/block-library/blocks/buttons/style.css 328 B
build/block-library/blocks/calendar/style-rtl.css 240 B
build/block-library/blocks/calendar/style.css 240 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 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 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 122 B
build/block-library/blocks/code/theme.css 122 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 420 B
build/block-library/blocks/columns/style.css 420 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 124 B
build/block-library/blocks/comment-author-avatar/editor.css 124 B
build/block-library/blocks/comment-content/style-rtl.css 90 B
build/block-library/blocks/comment-content/style.css 90 B
build/block-library/blocks/comment-template/style-rtl.css 200 B
build/block-library/blocks/comment-template/style.css 199 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 221 B
build/block-library/blocks/comments-pagination/editor.css 211 B
build/block-library/blocks/comments-pagination/style-rtl.css 234 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 832 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 631 B
build/block-library/blocks/cover/editor-rtl.css 668 B
build/block-library/blocks/cover/editor.css 669 B
build/block-library/blocks/cover/style-rtl.css 1.62 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 86 B
build/block-library/blocks/details/style.css 86 B
build/block-library/blocks/embed/editor-rtl.css 314 B
build/block-library/blocks/embed/editor.css 314 B
build/block-library/blocks/embed/style-rtl.css 411 B
build/block-library/blocks/embed/style.css 411 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 326 B
build/block-library/blocks/file/editor.css 326 B
build/block-library/blocks/file/style-rtl.css 278 B
build/block-library/blocks/file/style.css 279 B
build/block-library/blocks/file/view.min.js 324 B
build/block-library/blocks/footnotes/style-rtl.css 198 B
build/block-library/blocks/footnotes/style.css 197 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 229 B
build/block-library/blocks/form-input/style-rtl.css 342 B
build/block-library/blocks/form-input/style.css 342 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 344 B
build/block-library/blocks/form-submission-notification/editor.css 341 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/form/view.min.js 470 B
build/block-library/blocks/freeform/editor-rtl.css 2.6 kB
build/block-library/blocks/freeform/editor.css 2.6 kB
build/block-library/blocks/gallery/editor-rtl.css 958 B
build/block-library/blocks/gallery/editor.css 962 B
build/block-library/blocks/gallery/style-rtl.css 1.71 kB
build/block-library/blocks/gallery/style.css 1.71 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 402 B
build/block-library/blocks/group/editor.css 402 B
build/block-library/blocks/group/style-rtl.css 103 B
build/block-library/blocks/group/style.css 103 B
build/block-library/blocks/group/theme-rtl.css 79 B
build/block-library/blocks/group/theme.css 79 B
build/block-library/blocks/heading/style-rtl.css 188 B
build/block-library/blocks/heading/style.css 188 B
build/block-library/blocks/html/editor-rtl.css 346 B
build/block-library/blocks/html/editor.css 347 B
build/block-library/blocks/image/editor-rtl.css 890 B
build/block-library/blocks/image/editor.css 889 B
build/block-library/blocks/image/style-rtl.css 1.52 kB
build/block-library/blocks/image/style.css 1.51 kB
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/image/view.min.js 1.54 kB
build/block-library/blocks/latest-comments/style-rtl.css 355 B
build/block-library/blocks/latest-comments/style.css 354 B
build/block-library/blocks/latest-posts/editor-rtl.css 204 B
build/block-library/blocks/latest-posts/editor.css 204 B
build/block-library/blocks/latest-posts/style-rtl.css 509 B
build/block-library/blocks/latest-posts/style.css 510 B
build/block-library/blocks/list/style-rtl.css 104 B
build/block-library/blocks/list/style.css 104 B
build/block-library/blocks/media-text/editor-rtl.css 304 B
build/block-library/blocks/media-text/editor.css 303 B
build/block-library/blocks/media-text/style-rtl.css 506 B
build/block-library/blocks/media-text/style.css 504 B
build/block-library/blocks/more/editor-rtl.css 427 B
build/block-library/blocks/more/editor.css 427 B
build/block-library/blocks/navigation-link/editor-rtl.css 663 B
build/block-library/blocks/navigation-link/editor.css 664 B
build/block-library/blocks/navigation-link/style-rtl.css 192 B
build/block-library/blocks/navigation-link/style.css 191 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 295 B
build/block-library/blocks/navigation-submenu/editor.css 294 B
build/block-library/blocks/navigation/editor-rtl.css 2.2 kB
build/block-library/blocks/navigation/editor.css 2.21 kB
build/block-library/blocks/navigation/style-rtl.css 2.25 kB
build/block-library/blocks/navigation/style.css 2.24 kB
build/block-library/blocks/navigation/view.min.js 1.03 kB
build/block-library/blocks/nextpage/editor-rtl.css 392 B
build/block-library/blocks/nextpage/editor.css 392 B
build/block-library/blocks/page-list/editor-rtl.css 378 B
build/block-library/blocks/page-list/editor.css 378 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 236 B
build/block-library/blocks/paragraph/editor.css 236 B
build/block-library/blocks/paragraph/style-rtl.css 341 B
build/block-library/blocks/paragraph/style.css 340 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 506 B
build/block-library/blocks/post-comments-form/style.css 506 B
build/block-library/blocks/post-content/editor-rtl.css 74 B
build/block-library/blocks/post-content/editor.css 74 B
build/block-library/blocks/post-date/style-rtl.css 62 B
build/block-library/blocks/post-date/style.css 62 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 729 B
build/block-library/blocks/post-featured-image/editor.css 726 B
build/block-library/blocks/post-featured-image/style-rtl.css 341 B
build/block-library/blocks/post-featured-image/style.css 341 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 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 399 B
build/block-library/blocks/post-template/style.css 398 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 70 B
build/block-library/blocks/post-time-to-read/style.css 70 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 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 134 B
build/block-library/blocks/pullquote/editor.css 134 B
build/block-library/blocks/pullquote/style-rtl.css 342 B
build/block-library/blocks/pullquote/style.css 342 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 121 B
build/block-library/blocks/query-pagination-numbers/editor.css 118 B
build/block-library/blocks/query-pagination/editor-rtl.css 220 B
build/block-library/blocks/query-pagination/editor.css 208 B
build/block-library/blocks/query-pagination/style-rtl.css 287 B
build/block-library/blocks/query-pagination/style.css 283 B
build/block-library/blocks/query-title/style-rtl.css 64 B
build/block-library/blocks/query-title/style.css 64 B
build/block-library/blocks/query/editor-rtl.css 502 B
build/block-library/blocks/query/editor.css 502 B
build/block-library/blocks/query/view.min.js 958 B
build/block-library/blocks/quote/style-rtl.css 238 B
build/block-library/blocks/quote/style.css 238 B
build/block-library/blocks/quote/theme-rtl.css 221 B
build/block-library/blocks/quote/theme.css 225 B
build/block-library/blocks/read-more/style-rtl.css 138 B
build/block-library/blocks/read-more/style.css 138 B
build/block-library/blocks/rss/editor-rtl.css 101 B
build/block-library/blocks/rss/editor.css 101 B
build/block-library/blocks/rss/style-rtl.css 288 B
build/block-library/blocks/rss/style.css 287 B
build/block-library/blocks/search/editor-rtl.css 183 B
build/block-library/blocks/search/editor.css 183 B
build/block-library/blocks/search/style-rtl.css 684 B
build/block-library/blocks/search/style.css 683 B
build/block-library/blocks/search/theme-rtl.css 113 B
build/block-library/blocks/search/theme.css 113 B
build/block-library/blocks/search/view.min.js 475 B
build/block-library/blocks/separator/editor-rtl.css 100 B
build/block-library/blocks/separator/editor.css 100 B
build/block-library/blocks/separator/style-rtl.css 248 B
build/block-library/blocks/separator/style.css 248 B
build/block-library/blocks/separator/theme-rtl.css 195 B
build/block-library/blocks/separator/theme.css 195 B
build/block-library/blocks/shortcode/editor-rtl.css 286 B
build/block-library/blocks/shortcode/editor.css 286 B
build/block-library/blocks/site-logo/editor-rtl.css 806 B
build/block-library/blocks/site-logo/editor.css 803 B
build/block-library/blocks/site-logo/style-rtl.css 218 B
build/block-library/blocks/site-logo/style.css 218 B
build/block-library/blocks/site-tagline/editor-rtl.css 87 B
build/block-library/blocks/site-tagline/editor.css 87 B
build/block-library/blocks/site-title/editor-rtl.css 123 B
build/block-library/blocks/site-title/editor.css 123 B
build/block-library/blocks/site-title/style-rtl.css 71 B
build/block-library/blocks/site-title/style.css 71 B
build/block-library/blocks/social-link/editor-rtl.css 338 B
build/block-library/blocks/social-link/editor.css 338 B
build/block-library/blocks/social-links/editor-rtl.css 676 B
build/block-library/blocks/social-links/editor.css 675 B
build/block-library/blocks/social-links/style-rtl.css 1.5 kB
build/block-library/blocks/social-links/style.css 1.5 kB
build/block-library/blocks/spacer/editor-rtl.css 346 B
build/block-library/blocks/spacer/editor.css 346 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 394 B
build/block-library/blocks/table/editor.css 394 B
build/block-library/blocks/table/style-rtl.css 640 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 145 B
build/block-library/blocks/table/theme.css 145 B
build/block-library/blocks/tag-cloud/style-rtl.css 266 B
build/block-library/blocks/tag-cloud/style.css 265 B
build/block-library/blocks/template-part/editor-rtl.css 393 B
build/block-library/blocks/template-part/editor.css 393 B
build/block-library/blocks/template-part/theme-rtl.css 113 B
build/block-library/blocks/template-part/theme.css 113 B
build/block-library/blocks/term-description/style-rtl.css 108 B
build/block-library/blocks/term-description/style.css 108 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 165 B
build/block-library/blocks/text-columns/style.css 165 B
build/block-library/blocks/verse/style-rtl.css 98 B
build/block-library/blocks/verse/style.css 98 B
build/block-library/blocks/video/editor-rtl.css 553 B
build/block-library/blocks/video/editor.css 554 B
build/block-library/blocks/video/style-rtl.css 186 B
build/block-library/blocks/video/style.css 186 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12 kB
build/block-library/editor.css 11.9 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 219 kB
build/block-library/reset-rtl.css 470 B
build/block-library/reset.css 470 B
build/block-library/style-rtl.css 14.6 kB
build/block-library/style.css 14.6 kB
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 52.2 kB
build/commands/index.min.js 15.2 kB
build/commands/style-rtl.css 955 B
build/commands/style.css 952 B
build/components/index.min.js 223 kB
build/components/style-rtl.css 12 kB
build/components/style.css 12 kB
build/compose/index.min.js 12.9 kB
build/core-commands/index.min.js 2.74 kB
build/core-data/index.min.js 72.5 kB
build/customize-widgets/index.min.js 10.9 kB
build/customize-widgets/style-rtl.css 1.35 kB
build/customize-widgets/style.css 1.35 kB
build/data-controls/index.min.js 641 B
build/data/index.min.js 8.99 kB
build/date/index.min.js 18 kB
build/deprecated/index.min.js 458 B
build/dom-ready/index.min.js 325 B
build/dom/index.min.js 4.65 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 580 B
build/edit-post/index.min.js 12.4 kB
build/edit-post/style-rtl.css 2.31 kB
build/edit-post/style.css 2.31 kB
build/edit-site/index.min.js 207 kB
build/edit-site/posts-rtl.css 955 B
build/edit-site/posts.css 955 B
build/edit-site/style-rtl.css 11.7 kB
build/edit-site/style.css 11.7 kB
build/edit-widgets/index.min.js 17.6 kB
build/edit-widgets/style-rtl.css 4.19 kB
build/edit-widgets/style.css 4.19 kB
build/editor/style-rtl.css 9.22 kB
build/editor/style.css 9.22 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.1 kB
build/format-library/style-rtl.css 494 B
build/format-library/style.css 493 B
build/hooks/index.min.js 1.54 kB
build/html-entities/index.min.js 445 B
build/i18n/index.min.js 3.58 kB
build/interactivity/debug.min.js 16.5 kB
build/interactivity/file.min.js 447 B
build/interactivity/image.min.js 1.68 kB
build/interactivity/index.min.js 13.4 kB
build/interactivity/navigation.min.js 1.16 kB
build/interactivity/query.min.js 742 B
build/interactivity/router.min.js 2.8 kB
build/interactivity/search.min.js 615 B
build/is-shallow-equal/index.min.js 526 B
build/keyboard-shortcuts/index.min.js 1.31 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.17 kB
build/list-reusable-blocks/style-rtl.css 846 B
build/list-reusable-blocks/style.css 846 B
build/media-utils/index.min.js 2.92 kB
build/modules/importmap-polyfill.min.js 12.3 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.58 kB
build/nux/style-rtl.css 749 B
build/nux/style.css 745 B
build/patterns/index.min.js 6.47 kB
build/patterns/style-rtl.css 594 B
build/patterns/style.css 593 B
build/plugins/index.min.js 1.81 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/index.min.js 2.89 kB
build/preferences/style-rtl.css 715 B
build/preferences/style.css 715 B
build/primitives/index.min.js 829 B
build/priority-queue/index.min.js 1.54 kB
build/private-apis/index.min.js 994 B
build/react-i18n/index.min.js 630 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.76 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.72 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.1 kB
build/router/index.min.js 1.95 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 2.01 kB
build/token-list/index.min.js 579 B
build/url/index.min.js 3.85 kB
build/vendors/react-dom.min.js 42.8 kB
build/vendors/react-jsx-runtime.min.js 560 B
build/vendors/react.min.js 2.65 kB
build/viewport/index.min.js 965 B
build/warning/index.min.js 250 B
build/widgets/index.min.js 7.19 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

@fabiankaegy
Copy link
Member

@youknowriad is there any way to be aware of the context where the post action is rendered/added?

I wonder whether it makes sense to be able to control whether an action should show up in the data view vs in the post actions of a single post? 🤔

@youknowriad
Copy link
Contributor Author

@youknowriad is there any way to be aware of the context where the post action is rendered/added?

There are some indirect ways, we may want to introduce something like "scope" config later but for now, I believe we should encourage folks to write agnostic actions. Could be one follow-up to consider.

@mcsf
Copy link
Contributor

mcsf commented May 28, 2024

Thanks for getting this started. Seems like a reasonable approach; let's see where it leads us.

@Mamaduka
Copy link
Member

I love the idea, and this style of API should be more future-proof than using a filter or a SlotFill.

@@ -402,4 +403,5 @@ export default combineReducers( {
listViewPanel,
listViewToggleRef,
publishSidebarActive,
dataviews: dataviewsReducer,
Copy link
Contributor

Choose a reason for hiding this comment

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

This is named like that because the plan is to have a separate package eventually? Because the actions are used beyond the Data Views, so I don't really get why name it like that.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

yes, I can rename, what would you suggest? I guess you can think of it as the package name.

@ntsekouras
Copy link
Contributor

Thanks Riad! Have you considered registering an action by providing the id and the action object with extra prop of postTypes. Then this postTypes info could be baked in checks like isEligible to show/hide actions and we could avoid the wildcard * pattern, that I feel it usually creates more problems than it solves.

What is the expectation and gains of having the kind as param?

@youknowriad
Copy link
Contributor Author

Thanks Riad! Have you considered registering an action by providing the id and the action object with extra prop of postTypes. Then this postTypes info could be baked in checks like isEligible to show/hide actions and we could avoid the wildcard * pattern, that I feel it usually creates more problems than it solves.

This is a good alternative suggestion.

What is the expectation and gains of having the kind as param?

I aligned the API with the entities abstraction in core-data, so you can have actions and fields for things like site, taxonomies,... that are not post types.


Based on this, I feel like the entities abstraction mapping make more sense because I see WP providing these dataviews with the same filters as well. WDYT?

@youknowriad youknowriad mentioned this pull request May 29, 2024
20 tasks
@ntsekouras
Copy link
Contributor

ntsekouras commented May 29, 2024

I aligned the API with the entities abstraction in core-data, so you can have actions and fields for things like site, taxonomies,... that are not post types.

For start I think the structure we'll use in store, doesn't matter much right now and could be updated anytime. For the consumers facing part though (register API). Do we really need to expose these things though?

Maybe we have to answer how related is the core-data abstraction with the actions API. In actions the callbacks are specified inside the action's props and they could do anything (ex view revisions). I think the core-data abstraction is used to help with the entity handling mostly.

Also, can we have actions that apply for more than one entity? For example could the rename action be almost identical (at least in UI) for post types and taxonomies. Probably it could, but maybe it should be kept separate. How could this affect the API?

My first thoughts would be that we could keep an internal single registration API if we want, but expose specific ones like registerPostTypeAction, registerTaxonomyAction, etc.., with respective fields ( postTypes, terms, etc..)

I'm rambling a bit, but just thinking out loud to get more thoughts on this.

Based on this, I feel like the entities abstraction mapping make more sense because I see WP providing these dataviews with the same filters as well.

Can you expand a bit on this?

name: string,
config: Action< Item >
) {
return {
Copy link
Contributor

Choose a reason for hiding this comment

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

I know this is the bootstrap PR, but we should add validation, even if it's in a follow up.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

That's one of the reasons I added the types, for us at least, everything is typed, so there's less need for validation but indeed, validation for third-parties would be great. I wonder if there's a runtime lib that can use typescript types to generate validation automatically.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I added a todo list for this to the issue.

@youknowriad
Copy link
Contributor Author

I think the main action is:

  • how to register an action for a taxonomy?
  • how to register an action for a site?
  • how to register an action for a post type?
  • how to register an action for all post types?

Personally, it seems clear to me that we shouldn't try to reuse actions between taxonomies and post types for instance, in that sense a global action with "taxonomies" or "post types" configs, doesn't really make sense to me. This is the main reason that I think the proposed API is a bit better.

Now there's a case that we have where we want the same action for multiple post types. So I was thinking about

registerAction( 'postTypes', '*', config )
registerAction( 'postTypes', [ 'post', 'page' ], config )

to address this.

@ntsekouras
Copy link
Contributor

I still think the proposed API is a bit more verbose but we can always add some wrapper functions(syntactic sugar) like registerPostTypeAction, etc.. Not that important for now.

We can start with this, but I think these should be addressed here:

  1. Support the array of names
  2. Support the all or *.

I'll say again that the wildcard API is something I don't like and I think we'll end up needing extra props eventually to satisfy cases like: include all, except one.. I guess that's fine though, or in such cases the except part could be in isEligible?

With actions being extensible, we would also need to add an order prop to actions and not depend on order of registration - not for here..

@youknowriad
Copy link
Contributor Author

With actions being extensible, we would also need to add an order prop to actions and not depend on order of registration - not for here..

We have always refrained from having order in our APIs to avoid plugins competing for positions. So I think for this one, we should be consistent and continue until that decision is reversed.

@ntsekouras
Copy link
Contributor

We have always refrained from having order in our APIs to avoid plugins competing for positions.

Yeah, I know it's a tough one, but usually we would overcome this by having a slot and render the third party components there. We'll see in the future, but I guess for example that the delete action should be last and we would have similar cases with other core actions.

@mcsf
Copy link
Contributor

mcsf commented May 30, 2024

I went through @youknowriad's and @ntsekouras's discussion and have some loose thoughts:

  • Agreed that the store structure isn't particularly important, whereas the API is. The store is plastic, and it won't be dealing with much data anyway.

  • On the relationship between entities, actions and core-data:

    • Is the idea to turn this experiment into a module tied to editor? If so, what are the pros and cons of keeping it close to editor? Unless that choice of package was purely arbitrary for the sake of the experiment.
    • I can maybe get behind the registerEntityAction signature mimicking the original entity structure, but in that case this brings the Actions domain much closer to entities — possibly to the point of letting them be absorbed into the core-data module, or making actions a tiny "satellite" module of core-data.
    • That said, the whole entity concept is a difficult chunk of the codebase for developers to learn. Is it worth exposing them to it just to register actions tied to (initially) posts?
    • Kind-specific functions like registerPostAction make a bit more sense:
      • They are still technically a reflection of entities, but for developers it should feel much more intuitive ((postType, action) => {}).
      • In the highly dynamic world of WP-style JS, dedicated functions for each kind act as guard rails: the kind-specific function either exists or not. We could of course just have the generic registerEntityAction with kind: 'postType' | 'site' | ..., but in that case we would need runtime validation too — you know this, it's just a reminder.

Also, can we have actions that apply for more than one entity? For example could the rename action be almost identical (at least in UI) for post types and taxonomies. Probably it could, but maybe it should be kept separate. How could this affect the API?

Thinking about post types in the traditional PHP sense: CPTs don't manually re-register/re-implement every bit of functionality that they want from the base 'post' type. Instead, they have supports at their disposal, allowing easy opting in and out of sets of features. Is this concept helpful to us here? For instance, could there be a base set of actions automatically applied to CPTs — e.g. view, edit, rename (if viewable, if editable, etc.) so that devs don't need to explicitly register them? Or, if not, if everything is opt-in, there should be a way for third parties to reuse core actions (registerPostAction( 'my_cpt', CORE_POST_ACTIONS.view )).

Finally, I don't hold this opinion strongly, but '*' might be one of those "clever" things that we come up with that are actually too blunt as tools that don't really help anyone. In PHP land we commonly use basic loops to achieve similar results, thereby avoiding the pitfalls of wildcards, such as accidental contamination of forgotten post types. In other words, this is enough: for (const type of TYPES) registerPostAction(type, myAction).

@youknowriad
Copy link
Contributor Author

Is the idea to turn this experiment into a module tied to editor? If so, what are the pros and cons of keeping it close to editor? Unless that choice of package was purely arbitrary for the sake of the experiment.

I think inherently the actions (and fields) are closer to entities than "editor". Some entities can be edited in forms outside the block editor for instance, and still have actions and fields. So for me, the usage of "editor" is just a temporary hack. I think this API makes more sense in "core-data" or its own dedicated package.

That said, the whole entity concept is a difficult chunk of the codebase for developers to learn. Is it worth exposing them to it just to register actions tied to (initially) posts?

I agree but I think we shouldn't try to create a new concept now. How would you tie registering "site actions" into this API without inventing a new concept (or picking entities)

@mcsf
Copy link
Contributor

mcsf commented Jun 5, 2024

How would you tie registering "site actions" into this API without inventing a new concept (or picking entities)

We'd either assume the compromise and expose the entities model to users, or mediate via entity-specific functions. Don't see a better way.

@youknowriad youknowriad force-pushed the add/dataviews-actions-extensibility branch from f1a45b3 to 39d7603 Compare June 11, 2024 08:09
Copy link

Flaky tests detected in 39d7603.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/9461933800
📝 Reported issues:

Copy link
Contributor

@mcsf mcsf left a comment

Choose a reason for hiding this comment

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

I don't want to block this with the illusion of indecision. Mapping the API to the entities domain seems fine, and we can always make adjustments.

@youknowriad
Copy link
Contributor Author

@annezazu @fabiankaegy Going to merge this. It would be cool to try to get some outreach around this at some point.

I wonder whether we should first make the core actions removable.

@youknowriad youknowriad merged commit 97ccc28 into trunk Jun 11, 2024
63 checks passed
@youknowriad youknowriad deleted the add/dataviews-actions-extensibility branch June 11, 2024 13:36
@github-actions github-actions bot added this to the Gutenberg 18.6 milestone Jun 11, 2024
@annezazu
Copy link
Contributor

Working on the outreach piece. Make Core post in the work and will ensure this is shared for this week's dev chat meeting. Awesome job getting this done!

patil-vipul pushed a commit to patil-vipul/gutenberg that referenced this pull request Jun 17, 2024
Co-authored-by: youknowriad <youknowriad@git.wordpress.org>
Co-authored-by: ntsekouras <ntsekouras@git.wordpress.org>
Co-authored-by: mcsf <mcsf@git.wordpress.org>
Co-authored-by: fabiankaegy <fabiankaegy@git.wordpress.org>
Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
@fabiankaegy fabiankaegy added the Needs Dev Note Requires a developer note for a major WordPress release cycle label Oct 1, 2024
@fabiankaegy fabiankaegy mentioned this pull request Oct 1, 2024
97 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] DataViews Work surrounding upgrading and evolving views in the site editor and beyond [Feature] Extensibility The ability to extend blocks or the editing experience Needs Dev Note Requires a developer note for a major WordPress release cycle [Type] New API New API to be used by plugin developers or package users.
Projects
Status: Todo
Development

Successfully merging this pull request may close these issues.

6 participants