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

Writing Flow: Allow Escape key to deselect blocks and selection during multiselection #48904

Merged

Conversation

andrewserong
Copy link
Contributor

@andrewserong andrewserong commented Mar 8, 2023

What?

Fixes: #47172, #5524

This is a small PR that updates the check for switching to navigation mode when a user presses Escape. It's small but has a side effect:

When multiple blocks are selected and a user presses Escape, the blocks will be deselected, along with any partial selection across blocks. This is because the core/block-editor/unselect shortcut will be allowed to fire.

Why?

There appear to have been a number of iterations surrounding this behaviour over the past year or two, however the recent discussion over in #47172 highlights that it'd be good to make it easier for users to be able to quickly and easily deselect blocks via the keyboard.

From my perspective, when multiple blocks are selected in the editor canvas, it feels more likely that someone trying to press Escape will be looking to remove their selection rather than switch editing modes. I'm only a sample size of one, but to me, this feels a bit more intuitive.

How?

Update the check when switching modes to Navigation to only do so if not in a multiple block selection. This means that when multiple blocks are selected, the keyboard shortcut for clearing blocks will fire.

Then, in the logic for the unselect shortcut, if we're in a multi selection, select the first block of the selection. To a user, this should have the "feeling" as though the multi selection has been deselected, with focus redirected back to the beginning of the selection.

Testing Instructions

  1. In a post with multiple blocks, try selecting across multiple blocks and press ESCAPE. The blocks should be deselected.
  2. With either a single block or no block selected, press ESCAPE and the editing mode should switch to navigation.

Screenshots or screencast

2023-03-08 14 35 40

@andrewserong andrewserong added [Feature] Writing Flow Block selection, navigation, splitting, merging, deletion... [a11y] Keyboard & Focus labels Mar 8, 2023
@andrewserong andrewserong self-assigned this Mar 8, 2023
@github-actions
Copy link

github-actions bot commented Mar 8, 2023

Size Change: +20 B (0%)

Total Size: 1.4 MB

Filename Size Change
build/block-editor/index.min.js 196 kB +20 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.29 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 451 B
build/block-directory/index.min.js 6.99 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.22 kB
build/block-editor/content.css 4.22 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/style-rtl.css 14.9 kB
build/block-editor/style.css 14.9 kB
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 624 B
build/block-library/blocks/button/style.css 623 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 409 B
build/block-library/blocks/columns/style.css 409 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.61 kB
build/block-library/blocks/cover/style.css 1.6 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 159 B
build/block-library/blocks/details/style.css 159 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/interactivity.min.js 395 B
build/block-library/blocks/file/style-rtl.css 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/freeform/editor-rtl.css 2.58 kB
build/block-library/blocks/freeform/editor.css 2.58 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/interactivity.min.js 1.34 kB
build/block-library/blocks/image/style-rtl.css 1.34 kB
build/block-library/blocks/image/style.css 1.34 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
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 507 B
build/block-library/blocks/media-text/style.css 505 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.35 kB
build/block-library/blocks/navigation/editor.css 2.36 kB
build/block-library/blocks/navigation/interactivity.min.js 978 B
build/block-library/blocks/navigation/style-rtl.css 2.21 kB
build/block-library/blocks/navigation/style.css 2.2 kB
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/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 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-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 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 103 B
build/block-library/blocks/preformatted/style.css 103 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 167 B
build/block-library/blocks/pullquote/theme.css 167 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 288 B
build/block-library/blocks/query-pagination/style.css 284 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/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 587 B
build/block-library/blocks/search/style.css 584 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 531 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 203 B
build/block-library/blocks/site-logo/style.css 203 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 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.43 kB
build/block-library/blocks/social-links/style.css 1.42 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 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 645 B
build/block-library/blocks/table/style.css 644 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 174 B
build/block-library/blocks/video/style.css 174 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/editor-rtl.css 12.2 kB
build/block-library/editor.css 12.1 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 201 kB
build/block-library/interactivity/runtime.min.js 2.69 kB
build/block-library/interactivity/vendors.min.js 8.2 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 13.5 kB
build/block-library/style.css 13.5 kB
build/block-library/theme-rtl.css 686 B
build/block-library/theme.css 691 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 50.8 kB
build/commands/index.min.js 14.9 kB
build/commands/style-rtl.css 827 B
build/commands/style.css 827 B
build/components/index.min.js 231 kB
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.8 kB
build/compose/index.min.js 12 kB
build/core-commands/index.min.js 2.12 kB
build/core-data/index.min.js 15.7 kB
build/customize-widgets/index.min.js 11.9 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.25 kB
build/date/index.min.js 40.4 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.63 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 33.9 kB
build/edit-post/style-rtl.css 7.58 kB
build/edit-post/style.css 7.57 kB
build/edit-site/index.min.js 73.3 kB
build/edit-site/style-rtl.css 11.8 kB
build/edit-site/style.css 11.8 kB
build/edit-widgets/index.min.js 16.8 kB
build/edit-widgets/style-rtl.css 4.53 kB
build/edit-widgets/style.css 4.53 kB
build/editor/index.min.js 44.6 kB
build/editor/style-rtl.css 3.58 kB
build/editor/style.css 3.58 kB
build/element/index.min.js 4.8 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.62 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/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.64 kB
build/keycodes/index.min.js 1.84 kB
build/list-reusable-blocks/index.min.js 2.13 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/plugins/index.min.js 1.77 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 939 B
build/react-i18n/index.min.js 615 B
build/react-refresh-entry/index.min.js 8.44 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.38 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 10.7 kB
build/router/index.min.js 1.77 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.42 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.57 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 268 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

@jasmussen
Copy link
Contributor

jasmussen commented Mar 8, 2023

This is feeling really good to me. Mostly intuitive and transparent, and depending on feedback by other interested parties, I'd love to see this land.

Here's a GIF showing selecting multiple paragraphs, pressing Escape to deselect. Pressing Escape again to enter select mode. If only one paragraph is selected, Esc goes straight to select mode. Esc also closes the list view when selecting inside that:

esc to deselect

The only gotcha is: if you select multiple blocks inside the list view, press Escape to close the list view, you still have multiple blocks selected in the canvas, and I would then expect Esc to deselect them at that point. What do you think?

Edit: it seems like it might be because once you close the List View, focus is expectedly on the list view button. Is that why Esc doesn't deselect blocks in the canvas in this state?

@alexstine if you have time to review this PR, I'd love your input. The behavior seems fairly intuitive to me, but I could be missing something obvious.

@alexstine
Copy link
Contributor

@andrewserong See above. That might be a bug of sorts. It should be impossible to close the list view if blocks are still selected I would think. If you select blocks in the canvas, does that not sync to the list view via React store?

@andrewserong
Copy link
Contributor Author

Thanks for the feedback!

The only gotcha is: if you select multiple blocks inside the list view, press Escape to close the list view, you still have multiple blocks selected in the canvas, and I would then expect Esc to deselect them at that point. What do you think?
It seems like it might be because once you close the List View, focus is expectedly on the list view button. Is that why Esc doesn't deselect blocks in the canvas in this state?

Yes, the Escape key handling is pretty specific as to where focus currently is, so I'd expect Escape when focused on the list view button to do nothing since it's neither within the editor canvas, nor the sidebar/list view.

In terms of fixing this use case, though, I was actually imagining that we'd look at merging both this PR and #48708 so that while focus is within the list view, the first Escape press would clear the selection instead of closing the list view. I've kept the PRs separate since their scope is a little different (i.e. the List View PR doesn't need to worry about the writing flow behaviour, and the writing flow doesn't have to worry about what's going on in the List View).

What do you think about having both in place? One benefit of keeping the PRs separate, is that we might be able to merge #48708 sooner, because it doesn't involve changing writing flow behaviour, where I thought this PR might be a little more contentious if folks were expecting the switch-to-Navigation-mode behaviour.

Copy link
Contributor

@tellthemachines tellthemachines left a comment

Choose a reason for hiding this comment

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

I think this change makes sense as far as select mode behaviour goes, and a quick test shows it's working as expected.

Agree we should tackle the list view behaviour in #48708.

One thing I'm not sure about is where do we expect keyboard focus to land when deselecting the blocks in the canvas? Currently it's landing on the editor iframe.

@alexstine
Copy link
Contributor

@andrewserong @jasmussen Sorry about my earlier comment, I only now realize this is a different PR from the list view PR. Not enough coffee I guess this morning.

To answer @tellthemachines , I believe focus should always be in a consistent place. When block selection occurs, can you grab the starting clientId of the block selected and when deselecting all blocks, drop the user back where they started selecting? That is probably the best way to go about this.

Thanks.

@andrewserong andrewserong force-pushed the try/deselect-when-pressing-escape-in-multi-selection branch from e01bc2f to ae95964 Compare June 20, 2023 05:15
@andrewserong
Copy link
Contributor Author

Hi folks, I'm just dusting off this old PR that allows for deselecting blocks in the editor canvas by pressing the Escape key when multiple blocks are selected.

I've updated the logic so that if multiple blocks are selected when the unselect shortcut is fired, then the first block of the selection is "selected". While this doesn't technically clear out the selection altogether, I think this gets closer to how we might expect it to behave as a user — that is, the multi-selection is cleared, and we're dropped back to the beginning of the selection. Here is a screengrab of the current behaviour, where pressing Escape drops the user back to the first block of the selection:

2023-06-20.15.16.24.mp4

We're pretty close to the feature freeze for 6.3, but I just thought I'd give this PR another try in case we wind up being close to something that could work for now. Happy for any feedback or to park it and revisit for 6.4 if need be 🙂

@github-actions
Copy link

github-actions bot commented Jun 20, 2023

Flaky tests detected in ae95964.
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/5318792235
📝 Reported issues:

@ramonjd
Copy link
Member

ramonjd commented Jun 20, 2023

I'm not over the details but I've been testing this in the post and site editors and it works as described, and definitely an improvement on trunk. Nice!

Here's me flailing around in trunk trying to hit edit, and entering Select mode... and generally losing patience:

2023-06-20 15 58 11

In this branch:

Selecting in editor

2023-06-20 15 49 56

When selecting in list view, confirming that the first escape closes the list view (looking at above comments that suggest there's a possible follow up)

Selecting in list ![2023-06-20 15 50 54](https://github.com/WordPress/gutenberg/assets/6458278/00c1a3a0-0cdc-4917-bffb-b08a973ccdd2)

I'll let others have the final say, but LGTM

@andrewserong andrewserong requested a review from joedolson June 20, 2023 06:01
@andrewserong
Copy link
Contributor Author

Thanks for taking this for a spin @ramonjd! Let's see what other folks think, too 👍

When selecting in list view, confirming that the first escape closes the list view (looking at above #48904 (comment) that suggest there's a possible follow up)

Yes, to keep things granular and look at behaviour one piece at a time, this PR just looks at behaviour when we're within the editor canvas. I thought I'd wait and see how we go with the direction in this PR, and if this one winds up looking good / landing, then I'll dust off #48708 as a follow-up. 🙂

@jasmussen
Copy link
Contributor

Thanks so much for keeping on this, it will be such a quality of life improvement. The basic behavior works really well. Here's a GIF showing paragraphs and an image, with me multi selecting both, then pressing Esc to deselect. Also, if just a single block is selected, Esc goes into select mode again, which is a fine compromise:

deselect

I'm seeing an issue with esc in the list view. It isn't entirely clear to me that it is an issue, or intentional, and I don't know that it should be blocking. But for clarity, this GIF shows me multi selecting multiple blocks using the list view, and then pressing Esc, which of course closes the list view:

list view

The tricky part is that once it's closed, the multi selection remains, no matter how much I press Esc. I think that if I were to focus the canvas, then the Esc keyboard shortcut would work again, but I'm not sure.

What I would expect here, and correct me if this would be bad practice, is that Esc in this case should be a global shortcut that always deselects. Perhaps unless focus is inside the list view when it acts as a modal. Then pressing Esc twice would first close the list view, and then de-select.

Make sense?

@alexstine
Copy link
Contributor

@jasmussen There is another in progress PR that would bring escape to deselect to the list view. Press escape to deselect then escape will close the list view.

Thanks.

@joedolson
Copy link
Contributor

Noting that Escape failing to deselect blocks was also flagged as an issue in #51356.

@andrewserong
Copy link
Contributor Author

@jasmussen thanks for taking this for a spin!

The tricky part is that once it's closed, the multi selection remains, no matter how much I press Esc. I think that if I were to focus the canvas, then the Esc keyboard shortcut would work again, but I'm not sure.

Yes, that's the case. This PR is only adjusting the behaviour for when focus is within the editor canvas. It'd be good to look into further follow-ups for when focus is in other places. For the list view, we'll look at escape key behaviour separately over in #48708 as there's more nuances to getting it working correctly within the list view. I could also imagine follow-ups that might expand the behaviour to other areas such as if focus is on the toolbar, or otherwise not within the editor canvas, but we might need to tread carefully if exposing global shortcuts like that to make sure we don't introduce unexpected behaviour.

For now, is everyone happy with the behaviour within the editor canvas? I'm keen for us to land these improvements in incremental steps if we can since the change for the editor canvas is much simpler to figure out than the list view behaviour, which might not make it in time for 6.3.

Thanks for taking a look, everyone! 🙇

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

Wonderful, thanks for approving @alexstine! I'll merge this one in now.

@andrewserong andrewserong merged commit 7f4d64b into trunk Jun 21, 2023
@andrewserong andrewserong deleted the try/deselect-when-pressing-escape-in-multi-selection branch June 21, 2023 01:28
@github-actions github-actions bot added this to the Gutenberg 16.1 milestone Jun 21, 2023
@andrewserong andrewserong changed the title Writing Flow: Try allowing Escape key to deselect blocks and selection during multiselection Writing Flow: Allow Escape key to deselect blocks and selection during multiselection Jun 21, 2023
sethrubenstein pushed a commit to pewresearch/gutenberg that referenced this pull request Jul 13, 2023
…n during multiselection (WordPress#48904)

* Writing Flow: Try allowing Escape key to deselect blocks and selection during multiselection

* Try selecting the first block of the deselection within the unselect action
@priethor priethor added [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). and removed [a11y] Keyboard & Focus labels Jul 24, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Writing Flow Block selection, navigation, splitting, merging, deletion... [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). [Type] Enhancement A suggestion for improvement.
Projects
No open projects
Development

Successfully merging this pull request may close these issues.

Press Esc twice to deselect all blocks
7 participants