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

Add mechanism to render complementary areas on edit site #21430

Conversation

jorgefilipecosta
Copy link
Member

Description

This PR adds a more menu for plugins in the edit site and implements functionality for this in the interface package.

The PR introduces an "ActionItem" slot fill mechanism for cases where we have a container normally controlled by the slot and we want to add items to the container using fills if no fill is added the container is not rendered.
This mechanism allows the slot to specify the components used to render the container and each item (Default to Button, ButtonGroup but can be changed to MenuItem, MenuGroup, div, snap or even custom components).
The PinnediItems area was refactored to use the ActionItem mechanism the more menu also uses it.

We also implement ComplementaryAction.Toggle that renders a component to toggle a complementary area. All current ways to toggle a complementary area (pinned items, more menu, and the close button) were refactored to use this component.

And to have something similar to PluginSidebarMoreMenuItem we implement ComplementaryAction.MoreMenuItem that allows plugins to have a simple way to add an action to the more menu that toggles their complementary areas.

Existing edit-post code was refactored to use the new functionality from the interface package.

@jorgefilipecosta jorgefilipecosta added the [Type] Enhancement A suggestion for improvement. label Apr 6, 2020
@github-actions
Copy link

github-actions bot commented Apr 6, 2020

Size Change: +1.35 kB (0%)

Total Size: 1.12 MB

Filename Size Change
build/autop/index.js 2.83 kB +1 B
build/block-directory/index.js 6.75 kB +1 B
build/block-editor/index.js 106 kB +2 B (0%)
build/block-library/index.js 127 kB +1 B
build/components/index.js 193 kB +26 B (0%)
build/compose/index.js 9.31 kB +1 B
build/core-data/index.js 11.4 kB -2 B (0%)
build/data/index.js 8.45 kB -2 B (0%)
build/edit-navigation/index.js 8.25 kB +1 B
build/edit-post/index.js 303 kB +284 B (0%)
build/edit-site/index.js 15.5 kB +533 B (3%)
build/edit-widgets/index.js 9.33 kB +506 B (5%) 🔍
build/element/index.js 4.64 kB -1 B
build/format-library/index.js 7.72 kB +1 B
build/list-reusable-blocks/index.js 3.12 kB -1 B
build/nux/index.js 3.41 kB +1 B
build/plugins/index.js 2.56 kB -1 B
build/rich-text/index.js 14.8 kB -2 B (0%)
build/server-side-render/index.js 2.68 kB -2 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.62 kB 0 B
build/api-fetch/index.js 3.4 kB 0 B
build/blob/index.js 620 B 0 B
build/block-directory/style-rtl.css 892 B 0 B
build/block-directory/style.css 892 B 0 B
build/block-editor/style-rtl.css 11.4 kB 0 B
build/block-editor/style.css 11.4 kB 0 B
build/block-library/editor-rtl.css 7.87 kB 0 B
build/block-library/editor.css 7.87 kB 0 B
build/block-library/style-rtl.css 7.72 kB 0 B
build/block-library/style.css 7.72 kB 0 B
build/block-library/theme-rtl.css 684 B 0 B
build/block-library/theme.css 686 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.1 kB 0 B
build/blocks/index.js 48.2 kB 0 B
build/components/style-rtl.css 19.5 kB 0 B
build/components/style.css 19.5 kB 0 B
build/data-controls/index.js 1.29 kB 0 B
build/date/index.js 5.47 kB 0 B
build/deprecated/index.js 771 B 0 B
build/dom-ready/index.js 568 B 0 B
build/dom/index.js 3.17 kB 0 B
build/edit-navigation/style-rtl.css 918 B 0 B
build/edit-navigation/style.css 919 B 0 B
build/edit-post/style-rtl.css 5.43 kB 0 B
build/edit-post/style.css 5.43 kB 0 B
build/edit-site/style-rtl.css 2.96 kB 0 B
build/edit-site/style.css 2.96 kB 0 B
build/edit-widgets/style-rtl.css 2.4 kB 0 B
build/edit-widgets/style.css 2.4 kB 0 B
build/editor/editor-styles-rtl.css 425 B 0 B
build/editor/editor-styles.css 428 B 0 B
build/editor/index.js 44.7 kB 0 B
build/editor/style-rtl.css 4.26 kB 0 B
build/editor/style.css 4.27 kB 0 B
build/escape-html/index.js 733 B 0 B
build/format-library/style-rtl.css 502 B 0 B
build/format-library/style.css 502 B 0 B
build/hooks/index.js 2.13 kB 0 B
build/html-entities/index.js 621 B 0 B
build/i18n/index.js 3.56 kB 0 B
build/is-shallow-equal/index.js 711 B 0 B
build/keyboard-shortcuts/index.js 2.52 kB 0 B
build/keycodes/index.js 1.94 kB 0 B
build/list-reusable-blocks/style-rtl.css 226 B 0 B
build/list-reusable-blocks/style.css 226 B 0 B
build/media-utils/index.js 5.3 kB 0 B
build/notices/index.js 1.79 kB 0 B
build/nux/style-rtl.css 616 B 0 B
build/nux/style.css 613 B 0 B
build/primitives/index.js 1.5 kB 0 B
build/priority-queue/index.js 789 B 0 B
build/redux-routine/index.js 2.85 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.28 kB 0 B
build/url/index.js 4.06 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.17 kB 0 B

compressed-size-action

@jorgefilipecosta jorgefilipecosta added the [Status] In Progress Tracking issues with work in progress label Apr 6, 2020
@jorgefilipecosta jorgefilipecosta force-pushed the add/way-to-render-unpinned-complemetary-areas-on-edit-site branch 2 times, most recently from 54587e1 to e979501 Compare April 7, 2020 11:43
@jorgefilipecosta jorgefilipecosta removed the [Status] In Progress Tracking issues with work in progress label Apr 7, 2020
@gziolo gziolo self-requested a review April 10, 2020 05:16
Copy link
Member

@gziolo gziolo left a comment

Choose a reason for hiding this comment

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

Nice work on further abstractions 👍

I left some initial comments.


### as

An array of two components the first is the component used on the container of the fills and the second is the component used to render each fill.
Copy link
Member

Choose a reason for hiding this comment

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

Noting that in all other places, you pass only one component/tag name with as prop.

I have some reservations about this approach, while I fully support the idea of having a way to change the container element with as. It feels very limiting that the slot decides how to render fills. Plugin authors should have more freedom about how the fills are wrapped. It's also for convenience when they want to build a wrapper component for a single ActionItem to avoid code duplications like

const MyActionItem = ( props ) => <ActionItem as={ MenuItem } foo="bar" { ... } />;

It's still the same fill, but you would have to explicitly pass it to the slot.

Copy link
Member Author

Choose a reason for hiding this comment

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

It feels very limiting that the slot decides how to render fills

The slot is the component that is aware of the ideal fills to render, e.g: if the slot wraps things with ButtonGroup the ideal fill is Button, if the slot wraps things with MenuGroup the ideal fill is MenuItem, if the slot wraps things with ToolbarGroup the ideal fill is ToolbarButton.

But I understand your point it removes freedom from the fill. I updated the code to keep flexibility on the fill. Right now we allow the slot to set a default component to use in the fills but we also allow an as prop on the fill, in case a different component is desired.

return (
<Fill name={ name }>
{ ( fillProps ) => {
const { onClick: fpOnClick, as: Item } = fillProps;
Copy link
Member

Choose a reason for hiding this comment

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

What's fp in fpOnClick?

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 could not call it onClick again because we already have a onClick on the parent function, so I called it fpOnClick, "fp" comes from fillProps.

- Type: `String`
- Required: Yes

### complementaryAreaIdentifier
Copy link
Member

Choose a reason for hiding this comment

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

I see this prop name repeated in a few places, can it be shortened to identifier?

Is there any way to remove this prop in favor of the existing name?

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 updated to use identifier. The name prop is still supported but name props just includes the "sidebar name" without including the plugin name identifier is the full identifier of a complementary area.


ComplementaryAreaWrapped.Slot = ComplementaryAreaSlot;
ComplementaryAreaWrapped.Toggle = ComplementaryAreaToggle;
Copy link
Member

Choose a reason for hiding this comment

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

I saw comments from @youknowriad in other places where he discouraged using this notation with components. I agree with that and I wanted to list some of the reasons why it isn't idea:

  • it prevents dead-code elimination
  • it makes it harder to apply higher-order components on the original component (ComplementaryAreaWrapped c)
  • it groups a few independent components in one file

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 removed the usage of this notation.

)
}
</Slot>
<ActionItem.Slot
Copy link
Member

Choose a reason for hiding this comment

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

Doesn't it make code harder to follow? The existing implementation is very simple so maybe we can leave it as is.

If we were to leave it as is, shouldn't we propagate scope to the slot?

Copy link
Member Author

Choose a reason for hiding this comment

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

Doesn't it make code harder to follow? The existing implementation is very simple so maybe we can leave it as is.

I reverted to the previous implementation 👍

@gziolo gziolo requested a review from youknowriad April 10, 2020 10:15
@gziolo gziolo added [Package] Interface /packages/interface [Feature] Extensibility The ability to extend blocks or the editing experience labels Apr 10, 2020
@jorgefilipecosta jorgefilipecosta force-pushed the add/way-to-render-unpinned-complemetary-areas-on-edit-site branch from e979501 to 24f0dd5 Compare April 15, 2020 19:14
@jorgefilipecosta
Copy link
Member Author

Hi @gziolo thank you for the review! I applied some changes to address the feedback you provided.

@noahtallen noahtallen mentioned this pull request May 27, 2020
17 tasks
@jorgefilipecosta jorgefilipecosta force-pushed the add/way-to-render-unpinned-complemetary-areas-on-edit-site branch from 24f0dd5 to 12b0fab Compare June 3, 2020 19:20
@jorgefilipecosta
Copy link
Member Author

This PR was rebased is ready for a review.

@jorgefilipecosta jorgefilipecosta force-pushed the add/way-to-render-unpinned-complemetary-areas-on-edit-site branch from 12b0fab to de16e52 Compare June 5, 2020 18:41
Squashed commits:
[ff91accb86] Add mechanism to render complementary areas on edit site
@jorgefilipecosta jorgefilipecosta force-pushed the add/way-to-render-unpinned-complemetary-areas-on-edit-site branch from de16e52 to 57e5bad Compare June 5, 2020 18:52
@jorgefilipecosta jorgefilipecosta merged commit a925928 into master Jun 5, 2020
@jorgefilipecosta jorgefilipecosta deleted the add/way-to-render-unpinned-complemetary-areas-on-edit-site branch June 5, 2020 21:15
@github-actions github-actions bot added this to the Gutenberg 8.3 milestone Jun 5, 2020
return (
<ComponentToUse
icon={ selectedIcon && isSelected ? selectedIcon : icon }
isSelected={ isSelected }
Copy link
Member

Choose a reason for hiding this comment

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

It looks like this is causing an error in master:

Warning: React does not recognize the `isSelected` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `isselected` instead. If you accidentally passed it from a parent component, remove it from the DOM element.
    in button (created by ForwardRef(Button))
    in Tooltip (created by ForwardRef(Button))
    in ForwardRef(Button) (created by ComplementaryAreaToggle)
    in ComplementaryAreaToggle (created by Context.Consumer)
    in WithPluginContext(ComplementaryAreaToggle) (created by ComplementaryArea)
    in div (created by SlotComponent)
    in SlotComponent (created by Context.Consumer)
    in Slot (created by Slot)
    in Slot (created by PinnedItemsSlot)
    in PinnedItemsSlot (created by Header)
    in div (created by Header)
    in div (created by Header)
    in Header (created by Layout)
    in div (created by InterfaceSkeleton)
    in div (created by InterfaceSkeleton)
    in InterfaceSkeleton (created by NavigateRegions(InterfaceSkeleton))
    in div (created by NavigateRegions(InterfaceSkeleton))
    in NavigateRegions(InterfaceSkeleton) (created by Layout)
    in div (created by FocusReturnProvider)
    in FocusReturnProvider (created by Layout)
    in Layout (created by Editor)
    in ErrorBoundary (created by Editor)
    in BlockEditorProvider
    in Unknown (created by Context.Consumer)
    in WithRegistryProvider(BlockEditorProvider) (created by EditorProvider)
    in BlockContextProvider (created by EditorProvider)
    in EntityProvider (created by EditorProvider)
    in EntityProvider (created by EditorProvider)
    in EditorProvider (created by WithDispatch(EditorProvider))
    in WithDispatch(EditorProvider)
    in Unknown (created by WithSelect(WithDispatch(EditorProvider)))
    in WithSelect(WithDispatch(EditorProvider))
    in Unknown (created by Context.Consumer)
    in WithRegistryProvider(WithSelect(WithDispatch(EditorProvider))) (created by Editor)
    in div (created by DropZoneProvider)
    in DropZoneProvider (created by Editor)
    in SlotFillProvider (created by SlotFillProvider)
    in SlotFillProvider (created by Editor)
    in StrictMode (created by Editor)
    in Editor (created by WithDispatch(Editor))
    in WithDispatch(Editor)
    in Unknown (created by WithSelect(WithDispatch(Editor)))
    in WithSelect(WithDispatch(Editor)) react-dom.js:539:32

@torounit
Copy link
Member

@noisysocks Related: #22967

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] Interface /packages/interface [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants