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

List View: Allow Escape key to deselect blocks if blocks are selected #48708

Merged

Conversation

andrewserong
Copy link
Contributor

@andrewserong andrewserong commented Mar 3, 2023

What?

Fixes #48462

Related issues and discussions:

This is an attempt to solve the issue of users being unable to deselect blocks from within the list view. The idea proposed is to allow the Escape key to deselect all blocks if there is a block selection, and skip closing the list view. If there are no blocks selected, then the Escape key will close the list view.

Why?

As reported in #48462, it would be good for users to be able to deselect blocks from within the list view via keyboard, and it is not currently possible to do so. Because folks can use the list view keyboard shortcut to open and close it, the idea in this PR is that it would be okay for Escape to be prioritised for deselecting blocks rather than closing the list view.

For reference, the keyboard shortcut for closing the list view is alt+shift+o on Windows, and control+option+o on Mac.

How?

  • In the list view if there is a block selection when the user presses the Escape key, then clear the block selection instead of closing the list view. Otherwise, proceed to closing the list view.

Testing Instructions

  1. In a post with multiple blocks, try shift selecting a couple of them block from the list view.
  2. Press Escape and the block should be deselected.
  3. Press Escape again and the list view should be closed.
  4. Open the list view again, and tab to the items within the list view without selecting any of the blocks. Press Escape and the list view should close.

Testing Instructions for Keyboard

  1. In a post with multiple blocks, open the list view via the keyboard shortcut (alt+shift+o on Windows, and control+option+o on Mac).
  2. Use shift + up/down keys to select multiple blocks.
  3. Press Escape and the blocks should be deselected.
  4. Press Escape again and the list view should be closed.

Screenshots or screencast

In the below screengrab, the user shift-clicks multiple blocks within the list view, then presses Escape to clear the selection. When there are no blocks selected and the user presses Escape, the list view is closed.

escape-to-clear-selection.mp4

@andrewserong andrewserong self-assigned this Mar 3, 2023
@andrewserong andrewserong added [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). [Feature] List View Menu item in the top toolbar to select blocks from a list of links. [Type] Enhancement A suggestion for improvement. labels Mar 3, 2023
@andrewserong
Copy link
Contributor Author

@alexstine just for visibility, here's the draft I'm working on to try out deselecting blocks within the list view via using the Escape key. I wasn't sure, but for this one, will we need to add a speak() call to announce that the blocks have been deselected?

@github-actions
Copy link

github-actions bot commented Mar 3, 2023

Size Change: +1.22 kB (0%)

Total Size: 1.51 MB

