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

RangeControl: Fix number input change interaction #22084

Merged
merged 11 commits into from
May 11, 2020

Conversation

ItsJonQ
Copy link

@ItsJonQ ItsJonQ commented May 4, 2020

Screen Capture on 2020-05-04 at 10-20-52

This update fixes the number input field that renders within RangeControl to allow for (keyboard) changes to happen before it gets applied (or submitted). This temporarily bypasses the validation step, which accommodates cases where the current value (e.g. 1) may be lower than the min value (e.g. 10) while typing.

The unit tests have RangeControl have been refactored to use @testing-library/react. This enables more accurate rendering as the (number) input value is applied only on blur or on Enter keypress.

These changes are important to fix certain RangeControl integrations like the one within the Latest Posts block. The GIF below demos the fix as the user can now type in values like 10. Previously, this did not work - Each key stroke would have been invalidated (keydown 1, keydown 0) in the process of typing 10.

Screen Capture on 2020-05-04 at 11-48-01

Blurring or pressing Enter (new) applies the typed change. If valid, the change will go through. If not, the value will reset.

How has this been tested?

  • Updated unit tests to use @testing-library/react for more accurate DOM testing
  • Tested in Storybook
  • Tested in local Gutenberg

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR.

Resolves: #21549

This update fixes the number input field that renders within RangeControl to allow for (keyboard) changes to happen before it gets applied (or submitted). This temporarily bypasses the validation step, which accommodates cases where the current value (e.g. 1) may be lower than the min value (e.g. 10) while typing.

The unit tests have RangeControl have been refactored to use @testing-library/react. This enables more accurate rendering as the (number) input value is applied only on blur or on ENTER keypress.
@ItsJonQ ItsJonQ added [Type] Bug An existing feature does not function as intended [Package] Components /packages/components [Block] Latest Posts Affects the Latest Posts Block labels May 4, 2020
@ItsJonQ ItsJonQ requested review from aduth and jorgefilipecosta May 4, 2020 15:54
@ItsJonQ ItsJonQ self-assigned this May 4, 2020
@github-actions
Copy link

github-actions bot commented May 4, 2020

Size Change: +405 B (0%)

Total Size: 825 kB

Filename Size Change
build/block-library/index.js 115 kB +74 B (0%)
build/block-library/style-rtl.css 7.38 kB +44 B (0%)
build/block-library/style.css 7.38 kB +44 B (0%)
build/components/index.js 180 kB +243 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.02 kB 0 B
build/annotations/index.js 3.62 kB 0 B
build/api-fetch/index.js 4.08 kB 0 B
build/autop/index.js 2.82 kB 0 B
build/blob/index.js 620 B 0 B
build/block-directory/index.js 6.61 kB 0 B
build/block-directory/style-rtl.css 760 B 0 B
build/block-directory/style.css 761 B 0 B
build/block-editor/index.js 102 kB 0 B
build/block-editor/style-rtl.css 10.3 kB 0 B
build/block-editor/style.css 10.3 kB 0 B
build/block-library/editor-rtl.css 7.12 kB 0 B
build/block-library/editor.css 7.12 kB 0 B
build/block-library/theme-rtl.css 683 B 0 B
build/block-library/theme.css 685 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.1 kB 0 B
build/blocks/index.js 48.1 kB 0 B
build/components/style-rtl.css 17 kB 0 B
build/components/style.css 16.9 kB 0 B
build/compose/index.js 6.66 kB 0 B
build/core-data/index.js 11.4 kB 0 B
build/data-controls/index.js 1.29 kB 0 B
build/data/index.js 8.45 kB 0 B
build/date/index.js 5.47 kB 0 B
build/deprecated/index.js 772 B 0 B
build/dom-ready/index.js 568 B 0 B
build/dom/index.js 3.1 kB 0 B
build/edit-navigation/index.js 4.41 kB 0 B
build/edit-navigation/style-rtl.css 618 B 0 B
build/edit-navigation/style.css 617 B 0 B
build/edit-post/index.js 28 kB 0 B
build/edit-post/style-rtl.css 12.2 kB 0 B
build/edit-post/style.css 12.2 kB 0 B
build/edit-site/index.js 12.1 kB 0 B
build/edit-site/style-rtl.css 5.22 kB 0 B
build/edit-site/style.css 5.22 kB 0 B
build/edit-widgets/index.js 8.37 kB 0 B
build/edit-widgets/style-rtl.css 4.69 kB 0 B
build/edit-widgets/style.css 4.69 kB 0 B
build/editor/editor-styles-rtl.css 425 B 0 B
build/editor/editor-styles.css 428 B 0 B
build/editor/index.js 44.3 kB 0 B
build/editor/style-rtl.css 5.07 kB 0 B
build/editor/style.css 5.08 kB 0 B
build/element/index.js 4.65 kB 0 B
build/escape-html/index.js 734 B 0 B
build/format-library/index.js 7.63 kB 0 B
build/format-library/style-rtl.css 502 B 0 B
build/format-library/style.css 502 B 0 B
build/hooks/index.js 2.14 kB 0 B
build/html-entities/index.js 622 B 0 B
build/i18n/index.js 3.56 kB 0 B
build/is-shallow-equal/index.js 710 B 0 B
build/keyboard-shortcuts/index.js 2.51 kB 0 B
build/keycodes/index.js 1.94 kB 0 B
build/list-reusable-blocks/index.js 3.12 kB 0 B
build/list-reusable-blocks/style-rtl.css 226 B 0 B
build/list-reusable-blocks/style.css 226 B 0 B
build/media-utils/index.js 5.29 kB 0 B
build/notices/index.js 1.79 kB 0 B
build/nux/index.js 3.4 kB 0 B
build/nux/style-rtl.css 616 B 0 B
build/nux/style.css 613 B 0 B
build/plugins/index.js 2.56 kB 0 B
build/primitives/index.js 1.5 kB 0 B
build/priority-queue/index.js 789 B 0 B
build/redux-routine/index.js 2.85 kB 0 B
build/rich-text/index.js 14.8 kB 0 B
build/server-side-render/index.js 2.68 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.28 kB 0 B
build/url/index.js 4.02 kB 0 B
build/viewport/index.js 1.84 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.18 kB 0 B

compressed-size-action

@@ -61,6 +61,7 @@ const BaseRangeControl = forwardRef(
onFocus = noop,
onMouseMove = noop,
onMouseLeave = noop,
resetFallbackValue,
Copy link
Member

Choose a reason for hiding this comment

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

What's the prop needed for? Could we include documentation?

Copy link
Member

Choose a reason for hiding this comment

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

What's the prop needed for? Could we include documentation?

Still wondering about this one.

Copy link
Author

Choose a reason for hiding this comment

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

Ah! Thanks for following up. It's the value to be used if the "Reset" button is clicked.

This was a prop that existed previously, but I guess didn't have docs. I'll add some.

return;
}

handleOnSubmit( event );
Copy link
Member

Choose a reason for hiding this comment

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

If I understand "submit" in this context to mean "propagate a value which is valid", I'd worry about the specific word "submit", since it typically carries a very different meaning when considering an input of a form (i.e. the form submission). At least, that was my first impression seeing this.

A word like "commit" or "persist" might be less prone to confusion?

Copy link
Author

Choose a reason for hiding this comment

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

Thank you @aduth ! That makes sense. I think commit works! I'll make the update here (as well as my other PR that uses a similar flow)

Copy link
Member

@aduth aduth left a comment

Choose a reason for hiding this comment

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

Thanks for jumping on the issue so quickly. I left a few comments, but I'll plan to take a closer look in my morning.

packages/components/src/utils/hooks.js Outdated Show resolved Hide resolved
packages/components/src/utils/hooks.js Outdated Show resolved Hide resolved
packages/components/src/utils/hooks.js Show resolved Hide resolved
packages/components/src/range-control/input-field.js Outdated Show resolved Hide resolved
@ItsJonQ
Copy link
Author

ItsJonQ commented May 5, 2020

@aduth (As always) Thank you for your thorough review!!

I merged the suggestions you made, and added tests + comments for useControlledState to add clarity around it's mechanics and use-case.

I made a minor update based on a suggestion by @mcsf from another one of my PRs

Minor point, but this ref might be clearer if named lastInitialState or ``lastInitialStateRef`.

@ItsJonQ
Copy link
Author

ItsJonQ commented May 11, 2020

Hai! Following up on this one. Do you folks think this one is ready to land?

Thank you!

Copy link
Member

@aduth aduth left a comment

Choose a reason for hiding this comment

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

This is definitely an improvement, and appears to resolve #21549 in my testing.

One thing I can't recall is if we'd previously supported temporarily, invalid non-numeric input (i.e. typing letters within these number fields). This doesn't appear to work at all, though it may very well be expected since it's a number input (possibly the browser preventing it).

@ItsJonQ
Copy link
Author

ItsJonQ commented May 11, 2020

One thing I can't recall is if we'd previously supported temporarily, invalid non-numeric input (i.e. typing letters within these number fields). This doesn't appear to work at all, though it may very well be expected since it's a number input (possibly the browser preventing it).

@aduth Thank you so much for reviewing! I just checked a branch with the older version. It appears the input was always type="number", which means numbers only (handled by the browser) 😊

@ItsJonQ
Copy link
Author

ItsJonQ commented May 11, 2020

Yay! Looks like Travis started. Will merge once Travis is happy.

Thank you for the reviews!

@ItsJonQ ItsJonQ merged commit 94e3622 into master May 11, 2020
@ItsJonQ ItsJonQ deleted the fix/rangecontrol-min-max-input branch May 11, 2020 16:40
@github-actions github-actions bot added this to the Gutenberg 8.1 milestone May 11, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Latest Posts Affects the Latest Posts Block [Package] Components /packages/components [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[ Latest Posts ] Max. number of words control doesn't react to keyboard input
2 participants