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

Data views: Add click-to-select behavior on table rows #59803

Merged
merged 11 commits into from Mar 22, 2024

Conversation

jameskoster
Copy link
Contributor

@jameskoster jameskoster commented Mar 12, 2024

What?

Capture clicks on on each table row and select the associated record accordingly.

Why?

A larger 'hitbox' makes it a bit easier for mouse / trackpad users to select items.

How?

Adjusts the keyboard listener we had to include clicks.

Testing Instructions

  1. Open a data view like Manage all pages and switch to table layout.
  2. Observe that clicking a row will select the item.
select.mp4

Notes:

  • It might be nice to follow-up with shift+click and cmd+click multiselection.

@jameskoster jameskoster added [Type] Enhancement A suggestion for improvement. [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). Needs Design Feedback Needs general design feedback. [Feature] Data Views Work surrounding upgrading and evolving views in the site editor and beyond labels Mar 12, 2024
Copy link

github-actions bot commented Mar 12, 2024

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: jameskoster <jameskoster@git.wordpress.org>
Co-authored-by: mcsf <mcsf@git.wordpress.org>
Co-authored-by: oandregal <oandregal@git.wordpress.org>
Co-authored-by: jasmussen <joen@git.wordpress.org>
Co-authored-by: andrewhayward <andrewhayward@git.wordpress.org>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

Copy link

github-actions bot commented Mar 12, 2024

Size Change: +1.06 kB (0%)

Total Size: 1.71 MB

Filename Size Change
build/block-editor/content-rtl.css 4.43 kB +25 B (+1%)
build/block-editor/content.css 4.43 kB +29 B (+1%)
build/block-editor/index.min.js 253 kB +282 B (0%)
build/block-library/blocks/file/editor-rtl.css 326 B +10 B (+3%)
build/block-library/blocks/file/editor.css 327 B +11 B (+3%)
build/block-library/editor-rtl.css 12.4 kB +8 B (0%)
build/block-library/editor.css 12.4 kB +8 B (0%)
build/block-library/index.min.js 218 kB +7 B (0%)
build/blocks/index.min.js 51.8 kB +18 B (0%)
build/components/index.min.js 224 kB +17 B (0%)
build/core-data/index.min.js 72.9 kB +151 B (0%)
build/customize-widgets/index.min.js 11.2 kB +22 B (0%)
build/data/index.min.js 8.98 kB +40 B (0%)
build/edit-post/index.min.js 24 kB -143 B (-1%)
build/edit-site/index.min.js 218 kB +369 B (0%)
build/edit-site/style-rtl.css 15 kB +16 B (0%)
build/edit-site/style.css 15 kB +19 B (0%)
build/edit-widgets/index.min.js 17.3 kB +24 B (0%)
build/editor/index.min.js 64.1 kB +132 B (0%)
build/format-library/index.min.js 8.1 kB +73 B (+1%)
build/style-engine/index.min.js 2.03 kB -68 B (-3%)
build/widgets/index.min.js 7.22 kB +12 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.32 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 578 B
build/block-directory/index.min.js 7.26 kB
build/block-directory/style-rtl.css 1.03 kB
build/block-directory/style.css 1.03 kB
build/block-editor/default-editor-styles-rtl.css 394 B
build/block-editor/default-editor-styles.css 394 B
build/block-editor/style-rtl.css 15.6 kB
build/block-editor/style.css 15.6 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 415 B
build/block-library/blocks/button/editor.css 414 B
build/block-library/blocks/button/style-rtl.css 627 B
build/block-library/blocks/button/style.css 626 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.69 kB
build/block-library/blocks/cover/style.css 1.68 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 322 B
build/block-library/blocks/embed/editor.css 322 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/style-rtl.css 280 B
build/block-library/blocks/file/style.css 281 B
build/block-library/blocks/file/view.min.js 324 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/form-input/editor-rtl.css 227 B
build/block-library/blocks/form-input/editor.css 227 B
build/block-library/blocks/form-input/style-rtl.css 343 B
build/block-library/blocks/form-input/style.css 343 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 340 B
build/block-library/blocks/form-submission-notification/editor.css 340 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/form/view.min.js 471 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.72 kB
build/block-library/blocks/gallery/style.css 1.72 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 647 B
build/block-library/blocks/group/editor.css 647 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 189 B
build/block-library/blocks/heading/style.css 189 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 878 B
build/block-library/blocks/image/editor.css 878 B
build/block-library/blocks/image/style-rtl.css 1.6 kB
build/block-library/blocks/image/style.css 1.59 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.min.js 1.54 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 306 B
build/block-library/blocks/media-text/editor.css 305 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 668 B
build/block-library/blocks/navigation-link/editor.css 669 B
build/block-library/blocks/navigation-link/style-rtl.css 259 B
build/block-library/blocks/navigation-link/style.css 257 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.26 kB
build/block-library/blocks/navigation/style.css 2.25 kB
build/block-library/blocks/navigation/view.min.js 1.02 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 377 B
build/block-library/blocks/page-list/editor.css 377 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 235 B
build/block-library/blocks/paragraph/editor.css 235 B
build/block-library/blocks/paragraph/style-rtl.css 335 B
build/block-library/blocks/paragraph/style.css 335 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-content/editor-rtl.css 74 B
build/block-library/blocks/post-content/editor.css 74 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 666 B
build/block-library/blocks/post-featured-image/editor.css 662 B
build/block-library/blocks/post-featured-image/style-rtl.css 342 B
build/block-library/blocks/post-featured-image/style.css 342 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 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 409 B
build/block-library/blocks/post-template/style.css 408 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 354 B
build/block-library/blocks/pullquote/style.css 354 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 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 486 B
build/block-library/blocks/query/editor.css 486 B
build/block-library/blocks/query/view.min.js 958 B
build/block-library/blocks/quote/style-rtl.css 237 B
build/block-library/blocks/quote/style.css 237 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 140 B
build/block-library/blocks/read-more/style.css 140 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 184 B
build/block-library/blocks/search/editor.css 184 B
build/block-library/blocks/search/style-rtl.css 629 B
build/block-library/blocks/search/style.css 628 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 478 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 229 B
build/block-library/blocks/separator/style.css 229 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.48 kB
build/block-library/blocks/social-links/style.css 1.48 kB
build/block-library/blocks/spacer/editor-rtl.css 350 B
build/block-library/blocks/spacer/editor.css 350 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 395 B
build/block-library/blocks/table/editor.css 395 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.11 kB
build/block-library/common.css 1.11 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 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14.8 kB
build/block-library/style.css 14.8 kB
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/commands/index.min.js 15.6 kB
build/commands/style-rtl.css 935 B
build/commands/style.css 930 B
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.9 kB
build/compose/index.min.js 12.6 kB
build/core-commands/index.min.js 2.77 kB
build/customize-widgets/style-rtl.css 1.36 kB
build/customize-widgets/style.css 1.36 kB
build/data-controls/index.min.js 640 B
build/date/index.min.js 17.9 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.65 kB
build/edit-post/classic-rtl.css 558 B
build/edit-post/classic.css 558 B
build/edit-post/style-rtl.css 5.58 kB
build/edit-post/style.css 5.57 kB
build/edit-widgets/style-rtl.css 4.17 kB
build/edit-widgets/style.css 4.16 kB
build/editor/style-rtl.css 5.36 kB
build/editor/style.css 5.35 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/style-rtl.css 492 B
build/format-library/style.css 490 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/file.min.js 447 B
build/interactivity/image.min.js 1.67 kB
build/interactivity/index.min.js 13 kB
build/interactivity/navigation.min.js 1.15 kB
build/interactivity/query.min.js 740 B
build/interactivity/router.min.js 1.36 kB
build/interactivity/search.min.js 618 B
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.74 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.11 kB
build/list-reusable-blocks/style-rtl.css 851 B
build/list-reusable-blocks/style.css 849 B
build/media-utils/index.min.js 2.92 kB
build/modules/importmap-polyfill.min.js 12.2 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 2 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 742 B
build/patterns/index.min.js 5.73 kB
build/patterns/style-rtl.css 553 B
build/patterns/style.css 552 B
build/plugins/index.min.js 1.8 kB
build/preferences-persistence/index.min.js 2.05 kB
build/preferences/index.min.js 2.81 kB
build/preferences/style-rtl.css 710 B
build/preferences/style.css 712 B
build/primitives/index.min.js 975 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 1 kB
build/react-i18n/index.min.js 623 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.78 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.73 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.5 kB
build/router/index.min.js 1.79 kB
build/server-side-render/index.min.js 1.96 kB
build/shortcode/index.min.js 1.39 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.72 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.7 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 957 B
build/warning/index.min.js 249 B
build/widgets/style-rtl.css 1.17 kB
build/widgets/style.css 1.17 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

@jasmussen
Copy link
Contributor

A question, can we make it so clicking anywhere on the row selects it? We could keep the pointer cursor for just the checkbox, and have the default cursor remain for just selecting. This would:

  • Not need you to change the hitbox.
  • Be consistent with the list/split view.
  • Potentially allow hold shift and click the last item in the list to select all in between.

@jameskoster
Copy link
Contributor Author

Good question. We can do it, but it would be good to fully explore what the on-row-click action should be. Selection is a good option because it can be applied consistently across all data views.

But there may be an argument to use the action associated with the primary field. In the case of pages, templates, and patterns that would mean taking you to the editor. If that were the case we could remove 'Edit' as a quick action in #59551.

@jameskoster
Copy link
Contributor Author

Pushed a change to try row click = selection. I think it works well, though it is quite easy to mis-click a title and end up in the editor.

@jameskoster
Copy link
Contributor Author

though it is quite easy to mis-click a title and end up in the editor.

Pushed a couple of other tweaks to address this. The a no longer fills the td which reduced the likelihood of misclicks. Also added a text color change on hover to make it more clear that the title has a different behavior on click.

select.mp4

@jameskoster jameskoster changed the title Data views: Increase the 'hitbox' of checkboxes in table layout Data views: Add click-to-select behavior on table rows Mar 13, 2024
@jasmussen
Copy link
Contributor

In testing this, this feels like a solid step forward in terms of the ergonomics of selecting items, as well as unifying the behavior with the List view config. Finally it can open the opportunity for a future shift-click behaviors (click the top, hold shift, click the bottom, to select the range). To that end, I think this works in terms of behavior. I'd think a good next step would be to get a review on the behavior from a wider range.

@jameskoster
Copy link
Contributor Author

Cool. Tagging @andrewhayward as you worked on the original implementation of the click capture.

} ) }
onMouseEnter={ handleMouseEnter }
onMouseLeave={ handleMouseLeave }
onClickCapture={ ( event ) => {
Copy link
Member

Choose a reason for hiding this comment

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

The use of onClickCapture was introduced #59563 following-up similar changes for the grid layout at #59565.

As far as I understand:

  • we wanted to keep the onClick event for the titles (go to editor) while providing a way to select the whole row
  • using CTRL or META keys as modifiers provided a way to tell apart the user's intention

By reducing the title box surface, we have a larger TR area and the different surfaces become clearer targets. So, if we go this route (selecting the row without the modifiers), we could use onClick instead of onClickCapture. No difference that I can see other than a simpler mental model for onClick.

cc @jorgefilipecosta @mcsf in case there's some other context I'm missing. With what I know, I like selecting the whole row on click without the modifiers.

Copy link
Contributor

Choose a reason for hiding this comment

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

Yeah, the greedy onClickCapture approach was justifiable when it was predicated on event.ctrlKey || event.metaKey, otherwise it immediately becomes a blunt tool. Case in point, from the current branch:

Screen.Recording.2024-03-14.at.13.54.55.mov

There are tradeoffs to make here. Some approaches:

  • Simplify, get rid of this trick, expand the title box area, and listen to regular (non captured) click events on the title box. Get rid of the fancy ctrl/meta click behaviour.
  • Keep both side by side: ctrl/meta catches any click on the row, ignoring any underlying elements, while regular clicks with no modifiers will be caught on the title box (but no wider). After very short consideration, this is what I'd try first.
  • Go for the more complex solution without title boxes. For instance:
    • Ctrl/meta-clicks anywhere on the row should be caught at capture time, trigger a selection toggle, and stop event propagation.
    • Regular clicks anywhere on the row will need to consider whether more granular listeners were triggered (i.e. whether the user has clicked on any interactive element inside the row, like a button). There some ways to do this (e.g. inspecting all DOM nodes between event.target and event.currentTarget to find attached listeners), but I don't know how robust they are.

Copy link
Contributor

Choose a reason for hiding this comment

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

Keep both side by side: ctrl/meta catches any click on the row, ignoring any underlying elements, while regular clicks with no modifiers will be caught on the title box (but no wider). After very short consideration, this is what I'd try first.

To clarify what I meant here: have two adjacent handlers:

<tr
  onClickCapture={ e => {
    if (e.ctrlKey || e.metaKey) {
      // Same as before
      e.stopPropagation(); e.preventDefault(); maybeToggle();
    }
  }
>

  ...
  <TitleArea
    onClick={ () => /* regular click handler to toggle */ }
  />

</tr>

@@ -243,10 +250,10 @@
white-space: nowrap;
overflow: hidden;
display: block;
width: 100%;
flex-grow: 0;
Copy link
Member

Choose a reason for hiding this comment

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

Not sure if this happens as a result of this change, but here's what I see for the focus ring:
Captura de ecrã 2024-03-14, às 12 06 26

Copy link
Member

Choose a reason for hiding this comment

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

@jameskoster it sounds like this PR introduced this regression:

Before After
Captura de ecrã 2024-03-25, às 16 38 55 Captura de ecrã 2024-03-25, às 16 38 44

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Oh shoot, apologies I forgot to address this. I'll make a PR.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@andrewhayward
Copy link
Contributor

As per @oandregal's comment, we'd be better off moving this click-to-select behaviour behind a Cmd/Ctrl keypress, in much the same way we do with grid layouts. While it's not destructive to accidentally select the row, it is confusing and fairly unintuitive; it's not a typical table interaction.

} ) }
onMouseEnter={ handleMouseEnter }
onMouseLeave={ handleMouseLeave }
onClickCapture={ ( event ) => {
Copy link
Contributor

Choose a reason for hiding this comment

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

Yeah, the greedy onClickCapture approach was justifiable when it was predicated on event.ctrlKey || event.metaKey, otherwise it immediately becomes a blunt tool. Case in point, from the current branch:

Screen.Recording.2024-03-14.at.13.54.55.mov

There are tradeoffs to make here. Some approaches:

  • Simplify, get rid of this trick, expand the title box area, and listen to regular (non captured) click events on the title box. Get rid of the fancy ctrl/meta click behaviour.
  • Keep both side by side: ctrl/meta catches any click on the row, ignoring any underlying elements, while regular clicks with no modifiers will be caught on the title box (but no wider). After very short consideration, this is what I'd try first.
  • Go for the more complex solution without title boxes. For instance:
    • Ctrl/meta-clicks anywhere on the row should be caught at capture time, trigger a selection toggle, and stop event propagation.
    • Regular clicks anywhere on the row will need to consider whether more granular listeners were triggered (i.e. whether the user has clicked on any interactive element inside the row, like a button). There some ways to do this (e.g. inspecting all DOM nodes between event.target and event.currentTarget to find attached listeners), but I don't know how robust they are.

@mcsf
Copy link
Contributor

mcsf commented Mar 14, 2024

As per @oandregal's comment, we'd be better off moving this click-to-select behaviour behind a Cmd/Ctrl keypress, in much the same way we do with grid layouts. While it's not destructive to accidentally select the row, it is confusing and fairly unintuitive; it's not a typical table interaction.

I'm more on board with this too 👌

@jameskoster
Copy link
Contributor Author

we'd be better off moving this click-to-select behaviour behind a Cmd/Ctrl keypress, in much the same way we do with grid layouts.

Hah, this is how it already works on trunk.

I feel that clicking a row to select is reasonably intuitive (though acknowledge it's subjective), but more importantly it will be an important interaction when the Inspector is accessible from data views (#59689). It would be frustrating to have to click the tiny checkbox every time you wanted to inspect a different entry. It also paves the way for shift+click and cmd+click for multi-selection.

Another motivator here was to have the same selection mechanic as list view where click = selection.

Perhaps it would be better to define all the behaviors in an issue first?

@jasmussen
Copy link
Contributor

jasmussen commented Mar 15, 2024

This is not the most important thing in the world, it's not something we have to solve now, etc, but I wanted to echo Jay and comment on this one:

While it's not destructive to accidentally select the row, it is confusing and fairly unintuitive; it's not a typical table interaction.

Permit me to disagree, I think it's incredibly common behavior, and approaching table-stakes for this type of item-management.

Here's a little prior art. Google drive:

google drive

Dropbox:

dropbox

Onedrive:
onedrive

Figma:
figma

MacOS finder, for good measure:

finder

Outside of being, as I would argue with the above, a fairly common interaction, it's very ergonomic, providing a huge tap target for when you're managing multiple files or items. Finally it opens the doors for shift-range selection tools and ⌘A, in addition to ⌘-click to manually bulk select. I can see this being especially useful in the media library. Both select to insert in a gallery, or select to delete or tag multiple.

@mcsf
Copy link
Contributor

mcsf commented Mar 15, 2024

I pushed the last three commits solely as proofs of concept:

  • e2bf36c: Demo: allow click-on-row with meta/cmd or when selection already active
  • 242966d: Demo: always allow click-on-row, taking care not to catch button clicks
  • 3541f13: Bonus: disable item actions if a selection is already active

Play with these commits as you wish, revert them, etc. I just wanted to illustrate. :) I tried to comment clearly.

@andrewhayward
Copy link
Contributor

Permit me to disagree, I think it's incredibly common behavior, and approaching table-stakes for this type of item-management.

Point taken! Thank you for the multitude of examples 😆

With that being said, a couple of the examples exhibit slightly different behaviour; Google Drive and MacOS Finder, for example, use single click to select, and double click to open. The others nest interactive content, by putting links inside clickable containers, which is not a great interaction design decision, albeit evidently common; even if the row is not semantically interactive, it can be confusing for users who intend to tap the inner target but miss, and equally confusing for users who don't realise the inner target is interactive, tapping it with the intention of actioning the outer target.

Ideally, if we proceed with clickable rows, we would avoid nesting interactive content such that there is only one tap target. I appreciate this isn't 100% possible, with the actions buttons and menu at the end of the row, but something to consider.

Regardless, I will flag that we should ensure text can be selected without triggering the row selection. We can do this by checking the type of the current selection range during the click handler, and bailing if it is Range.

if ( document.getSelection().type === 'Range' ) ...

@jameskoster
Copy link
Contributor Author

Thanks @mcsf! 242966d looks pretty close to me, and hopefully addresses a good portion of @andrewhayward's feedback given the Actions cell is ignored for the purpose of selection.

The title cell is a bit tricky as we need the nested interactivity there. For touch devices might we consider a long-press-to-select behavior? For desktop hopefully the interactivity (hover styles) help there.

I reverted the bonus commit and pushed the text-selection fix.

@jasmussen
Copy link
Contributor

The title cell is a bit tricky as we need the nested interactivity there. For touch devices might we consider a long-press-to-select behavior? For desktop hopefully the interactivity (hover styles) help there.

IMO we don't need the table-clicking behavior on mobile if that's in any way tricky, the checkboxes feel like something we could potentially emphasize there if need be.

@jameskoster
Copy link
Contributor Author

Yup, disabling this interaction on touch devices seems a reasonable place to start.

Copy link
Contributor

@mcsf mcsf left a comment

Choose a reason for hiding this comment

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

(withdrawing my request for changes)

@jameskoster
Copy link
Contributor Author

@andrewhayward any objection to handling the touch-device behaviors in a follow-up? I'm not sure how best to go about that...

@mcsf
Copy link
Contributor

mcsf commented Mar 20, 2024

Let me know if there's anything else I can do to help move this one forward.

@jameskoster
Copy link
Contributor Author

@mcsf thanks. Do you know if we can reliably detect a touch device and disable this behavior accordingly? If it's trivial I think that's the final detail. Otherwise I think we could merge and explore that in a follow-up.

@jasmussen
Copy link
Contributor

jasmussen commented Mar 21, 2024

Do you know if we can reliably detect a touch device and disable this behavior accordingly? If it's trivial I think that's the final detail. Otherwise I think we could merge and explore that in a follow-up.

You can do a CSS-only fix, potentially:

@media (hover: none) {
	.mobile {
		border: 10px solid red;
	}
}

Was fairly solid last I used this.

@jameskoster
Copy link
Contributor Author

The click behavior is js, so I think the logic to disable it would need to also be js?

@jasmussen
Copy link
Contributor

Yes, unless you wanted to look at something featuring pointer-events.

@mcsf
Copy link
Contributor

mcsf commented Mar 21, 2024

@mcsf thanks. Do you know if we can reliably detect a touch device and disable this behavior accordingly? If it's trivial I think that's the final detail. Otherwise I think we could merge and explore that in a follow-up.

@jameskoster: I don't know if this is the prescribed way, but this is what felt right to me: by listening to touchstart events we can detect touch devices, and disable the behaviour for them. See be1856a. Have a go, see if it feels right on both desktop and touch devices. (@andrewhayward: let me know if this feels off to you!)

@jameskoster
Copy link
Contributor Author

That seems to be working well for me, thanks so much :)

@mcsf
Copy link
Contributor

mcsf commented Mar 22, 2024

For completion (or perhaps for my own reference in the future):

After a tip from @jorgefilipecosta, I looked at the pointerType property of pointer events. The issue is that the documentation is a little ambiguous. Only Chrome treats regular click events as pointer events, so only it passes the value event.pointerType: 'mouse'. Meanwhile, that value is undefined in Firefox and Safari. The property is only available in "proper" pointer events like pointerdown.

That means that we can't reliably consolidate everything in a single onClick handler:

// Won't work
<tr onClick={ e => {
  if (e.pointerType !== 'touch') { ... }

So we would need to resort to extra handlers, which I think defeats the purpose of pointerType — I'd rather trust touchstart, as currently implemented.

// Might work, but I feel more confident about `touchstart`
<tr
  onPointerDown={ e => { if (e.pointerType === 'touch') isTouch = true } }
  onClick={ e => if (! isTouch) { ... } }

Copy link
Contributor

@mcsf mcsf left a comment

Choose a reason for hiding this comment

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

@jameskoster: looks ready as far as I'm concerned. Feel free to push that button!

@jameskoster jameskoster merged commit 9beaf48 into trunk Mar 22, 2024
58 checks passed
@jameskoster jameskoster deleted the update/data-views-checkbox-hitbox branch March 22, 2024 15:19
@github-actions github-actions bot added this to the Gutenberg 18.1 milestone Mar 22, 2024
carstingaxion pushed a commit to carstingaxion/gutenberg that referenced this pull request Mar 27, 2024
Co-authored-by: jameskoster <jameskoster@git.wordpress.org>
Co-authored-by: mcsf <mcsf@git.wordpress.org>
Co-authored-by: oandregal <oandregal@git.wordpress.org>
Co-authored-by: jasmussen <joen@git.wordpress.org>
Co-authored-by: andrewhayward <andrewhayward@git.wordpress.org>
anomiex added a commit to Automattic/wp-calypso that referenced this pull request Apr 10, 2024
Prior to WordPress/gutenberg#59803, the `a` inside the
`.dataviews-view-table__primary-field` div occupied the full width of
the div, so when Playwright clicked in the center of the div it would
hit the link.

That PR changed things up a bit, now the `a` is not expanded to fill the
entire div and a click in the middle of the div misses the link, meaning
the test never navigates to the next page as expected.

This updates the logic to click the actual `a` instead of the div.
anomiex added a commit to Automattic/wp-calypso that referenced this pull request Apr 10, 2024
Prior to WordPress/gutenberg#59803, the `a` inside the
`.dataviews-view-table__primary-field` div occupied the full width of
the div, so when Playwright clicked in the center of the div it would
hit the link.

That PR changed things up a bit, now the `a` is not expanded to fill the
entire div and a click in the middle of the div misses the link, meaning
the test never navigates to the next page as expected.

This updates the logic to click the actual `a` instead of the div.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Data Views Work surrounding upgrading and evolving views in the site editor and beyond [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). Needs Design Feedback Needs general design feedback. [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants