From 8e263aad5beff083975df7dc4d1fbea7dcf7f018 Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Fri, 7 Oct 2022 18:12:52 +0200 Subject: [PATCH 1/5] let the user edit the stepper input with keyboard --- .../dialogs/settings/settings-step-input.tsx | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx index e6eef4b9c..b40d7e90a 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx @@ -24,6 +24,8 @@ const SettingsStepInput: React.FC = ( classNames, } = props; + const [tempValue, setTempValue] = React.useState(String(value)); + const clamp = (value: number, min: number, max: number): number => { return Math.min(Math.max(value, min), max); }; @@ -52,17 +54,24 @@ const SettingsStepInput: React.FC = ( const onUserInput = (event: React.ChangeEvent): void => { const { value: eventValue } = event.target; + setTempValue(eventValue); + }; - if (eventValue === '') { - setSettingsStateValue(0); - } - - const number = Number(eventValue); + /* Prevent the user from entering invalid values */ + const onBlur = (): void => { + const tempValueAsNumber = Number(tempValue); - if (!isNaN(number) && number !== value) { - const newValue = clamp(number, minValue, maxValue); + /* If the user input is not a number, reset the input to the previous value */ + if (isNaN(tempValueAsNumber) || tempValue === '') { + setTempValue(String(value)); + return; + } + if (tempValueAsNumber !== value) { + /* If the user input is a number, clamp it to the min and max values */ + const newValue = clamp(tempValueAsNumber, minValue, maxValue); setSettingsStateValue(newValue); + setTempValue(String(newValue)); } }; @@ -73,8 +82,9 @@ const SettingsStepInput: React.FC = (
From 25d7047ac99674929b312ed73056e4c64d7daaf4 Mon Sep 17 00:00:00 2001 From: David Simpson <45690499+davegarthsimpson@users.noreply.github.com> Date: Tue, 11 Oct 2022 18:00:23 +0200 Subject: [PATCH 2/5] consider exceptions and fix styling --- .../dialogs/settings/settings-component.tsx | 12 +++- .../dialogs/settings/settings-step-input.tsx | 59 +++++++++++++------ .../src/browser/style/settings-step-input.css | 6 +- 3 files changed, 54 insertions(+), 23 deletions(-) diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx index bbc73b8c3..3138c7242 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx @@ -180,7 +180,8 @@ export class SettingsComponent extends React.Component<
diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx index b40d7e90a..10cfe5c76 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-step-input.tsx @@ -2,7 +2,7 @@ import * as React from '@theia/core/shared/react'; import classnames from 'classnames'; interface SettingsStepInputProps { - value: number; + initialValue: number; setSettingsStateValue: (value: number) => void; step: number; maxValue: number; @@ -15,7 +15,7 @@ const SettingsStepInput: React.FC = ( props: SettingsStepInputProps ) => { const { - value, + initialValue, setSettingsStateValue, step, maxValue, @@ -24,7 +24,14 @@ const SettingsStepInput: React.FC = ( classNames, } = props; - const [tempValue, setTempValue] = React.useState(String(value)); + const [valueState, setValueState] = React.useState<{ + currentValue: number; + isEmptyString: boolean; + }>({ + currentValue: initialValue, + isEmptyString: false, + }); + const { currentValue, isEmptyString } = valueState; const clamp = (value: number, min: number, max: number): number => { return Math.min(Math.max(value, min), max); @@ -34,10 +41,11 @@ const SettingsStepInput: React.FC = ( roundingOperation: 'ceil' | 'floor', stepOperation: (a: number, b: number) => number ): void => { - const valueRoundedToScale = Math[roundingOperation](value / step) * step; + const valueRoundedToScale = + Math[roundingOperation](currentValue / step) * step; const calculatedValue = - valueRoundedToScale === value - ? stepOperation(value, step) + valueRoundedToScale === currentValue + ? stepOperation(currentValue, step) : valueRoundedToScale; const newValue = clamp(calculatedValue, minValue, maxValue); @@ -54,41 +62,54 @@ const SettingsStepInput: React.FC = ( const onUserInput = (event: React.ChangeEvent): void => { const { value: eventValue } = event.target; - setTempValue(eventValue); + setValueState({ + currentValue: Number(eventValue), + isEmptyString: eventValue === '', + }); }; /* Prevent the user from entering invalid values */ const onBlur = (): void => { - const tempValueAsNumber = Number(tempValue); - - /* If the user input is not a number, reset the input to the previous value */ - if (isNaN(tempValueAsNumber) || tempValue === '') { - setTempValue(String(value)); + if ((currentValue === 0 && minValue > 0) || isNaN(currentValue)) { + setValueState({ + currentValue: initialValue, + isEmptyString: false, + }); return; } - if (tempValueAsNumber !== value) { + + if (currentValue !== initialValue) { /* If the user input is a number, clamp it to the min and max values */ - const newValue = clamp(tempValueAsNumber, minValue, maxValue); + const newValue = clamp(currentValue, minValue, maxValue); setSettingsStateValue(newValue); - setTempValue(String(newValue)); } }; - const upDisabled = value >= maxValue; - const downDisabled = value <= minValue; + const valueIsNotWithinRange = + currentValue < minValue || currentValue > maxValue; + const isDisabledException = + valueIsNotWithinRange || isEmptyString || isNaN(currentValue); + + const upDisabled = isDisabledException || currentValue >= maxValue; + const downDisabled = isDisabledException || currentValue <= minValue; return (
-
+