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: update filter component #56110

Merged
merged 12 commits into from
Nov 22, 2023
Merged

DataViews: update filter component #56110

merged 12 commits into from
Nov 22, 2023

Conversation

oandregal
Copy link
Member

@oandregal oandregal commented Nov 14, 2023

Part of #55083
Related #55100

What?

Updates the filter component to use a Dropdown instead of a SelectControl.

Gravacao.do.ecra.2023-11-20.as.14.52.00.mov

Why?

Implement the design mockups.

How?

Updates the InFilter component to use a Dropdown.

Testing Instructions

  • Enable the "admin views" experiment and visit "Appareance > Editor > Pages". Click on "Manage all pages".
  • View and interact with the filters.

Follow-ups

  • Add "not in" operation.
  • Multiselection.
  • Allow removing the filter individually.
  • Update to use ariakit components.

@oandregal oandregal self-assigned this Nov 14, 2023
@oandregal oandregal added [Status] In Progress Tracking issues with work in progress [Type] Feature New feature to highlight in changelogs. [Feature] DataViews Work surrounding upgrading and evolving views in the site editor and beyond labels Nov 14, 2023
Copy link

github-actions bot commented Nov 14, 2023

Size Change: -19 B (0%)

Total Size: 1.7 MB

Filename Size Change
build/edit-site/index.min.js 208 kB -19 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 964 B
build/annotations/index.min.js 2.71 kB
build/api-fetch/index.min.js 2.29 kB
build/autop/index.min.js 2.11 kB
build/blob/index.min.js 590 B
build/block-directory/index.min.js 7.25 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.29 kB
build/block-editor/content.css 4.28 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-editor/index.min.js 247 kB
build/block-editor/style-rtl.css 15.7 kB
build/block-editor/style.css 15.7 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 138 B
build/block-library/blocks/audio/theme.css 138 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 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 633 B
build/block-library/blocks/button/style.css 632 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.7 kB
build/block-library/blocks/cover/style.css 1.69 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 98 B
build/block-library/blocks/details/style.css 98 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 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 320 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 229 B
build/block-library/blocks/form-input/editor.css 228 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 343 B
build/block-library/blocks/form-submission-notification/editor.css 342 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 452 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 957 B
build/block-library/blocks/gallery/editor.css 962 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 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 340 B
build/block-library/blocks/html/editor.css 341 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 1.61 kB
build/block-library/blocks/image/style.css 1.6 kB
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/image/view.min.js 2.05 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 671 B
build/block-library/blocks/navigation-link/editor.css 672 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 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 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.27 kB
build/block-library/blocks/navigation/style.css 2.26 kB
build/block-library/blocks/navigation/view.min.js 1.07 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 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-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 345 B
build/block-library/blocks/post-featured-image/style.css 345 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 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/pullquote/theme-rtl.css 168 B
build/block-library/blocks/pullquote/theme.css 168 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 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/style-rtl.css 312 B
build/block-library/blocks/query/style.css 308 B
build/block-library/blocks/query/view.min.js 637 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 613 B
build/block-library/blocks/search/style.css 613 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 471 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 329 B
build/block-library/blocks/shortcode/editor.css 329 B
build/block-library/blocks/site-logo/editor-rtl.css 760 B
build/block-library/blocks/site-logo/editor.css 760 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.45 kB
build/block-library/blocks/social-links/style.css 1.45 kB
build/block-library/blocks/spacer/editor-rtl.css 359 B
build/block-library/blocks/spacer/editor.css 359 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 432 B
build/block-library/blocks/table/editor.css 432 B
build/block-library/blocks/table/style-rtl.css 646 B
build/block-library/blocks/table/style.css 645 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 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 191 B
build/block-library/blocks/video/style.css 191 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 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/editor-rtl.css 12.5 kB
build/block-library/editor.css 12.4 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 212 kB
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14.5 kB
build/block-library/style.css 14.5 kB
build/block-library/theme-rtl.css 700 B
build/block-library/theme.css 705 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51.5 kB
build/commands/index.min.js 15.5 kB
build/commands/style-rtl.css 947 B
build/commands/style.css 942 B
build/components/index.min.js 256 kB
build/components/style-rtl.css 12 kB
build/components/style.css 12 kB
build/compose/index.min.js 12.7 kB
build/core-commands/index.min.js 2.72 kB
build/core-data/index.min.js 71.9 kB
build/customize-widgets/index.min.js 12.1 kB
build/customize-widgets/style-rtl.css 1.43 kB
build/customize-widgets/style.css 1.43 kB
build/data-controls/index.min.js 651 B
build/data/index.min.js 8.87 kB
build/date/index.min.js 17.9 kB
build/deprecated/index.min.js 462 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.68 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 35.8 kB
build/edit-post/style-rtl.css 7.58 kB
build/edit-post/style.css 7.57 kB
build/edit-site/style-rtl.css 14.3 kB
build/edit-site/style.css 14.3 kB
build/edit-widgets/index.min.js 17.2 kB
build/edit-widgets/style-rtl.css 4.65 kB
build/edit-widgets/style.css 4.65 kB
build/editor/index.min.js 46.9 kB
build/editor/style-rtl.css 3.66 kB
build/editor/style.css 3.66 kB
build/element/index.min.js 4.87 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.76 kB
build/format-library/style-rtl.css 577 B
build/format-library/style.css 577 B
build/hooks/index.min.js 1.57 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.61 kB
build/interactivity/index.min.js 11.4 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.76 kB
build/keycodes/index.min.js 1.9 kB
build/list-reusable-blocks/index.min.js 2.11 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 964 B
build/nux/index.min.js 2.01 kB
build/nux/style-rtl.css 775 B
build/nux/style.css 771 B
build/patterns/index.min.js 4.83 kB
build/patterns/style-rtl.css 567 B
build/patterns/style.css 566 B
build/plugins/index.min.js 1.81 kB
build/preferences-persistence/index.min.js 1.85 kB
build/preferences/index.min.js 1.26 kB
build/primitives/index.min.js 994 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 988 B
build/react-i18n/index.min.js 631 B
build/react-refresh-entry/index.min.js 9.46 kB
build/react-refresh-runtime/index.min.js 6.78 kB
build/redux-routine/index.min.js 2.71 kB
build/reusable-blocks/index.min.js 2.76 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 9.96 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.4 kB
build/style-engine/index.min.js 1.98 kB
build/token-list/index.min.js 587 B
build/url/index.min.js 3.83 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 967 B
build/warning/index.min.js 259 B
build/widgets/index.min.js 7.18 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

@oandregal
Copy link
Member Author

oandregal commented Nov 15, 2023

Ready to receive feedback here. It's almost there, though there are some issues to fix (see TODO section).

@oandregal oandregal mentioned this pull request Nov 15, 2023
26 tasks
@jameskoster
Copy link
Contributor

Nice! The dropdown menu is working well.

In terms of a11y buttons should generally describe what will happen on click which isn't how this is working currently. I wonder if a label/tooltip that says something like "Change status filter" would be satisfactory. It'd be good to get @andrewhayward's thoughts on this.

Appreciate the design is still being worked on but noticed a detail that could be easily overlooked: As the filter button widths increase the chevron icon seems to shrink:

Screenshot 2023-11-16 at 09 52 15

I know this is most likely follow-up territory but leaving a note anyway; let's update the status filter operator so that you can select multiple statuses. Let me know if I should open an issue for that.

@oandregal
Copy link
Member Author

Appreciate the design is still being worked on but noticed a detail that could be easily overlooked: As the filter button widths increase the chevron icon seems to shrink:

Yeah, I've noticed that too. This also happens in trunk for the AddFilter and the ViewActions buttons (for ViewActions it happens later, presumably because the container HStack shrinks later as well):

Gravacao.do.ecra.2023-11-16.as.13.19.32.mov

I'm going to ping @ciampo for thoughts. I've tried setting the iconSize prop of the button, but the icons are still resized.

@andrewhayward
Copy link
Contributor

In terms of a11y buttons should generally describe what will happen on click which isn't how this is working currently. I wonder if a label/tooltip that says something like "Change status filter" would be satisfactory.

This is a tricky one, with no clear and obvious solution. As @jameskoster points out, buttons should ideally have a name that indicates their purpose. We could use aria-label to override the visible name...

<button aria-label="Author" ...>Author is Person</button>

...but that brings its own issues, as ideally the visible label and accessible name should match.

We could consider making these comboboxes, which have a separate label and value, and are probably more appropriate for what the button does...

<button aria-label="Author" role="combobox" ...>Person</button>

...but again, we'd have labelling issues, particularly because we would no longer have a visible label.

We could go back to something similar to the first iteration...

<span class="wrapper">
  <label for="combobox">Author</label> is
  <button id="combobox" role="combobox" ...>Person</button>
</span>

...styling the .wrapper to look like one unified widget, putting in appropriate event handlers, etc. But that then gives us translation issues. Ugh.

Definitely needs to experimentation and testing.

@andrewhayward
Copy link
Contributor

I'm going to ping @ciampo for thoughts. I've tried setting the iconSize prop of the button, but the icons are still resized.

I have a feeling this issue is linked to these min-width definitions:

export const ItemsRow = css`
> * {
min-width: 0;
}
`;

&.has-icon {
padding: 6px; // Works for 24px icons. Smaller icons are vertically centered by flex alignments.
// Icon buttons are square.
min-width: $button-size;
justify-content: center;

If we remove/override those, things start to look a little more coherent...

A toolbar with a search field, and several buttons, some with icons.

@youknowriad
Copy link
Contributor

I think it would be good to check what other tools are doing, this pattern is common. For instance what's the story of these controls in notion or GitHub.

@ntsekouras
Copy link
Contributor

ntsekouras commented Nov 16, 2023

As the filter button widths increase the chevron icon seems to shrink:

I have a feeling this issue is linked to these min-width definitions:

This is the issue yes. svgs need to have a min-width set or else the browser will set auto by default. Of course in our case, we override it.

Regarding the other spacing issues, I noticed that we don't need to wrap ViewActions with an HStack and we should make a design decision about what happens when we have many active filters. Some HStacks should have flex-wrap: wrap and we should decide where the add filter and reset button should be placed in this scenario, which will be a really common one.

@jameskoster
Copy link
Contributor

jameskoster commented Nov 16, 2023

Buttons and divs with dialog role seem quite common. Github uses details and summary which is an interesting approach.

Perhaps another idea would be a separate button with its own label:

Screenshot 2023-11-16 at 17 27 18

But that seems sub-optimal as it's adding visual noise, and is a smaller click target.

Comment on lines 19 to 21
const { DropdownMenuV2, DropdownMenuItemV2, DropdownMenuSeparatorV2 } = unlock(
componentsPrivateApis
);
Copy link
Contributor

@ciampo ciampo Nov 17, 2023

Choose a reason for hiding this comment

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

Could you try to use the DrodpdownMenuV2Ariakit component? The DropdownMenuV2 component is likely going to removed soon.

(also, these names are all temporary, it will improve once I'll delete DropdownMenuV2)

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 tried, and left some comments at #56110 (comment)

activeElement.label
)
: filter.name }
<Icon icon={ chevronDown } />
Copy link
Contributor

Choose a reason for hiding this comment

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

Have you tried using the icon prop on the Button component? Would that make any difference?

Copy link
Contributor

Choose a reason for hiding this comment

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

Something like this could work:

<Button icon={chevronDown} iconPosition="right" text={...} />

Although:

  • there seems to be a bug in the button component in recognizing where the button is icon-only or has text too
  • I don't like the "right" keyword ("inline-end" would be better)
  • in general, I prefer composition using children

So, I think that the current approach is better.

Comment on lines 49 to 55
<DropdownMenuItemV2
key={ element.value }
suffix={
activeElement?.value === element.value && (
<Icon icon={ check } />
)
}
Copy link
Contributor

Choose a reason for hiding this comment

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

There are dedicated dropdown menu items for checkboxes and radio, which already take care of semantics and check icons — see these two examples for the new DropdownMenuV2Ariakit component:

And related code:

export const WithCheckboxes: StoryFn< typeof DropdownMenu > = ( props ) => {
const [ isAChecked, setAChecked ] = useState( false );
const [ isBChecked, setBChecked ] = useState( true );
const [ multipleCheckboxesValue, setMultipleCheckboxesValue ] = useState<
string[]
>( [ 'b' ] );
const onMultipleCheckboxesCheckedChange: React.ComponentProps<
typeof DropdownMenuCheckboxItem
>[ 'onChange' ] = ( e ) => {
setMultipleCheckboxesValue( ( prevValues ) => {
if ( prevValues.includes( e.target.value ) ) {
return prevValues.filter( ( val ) => val !== e.target.value );
}
return [ ...prevValues, e.target.value ];
} );
};
return (
<DropdownMenu { ...props }>
<DropdownMenuGroup>
<DropdownMenuGroupLabel>
Individual, uncontrolled checkboxes
</DropdownMenuGroupLabel>
<DropdownMenuCheckboxItem
name="checkbox-individual-uncontrolled-a"
value="a"
>
Checkbox item A (initially unchecked)
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
name="checkbox-individual-uncontrolled-b"
value="b"
defaultChecked
>
Checkbox item B (initially checked)
</DropdownMenuCheckboxItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuGroupLabel>
Individual, controlled checkboxes
</DropdownMenuGroupLabel>
<DropdownMenuCheckboxItem
name="checkbox-individual-controlled-a"
value="a"
checked={ isAChecked }
onChange={ ( e ) => setAChecked( e.target.checked ) }
>
Checkbox item A
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
name="checkbox-individual-controlled-b"
value="b"
checked={ isBChecked }
onChange={ ( e ) => setBChecked( e.target.checked ) }
>
Checkbox item B (initially checked)
</DropdownMenuCheckboxItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuGroupLabel>
Multiple, uncontrolled checkboxes
</DropdownMenuGroupLabel>
<DropdownMenuCheckboxItem
name="checkbox-multiple-uncontrolled"
value="a"
>
Checkbox item A (initially unchecked)
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
name="checkbox-multiple-uncontrolled"
value="b"
defaultChecked
>
Checkbox item B (initially checked)
</DropdownMenuCheckboxItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuGroupLabel>
Multiple, controlled checkboxes
</DropdownMenuGroupLabel>
<DropdownMenuCheckboxItem
name="checkbox-multiple-controlled"
value="a"
checked={ multipleCheckboxesValue.includes( 'a' ) }
onChange={ onMultipleCheckboxesCheckedChange }
>
Checkbox item A (initially unchecked)
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
name="checkbox-multiple-controlled"
value="b"
checked={ multipleCheckboxesValue.includes( 'b' ) }
onChange={ onMultipleCheckboxesCheckedChange }
>
Checkbox item B (initially checked)
</DropdownMenuCheckboxItem>
</DropdownMenuGroup>
</DropdownMenu>
);
};
WithCheckboxes.args = {
...Default.args,
};
export const WithRadios: StoryFn< typeof DropdownMenu > = ( props ) => {
const [ radioValue, setRadioValue ] = useState( 'two' );
const onRadioChange: React.ComponentProps<
typeof DropdownMenuRadioItem
>[ 'onChange' ] = ( e ) => setRadioValue( e.target.value );
return (
<DropdownMenu { ...props }>
<DropdownMenuGroup>
<DropdownMenuGroupLabel>
Uncontrolled radios
</DropdownMenuGroupLabel>
<DropdownMenuRadioItem name="radio-uncontrolled" value="one">
Radio item 1
</DropdownMenuRadioItem>
<DropdownMenuRadioItem
name="radio-uncontrolled"
value="two"
defaultChecked
>
Radio item 2 (initially checked)
</DropdownMenuRadioItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuGroupLabel>
Controlled radios
</DropdownMenuGroupLabel>
<DropdownMenuRadioItem
name="radio-controlled"
value="one"
checked={ radioValue === 'one' }
onChange={ onRadioChange }
>
Radio item 1
</DropdownMenuRadioItem>
<DropdownMenuRadioItem
name="radio-controlled"
value="two"
checked={ radioValue === 'two' }
onChange={ onRadioChange }
>
Radio item 2 (initially checked)
</DropdownMenuRadioItem>
</DropdownMenuGroup>
</DropdownMenu>
);
};
WithRadios.args = {
...Default.args,
};

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 switched to DropdownMenuCheckboxItem at 0bc02b0, thanks.

Tried the new Ariakit ones (203fb3f and then reverted 6649de3):

  • the radio doesn't allow having a "non-checked" state
  • the checkbox performs the same as the current one, though there's a subtle style different when the element is focused, so I think it's best to update all existing dropdowns at once (I can help with this):
V2 V2Ariakit
Captura de ecrã 2023-11-20, às 14 13 24 Captura de ecrã 2023-11-20, às 14 12 06

Copy link
Contributor

Choose a reason for hiding this comment

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

Thank you for the feedback!

the radio doesn't allow having a "non-checked" state

Regarding the radios, could be more specific?

  • If you mean that the component can't be initially rendered with no selection, that is probably a bug
  • If, instead, you mean that once a radio item is selected, it's not possible to "un-select" it, then that's by design (see this comment for more info). The correct approach is then to either switch to checkboxes (in case more than one item can be selected at the same time), or to add a "None" (or any other label) additional menu item.

the checkbox performs the same as the current one, though there's a subtle style different when the element is focused, so I think it's best to update all existing dropdowns at once

Makes sense. FYI I've been working on applying the latest design feedback to the ariakit version (the radix version is no longer maintained and scheduled for removal as soon as all usages are migrated)

(I can help with this)

Thank you!

Copy link
Member Author

Choose a reason for hiding this comment

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

If, instead, you mean that once a radio item is selected, it's not possible to "un-select" it, then that's by design (see this comment for more #55625 (comment)). The correct approach is then to either switch to checkboxes (in case more than one item can be selected at the same time), or to add a "None" (or any other label) additional menu item.

It was this. Thanks for clarifying how it works. I've lost track in which PR/issue I saw this mockup, but I saw something like this:

  • filters that allow multiselection would use a check
  • filters that only allow a single item being selected would use a radio

Radios working as you mentioned, we need to clarify the expectations for them. I'm now working on adding multi-selection support at #56468 so I'll ask design there (will cc you for awareness, but no need to respond!).

Copy link
Member Author

Choose a reason for hiding this comment

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

follow-up #56468 (comment)

@ciampo
Copy link
Contributor

ciampo commented Nov 17, 2023

I'm going to ping @ciampo for thoughts. I've tried setting the iconSize prop of the button, but the icons are still resized.

I see a few things happening:

  • the buttons themselves are being resized as the viewport gets smaller. As the buttons are children of HStack, and HStack implements a flexbox layout, if we don't want them to be residex, we could add something like flex-shrink: 0 on those buttons. Although we should probably first understand what kind of responsive layout we want to have first.
  • Regarding the icon resizing, adding flex-shrink: 0 to the <Icon /> component should also fix it (for the same reason above, since Button is also a flexbox container)

The DropdownMenuItem component cannot be disabled

You should be able to set the disabled prop of the menu item component. You can see an example of a disabled menu item for the new experimental DropdownMenuV2Ariakit component in the default storybook example

@oandregal oandregal added [Type] Experimental Experimental feature or API. and removed [Type] Feature New feature to highlight in changelogs. labels Nov 17, 2023
@oandregal
Copy link
Member Author

oandregal commented Nov 20, 2023

Fixed the shrinking icons for filters at 98f88e5 using Marko's suggestion (flexShrink: 0).

@oandregal
Copy link
Member Author

oandregal commented Nov 20, 2023

To control scope and ship this faster, I'd like to work on the following features as follow-ups:

  • Add "not in" operation.
  • Multiselection.
  • Allow removing the filter individually from the top-level and from the columns.
  • Update everything to use ariakit components (note I've set this up in a way c717cf6 that the change would be mostly a one-liner – e.g.: c717cf6).

Considering those follow-ups, what's missing in this PR to be merged?

Gravacao.do.ecra.2023-11-20.as.14.52.00.mov

@oandregal oandregal removed the [Status] In Progress Tracking issues with work in progress label Nov 20, 2023
@jameskoster
Copy link
Contributor

In terms of design we're looking good, but I'd consider multi-selection and a11y improvements as high-prio follow-ups.

@oandregal
Copy link
Member Author

a11y improvements

Are you thinking about the labels for a11y improvements? Or is any other thing that I've missed? I want to make sure everything is listed at #55100

@jameskoster
Copy link
Contributor

Are you thinking about the #56110 (comment) for a11y improvements?

Yeah 👍

@oandregal
Copy link
Member Author

ok. The advantage of this landing in the current state is that those features can be parallelized: @andrewhayward can help with the labels issue while I work on multiselection, for example :)

For the record, I see multiselection and "not in" filter as high priority, as they affect the API: we may want to create a dataviews package for people to tinker with, and I'd like the API as settled as possible by then.

Copy link
Contributor

@jameskoster jameskoster left a comment

Choose a reason for hiding this comment

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

Happy to approve for design based on that plan.

@oandregal oandregal merged commit a791158 into trunk Nov 22, 2023
51 checks passed
@oandregal oandregal deleted the update/in-filter-component branch November 22, 2023 09:39
@github-actions github-actions bot added this to the Gutenberg 17.2 milestone Nov 22, 2023
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] Experimental Experimental feature or API.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants