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

[ListView] Allow deleting blocks using keyboard #50422

Merged
merged 5 commits into from
May 28, 2023

Conversation

kevin940726
Copy link
Member

@kevin940726 kevin940726 commented May 8, 2023

What?

Fix #49087. Allow deleting blocks using the Delete and Backspace key, or the keyboard shortcut Shift+Alt+z (Ctrl+Alt+z on macOS).

Why?

To retain feature parity. See #49087.

How?

Added a removeRow function and a KeyboardShortcuts component.

Testing Instructions

  1. Open a Post and insert some blocks.
  2. Open the list view.
  3. Try using the keyboard to navigate and focus/select some blocks in the list view
  4. Press Delete, Backspace, or Shift+Alt+z (Ctrl+Alt+z on macOS) to delete the focused blocks.
  5. Expect the focused blocks to be deleted.
  6. Try other things like deleting locked blocks or deleting unselected but focused blocks and see if it works as expected.

Testing Instructions for Keyboard

  1. Open a Post and insert some blocks.
  2. Open the list view (Shift+Alt+o or Ctrl+Alt+o on macOS).
  3. Try using the keyboard to navigate and focus/select some blocks in the list view
  4. Press Delete, Backspace, or Shift+Alt+z (Ctrl+Alt+z on macOS) to delete the focused blocks.
  5. Expect the focused blocks to be deleted and expect the focus to be retained in the list view (rather than moving to the canvas).
  6. Try other things like deleting locked blocks or deleting unselected but focused blocks and see if it works as expected.

Screenshots or screencast

Kapture.2023-05-09.at.08.40.23.mp4

@kevin940726 kevin940726 added the [Feature] List View Menu item in the top toolbar to select blocks from a list of links. label May 8, 2023
@github-actions
Copy link

github-actions bot commented May 8, 2023

Size Change: +458 B (0%)

Total Size: 1.39 MB

Filename Size Change
build/block-editor/index.min.js 193 kB +458 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.05 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.23 kB
build/block-editor/content.css 4.23 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 15.1 kB
build/block-editor/style.css 15.1 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 91 B
build/block-library/blocks/avatar/style.css 91 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/file/view.min.js 375 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 783 B
build/block-library/blocks/image/style-rtl.css 1.07 kB
build/block-library/blocks/image/style.css 1.07 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.33 kB
build/block-library/blocks/navigation/editor.css 2.33 kB
build/block-library/blocks/navigation/interactivity.min.js 896 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/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 438 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/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 281 B
build/block-library/blocks/post-template/style.css 281 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 434 B
build/block-library/blocks/search/style.css 432 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 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.4 kB
build/block-library/blocks/social-links/style.css 1.39 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/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.1 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 200 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.1 kB
build/block-library/style.css 13.1 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.3 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 230 kB
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.1 kB
build/core-commands/index.min.js 1.74 kB
build/core-data/index.min.js 15.4 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.38 kB
build/customize-widgets/style.css 1.38 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.28 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 34.6 kB
build/edit-post/style-rtl.css 7.76 kB
build/edit-post/style.css 7.75 kB
build/edit-site/index.min.js 64.5 kB
build/edit-site/style-rtl.css 10.9 kB
build/edit-site/style.css 10.9 kB
build/edit-widgets/index.min.js 17 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.54 kB
build/editor/style.css 3.53 kB
build/element/index.min.js 4.8 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.57 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.71 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 875 B
build/plugins/index.min.js 1.84 kB
build/preferences-persistence/index.min.js 1.84 kB
build/preferences/index.min.js 1.24 kB
build/primitives/index.min.js 941 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 939 B
build/react-i18n/index.min.js 696 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.21 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 2.02 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 1.04 kB
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

@github-actions
Copy link

github-actions bot commented May 8, 2023

Flaky tests detected in 4274a5e.
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/5098153081
📝 Reported issues:

@kevin940726
Copy link
Member Author

