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

Navigation Component: Handle the no search results state #27160

Merged
merged 1 commit into from
Nov 24, 2020

Conversation

Copons
Copy link
Contributor

@Copons Copons commented Nov 20, 2020

Description

A missing feature for the built-in search of the Navigation component is handling the "no results" state.

The component is smart enough to count the results by itself, and announce them to screen readers.
But when we implemented it in a real case scenario (#26665), we had to create a "no results" message from scratch.
We tried rendering it as a simple, text-only, NavigationItem, which worked fine visually, but unfortunately was counted as a search result, and announced as "1 result found" to screen readers.

This PR adds a "No results found." message, visually identical to any other NavigationItem, but not counted towards the results.
It's only rendered if the search is active and "in progress" (there are characters in the search field), and there are no results.

How has this been tested?

  • npm run storybook:dev and search for the Navigation > Search story.
  • Try searching in both the controlled and uncontrolled search examples, and make sure that:
    • The no results message only shows up when there are no other results.
    • The voice over announces 0 results.
    • The no results message doesn't remain visible when changing menu.

Types of changes

New feature (non-breaking change which adds functionality)

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.

@github-actions
Copy link

github-actions bot commented Nov 20, 2020

Size Change: +56 B (0%)

Total Size: 1.2 MB

Filename Size Change
build/components/index.js 172 kB +56 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.8 kB 0 B
build/api-fetch/index.js 3.42 kB 0 B
build/autop/index.js 2.84 kB 0 B
build/blob/index.js 664 B 0 B
build/block-directory/index.js 8.71 kB 0 B
build/block-directory/style-rtl.css 943 B 0 B
build/block-directory/style.css 942 B 0 B
build/block-editor/index.js 133 kB 0 B
build/block-editor/style-rtl.css 11.3 kB 0 B
build/block-editor/style.css 11.3 kB 0 B
build/block-library/editor-rtl.css 8.96 kB 0 B
build/block-library/editor.css 8.96 kB 0 B
build/block-library/index.js 148 kB 0 B
build/block-library/style-rtl.css 8.23 kB 0 B
build/block-library/style.css 8.23 kB 0 B
build/block-library/theme-rtl.css 792 B 0 B
build/block-library/theme.css 793 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.1 kB 0 B
build/components/style-rtl.css 15.3 kB 0 B
build/components/style.css 15.3 kB 0 B
build/compose/index.js 9.95 kB 0 B
build/core-data/index.js 14.8 kB 0 B
build/data-controls/index.js 827 B 0 B
build/data/index.js 8.8 kB 0 B
build/date/index.js 11.2 kB 0 B
build/deprecated/index.js 768 B 0 B
build/dom-ready/index.js 571 B 0 B
build/dom/index.js 4.92 kB 0 B
build/edit-navigation/index.js 11.2 kB 0 B
build/edit-navigation/style-rtl.css 881 B 0 B
build/edit-navigation/style.css 885 B 0 B
build/edit-post/index.js 306 kB 0 B
build/edit-post/style-rtl.css 6.45 kB 0 B
build/edit-post/style.css 6.44 kB 0 B
build/edit-site/index.js 23.6 kB 0 B
build/edit-site/style-rtl.css 3.86 kB 0 B
build/edit-site/style.css 3.86 kB 0 B
build/edit-widgets/index.js 26.4 kB 0 B
build/edit-widgets/style-rtl.css 3.13 kB 0 B
build/edit-widgets/style.css 3.13 kB 0 B
build/editor/editor-styles-rtl.css 476 B 0 B
build/editor/editor-styles.css 478 B 0 B
build/editor/index.js 43.3 kB 0 B
build/editor/style-rtl.css 3.85 kB 0 B
build/editor/style.css 3.85 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.86 kB 0 B
build/format-library/style-rtl.css 547 B 0 B
build/format-library/style.css 548 B 0 B
build/hooks/index.js 2.27 kB 0 B
build/html-entities/index.js 623 B 0 B
build/i18n/index.js 3.57 kB 0 B
build/is-shallow-equal/index.js 698 B 0 B
build/keyboard-shortcuts/index.js 2.54 kB 0 B
build/keycodes/index.js 1.94 kB 0 B
build/list-reusable-blocks/index.js 3.1 kB 0 B
build/list-reusable-blocks/style-rtl.css 476 B 0 B
build/list-reusable-blocks/style.css 476 B 0 B
build/media-utils/index.js 5.32 kB 0 B
build/notices/index.js 1.81 kB 0 B
build/nux/index.js 3.42 kB 0 B
build/nux/style-rtl.css 671 B 0 B
build/nux/style.css 668 B 0 B
build/plugins/index.js 2.56 kB 0 B
build/primitives/index.js 1.43 kB 0 B
build/priority-queue/index.js 790 B 0 B
build/redux-routine/index.js 2.84 kB 0 B
build/reusable-blocks/index.js 2.92 kB 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.69 kB 0 B
build/token-list/index.js 1.27 kB 0 B
build/url/index.js 4.05 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

@david-szabo97
Copy link
Member

Thanks for this Jacopo! The story works well but in our use-case, it announces "0 results found" right after typing in something. We are debouncing the search which causes it to have 0 results for a brief moment.

ezgif com-gif-maker (8)

We could remove the denounce for now for a quick win but I'd rather not. Any idea how to make this debounce-friendly? I kinda feel like we can't without passing in a prop. Or we can build the denounce into the component. Passing it as a prop like debounce={250} (denounce search by 250ms)

@jeyip
Copy link
Contributor

jeyip commented Nov 23, 2020

Quick tips to those trying to reproduce the issue posted by David:

  • I cherry picked 675c37c into add/navigation-panel-search-templates
  • I commented out packages/edit-site/src/components/navigation-sidebar/navigation-panel/search-results.js lines 45 to 47.
  • I also modified the SEARCH_DEBOUNCE_IN_MS variable in packages/edit-site/src/components/navigation-sidebar/navigation-panel/constants.js:22 from 75 to 2000 (2 seconds)

I think it's worth noting that if we lower the debounce enough, I'm not able to replicate the "0 results found" screen reader problem. I am, however, able to replicate another issue that David pointed out elsewhere -- we still see the "no results found" item popping up between queries.

@jeyip
Copy link
Contributor

jeyip commented Nov 23, 2020

We could remove the denounce for now for a quick win but I'd rather not. Any idea how to make this debounce-friendly? I kinda feel like we can't without passing in a prop. Or we can build the denounce into the component. Passing it as a prop like debounce={250} (denounce search by 250ms)

I've spent some time mulling this over and I'm inclined to agree. I'll experiment with passing a debounce prop through and if we're not fans, we can revert whatever I commit.

@jeyip jeyip force-pushed the fix/navigation-no-results-found branch 4 times, most recently from aa8009f to 72c63ae Compare November 24, 2020 01:12
@jeyip
Copy link
Contributor

jeyip commented Nov 24, 2020

The code I pushed fixes the flashing "No results found" message in between debounces while still implementing the fix originally intended by this PR. I do think, however, that the code is definitely up for discussion. Would love to hear feedback and thoughts @david-szabo97 and @Copons

@Copons
Copy link
Contributor Author

Copons commented Nov 24, 2020

Thanks for looking into this @jeyip! ✨
I think all the solutions we have been trying to fix this issue are a bit smelly.
The remaining option is to... just drop the debounce.

The search PR (#26665) currently just filters the templates already available in state, it doesn't fire new requests on type, so there should be no real need of a debounce anyway for now.

The day we see that front-loading templates is unmanageable, we'll need a refactor of many things (e.g. dynamically loaded nav sidebar, pagination, debounced search, etc.).
Let's work on that when/if the need arises.

I'm going to revert your commits in order to, hopefully, get the search feature merged ASAP.

@Copons Copons force-pushed the fix/navigation-no-results-found branch from 3931b87 to 62b5022 Compare November 24, 2020 11:10
Copy link
Member

@david-szabo97 david-szabo97 left a comment

Choose a reason for hiding this comment

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

LGTM! Thanks!

@david-szabo97 david-szabo97 merged commit eff9304 into master Nov 24, 2020
@david-szabo97 david-szabo97 deleted the fix/navigation-no-results-found branch November 24, 2020 12:09
@github-actions github-actions bot added this to the Gutenberg 9.5 milestone Nov 24, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Navigation Component A navigational waterfall component for hierarchy of items.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants