diff --git a/.changeset/fix-DatePicker-input-wrong-number.md b/.changeset/fix-DatePicker-input-wrong-number.md new file mode 100644 index 000000000..d2b679bf8 --- /dev/null +++ b/.changeset/fix-DatePicker-input-wrong-number.md @@ -0,0 +1,5 @@ +--- +'react-magma-dom': patch +--- + +fix(TimePicker): Fix input wrong number validation. diff --git a/packages/react-magma-dom/src/components/TimePicker/TimePicker.test.js b/packages/react-magma-dom/src/components/TimePicker/TimePicker.test.js index 0eb90bb89..f9996d37c 100644 --- a/packages/react-magma-dom/src/components/TimePicker/TimePicker.test.js +++ b/packages/react-magma-dom/src/components/TimePicker/TimePicker.test.js @@ -35,18 +35,18 @@ describe('TimePicker', () => { expect(hoursInput.value).toEqual('12'); }); - it('should set the hour to the first number if the number inputted is 24 or above', () => { + it('should set the hour to the second number if the number inputted is 24 or above', () => { const { getByTestId } = render(); const hoursInput = getByTestId('hoursTimeInput'); fireEvent.change(hoursInput, { target: { value: '24' } }); - expect(hoursInput.value).toEqual('02'); + expect(hoursInput.value).toEqual('04'); fireEvent.change(hoursInput, { target: { value: '34' } }); - expect(hoursInput.value).toEqual('03'); + expect(hoursInput.value).toEqual('04'); }); it('should set the hour to null if the backspace key is clicked', () => { @@ -70,12 +70,12 @@ describe('TimePicker', () => { fireEvent.keyDown(hoursInput, { key: 'Backspace' }); expect(onKeyDown).toHaveBeenCalled(); - }); - + }); + it('should call the onChange when backspace is clicked on the hours input', () => { const onChange = jest.fn(); const { getByTestId } = render( - + ); const hoursInput = getByTestId('hoursTimeInput'); @@ -141,18 +141,18 @@ describe('TimePicker', () => { expect(minutesInput.value).toEqual('34'); }); - it('should set the minute to the first number if the number inputted is 60 or above', () => { + it('should set the minute to the second number if the number inputted is 60 or above', () => { const { getByTestId } = render(); const hoursInput = getByTestId('hoursTimeInput'); fireEvent.change(hoursInput, { target: { value: '60' } }); - expect(hoursInput.value).toEqual('06'); + expect(hoursInput.value).toEqual('00'); fireEvent.change(hoursInput, { target: { value: '89' } }); - expect(hoursInput.value).toEqual('08'); + expect(hoursInput.value).toEqual('09'); }); it('should set the minutes to null if the backspace key is clicked', () => { @@ -163,7 +163,6 @@ describe('TimePicker', () => { fireEvent.keyDown(minutesInput, { key: 'Backspace' }); expect(minutesInput.value).toEqual(''); - }); it('should focus the hour input if the left arrow key is clicked', () => { @@ -200,11 +199,11 @@ describe('TimePicker', () => { expect(onKeyDown).toHaveBeenCalled(); }); - + it('should call the onChange when backspace is clicked on the minutes input', () => { const onChange = jest.fn(); const { getByTestId } = render( - + ); const minsInput = getByTestId('minutesTimeInput'); diff --git a/packages/react-magma-dom/src/components/TimePicker/TimePicker.tsx b/packages/react-magma-dom/src/components/TimePicker/TimePicker.tsx index e8333ef78..966b74a62 100644 --- a/packages/react-magma-dom/src/components/TimePicker/TimePicker.tsx +++ b/packages/react-magma-dom/src/components/TimePicker/TimePicker.tsx @@ -175,6 +175,7 @@ export const TimePicker = React.forwardRef( theme={theme} type="number" value={hour} + onFocus={e => e.target.select()} /> : ( theme={theme} type="number" value={minute} + onFocus={e => e.target.select()} /> { - if(typeof props.value === 'undefined') { + if (typeof props.value === 'undefined') { setHour(''); setMinute(''); setAmPm(am); @@ -115,15 +115,45 @@ export function useTimePicker(props: UseTimePickerProps) { return newMinute.toString(); } + const sanitizeMinute = (newMinute: string): number => { + if (Number(newMinute) > 59) { + return Number(newMinute.slice(2)); + } + + if (newMinute.length > 2) { + return Number(newMinute.slice(-2)); + } + + return Number(newMinute); + }; + + const sanitizeHour = (newHour: string): number => { + if (Number(newHour) > 12) { + return Number(newHour.slice(-1)); + } + + if (newHour.length > 2) { + if (Number(newHour) > 12) { + return Number(newHour.slice(-1)); + } + + return Number(newHour.slice(-2)); + } + + return Number(newHour); + }; + function handleHourChange(event: React.ChangeEvent) { - const newHour = calculateHour(Number(event.target.value)); + const sanitizedHour = sanitizeHour(event.target.value); + const newHour = calculateHour(sanitizedHour); setHour(newHour); updateTime(`${newHour}:${minute} ${amPm}`); } function handleMinuteChange(event: React.ChangeEvent) { - const newMinute = calculateMinute(Number(event.target.value)); + const sanitizedMinute = sanitizeMinute(event.target.value); + const newMinute = calculateMinute(sanitizedMinute); setMinute(newMinute); updateTime(`${hour}:${newMinute} ${amPm}`);