Currently, pressing keyboard shortcut when the dropdown is opened doesn't work. Before jumping into a solution for that, I'd like to know where the focus should be once the users delete a block. On trunk, clicking on the delete button in the list view dropdown moves focus to the editor canvas. My intuition would be to retain focus in the list view and move the focus to the previous block's dropdown button. In this PR, deleting blocks inside the list view using keyboard will move focus to the previous row within the list view. I wonder which is the preferred way, and what the expected result should be for pressing keyboard shortcut when the dropdown is opened. c.c. @alexstine, @andrewserong, @talldan.

@alexstine
Copy link
Contributor

@kevin940726 It would be nice to be able to keep the focus in the list view. I think another PR I suggested this and it was discovered that it would not be easy.

@kevin940726 kevin940726 self-assigned this May 10, 2023
Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Very cool progress @kevin940726! I'm really excited about this one, and it's testing quite well for me 👍

The main issue I ran into is with deleting blocks that are outside the selection. Currently it seems to return focus to the next block up in the list view via selecting that block. If the block that's deleted isn't part of the selection, is it possible to shift focus to the block directly above the deleted block, without altering the block selection? Assuming that's the desired behaviour, of course.

There's another subtle issue, which is that a block deletion isn't always successful, so for shifting focus, we might need to check whether or not it was a success before updating? Here's an example with a locked block — after attempting to delete, focus (and selection) is shifted one position up unexpectedly:

2023-05-11 14 12 51

One last question is whether or not deleting should always be available? I think the answer is probably yes, but it'd be good to test it out in other situations where the list view is in use. #50287 just landed yesterday I think, which now uses the ListView component in the Navigation menu in the left hand sidebar of the site editor when in Browse mode. After a rebase, we should be able to test this there, too:

image

@kevin940726
Copy link
Member Author

@andrewserong Thanks for the review and nice suggestions! I'll address them later! 🙇

@kevin940726 kevin940726 force-pushed the fix/list-view-delete-and-focus branch from 0dc67e8 to d4cec92 Compare May 15, 2023 07:22
editor.canvas.getByRole( 'document', {
name: 'Block: Heading',
} )
).toBeFocused();
Copy link
Member Author

Choose a reason for hiding this comment

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

These tests are deleted because they check if the focus is moved to the editor canvas but not the list view.

const shouldUpdateSelection =
hasSelectedBlocks && getSelectedBlockClientIds().length === 0;

__experimentalSelectBlock( blockToFocus, shouldUpdateSelection );
Copy link
Member Author

Choose a reason for hiding this comment

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

Still undecided if we should also rename this to __experimentalFocusAndSelectBlock. Even though it's an experimental API, for some reason it's still documented in the README 😅 .

Copy link
Contributor

Choose a reason for hiding this comment

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

Interesting! I didn't realise it was documented, either. Perhaps we could keep the name the same, but update the docs to mention the additional param?

Copy link
Member Author

Choose a reason for hiding this comment

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

I'm thinking maybe just delete the docs for this prop? It's an "experimental" prop anyway? 😅 Not sure about the impact though 🤔 .

@kevin940726 kevin940726 marked this pull request as ready for review May 16, 2023 03:19
@kevin940726 kevin940726 requested a review from ellatrix as a code owner May 16, 2023 03:19
@kevin940726 kevin940726 requested review from talldan and alexstine May 16, 2023 03:20
Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

This is testing great for me @kevin940726, thanks for all the detailed work and follow-up!

✅ All keyboard shortcuts appear to be working as expected
✅ Attempting to delete a selection containing a locked block does nothing
✅ Deleting a block that is not part of the selection shifts focus one block up without altering selection
✅ Deleting block(s) in a selection moves focus and selection up to the previous block in the list view

The only issue I ran into is unrelated to this PR and exists on trunk — shift selecting blocks that contain a locked block causes focus to shift outside of the list view. It's a little hard to see in this gif, but I'm holding shift and pressing down, and once I pass the locked block, focus is lost from the list view:

2023-05-16 16 14 58

At any rate, that's not a blocker for this PR. Great work, and appreciate the updated tests, too! LGTM ✨

const shouldUpdateSelection =
hasSelectedBlocks && getSelectedBlockClientIds().length === 0;

__experimentalSelectBlock( blockToFocus, shouldUpdateSelection );
Copy link
Contributor

Choose a reason for hiding this comment

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

Interesting! I didn't realise it was documented, either. Perhaps we could keep the name the same, but update the docs to mention the additional param?

@andrewserong andrewserong added the [Type] Enhancement A suggestion for improvement. label May 16, 2023
@kevin940726
Copy link
Member Author

@alexstine Do you want to take a look at this to make sure everything works accessibility-wise? I think the focus management should behave more intuitively now IMO. I'd like to know if I missed anything though! 🙇

@alexstine
Copy link
Contributor

@kevin940726 I would like to give this a look but currently my local environment is not working. I might be able to test tomorrow.

@alexstine alexstine added the [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). label May 18, 2023
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.

@kevin940726 This is almost perfect, one last issue. It seems like the text that aria-describedby points to is not being re-rendered which delivers incorrect information to screen reader users. To replicate:

  1. Insert some blocks, I inserted a total of 5.
  2. Open the list view.
  3. Remove the first block.
  4. Notice how focus is not lost, great job. The block in position 2 now becomes position 1, leaving us with 4 blocks total.
  5. If you inspect the description text read to screen readers, it says the 1st block is block 2 of 5. The description text does not get an updated position or total.

Can you make sure this variable is updated before the focus event occurs so that way screen readers get an up to date description?

@kevin940726
Copy link
Member Author

@alexstine Thanks for testing! I can't seem to reproduce it using Mac's VoiceOver (or I'm using it wrong somehow). I still pushed a commit e75c4e7 trying to fix it. LMK if it works for you, until I find a way to test it locally! 🙇

@alexstine
Copy link
Contributor

@kevin940726 Still not working. :( Here is some speech output.

Block navigation structure
Block navigation structure table
Paragraph not selected
Paragraph link Block 1 of 7, Level 1
Options for Paragraph not selected column 2
Options for Paragraph menu button collapsed subMenu
expanded
Copy block 1 of 4
Duplicate Ctrl+Shift+D 2 of 4
Add before Ctrl+Alt+T 3 of 4
Add after Ctrl+Alt+Y 4 of 4
Copy styles 1 of 2
Paste styles 2 of 2
Group 1 of 5
Lock 2 of 5
Create Reusable block 3 of 5
Move to 4 of 5
Edit as HTML 5 of 5
Delete Shift+Alt+Z 1 of 1
Block navigation structure
Block navigation structure table
Paragraph not selected column 1
Paragraph link Block 2 of 7, Level 1
Paragraph not selected row 2
Paragraph link Block 3 of 7, Level 1
Paragraph not selected row 1
Paragraph link Block 2 of 7, Level 1

You can clearly see that the screen reader is not picking up the new changes after a block is deleted. It is providing incorrect positioning information.

Thanks.

@kevin940726
Copy link
Member Author

@alexstine Weird, I have no idea what's wrong here 😢. IIRC, you're using NVDA on Windows, right? I went ahead and download a Windows 11 VM on my mac and download NVDA to test this branch. Here's my speech output:

Edit Post ‹ gutenberg — WordPress - Profile 1 - Microsoft​ Edge window
Block navigation structure
Block navigation structure table
Paragraph selected
Paragraph link Block 1 of 5, Level 1
Paragraph selected
Paragraph link Block 1 of 4, Level 1
Options for Paragraph selected column 2
Options for Paragraph menu button collapsed subMenu
button Close
Copy block 1 of 4
Delete Shift+Alt+Z 1 of 1
Block navigation structure
Block navigation structure table
Paragraph selected column 1
Paragraph link Block 1 of 3, Level 1

I deleted two blocks, one using the Delete key and the other using the options menu. Both work correctly and announced the correct amount of the list size. Could you pull the latest branch and try again locally 🙇‍♂️? Just want to eliminate the possibility of a broken build 😅.

@alexstine
Copy link
Contributor

@kevin940726 Still not working. Even tried going back to default screen reader settings. The part not updating has an ID that looks like this: id="list-view-block-select-button__14".

This is reproduceable in Firefox. However, this does work fine in Google Chrome. I wonder if we discovered some type of ARIA bug in Firefox.

You happen to know anything about this @MarcoZehe ?

Thanks.

@MarcoZehe
Copy link
Contributor

Sorry, I am retired, haven't worked on Firefox for over two years.

@alexstine
Copy link
Contributor

@MarcoZehe I figured it was worth a try anyway. Do you have any suggestions on who I could reach out to? I have never tried contributing to Firefox personally. Maybe this is a good time to start. Thanks.

@MarcoZehe
Copy link
Contributor

The person I'd contact is @jcsteh from Mozilla.

@kevin940726
Copy link
Member Author

OMG yes! The missing part is Firefox apparently 😅. I was able to reproduce the issue in Firefox, even using Mac's VoiceOver. I'm not sure if it's a Firefox bug or deliberate decision. I'll try to debug some more! Thanks for the additional context!

@kevin940726 kevin940726 force-pushed the fix/list-view-delete-and-focus branch from e75c4e7 to 4274a5e Compare May 27, 2023 09:38
@kevin940726
Copy link
Member Author

I think I figured it out! I'll post my findings in a separate PR so that we can isolate the problem for future readers. I think the issue is not introduced in this PR so it shouldn't be a blocker. If everyone's okay with this I'll merge this 🙇‍♂️!

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.

@kevin940726 Thanks. 🚢

@kevin940726 kevin940726 merged commit 39eb045 into trunk May 28, 2023
@kevin940726 kevin940726 deleted the fix/list-view-delete-and-focus branch May 28, 2023 05:00
@github-actions github-actions bot added this to the Gutenberg 16.0 milestone May 28, 2023
@andrewserong
Copy link
Contributor

Nice work landing this, folks! 🎉

Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

Hey 👋 I'm working on some dropdown-related refactor and came across changes introduced with this PR — going to leave some comments / questions, hope you don't mind!

/**
* @param {KeyboardEvent} event
*/
onKeyDown( event ) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Is the only reason for this callback to keep the focus in the list view after deleting/duplicating/inserting a block? Or is there another reason?

Copy link
Member Author

Choose a reason for hiding this comment

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

It's to allow pressing keyboard shortcuts when the focus is in the menu dropdown. I couldn't find any other way to do this without having to duplicate a lot of the code 😢 .

canRemove
) {
event.preventDefault();
updateSelectionAfterRemove( onRemove() );
Copy link
Contributor

Choose a reason for hiding this comment

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

updateSelectionAfterRemove doesn't seem to be expecting any arguments — why do we pass onRemove() ? (same would apply for the instances of updateSelectionAfterRemove in this function)

Copy link
Member Author

Choose a reason for hiding this comment

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

Oops. I think I was trying to follow the same style of pipe() used in the click handler below, and also to match the style of updateSelectionAfterDuplicate. I agree it could be confusing given that the function doesn't accept any arguments though!

@femkreations femkreations added the Needs User Documentation Needs new user documentation label Jun 14, 2023
sethrubenstein pushed a commit to pewresearch/gutenberg that referenced this pull request Jul 13, 2023
* Allow deleting blocks using keyboard from listview

* Update updateSelection instead

* Add support for kyeboard shortcut in the dropdown

* Only select block if there isn't any already

* More things!
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. [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). 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.

Deleting multiple blocks from list view
7 participants