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 Missing URL state to Navigation Link Block #28861

Merged
merged 19 commits into from
Feb 26, 2021

Conversation

georgeh
Copy link
Contributor

@georgeh georgeh commented Feb 8, 2021

Description

Changing the Navigation Link block to highlight when a link is missing

Closes #28440
Closes #23326

How has this been tested?

Screenshots

Screen.Recording.2021-02-16.at.11.56.28.AM.mov

Types of changes

When the URL is missing from a Navigation Link Block:

  • Adds a placeholder
  • Forces the URL popover open when the block is selected
  • Prevents editing the text

Bugfix:

  • Cancels any outstanding requests in URLInput when the component is unmounted to avoid calling setState on an unmounted component

Checklist:

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

@georgeh
Copy link
Contributor Author

georgeh commented Feb 8, 2021

@jasmussen @shaunandrews This does a little bit with highlighting a Link block that is missing the URL and popping up the input fields. A really rough sketch, but please let me know if it's on the right track. (Setting the URL and text may or may not work)

@github-actions
Copy link

github-actions bot commented Feb 8, 2021

Size Change: +6.4 kB (0%)

Total Size: 1.39 MB

Filename Size Change
build/a11y/index.js 1.14 kB +1 B (0%)
build/annotations/index.js 3.79 kB +13 B (0%)
build/api-fetch/index.js 3.41 kB +4 B (0%)
build/block-directory/index.js 9.1 kB +3 B (0%)
build/block-editor/index.js 125 kB +180 B (0%)
build/block-editor/style-rtl.css 12.1 kB +13 B (0%)
build/block-editor/style.css 12.1 kB +12 B (0%)
build/block-library/blocks/buttons/editor-rtl.css 315 B +82 B (+35%) 🚨
build/block-library/blocks/buttons/editor.css 315 B +82 B (+35%) 🚨
build/block-library/blocks/buttons/style-rtl.css 364 B +46 B (+14%) ⚠️
build/block-library/blocks/buttons/style.css 363 B +45 B (+14%) ⚠️
build/block-library/blocks/navigation-link/editor-rtl.css 681 B +286 B (+72%) 🆘
build/block-library/blocks/navigation-link/editor.css 683 B +286 B (+72%) 🆘
build/block-library/blocks/query/editor-rtl.css 814 B +655 B (+412%) 🆘
build/block-library/blocks/query/editor.css 812 B +652 B (+408%) 🆘
build/block-library/blocks/social-links/style-rtl.css 1.32 kB -43 B (-3%)
build/block-library/blocks/social-links/style.css 1.32 kB -42 B (-3%)
build/block-library/editor-rtl.css 9.52 kB +482 B (+5%) 🔍
build/block-library/editor.css 9.51 kB +485 B (+5%) 🔍
build/block-library/index.js 148 kB +2.89 kB (+2%)
build/block-library/style-rtl.css 8.83 kB -15 B (0%)
build/block-library/style.css 8.84 kB -14 B (0%)
build/blocks/index.js 48.3 kB +13 B (0%)
build/components/index.js 272 kB -7 B (0%)
build/compose/index.js 11.1 kB +6 B (0%)
build/core-data/index.js 16.8 kB +8 B (0%)
build/customize-widgets/index.js 4.08 kB +4 B (0%)
build/data/index.js 8.87 kB +8 B (0%)
build/date/index.js 31.8 kB +1 B (0%)
build/dom/index.js 4.95 kB +14 B (0%)
build/edit-navigation/index.js 11 kB +15 B (0%)
build/edit-post/index.js 307 kB +12 B (0%)
build/edit-site/index.js 26.4 kB +25 B (0%)
build/edit-widgets/index.js 20.1 kB +14 B (0%)
build/editor/index.js 42.1 kB +17 B (0%)
build/element/index.js 4.62 kB +6 B (0%)
build/format-library/index.js 6.77 kB -1 B (0%)
build/i18n/index.js 4.01 kB +4 B (0%)
build/keyboard-shortcuts/index.js 2.54 kB +6 B (0%)
build/keycodes/index.js 1.96 kB +5 B (0%)
build/media-utils/index.js 5.36 kB +7 B (0%)
build/notices/index.js 1.86 kB +5 B (0%)
build/nux/index.js 3.42 kB +4 B (0%)
build/plugins/index.js 2.55 kB +3 B (0%)
build/primitives/index.js 1.42 kB +7 B (0%)
build/redux-routine/index.js 2.83 kB -2 B (0%)
build/reusable-blocks/index.js 3.77 kB +5 B (0%)
build/rich-text/index.js 13.5 kB +108 B (+1%)
build/server-side-render/index.js 2.82 kB +6 B (0%)
build/url/index.js 3.02 kB +1 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/autop/index.js 2.84 kB 0 B
build/blob/index.js 665 B 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-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 479 B 0 B
build/block-library/blocks/button/style.css 479 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/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/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 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 696 B 0 B
build/block-library/blocks/social-links/editor.css 696 B 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 478 B 0 B
build/block-library/blocks/table/editor.css 478 B 0 B
build/block-library/blocks/table/style-rtl.css 390 B 0 B
build/block-library/blocks/table/style.css 390 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.08 kB 0 B
build/block-library/common.css 1.08 kB 0 B
build/block-library/theme-rtl.css 736 B 0 B
build/block-library/theme.css 736 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/components/style-rtl.css 15.5 kB 0 B
build/components/style.css 15.5 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 831 B 0 B
build/deprecated/index.js 769 B 0 B
build/dom-ready/index.js 576 B 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.41 kB 0 B
build/edit-site/style.css 4.41 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/style-rtl.css 3.89 kB 0 B
build/editor/style.css 3.89 kB 0 B
build/escape-html/index.js 735 B 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/is-shallow-equal/index.js 698 B 0 B
build/list-reusable-blocks/index.js 3.14 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/nux/style-rtl.css 731 B 0 B
build/nux/style.css 727 B 0 B
build/priority-queue/index.js 791 B 0 B
build/react-i18n/index.js 1.45 kB 0 B
build/reusable-blocks/style-rtl.css 225 B 0 B
build/reusable-blocks/style.css 225 B 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.27 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

@jasmussen
Copy link
Contributor

Excited about this one!

There's not a ton to see yet:

Screenshot 2021-02-09 at 12 16 08

One thing that I think is pretty key for the placeholder menu item, perhaps beyond opening the linkcontrol by default, is that the menu item label is not editable at all until both URL and Label have been filled out (or for Page link, a page has been chosen). That means the menu item is completely inert until configured. I suppose we can keep the RichText component and inert it using pointer-events: none; and cursor: pointer;, however that might not work as you could probably still tab into it.

Can we remove the rich text part of the menu item, until configured?

@jasmussen
Copy link
Contributor

jasmussen commented Feb 10, 2021

To Shaun's point, it could make sense to rewind this and make it even simpler:

  • Insert menu item and the link control is immediately open with focus there.
  • You can't focus the menu item label, focus is always immediately transferred to the link control.
  • Ideally, the menu item is inert until a URL has been added.
  • Once a URL has been added, now you can edit the label in the menu item, directly.

Did I get that right, Shaun?

@shaunandrews
Copy link
Contributor

Yes, exactly.

@georgeh
Copy link
Contributor Author

georgeh commented Feb 10, 2021

Thanks! That's was the direction I've been heading in to see what we can do without overhauling too much, but that list works even better than where I was.

@georgeh
Copy link
Contributor Author

georgeh commented Feb 10, 2021

OK, is this a bit closer to the interaction that we are trying to hit?

Screen.Recording.2021-02-10.at.3.32.21.PM.mov

@shaunandrews
Copy link
Contributor

shaunandrews commented Feb 10, 2021

That seems to be on the right path! You can't do anything until you select a link. Very nice.

@jasmussen
Copy link
Contributor

Really nice work. I think the next step is to polish the visuals a bit. Shaun did you want to try that dimmed gray background from your mockup? Happy to give that a stab and push CSS here.

Question: from looking at your video, the linkcontrol popover appears top/left aligned from where you click, whereas I believe it's top/center aligned in the master branch. Is this intentional and/or easy to change?

Bonus: can you make the linkcontrol use the isAlternate visual treatment?

const POPOVER_PROPS = {
	isAlternate: true,
};

That would make it have a black border like the other block UI.

@georgeh
Copy link
Contributor Author

georgeh commented Feb 11, 2021

Question: from looking at your video, the linkcontrol popover appears top/left aligned from where you click, whereas I believe it's top/center aligned in the master branch. Is this intentional and/or easy to change?

I think this is a visual artifact because I was using a small viewport to record the video. I just tested it fullscreen and I think it's aligning correctly:

Screen Shot 2021-02-11 at 11 10 18 AM

If not, I'm not sure which part needs to move, maybe take a screenshot of the video? (That's also with isAlternate on the popover)

@georgeh georgeh marked this pull request as ready for review February 12, 2021 21:39
@georgeh georgeh requested a review from ajitbohra as a code owner February 12, 2021 21:39
@georgeh
Copy link
Contributor Author

georgeh commented Feb 12, 2021

@jasmussen do you want to take a stab at the visuals for the "Missing URL" state?

@jasmussen
Copy link
Contributor

I pushed a little polish:

Screenshot 2021-02-15 at 11 09 10

It now has the default font and size, and a gray background reminiscent of the initial setup state.

@shaunandrews will be asking about the spacing here:

Screenshot 2021-02-15 at 11 09 03

That's the default spacing applied to wp-block-navigation-link__content. I the markup, this happens:

Screenshot 2021-02-15 at 11 11 13

I did not find an easy way to make the gray background fit the available space. I'll tinker a bit more.

@jasmussen
Copy link
Contributor

Okay, got it working:

Screenshot 2021-02-15 at 11 17 14

@jasmussen
Copy link
Contributor

So, in #28440, Shaun designs a "active state" for the placeholder menu item being edited. Like so:

Screenshot 2021-02-15 at 10 56 32

The inactive state has the gray background:

Screenshot 2021-02-15 at 10 56 27

But we have no such active state:

Screenshot 2021-02-15 at 11 18 35

Should we have one?


Another thing. From looking at this (https://github.com/WordPress/gutenberg/pull/28861/files#diff-161a9737e181e56e07148b7eee4795f129aa821f73993a276cf1fd9c17941b70R388) there's a click handler to open the link dialog. But this handler doesn't appear to open if I set keyboard focus, and press "Enter", so we probably need a different handler that works with both mouse and keyboard:

Screenshot 2021-02-15 at 11 18 35


Finally, there's a conversation on verbiage. In the example here, I have a Page link, a Post link, and a custom Link. You can see the differentiation in menu item:

menu

In his mockups. Shaun showed different labels for each. George is it feasible, without a great deal of complexity, to show different placeholder text depending on the item type? So instead of "Missing URL", you'd get:

  • Page Link: Select a page
  • Post Link: Select a post
  • Link: Add a link

@shaunandrews I trust you to correct my reading of the above ☝️

@georgeh georgeh requested a review from ellatrix as a code owner February 15, 2021 10:28
@jasmussen
Copy link
Contributor

Colorized the link control separator for when the style is "alternate":

Screenshot 2021-02-15 at 11 28 31

@georgeh georgeh changed the title Prototyping a new Link Nav Block Interaction Add Missing URL state to Navigation Link Block Feb 15, 2021
@@ -100,6 +100,9 @@ class URLInput extends Component {
}

componentWillUnmount() {
if ( this.suggestionsRequest?.cancel ) {
this.suggestionsRequest.cancel();
}
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Found this during debugging, if you quickly toggle the URLInput before the fetch returns, it will attempt to call setState() on the unmounted component. This cancels the suggestionsRequest Promise when it unmounts to avoid the issue.

I can break it out to a separate PR if needed, the rest of the code doesn't trigger this anymore.

Copy link
Contributor

Choose a reason for hiding this comment

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

Probably okay to sneak in, maybe just leave a quick note in the summary. eg "also fixes ..."

Minor: We can remove the if check using optional chaining.

this?.suggestionsRequest?.cancel?.()

See also: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining#stacking_the_optional_chaining_operator

@georgeh
Copy link
Contributor Author

georgeh commented Feb 16, 2021

@jasmussen I worked with @gwwar and we were able to get the chooser menu to trigger on keyboard navigation, add highlighting when the nav menu is not selected, and update the placeholder text. Take a look and let me know what you think.

Screen.Recording.2021-02-16.at.11.56.28.AM.mov

@georgeh
Copy link
Contributor Author

georgeh commented Feb 16, 2021

@shaunandrews Joen's AFK for a few days, if you have time I'd appreciate your thoughts.

@shaunandrews
Copy link
Contributor

This is coming together nicely!

Here's a few notes:

image

When I click the empty link block, the block itself is focused. Instead, I'd expect focus to move to the search field within the popover. Also, the link popover seems mis-aligned with the link block; I'd expect them to align to their left edges.

--

When I use my keyboard to select the empty link block, the Link UI immediately opens. This feels wrong. Instead, I'd expect to have to hit return to open the Link UI and then have my focus move into the popover.

--

Perhaps unrelated to this PR, but once I move my focus into the Link UI popover I have no way to close the popover. I expect that I could hit esc to close the popover and put my focus back on the empty link block, but it doesn't work.

--

image

The empty state is a little weird in the horizontal variation of the Navigation block, where the width of the link block is much larger than the empty state shape. Perhaps this is expected — and if you put it in a Columns block, its feels much better — I just wanted to note the strangeness.

@draganescu draganescu mentioned this pull request Feb 18, 2021
62 tasks
@jasmussen
Copy link
Contributor

I pushed a little fix to the border and the margin:

Screenshot 2021-02-22 at 12 06 59

The focus ring is now correctly spaced all around the placeholder, and the border is inset so it has the same size as the gray solid blob.

These two:

When I click the empty link block, the block itself is focused. Instead, I'd expect focus to move to the search field within the popover. Also, the link popover seems mis-aligned with the link block; I'd expect them to align to their left edges.

When I use my keyboard to select the empty link block, the Link UI immediately opens. This feels wrong. Instead, I'd expect to have to hit return to open the Link UI and then have my focus move into the popover.

Great point.

  • Click with a mouse on the placeholder, and focus is taken to the URL field.
  • Select with keyboard purely sets focus on the button. Enter or Space when there, should do the same as a click.

Sorry if I misled on this before.

The empty state is a little weird in the horizontal variation of the Navigation block, where the width of the link block is much larger than the empty state shape. Perhaps this is expected — and if you put it in a Columns block, its feels much better — I just wanted to note the strangeness.

I'll take a look.

@jasmussen
Copy link
Contributor

The empty state is a little weird in the horizontal variation of the Navigation block, where the width of the link block is much larger than the empty state shape. Perhaps this is expected — and if you put it in a Columns block, its feels much better — I just wanted to note the strangeness.

.wp-block-navigation.is-vertical wp-block-navigation-link {
	display: inline-block;
}

that'll fix it — but I'm tempted to think we should fix this separately, because it's a general issue with the navigation block menu items:

focus size

And it does kind of open the question: what should the default behavior for that vertical version be? Happy to make a PR to add this separately, let me know!

@jasmussen
Copy link
Contributor

George, this PR is in good shape! It needs a rebase, and then Shaun's point about focus addressed, then we can land it. Great work!

@georgeh
Copy link
Contributor Author

georgeh commented Feb 22, 2021

Right now I'm reworking how the focus events happen, which should address Shaun's points. What I'm trying to do is:

Given the URL is not set:

  • if you click on the block, it will pop open the URL popover
  • if you select the block with the keyboard and then hit return, the URL popover will open
  • when the URL popover opens, the text field will get focus
  • when you press escape, the URL popover closes

Once that all works I'll get another review and get this merged

@georgeh georgeh force-pushed the update/nav-block-link-placeholder branch from edd5786 to 93daed3 Compare February 24, 2021 17:43
@shaunandrews
Copy link
Contributor

shaunandrews commented Feb 24, 2021

I can't quite put my finger on it, but there appear to be some keyboarding issues, I think it may be general to the navigation block. I'd appreciate a @shaunandrews look on this.

I mentioned the keyboard focus thing earlier, and can confirm the focus still sticks with the placeholder — I'd expect it to move into the popover and focus the search input.

Related to this, once the popover does appear, its impossible to get rid of it without selecting another block. This is probably not a big deal, but as a keyboard user, I'd expect some way to get back to block itself; I instinctually try hitting esc and this just switches to select mode. With other popovers, hitting esc closes the popover and puts my focus back to whatever triggered the popover.

I'd expect the placeholder state to work like a toggle. Click it once, and the popover opens and my focus moves to the search box. Click it a second time and the popover should close and my focus should move back to the block.

--

Very minor, but I think there should be a cursor: pointer applied to the placeholder state. Right now my cursor doesn't change, so its not obvious I can click on the placeholder.

@georgeh
Copy link
Contributor Author

georgeh commented Feb 24, 2021

@shaunandrews can you take another look? There was a regression when I rebased earlier.

@jasmussen
Copy link
Contributor

This is what I see:

now

It feels like it's perfect to me now! And it's a vast improvement over what we had before, night and day. This is great.

@jasmussen jasmussen self-requested a review February 25, 2021 05:59
Copy link
Contributor

@jasmussen jasmussen left a comment

Choose a reason for hiding this comment

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

Due to the "is-alternate" feedback from Shaun's PR, let's also remove it here (see #28861 (comment)) — we can alway revisit the heuristic for when to show one or the other. So you can remove that, but otherwise, this is great.

If she has time, I'd also like one quick sanity check from @gwwar, but outside of that, this is delicious. Let's land it as soon as we can!

@gwwar gwwar self-requested a review February 25, 2021 15:58
@gwwar
Copy link
Contributor

gwwar commented Feb 25, 2021

For folks reviewing adding a ?w=1 will ignore whitespace changes on the diff view. https://github.com/WordPress/gutenberg/pull/28861/files?w=1

Copy link
Contributor

@gwwar gwwar left a comment

Choose a reason for hiding this comment

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

Great stuff @georgeh. This feels like a great improvement! I left a few minor notes, but I think this is pretty good to go.

testing.mp4

@@ -100,6 +100,9 @@ class URLInput extends Component {
}

componentWillUnmount() {
if ( this.suggestionsRequest?.cancel ) {
this.suggestionsRequest.cancel();
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Probably okay to sneak in, maybe just leave a quick note in the summary. eg "also fixes ..."

Minor: We can remove the if check using optional chaining.

this?.suggestionsRequest?.cancel?.()

See also: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining#stacking_the_optional_chaining_operator

Copy link
Contributor

@shaunandrews shaunandrews left a comment

Choose a reason for hiding this comment

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

Looks good! Nice work.

@georgeh
Copy link
Contributor Author

georgeh commented Feb 25, 2021

TIL you can use ?.() to optionally call a method, thanks @gwwar

Clear to merge?

Edit: Confirmed with Joen that it's gtg

@georgeh georgeh merged commit 59d6cbf into master Feb 26, 2021
@georgeh georgeh deleted the update/nav-block-link-placeholder branch February 26, 2021 15:22
@github-actions github-actions bot added this to the Gutenberg 10.2 milestone Feb 26, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
4 participants