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

Edit Post: Automatically connect a menu item with the pinnable sidebar plugin #29081

Merged
merged 8 commits into from Feb 23, 2021

Conversation

gziolo
Copy link
Member

@gziolo gziolo commented Feb 17, 2021

Description

Fixes #14457.
Fixes partially #28546.

If a user accidentally or deliberately unpins a plugin sidebar (PluginSidebar component) that doesn't also add a "More menu item" (PluginSidebarMoreMenuItem component), that sidebar appears to be lost for that user. In addition, there doesn't appear to be a way to disable the ability to unpin a sidebar.

To Reproduce

  1. Create a plugin with a PluginSidebar component
  2. Display that plugin sidebar and then unpin it
  3. You can no longer get back to that sidebar

When the plugin renders a pinnable PluginSidebar component, then by default it also automatically renders a corresponding PluginSidebarMenuItem. It's respecting matching PluginSidebarMenuItem components registered by plugins and therefore is fully backward compatible

Technical implementation

This PR adds Special handling for backward compatibility. It ensures that menu items created by plugin authors aren't duplicated with automatically injected menu items coming from pinnable plugin sidebars. In practice, we create two fills, one indirectly from PluginSidebar and another that the plugin's author defines with PluginSidebarMoreMenuItem. At the time of rendering the Plugins section in MoreMenu, code iterates over all fills and detects possible duplications. When it happens then the fill rendered by PluginSidebar gets removed. __unstableInitSource prop was added to make it possible to decide which duplicated fill should be ignored.

How has this been tested?

Case 1

Register a plugin with a sidebar only:

wp.plugins.registerPlugin( 'my-default-plugin', {
	render: function() {
		const el = wp.element.createElement;
 	
		function MyPluginSidebar() {
 			return el(
				wp.editPost.PluginSidebar,
				{
					name: 'my-sidebar',
					title: 'My default title',
					icon: 'smiley',
				},
				el(
					wp.components.PanelBody,
					{},
					'My default content'
				)
			);
		}

 		return el( MyPluginSidebar );
	}
} );

Case 2

The menu link for the sidebar should be added automatically in More Menu.

Register a plugin with a sidebar and a menu link:

wp.plugins.registerPlugin( 'my-custom-plugin', {
	render: function() {
		const el = wp.element.createElement;
 	
		function MyPluginSidebar() {
 			return el(
				wp.editPost.PluginSidebar,
				{
					name: 'my-custom-sidebar',
					title: 'My sidebar title',
					icon: 'palmtree',
				},
				el(
					wp.components.PanelBody,
					{},
					'My custom content'
				)
			);
		}

		function MyPluginSidebarMoreMenuItem() {
 			return el(
				wp.editPost.PluginSidebarMoreMenuItem,
				{
					target: 'my-custom-sidebar',
					icon: 'menu'
				},
				'My custom title'
			);
		}

 		return el( wp.element.Fragment, {}, el( MyPluginSidebar ), el( MyPluginSidebarMoreMenuItem ) );
	}
} );

The menu link from the plugin should be rendered in More Menu, but the link from the sidebar should be removed.

Screenshots

Screen Shot 2021-02-18 at 08 29 42

Types of changes

New feature and a bug fix at once? It's hard to tell really 😄

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • 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.

@github-actions
Copy link

github-actions bot commented Feb 17, 2021

Size Change: +449 B (0%)

Total Size: 1.38 MB

Filename Size Change
build/edit-post/index.js 307 kB +154 B (0%)
build/edit-site/index.js 25.8 kB +143 B (+1%)
build/edit-widgets/index.js 20.2 kB +152 B (+1%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.78 kB 0 B
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/index.js 124 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/button/style-rtl.css 465 B 0 B
build/block-library/blocks/button/style.css 464 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/query/editor-rtl.css 159 B 0 B
build/block-library/blocks/query/editor.css 160 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.37 kB 0 B
build/block-library/blocks/social-links/style.css 1.37 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.01 kB 0 B
build/block-library/common.css 1.01 kB 0 B
build/block-library/editor-rtl.css 9.05 kB 0 B
build/block-library/editor.css 9.04 kB 0 B
build/block-library/index.js 145 kB 0 B
build/block-library/style-rtl.css 8.8 kB 0 B
build/block-library/style.css 8.8 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/blocks/index.js 48.3 kB 0 B
build/components/index.js 272 kB 0 B
build/components/style-rtl.css 15.5 kB 0 B
build/components/style.css 15.5 kB 0 B
build/compose/index.js 11.1 kB 0 B
build/core-data/index.js 16.8 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/index.js 11 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.36 kB 0 B
build/edit-site/style.css 4.36 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/index.js 41.9 kB 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/index.js 6.77 kB 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.53 kB 0 B
build/keycodes/index.js 1.95 kB 0 B
build/list-reusable-blocks/index.js 3.15 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/index.js 3.41 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.76 kB 0 B
build/reusable-blocks/style-rtl.css 208 B 0 B
build/reusable-blocks/style.css 208 B 0 B
build/rich-text/index.js 13.4 kB 0 B
build/server-side-render/index.js 2.77 kB 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

@gziolo gziolo self-assigned this Feb 17, 2021
@gziolo gziolo added [Feature] Extensibility The ability to extend blocks or the editing experience [Package] Edit Post /packages/edit-post [Type] Bug An existing feature does not function as intended labels Feb 17, 2021
@gziolo
Copy link
Member Author

gziolo commented Feb 17, 2021

@jasmussen, it's nearly ready but I struggle with finding a good testing examples. I might also miss some use cases 😃

I will let you know again once I sort everything out.

@gziolo
Copy link
Member Author

gziolo commented Feb 17, 2021

It looks better with the latest changes applied:

Screen Shot 2021-02-17 at 20 38 09

So the original issues seem to be resolved, but there are other issues more visible now:

@gziolo gziolo marked this pull request as ready for review February 18, 2021 07:29
},
__( 'Sidebar title plugin' )
__( 'Plugin sidebar more menu title' )
Copy link
Member Author

Choose a reason for hiding this comment

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

I changed the name to ensure that we use the version explicitly registered by the plugin, rather than the one automatically injected.

@gziolo
Copy link
Member Author

gziolo commented Feb 18, 2021

Settings is now also added as a menu item - it shouldn't be there, we need a flag that disables this default behavior that isn't tied to pinning

I think I found a way to fix the issue by using __unstableInitSource prop introduced to exist only for backward compatibility. When the vale core is passed then the menu item is never rendered.

I think I have some ideas on how to fix the issue with the order of pinned items. It is less of an issue in the More Menu for the Plugins section and I believe it has the same root. My guess is that all pinned items get unmounted but the one that has currently opened sidebar. I will investigate separately as it isn't related to this PR at all. #28546 was created for a reason 😄

@youknowriad
Copy link
Contributor

This is very cool :)

Is __unstableInitSource necessary do you think?

@youknowriad
Copy link
Contributor

Oh actually, that prop is useful, I misunderstood its purpose originally :)

@gziolo
Copy link
Member Author

gziolo commented Feb 18, 2021

Is __unstableInitSource necessary do you think?

There needs to be a way to detect which fill should be preferred in More Menu when it gets duplicated. I didn't come up with anything nicer but if you can think of something more elegant I will willingly update the code :) I explained the reasons for the current implementation in the description this way:

This PR adds Special handling for backward compatibility. It ensures that menu items created by plugin authors aren't duplicated with automatically injected menu items coming from pinnable plugin sidebars. In practice, we create two fills, one indirectly from PluginSidebar and another that the plugin's author defines with PluginSidebarMoreMenuItem. At the time of rendering the Plugins section in MoreMenu, code iterates over all fills and detects possible duplications. When it happens then the fill rendered by PluginSidebar gets removed. __unstableInitSource prop was added to make it possible to decide which duplicated fill should be ignored.

@gziolo
Copy link
Member Author

gziolo commented Feb 18, 2021

Settings is now also added as a menu item - it shouldn't be there, we need a flag that disables this default behavior that isn't tied to pinning

I think I found a way to fix the issue by using __unstableInitSource prop introduced to exist only for backward compatibility. When the vale core is passed then the menu item is never rendered.

I think I have some ideas on how to fix the issue with the order of pinned items. It is less of an issue in the More Menu for the Plugins section and I believe it has the same root. My guess is that all pinned items get unmounted but the one that has currently opened sidebar. I will investigate separately as it isn't related to this PR at all. #28546 was created for a reason 😄

I found what the issue is. It's a subtle difference in the implementation that regressed here:
https://github.com/WordPress/gutenberg/pull/20698/files#r578252851

It's so simple that I will include it here.

</PinnedItems>
) }
{ name && isPinnable && (
Copy link
Member Author

Choose a reason for hiding this comment

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

I found a prop that is mandatory and unique for the PluginSidebar implementation. Would it work?

Copy link
Contributor

Choose a reason for hiding this comment

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

is the name the prop?

Copy link
Member Author

Choose a reason for hiding this comment

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

Yes, it's part of the PluginSidebar API. In other places identifier is used for some reasons.

<ComplementaryAreaMoreMenuItem
// Menu item is marked with unstable prop for backward compatibility.
// @see https://github.com/WordPress/gutenberg/issues/14457
__unstableExplicitMenuItem
Copy link
Member Author

Choose a reason for hiding this comment

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

I think it works well. Good idea @youknowriad 👏🏻

@gziolo
Copy link
Member Author

gziolo commented Feb 18, 2021

@youknowriad I think I was able to address your feedback:

The last remaining thing I discovered now are two warnings that need to be fixed:

Warning: React does not recognize the __unstableExplicitMenuItem prop on a DOM element.
Warning: React does not recognize the __unstableTarget prop on a DOM element.

Copy link
Contributor

@youknowriad youknowriad left a comment

Choose a reason for hiding this comment

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

This is looking good

@jasmussen
Copy link
Contributor

Thank you so much for doing this!

sidebar

This is exactly how I was hoping it'd work.

Note: the bigger button that's toggled, I will look at that separately.

Another question: will #28546 be easier to address once this lands or is that entirely separate?

@gziolo
Copy link
Member Author

gziolo commented Feb 19, 2021

Another question: will #28546 be easier to address once this lands or is that entirely separate?

This PR improves the order of pinned items - they don't change after unpinning/pinning anymore. I will look separately how to ensure that core features are always first on the list.

@gziolo gziolo merged commit 9534ac6 into master Feb 23, 2021
@gziolo gziolo deleted the fix/plugin-sidebar-pinning branch February 23, 2021 09:18
@gziolo
Copy link
Member Author

gziolo commented Feb 23, 2021

I will work on further improvements in the follow-up PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Extensibility The ability to extend blocks or the editing experience [Package] Edit Post /packages/edit-post [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

After unpinning a PluginSidebar, there's no way to get it back
3 participants