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

DataViews: Redesign of filters #58569

Merged
merged 29 commits into from
Feb 7, 2024
Merged

DataViews: Redesign of filters #58569

merged 29 commits into from
Feb 7, 2024

Conversation

ntsekouras
Copy link
Contributor

@ntsekouras ntsekouras commented Feb 1, 2024

What?

Part of: #55100

This PR redesigns the DataViews filters based on: #55100 (comment).

Based on the designs we need a new widget, as we don't have something similar in the @wordpress/components package. In order to give us time to explore a good solution that can satisfy our use cases, the new component is added directly in the DataViews package. It uses some lower level components from @ariakit.

This PR needs polishing(mostly design) and feedback.

Tasks

  • Fix/add e2e tests before merging

Screenshots

Screen.Recording.2024-02-05.at.9.40.09.AM.mov

Testing instructions

  1. In pages that use DataViews(pages, templates, template parts, patterns) ensure that everything works as expected
  2. Check that the primary filters API works as expected
  3. a11y testing

@ntsekouras ntsekouras added [Type] Enhancement A suggestion for improvement. [Feature] DataViews Work surrounding upgrading and evolving views in the site editor and beyond labels Feb 1, 2024
@ntsekouras ntsekouras self-assigned this Feb 1, 2024
Copy link

github-actions bot commented Feb 1, 2024

Size Change: +17 kB (+1%)

Total Size: 1.71 MB

Filename Size Change
build/data/index.min.js 8.93 kB +16 B (0%)
build/edit-site/index.min.js 211 kB +16 kB (+8%) 🔍
build/edit-site/style-rtl.css 15.7 kB +497 B (+3%)
build/edit-site/style.css 15.7 kB +501 B (+3%)
build/editor/index.min.js 61.7 kB +8 B (0%)
build/editor/style-rtl.css 5.42 kB -7 B (0%)
build/editor/style.css 5.42 kB -9 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.22 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.35 kB
build/block-editor/content.css 4.35 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/index.min.js 251 kB
build/block-editor/style-rtl.css 15.5 kB
build/block-editor/style.css 15.5 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/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 280 B
build/block-library/blocks/file/style.css 281 B
build/block-library/blocks/file/view.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 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 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 863 B
build/block-library/blocks/image/editor.css 862 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 2.02 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 505 B
build/block-library/blocks/media-text/style.css 503 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 668 B
build/block-library/blocks/navigation-link/editor.css 669 B
build/block-library/blocks/navigation-link/style-rtl.css 103 B
build/block-library/blocks/navigation-link/style.css 103 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.25 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.24 kB
build/block-library/blocks/navigation/style.css 2.23 kB
build/block-library/blocks/navigation/view.min.js 1.1 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 996 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 614 B
build/block-library/blocks/search/style.css 614 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.49 kB
build/block-library/blocks/social-links/style.css 1.48 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 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.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.3 kB
build/block-library/editor.css 12.3 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 215 kB
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14.7 kB
build/block-library/style.css 14.7 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/blocks/index.min.js 51.6 kB
build/commands/index.min.js 15.5 kB
build/commands/style-rtl.css 921 B
build/commands/style.css 918 B
build/components/index.min.js 226 kB
build/components/style-rtl.css 12 kB
build/components/style.css 12 kB
build/compose/index.min.js 12.6 kB
build/core-commands/index.min.js 2.71 kB
build/core-data/index.min.js 72.7 kB
build/customize-widgets/index.min.js 12.1 kB
build/customize-widgets/style-rtl.css 1.34 kB
build/customize-widgets/style.css 1.33 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 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 25.1 kB
build/edit-post/style-rtl.css 5.66 kB
build/edit-post/style.css 5.66 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.23 kB
build/edit-widgets/style.css 4.23 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.85 kB
build/format-library/style-rtl.css 478 B
build/format-library/style.css 477 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 2.15 kB
build/interactivity/index.min.js 12.9 kB
build/interactivity/navigation.min.js 1.24 kB
build/interactivity/query.min.js 776 B
build/interactivity/router.min.js 1.24 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 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 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 735 B
build/nux/style.css 732 B
build/patterns/index.min.js 5.74 kB
build/patterns/style-rtl.css 540 B
build/patterns/style.css 539 B
build/plugins/index.min.js 1.8 kB
build/preferences-persistence/index.min.js 2.07 kB
build/preferences/index.min.js 2.82 kB
build/preferences/style-rtl.css 698 B
build/preferences/style.css 700 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.72 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 10.4 kB
build/router/index.min.js 1.79 kB
build/server-side-render/index.min.js 1.95 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 2.08 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.8 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/index.min.js 7.21 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

@oandregal
Copy link
Member

Nice start, thanks for working on this 👏

I haven't looked deeply into the changes yet, but I've got one question: is this to be released in 6.5?

If yes, that's great – let's ship this one fast so we can iterate. If, on the contrary, it's deemed not ready, I'd ask to do the changes in a way that they can co-exist with the existing implementation: we don't want to shoot ourselves in the foot and make it harder than necessary to address bug/modifications to the existing implementation if that's still shipping in 6.5.

@ntsekouras
Copy link
Contributor Author

is this to be released in 6.5?

We have one week left to get this in. So I'm hoping yes, but we'd need reviews and designs and a11y feedback.

Copy link

github-actions bot commented Feb 2, 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.

Core SVN

Core Committers: Use this line as a base for the props when committing in SVN:

Props ntsekouras, jameskoster, mciampini, andrewhayward, oandregal.

GitHub Merge commits

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: ntsekouras <ntsekouras@git.wordpress.org>
Co-authored-by: jameskoster <jameskoster@git.wordpress.org>
Co-authored-by: ciampo <mciampini@git.wordpress.org>
Co-authored-by: andrewhayward <andrewhayward@git.wordpress.org>
Co-authored-by: oandregal <oandregal@git.wordpress.org>

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

>
<div className="dataviews-search-widget-filter-combobox__input-wrapper">
<Ariakit.Combobox
autoSelect
Copy link
Contributor Author

@ntsekouras ntsekouras Feb 2, 2024

Choose a reason for hiding this comment

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

I tried to pass SearchControl to render prop here, but there is an issue because Ariakit expects always an event at the onChange callback(destructures from event.target), so we can't use in combination with setValueOnChange prop set to false.

For this reason I copied some html structure and styles from SearchControl, but also placed the icon at the left side.

Copy link
Contributor

@ciampo ciampo Feb 2, 2024

Choose a reason for hiding this comment

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

cc @mirka who has been working on refreshing SearchControl lately (#56524)

Copy link
Contributor

Choose a reason for hiding this comment

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

Maybe there's a way for us to hack around that — ie. something like this?

const HackedSearchControl = ( { onChange, ...props } ) => {
	const [ inputRef, setInputRef ] = useState( null );

	useEffect( () => {
		inputRef?.addEventListener( 'change', onChange );

		return () => {
			inputRef?.removeEventListener( 'change', onChange );
		};
	}, [ inputRef, onChange ] );

	return (
		<SearchControl { ...props } ref={ ( node ) => setInputRef( node ) } />
	);
};


// ... later


<Ariakit.Combobox
	autoSelect
	placeholder={ __( 'Search' ) }
	className="dataviews-search-widget-filter-combobox__input"
	render={ <HackedSearchControl /> }
/>

Haven't tried it on my machine, though — but it could be an idea

f.operator
)
( f ) => f.field === field.id
// &&
Copy link
Contributor Author

Choose a reason for hiding this comment

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

@oandregal can you help me understand the commented check? Is it needed?

Copy link
Member

Choose a reason for hiding this comment

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

It checks the operator in use by the view is one of the available/registered operators. It essentially prevents filters with no operators (or with unknown operators) from being displayed. Operators are a required field in the view.filters, this check enforces that requirement.

Imagine the following situation:

  • We store the filter in the view without operator, assuming the default in the UI is IS.
  • For whatever reason, the UI changes the default to IS NOT. At this point, all the filters that come from the view without operator would have their results inverted (custom views from database, default views provided by WordPress, etc.).

Copy link
Member

Choose a reason for hiding this comment

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

In summary, we still need it :)

Copy link
Member

Choose a reason for hiding this comment

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

This is worth adding as a comment, as it's not immediately clear how it is important.

@jameskoster
Copy link
Contributor

This is exciting to see :)

A couple of UX notes:

  • When you add a filter from the menu, ideally the configration popover for that filter opens immediately and focus is transferred accordingly.
  • When there are no operator options (e.g. Status) we can hide the select.
  • Would it be possible to add some logic which dictates when the search input appears? It's a bit pointless when all available options are visible in the popover, or when there are very few options at all.
  • For secondary filters (e.g. Author) could the button in the popover read "Remove" rather than "Reset"?
  • Single-choice filters should use the radio marker rather than the check. Until we add the "Is any" operator to the Author filter this means both Status & Author would use the radio.

Some of the visuals will need tweaking, but I can probably handle most of that. In the filter chips/buttons would it be possible to wrap the selected values in an element so that we're able to visually differentiate the filter from the value? E.g.:

Status is: Published

@andrewhayward
Copy link
Contributor

andrewhayward commented Feb 2, 2024

This is one of those situations where moving focus is legitimate and useful, putting the user in a place where they can complete the intended action.

moving.focus.when.adding.filter.mov
Something like this would work...

Note: This patch breaks focus on escape for some reason!

diff --git a/packages/dataviews/src/filter-summary.js b/packages/dataviews/src/filter-summary.js
index b6857b60e2..b699447f0c 100644
--- a/packages/dataviews/src/filter-summary.js
+++ b/packages/dataviews/src/filter-summary.js
@@ -9,6 +9,7 @@ import {
 	FlexItem,
 	SelectControl,
 } from '@wordpress/components';
+import { useRef } from '@wordpress/element';
 import { __, sprintf } from '@wordpress/i18n';
 
 /**
@@ -135,13 +136,16 @@ function ResetFilter( { filter, view, onChangeView, filters } ) {
 }
 
 export default function FilterSummary( props ) {
-	const { filter, view } = props;
+	const { filter, view, openOnMount = true } = props;
+	const defaultOpenRef = useRef( openOnMount );
 	const filterInView = view.filters.find( ( f ) => f.field === filter.field );
 	const activeElement = filter.elements.find(
 		( element ) => element.value === filterInView?.value
 	);
 	return (
 		<Dropdown
+			defaultOpen={ defaultOpenRef.current }
+			focusOnMount={ false }
 			contentClassName="dataviews-filter-summary__popover"
 			popoverProps={ { placement: 'bottom-start', role: 'dialog' } }
 			renderToggle={ ( { onToggle } ) => (
diff --git a/packages/dataviews/src/filters.js b/packages/dataviews/src/filters.js
index 2bb6ce7a6c..c12c81e45a 100644
--- a/packages/dataviews/src/filters.js
+++ b/packages/dataviews/src/filters.js
@@ -1,7 +1,7 @@
 /**
  * WordPress dependencies
  */
