From 601e69ab0d5ec228b2650b7e45cc9dc3cdfee4fc Mon Sep 17 00:00:00 2001 From: Akansh Sirohi <34837239+akanshSirohi@users.noreply.github.com> Date: Sun, 3 Jul 2022 15:55:03 +0530 Subject: [PATCH] Fixes payloadcms/payload#650 (#706) * fix: min/max number validation of decimal values --- src/fields/validations.spec.ts | 44 +++++++++++++++++++++++++++++++++- src/fields/validations.ts | 4 ++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/fields/validations.spec.ts b/src/fields/validations.spec.ts index be708828b3..de09751be0 100644 --- a/src/fields/validations.spec.ts +++ b/src/fields/validations.spec.ts @@ -1,9 +1,12 @@ -import { text, textarea, password, select, point } from './validations'; +import { text, textarea, password, select, point, number } from './validations'; import { ValidateOptions } from './config/types'; const minLengthMessage = (length: number) => `This value must be longer than the minimum length of ${length} characters.`; const maxLengthMessage = (length: number) => `This value must be shorter than the max length of ${length} characters.`; +const minValueMessage = (value: number, min: number) => `"${value}" is less than the min allowed value of ${min}.`; +const maxValueMessage = (value: number, max: number) => `"${value}" is greater than the max allowed value of ${max}.`; const requiredMessage = 'This field is required.'; +const validNumberMessage = 'Please enter a valid number.'; let options: ValidateOptions = { operation: 'create', data: undefined, @@ -314,4 +317,43 @@ describe('Field Validations', () => { expect(result).not.toStrictEqual(true); }); }); + describe('number', () => { + options.type = 'number'; + options.name = 'test'; + it('should validate', () => { + const val = 1; + const result = number(val, options); + expect(result).toBe(true); + }); + it('should validate', () => { + const val = 1.5; + const result = number(val, options); + expect(result).toBe(true); + }); + it('should show invalid number message', () => { + const val = 'test'; + const result = number(val, { ...options }); + expect(result).toBe(validNumberMessage); + }); + it('should handle empty value', () => { + const val = ""; + const result = number(val, { ...options }); + expect(result).toBe(true); + }); + it('should handle required value', () => { + const val = ""; + const result = number(val, { ...options, required: true }); + expect(result).toBe(validNumberMessage); + }); + it('should validate minValue', () => { + const val = 2.4; + const result = number(val, { ...options, min: 2.5}); + expect(result).toBe(minValueMessage(val, 2.5)); + }); + it('should validate maxValue', () => { + const val = 1.25; + const result = number(val, { ...options, max: 1}); + expect(result).toBe(maxValueMessage(val, 1)); + }); + }); }); diff --git a/src/fields/validations.ts b/src/fields/validations.ts index bd0de643ec..d6c866a9b8 100644 --- a/src/fields/validations.ts +++ b/src/fields/validations.ts @@ -24,9 +24,9 @@ import canUseDOM from '../utilities/canUseDOM'; const defaultMessage = 'This field is required.'; export const number: Validate = (value: string, { required, min, max }) => { - const parsedValue = parseInt(value, 10); + const parsedValue = parseFloat(value); - if ((value && typeof parsedValue !== 'number') || (required && Number.isNaN(parsedValue))) { + if ((value && typeof parsedValue !== 'number') || (required && Number.isNaN(parsedValue)) || (value && Number.isNaN(parsedValue))) { return 'Please enter a valid number.'; }