Filename Size Change
build/block-editor/index.min.js 214 kB +590 B (0%)
build/block-editor/style-rtl.css 15 kB +14 B (0%)
build/block-editor/style.css 15 kB +14 B (0%)
build/block-library/blocks/paragraph/editor-rtl.css 235 B +61 B (+35%) 🚨
build/block-library/blocks/paragraph/editor.css 235 B +61 B (+35%) 🚨
build/block-library/blocks/paragraph/style-rtl.css 335 B +56 B (+20%) 🚨
build/block-library/blocks/paragraph/style.css 335 B +54 B (+19%) ⚠️
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B +62 B (+41%) 🚨
build/block-library/blocks/post-navigation-link/style.css 214 B +61 B (+40%) 🚨
build/block-library/editor-rtl.css 12.2 kB +51 B (0%)
build/block-library/editor.css 12.1 kB +51 B (0%)
build/block-library/index.min.js 203 kB +20 B (0%)
build/block-library/style-rtl.css 13.8 kB +64 B (0%)
build/block-library/style.css 13.8 kB +64 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.69 kB
build/api-fetch/index.min.js 2.28 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 451 B
build/block-directory/index.min.js 7.01 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.25 kB
build/block-editor/content.css 4.24 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/button/style-rtl.css 629 B
build/block-library/blocks/button/style.css 628 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 421 B
build/block-library/blocks/columns/style.css 421 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.63 kB
build/block-library/blocks/cover/style.css 1.62 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 98 B
build/block-library/blocks/details/style.css 98 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 280 B
build/block-library/blocks/file/style.css 281 B
build/block-library/blocks/file/view-interactivity.min.js 317 B
build/block-library/blocks/file/view.min.js 375 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 1.42 kB
build/block-library/blocks/image/style.css 1.41 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/image/view-interactivity.min.js 1.83 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 505 B
build/block-library/blocks/media-text/style.css 503 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 712 B
build/block-library/blocks/navigation-link/editor.css 711 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.23 kB
build/block-library/blocks/navigation/style.css 2.22 kB
build/block-library/blocks/navigation/view-interactivity.min.js 988 B
build/block-library/blocks/navigation/view-modal.min.js 2.85 kB
build/block-library/blocks/navigation/view.min.js 469 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 508 B
build/block-library/blocks/post-comments-form/style.css 508 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 319 B
build/block-library/blocks/post-featured-image/style.css 319 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 314 B
build/block-library/blocks/post-template/style.css 314 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/pullquote/theme-rtl.css 168 B
build/block-library/blocks/pullquote/theme.css 168 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 302 B
build/block-library/blocks/query-pagination/style.css 299 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/query/style-rtl.css 370 B
build/block-library/blocks/query/style.css 368 B
build/block-library/blocks/query/view.min.js 559 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/style-rtl.css 607 B
build/block-library/blocks/search/style.css 607 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 631 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 204 B
build/block-library/blocks/site-logo/style.css 204 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 682 B
build/block-library/blocks/social-links/editor.css 681 B
build/block-library/blocks/social-links/style-rtl.css 1.44 kB
build/block-library/blocks/social-links/style.css 1.43 kB
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 432 B
build/block-library/blocks/table/editor.css 432 B
build/block-library/blocks/table/style-rtl.css 639 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 185 B
build/block-library/blocks/video/style.css 185 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 688 B
build/block-library/theme.css 693 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51.4 kB
build/commands/index.min.js 15.5 kB
build/commands/style-rtl.css 932 B
build/commands/style.css 929 B
build/components/index.min.js 245 kB
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.8 kB
build/compose/index.min.js 12.1 kB
build/core-commands/index.min.js 2.72 kB
build/core-data/index.min.js 16.8 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.46 kB
build/customize-widgets/style.css 1.45 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.38 kB
build/date/index.min.js 17.8 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.64 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 35.5 kB
build/edit-post/style-rtl.css 7.62 kB
build/edit-post/style.css 7.62 kB
build/edit-site/index.min.js 91 kB
build/edit-site/style-rtl.css 13.2 kB
build/edit-site/style.css 13.2 kB
build/edit-widgets/index.min.js 16.9 kB
build/edit-widgets/style-rtl.css 4.52 kB
build/edit-widgets/style.css 4.52 kB
build/editor/index.min.js 45.5 kB
build/editor/style-rtl.css 3.53 kB
build/editor/style.css 3.52 kB
build/element/index.min.js 4.82 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.73 kB
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/index.min.js 11.2 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.64 kB
build/keycodes/index.min.js 1.87 kB
build/list-reusable-blocks/index.min.js 2.2 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 1.99 kB
build/nux/style-rtl.css 735 B
build/nux/style.css 732 B
build/patterns/index.min.js 2.71 kB
build/patterns/style-rtl.css 240 B
build/patterns/style.css 240 B
build/plugins/index.min.js 1.79 kB
build/preferences-persistence/index.min.js 1.84 kB
build/preferences/index.min.js 1.24 kB
build/primitives/index.min.js 943 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 958 B
build/react-i18n/index.min.js 615 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.7 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 11 kB
build/router/index.min.js 1.78 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 1.85 kB
build/sync/index.min.js 53.8 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.73 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 958 B
build/warning/index.min.js 249 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

@github-actions
Copy link

github-actions bot commented Mar 3, 2023

Flaky tests detected in b68fcce.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/4412306267
📝 Reported issues:

Copy link
Contributor

@alexstine alexstine left a comment

Choose a reason for hiding this comment

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

@andrewserong This mostly looks good but yeah, we'll need a speak( msg, 'assertive' ); on this. Maybe model it after the announcement in the current selection hook in the list-view.

speak( 'All blocks deselected', 'assertive' );

Is it okay to access blockEditorStore outside of block-editor package?

@andrewserong andrewserong marked this pull request as ready for review March 5, 2023 23:15
@andrewserong
Copy link
Contributor Author

Thanks for the feedback @alexstine! I've added the assertive speak() call to each of these callbacks. I noticed that the selection hook in the list view doesn't currently use assertive, so I wasn't sure which approach is better. Happy to keep tweaking as needed.

Is it okay to access blockEditorStore outside of block-editor package?

Yes, in the case of the edit-post and edit-site packages, the block editor store appears to be a safe dependency, and it's used quite a bit for block selection actions and selectors.

@andrewserong
Copy link
Contributor Author

Just including @WordPress/gutenberg-design as a ping since I know a few designers have helped out with UX flows of the List View in the past, so might have feedback on the approach here, too 🙂

@alexstine
Copy link
Contributor

@andrewserong I am working on changing that in my ARIA refactor, #48461. I will give this PR a test shortly.

Thanks.

@alexstine alexstine self-requested a review March 5, 2023 23:56
@andrewserong
Copy link
Contributor Author

I am working on changing that in my ARIA refactor, #48461.

Ah, yes, of course I forgot about that. Thank you for the reminder!

@jasmussen
Copy link
Contributor

Hey, thanks for taking a stab at this, this is really important to get right.

This issue seems to be working for the list view, but I wonder, can we find a more basic solution that works for blocks in the canvas too? In #47172 I had an idea to allow esc twice to work for this. Would that thread the needle?

@alexstine
Copy link
Contributor

@jasmussen I think pressing escape twice is a little excessive for this. Besides, most dialogs/pop overs in Gutenberg close with a single press of escape which can sometimes be a very destructive action.

Copy link
Contributor

@apeatling apeatling left a comment

Choose a reason for hiding this comment

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

I realize there's some conversation about direction, just noting that I tested this as it currently stands and it all worked as expected.

@andrewserong
Copy link
Contributor Author

andrewserong commented Mar 7, 2023

Thanks for the feedback @jasmussen! Totally agree that this is an important one to get right, and to try think about the implications holistically.

In the case of the list view, the behaviour in this PR only applies to when focus is within the list items, where a user is interacting with and adjusting selection of the blocks. For the Escape key to be able to trigger a deselection, we'll probably always need to have some code to handle it here, so that we can skip closing the list view, as Alex mentions.

can we find a more basic solution that works for blocks in the canvas too? In #47172 I had an idea to allow esc twice to work for this. Would that thread the needle?

For the editor in general, what if we thought about it the other way, and had logic that says that if there is a multiple block selection in place within the editor canvas, then the first Escape press clears the selection altogether, and then the second press switches to the Select mode? This is a sample size of one, but personally I'd expect deselection to happen first before a mode switch.

Whichever direction we go with, though, I agree that the behaviour in the List View should be consistent with expected behaviour elsewhere in the editor. I think this PR will likely still be a good shape for it within the List View, but I'm very happy for us to slow down a little on this PR to think it through — also happy to try other ideas if there are others in mind!

@jasmussen
Copy link
Contributor

I think pressing escape twice is a little excessive for this. Besides, most dialogs/pop overs in Gutenberg close with a single press of escape which can sometimes be a very destructive action.

Thanks for diving in. I tend to agree, and I suggested it mainly because I so wanted a way to deselect all blocks in the canvas using Esc, that I was willing to entertain the double-esc idea.

I quite like Andrew's suggestion above, which is slightly simplified in this comment. Essentially that if you have blocks selected, it deselects them. Select mode you only enter if you don't have any blocks selected. (Or have 1 block selected? — I guess that's the main inconsistency to figure out.) What do you think about that behavior?

@alexstine
Copy link
Contributor

@jasmussen Agreed. We should not be allowing the user to enter select mode if blocks are selected or closing the list view if blocks are selected. I think the double escape will confuse users if nothing happens on the first press though. Besides, what if something like this happens?

  1. Open list view.
  2. Select some blocks.
  3. Press escape.
  4. Explore the current selection just using the arrow keys.
  5. Do I still need to press escape twice? Does it reset after a certain period? For example, I must press escape twice within 3 seconds?
  6. Press escape twice.
  7. All blocks deselected.
  8. Press escape once, list view closes.
    I just cannot get behind the UX for that. It seems confusing and it introduces conditionals that are not really discoverable by users until they try it and figure it out.
    As far as deselecting in the canvas goes, I think we'll have our own set of A11Y challenges there. That section of the editor does not have role="application" for screen readers so I think we'll see all kinds of A11Y issues with Windows screen readers. My focus for now is to get at least one area working and maybe it can be the framework for other parts of the editor.
    Hopefully my thoughts make sense.
    Thanks.

@andrewserong
Copy link
Contributor Author

I realised that I forgot to include the widgets editor, too, which also has its own sidebar logic. In 1d4c96f I've included that one, too.

Separately, I've had a go over in #48904 of trying out allowing Escape in the editor canvas to clear the block selection. At the very least, it highlighted that if we want to allow block deselection within the list view, this PR will still be required, as we need the logic to fire before the Escape key handlers in the list views that are responsible for closing the list view. So, whichever direction we think will work best for the editor canvas, I think that means this PR should still be viable. Or at the very least, is in a good place for review now 🙂

Let me know if anyone would like me to try out any other ideas not already covered in this PR and over in #48904 (that one just deals with the editor canvas, this one just with the list views).

Thanks again for all the discussion here!

@andrewserong andrewserong force-pushed the try/allow-escape-key-in-list-view-to-clear-block-selection branch from ab1613b to b93392d Compare September 1, 2023 05:11
@andrewserong andrewserong removed the [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). label Sep 1, 2023
@andrewserong
Copy link
Contributor Author

Now that we're in the 6.4 cycle, I've given this a rebase and added a small addition to the existing keyboard shortcuts test for the list view. I think it's mostly working pretty well, but I haven't yet found a good way to always return explicit focus to the list view button when the list view is closed via the Escape key without any blocks selected.

In some ways, that might be behaviour for us to look into separately, because it's possible to have focus within the list view without a block selected and then press Escape on trunk. That said, this PR makes that situation much more frequent, so happy to keep digging if anyone feels like it's a blocker to this PR landing.

Copy link
Contributor

@alexstine alexstine left a comment

Choose a reason for hiding this comment

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

@andrewserong Just gave this another test. While the selection announcement is working great, pressing Escape no longer gives any indication that blocks have been deselected. Was that an oversight on my part or is there a bug?

@andrewserong
Copy link
Contributor Author

Thank you for re-testing @alexstine! It turns out it was a bug, I had forgotten that I needed to add extra handling to the updateBlockSelection callback to ensure that the speak calls for deselection continue to fire if the escape key is pressed. I've pushed a fix. Prior to that, the announcement code would never fire because we would return early if the shift key was not pressed. I believe we previously added in the deselection announcement only for actions where users are adjusting a multi selection via the shift key.

I've retested using VoiceOver on a Mac and the deselection announcements are now happening for me when I press the Escape key. Please let me know if I've missed anything, though, and I'll dig in.

@alexstine
Copy link
Contributor

@andrewserong This is looking good. If you promise to look into the loss of focus in a follow-up, I'm good to let this get merged now. To replicate:

  1. Open list view.
  2. Press Escape to deselect blocks.
  3. Press Escape to close the list view.
  4. Focus should land somewhere and currently it goes nowhere. It would be good to focus the list view trigger or some other constant point.

Focus loss is a big problem but one I think for this situation, can be addressed in another PR.

Thanks.

Copy link
Contributor

@alexstine alexstine left a comment

Choose a reason for hiding this comment

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

👍

@andrewserong
Copy link
Contributor Author

Thanks for reviewing and approving @alexstine! Yes, absolutely, I'm happy to continue looking into the focus issue. I've opened up a separate issue over in #54165 to capture the discussion so far, and will have a deeper look.

Thanks again for all your help with this one! I'll merge this in now.

@andrewserong andrewserong merged commit 7a4330d into trunk Sep 5, 2023
50 checks passed
@andrewserong andrewserong deleted the try/allow-escape-key-in-list-view-to-clear-block-selection branch September 5, 2023 00:29
@github-actions github-actions bot added this to the Gutenberg 16.7 milestone Sep 5, 2023
@jasmussen
Copy link
Contributor

This is such a good improvement. Thank you all for working on this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] List View Menu item in the top toolbar to select blocks from a list of links. Needs User Documentation Needs new user documentation [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

List view: Impossible to deselect all blocks using the keyboard
9 participants