-import { memo } from '@wordpress/element';
+import { memo, useState } from '@wordpress/element';
 
 /**
  * Internal dependencies
@@ -49,6 +49,8 @@ const Filters = memo( function Filters( { fields, view, onChangeView } ) {
 				} );
 		}
 	} );
+	const visibleFilters = filters.filter( ( filter ) => filter.isVisible );
+	const [ initialFilters ] = useState( visibleFilters );
 
 	const addFilter = (
 		<AddFilter
@@ -60,21 +62,16 @@ const Filters = memo( function Filters( { fields, view, onChangeView } ) {
 	);
 	const filterComponents = [
 		addFilter,
-		...filters.map( ( filter ) => {
-			if ( ! filter.isVisible ) {
-				return null;
-			}
-
-			return (
-				<FilterSummary
-					key={ filter.field }
-					filter={ filter }
-					view={ view }
-					onChangeView={ onChangeView }
-					filters={ filters }
-				/>
-			);
-		} ),
+		...visibleFilters.map( ( filter ) => (
+			<FilterSummary
+				openOnMount={ ! initialFilters.includes( filter ) }
+				key={ filter.field }
+				filter={ filter }
+				view={ view }
+				onChangeView={ onChangeView }
+				filters={ filters }
+			/>
+		) ),
 	];
 
 	if ( filterComponents.length > 1 && view.type !== LAYOUT_LIST ) {
diff --git a/packages/dataviews/src/search-widget.js b/packages/dataviews/src/search-widget.js
index fba875cdc3..14b524caef 100644
--- a/packages/dataviews/src/search-widget.js
+++ b/packages/dataviews/src/search-widget.js
@@ -73,6 +73,8 @@ export default function SearchWidget( { filter, view, onChangeView } ) {
 			>
 				<div className="dataviews-search-widget-filter-combobox__input-wrapper">
 					<Ariakit.Combobox
+						// eslint-disable-next-line jsx-a11y/no-autofocus
+						autoFocus
 						autoSelect
 						placeholder={ __( 'Search' ) }
 						className="dataviews-search-widget-filter-combobox__input"

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.

Thank you for working on this, Nik!

It uses some lower level components from @ariakit, because eventually the goal is to port it under the @wordpress/components package.

I don't think that the whole "popover with filter controls" component has a place in @wordpress/components, given how high-level and specific it is to the Data Views project.

What we should iterate, and then extract if possible, are the individual components — like, potentially, an update to ComboboxControl which is currently not flexible enough to accommodate Data View needs.

packages/dataviews/src/add-filter.js Outdated Show resolved Hide resolved
packages/dataviews/package.json Outdated Show resolved Hide resolved
packages/dataviews/src/with-separators.js Outdated Show resolved Hide resolved
packages/dataviews/src/filter-summary.js Outdated Show resolved Hide resolved
packages/dataviews/src/search-widget.js Outdated Show resolved Hide resolved
packages/dataviews/src/search-widget.js Outdated Show resolved Hide resolved
packages/dataviews/src/search-widget.js Outdated Show resolved Hide resolved
Copy link

github-actions bot commented Feb 3, 2024

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

@ntsekouras
Copy link
Contributor Author

Regarding the focus on the new filter: (@andrewhayward )

Something like this would work...

Unfortunately this wouldn't work, because we also have custom views, which could have more filters saved. What this means is that initially we show the filters based on whether they are primary or not and then we update the view with the saved ones. That can result on opening the filter's dropdown, when they shouldn't.

I explored keeping the info for opening on mount in store, with dispatching actions on the menu items that add a filter.

@jameskoster
Copy link
Contributor

I pushed a couple of tweaks, mostly cosmetic to get the filter config appearance closer to the new dropdown design.

@ntsekouras A couple other detail to address;

  • Secondary filter buttons should ideally appear after primary filter buttons, currently it's the other way around.
  • When you select an item from the filter menu focus remains on the search input, I think it should be transferred to the chosen item.
    • Probably related, hovering an item transfers focus to the search input, best explained with a (see below).
  • A stretch: it might be good to disable filters when there's only one option. E.g. filtering pages by author is pointless on a site with only a single author.
focus.mp4

@oandregal
Copy link
Member

I tested a few flows via the keyboard (including filtering from columns, primary/secondary, etc.) and this works nicely. This is one thing I ran into: the first time you add a filter, there is a focus loss after you close the search widget (either via ESC or by clicking remove):

Gravacao.do.ecra.2024-02-05.as.18.07.09.mov
Gravacao.do.ecra.2024-02-05.as.18.06.18.mov

@oandregal
Copy link
Member

Some general feedback about the interactions (not blocking, can be follow-ups if we want to do them).

Have we explored adding the dynamic filters after the "Add Filter" & "Reset Filter" buttons? It could be: "+Add filter" > "Reset filters" > "Primary filters" > "Secondary filters". This provides a stable and short length for common operations: reset & add. In situations with more filters (say, 3 or 5), users would have to tab them all before they can reset them or add a new one.

One thing I miss from the existing implementation is how quickly selecting an option was. This requires a few more jumps: click to add filter, tabs to go to search, arrow down to select item. I'd love if we could make it more streamlined for keyboard. Some suggestions:

  • The focus could be placed on the "search box" upon opening the search widget. Search feels like the "main starting point" while changing the operator (is/is not) is secondary.
  • Could the option list be part of the tab flow as a single tab stop? Right now, the options are reachable by hitting "arrow down" twice when the focus is on the search.

@oandregal
Copy link
Member

Also, in testing this PR, I've noticed that the primary filter PR was merged leaving "status" as primary for pages. #58682 removes it.

@oandregal
Copy link
Member

oandregal commented Feb 5, 2024

I've also noticed that there is no "Reset button" for the list layout. (enable the experiment, go to Pages > Manage all pages and switch to list layout).

@ntsekouras
Copy link
Contributor Author

I believe this is something that could land in order to be included in 6.5 and iterate small issues/fixes if we need to.

Could we only show the search when there are more than X options? It's a bit distracting otherwise.

@jameskoster I think this is the remaining request of yours, that I'd like to do in a follow up and explore the best way to do it, as it's not as simple as hiding the combobox. We would need a different a11y pattern for that(probably lisbox) and might need some discussion/exploration first. What do you think?

}
}

.dataviews-search-widget-filter-combobox-list {
Copy link
Member

@oandregal oandregal Feb 7, 2024

Choose a reason for hiding this comment

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

I'd like us to have a hierarchical/structured naming schema for dataviews. Something like .dataviews-component-subcomponent that resulted in an obvious name for this like .dataviews-filters-search-*, etc. At the moment, it's very ad-hoc.

It'd be great if at least the names introduced in this PR followed the same pattern. If it's too much to ask, we should address afterwards – it's not something we cannot change.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

That sounds great to do. @oandregal is this something you can do in a follow up? Alternatively I will do in the next days for 6.5

{ canAddFilter && (
<DropdownMenuGroup>
<DropdownMenuItem
prefix={ <Icon icon={ funnel } /> }
Copy link
Member

Choose a reason for hiding this comment

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

Shouldn't we be consistent and use the + icon here as well? Funnel made sense when it was everywhere the same.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Copy link
Member

@oandregal oandregal left a comment

Choose a reason for hiding this comment

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

Nice work here!

It's a nice refactor for the filter UI 👏 There are some flows/interactions that could be streamlined to improve the add/reset filter user actions, but this provides a good base to work from: #58569 (comment)

I haven't found any blockers, though given the size of the PR I've probably missed little opportunities to improve. Let's get this in 6.5 and iterate.

@jameskoster
Copy link
Contributor

jameskoster commented Feb 7, 2024

@ntsekouras that seems okay to explore separately. The other request was this one:

it might be good to disable filters when there's only one option. E.g. filtering pages by author is pointless on a site with only a single author.

Also fine to handle separately, but I wanted to make sure it was noted.

Most importantly; if we merge this for 6.5 we'll need to update the designs for the filter chips. I shared a concept for that here yesterday. Do you think that would be feasible?

Edit: I'm not saying we need to do that in this PR, but it would be a shame for the new design to land in 6.5 without it.

@ntsekouras ntsekouras merged commit b8bbcd5 into trunk Feb 7, 2024
60 of 61 checks passed
@ntsekouras ntsekouras deleted the redesign/dataviews-filters branch February 7, 2024 18:40
@github-actions github-actions bot added this to the Gutenberg 17.7 milestone Feb 7, 2024
@ntsekouras
Copy link
Contributor Author

Thanks for all the help here! I landed it and let's follow up quickly with the refinements.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] DataViews Work surrounding upgrading and evolving views in the site editor and beyond [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants