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

Fix popover never closing when clicking on the toggle button (Button, Navigation Link, Post Date) #27406

Closed
wants to merge 21 commits into from

Conversation

david-szabo97
Copy link
Member

@david-szabo97 david-szabo97 commented Dec 1, 2020

Description

Fix three instances of popover toggling:

  • Button component: Link toolbar button
  • Navigation Link component: Link toolbar button
  • Post Date component: Edit date toolbar button

Introduces a new prop for Popover component: toggleRef. When toggleRef is passed, then onFocusOutside is ignored and it is handled inside the component.

How has this been tested?

Button component

  • Open block editor
  • Add Buttons block
  • Type some text for the button
  • Click on the Link icon in the toolbar
  • Link popover should open
  • Click on the link icon again
  • Link popover should close

Navigation link component

  • Open block editor
  • Add Navigation (horizontal) block
  • Click Start Empty
  • Add Page Link block
  • Click on the Link icon in the toolbar
  • Link popover should close (popover automatically opens when you add the block)
  • Click on the link icon again
  • Link popover should open

Post Date component

  • Open block editor
  • Add Post Date block
  • Click on the Edit icon in the toolbar
  • Link popover should open
  • Click on the link icon again
  • Link popover should close

Screenshots

before

after

Types of changes

Bug fix (non-breaking change which fixes an issue)

Checklist:

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

@david-szabo97 david-szabo97 added [Type] Bug An existing feature does not function as intended [Block] Buttons Affects the Buttons Block labels Dec 1, 2020
@david-szabo97 david-szabo97 self-assigned this Dec 1, 2020
@github-actions
Copy link

github-actions bot commented Dec 1, 2020

Size Change: +876 B (0%)

Total Size: 1.42 MB

Filename Size Change
build/block-editor/index.js 127 kB +19 B (0%)
build/block-editor/style-rtl.css 12.4 kB +16 B (0%)
build/block-editor/style.css 12.4 kB +14 B (0%)
build/block-library/blocks/button/style-rtl.css 551 B +62 B (+13%) ⚠️
build/block-library/blocks/button/style.css 551 B +63 B (+13%) ⚠️
build/block-library/blocks/buttons/style-rtl.css 370 B +6 B (+2%)
build/block-library/blocks/buttons/style.css 370 B +7 B (+2%)
build/block-library/blocks/navigation-link/editor-rtl.css 651 B +17 B (+3%)
build/block-library/blocks/navigation-link/editor.css 651 B +16 B (+3%)
build/block-library/blocks/navigation-link/style-rtl.css 957 B +49 B (+5%) 🔍
build/block-library/blocks/navigation-link/style.css 955 B +47 B (+5%) 🔍
build/block-library/editor-rtl.css 9.56 kB +19 B (0%)
build/block-library/editor.css 9.55 kB +19 B (0%)
build/block-library/index.js 151 kB +5 B (0%)
build/block-library/style-rtl.css 9.11 kB +101 B (+1%)
build/block-library/style.css 9.11 kB +103 B (+1%)
build/components/index.js 284 kB +123 B (0%)
build/core-data/index.js 16.6 kB -182 B (-1%)
build/dom/index.js 5.08 kB +92 B (+2%)
build/edit-navigation/index.js 17.4 kB +49 B (0%)
build/edit-navigation/style-rtl.css 2.86 kB +144 B (+5%) 🔍
build/edit-navigation/style.css 2.86 kB +146 B (+5%) 🔍
build/edit-post/style-rtl.css 7.05 kB +1 B (0%)
build/editor/index.js 42.7 kB -60 B (0%)
ℹ️ 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.42 kB 0 B
build/autop/index.js 2.82 kB 0 B
build/blob/index.js 664 B 0 B
build/block-directory/index.js 8.63 kB 0 B
build/block-directory/style-rtl.css 1 kB 0 B
build/block-directory/style.css 1.01 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 112 B 0 B
build/block-library/blocks/audio/style.css 112 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 315 B 0 B
build/block-library/blocks/buttons/editor.css 315 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 436 B 0 B
build/block-library/blocks/columns/style.css 435 B 0 B
build/block-library/blocks/cover/editor-rtl.css 605 B 0 B
build/block-library/blocks/cover/editor.css 605 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.24 kB 0 B
build/block-library/blocks/cover/style.css 1.24 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 401 B 0 B
build/block-library/blocks/embed/style.css 400 B 0 B
build/block-library/blocks/file/editor-rtl.css 175 B 0 B
build/block-library/blocks/file/editor.css 174 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 704 B 0 B
build/block-library/blocks/gallery/editor.css 705 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.11 kB 0 B
build/block-library/blocks/gallery/style.css 1.1 kB 0 B
build/block-library/blocks/group/editor-rtl.css 160 B 0 B
build/block-library/blocks/group/editor.css 160 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 476 B 0 B
build/block-library/blocks/image/style.css 478 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 281 B 0 B
build/block-library/blocks/latest-comments/style.css 282 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/legacy-widget/editor-rtl.css 398 B 0 B
build/block-library/blocks/legacy-widget/editor.css 399 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/editor-rtl.css 1.13 kB 0 B
build/block-library/blocks/navigation/editor.css 1.13 kB 0 B
build/block-library/blocks/navigation/style-rtl.css 204 B 0 B
build/block-library/blocks/navigation/style.css 205 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 170 B 0 B
build/block-library/blocks/page-list/editor.css 170 B 0 B
build/block-library/blocks/page-list/style-rtl.css 167 B 0 B
build/block-library/blocks/page-list/style.css 167 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B 0 B
build/block-library/blocks/paragraph/editor.css 157 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 247 B 0 B
build/block-library/blocks/paragraph/style.css 248 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 103 B 0 B
build/block-library/blocks/preformatted/style.css 103 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 318 B 0 B
build/block-library/blocks/pullquote/style.css 318 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 83 B 0 B
build/block-library/blocks/query-loop/editor.css 82 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-title/editor-rtl.css 86 B 0 B
build/block-library/blocks/query-title/editor.css 86 B 0 B
build/block-library/blocks/query/editor-rtl.css 795 B 0 B
build/block-library/blocks/query/editor.css 794 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 251 B 0 B
build/block-library/blocks/separator/style.css 251 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 512 B 0 B
build/block-library/blocks/shortcode/editor.css 512 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 115 B 0 B
build/block-library/blocks/site-logo/style.css 115 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 776 B 0 B
build/block-library/blocks/social-links/editor.css 776 B 0 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB 0 B
build/block-library/blocks/social-links/style.css 1.33 kB 0 B
build/block-library/blocks/spacer/editor-rtl.css 317 B 0 B
build/block-library/blocks/spacer/editor.css 317 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/table/editor-rtl.css 478 B 0 B
build/block-library/blocks/table/editor.css 478 B 0 B
build/block-library/blocks/table/style-rtl.css 402 B 0 B
build/block-library/blocks/table/style.css 402 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 552 B 0 B
build/block-library/blocks/template-part/editor.css 551 B 0 B
build/block-library/blocks/term-description/editor-rtl.css 90 B 0 B
build/block-library/blocks/term-description/editor.css 90 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 50 B 0 B
build/block-library/blocks/verse/editor.css 50 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 187 B 0 B
build/block-library/blocks/video/style.css 187 B 0 B
build/block-library/common-rtl.css 1.1 kB 0 B
build/block-library/common.css 1.1 kB 0 B
build/block-library/reset-rtl.css 375 B 0 B
build/block-library/reset.css 376 B 0 B
build/block-library/theme-rtl.css 692 B 0 B
build/block-library/theme.css 693 B 0 B
build/block-serialization-default-parser/index.js 1.87 kB 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/blocks/index.js 48.4 kB 0 B
build/components/style-rtl.css 16.2 kB 0 B
build/components/style.css 16.2 kB 0 B
build/compose/index.js 11.2 kB 0 B
build/customize-widgets/index.js 7.33 kB 0 B
build/customize-widgets/style-rtl.css 676 B 0 B
build/customize-widgets/style.css 677 B 0 B
build/data-controls/index.js 838 B 0 B
build/data/index.js 8.89 kB 0 B
build/date/index.js 31.9 kB 0 B
build/deprecated/index.js 787 B 0 B
build/dom-ready/index.js 576 B 0 B
build/edit-post/index.js 307 kB 0 B
build/edit-post/style.css 7.04 kB 0 B
build/edit-site/index.js 27.5 kB 0 B
build/edit-site/style-rtl.css 4.51 kB 0 B
build/edit-site/style.css 4.5 kB 0 B
build/edit-widgets/index.js 15.8 kB 0 B
build/edit-widgets/style-rtl.css 2.98 kB 0 B
build/edit-widgets/style.css 2.98 kB 0 B
build/editor/style-rtl.css 3.96 kB 0 B
build/editor/style.css 3.96 kB 0 B
build/element/index.js 4.62 kB 0 B
build/escape-html/index.js 735 B 0 B
build/format-library/index.js 6.76 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.02 kB 0 B
build/is-shallow-equal/index.js 699 B 0 B
build/keyboard-shortcuts/index.js 2.53 kB 0 B
build/keycodes/index.js 1.96 kB 0 B
build/list-reusable-blocks/index.js 3.19 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.39 kB 0 B
build/notices/index.js 1.85 kB 0 B
build/nux/index.js 3.42 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.95 kB 0 B
build/primitives/index.js 1.42 kB 0 B
build/priority-queue/index.js 791 B 0 B
build/react-i18n/index.js 1.46 kB 0 B
build/redux-routine/index.js 2.84 kB 0 B
build/reusable-blocks/index.js 3.79 kB 0 B
build/reusable-blocks/style-rtl.css 225 B 0 B
build/reusable-blocks/style.css 225 B 0 B
build/rich-text/index.js 13.5 kB 0 B
build/server-side-render/index.js 2.6 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.02 kB 0 B
build/viewport/index.js 1.86 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.22 kB 0 B

compressed-size-action

@jeyip
Copy link
Contributor

jeyip commented Dec 2, 2020

This fix makes sense to me -- thanks for working on it!

The code appears to mostly solve the problem. I noticed a one issue though:

Chrome, Edge, Safari, and IE11 work as expected. In firefox, however, the issue doesn't seem to be resolved.

2020-12-01 22 40 14

@david-szabo97
Copy link
Member Author

david-szabo97 commented Dec 2, 2020

Thanks for catching that! Looking into it.

Copy link
Contributor

@ntsekouras ntsekouras left a comment

Choose a reason for hiding this comment

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

Tested and works well - thanks 👍 !

Regarding Firefox it seems to be Button and focus related in some browsers. This issue is related: #23886

I think we can merge this (with green CI) and iterate if a solution can be found about it.

@david-szabo97
Copy link
Member Author

@ntsekouras Just pushed a commit which seems to work consistently in all browsers on OSX. I implemented it as a hook and just to test it in more context I used the hook in the Dropdown component (which seems to be widely used to make these popovers) and it worked perfectly everywhere. 50ms timeout is kinda a magic number and I don't know what would be the ideal timeout. 16ms didn't work all the time, but 50ms worked perfectly so far.

If this implementation seems good to go, then we can iterate more on it by extracting the hook into util and use it in all the places.

@ntsekouras
Copy link
Contributor

I tested and works well in Firefox as well now! 👍

If this implementation seems good to go, then we can iterate more on it by extracting the hook into util and use it in all the places.

This will be great, yes!

I'd love @ellatrix 's opinion on this though. She has great experience on related stuff :)

@ellatrix
Copy link
Member

ellatrix commented Dec 2, 2020

Is this a problem in other popovers? If not, why not? And if yes, shouldn't we fix it generally? It seems strange to fix this on the implementation side because most popovers will have a toggle button.

@david-szabo97
Copy link
Member Author

Moving the timeout into the popover component would be a good general fix. I'm not sure if it would make any regression.

@david-szabo97
Copy link
Member Author

Still, I don't think it's a good idea. Toggling and the popover is two different things. I think the hook is a good way to make this happen. But we need to implement it in all the places.

I think this PR should just care about the button component for now. Then we can iterate on it.

What do you think about moving the hook to packages/components/src/popover/use-popover-toggle.js? It would come bundled with the popover so we can reuse it everywhere.

@ellatrix
Copy link
Member

ellatrix commented Dec 3, 2020

Why is onClose not enough? Is something broken about that? This PR is adding a lot of complexity for what should be a simple thing. I need to dedicate some time to review it in depth.

@david-szabo97 david-szabo97 force-pushed the fix/button-component-link-toggling branch from 855c38f to 67c1d69 Compare December 4, 2020 08:58
@david-szabo97
Copy link
Member Author

david-szabo97 commented Dec 4, 2020

@ellatrix Hopefully this clears it up for you, let me know!

onClose is triggered whenever the popover is closed. When you click on the toggle (link icon in the toolbar), then the popover closes then the click on the toggle opens the popover again. That's causing the problem that you see in the PR description.

onFocusOutside on the other hand triggers when the focus goes away from the popover. This way we can check where the focus went. If the focus is now on the toggle then we let the toggle onClick handler do the work to close the popover. Rather than closing it via onFocusOutside.

You can see the same implementation in the Dropdown component.

/**
* Closes the dropdown if a focus leaves the dropdown wrapper. This is
* intentionally distinct from `onClose` since focus loss from the popover
* is expected to occur when using the Dropdown's toggle button, in which
* case the correct behavior is to keep the dropdown closed. The same applies
* in case when focus is moved to the modal dialog.
*/
function closeIfFocusOutside() {
const { ownerDocument } = containerRef.current;
if (
! containerRef.current.contains( ownerDocument.activeElement ) &&
! ownerDocument.activeElement.closest( '[role="dialog"]' )
) {
close();
}
}

I'm planning to reuse the new hook in the Dropdown component so we aren't duplicating code. But that's for another PR, I want to keep them small if possible 😄

@Addison-Stavlo
Copy link
Contributor

Addison-Stavlo commented Dec 10, 2020

It will definitely be nice to see this resolved in the dropdown component in general.

Is this a problem in other popovers?

We noticed something similar when adding the Dropdown in the template part toolbar. @jeyip found that in FireFox clicking the toggle button to close the dropdown caused it to both close and re-open. It seems the change in focus would close it, but the mouse-up would force it to re-open. To keep it simple we ended up going with a temporary simple and sub-optimal solution of disabling the button while the dropdown is open, meaning it always closes by loss of focus and not the actual button toggle:

Screen Shot 2020-12-10 at 2 29 17 PM

Obviously, it will be better to not have to disable the button to avoid this. 🤣

@david-szabo97 david-szabo97 added the [Package] Components /packages/components label Dec 14, 2020
@david-szabo97
Copy link
Member Author

Moved this into Popover and fixed the same issue for two more components.

@david-szabo97 david-szabo97 added [Block] Post Date Affects the Post Date Block [Block] Navigation Affects the Navigation Block [Package] Block library /packages/block-library labels Mar 29, 2021
@david-szabo97 david-szabo97 changed the title Button component: Fix button URL picker toggling Fix popover never closing when clicking on the toggle button (Button, Navigation Link, Post Date) Mar 29, 2021

Reference to the element that's used to toggle this popover. Used to prevent `onClose` firing if focus moves to the toggle. Which usually means we clicked on the toggle. Without this, popover would reopen everytime we click on the toggle.

When `toggleRef` is provided, then `onFocusOutside` prop is ignored.
Copy link
Member

Choose a reason for hiding this comment

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

Why will it be ignored?

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 can't remember the reason for that to be honest. Looking at it today it totally makes sense to call this callback as well. Added it

@@ -143,6 +143,15 @@ If you need the `DOMRect` object i.e., the position of popover to be calculated
- Type: `Function`
- Required: No

### toggleRef
Copy link
Member

Choose a reason for hiding this comment

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

If we try this, it would be good to be experimental or unstable at first.

Copy link
Member Author

Choose a reason for hiding this comment

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

Renamed it to experimental

@@ -127,6 +128,7 @@ function URLPicker( {
position="bottom center"
onClose={ () => setIsURLPickerOpen( false ) }
anchorRef={ anchorRef?.current }
toggleRef={ linkToolbarButtonRef?.current }
Copy link
Member

Choose a reason for hiding this comment

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

When will linkToolbarButtonRef not be an object?

Copy link
Member

Choose a reason for hiding this comment

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

Also, it seems better to pass the reference instead of its value?

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 followed how the anchorRef is implemented in this situation. It would be confusing that we are passing the actual value for anchorRef but we are passing the reference for toggleRef. I prefer passing the reference as well, but I wanted to avoid even more confusion.

@ellatrix ellatrix mentioned this pull request Mar 30, 2021
7 tasks
Copy link
Member

@ellatrix ellatrix left a comment

Choose a reason for hiding this comment

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

I would like us to consider an alternative I explored in #30392. It would be good if we can avoid adding yet another prop to the Popover component, which should not concern itself with toggle buttons in the first place.

@stokesman
Copy link
Contributor

I'd been looking into the issue here since some days ago at which time this PR looked a little stale. Now I've made #30397 as an alternate that fixes the toggle logic in Dropdown and exemplifies using it to refactor ad hoc dropdown-like components by doing so with Button block's URLPicker. At present, there are test failures and though I've not checked all of them, they seem to be merely snags on implementation detail. It works well in manual testing so I think it's ready enough to assess the approach.

@david-szabo97
Copy link
Member Author

Closed in favor of #30397 and #30392

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Buttons Affects the Buttons Block [Block] Navigation Affects the Navigation Block [Block] Post Date Affects the Post Date Block [Package] Block library /packages/block-library [Package] Components /packages/components [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants