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

UnitControl: Revamp support for changing unit by typing #39303

Merged
merged 19 commits into from
Jun 21, 2023

Conversation

stokesman
Copy link
Contributor

@stokesman stokesman commented Mar 9, 2022

What?

Revamps the type-to-change-units feature in UnitControl and removes it's dependency on the isPressEnterToChange prop being true. Also removes BoxControl’s defaulting of isPressEnterToChange to true in order for it to send changes instantaneously (as opposed to now how it waits for either ENTER key press or a blur event).

Why?

Betters UX consistency in regard to inputs that produce changes instantly. Unlike all other text inputs in Gutenberg, BoxControl-based ones do not produce changes upon input. It seems the only reason for this difference is to enable the type-to-change-units feature which requires it. With this PR, the feature works even when the mode of these controls set to instantaneous (isPressEnterToChange={ false })

The feature itself may also be found to work better but testing will tell. It's new implementation is certainly less complex and better from a maintenance perspective.

Related:

How?

  • Removal of the logic that currently supports the feature.
  • Addition of simpler logic that merely moves focus to the unit select when a key that matches the first character of a unit.
  • Change of the default isPressEnterToChange of BoxControl to false.

Testing Instructions

  1. Play with a UnitControl in Storybook or Gutenberg.
  2. Verify that the typing a unit from the text input changes the units.

Screenshots or screencast

switch-units.mp4

@stokesman stokesman added [Type] Enhancement A suggestion for improvement. [Package] Components /packages/components labels Mar 9, 2022
@github-actions
Copy link

github-actions bot commented Mar 9, 2022

Size Change: -40 B (0%)

Total Size: 1.22 MB

Filename Size Change
build/components/index.min.js 223 kB -40 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/admin-manifest/index.min.js 1.24 kB
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.49 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/index.min.js 149 kB
build/block-editor/style-rtl.css 15.4 kB
build/block-editor/style.css 15.4 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 65 B
build/block-library/blocks/archives/style.css 65 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 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 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 59 B
build/block-library/blocks/avatar/style.css 59 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 445 B
build/block-library/blocks/button/editor.css 445 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 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 406 B
build/block-library/blocks/columns/style.css 406 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-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 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-query-loop/editor-rtl.css 95 B
build/block-library/blocks/comments-query-loop/editor.css 95 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.56 kB
build/block-library/blocks/cover/style.css 1.56 kB
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 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 961 B
build/block-library/blocks/gallery/editor.css 964 B
build/block-library/blocks/gallery/style-rtl.css 1.51 kB
build/block-library/blocks/gallery/style.css 1.51 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 333 B
build/block-library/blocks/group/editor.css 333 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 529 B
build/block-library/blocks/image/style.css 535 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 447 B
build/block-library/blocks/latest-posts/style.css 446 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 493 B
build/block-library/blocks/media-text/style.css 490 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 708 B
build/block-library/blocks/navigation-link/editor.css 706 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/style-rtl.css 1.93 kB
build/block-library/blocks/navigation/style.css 1.92 kB
build/block-library/blocks/navigation/view.min.js 2.85 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 363 B
build/block-library/blocks/page-list/editor.css 363 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 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 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/style-rtl.css 446 B
build/block-library/blocks/post-comments-form/style.css 446 B
build/block-library/blocks/post-comments/style-rtl.css 521 B
build/block-library/blocks/post-comments/style.css 521 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 323 B
build/block-library/blocks/post-template/style.css 323 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 370 B
build/block-library/blocks/pullquote/style.css 370 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 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 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 140 B
build/block-library/blocks/separator/editor.css 140 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 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 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 759 B
build/block-library/blocks/site-logo/editor.css 759 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 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 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 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 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 149 B
build/block-library/blocks/template-part/editor.css 149 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 934 B
build/block-library/common.css 932 B
build/block-library/editor-rtl.css 10.1 kB
build/block-library/editor.css 10.1 kB
build/block-library/index.min.js 174 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 11.3 kB
build/block-library/style.css 11.3 kB
build/block-library/theme-rtl.css 689 B
build/block-library/theme.css 694 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 46.9 kB
build/components/style-rtl.css 14.9 kB
build/components/style.css 14.9 kB
build/compose/index.min.js 11.2 kB
build/core-data/index.min.js 14.5 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.39 kB
build/customize-widgets/style.css 1.39 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.64 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.58 kB
build/edit-navigation/index.min.js 15.8 kB
build/edit-navigation/style-rtl.css 4.04 kB
build/edit-navigation/style.css 4.05 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 29.6 kB
build/edit-post/style-rtl.css 7.06 kB
build/edit-post/style.css 7.06 kB
build/edit-site/index.min.js 46.8 kB
build/edit-site/style-rtl.css 7.77 kB
build/edit-site/style.css 7.75 kB
build/edit-widgets/index.min.js 16.3 kB
build/edit-widgets/style-rtl.css 4.4 kB
build/edit-widgets/style.css 4.39 kB
build/editor/index.min.js 38.4 kB
build/editor/style-rtl.css 3.71 kB
build/editor/style.css 3.71 kB
build/element/index.min.js 4.29 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.94 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.12 kB
build/nux/style-rtl.css 751 B
build/nux/style.css 749 B
build/plugins/index.min.js 1.98 kB
build/preferences/index.min.js 1.2 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 611 B
build/react-i18n/index.min.js 704 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.2 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.99 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.21 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

@@ -228,26 +177,20 @@ function UnitControl(
<Root className="components-unit-control-wrapper" style={ style }>
<ValueInput
aria-label={ label }
type={ isPressEnterToChange ? 'text' : 'number' }
Copy link
Contributor Author

@stokesman stokesman Mar 10, 2022

Choose a reason for hiding this comment

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

As far as I can tell the use of 'text' is only to allow input of any character in Chrome (other common browsers don't limit input). With this PR that's no longer a concern. Removing this will default type to 'number' and have the possible benefit of easier validation since text inputs don't factor min, max, or step into validity.

Copy link
Contributor

Choose a reason for hiding this comment

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

As far as I can tell the use of 'text' is only to allow input of any character in Chrome

This is an interesting change, to the point that I'd almost split it to a separate PR so that we can focus on testing it in isolation - WDYT @mirka ?

Copy link
Member

Choose a reason for hiding this comment

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

Yeah, let's test it separately 👍

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I've reverted that from this PR but while working on the paste handling (in #40168 ) I found that robust/conventional support will require that the type be text. I left a review comment on that PR that may help elucidate.

@stokesman stokesman force-pushed the try/unit-control-alt-unit-switching branch 4 times, most recently from e8d4927 to 594c5c4 Compare March 17, 2022 04:05
@stokesman stokesman force-pushed the try/unit-control-alt-unit-switching branch from 594c5c4 to 42eb734 Compare March 21, 2022 17:51
@stokesman stokesman changed the title Try an alternate way to switch units from the text input of UnitControl Try defaulting BoxControl to send changes upon input Mar 21, 2022
@stokesman
Copy link
Contributor Author

stokesman commented Mar 21, 2022

I'm not soliciting code reviews since this first needs vetting from a UX perspective. It would be awesome to have some folks test this out. I think @andrewserong and @aaronrobertshaw may be interested since they've made related issues/PRs; @ciampo and @mirka since this is components territory.

Gutenberg.run is functioning again (as of this comment) so this PR can be tested there. To save a couple seconds, here's a Group block to that can be pasted to test with its padding BoxControl:

<!-- wp:group {"backgroundColor":"secondary"} -->
<div class="wp-block-group has-secondary-background-color has-background"></div>
<!-- /wp:group -->

Probably the first potential stopper—is it verboten to move focus in this manner?

Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

Hey @stokesman , thank you for working on this exploration!

If we agreed on moving forward with the changes in this PR, what usecases are left for keeping the isPressEnterToChange prop on UnitControl / NumerControl / InputControl?

packages/components/src/box-control/test/index.js Outdated Show resolved Hide resolved
packages/components/src/unit-control/index.tsx Outdated Show resolved Hide resolved
packages/components/src/unit-control/index.tsx Outdated Show resolved Hide resolved
@@ -228,26 +177,20 @@ function UnitControl(
<Root className="components-unit-control-wrapper" style={ style }>
<ValueInput
aria-label={ label }
type={ isPressEnterToChange ? 'text' : 'number' }
Copy link
Contributor

Choose a reason for hiding this comment

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

As far as I can tell the use of 'text' is only to allow input of any character in Chrome

This is an interesting change, to the point that I'd almost split it to a separate PR so that we can focus on testing it in isolation - WDYT @mirka ?

packages/components/src/unit-control/index.tsx Outdated Show resolved Hide resolved
@mirka mirka requested a review from alexstine March 23, 2022 00:39
@alexstine
Copy link
Contributor

@mirka How exactly do I test this? Not sure where BoxControl is used.

@stokesman
Copy link
Contributor Author

stokesman commented Mar 23, 2022

Hi @alexstine, BoxControl is likely most often encountered as the Padding control in the Dimensions panel in the block settings for a few blocks like Group and Columns. Unless you've already checked this branch out the easiest way to test would be at gutenberg.run/39303. If it helps, here's a group block to paste in to save a couple seconds:

<!-- wp:group {"backgroundColor":"secondary"} -->
<div class="wp-block-group has-secondary-background-color has-background"></div>
<!-- /wp:group -->

Also I believe the most crucial aspect of this to get your feedback on is the feature which allows changing the units of the control by typing the first character of one of the units while the quantity input is still focused. In this PR it will move focus to the select element immediately. That's opposed to way it works in trunk which doesn't move focus but requires that you type the units in and press enter or blur the input.

@alexstine
Copy link
Contributor

@stokesman Here is what I did.

  1. Insert a group block.
  2. Tab to the field labeled Padding.
  3. Enter the number 5.
  4. The number was entered with no focus change.

I tested the gutenberg.run link.

Is something else supposed to happen?

Thanks.

@stokesman
Copy link
Contributor Author

stokesman commented Mar 23, 2022

Thanks for testing @alexstine and for your steps. I've changed step 4.

  1. Insert a group block.
  2. Tab to the field labeled Padding.
  3. Enter the number 5.
  4. Enter one of the following characters: % e r v

By following that you should experience the focus change we're trying to scrutinize.

@alexstine
Copy link
Contributor

@stokesman I am happy with this. If a user understands enough to enter one of those characters, I think it only makes sense to move to the select field after.

Thanks.

@ciampo
Copy link
Contributor

ciampo commented Mar 23, 2022

I asked this before, but it likely got ignored because of every other comment that I left: If we agreed on moving forward with the changes in this PR, what use-cases are left for keeping the isPressEnterToChange prop on UnitControl / NumerControl / InputControl?

@stokesman
Copy link
Contributor Author

I hadn't forgotten about that question @ciampo. I couldn't think of a use case and thought maybe with a little time an idea would come to me. Yesterday, I searched in this branch did not see any. A search on plugins with WP Directory turns up some apparent use but I don't get a clear idea of the use cases by looking at those results. I'm thinking I might test a few of those plugins to try and find out because I'm curious.

Also thank you for the quick review!

@stokesman stokesman force-pushed the try/unit-control-alt-unit-switching branch from 036a644 to f63dabd Compare March 27, 2022 18:17
@ciampo
Copy link
Contributor

ciampo commented Mar 28, 2022

I couldn't think of a use case and thought maybe with a little time an idea would come to me.

I also can't personally think about any other reason. I found this comment which confirms our theory.

A search on plugins with WP Directory turns up some apparent use but I don't get a clear idea of the use cases by looking at those results. I'm thinking I might test a few of those plugins to try and find out because I'm curious.

That would definitely be a good idea, let us know if/when you have any findings! It'd be nice if we could (of course, separately to this PR) simplify InputControl and derived components a little bit by removing this prop.

Also thank you for the quick review!

Don't mention it! Thank you for your continuous efforts in contributing to the components package!

Let us know once this PR is ready for another round of reviews

@stokesman stokesman force-pushed the try/unit-control-alt-unit-switching branch from f63dabd to 9b1ac0f Compare April 7, 2022 16:26
@stokesman stokesman marked this pull request as ready for review April 7, 2022 18:32
@stokesman
Copy link
Contributor Author

I've gone ahead and marked this as ready and also made #40168 for the onPaste handling. If that is considered a must have for this PR then I guess that'll need review/approval before this one.

@ciampo ciampo force-pushed the try/unit-control-alt-unit-switching branch from 86c1ccb to 009d7c2 Compare June 21, 2023 13:14
@ciampo ciampo force-pushed the try/unit-control-alt-unit-switching branch from 009d7c2 to 6a96ecd Compare June 21, 2023 13:20
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.

Rebased and made a bunch of improvements to unit tests, I think this PR is good to go 🎉

Thank you @stokesman for your work on this one !

There seem to be a few follow-up tasks:

  • investigating the removal of all isPressEnterToChange usages from existing components (ie. BoxControl, DateTimePicker) (this should also help us with BoxControl: Add debounce to onKeyDown in underlying input controls #30222)
  • depending on how the previous task goes, we could then consider deprecating the isPressEnterToChange prop, and the behavior associated with it
  • add e2e tests to check the expected unit selection behavior, which can't be currently tested with js-dom as it seems like it doesn't support changing select element values using the keyboard
  • enhance the onPaste behavior to also support unit change (work started in Add paste handling to #39303 #40168)

@stokesman , would you have any capacity to work on the above tasks? 🙏

@ciampo ciampo enabled auto-merge (squash) June 21, 2023 13:28
@ciampo ciampo merged commit 82d99b9 into trunk Jun 21, 2023
@ciampo ciampo deleted the try/unit-control-alt-unit-switching branch June 21, 2023 13:56
@github-actions github-actions bot added this to the Gutenberg 16.1 milestone Jun 21, 2023
@stokesman
Copy link
Contributor Author

Thanks for moving this one through Marco!

would you have any capacity to work on the above tasks?

I can probably chip away at those. The first two would hopefully be pretty straightforward.

add e2e tests to check the expected unit selection behavior…

Because they'd cover behavior that the library doesn't control I wouldn't choose to write them. I mentioned the idea to say it could be done but not that it should be 🤷.

Thanks again to all who tested and reviewed 🙌 ❤️ I'm fond of this little change.

sethrubenstein pushed a commit to pewresearch/gutenberg that referenced this pull request Jul 13, 2023
…39303)

* Use a simpler way to allow changing units from the text input

* Change default of `isPressEnterToChange` in `BoxControl`

* Update tests

* Avoid potential undefined

* Remove extraneous null typing

Co-authored-by: Marco Ciampini <marco.ciampo@gmail.com>

* Make key matching regex case-insensitive

Co-authored-by: Aaron Robertshaw <60436221+aaronrobertshaw@users.noreply.github.com>

* Revert removed condtional type="text" on `UnitControl`

* Forward __unstableStateReducer through `UnitControl`

* Avoid intefering with paste or other shortcuts

* Revert `BoxControl` changes

* Update unit tests for `BoxControl`

* Optimize and guard creation of regex

Reduce starting from the second unit and cover null safety

* Revise style

* Make test of unit switching convenience run for each css unit

* Add changelog entry

* Remove custom `onChange` callback on Storybook, as it interferes with the actions tab

* Improve tests by avoiding local `state` variables and using onChange spies instead

* Clarify comments about js-dom not updating select inputs when using the keyboard

* Update README

---------

Co-authored-by: Marco Ciampini <marco.ciampo@gmail.com>
Co-authored-by: Aaron Robertshaw <60436221+aaronrobertshaw@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Components /packages/components [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants